# Two checks before any lock: fresh-gap calibration and hold feasibility

**Written October 13, 2026, about 08:00 Halifax, before either check ran.** Not a locked plan and not an experiment:
these two checks only test whether the drafted hold-against-pulse experiment
(../cause-explore-2026-10-12/hold_vs_pulse_proposal.md) can measure what it means to measure. They use only the
old starts 1 to 18, which earlier parts have already used. They run no new start and look at no growth after a change,
and they fix nothing for the lock. The cause test's decision is unchanged: FAIL, as registered. A toy model:
whatever this shows applies to these runs.

Colson's instructions (October 13): "let's proceed with the two pre-lock checks and use ±25% as the proposed hold
size." "Run calibration and feasibility only on old starts 1–18. Do not run fresh starts, freeze the experimental plan,
or inspect new growth outcomes." Calibration: verify "that initializing a fresh perturbation gap at T+200 produces a
stable and interpretable growth-rate measurement, with explicit convergence and failure criteria." Feasibility:
verify "that both 100-unit and 500-unit holds achieve their target coherence ranges consistently." Two diagnostics
are added: the time-integrated coherence history achieved during each hold, with the variation between successive
kicks, and the cumulative intervention effort (number and size of kicks), "so hold duration is not confused with total
perturbation applied." Pulse, sham and untouched controls stay apart.

The ±25% size was chosen after round 2 (Colson, October 13). Every criterion below was chosen now, before either
check ran, and is not changed after.

The model and settings are the cause test's (N = 4,000 per group, K = 1.90, eps = 0.1, step 0.025, 300 units of
settling, 6,000 units of run, the gap put back to 10⁻⁷ every 5 units), with nudge_test.py's model and step code
imported unchanged.

## 1. Fresh-gap calibration (untouched only, old starts 1 to 18)

**What runs.** Each start's base run is run again, step for step as in the cause test, and must reproduce its saved
run exactly: coherence (as saved, to complex64), every log growth of the gap, and the settling trace. Alongside it, at
each moment T = 2,000, 2,050, ..., 5,450 (70 per start, every 50 units as in the draft), two fresh copies are made
at T + 200 from the untouched first copy. Each is displaced by its own random direction: rms 10⁻⁷ over both groups'
pulled oscillators, the mean removed, drawn from (20261013, 1, seed of the start, T, j) for j = 0, 1. Each fresh
copy is measured and put back every 5 units against the first copy, exactly as the carried gap is, for its 60
intervals in (T + 200, T + 500]. The fresh copies run in their own arrays, so the base run's arithmetic is untouched.
No change is made to any copy.

**Measured for every fresh gap.**

- G = (the sum of its 60 log growths) / 300, and W = the carried gap's growth over the same window (from the base run).
- Its overlap with the carried gap at each put-back: |cos| between the two phase-difference vectors (both over the
  pulled oscillators of both groups, the mean removed, measured before either is put back).
- Its alignment time: 5 × the first put-back after which the overlap stays at or above 0.9 to the end of the window;
  "not aligned" if the overlap at the last put-back is below 0.9.

**Criteria (all four are needed for the fresh gap to stay the primary outcome).**

| | criterion |
|---|---|
| C1, convergence | at least 90% of fresh gaps aligned within the window, and the median alignment time at most 100 units |
| C2, stability | the direction's own noise, SD over all moments of (G₀ − G₁) / √2, at most 0.5 × the natural spread of W (the pooled within-start SD of W over the same moments) |
| C3, agreement | the pooled within-start correlation of Ḡ = (G₀ + G₁) / 2 with W at least 0.8 |
| C4, interpretability | κ = b_M(Ḡ) / b_M(W) between 0.75 and 1.25, with an error bar of at most 0.25. Each b_M is the pooled within-start least-squares weight of the 500-unit history mean M, with the fast part F = C(T) − M and the earlier growth g₁ to g₅ (Test 17's five windows of 100) held fixed, on the same moments |

Error bars come from the starts, as in every earlier part: the 18 starts redrawn 400 times with seed 20261015.

**Validity.** V1: every re-run reproduces its saved run exactly. V2: every log growth and overlap is a finite number,
and every fresh gap is measured at all 60 put-backs. If V1 or V2 fails, the calibration gives no reading and is
reported as it stands.

**What each outcome means.**

- **PASS (V1, V2 and C1 to C4):** a fresh gap started at T + 200 settles quickly onto the direction the carried gap
  measures, and gives the same natural link. It stays the primary outcome as drafted, with κ fixed from this
  calibration.
- **FAIL (any of C1 to C4):** it is not used as the primary outcome, and the gap design goes back to Colson. The
  revised design will propose the carried gap as primary (the natural link's own measure, as in the cause test), shown
  for review.

Worth knowing before reading the result: once a fresh gap has lined up, it points the same way as the carried gap
and grows at the same rate, so it measures the same thing. Its growth over the window can differ only while it is
still lining up, and then it partly measures the cost of lining up from a random direction, not the growth the
natural link describes.

Also reported, without a criterion: the mean of Ḡ − W; the median overlap by time since the fresh copy was made; the
mean of each interval's log growth, fresh minus carried, by interval; the natural slopes themselves; G and W
over the first 100 and the last 200 units of the window.

## 2. Hold feasibility (old starts 13 to 18, the cause test's target-check starts)

**Moments.** Ten per start: T = 2,000 + o + 350 m (m = 0 to 9), with o a multiple of 5 from 0 to 345, drawn once per
start from (20261013, 2, seed of the start). This is the cause test's form with a new seed. Each base run is run again
(it must reproduce its saved run exactly) and keeps its state at T − 500, T − 100 and T. Only the untouched first copy is
used; no gap is carried, and no growth is measured.

**Arms per moment (dense method only, ±25%).**

| arm | what is done |
|---|---|
| none | the base run, untouched |
| hold-500 up / down / sham | a kick at every multiple of 5 in [T − 500, T] (101 kicks), then untouched to T + 500 |
| hold-100 up / down / sham | a kick at every multiple of 5 in [T − 100, T] (21 kicks), then untouched to T + 500 |
| pulse up / down / sham | one change at T, the cause test's dense method at ±25% (a = the smallest amplitude with [R(+a) − R(−a)] / 2 = 0.25 R_g), then untouched to T + 500 |

**A hold kick.** For each group g, from the branch's own state: Δθ_j = a_g sin(ψ_g − θ_j) for every pulled
oscillator j. a_g is solved so that the group's coherence just after the kick is 1.25 × R_g^none(t) (up) or
0.75 × R_g^none(t) (down), R_g^none(t) being the untouched run's coherence at that instant. The solve scans |a| =
π/512, 2π/512, ..., π/2 on the side that moves toward the target (a > 0 raises R_g), takes the first point that reaches
it, and halves the interval to 10⁻¹²; it must land within a relative 10⁻⁶. The sham's oscillators move by
½ (|a_up| + |a_down|) sin(ψ_g − θ_j) from the same kick, with the cause test's paired signs (drawn from (20261013, 3,
seed of the start, moment, hold length), kick by kick, group A before B). Up, down and sham of a hold run side by side
in one task. If any kick of a hold is infeasible or unsolved, that hold of that moment stops there and is not carried
out; nothing is clipped or replaced. The pulse sham's signs come from (20261013, 4, seed of the start, moment).

