{
 "made": {
  "utc": "2026-10-15T12:28:50+00:00",
  "halifax": "2026-10-15T09:28:50-03:00"
 },
 "label": "lock",
 "what": "The lock of the final scattering-side design, made on Colson's go and before anything runs. plan-final.md is the locked plan. Steps 1 and 2 only are authorized: the code checks, and the window-only check on old starts 16 and 17. The pilot on fresh starts (step 3) and any replication (step 4) each need their own go. The settings below fix, before any code runs, the details the plan leaves to the code; none of them may change in response to what the checks show.",
 "plan": {
  "file": "analysis/cancer-research/scattering-side/plan-final.md",
  "sha256": "0e3f8f114ed44eade7e211317217f23e27c1075008e561c2b07ea11645823121"
 },
 "follows": {
  "file": "analysis/cancer-research/safekeeping/change-2026-10-15.json",
  "sha256": "8ba5417e96722cbd328ac087d7b8103ef29b7089572880cff4fc18beb81c2727"
 },
 "authorization": {
  "given": "October 15, 2026",
  "words": "authorization granted to lock the final scattering-side design and execute steps 1–2 only. Preserve the 0.6 and 0.4 faster-half predictions, the separately defined comparison rules, and the counter-rotating rhythm detection criteria exactly as written. Run the code-verification checks and the window-only feasibility checks on old starts 16–17. Report all outcomes, including any failures, false positives, numerical discrepancies, or infeasible comparisons. Do not change thresholds or intervention levels in response to the check results. If a check fails, stop and report it. Do not execute the fresh-start pilot. Bring me the results of steps 1–2 and request separate authorization before proceeding. Preserve all earlier experimental locks, the Fluidity Replication, the Cause Test, and the website unchanged. ~ Authorization for steps 1–2 only.",
  "scope": "steps 1 and 2 only",
  "not_authorized": [
   "step 3, the exploratory pilot on fresh starts 135 to 146",
   "step 4, any locked replication"
  ],
  "if_a_step_1_check_fails": "stop: step 2 is not run, and the failure is reported"
 },
 "unchanged_whatever_the_checks_show": [
  "the faster-half levels, c_f = 0.6 and c_f = 0.4, and the theory's expectation at each",
  "comparison A's measures, margins and labels",
  "comparison B's and B-prime's readings (B1, B2), margins and labels",
  "the rhythm rule (L at least 1.5, S at least 0.057), the readings E-pair, E-any and E-steady, their labels (0.05 and 0.10), and the combined readings",
  "the raised pull's size (0.005 of K, the medium pilot's frozen size) and the 200-unit window",
  "every setting below"
 ],
 "settings": {
  "model": {
   "n": 4000,
   "k": 1.9,
   "eps": 0.1,
   "delta": 1.0,
   "dt": 0.025,
   "settle": 300.0,
   "run": 6000.0,
   "gap": 1e-07,
   "put_back_every": 5.0,
   "gap_seed": 20261011,
   "pulled_up_to": 20.0
  },
  "moments": {
   "seed": 20261014,
   "per_start": 10,
   "first": 2000,
   "spacing": 330,
   "offsets": 66,
   "window": 200,
   "after": 500
  },
  "raised_pull": {
   "size": 0.005,
   "k": 1.9094999999999998
  },
  "arm_u": {
   "c0": 0.99527,
   "lowest_c": 0.95,
   "relative_tolerance": 0.01,
   "most_runs": 8,
   "middle_share": 0.8
  },
  "arms_f": {
   "levels": [
    0.6,
    0.4
   ],
   "b": 0.9502092363816494
  },
  "rule": {
   "read_from": 150,
   "read_to": 200,
   "band": [
    0.8,
    1.3
   ],
   "width": 0.03,
   "last_left_end": 1.27,
   "L_at_least": 1.5,
   "S_at_least": 0.057,
   "members_per_direction": 968
  },
  "rounding": {
   "phases_and_coherence": 1e-09,
   "rates": 1e-12
  },
  "step1": {
   "old_seed": 0,
   "t0": 100,
   "short_window": 20,
   "short_after": 20,
   "short_read": [
    10,
    20
   ],
   "mirror_units": 200,
   "mirror_c": [
    0.99527,
    0.95
   ],
   "every_step_units": 10,
   "pilot_seed": 102,
   "pilot_moment": 0,
   "pilot_t": 2055
  },
  "step2": {
   "seeds": [
    15,
    16
   ]
  },
  "draws": {
   "seed": 20261015,
   "made_up": 9
  }
 },
 "meaning": {
  "bit_for_bit": "every number exactly equal (numpy array_equal), with nothing rounded first",
  "to_rounding": "phases (radians, wrapped) and coherence within 1e-9; natural rates within 1e-12; checks stated 'to rounding' in the plan use these, and nothing looser",
  "raised_pull": "K times (1 + 0.005) for the window, nudge_test's own step, as the medium pilot ran it",
  "arm_u": "every natural rate (both groups, free turners included) multiplied by c during the window, in a line-for-line copy of nudge_test's step that takes the rates as given; which oscillators are pulled stays nudge_test's own set; from R, nudge_test's own step",
  "arms_f": "b is the slower half's largest natural rate, computed from nudge_test's rates (0.95021 to five places). Each faster-half pulled rate becomes omega - sign(omega) (1 - c_f) (|omega| - b), so that c_f = 1 leaves it exactly as it was; this is checked against sign(omega) (b + c_f (|omega| - b)) to rounding. The slower half and the free turners keep their rates. Same copied step; from R, nudge_test's own step",
  "arm_u_search": "f(c) is arm U's C at R minus the raised arm's (C: the average of the two groups' coherence, first copy, window only, no gap). f(1) is the untouched window's value (arm U with c = 1 is the untouched run, checked bit for bit); c = 1 is never run or accepted. Run 1 is at c0 = 0.99527. A run is accepted, ending the search, when |f(c)| is at most 0.01 times the raised arm's C at R. Otherwise: if an earlier point (c = 1 included) has the opposite sign, the bracket is that point nearest in c and the newest run; once a bracket exists, each new run replaces the end with its own sign. Inside a bracket the next c is false position, replaced by the midpoint if it falls outside the bracket's middle 80%. Without a bracket the next c is the secant through the two most recent points (the first time: c = 1 and c0), raised to 0.95 if it falls below; the moment is unmatched if that secant is undefined, points to c of 1 or more, or repeats a c already tried. At most 8 runs. A moment with no accepted run is unmatched, with its reason, and keeps the readings of its closest run, marked unmatched. Nothing is retried or loosened.",
  "rule": "Directions: in each group, the faster half's pulled oscillators (|omega| > b, |omega| at most 20) with omega > 0 (forward) and omega < 0 (backward), 968 each, by their original rates. Turning rate: each oscillator's advance over (T + 150, R], summed from readings one time unit apart, each unit's advance being r + wrap(arg(u_t conj(u_(t-1))) - r) with r its natural rate in use during the window; divided by 50. w(t): the mean of e^(i theta) over a direction's 968, read every unit. Backward rates are negated, so its band is -1.30 to -0.80. L: the most turning rates any closed interval [x, x + 0.03] with 0.80 <= x <= 1.27 holds, divided by the most natural rates in use (of the same 968) any such interval holds; candidate x are every rate from 0.80 to 1.27, and 1.27. Ties go to the interval nearer the centre (rate 0): the smaller x. Omega*: the median turning rate in the chosen interval, sign restored. S: |the mean over t = T + 151 to R of w(t) e^(-i Omega* (t - T))|. A direction holds a rhythm if L >= 1.5 and S >= 0.057; a group holds a counter-rotating pair if both directions do at the same moment; steady: S >= 0.057. With no turning rate in the band, Omega* and S are undefined: no rhythm, not steady.",
  "step_1": "The checks in plan-final.md's step 1, one command. Old start 1 (seed 0): a base run to t = 100 (states kept there), short arms of 20 units changed and 20 restored with both copies, the copy with readings every step over 10 units, and arm U's 200-unit window against its mirror at c = 0.99527 and c = 0.95. Pilot start 103 (seed 102), its first moment (T = 2,055): the raised pull and the untouched rerun, both copies, 200 + 500 units, against the medium pilot's saved arrays. The rule on made-up phase histories drawn from (20261015, 9, scenario), with no model run.",
  "step_2": "Old starts 16 and 17 (seeds 15 and 16), 10 moments each by the medium pilot's rule and draws. Base runs made afresh by the medium pilot's own function, keeping the states at T and R and no gap growth. At each moment, from the state at T, the first copy only: the untouched window, the raised pull, arm F (0.6), arm F-prime (0.4) and arm U's search, 200 units each. Nothing after R is run or looked at. No labels are applied to its numbers, and they never enter the pilot's readings."
 },
 "commands": [
  "timeout -k 10 285 python3 -B scattering_side.py check",
  "timeout -k 10 285 python3 -B scattering_side.py base",
  "timeout -k 10 285 python3 -B scattering_side.py window"
 ],
 "how_it_runs": "each command in the foreground with a hard limit under 5 minutes, up to 7 worker processes that end with it, nothing left running; base and window only after every step-1 check passed with the same code",
 "outputs": {
  "reports": "analysis/cancer-research/scattering-side/",
  "saved_runs": "generated-artifacts/scattering-side/ (kept out of the project's history)"
 }
}
