Skip to content

B61 (#634): the staggered frame's differentiation settles, and the null is what closes the gap - #647

Open
NGL321 wants to merge 3 commits into
mainfrom
worktree-b61-horizon-634
Open

NGL321 wants to merge 3 commits into
mainfrom
worktree-b61-horizon-634

Conversation

@NGL321

@NGL321 NGL321 commented Sep 10, 2026

Copy link
Copy Markdown
Owner

Resolves #634.

Stacked on #630's branch, which is not yet PR'd. This branch is cut from worktree-b58-stagger-630 at e51b9ed, so the diff against main currently carries B58's commit as well as this ticket's two. That is deliberate — b61_horizon.py imports b58_train.py, which is not on main — and it means this should merge after #630's own PR, or be rebased once that lands. Only 7f12803 and 857a886 are this ticket's work.

What it found

The staggered frame's differentiation settles, and the corrected falsifier does not fire.

#630 measured audience differentiation still falling at ~0.035 per 1,000 ticks at its 2,000-tick horizon and could not say whether that was a settle or a slide to the flat bundle. Run to 30,000 ticks it settles:

ticks 2000 9000 13000 18000 24000 30000
diff 0.5361 0.4313 0.4071 0.3921 0.3921 0.3912
rate per 1k −0.025 −0.013 −0.006 −0.003 −0.00001 −0.00014

The rate falls two orders of magnitude to the noise floor and the level moves 0.0009 over the last 12,000 ticks, against ~5% fixed-seed jitter. channel_return still reads 0.9819. #630's extrapolation — the flat bundle's neighbourhood inside ~15,000 ticks — is falsified by measurement.

The finding nobody asked for: the null climbs. s0_baseline is B42's flat bundle, and trained it runs 0.0000 → 0.1269 (seed 42) / 0.1511 (seed 43) at 9,000 and is still rising. So the gap keeps narrowing — 0.4558 → 0.3044 — driven entirely by the null, not by the candidate. A crossing is neither in evidence nor excluded. And since B48's null is defined at differentiation 0.0000, the object the joint rule names is a construction reading; that is now #646.

Two of #630's readings erode at horizon. Participation runs 13.6 → 9.40, and its "+4.9 over random init" has no horizon counterpart because B56's random-init arm was never run past 2,000 — against the flat bundle at the same horizon the advantage does persist (+3.90 at 9,000). p = 8 still leads p = 12 at every shared rung, margin narrowed to ~+0.03 and noisy, while holding channel_return worse; advisory to #608, which still owns p.

What is in the diff

  • b61_horizon.pyno new rig. Wraps b58_train.py's arms byte-identically and patches one thing: B56's checkpoint ladder, capped at 2,000. Every rung ≤2,000 reproduces B58 (prototype): Is the staggered frame the transport architecture, and what does the p-versus-differentiation curve cost? #630's table (tick 0 reads 0.7321; tick 100 reads 0.9995 / 0.6310 / 14.9). Also stages killed in-flight files aside as .killed-<n>.json.
  • b61_analyse.py — the model-free discriminator (rate on adjacent rung pairs, no fit), the gap read B50's way at shared rungs only, the p8/p12 ordering, and stall_diagnostic.
  • READOUT-634.md and five arm records: s19/s0/p8 on seed 42, s19/s0 on seed 43.

Two instrument findings that reach past this ticket

b56_analyse.horizon mis-stamps the stall on long runs. It returns the last rung clearing MOVING, which over 2,000 ticks is "when did the body stop". Over a long run the world sporadically re-crosses the threshold after dying and the rule latches on — three of four runs here mis-stamp (honest stamp 100; reported 30,000 / 9,000 / 6,000), and the re-crossing is not always at the final rung. Read long arms with b61_analyse.stall_diagnostic. Recorded as a standing constraint on #532.

B56's run_arm writes its in-flight file from the first frame, so a retry that dies early destroys a deeper attempt. This cost the ticket an 18,000-rung null before the staging fix landed; that loss is disclosed in the readout and no claim rests on the lost numbers.

Caveats, stated rather than buried

  • Every rung past 100 is drift under a frozen stimulus. These arms are the shipped transport rule and do not qualify for B56's stall exemption. The settle is a settle of drift and says nothing about a staggered frame in a live agent.
  • The settle rests on one seed; seed 43 replicates the decaying rate to 9,000 and stops short of the flat region.
  • Every arm runs the shipped pair, so which rule drives the decay is B68 (prototype): Why does the prediction rule collapse the traffic's rank while the transport rule raises it? #645's item 3, not inferable here.
  • The box was at 90–97% commit throughout and the guard killed five arms; horizons were re-scoped (30,000 primary, 9,000 panel) rather than abandoned.

🤖 Generated with Claude Code

https://claude.ai/code/session_016ASm99ubACXi7eZoP47zRf

NGL321 and others added 3 commits September 9, 2026 20:37
…rt on it

The exact stagger family is integer arithmetic. Under `build_staggered` both
incident maps at a cell are row-selections of the same frame, so `hop = S_out
S_in^T` and the frame cancels exactly; the composite is a partial permutation
matrix and `sigma_max` is 1 or 0 with nothing between. `b58_arith.py`
reproduces B56's family on all three widths and three seeds with no torch, and
`b58_curve.py` validates against B56's own sweep (exactness 20/20, max
edge_overlap error 0.018). The local candidate predicate is necessary and not
sufficient, recorded as a falsified attempt rather than deleted.

