``` ID: f-p8-forward Type: f G1. A k=1 application 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. const: k1_strength = 8 HISTORY. Generation 5 (#pprog_p8v2_gen5_goal_20260815) carved this axis out of #f-p8-cap8 so that delivery and decay vary separately, on MJC's instruction opening the generation. Until generation 4 the 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. The rule above is #f-p8-cap8's, byte for byte. WHY. 8 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). LATER. 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. 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. ```