# The scattering side: a prospective replication (draft 1)

**Draft 1, October 15, 2026, for Colson's review.** Not approved, not locked and not in force. Nothing has run for it:
no simulation, no check, no rerun and no reading of saved runs. Its numbers come from the sealed plan (plan-final.md),
the theory file (theory_numbers.txt), the pilot's sealed report (pilot_results.txt) and run log, and arithmetic on them:
the expected error bars and chances in "What 24 starts can see". A read-only scan of the records in analysis/ checked
that the planned starts are unused. Nothing runs without his go.

His words, after reading the pilot's results:

> yes—please draft a prospective replication plan for the scattering-side findings. Do not run anything yet.
>
> Preserve the full exploratory pilot, including the successful 0.4 edge-rhythm prediction and the contradicted B2 null
> at 0.6.
>
> I want the replication to distinguish three questions:
>
> 1. Does the counter-rotating edge rhythm reliably emerge at 0.4, with a turning rate consistent with the analytical
>    prediction?
> 2. Does 0.6 reliably produce a small increase in faster-half coherence without a detectable separate rhythm?
> 3. Can we directly distinguish the 0.4 and 0.6 outcomes using a prespecified paired comparison?
>
> Please distinguish predictions established before the exploratory pilot from hypotheses refined after seeing its
> results.
>
> Use the existing oscillator model and rhythm detector without changing their mechanics or thresholds.
>
> Specify fresh starts, uncertainty calculations, meaningful effect margins, PASS/FAIL/INCONCLUSIVE criteria,
> reproducibility checks, and computational cost.
>
> Preserve all previous locks, including the Cause Test FAIL and Fluidity Replication.
>
> No new runs, website changes, or publication. Bring the written design back for review.
>
> ~ Draft only.

## In short

- **24 fresh starts,** 147 to 170 (seeds 146 to 169): 240 moments. The pilot's model, arms, window, moment rule, rhythm
  rule, thresholds, margins and error bars are used unchanged.
- **First, the predictions made before the pilot** are scored again on the fresh starts, with the pilot's own labels and
  combined readings.
- **Then Colson's three questions,** each with PASS, FAIL and INCONCLUSIVE criteria written now, after the pilot. Each
  says which parts were set before the pilot and which were refined after it.
- **Checks** before the run (the code reproduces the pilot exactly), during it (as in the pilot), and after the report
  (an independent recomputation and a bit-for-bit rerun), whatever the result.
- **Cost:** about 66 to 78 minutes of computing in about 18 to 27 foreground commands, and about 335 MB, over two
  separate gos.

## What stays on record

The replication adds a record; it doesn't revise one. Whatever it shows, these stand as sealed:

- **The pilot** (exploratory; sealed by change-2026-10-15-8):
  - **At 0.4: combined reading 1, "The predicted counter-rotating edge rhythm."** This is the prediction that
    succeeded. B2 +0.0542 ± 0.0018 (up); E-pair +0.696 ± 0.037; E-any +0.967 ± 0.011; the median |Ω*| over the 399
    directions holding a rhythm 0.963, against the theory's 0.960 (A and B together) and 0.964 (opposite).
  - **At 0.6: combined reading 2, "A change in the faster half's coherence without a separate rhythm."** B2 +0.0062 ±
    0.0013, contradicting the predicted null (margin ±0.005); B1 +0.081 ± 0.041, as expected; no direction held a
    rhythm. The fault check the plan requires found no fault.
  - Its starts (135 to 146) are never pooled with the replication's. The replication's report may quote the pilot's
    sealed numbers beside its own, for reference only.
- **This design's earlier records:** plan.md, plan-draft-1.md, plan-final.md and lock.json; Amendment 1, approved, which
  keeps comparison A and arm U out; pilot_lock.json and the pilot's code, checks, go, run log and report; comparison
  A's feasibility result (arm U matched at 10 of 20 moments, against the 18 required). Step 2's old-start numbers stay
  feasibility observations and enter nothing.
- **Elsewhere:** the Cause Test's preregistered FAIL and its lock; the medium test's pilot and the Fluidity Replication
  (both hypotheses passed), with their locks and review; every change record and fingerprint list.