Trained, on B56's rig with only the initialisation patched: `channel_return`
1.0000 -> 0.9984 at 2,000 under the shipped rule with no term; clause 1 adds
+0.0001; the flat bundle does not attract (s0 0.0000 -> 0.0803 against s19
0.7321 -> 0.5317). The staggered arms are the first on this map to pass B48's
joint rule at a live rung, and they buy exposure rather than spend it
(participation 13.6/14.2 against random init's 8.7).

Both prices on `p` point to 8: this curve's ceiling saturates at 0.8036 there
and #608's graded community band exists there alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017keZsNHybkzmUwAcbJnH3z
…l is what closes the gap

#630 measured audience differentiation still falling at ~0.035 per 1,000 ticks at its
2,000-tick horizon and could not say whether that was a settle or a slide to the flat
bundle. It settles. On `s19_baseline` seed 42 run to 30,000 the level stops moving
between rungs 13,000 and 30,000 (0.4071 -> 0.3921 -> 0.3921 -> 0.3912) while the decay
rate falls two orders of magnitude to the noise floor, and `channel_return` still reads
0.9819 under the shipped rule with no term. #630's extrapolation to the flat bundle
inside ~15,000 ticks is falsified by measurement.

The gap is a different question and has a different answer. The flat bundle is not
static and over a long horizon it is the moving half: `s0_baseline` climbs 0.0000 ->
0.0803 (2,000) -> 0.1269 (9,000) and is still climbing when the candidate has stopped,
so the gap narrows 0.4558 -> 0.3044 driven entirely by the null's rise. A crossing is
neither in evidence nor excluded.

Two of #630's readings erode at horizon. Exposure: participation runs 13.6 -> 9.40, so
most of the +4.9 over random init is gone -- and that comparison cannot be made at
horizon at all, because B56's random-init arm was never run past 2,000; against the flat
bundle run to the same horizon the advantage persists (+3.90 at 9,000). `p = 8` leads
`p = 12` at every shared rung on differentiation and participation, but the margin
narrows from +0.071 to ~+0.03, is noisy, and `p = 8` holds `channel_return` worse. This
does not decide `p`; #608 owns that, and #630's construction-side price is untouched.

Seed 43 replicates the decaying rate and the levels to within the ~5% fixed-seed jitter,
but reaches only 9,000, so the settle itself rests on one seed.

No new rig: `b61_horizon.py` wraps `b58_train.py`'s arms byte-identically and patches
only B56's checkpoint ladder, so every rung at or below 2,000 reproduces #630's table.

Two instrument findings ride along. `b56_analyse.horizon` mis-stamps the stall on long
runs -- the world sporadically re-crosses the motion threshold after the body has died
and its last-above rule latches onto that, mis-stamping three of four runs here (honest
stamp 100, reported 30,000 / 9,000 / 6,000). And B56's `run_arm` writes its in-flight
file from the first frame, so a retry that dies early destroys a deeper attempt; that
cost this ticket an 18,000-rung null before `b61_horizon.run_one` was taught to stage
leftovers aside as `.killed-<n>.json`.

Every rung past 100 is drift under a frozen stimulus. These arms are the shipped
transport rule and do not qualify for B56's stall exemption, so the settle is a settle
of drift and says nothing about a staggered frame in a live agent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ASm99ubACXi7eZoP47zRf
Both seeds complete at 9,000. The gap reads 0.3044 (seed 42) and 0.2887 (seed 43),
still narrowing on both, with both rates decaying.

The null is the noisier arm and the noise is in its level, not its trajectory: `s0`
reads 0.1269 against 0.1511 at 9,000, a 19% spread where the staggered arm carries 2%,
while the climb rate over the last rung pair agrees at +0.0063 and +0.0066 per 1k. A
gap quoted at a rung therefore carries the null's spread and not the candidate's.

That puts a question against the null itself, recorded in the readout and not ruled
here: B48's null is *the flat bundle at audience differentiation 0.0000*, and 0.0000 is
its defining property, but trained under the shipped rule the flat bundle does not stay
there on either seed. The object the joint rule names is a construction reading.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ASm99ubACXi7eZoP47zRf
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

B61 (prototype): Does the staggered frame's differentiation settle above the flat bundle, or is 2,000 ticks too short?

1 participant