``` ID: f-p8-forward Type: f THE FORWARD AXIS, generation 5 (#pprog_p8v2_gen5_goal_20260815). Digit 1, the baseline: what a k=1 application DELIVERS, carved out of #f-p8-cap8 so that delivery and decay vary separately. Until generation 4 these two were one axis, which is why generation 4 had to make "the pair" the unit and why #f-p8-deficit and #f-p8-period carried the k=1 strength gap inside themselves -- an alternative that changed the rate could not hold the delivery still. Splitting them is MJC's instruction opening this generation, and B is answered: the digit lives at model header byte 42. THE BASELINE, unchanged from #f-p8-cap8 and byte-for-byte the same rule: a k=1 application under B1 delivers min(8, w_s). Forward, fwd[table[a]] = min(8, wsrc); backward, each predecessor a of b gets min(8, lsa_sub(wsrc, ceil(log2 |preds|))), the subtraction saturating at 0. Forward and backward agree on w_p. Under B2 the stored weights are the delivery and this axis has no effect at all. The k=2 token applications are never on this axis: their strength is in the file. WHY 8 IS THE BASELINE AND NOT AN ARBITRARY CONSTANT: it is the weight that makes the argmax carry half the mass of an ES whose other 255 events sit at 0, and the argmax's measured share at its contexts expresses as 9 / 8 / 7 at e64 / e1k / e10k (tests/pprog/p8v2-k1-strength.py). THE ALTERNATIVES THIS AXIS EXISTS FOR are already measured as rows of the generation-4 grid and are NOT built in generation 5, which moves the decay axis only: pass-through (deliver w_s unchanged -- the honest name for the 255 that generation 4 extirpated, 255 being the identity of min), and attenuate (deliver lsa_sub(w_s, c) rather than a cap, which is the only form in which a strength of 1 can be applied at all -- min(1, w_s) puts the whole window in a 0-to-1 band where the stochastic add is noise and recovers 18 of 833). They are named here so the axis has somewhere to go. const: k1_strength = 8 ```