**Recorded.** For every arm, each group's coherence at every time unit from T − 500 (or the hold's first kick) to
T + 500, with the value just after the kick at kick times, and the value just before each kick as well. For every
kick: each group's amplitude, its ratio to target after the kick, Σ Δθ² over both groups, and the largest |Δθ|.

**Definitions.** c(t) = (R_A + R_B) / 2. For a hold of length H, M = the mean of c over t = T − H, ..., T − 1. The
achieved fraction of the planned history change is A_up = (M_up − M_none) / (0.25 M_none) and A_down = (M_none −
M_down) / (0.25 M_none); A_sham = (M_sham − M_none) / (0.25 M_none). The same over each 25-unit block of the hold gives
the block fractions.

**Criteria, for each hold length.**

| | criterion |
|---|---|
| F1, kicks on target | every kick of up, down and sham solved and inside its band (up 1.225 to 1.275 × R_g^none(t), down 0.725 to 0.775 × R_g^none(t), sham 0.95 to 1.05 × its own R_g before the kick) in at least 57 of the 60 moments, and every start keeps at least 5 of its 10 |
| F2, history achieved | in at least 90% of the moments carried out, both A_up and A_down between 0.75 and 1.25; and the mean of each over the moments between 0.85 and 1.15 |
| F3, held throughout | in at least 90% of the moments carried out, every 25-unit block fraction of up and of down between 0.5 and 1.5 |
| F4, sham (reported apart) | (a) the sham's Σ Δθ² over the hold between 0.8 and 1.2 × the mean of up's and down's; (b) the mean of A_sham over the moments between −0.25 and +0.25 |

A hold length is **feasible** if F1, F2 and F3 hold. If one is not, that hold goes back to Colson with the
diagnostics. F4 does not block a hold, since the sham is not in the main comparisons; a failure is flagged for the
design. The pulses are checked against their bands too (up 1.225 to 1.275, down 0.725 to 0.775, sham 0.95 to 1.05).

**Diagnostics (no pass or fail).**

1. The time-integrated history each hold achieved: M by arm, ΔM = (M_up − M_down) / 2, the achieved fractions, and
   H × (M_arm − M_none). The variation between successive kicks: each group's ratio R_g / R_g^none just before each
   kick (it is on target just after), its mean drift from target, its spread, and the 5th to 95th percentile of the
   ratio over the hold.
2. The cumulative effort: the number of kicks; Σ |a| by group; Σ Δθ² over the hold, its share in the first kick, and
   its size against one pulse; the median maintenance kick; the largest single |Δθ|; and the net signed push Σ a.
3. The coherence left after release, mean c over (T, T + 200] and (T + 200, T + 500] for every arm minus untouched,
   per unit of the planned change.

## Running

Each check is run in foreground pieces, one at a time, each under a hard limit (`timeout -k 10 285 python3 -B ...`)
and aimed at under 228 seconds: seven workers, and nothing is left running between pieces. Calibration: one task per
start. A task still running at 190 seconds saves its exact state at the last put-back and goes on from there in the
next piece. The re-run's reproduction check confirms nothing changed across pieces. About 30 minutes in about ten
pieces. Feasibility: one piece of base runs, then moment tasks (hold-500 alone, or hold-100 with the pulse), none
started after 120 seconds into a piece. About 15 minutes.

Working files (checkpoints, saved states, per-task parts) go to generated-artifacts/cause-prelock-2026-10-13/,
which git ignores. Results and run logs go here. The cause test's 16 locked files are checked against cause_lock.json
before and after, and nothing in ../cause-test-2026-10-12 or ../cause-explore-2026-10-12 is written to.

## After the checks

The revised experimental design is written at ±25% beside the draft, which is kept as it is. It includes the
predicted effect sizes, the error bars from independent starts, the manipulation checks, and the PASS, FAIL and
INCONCLUSIVE rules. It goes to Colson for review, not locked and not run.
