{
 "made": {
  "utc": "2026-10-15T16:01:12+00:00",
  "halifax": "2026-10-15T13:01:12-03:00"
 },
 "label": "replication lock",
 "what": "The dated lock for the prospective replication of the scattering-side pilot on fresh starts 147 to 170, as replication-plan-final.md fixes it. Made on Colson's approval of draft 1 in principle, with his choices, before the replication's code is written. It fixes the replication's settings, the details of its readings and questions that the plan leaves to the code, the checks that must pass first, and the commands. Colson authorized finalizing the plan, preparing this lock and the code, and running checks R0 to R5. Running anything on a fresh start needs his separate authorization. Nothing here may change in response to what the checks or the replication show.",
 "replication_plan": {
  "file": "analysis/cancer-research/scattering-side/replication-plan-final.md",
  "sha256": "fedc7c0f1852215751dadb430f4b8efe45de5ae1cd0c7623326ee1e987b6ce5d",
  "status": "final; approved in principle by Colson on October 15, 2026, with his choices; his words are below"
 },
 "draft": {
  "file": "analysis/cancer-research/scattering-side/replication-plan-draft-1.md",
  "sha256": "9b196e3075903b50be8c88f2ee1d1ef793eb09a2959250d61cf30da16289a2c9",
  "note": "draft 1, sealed by change-2026-10-15-9; it stays as it was"
 },
 "plan": {
  "file": "analysis/cancer-research/scattering-side/plan-final.md",
  "sha256": "0e3f8f114ed44eade7e211317217f23e27c1075008e561c2b07ea11645823121",
  "note": "the design's locked plan: its labels and combined readings are scored again in the replication's first section"
 },
 "lock": {
  "file": "analysis/cancer-research/scattering-side/lock.json",
  "sha256": "3c7f70973247a327067a1817766b0dae3e0d72154f1de7785df7213ff271b23d",
  "note": "steps 1 and 2's lock, unchanged"
 },
 "amendment": {
  "file": "analysis/cancer-research/scattering-side/amendment-2026-10-15.md",
  "sha256": "d1edbec186079043706fa6ee63b756de4e7c1e52f011b06d491fd379335f1c75",
  "status": "approved by Colson on October 15, 2026: comparison A and arm U stay out"
 },
 "pilot_lock": {
  "file": "analysis/cancer-research/scattering-side/pilot_lock.json",
  "sha256": "a434b2af2f4e64e02aef069ef945570b64e2278ae8ab318abd65fc8d625ae9f2",
  "note": "the pilot's lock: its settings are the replication's, except the starts and the count of moments"
 },
 "steps_1_and_2_code": {
  "file": "analysis/cancer-research/scattering-side/scattering_side.py",
  "sha256": "2a20b872d594a53b50f7b124e700c58e0e4efe12377324ac17105818f9e94634",
  "use": "imported unchanged: the arms, run_arm, the rhythm rule and the 11 step-1 checks"
 },
 "pilot_code": {
  "file": "analysis/cancer-research/scattering-side/scattering_pilot.py",
  "sha256": "1d4acb826160fdd48e06d9ff8a6eb23f596650e2c75bdc89cf5e19ab38f5e54c",
  "use": "imported unchanged: the moment task, the numbers each moment gives, the analysis, labels, combined readings and report text, and checks P2 and P3"
 },
 "pilot_records": {
  "pilot_checks": {
   "file": "analysis/cancer-research/scattering-side/pilot_checks.json",
   "sha256": "c386a98f0926836cd9b06602c6802be62e3f034aa421ca16d0ac4bf2ba05220e"
  },
  "pilot_checks_txt": {
   "file": "analysis/cancer-research/scattering-side/pilot_checks.txt",
   "sha256": "cbca34c2f76d043c76f9d59683dc16389d99b994004b9d486a1c958f4502c142"
  },
  "pilot_go": {
   "file": "analysis/cancer-research/scattering-side/pilot_go.json",
   "sha256": "d55c9c0a825ac00b02b357656e408e79aa862d296f39dd42a3f0e646708e51d5"
  },
  "pilot_runlog": {
   "file": "analysis/cancer-research/scattering-side/pilot_runlog.json",
   "sha256": "e1cded6d732b0b4d5dc22703c9b3f548f38947963d38339aff5e70923fd9faae"
  },
  "pilot_results": {
   "file": "analysis/cancer-research/scattering-side/pilot_results.json",
   "sha256": "31b1dd50a177e986b1e41f1780a20228dc0d76d8ce783e3428162df7ab6ac382"
  },
  "pilot_results_txt": {
   "file": "analysis/cancer-research/scattering-side/pilot_results.txt",
   "sha256": "30e1c817135af3dfe11fea17a8de972b7e7dc03b0c181c85960524edffcb4c6c"
  },
  "pilot_raw_list": {
   "file": "analysis/cancer-research/safekeeping/raw-data-2026-10-15-8.sha256",
   "sha256": "11c3535d208ba715c7b9e31d30e2ebd7f40b6bfe89f680436cfd2892da78b2c6"
  }
 },
 "pilot_records_note": "sealed by change-2026-10-15-6, -7 and -8; opened only to read, in checks R0, R2 and R3 and for the pilot's numbers quoted in the report",
 "follows": {
  "file": "analysis/cancer-research/safekeeping/change-2026-10-15-9.json",
  "sha256": "73456b72f26503fdab9533f118f1f4443967e692b7dcb3b935dfed9204ea1e50"
 },
 "authorization": {
  "given": "October 15, 2026",
  "words": [
   "Professor Squirrel, let's retain the 24 fresh starts (147–170) and select \"Any clear rise\" for Q2, as drafted.",
   "Our primary Q2 question is whether the 0.6 arm reproducibly produces a positive B2 change without establishing a separate rhythm.",
   "Preserve the original ±0.005 meaningful-effect threshold and its historical pilot contradiction in the report. The new Q2 criterion must remain explicitly labelled as a post-pilot hypothesis.",
   "Keep Q1 and Q3 unchanged, including the analytical turning-rate interval, paired comparison rules, rhythm detector, uncertainty calculations, and predetermined verdicts.",
   "Please also retain the actual effect size and uncertainty for Q2, regardless of its PASS/FAIL/INCONCLUSIVE label.",
   "Finalize the written plan and prepare the code-verification checks for approval. Do not run fresh starts 147–170 without a separate authorization.",
   "Preserve all earlier experimental locks and the website unchanged.",
   "~ Plan review approved in principle."
  ],
  "choices": {
   "Question 2's PASS": "Any clear rise (as drafted)",
   "next": "Approve for the first go"
  },
  "choice_offered": {
   "Approve for the first go": "Lock the plan, write the code and run the pre-run checks on the pilot's data. No fresh starts."
  },
  "scope": "Go 1: finalize the plan; prepare this lock; write the replication's code; run checks R0 to R5, with no fresh start; bring the checks back for his approval",
  "not_authorized": [
   "running anything on fresh starts 147 to 170: the base runs, the 240 moments, the report and checks R6 and R7",
   "any change to an earlier lock or sealed record",
   "pooling the pilot's starts with the replication's",
   "any website change or publication"
  ],
  "if_a_check_fails": "stop: nothing runs on a fresh start, and the failure is reported"
 },
 "unchanged": [
  "every earlier record, word for word: plan-final.md, lock.json, the amendment, pilot_lock.json, both codes, the pilot's checks, go, run log and results, draft 1, and the medium test's and the Cause Test's records",
  "the pilot's results as sealed (exploratory): at 0.4 combined reading 1, the predicted counter-rotating edge rhythm; at 0.6 combined reading 2, B2 +0.0062 ± 0.0013 contradicting the predicted null (margin ±0.005), with no fault found. Its starts are never pooled with the replication's",
  "the model, the arms, the window, the moment rule, the rhythm rule and its thresholds, the readings, margins, labels and combined readings plan-final.md fixes, and the uncertainty rules, as the pilot ran them",
  "the Cause Test's FAIL and the Fluidity Replication's passes",
  "the website: nothing written and nothing published"
 ],
 "settings": {
  "starts": {
   "numbers": [
    147,
    148,
    149,
    150,
    151,
    152,
    153,
    154,
    155,
    156,
    157,
    158,
    159,
    160,
    161,
    162,
    163,
    164,
    165,
    166,
    167,
    168,
    169,
    170
   ],
   "seeds": [
    146,
    147,
    148,
    149,
    150,
    151,
    152,
    153,
    154,
    155,
    156,
    157,
    158,
    159,
    160,
    161,
    162,
    163,
    164,
    165,
    166,
    167,
    168,
    169
   ]
  },
  "moments": {
   "per_start": 10,
   "all": 240,
   "window": 200,
   "after": 500,
   "units": 700
  },
  "base_runs": {
   "run": 6000.0,
   "keep": "the full state at every moment's T and R",
   "gap_growth": true
  },
  "arms": {
   "names": [
    "untouched",
    "raised",
    "f06",
    "f04"
   ],
   "copies": 2,
   "window_pull": [
    1.9,
    1.9094999999999998,
    1.9,
    1.9
   ],
   "window_rates": [
    "original",
    "original",
    0.6,
    0.4
   ],
   "after_pull": 1.9,
   "after_rates": "original"
  },
  "read": [
   150,
   200
  ],
  "error_bars": {
   "units": "starts",
   "resamples": 400,
   "seed": 20261016,
   "clear_bars": 3.0,
   "inside_bars": 2.0
  },
  "margins": {
   "B1": 0.25,
   "B2": 0.005,
   "rhythm_inside": 0.05,
   "rhythm_as_expected_at_0_4": 0.1,
   "rate_range": [
    0.9,
    1.1
   ]
  },
  "descriptions": {
   "rule_block": 50,
   "coherence_block": 100,
   "after_R_stretch": [
    200,
    500
   ],
   "benchmark": 0.1602,
   "sham_later_growth": 0.0015,
   "in_step_rate": 0.03,
   "in_step_turns": 0.25
  },
  "pieces": {
   "workers": 7,
   "budget_seconds": 240.0,
   "start_by_seconds": 150.0,
   "hard_limit_seconds": 285
  },
  "checks": {
   "moment_check": {
    "seed": 102,
    "moment": 0,
    "T": 2055
   },
   "made_up": {
    "seed": 20261015,
    "stream": 10,
    "scenarios": 8
   }
  },
  "questions": {
   "theory_rates": {
    "together": 0.9601,
    "opposite": 0.9641
   },
   "band_width": 0.03,
   "band": [
    0.9301,
    0.9941
   ],
   "band_bars": {
    "inside": 2,
    "clearly_outside": 3
   },
   "rate_bar": {
    "resamples": 400,
    "seed": 20261016,
    "sd_ddof": 1
   },
   "D_any": {
    "size": 0.1,
    "inside": 0.05
   },
   "D_B2": {
    "size": 0.005,
    "inside": 0.005
   },
   "rise_at_0_6_bars": 3,
   "below_bars": 3,
   "pair_described_at_least": 2
  },
  "replication_checks": {
   "pilot_moment": {
    "start": 135,
    "seed": 134,
    "moment": 0,
    "T": 2285
   },
   "replication_moment": {
    "start": 147,
    "seed": 146,
    "moment": 0,
    "T": 2235
   },
   "made_up": {
    "seed": 20261015,
    "stream": 11
   },
   "agreement": 1e-12
  }
 },
 "moments": {
  "147": [
   2235,
   2565,
   2895,
   3225,
   3555,
   3885,
   4215,
   4545,
   4875,
   5205
  ],
  "148": [
   2030,
   2360,
   2690,
   3020,
   3350,
   3680,
   4010,
   4340,
   4670,
   5000
  ],
  "149": [
   2195,
   2525,
   2855,
   3185,
   3515,
   3845,
   4175,
   4505,
   4835,
   5165
  ],
  "150": [
   2295,
   2625,
   2955,
   3285,
   3615,
   3945,
   4275,
   4605,
   4935,
   5265
  ],
  "151": [
   2065,
   2395,
   2725,
   3055,
   3385,
   3715,
   4045,
   4375,
   4705,
   5035
  ],
  "152": [
   2220,
   2550,
   2880,
   3210,
   3540,
   3870,
   4200,
   4530,
   4860,
   5190
  ],
  "153": [
   2010,
   2340,
   2670,
   3000,
   3330,
   3660,
   3990,
   4320,
   4650,
   4980
  ],
  "154": [
   2130,
   2460,
   2790,
   3120,
   3450,
   3780,
   4110,
   4440,
   4770,
   5100
  ],
  "155": [
   2075,
   2405,
   2735,
   3065,
   3395,
   3725,
   4055,
   4385,
   4715,
   5045
  ],
  "156": [
   2115,
   2445,
   2775,
   3105,
   3435,
   3765,
   4095,
   4425,
   4755,
   5085
  ],
  "157": [
   2115,
   2445,
   2775,
   3105,
   3435,
   3765,
   4095,
   4425,
   4755,
   5085
  ],
  "158": [
   2325,
   2655,
   2985,
   3315,
   3645,
   3975,
   4305,
   4635,
   4965,
   5295
  ],
  "159": [
   2260,
   2590,
   2920,
   3250,
   3580,
   3910,
   4240,
   4570,
   4900,
   5230
  ],
  "160": [
   2155,
   2485,
   2815,
   3145,
   3475,
   3805,
   4135,
   4465,
   4795,
   5125
  ],
  "161": [
   2295,
   2625,
   2955,
   3285,
   3615,
   3945,
   4275,
   4605,
   4935,
   5265
  ],
  "162": [
   2280,
   2610,
   2940,
   3270,
   3600,
   3930,
   4260,
   4590,
   4920,
   5250
  ],
  "163": [
   2105,
   2435,
   2765,
   3095,
   3425,
   3755,
   4085,
   4415,
   4745,
   5075
  ],
  "164": [
   2080,
   2410,
   2740,
   3070,
   3400,
   3730,
   4060,
   4390,
   4720,
   5050
  ],
  "165": [
   2205,
   2535,
   2865,
   3195,
   3525,
   3855,
   4185,
   4515,
   4845,
   5175
  ],
  "166": [
   2210,
   2540,
   2870,
   3200,
   3530,
   3860,
   4190,
   4520,
   4850,
   5180
  ],
  "167": [
   2290,
   2620,
   2950,
   3280,
   3610,
   3940,
   4270,
   4600,
   4930,
   5260
  ],
  "168": [
   2020,
   2350,
   2680,
   3010,
   3340,
   3670,
   4000,
   4330,
   4660,
   4990
  ],
  "169": [
   2115,
   2445,
   2775,
   3105,
   3435,
   3765,
   4095,
   4425,
   4755,
   5085
  ],
  "170": [
   2160,
   2490,
   2820,
   3150,
   3480,
   3810,
   4140,
   4470,
   4800,
   5130
  ]
 },
 "meaning": {
  "same_as_the_pilot": "Every model run, reading, label and combined reading is the pilot's own, through scattering_side.py and scattering_pilot.py imported unchanged: base runs by the medium pilot's base_task, moments by scattering_pilot.moment_task, the numbers by scattering_pilot.moment_numbers, the analysis by scattering_pilot.analyse. pilot_lock.json's 'meaning' holds for all of them.",
  "analysis_for_24_starts": "scattering_pilot.analyse checks that it has as many starts as its start list, with 10 moments each; that count is its only use of the list. For each call the replication sets the list to its 24 seeds, and restores the pilot's after, whatever happens.",
  "first_section": "the labels and combined readings plan-final.md fixes, as scattering_pilot.analyse computes them, shown in scattering_pilot.report_lines' own text for its sections 1 to 3, without its 12-start header",
  "pilot_quoted": "the pilot's labelled readings at 0.6 and 0.4, quoted from pilot_results.json in their own block as sealed; never pooled and never recomputed",
  "rate": "the median |Omega*| over every direction holding a rhythm in arm F' (each group, moment and direction once, all 24 starts pooled): scattering_pilot.analyse's 'rate' at 0.4",
  "rate_bar": "resampled only: for each of the 400 draws numpy default_rng(20261016).integers(0, 24, (400, 24)), the draws medium_test.summary makes for 24 starts, the drawn starts' directions are pooled (a start drawn twice counts twice) and their median taken; the bar is the SD (ddof 1) of the 400 medians. If any draw holds no direction with a rhythm, the bar is undefined",
  "band": "inside: the rate minus 2 bars above 0.9301 and the rate plus 2 bars below 0.9941, strictly, with a defined rate and bar. Clearly outside: the rate plus 3 bars below 0.9301, or the rate minus 3 bars above 0.9941, strictly, with a defined rate and bar. Anything else: neither. 0.9301 and 0.9941 are 0.03 below the theory's rate with A and B together (0.9601) and 0.03 above its rate with them opposite (0.9641) (theory_numbers.txt, the model's 4,000)",
  "below": "more than 3 bars below zero: the reading below minus 3 bars, strictly, with a defined bar",
  "D_any": "per start, the mean over its 10 moments and 2 groups of (a rhythm in arm F', 0 or 1) minus (a rhythm in arm F, 0 or 1), from the 'any' flags of scattering_side.group_flags; the reading and its bar by medium_test.summary over the 24 starts",
  "D_B2": "per start, the mean over its 10 moments of the faster half's own coherence at R (the two groups' average, first copy) in arm F' minus arm F; medium_test.summary",
  "D_pair_and_D_steady": "as D-any, with the 'pair' and 'steady' flags (described, not labelled)",
  "D_labels": "scattering_pilot.label_up(D-any, 0.10, 0.05) and label_up(D-B2, 0.005, 0.005): 'as expected' means separated as predicted (more than 3 bars above zero and at least the size); 'contradicts' means inside the margin; anything else is 'unresolved'",
  "question_1": "PASS: combined reading 1 at 0.4, and the rate inside the band. FAIL, any of: E-pair at 0.4 'contradicts'; E-any at 0.4 'contradicts'; the rate clearly outside the band. INCONCLUSIVE: anything else, with its conditions shown",
  "question_2": "A hypothesis set after the pilot, labelled so in the report. PASS, all of: B2 at 0.6 more than 3 bars above zero (scattering_pilot.above); E-any at 0.6 'as expected'; E-steady at 0.6 inside ±0.05. FAIL, any of: B2 at 0.6 inside ±0.005 and not more than 3 bars above zero; B2 at 0.6 more than 3 bars below zero; E-any at 0.6 'contradicts'. INCONCLUSIVE: anything else, with its conditions shown. Whatever the verdict, the report gives B2 at 0.6 with its bar, the number of starts above zero, the first section's label for it (by ±0.005) and the pilot's sealed reading",
  "question_3": "PASS: D-any and D-B2 both 'as expected'. FAIL: both 'contradicts', or either more than 3 bars below zero. INCONCLUSIVE: anything else, naming which separated",
  "pass_and_fail_together": "if a question's PASS conditions and one of its FAIL conditions hold together, its verdict is INCONCLUSIVE, naming both (possible only in Question 1)",
  "described": "Question 1: how many of the 24 starts hold a pair in arm F' (both directions, in a group) at least once, and in at least 2 of their 20 group-moments. Question 3: D-pair and D-steady; how many starts have D-any of at least 0.10 and D-B2 of at least 0.005 on their own; how many of the 480 group-moments hold a rhythm in arm F' but not in arm F, and the reverse. At each level: how many starts have B2 above zero",
  "one_report": "made once, after all 240 moments are done, from the fresh starts' saved runs only. Between pieces only operational progress is shown: tasks finished, saved, skipped or failed, and seconds",
  "bit_for_bit": "the same array names, and for each array the same type, shape and bytes",
  "against_the_theory": "any 'contradicts' in the first section, or any FAIL, sends me first to check the arm and the code for a fault, read-only; the report stays as made"
 },
 "checks": [
  "All must pass before anything runs on a fresh start; if any fails, nothing runs and the failure is reported. One command writes them to replication_checks.txt and replication_checks.json, and refuses to write over an existing record.",
  "R0. The sealed files and this lock: the final plan, draft 1, plan-final.md, lock.json, the amendment, pilot_lock.json, both codes and the pilot's records match the fingerprints this lock records; this lock and the final plan are the versions change-2026-10-15-10 sealed; scattering_pilot.pilot_problems finds nothing; the code's settings equal this lock's after a JSON round trip; this lock's settings equal pilot_lock.json's except the starts and the count of moments, with the questions' settings and the checks' moments added; the fresh starts' moments are this lock's; the numerical environment matches the pilot's checks and run log.",
  "R1. Step 1's 11 code checks (scattering_side.py's own check, its record redirected to a temporary folder) and the pilot's checks P2 and P3 (scattering_pilot.moment_check_task and made_up_check, with P2's pass condition as scattering_pilot.check states it) pass again, writing nothing to their files.",
  "R2. Pilot start 135, moment 1 (T = 2,285), rerun from the pilot's saved base run by scattering_pilot.moment_task into a temporary folder, equals the pilot's saved moment bit for bit; both saved files first match raw-data-2026-10-15-8.sha256.",
  "R3. The replication's analysis path, given the pilot's 120 saved moments (each first matched to raw-data-2026-10-15-8.sha256) with the pilot's 12 seeds, reproduces pilot_results.json's 'levels' and 'descriptions' exactly after a JSON round trip. Counts only are shown, never values.",
  "R4. On made-up numbers, no model run (draws from (20261015, 11, scenario)): tables of boundary cases for the band, 'below', the rate's bar and each question's verdict, covering every branch, PASS and FAIL meeting, the edges and undefined bars; made-up replications of 24 starts x 10 moments built for known verdicts, with B1, B2, the E-readings, the paired readings, the rate and its bar computed directly from them and agreeing within 1e-12; and the report written end to end. The pilot's start list is restored after each call.",
  "R5. Starts 147 to 170 appear in no earlier record: no json record in analysis/ other than the replication's own lists such a start (or a seed 146 to 169) or names a task for one; no file in generated-artifacts/ outside the replication's folder is named for one; and the replication's folder, run log, report and after-report record don't exist, unless replication_go.json exists."
 ],
 "after_checks": [
  "After the report, whatever it shows: one command, written to replication_after.txt and replication_after.json, read-only except for a temporary folder.",
  "R6. An independent recomputation from the saved arrays, without scattering_pilot.moment_numbers or analyse: B1 from each group's coherence at R; B2 from each arm's sums over the faster half at R; the shares from the saved rule arrays; D-any, D-B2, the median |Omega*| and the rate's bar. Means and bars agree with the report within 1e-12, and the same labels, combined readings and verdicts follow by the same rules.",
  "R7. Replication start 147, moment 1 (T = 2,235), rerun into a temporary folder, equals its saved moment bit for bit.",
  "R8. Any 'contradicts' in the first section, or any FAIL, is flagged for a read-only fault check of the arm and the code; the report stays as made."
 ],
 "commands": [
  "timeout -k 10 285 python3 -B scattering_replication.py check",
  "timeout -k 10 285 python3 -B scattering_replication.py base",
  "timeout -k 10 285 python3 -B scattering_replication.py moments",
  "timeout -k 10 285 python3 -B scattering_replication.py after"
 ],
 "go": "base, moments and after refuse to run unless replication_go.json exists. It is written only on Colson's separate authorization for the run, with his words, and names this lock's SHA-256 and replication_checks.json's; a dated change record seals it before any fresh start runs.",
 "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, moments and after run only after every check passed with this same code, lock, plans, amendment and both codes, in the same numerical environment. A base run stopped at a piece's deadline keeps its exact state and goes on in the next piece; each moment is written whole or not at all; a task that fails mechanically is rerun from the start with the same inputs. base takes about 4 to 6 pieces and moments about 12 to 18; the report is made once, after the last moment.",
 "outputs": {
  "reports": "analysis/cancer-research/scattering-side/ (replication_checks.txt/.json; later replication_go.json, replication_runlog.json, replication_results.txt/.json and replication_after.txt/.json)",
  "saved_runs": "generated-artifacts/scattering-side/replication/ (kept out of the project's history)"
 }
}