## The same as the pilot

The replication's code imports scattering_side.py and scattering_pilot.py as sealed and calls their functions. Neither
file is edited.

- **The model:** the existing two-group oscillator model, with its natural rates, steps and settling unchanged. Each
  start gets a 6,000-unit base run.
- **The moments:** 10 per start by the medium pilot's rule: T = 2,000 + an offset (a multiple of 5 from 0 to 325, drawn
  from the start's seed) + 330 m, for m = 0 to 9.
- **The arms,** each from the base run's state at T, both copies, 200 units changed and then 500 on the original pull
  and rates: the untouched rerun, the raised pull (K × 1.005), arm F (c_f = 0.6) and arm F′ (c_f = 0.4). No comparison
  A and no arm U.
- **The rhythm rule and its thresholds:** read over (T + 150, R]; the most crowded interval 0.03 wide inside 0.80 to
  1.30 in each direction; L ≥ 1.5; S ≥ 0.057; a pair, any rhythm and steady turning, per group.
- **The readings, margins, labels and combined readings,** word for word from plan-final.md: B1 (±0.25), B2 (±0.005),
  E-pair, E-any and E-steady (inside ±0.05; at 0.4, "as expected" needs at least 0.10), and the rate range 0.90 to 1.10.
- **The error bars:** the starts are the units, each counting equally; the larger of the resampled bar (starts drawn
  with replacement, 400 times, seed 20261016) and SD/√n; a ratio of averages (B1) takes the resampled bar. "Inside"
  means the reading ± 2 bars lies strictly within ± the margin; "clear" means more than 3 bars from zero.
- **The checks at each moment:** the untouched rerun matches its base run to the last digit; every arm runs on its
  scheduled pull and rates and then on the original ones; every reading is present, finite and adds up.
- **The pieces:** up to 7 workers, each command in the foreground and under 5 minutes, saved runs resuming exactly.

Only the starts, the output folder and the records' names differ. The lock will set its settings beside
pilot_lock.json's and show that nothing else differs. The pilot's analysis function accepts exactly 12 starts. The
replication supplies its 24 without editing that file, using the same summary and label functions, and check R3 below
confirms that this path reproduces the pilot's sealed report exactly.

## Set before the pilot, and refined after it

| | Set before the pilot (plan-final.md, locked before any fresh start ran) | Refined after seeing the pilot (new in this draft) |
| --- | --- | --- |
| 0.4 | The edge rhythm forms: B2 up (at least 0.005), E-pair and E-any as expected (at least 0.10), and the median rate within 0.90 to 1.10. Together: combined reading 1. The theory's turning rates: 0.9601 with A and B together (e-folding 67 units) and 0.9641 opposite (116). | The same rhythm, with the median rate inside 0.930 to 0.994: within 0.03, the rule's interval width, of the theory's two rates. (Question 1) |
| 0.6 | No meaningful change: B1 inside ±0.25 and B2 inside ±0.005. No edge synchronization: E-any inside ±0.05. The theory: no pattern grows at 0.6. | A clear rise in B2 (more than 3 bars above zero), still with no rhythm and no steady turning. This goes against the theory's null. It comes from the pilot alone. (Question 2) |
| 0.4 against 0.6 | Implied by the two rows above (the theory puts the change near c_f ≈ 0.515), but never set as a paired reading. | Paired differences at the same moments of the same starts: the share holding a rhythm higher at 0.4 by at least 0.10, and B2 higher by at least 0.005. The direction is the theory's; the reading, margins and labels are new. (Question 3) |

Both columns are scored. The first column's labels are applied to fresh starts exactly as in the pilot: a replication of
predictions made before any data. The second column's criteria were written after the pilot was seen. A PASS on them
shows that the pilot's pattern recurs on fresh starts, not that it was predicted.

## The fresh starts

- **Starts 147 to 170 (seeds 146 to 169):** 24 starts, 240 moments.
- **Unused so far.** A read-only scan of the records in analysis/ (the start and seed lists in every json record, and
  the start ranges in the code) found none past 146, the pilot's last. Check R5 repeats this at Go 1, folders included.
