Notes — generation 4 on e64

What generation 4 changed, what the runs say, and what is still open. The instrument is here, and every claim below that names a cell links into it. This page carries no controls and computes nothing: it is the commentary that used to sit between a reader and the instrument.

Nothing here is a pick. Four variants were run; the choices are the programmer's (#variant_protocol), and this page is evidence put in front of that judgement. Generation 4 is unusual in that its goal block carried the picks in, so unlike generations 1–3 the runs waited on nothing.

What generation 4 changed, and what to watch here

MJC's answer to generation 3's choice C is this generation: "it's worth gen4 even if the only thing it does is extirpate the argmax 256-table interpreted as 255 rules everywhere that it exists" — with the discipline named alongside it, that whatever the reading is, it be consistent across the implementations and viewers. Two things landed:

whatwhat it iswhat to watch
A7, the pairthe k=1 argmax pattern is delivered at min(8, ws) in both directions, and the fall-off is 1 instead of A2's 2. One alternative, because the delivery and the fall-off only make sense together (#f-p8-cap8). Variants v024 (711111, the generation's baseline) and v025 (721111, B2 off it). step v024 against v002: same 14 recovered positions at e64, convergence in half the time steps (18 against 35).
the extirpationthe 255 reading is gone from every text that carried it — quietly, per the goal: no output document notes what it used to say. The query layer now reports the k=1 family at the stated strength 8; --latd no longer prints a literal under "stored LSA weight". the pattern browser's strength column reads 8 on every k=1 rule. It is a stated strength, not a stored one — see gap 3.
WHY 8, AND WHY THE FALL-OFF HAS TO MOVE WITH IT. 8 is the weight that makes the argmax carry half the mass of an ES whose other 255 events sit at 0, and the measured share of the argmax at its contexts expresses as 9 / 8 / 7 at e64 / e1k / e10k — so 8 is the measured value at e1k and within one unit of it at every sample size. The grid in the goal block is the argument for the pairing: at e1k, capping at 8 with the fall-off left at 2 recovers fewer positions than shipping (173 against 165) and leaves 208 of 833 vectors all-zero at the readout; moving the fall-off to 1 with the cap recovers 223. Either constant moved alone is worse than moving neither. The whole improvement is the pair.
255 IS PASS-THROUGH, AND THAT IS AN ABSOLUTE PATTERN, NOT A BUG. The first draft of the generation-4 goal read the shipped rule as two readers disagreeing about one quantity. MJC's correction stands over this page: "255 is pass-through and it is an absolute pattern. It is literally an absolute rule applied to something that represents partial knowledge. It is the highest strength a pattern can have because of the UM max-min forward pass, and because 255 is the identity of min." So under A1…A6 — which are untouched and still run at their recorded behavior — the forward application passes the source through unchanged, and the instrument names that as absoluteness rather than as a missing attenuation. What generation 4 adds is the alternative in which the strength is stated: A7 caps the delivery at 8, which is what the argmax's measured share justifies.
THE GROUND TRUTH CUTS BOTH WAYS, AND THAT IS THE FINDING WORTH CARRYING. Under B2 the model stores the full 65536-pair LPP, so the stored learned weights — 1s and 2s at this sample — are the delivery, and every B1 strategy has an exact fact to be compared against. At e64, delivering that truth recovers 0 or 1 of the 59 unrecorded positions and never converges (drive v025), while the stated 8 recovers 14: a 1-unit delivery drowns in a window where the stochastic add is the same size. At e10k the truth wins — v013 recovers 1392 of 5349, ahead of the capped 8's 1288. So the constant 8 is what the argmax's real share justifies at the sizes where the share is about half, and by e10k (share 0.290) the stored matrix already knows better than any constant. Measured in the generation 4 report; this page can only show the e64 end of it.
conv STILL MEASURES THE WRONG THING FOR B2 AT e64. v013 and v025 report conv = 64, the never-converged sentinel: with five clamped positions and 1-unit weights everywhere else, the argmax sequence keeps oscillating around the stochastic add. Generation 3's caveat on the conv column stands unchanged — a window that keeps flickering and a window that settled instantly can both defeat the measure, in opposite directions.

Where the support comes from

A4 and A5 — still drivable here as controls — need each pattern's own support: c1[x × 256 + argmax], a value in the 65536-byte learned count matrix that a B1 model does not carry. In generation 4 the matrix is on the page legitimately, because v013 and v025 are in the run set and both store it under B2. The builder compares the k=1 table and the token section of all four variants byte for byte, checks the two stored matrices are identical, and refuses to build otherwise — the same test the generation-2 page uses to refuse a borrowed LPP.

The reference support smax at this sample is still 2 (2 at e64, 6 at e1k, 9 at e10k), so A4 and A5 have three rates here; and which reading of smax should win remains open — generation 3's choice B, which the generation-4 goal marks as downstream of the k=1 strength question. It stays a control on this page rather than a constant.

THE k=1 GAP STILL BITES INSIDE A4 AND A5. Those alternatives are untouched by generation 4, so under them the same k=1 pattern still delivers at 255 and is rated at 0, 1 or 2 in the same time step — it arrives as an absolute rule and is charged a fall-off as though it had been seen once or not at all. 229 of the 256 entries of the support table are 0. A7 is the alternative in which the two numbers stop being different kinds of thing: the delivery is capped near the support scale, and the fall-off is a constant 1 rather than a support deficit. Open any forward application under A4 and the panel shows both numbers on the same line.
THE MODEL NAMES THE WRONG SUCCESSOR, AND LATD IS HOW YOU SEE IT. The k=1 pattern from m names e. Expand it: m occurs at positions 1, 12, 29, 44 and 61 of this sample, followed by e twice and l three times. The rule the model kept is the less frequent of the two, in the only data there is. The stored counts are c1[m][e] = 2 and c1[m][l] = 1: the log estimate inverted the order of a 3-count and a 2-count — the uncorrelated-error property LSA is designed around, seen from the data side. Unchanged from generation 3, because learning is unchanged. Open it: position 2, settled, or the pattern itself, with its concordance.

Standing facts, carried forward

THERE IS NO k=0 BACKGROUND. An unclamped position initialises to 256 zeros, and under B1 a byte with no predecessor sends no backward application at all rather than falling back to a base rate. The model file carries no byte-frequency section: the k=1 argmax table starts at offset 48, and a model built before 2026-08-06 is 256 bytes longer and is rejected by the builder on the size identity.
AXIS A CANNOT REACH THE RATE, AND THAT IS NOT A DEFECT OF THE AXIS. Under the D1 baseline the trace is decided by the causal pass and the decoder reconstructs causally, so settling never runs at decode time and nothing axis A does can move the compression. The axis is read off settling instead, which is what this page draws. settle_apps is within 1% between v002 and v024 either way: the pair's improvement is not bought with energy.
C2 STILL NEVER BINDS. The AND gate is byte-identical to the baseline at every sample that can be run, because the learned k=2 weights are 1 or 2 and the gate has nothing to bite on. Pruned as of generation 3; kept as a control.

Where these go on

Published under #viz_standard. Regenerated by docs/pprog/build-p8v2-gen4-e64 from docs/pprog/p8v2-gen4-e64-notes.tpl.html, never hand-edited.