- **Their moments come from their seeds** by the unchanged rule. The lock lists them; drawing them runs no model.
- **The run commands refuse** any start outside 147 to 170 and any folder but the replication's. The pilot's saved runs
  are opened only to read, in checks R2 and R3.
- **Why 24:** the pilot's bars divided by √2 resolve every question's readings well inside their margins, and more
  starts add little ("What 24 starts can see").

## How the readings and bars are computed

- **As in the pilot:** for each start, a reading is averaged over its 10 moments; a share counts each group at each
  moment once, 20 per start; each arm is read against the untouched rerun; every start counts equally; the bar is as
  above, with n = 24.
- **What the bars mean.** With 24 starts (a t-distribution with 23 degrees of freedom), ± 2 bars covers about 94%, and
  a reading lands more than 3 bars from zero by chance alone about 0.3% of the time in each direction.
- **New: the rate's bar.** The rate is the pilot's reading: the median |Ω*| over every direction holding a rhythm at
  0.4, all starts pooled. Its bar is resampled only: the same 400 draws of the 24 starts, the pooled median recomputed
  for each draw, and the SD of those 400 medians. If a draw holds no rhythm direction, the bar is undefined, and the rate
  reads neither inside nor outside the band.
- **New: the paired differences,** 0.4 arm minus 0.6 arm at the same moment and group. The untouched rerun cancels.
  - **D-any:** each group-moment's flag for holding a rhythm (0 or 1) at 0.4 minus at 0.6, averaged over the start's 20
    group-moments. It equals E-any at 0.4 minus E-any at 0.6.
  - **D-B2:** the faster half's own coherence at R, 0.4 minus 0.6, averaged over the start's 10 moments. It equals B2
    at 0.4 minus B2 at 0.6.
  - Their bars come from the starts' own differences (the larger of the resampled bar and SD/√24), so the pairing is
    used.

## Margins

| Reading | Meaningful size | No meaningful change ("inside") | Set |
| --- | --- | --- | --- |
| B1 at 0.6 | 0.25 of the raised pull's gain | ±0.25 | before the pilot |
| B2, at either level | 0.005 | ±0.005 | before the pilot |
| E-pair and E-any at 0.4 | 0.10 | ±0.05 | before the pilot |
| E-any and E-steady at 0.6 | 0.05 | ±0.05 | before the pilot |
| The rate at 0.4 | — | the band, 0.9301 to 0.9941 | after the pilot |
| D-any | 0.10 | ±0.05 | after the pilot (E's sizes) |
| D-B2 | 0.005 | ±0.005 | after the pilot (B2's margin) |
| The rise in B2 at 0.6 (Question 2) | clear: more than 3 bars above zero, with no floor on its size | — | after the pilot |

- The margins set before the pilot are kept as they are.
- The band runs from 0.03 below the theory's rate with A and B together (0.9601) to 0.03 above its rate with them
  opposite (0.9641). 0.03 is the width of the rule's own intervals, the finest rate the rule resolves. The band is
  centred on the theory's values, not on the pilot's 0.963, but it was chosen after the pilot was seen.
- The paired margins reuse the sizes already set for the same quantities, so "meaningful" means what it meant before
  the pilot.

## First: the predictions made before the pilot, scored again

Exactly as sections 1 and 2 of the pilot's report, with the pilot's functions:

- **Comparison B (0.6):** B1, B2 and E-any, each labelled; E-steady; E-pair described; the combined reading at 0.6.
- **Comparison B′ (0.4):** B2, E-pair and E-any, each labelled; E-steady; the rate within 0.90 to 1.10; B1 described;
  the combined reading at 0.4.

Before the pilot, the theory expected combined reading 1 at both levels. The pilot gave reading 1 at 0.4 and reading 2
at 0.6. Whatever the fresh starts give is reported with its label.

## Question 1. Does the counter-rotating edge rhythm reliably emerge at 0.4, with a turning rate consistent with the analytical prediction?

- **PASS:** combined reading 1 at 0.4, and the median |Ω*| ± 2 bars strictly inside 0.9301 to 0.9941.
- **FAIL,** any of:
  - E-pair contradicts (inside ±0.05: no counter-rotating pair formed);
  - E-any contradicts (no rhythm formed at all);
  - the median |Ω*| more than 3 bars below 0.9301 or more than 3 bars above 0.9941.
- **INCONCLUSIVE:** anything else, with the pattern named. For example: combined reading 2 (the pair formed but B2
  didn't rise); a rare pair (E-pair clear but below 0.10); or the rate neither inside the band nor clearly outside it.
- **Set before the pilot:** the rhythm, its labels and the range 0.90 to 1.10. **Refined after it:** the band. The
  range stays as the first section's label, and a rate inside 0.90 to 1.10 but clearly outside the band fails
  Question 1.
- **"Reliably"** is read as: on fresh starts, with the averages clear by the plan's own rule. How many of the 24 starts
  hold a pair at least once, and in at least 2 of their 20 group-moments, is described, not labelled: a single start's
  reading has no bar.

## Question 2. Does 0.6 reliably produce a small increase in faster-half coherence without a detectable separate rhythm?

- **PASS,** all of:
  - B2 at 0.6 more than 3 bars above zero;
  - E-any at 0.6 as expected (inside ±0.05: no edge synchronization);
  - E-steady at 0.6 inside ±0.05 (no steady turning that hasn't locked).
- **FAIL,** any of:
  - B2 at 0.6 inside ±0.005 without being more than 3 bars above zero (no reliable rise);
  - B2 at 0.6 more than 3 bars below zero (a fall);
  - E-any at 0.6 contradicts (edge synchronization at 0.6).
- **INCONCLUSIVE:** anything else, named. For example: B2 neither clear nor inside its margin; or steady turning without
  a shared rate (E-steady not inside while E-any is as expected).
- **Size.** "Small" gets no ceiling of its own. The first section's label for B2 at 0.6 says whether the rise is
  meaningful by the margin set before the pilot: "contradicts" (at least 0.005 and clear), "as expected" (inside
  ±0.005), or "unresolved", with a clear rise below 0.005 reported as a small change. It's reported beside the verdict:
  - a PASS with "contradicts": the pilot's contradiction recurred in size;
  - a PASS with "as expected" or a small change: a real rise, smaller than the margin set before the pilot.
- **Set before the pilot:** the opposite, no meaningful change in B2, which the first section still scores. **Refined
  after it:** the expectation of a clear rise, from the pilot alone.
- **The stricter alternative,** for Colson to choose: PASS only if B2 at 0.6 reads "contradicts" again (at least 0.005
  and clear). It asks the pilot's contradiction to recur in size. Its chance is lower (about 0.77 against about 0.985;
  see "What 24 starts can see"), because the pilot's own estimate, 0.0062 ± 0.0013, leaves room for a true value below
  0.005.
- **Not asked:** why B2 rises at 0.6. The replication tests whether the rise recurs and offers no explanation.

## Question 3. Can we directly distinguish the 0.4 and 0.6 outcomes using a prespecified paired comparison?

- **PASS:** D-any more than 3 bars above zero and at least 0.10, and D-B2 more than 3 bars above zero and at least
  0.005. Each is the "as expected" label the plan already uses at 0.4, applied to the difference.
- **FAIL:** both inside their margins (±0.05 and ±0.005), or either more than 3 bars below zero (the order reversed).
- **INCONCLUSIVE:** anything else, naming the partial pattern: separated by the rhythm but not by B2, by B2 but not by
  the rhythm, or neither resolved.
- **Set before the pilot:** the direction (a rhythm at 0.4 and none at 0.6). **Refined after it:** the paired reading,
  its margins and labels.
- **Described:** 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 group-moments hold a rhythm at 0.4 but not at 0.6, and the reverse.

## What else the report shows

- Everything the pilot's report describes, for the fresh starts: where any gain sits, the course through the window and
  after R, the rule's numbers in every arm, each rhythm's size, A and B in step, growth and fading, and how far each
  reshaping moved the rates.
- At each level, how many starts have B2 above zero (the pilot: 11 of 12 at 0.6, 12 of 12 at 0.4).
- The pilot's sealed numbers in a separate column, quoted from pilot_results.json, never pooled or recomputed.
- Notes: the mechanics at every moment, the checks, the compute, and the records each piece ran under.

## What 24 starts can see

Expected bars, from the pilot's spread divided by √2. The replication's own bars decide.

| Reading | Pilot bar (12 starts) | Expected bar (24) | Margin | Pilot reading |
| --- | --- | --- | --- | --- |
| B1 at 0.6 | 0.041 | 0.029 | ±0.25 | +0.081 |
| B2 at 0.6 | 0.0013 | 0.0009 | ±0.005 | +0.0062 |
| B2 at 0.4 | 0.0018 | 0.0013 | 0.005 | +0.0542 |
| E-pair at 0.4 | 0.037 | 0.026 | 0.10 | +0.696 |
| E-any at 0.4 | 0.011 | 0.008 | 0.10 | +0.967 |
| D-any | — | about 0.008, if 0.6 holds no rhythm | 0.10 | — |
| D-B2 | — | at most about 0.0022 (the two bars added) | 0.005 | — |

Chances, if the starts spread as in the pilot (normal approximation):

- **Question 2, as drafted:** about 0.9999 if B2's true value at 0.6 is the pilot's 0.0062, and about 0.985 allowing for
  the pilot's own uncertainty about it. If the true value were 0, a PASS by chance: about 0.3%.
- **The stricter alternative:** about 0.90, and about 0.77 allowing for the pilot's uncertainty.
- **Questions 1 and 3:** their pilot readings sit many bars beyond their margins, so their labelled parts are near
  certain if the pilot's averages hold. The one unknown is the rate's bar: it wasn't computed in the pilot, and it won't
  be computed on the pilot's data. If it's larger than about 0.0155, the rate can't read inside the band, and Question 1
  is inconclusive rather than failing.

More or fewer starts (the chances allow for the pilot's uncertainty):

| Starts | Question 2, as drafted | The stricter alternative | Computing for the run | Saved |
| --- | --- | --- | --- | --- |
| 12 | 0.895 | 0.74 | about 31 minutes | 168 MB |
| **24 (this draft)** | **0.985** | **0.77** | **about 61 minutes** | **335 MB** |
| 36 | 0.996 | 0.79 | about 92 minutes | 503 MB |
| 48 | 0.998 | 0.80 | about 122 minutes | 671 MB |

The stricter alternative levels off near 0.8 because the pilot's own estimate limits it, not the replication's size.

## Reproducibility checks

**At Go 1, before any fresh start.** One or two commands, about 3 to 5 minutes, written only to replication_checks.txt
and replication_checks.json:

- **R0.** plan-final.md, lock.json, Amendment 1, pilot_lock.json, both codes and the pilot's results match their seals.
  The replication's settings equal pilot_lock.json's except the starts, the folder and the records' names. The
  numerical environment matches the pilot's record.
- **R1.** Step 1's 11 code checks and the pilot's checks P2 and P3 pass again, through the same functions, without
  writing to their files. (The pilot's P1 is replaced by R0 and R5: its "no fresh start has been run" refers to the
  pilot's starts, which have now run.)
- **R2.** One pilot moment (start 135, moment 1, T = 2,285) is rerun from the pilot's saved base run into a temporary
  folder. Every array must equal the pilot's saved file bit for bit. The folder is then deleted.
- **R3.** The replication's analysis, given the pilot's 120 saved moments (each first matched to
  raw-data-2026-10-15-8.sha256), reproduces every number of the pilot's analysis in pilot_results.json exactly. It runs
  only the analysis the pilot had, so no new number about the pilot is made.
- **R4.** The new readings and the three questions' rules on made-up numbers, with no model run: every branch of PASS,
  FAIL and INCONCLUSIVE; the edges (exactly at a margin or at the band's ends, undefined bars, no rhythm directions);
  and the paired readings and the rate's bar on made-up moments with known answers.
- **R5.** Starts 147 to 170 appear in no earlier record, run log or saved-run folder, and the replication's folder
  doesn't exist yet.

If any check fails, I stop and report. A fix that touches the plan needs a dated revision and his go.

**During the run, as in the pilot:**

- every piece checks that it runs under the sealed lock, plan, amendment and code;
- at every moment, the per-moment checks above. A problem is flagged and named in the report; nothing is dropped or
  replaced;
- a task that fails mechanically is rerun from the start with the same inputs. The result is deterministic, so a repeat
  can't select a result;
- the report needs all 240 moments. If one can't be completed, there's no report, and I stop and tell him;
- between pieces, only operational progress is looked at: tasks finished, saved, skipped or failed, and seconds. The
  report is made once, by the last piece.

**After the report, whatever it shows.** One command, about 2 to 3 minutes, read-only except for a temporary folder:

- **R6.** An independent recomputation: B2 at both levels from each arm's own sums over the faster half, saved every
  unit; the shares from the saved rule arrays; D-any, D-B2 and the median |Ω*|. Each must agree with the report (means
  to within 1e-12, and the same labels and verdicts).
- **R7.** One replication moment, fixed now (start 147, moment 1), is rerun into a temporary folder and must equal its
  saved file bit for bit.
- **R8.** Any "contradicts" label in the first section, or any FAIL, sends me first to check the arm and the code for a
  fault, read-only, as the plan requires. The report stays as made.

Then the run log, the report, the checks and a list of the 264 saved runs are sealed in a dated change record.

## Steps and gos

1. **This draft,** sealed as a new file only. If he wants changes, draft 2 gets its own record.
2. **Go 1: lock and checks.** His approval of the final plan, sealed with his words; replication_lock.json (the plan's
   fingerprint, the settings, the starts and their moments, the margins, the band and the three questions' rules);
   scattering_replication.py; checks R0 to R5. Each is sealed. No fresh start runs.
3. **Go 2: the run.** His go, sealed before any fresh start runs; the base runs, the moments and the report; checks R6
   to R8; the seal.

## Computational cost

| Part | Commands | Time |
| --- | --- | --- |
| Go 1: checks R0 to R5 | 1 to 2 | about 3 to 5 minutes |
| Go 2: 24 base runs, 7 at a time | 4 to 6 | about 11 to 20 minutes |
| Go 2: 240 moments, 14 to 21 per command | 12 to 18 | about 50 minutes |
| After the report: R6 and R7 | 1 | about 2 to 3 minutes |
| **In all** | **about 18 to 27** | **about 66 to 78 minutes** |

- From the pilot's run log: a base run took 152 to 161 seconds, though one piece ran slower for a reason not
  established; a moment took 64 to 102 seconds on each of 7 workers.
- Every command runs in the foreground, under 5 minutes, with up to 7 worker processes that end with it. Nothing is
  left running.
- Saved: about 335 MB in generated-artifacts/scattering-side/replication/: 24 base runs of about 5.3 MB and 240 moments
  of about 0.87 MB. They're kept out of the project's history, as the pilot's are. Copying them to App Storage would
  need his go.

## What it can't tell

- It's a toy model: histories, not memory. It shows structure inside the model, not anything about cells or tissue.
- It tests the same two levels, one window and one pull size. It says nothing about where between 0.6 and 0.4 the
  change happens; the theory puts it near 0.515.
- **The rate band shows consistency, not uniqueness.** In arms without a rhythm, the rule's |Ω*| over every direction
  also sits near 0.98 (the pilot: 0.977 to 0.979), inside the band. After moving, the faster half's rates start just
  above 0.95, so a rhythm forming among them would be expected to turn not far above that, whatever its cause. The
  theory's rates also describe early growth, while the rule reads 150 to 200 units in.
- Question 2 asks whether the rise recurs, not why. A PASS adds no mechanism.
- The questions' criteria were written after the pilot, so their PASSes show that the pilot's pattern recurs. Only the
  first section scores predictions made before any data.
- B1 at 0.6 has no question of its own; its label from before the pilot is reported.

## Where things go

- This draft: analysis/cancer-research/scattering-side/replication-plan-draft-1.md, sealed as a new file only.
- At Go 1: replication_lock.json, scattering_replication.py, replication_checks.txt and replication_checks.json.
- At Go 2: replication_go.json, replication_runlog.json, replication_results.txt and replication_results.json; the saved
  runs in generated-artifacts/scattering-side/replication/.
- Nothing on the website, and nothing published.
