{
 "schema": "p8v2-axes/1",
 "generation": 5,
 "generations": [
  1,
  2,
  3,
  4
 ],
 "baseline": {
  "variant": "wordsv2-v002",
  "axes": "211111",
  "note": "Generation 2's baseline is generation 1's v002, and generation 3 runs off the same one. Every generation-2 and generation-3 variant differs from it on exactly one axis. Generation 4's baseline is wordsv2-v024, axes 711111: the f-p8-cap8 pair off the same vector; wordsv2-v025 varies axis B off it."
 },
 "sources": {
  "design": "tests/pprog/p8v2-words.md",
  "interpreter": "#pp_wordsv2",
  "models": "tests/pprog/models/p8v2/enwik9/<prefix>/<variant>.m",
  "dumps": [
   "tests/pprog/gen1-pos/",
   "tests/pprog/gen2-pos/",
   "tests/pprog/gen3-pos/",
   "tests/pprog/gen4-pos/"
  ],
  "tsv": [
   "tests/pprog/gen1.tsv",
   "tests/pprog/gen2.tsv",
   "tests/pprog/gen3.tsv",
   "tests/pprog/gen4.tsv"
  ],
  "replay": "tests/pprog/p8v2-replay.py",
  "emitter": "tests/pprog/p8v2-axes.py"
 },
 "rules": {
  "prose_is_lifted": "Every label and prose field below is the text of the alternative's OFRA block in p8v2-words.md. The block is normative; this file is a projection of it and never restates it.",
  "prose_is_the_definition": "prose is the block down to its first demotion marker and says what the alternative IS. notes is the same block below that marker -- history, why, later -- lifted just as literally and kept so nothing is lost. A surface renders prose. Rendering notes on a card puts a changelog and a roadmap in front of a reader who asked what the digit does (../props #coldread).",
  "examples_are_pulled": "Every worked example is computed from the retained models and dumps and carries the provenance that makes it checkable. None is an invented illustration.",
  "no_runs": "Emitting this file runs no compression. It is DISPLAYING work in the sense of #hutter_metrics."
 },
 "model_format": {
  "magic": "P8V2",
  "layout": "48-byte header + 256 k1 argmax table + BWD backward LPP + TB token + G gap + SC trace",
  "k0_removed": "The 256-byte k=0 background that sat at offset 48 was removed on 2026-08-06. Every offset past the header moved down 256 and every model built before that date is stale; the size identity rejects it."
 },
 "axes": [
  {
   "letter": "A",
   "name": "the settling update",
   "header_slot": "f",
   "header_byte": null,
   "question": "what does a position DO with the pattern applications that reach it: keep only the longest context that fired, accumulate them against a decay, or accumulate them and renormalise to a constant sum?",
   "watch": "settled_ok and conv, in the TSV and the .pos dumps. Under D1 axis A moves what settling produces at every position without moving the trace, so a rate that does not move is not evidence that the axis does nothing.",
   "baseline_alternative": "f-p8-add",
   "alternatives": [
    {
     "id": "f-p8-assign",
     "digit": 1,
     "type": "f",
     "label": "ASSIGNMENT: the longest k that fires wins outright, and nothing accumulates.",
     "prose": "A1. ASSIGNMENT: the longest k that fires wins outright, and nothing accumulates.\n\nIf a k=2 token application reaches this position, the position's new state IS what that application\ndelivered; otherwise it is the elementwise LSA maximum of the forward and backward k=1 applications;\nif neither fires, 256 zeros.\n\nNothing accumulates. A position's state is whatever one application said last, and the forward,\nbackward and token evidence never combine. There are no rates in it at all, which makes it the\nsimplest rule on the axis and the control that shows what accumulation buys.\n\nIt is also the one alternative on this axis whose settling draws no entropy, so it can be\nconformance-checked against a reimplementation position by position, which is what makes it drivable\nin a viewer.\n\nPRUNED, and kept runnable because #wordsv2-v001 is a real run whose numbers are on the record.",
     "notes": {
      "history": "Generation 1's baseline. PRUNED generation 1 (#pprog_p8v2_gen1_choices: \"A1 is wrong; goes away\"),\nbecause assignment discards every application but the longest that fires, so nothing accumulates and\nthe axis has nowhere to go. No generation-2 variant names it and the generation-2 baseline is\n#wordsv2-v002. Generation 3 (#p8v2_gen3) confirms the prune and adds the use above: \"A1 was already\npruned, but it's still interesting as a use case for visualization.\"\n\nThe \"if neither fires\" arm read \"the k=0 background\" until 2026-08-06; see the Axis A shell above.",
      "why": "#f-p8 shows assignment is correct when the antecedent is absolute, and notes that k=2 is a subset of\nk=1 -- they are fully correlated -- so it is correct there too."
     },
     "is_baseline": false,
     "pruned": true,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "f-p8-add",
     "digit": 2,
     "type": "f",
     "label": "LSA ADDITION against DECAY: the position's state accumulates every pattern application that reaches it (LSA addition, per entry), and then decays.",
     "prose": "A2. LSA ADDITION against DECAY: the position's state accumulates every pattern application that\nreaches it (LSA addition, per entry), and then decays.\n\nOne time step is one application of each pattern, and decays every unclamped entry by 2 LSA units,\nfloored at 0. This is the general case #f-p8 declines to rule on, and the one settling actually runs\nin.\nconst: falloff = 2",
     "notes": {
      "history": "The 2 came from the constant-sum argument in #f-p8: if each atomic pattern is applied at rate f, then\nthe sum at a cell is copied to the cells left and right of it at rate f each, so the fall-off must be\n2f for the total to be invariant.\n\nTHAT ARGUMENT WAS WITHDRAWN BY MJC IN GENERATION 3, and the alternative is kept as the generation-2\nbaseline and control rather than being corrected in place. #p8v2_gen3, answering choice A: \"There is\nno constant sum ever in an ES. The only thing constant is total probability = 1 and that is after\nsoftmax. In an ES we are only ever talking about log support values, which don't have a constant\nsum.\" And on this implementation: \"The implementation of A2 interpreted this as 'subtracting 2' from\nevery event, which is not what we meant, but it's something.\" So the rule stands as built and as\nmeasured; what falls is its derivation.",
      "later": "The replacement direction is a rate set by each pattern's own support -- see #f-p8's \"What is open\"\nand the generation-3 alternatives on this axis."
     },
     "is_baseline": true,
     "pruned": false,
     "constants": {
      "falloff": 2
     },
     "worked_examples": null
    },
    {
     "id": "f-p8-renorm",
     "digit": 3,
     "type": "f",
     "label": "LSA addition with NO decay, renormalized per position to constant sum.",
     "prose": "A3. LSA addition with NO decay, renormalized per position to constant sum.\n\nSame accumulation as #f-p8-add, but instead of a decay rate the invariant is imposed directly: after\neach time step every unclamped position's LSA sum is brought back to 255, the sum a clamped position\ncarries, by subtracting the excess from every entry.\n\nAgainst #f-p8-add it separates two things that alternative confounds: whether the constant-sum\ninvariant is doing the work, or the rate at which it is approached is.\n\nPRUNED, and kept runnable because #wordsv2-v003 is on the record.",
     "notes": {
      "history": "PRUNED generation 3 (#p8v2_gen3: \"A3 was not anything that I wanted, although I may have mentioned\nsomething about renormalization, but it wasn't this\"; the prune confirmed on generation 3's choice\nE). The invariant it imposes is the one the same answer rules out: an ES of log support values has\nno constant sum.",
      "why": "Generation 2 measured it as free on the rate and half the time steps to converge, so the control\nstill shows what imposing the invariant directly costs, against a fall-off that only approaches it."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": {
      "title": "A3 renormalisation and A2 decay at the same position and sweep",
      "formula": "accumulate every application that fired with lsa_add, application-outer and entry-inner; then s = lsa_sum256(entries) folded with lsa_add from index 0 upward WITHOUT saturating at 255; if s > 255 subtract min(s - 255, 255) from every entry with lsa_sub, which saturates at 0. A2 instead subtracts the fixed 2.",
      "position": 37,
      "sweep": 2,
      "A3": {
       "before": {
        "full": {
         "0": 1,
         "1": 1,
         "2": 1,
         "3": 1,
         "4": 1,
         "5": 2,
         "6": 2,
         "7": 1,
         "8": 1,
         "9": 1,
         "10": 1,
         "11": 2,
         "12": 2,
         "13": 1,
         "14": 1,
         "15": 2,
         "16": 1,
         "17": 2,
         "18": 1,
         "19": 2,
         "20": 2,
         "21": 2,
         "22": 2,
         "23": 1,
         "24": 1,
         "25": 2,
         "26": 1,
         "27": 1,
         "28": 1,
         "29": 2,
         "30": 1,
         "31": 1,
         "32": 2,
         "33": 1,
         "34": 2,
         "35": 1,
         "36": 2,
         "37": 2,
         "38": 2,
         "39": 1,
         "40": 2,
         "41": 2,
         "42": 1,
         "43": 2,
         "44": 2,
         "45": 2,
         "46": 2,
         "47": 2,
         "48": 254,
         "49": 1,
         "50": 2,
         "51": 2,
         "52": 1,
         "53": 1,
         "54": 1,
         "55": 2,
         "56": 2,
         "57": 1,
         "58": 1,
         "59": 2,
         "60": 2,
         "61": 1,
         "62": 2,
         "63": 2,
         "64": 2,
         "65": 1,
         "66": 1,
         "67": 2,
         "68": 2,
         "69": 1,
         "70": 2,
         "71": 2,
         "72": 2,
         "73": 2,
         "74": 2,
         "75": 2,
         "76": 2,
         "77": 1,
         "78": 2,
         "79": 2,
         "80": 1,
         "81": 2,
         "82": 2,
         "83": 2,
         "84": 1,
         "85": 1,
         "86": 2,
         "87": 2,
         "88": 2,
         "89": 1,
         "90": 2,
         "91": 1,
         "92": 2,
         "93": 2,
         "94": 2,
         "95": 2,
         "96": 2,
         "97": 2,
         "98": 2,
         "99": 2,
         "100": 1,
         "101": 1,
         "102": 2,
         "103": 1,
         "104": 2,
         "105": 1,
         "106": 1,
         "107": 2,
         "108": 2,
         "109": 2,
         "110": 1,
         "111": 2,
         "112": 2,
         "113": 2,
         "114": 2,
         "115": 2,
         "116": 2,
         "117": 2,
         "118": 1,
         "119": 254,
         "120": 1,
         "121": 1,
         "122": 2,
         "123": 2,
         "124": 1,
         "125": 1,
         "126": 1,
         "127": 2,
         "128": 2,
         "129": 2,
         "130": 1,
         "131": 2,
         "132": 2,
         "133": 1,
         "134": 1,
         "135": 1,
         "136": 1,
         "137": 2,
         "138": 2,
         "139": 1,
         "140": 2,
         "141": 1,
         "142": 2,
         "143": 1,
         "144": 2,
         "145": 2,
         "146": 2,
         "147": 1,
         "148": 2,
         "149": 2,
         "150": 1,
         "151": 2,
         "152": 2,
         "153": 2,
         "154": 2,
         "155": 2,
         "156": 2,
         "157": 2,
         "158": 1,
         "159": 2,
         "160": 1,
         "161": 2,
         "162": 1,
         "163": 1,
         "164": 1,
         "165": 2,
         "166": 2,
         "167": 1,
         "168": 2,
         "169": 2,
         "170": 2,
         "171": 1,
         "172": 2,
         "173": 2,
         "174": 1,
         "175": 2,
         "176": 1,
         "177": 2,
         "178": 2,
         "179": 2,
         "180": 1,
         "181": 2,
         "182": 2,
         "183": 2,
         "184": 1,
         "185": 2,
         "186": 2,
         "187": 1,
         "188": 2,
         "189": 2,
         "190": 2,
         "191": 1,
         "192": 1,
         "193": 1,
         "194": 2,
         "195": 1,
         "196": 2,
         "197": 2,
         "198": 1,
         "199": 2,
         "200": 2,
         "201": 2,
         "202": 2,
         "203": 2,
         "204": 2,
         "205": 2,
         "206": 2,
         "207": 2,
         "208": 2,
         "209": 2,
         "210": 2,
         "211": 2,
         "212": 1,
         "213": 1,
         "214": 1,
         "215": 2,
         "216": 1,
         "217": 1,
         "218": 2,
         "219": 2,
         "220": 2,
         "221": 2,
         "222": 2,
         "223": 2,
         "224": 2,
         "225": 2,
         "226": 1,
         "227": 1,
         "228": 2,
         "229": 2,
         "230": 1,
         "231": 2,
         "232": 2,
         "233": 1,
         "234": 2,
         "235": 2,
         "236": 1,
         "237": 2,
         "238": 1,
         "239": 2,
         "240": 2,
         "241": 1,
         "242": 1,
         "243": 1,
         "244": 1,
         "245": 2,
         "246": 2,
         "247": 1,
         "248": 2,
         "249": 2,
         "250": 2,
         "251": 1,
         "252": 1,
         "253": 2,
         "254": 2,
         "255": 1
        },
        "nonzero": 256,
        "top": [
         {
          "byte": 48,
          "shown_as": "\"0\"",
          "weight": 254
         },
         {
          "byte": 119,
          "shown_as": "\"w\"",
          "weight": 254
         },
         {
          "byte": 5,
          "shown_as": "0x05",
          "weight": 2
         },
         {
          "byte": 6,
          "shown_as": "0x06",
          "weight": 2
         },
         {
          "byte": 11,
          "shown_as": "0x0B",
          "weight": 2
         },
         {
          "byte": 12,
          "shown_as": "0x0C",
          "weight": 2
         },
         {
          "byte": 15,
          "shown_as": "0x0F",
          "weight": 2
         },
         {
          "byte": 17,
          "shown_as": "0x11",
          "weight": 2
         }
        ],
        "histogram_weight_to_count": {
         "254": 2,
         "2": 156,
         "1": 98
        }
       },
       "applications": {
        "fwd": {
         "source_byte": 1,
         "source_weight": 2
        },
        "bwd": {
         "source_byte": 46,
         "source_weight": 255,
         "predecessors": [
          48,
          119
         ],
         "cost": 1
        },
        "tok": {
         "ctx": 1,
         "a": 0,
         "wa": 2,
         "b": 1,
         "wb": 2,
         "present": false,
         "fired": false
        }
       },
       "accumulated": {
        "full": {
         "0": 2,
         "1": 2,
         "2": 1,
         "3": 2,
         "4": 2,
         "5": 3,
         "6": 2,
         "7": 1,
         "8": 2,
         "9": 2,
         "10": 2,
         "11": 2,
         "12": 3,
         "13": 2,
         "14": 1,
         "15": 3,
         "16": 2,
         "17": 2,
         "18": 2,
         "19": 4,
         "20": 2,
         "21": 3,
         "22": 2,
         "23": 2,
         "24": 2,
         "25": 3,
         "26": 1,
         "27": 2,
         "28": 2,
         "29": 2,
         "30": 2,
         "31": 1,
         "32": 3,
         "33": 2,
         "34": 2,
         "35": 2,
         "36": 2,
         "37": 2,
         "38": 2,
         "39": 2,
         "40": 3,
         "41": 3,
         "42": 3,
         "43": 4,
         "44": 2,
         "45": 3,
         "46": 2,
         "47": 3,
         "48": 255,
         "49": 3,
         "50": 3,
         "51": 3,
         "52": 1,
         "53": 2,
         "54": 2,
         "55": 3,
         "56": 3,
         "57": 1,
         "58": 2,
         "59": 2,
         "60": 2,
         "61": 2,
         "62": 4,
         "63": 4,
         "64": 3,
         "65": 1,
         "66": 3,
         "67": 2,
         "68": 2,
         "69": 3,
         "70": 3,
         "71": 2,
         "72": 2,
         "73": 2,
         "74": 3,
         "75": 2,
         "76": 2,
         "77": 3,
         "78": 2,
         "79": 2,
         "80": 2,
         "81": 2,
         "82": 3,
         "83": 2,
         "84": 1,
         "85": 2,
         "86": 2,
         "87": 2,
         "88": 2,
         "89": 1,
         "90": 3,
         "91": 2,
         "92": 2,
         "93": 3,
         "94": 2,
         "95": 2,
         "96": 2,
         "97": 3,
         "98": 3,
         "99": 2,
         "100": 2,
         "101": 1,
         "102": 2,
         "103": 2,
         "104": 3,
         "105": 1,
         "106": 1,
         "107": 2,
         "108": 3,
         "109": 2,
         "110": 1,
         "111": 2,
         "112": 3,
         "113": 2,
         "114": 2,
         "115": 2,
         "116": 3,
         "117": 2,
         "118": 2,
         "119": 255,
         "120": 3,
         "121": 2,
         "122": 2,
         "123": 2,
         "124": 2,
         "125": 2,
         "126": 1,
         "127": 3,
         "128": 2,
         "129": 3,
         "130": 2,
         "131": 3,
         "132": 2,
         "133": 3,
         "134": 2,
         "135": 2,
         "136": 1,
         "137": 4,
         "138": 2,
         "139": 3,
         "140": 3,
         "141": 3,
         "142": 2,
         "143": 2,
         "144": 3,
         "145": 2,
         "146": 4,
         "147": 1,
         "148": 2,
         "149": 2,
         "150": 1,
         "151": 3,
         "152": 2,
         "153": 3,
         "154": 3,
         "155": 2,
         "156": 3,
         "157": 3,
         "158": 2,
         "159": 3,
         "160": 2,
         "161": 2,
         "162": 2,
         "163": 2,
         "164": 2,
         "165": 2,
         "166": 2,
         "167": 2,
         "168": 2,
         "169": 4,
         "170": 2,
         "171": 1,
         "172": 2,
         "173": 2,
         "174": 2,
         "175": 3,
         "176": 1,
         "177": 3,
         "178": 2,
         "179": 2,
         "180": 1,
         "181": 2,
         "182": 2,
         "183": 3,
         "184": 2,
         "185": 4,
         "186": 3,
         "187": 2,
         "188": 2,
         "189": 2,
         "190": 2,
         "191": 2,
         "192": 2,
         "193": 2,
         "194": 3,
         "195": 2,
         "196": 3,
         "197": 3,
         "198": 2,
         "199": 3,
         "200": 2,
         "201": 2,
         "202": 3,
         "203": 3,
         "204": 3,
         "205": 3,
         "206": 2,
         "207": 2,
         "208": 2,
         "209": 3,
         "210": 2,
         "211": 2,
         "212": 2,
         "213": 2,
         "214": 2,
         "215": 3,
         "216": 1,
         "217": 2,
         "218": 3,
         "219": 2,
         "220": 2,
         "221": 2,
         "222": 3,
         "223": 3,
         "224": 2,
         "225": 3,
         "226": 2,
         "227": 2,
         "228": 2,
         "229": 2,
         "230": 2,
         "231": 3,
         "232": 3,
         "233": 2,
         "234": 2,
         "235": 3,
         "236": 2,
         "237": 2,
         "238": 1,
         "239": 2,
         "240": 3,
         "241": 1,
         "242": 1,
         "243": 2,
         "244": 2,
         "245": 3,
         "246": 2,
         "247": 2,
         "248": 2,
         "249": 3,
         "250": 3,
         "251": 2,
         "252": 2,
         "253": 3,
         "254": 2,
         "255": 2
        },
        "nonzero": 256,
        "top": [
         {
          "byte": 48,
          "shown_as": "\"0\"",
          "weight": 255
         },
         {
          "byte": 119,
          "shown_as": "\"w\"",
          "weight": 255
         },
         {
          "byte": 19,
          "shown_as": "0x13",
          "weight": 4
         },
         {
          "byte": 43,
          "shown_as": "\"+\"",
          "weight": 4
         },
         {
          "byte": 62,
          "shown_as": "\">\"",
          "weight": 4
         },
         {
          "byte": 63,
          "shown_as": "\"?\"",
          "weight": 4
         },
         {
          "byte": 137,
          "shown_as": "0x89",
          "weight": 4
         },
         {
          "byte": 146,
          "shown_as": "0x92",
          "weight": 4
         }
        ],
        "histogram_weight_to_count": {
         "255": 2,
         "4": 8,
         "3": 72,
         "2": 149,
         "1": 25
        }
       },
       "lsa_sum256": 256,
       "excess": 1,
       "after": {
        "full": {
         "0": 1,
         "1": 1,
         "3": 1,
         "4": 1,
         "5": 2,
         "6": 1,
         "8": 1,
         "9": 1,
         "10": 1,
         "11": 1,
         "12": 2,
         "13": 1,
         "15": 2,
         "16": 1,
         "17": 1,
         "18": 1,
         "19": 3,
         "20": 1,
         "21": 2,
         "22": 1,
         "23": 1,
         "24": 1,
         "25": 2,
         "27": 1,
         "28": 1,
         "29": 1,
         "30": 1,
         "32": 2,
         "33": 1,
         "34": 1,
         "35": 1,
         "36": 1,
         "37": 1,
         "38": 1,
         "39": 1,
         "40": 2,
         "41": 2,
         "42": 2,
         "43": 3,
         "44": 1,
         "45": 2,
         "46": 1,
         "47": 2,
         "48": 254,
         "49": 2,
         "50": 2,
         "51": 2,
         "53": 1,
         "54": 1,
         "55": 2,
         "56": 2,
         "58": 1,
         "59": 1,
         "60": 1,
         "61": 1,
         "62": 3,
         "63": 3,
         "64": 2,
         "66": 2,
         "67": 1,
         "68": 1,
         "69": 2,
         "70": 2,
         "71": 1,
         "72": 1,
         "73": 1,
         "74": 2,
         "75": 1,
         "76": 1,
         "77": 2,
         "78": 1,
         "79": 1,
         "80": 1,
         "81": 1,
         "82": 2,
         "83": 1,
         "85": 1,
         "86": 1,
         "87": 1,
         "88": 1,
         "90": 2,
         "91": 1,
         "92": 1,
         "93": 2,
         "94": 1,
         "95": 1,
         "96": 1,
         "97": 2,
         "98": 2,
         "99": 1,
         "100": 1,
         "102": 1,
         "103": 1,
         "104": 2,
         "107": 1,
         "108": 2,
         "109": 1,
         "111": 1,
         "112": 2,
         "113": 1,
         "114": 1,
         "115": 1,
         "116": 2,
         "117": 1,
         "118": 1,
         "119": 254,
         "120": 2,
         "121": 1,
         "122": 1,
         "123": 1,
         "124": 1,
         "125": 1,
         "127": 2,
         "128": 1,
         "129": 2,
         "130": 1,
         "131": 2,
         "132": 1,
         "133": 2,
         "134": 1,
         "135": 1,
         "137": 3,
         "138": 1,
         "139": 2,
         "140": 2,
         "141": 2,
         "142": 1,
         "143": 1,
         "144": 2,
         "145": 1,
         "146": 3,
         "148": 1,
         "149": 1,
         "151": 2,
         "152": 1,
         "153": 2,
         "154": 2,
         "155": 1,
         "156": 2,
         "157": 2,
         "158": 1,
         "159": 2,
         "160": 1,
         "161": 1,
         "162": 1,
         "163": 1,
         "164": 1,
         "165": 1,
         "166": 1,
         "167": 1,
         "168": 1,
         "169": 3,
         "170": 1,
         "172": 1,
         "173": 1,
         "174": 1,
         "175": 2,
         "177": 2,
         "178": 1,
         "179": 1,
         "181": 1,
         "182": 1,
         "183": 2,
         "184": 1,
         "185": 3,
         "186": 2,
         "187": 1,
         "188": 1,
         "189": 1,
         "190": 1,
         "191": 1,
         "192": 1,
         "193": 1,
         "194": 2,
         "195": 1,
         "196": 2,
         "197": 2,
         "198": 1,
         "199": 2,
         "200": 1,
         "201": 1,
         "202": 2,
         "203": 2,
         "204": 2,
         "205": 2,
         "206": 1,
         "207": 1,
         "208": 1,
         "209": 2,
         "210": 1,
         "211": 1,
         "212": 1,
         "213": 1,
         "214": 1,
         "215": 2,
         "217": 1,
         "218": 2,
         "219": 1,
         "220": 1,
         "221": 1,
         "222": 2,
         "223": 2,
         "224": 1,
         "225": 2,
         "226": 1,
         "227": 1,
         "228": 1,
         "229": 1,
         "230": 1,
         "231": 2,
         "232": 2,
         "233": 1,
         "234": 1,
         "235": 2,
         "236": 1,
         "237": 1,
         "239": 1,
         "240": 2,
         "243": 1,
         "244": 1,
         "245": 2,
         "246": 1,
         "247": 1,
         "248": 1,
         "249": 2,
         "250": 2,
         "251": 1,
         "252": 1,
         "253": 2,
         "254": 1,
         "255": 1
        },
        "nonzero": 231,
        "top": [
         {
          "byte": 48,
          "shown_as": "\"0\"",
          "weight": 254
         },
         {
          "byte": 119,
          "shown_as": "\"w\"",
          "weight": 254
         },
         {
          "byte": 19,
          "shown_as": "0x13",
          "weight": 3
         },
         {
          "byte": 43,
          "shown_as": "\"+\"",
          "weight": 3
         },
         {
          "byte": 62,
          "shown_as": "\">\"",
          "weight": 3
         },
         {
          "byte": 63,
          "shown_as": "\"?\"",
          "weight": 3
         },
         {
          "byte": 137,
          "shown_as": "0x89",
          "weight": 3
         },
         {
          "byte": 146,
          "shown_as": "0x92",
          "weight": 3
         }
        ],
        "histogram_weight_to_count": {
         "254": 2,
         "3": 8,
         "2": 72,
         "1": 149
        }
       },
       "provenance": {
        "variant": "wordsv2-v003",
        "sample": "e64",
        "sample_bytes": 64,
        "dataset": "enwik9",
        "model": "tests/pprog/models/p8v2/enwik9/64/wordsv2-v003.m",
        "computed_by": "tests/pprog/p8v2-replay.py",
        "replay_verified": true,
        "replay_checks": {
         "k1_table": true,
         "token_section": true,
         "trace_count": true,
         "pos_dump": true
        },
        "pos_dump": "tests/pprog/gen2-pos/wordsv2-v003.e64.pos",
        "position": 37,
        "sweep": 2
       }
      },
      "A2": {
       "before": {
        "full": {
         "48": 252,
         "119": 252
        },
        "nonzero": 2,
        "top": [
         {
          "byte": 48,
          "shown_as": "\"0\"",
          "weight": 252
         },
         {
          "byte": 119,
          "shown_as": "\"w\"",
          "weight": 252
         }
        ],
        "histogram_weight_to_count": {
         "252": 2
        }
       },
       "applications": {
        "fwd": {
         "source_byte": 0,
         "source_weight": 0
        },
        "bwd": {
         "source_byte": 46,
         "source_weight": 255,
         "predecessors": [
          48,
          119
         ],
         "cost": 1
        },
        "tok": {
         "ctx": 0,
         "a": 0,
         "wa": 0,
         "b": 0,
         "wb": 0,
         "present": false,
         "fired": false
        }
       },
       "accumulated": {
        "full": {
         "0": 1,
         "1": 1,
         "2": 2,
         "3": 1,
         "4": 2,
         "5": 2,
         "6": 2,
         "7": 2,
         "8": 1,
         "9": 1,
         "10": 1,
         "11": 2,
         "12": 1,
         "13": 2,
         "14": 1,
         "15": 2,
         "16": 2,
         "17": 1,
         "18": 1,
         "19": 1,
         "20": 1,
         "21": 2,
         "22": 2,
         "23": 2,
         "24": 2,
         "25": 2,
         "26": 1,
         "27": 2,
         "28": 2,
         "29": 2,
         "30": 2,
         "31": 2,
         "32": 1,
         "33": 1,
         "34": 2,
         "35": 2,
         "36": 1,
         "37": 2,
         "38": 1,
         "39": 1,
         "40": 2,
         "41": 1,
         "42": 2,
         "43": 2,
         "44": 1,
         "45": 1,
         "46": 2,
         "47": 1,
         "48": 254,
         "49": 1,
         "50": 2,
         "51": 1,
         "52": 1,
         "53": 2,
         "54": 1,
         "55": 2,
         "56": 2,
         "57": 1,
         "58": 2,
         "59": 2,
         "60": 1,
         "61": 2,
         "62": 1,
         "63": 2,
         "64": 1,
         "65": 2,
         "66": 2,
         "67": 1,
         "68": 1,
         "69": 2,
         "70": 1,
         "71": 1,
         "72": 2,
         "73": 2,
         "74": 2,
         "75": 2,
         "76": 1,
         "77": 2,
         "78": 2,
         "79": 1,
         "80": 1,
         "81": 1,
         "82": 1,
         "83": 2,
         "84": 2,
         "85": 1,
         "86": 2,
         "87": 1,
         "88": 2,
         "89": 1,
         "90": 2,
         "91": 2,
         "92": 2,
         "93": 1,
         "94": 2,
         "95": 1,
         "96": 2,
         "97": 1,
         "98": 2,
         "99": 2,
         "100": 1,
         "101": 2,
         "102": 2,
         "103": 2,
         "104": 2,
         "105": 2,
         "106": 2,
         "107": 2,
         "108": 2,
         "109": 2,
         "110": 2,
         "111": 1,
         "112": 1,
         "113": 2,
         "114": 1,
         "115": 1,
         "116": 1,
         "117": 2,
         "118": 2,
         "119": 254,
         "120": 1,
         "121": 2,
         "122": 1,
         "123": 2,
         "124": 2,
         "125": 2,
         "126": 1,
         "127": 1,
         "128": 2,
         "129": 2,
         "130": 1,
         "131": 1,
         "132": 2,
         "133": 2,
         "134": 2,
         "135": 1,
         "136": 1,
         "137": 1,
         "138": 1,
         "139": 2,
         "140": 2,
         "141": 2,
         "142": 2,
         "143": 1,
         "144": 1,
         "145": 2,
         "146": 2,
         "147": 2,
         "148": 1,
         "149": 2,
         "150": 1,
         "151": 1,
         "152": 1,
         "153": 1,
         "154": 1,
         "155": 2,
         "156": 2,
         "157": 1,
         "158": 2,
         "159": 2,
         "160": 1,
         "161": 2,
         "162": 2,
         "163": 2,
         "164": 1,
         "165": 2,
         "166": 2,
         "167": 2,
         "168": 2,
         "169": 2,
         "170": 1,
         "171": 1,
         "172": 1,
         "173": 2,
         "174": 2,
         "175": 1,
         "176": 2,
         "177": 2,
         "178": 1,
         "179": 2,
         "180": 1,
         "181": 2,
         "182": 2,
         "183": 2,
         "184": 2,
         "185": 2,
         "186": 1,
         "187": 2,
         "188": 1,
         "189": 1,
         "190": 2,
         "191": 2,
         "192": 2,
         "193": 2,
         "194": 2,
         "195": 1,
         "196": 1,
         "197": 1,
         "198": 2,
         "199": 2,
         "200": 1,
         "201": 1,
         "202": 1,
         "203": 1,
         "204": 2,
         "205": 1,
         "206": 2,
         "207": 2,
         "208": 1,
         "209": 2,
         "210": 2,
         "211": 2,
         "212": 1,
         "213": 1,
         "214": 1,
         "215": 2,
         "216": 2,
         "217": 2,
         "218": 2,
         "219": 1,
         "220": 2,
         "221": 2,
         "222": 1,
         "223": 1,
         "224": 1,
         "225": 1,
         "226": 2,
         "227": 1,
         "228": 1,
         "229": 2,
         "230": 1,
         "231": 1,
         "232": 1,
         "233": 1,
         "234": 1,
         "235": 1,
         "236": 2,
         "237": 1,
         "238": 1,
         "239": 2,
         "240": 1,
         "241": 1,
         "242": 1,
         "243": 1,
         "244": 2,
         "245": 2,
         "246": 2,
         "247": 2,
         "248": 2,
         "249": 1,
         "250": 1,
         "251": 2,
         "252": 2,
         "253": 1,
         "254": 2,
         "255": 2
        },
        "nonzero": 256,
        "top": [
         {
          "byte": 48,
          "shown_as": "\"0\"",
          "weight": 254
         },
         {
          "byte": 119,
          "shown_as": "\"w\"",
          "weight": 254
         },
         {
          "byte": 2,
          "shown_as": "0x02",
          "weight": 2
         },
         {
          "byte": 4,
          "shown_as": "0x04",
          "weight": 2
         },
         {
          "byte": 5,
          "shown_as": "0x05",
          "weight": 2
         },
         {
          "byte": 6,
          "shown_as": "0x06",
          "weight": 2
         },
         {
          "byte": 7,
          "shown_as": "0x07",
          "weight": 2
         },
         {
          "byte": 11,
          "shown_as": "0x0B",
          "weight": 2
         }
        ],
        "histogram_weight_to_count": {
         "254": 2,
         "2": 139,
         "1": 115
        }
       },
       "decay": 2,
       "after": {
        "full": {
         "48": 252,
         "119": 252
        },
        "nonzero": 2,
        "top": [
         {
          "byte": 48,
          "shown_as": "\"0\"",
          "weight": 252
         },
         {
          "byte": 119,
          "shown_as": "\"w\"",
          "weight": 252
         }
        ],
        "histogram_weight_to_count": {
         "252": 2
        }
       },
       "provenance": {
        "variant": "wordsv2-v002",
        "sample": "e64",
        "sample_bytes": 64,
        "dataset": "enwik9",
        "model": "tests/pprog/models/p8v2/enwik9/64/wordsv2-v002.m",
        "computed_by": "tests/pprog/p8v2-replay.py",
        "replay_verified": true,
        "replay_checks": {
         "k1_table": true,
         "token_section": true,
         "trace_count": true,
         "pos_dump": true
        },
        "pos_dump": "tests/pprog/gen4-pos/wordsv2-v002.e64.pos",
        "position": 37,
        "sweep": 2
       }
      },
      "reading": "A3 imposes the constant-sum invariant directly and A2 approaches it at a fixed rate; this is the shortest statement of the axis's own question. Both draw from the shared entropy stream, so these are the runs' own numbers and not a recomputation."
     }
    },
    {
     "id": "f-p8-deficit",
     "digit": 4,
     "type": "f",
     "label": "The decay is not a constant: a position decays by the SUPPORT DEFICIT of the strongest evidence that reached it.",
     "prose": "A4. The decay is not a constant: a position decays by the SUPPORT DEFICIT of the strongest evidence\nthat reached it.\n\nSame accumulation as #f-p8-add, and then that decay: Let s be the largest support among\nthe applications that fired here this time step, and let the reference support be smax; the position\ndecays by smax - s, floored at 0.\n\nIn LSA a rate of one in 2^d is a subtraction of d, so a fall-off written as a subtraction IS a rate,\nand this one is set by the pattern: evidence as well supported as the best-supported pattern in the\nmodel does not decay at all, and evidence seen half as often loses one LSA unit per time step. The\ntwo ends #p8v2_gen3 names fall out -- an absolute rule from an absolute event persists, and a\npattern that has seen every possibility once fades immediately.\n\nDeterministic: it draws no entropy of its own, so unlike A2 and A3 it can be reproduced by a\nreimplementation without replaying the stream, which is what makes it drivable in the viewer.\n\nAS BUILT, and these are the numbers the runs used rather than what should win. smax is the largest\nlearned weight over the k=1 argmax pairs and over the kept k=2 rules, floored at 1: 2 at e64, 6 at\ne1k, 9 at e10k. A pattern's own support s_p is the LEARNED weight -- for k=1 it is\nc1[a*256 + table[a]] and for k=2 it is the rule's stored weight -- so a k=1 pattern here\nsimultaneously DELIVERS at the absolute 255 and has a rate set by a support of 0, 1 or 2. That is the\nk=1 strength gap of #f-p8 appearing inside this alternative, not beside it. At e64, 229 of the 256\nsup1 entries are 0, a byte never seen as a predecessor.\n\nSupport is read from the learned tables, which under B1 are in memory but NOT in the model file; see\nthe k=1 strength section of #f-p8. Under the D1 baseline settling never runs at decode time, so this\nalternative is measurable as it stands.",
     "notes": {
      "history": "Generation 3, and the first of the three alternatives built for MJC's answer a5 -- \"each pattern\nfires at a rate set by its own support\". A2 set the rate to the constant 2 because there are two\nneighbours and the sum had to be invariant, and that argument is withdrawn (#f-p8).",
      "why": "The reference support smax is a sub-parameter, not a decision this block makes: built as the largest\nsupport present in the model, because the other obvious choice -- 255, the absolute -- makes the\ndeficit 253 or 254 at these sample sizes and annihilates everything, which is exactly the failure\nrecorded against w_p - (255 - w_s) in #f-p8.",
      "later": "Generation 3's choices ask which the reference support should be. Combining this alternative with D2\nor D3 would need the support serialized."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "f-p8-period",
     "digit": 5,
     "type": "f",
     "label": "The rate is a schedule rather than an attenuation, and there is no decay at all.",
     "prose": "A5. The rate is a schedule rather than an attenuation, and there is no decay at all. A pattern of\nsupport s is applied only on the time steps where the step number is a multiple of 2^(smax - s), so\nthe best-supported pattern in the model is applied on every step, one at half that support on every\nsecond step, and so on. What an application delivers is unchanged; how often it happens is the axis.\n\nA window runs W time steps, so A PATTERN WHOSE PERIOD EXCEEDS W NEVER FIRES INSIDE A WINDOW at all,\nand that is not hypothetical: the period is 2^(smax - s_p) and W is 128, so at e64 the periods are 1,\n2 or 4 and everything fires; at e1k they reach 64; at e10k they reach 512 and a support-0 pattern\nnever fires inside a window, which at that sample is 169 of the 256 bytes.\n\nThe fall-off is implicit: nothing is subtracted, and a position's state stops growing simply because\nthe patterns feeding it are applied less often.\n\nAS BUILT IT ALSO BUYS NOTHING. The three vectors are computed, and settle_apps counted, BEFORE the\nperiod decides whether to apply them, so a skipped application costs what a taken one costs. #f-p8's\nderivation says applying a pattern always costs energy, which is the whole reason a rate is a rate;\nan implementation that meant it would decide before computing. Recorded rather than fixed, because\nchanging it changes what was measured.\n\nAS BUILT, and these are the numbers the runs used rather than what should win. smax is the largest\nlearned weight over the k=1 argmax pairs and over the kept k=2 rules, floored at 1: 2 at e64, 6 at\ne1k, 9 at e10k. A pattern's own support s_p is the LEARNED weight -- for k=1 it is\nc1[a*256 + table[a]] and for k=2 it is the rule's stored weight -- so a k=1 pattern here\nsimultaneously DELIVERS at the absolute 255 and has a rate set by a support of 0, 1 or 2. That is the\nk=1 strength gap of #f-p8 appearing inside this alternative, not beside it. At e64, 229 of the 256\nsup1 entries are 0, a byte never seen as a predecessor.\n\nDeterministic, for the same reason as #f-p8-deficit, and with the same note about where support comes\nfrom and about the reference support smax.",
     "notes": {
      "history": "Generation 3, the literal reading of \"each pattern fires at a rate set by its own support\".",
      "why": "This is the alternative that takes the word \"rate\" at face value. Whether never firing is the right\nbehaviour for weak evidence or a defect is the sort of thing the generation exists to look at rather\nthan to argue about.",
      "later": "If a constant-sum-like behaviour is wanted, this is where it would have to come from, and it would\ncome from the rates rather than from an invariant imposed after the fact."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "f-p8-indegree",
     "digit": 6,
     "type": "f",
     "label": "The decay is the NUMBER OF APPLICATIONS THAT ACTUALLY ARRIVED, rather than the constant 2.",
     "prose": "A6. The decay is the NUMBER OF APPLICATIONS THAT ACTUALLY ARRIVED, rather than the constant 2.\n\nSame accumulation and the same shape of decay as #f-p8-add, counting fwd_fired plus bwd_fired plus\ntok_fired. A position that two patterns reached decays by 2, one that three reached decays by 3, and\none that nothing reached does not decay at all.\n\nIt therefore differs from A2 exactly where applications are missing -- the first and last positions\nof a window, positions before the second byte where no token context exists, and every position\nwhose backward direction has an empty predecessor set under B1, which at e64 is 218 of the 256\nbytes. Under A2 those positions decay at the full rate while receiving less than the full evidence.\n\nIt needs no support at all, so unlike #f-p8-deficit and #f-p8-period it is unaffected by the k=1\nstrength gap and by axis B.",
     "notes": {
      "history": "Generation 3, and the smallest correction that removes the withdrawn argument. The 2 in A2 was the\ncount of neighbours: information flows in from the left and from the right at rate f each, so the\nfall-off had to be 2f for the sum to stay invariant (#f-p8, the withdrawn passage).",
      "why": "The invariant is gone, but the counting was never the questionable part. This alternative keeps the\ncounting and drops the assumption."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "f-p8-cap8",
     "digit": 7,
     "type": "f",
     "label": "The k=1 argmax pattern has strength 8, and the fall-off is 1.",
     "prose": "A7. The k=1 argmax pattern has strength 8, and the fall-off is 1.\n\nDELIVERY. A k=1 application under B1 delivers min(8, w_s): forward, fwd[table[a]] = min(8, wsrc);\nbackward, each predecessor a of b gets min(8, wsrc - ceil(log2 |preds|)) with the subtraction\nsaturating at 0. The forward and backward applications are thereby the same rule with the same w_p.\nUnder B2 the stored weights are the delivery and this alternative's only effect is the fall-off. The\nk=2 token applications are unchanged: their strength is in the file.\n\nFALL-OFF. The update is #f-p8-add's accumulation (LSA addition, vector-outer entry-inner nesting),\nwith the decay 1 instead of 2.\n\nconst: k1_strength = 8\nconst: falloff = 1",
     "notes": {
      "history": "Generation 4 (#pprog_p8v2_gen4_goal_20260815). The two constants moved together because the delivery\nand the fall-off only make sense as a pair; the pair was the unit, which is how the no-cross-product\nrule was kept. Generation 5 splits them into axes G and H, and this alternative is what both were\ncarved out of.",
      "why": "8 is the weight that makes the argmax carry half the mass of an ES whose other 255 events sit at 0,\nand the measured share of the argmax at its contexts expresses as 9 / 8 / 7 at e64 / e1k / e10k\n(tests/pprog/p8v2-k1-strength.py), so it is the measured value at e1k and within one unit of it at\nevery sample size.\n\nMeasured before it was built, unrecorded positions settling back to their true byte at e1k, v002\nretained models: the pair recovers 223 of 833 against the generation-3 baseline's 165, converging at\ntime step 16 against 47; either constant moved alone does worse than moving neither. The grid is in\nthe generation-4 goal block and reproduces from the retained models with p8v2-k1-strength.py."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": {
      "k1_strength": 8,
      "falloff": 1
     },
     "worked_examples": null
    }
   ]
  },
  {
   "letter": "B",
   "name": "the backward direction of the k=1 pattern",
   "header_slot": "P",
   "header_byte": null,
   "question": "is the backward application reconstructible from the 256-byte forward argmax table, or does it need the whole 65536-byte LPP stored?",
   "watch": "whether the reconstruction and the stored column ever disagree at a position that reaches the trace -- against 65536 bytes of class (a) that the control costs and the baseline does not.",
   "baseline_alternative": "mem_cell_markov_1-norm",
   "alternatives": [
    {
     "id": "mem_cell_markov_1-norm",
     "digit": 1,
     "type": "pattern",
     "label": "Keep exactly p7's 256-byte forward argmax table and RECONSTRUCT the backward direction from it by normalization.",
     "prose": "B1. Keep exactly p7's 256-byte forward argmax table and RECONSTRUCT the backward direction from it\nby normalization.\n\nThe backward application into a position, driven by the argmax byte b at the position to its right,\nis spread evenly over that byte's predecessor set {a : table[a] = b}: each member gets the delivered\nweight less the LSA cost of the choice among them, that is less ceil(log2 |set|). An empty\npredecessor set delivers NOTHING: no pattern has b as its consequent, so no pattern fires, so there\nis no application.\n\nNothing is added to the model file. Whether this reconstruction is good enough is the axis.\n\nWHAT ELSE THIS DECIDES: whether a pattern's SUPPORT is available to the decoder at all. Under B1 the\nmodel carries the argmax table and nothing else, so the total count behind each k=1 rule is not in\nthe file; under B2 the whole 65536-byte matrix is there and a row or column sum recovers it. A\nfiring rate set by a pattern's own support therefore couples the decay axis to this one -- see\n#f-p8 and #f-p8-decay-deficit.",
     "notes": {
      "history": "The answer given in #pprog_p8v2_questions_20260727. Until 2026-08-06 an empty predecessor set\ndelivered the k=0 background, which was the background standing in for a pattern; see the Axis A\nshell."
     },
     "is_baseline": true,
     "pruned": false,
     "constants": null,
     "worked_examples": {
      "title": "B1 reconstructs the backward direction; B2 stores it",
      "formula": "B1: preds(b) = {a : table[a] = b}; if preds is empty NO backward application fires; otherwise every a in preds receives lsa_sub(w_src, ceil(log2 |preds|)) -- the source's activation less the LSA cost of the choice among the predecessors. B2: every a receives min(lpp[a*256+b], w_src), the stored weight capped by the source under the frozen application rule.",
      "source_activation_used": 255,
      "bytes": [
       {
        "byte": 122,
        "shown_as": "\"z\"",
        "B1": {
         "predecessor_set_size": 0,
         "predecessors": [],
         "predecessors_truncated": 0,
         "ceil_log2": null,
         "fires": false,
         "surviving_weight_from_an_absolute_source": null,
         "note": "no byte has this one as its argmax successor, so under B1 no backward application fires here at all"
        },
        "B2": {
         "nonzero_column_entries": 4,
         "top": [
          {
           "predecessor": "\"i\"",
           "stored_weight": 2,
           "delivered_from_an_absolute_source": 2
          },
          {
           "predecessor": "\".\"",
           "stored_weight": 1,
           "delivered_from_an_absolute_source": 1
          },
          {
           "predecessor": "\"/\"",
           "stored_weight": 1,
           "delivered_from_an_absolute_source": 1
          },
          {
           "predecessor": "\"e\"",
           "stored_weight": 1,
           "delivered_from_an_absolute_source": 1
          }
         ]
        },
        "disagreement": {
         "B1_only": 0,
         "B2_only": 4,
         "both": 0,
         "note": "B1 sends one flat weight to every argmax predecessor; B2 sends the learned weight to every observed predecessor, which at this sample is a much larger set."
        }
       },
       {
        "byte": 101,
        "shown_as": "\"e\"",
        "B1": {
         "predecessor_set_size": 9,
         "predecessors": [
          "\"B\"",
          "\"M\"",
          "\"b\"",
          "\"c\"",
          "\"g\"",
          "\"h\"",
          "\"m\"",
          "\"r\"",
          "\"v\""
         ],
         "predecessors_truncated": 0,
         "ceil_log2": 4,
         "fires": true,
         "surviving_weight_from_an_absolute_source": 251,
         "note": null
        },
        "B2": {
         "nonzero_column_entries": 37,
         "top": [
          {
           "predecessor": "\"r\"",
           "stored_weight": 8,
           "delivered_from_an_absolute_source": 8
          },
          {
           "predecessor": "\"h\"",
           "stored_weight": 7,
           "delivered_from_an_absolute_source": 7
          },
          {
           "predecessor": "\"m\"",
           "stored_weight": 7,
           "delivered_from_an_absolute_source": 7
          },
          {
           "predecessor": "\"c\"",
           "stored_weight": 6,
           "delivered_from_an_absolute_source": 6
          },
          {
           "predecessor": "\"g\"",
           "stored_weight": 6,
           "delivered_from_an_absolute_source": 6
          },
          {
           "predecessor": "\"t\"",
           "stored_weight": 6,
           "delivered_from_an_absolute_source": 6
          },
          {
           "predecessor": "\" \" (0x20, space)",
           "stored_weight": 5,
           "delivered_from_an_absolute_source": 5
          },
          {
           "predecessor": "\"s\"",
           "stored_weight": 5,
           "delivered_from_an_absolute_source": 5
          }
         ]
        },
        "disagreement": {
         "B1_only": 0,
         "B2_only": 28,
         "both": 9,
         "note": "B1 sends one flat weight to every argmax predecessor; B2 sends the learned weight to every observed predecessor, which at this sample is a much larger set."
        }
       },
       {
        "byte": 32,
        "shown_as": "\" \" (0x20, space)",
        "B1": {
         "predecessor_set_size": 12,
         "predecessors": [
          "0x0A",
          "\" \" (0x20, space)",
          "\")\"",
          "\"*\"",
          "\",\"",
          "\".\"",
          "\"T\"",
          "\"e\"",
          "\"f\"",
          "\"l\"",
          "\"s\"",
          "\"y\""
         ],
         "predecessors_truncated": 0,
         "ceil_log2": 4,
         "fires": true,
         "surviving_weight_from_an_absolute_source": 251,
         "note": null
        },
        "B2": {
         "nonzero_column_entries": 41,
         "top": [
          {
           "predecessor": "\" \" (0x20, space)",
           "stored_weight": 9,
           "delivered_from_an_absolute_source": 9
          },
          {
           "predecessor": "0x0A",
           "stored_weight": 7,
           "delivered_from_an_absolute_source": 7
          },
          {
           "predecessor": "\"e\"",
           "stored_weight": 7,
           "delivered_from_an_absolute_source": 7
          },
          {
           "predecessor": "\"f\"",
           "stored_weight": 7,
           "delivered_from_an_absolute_source": 7
          },
          {
           "predecessor": "\",\"",
           "stored_weight": 6,
           "delivered_from_an_absolute_source": 6
          },
          {
           "predecessor": "\"d\"",
           "stored_weight": 6,
           "delivered_from_an_absolute_source": 6
          },
          {
           "predecessor": "\"s\"",
           "stored_weight": 6,
           "delivered_from_an_absolute_source": 6
          },
          {
           "predecessor": "\"t\"",
           "stored_weight": 6,
           "delivered_from_an_absolute_source": 6
          }
         ]
        },
        "disagreement": {
         "B1_only": 0,
         "B2_only": 29,
         "both": 12,
         "note": "B1 sends one flat weight to every argmax predecessor; B2 sends the learned weight to every observed predecessor, which at this sample is a much larger set."
        }
       }
      ],
      "empty_predecessor_set": {
       "count": 218,
       "examples": [
        "0x01",
        "0x02",
        "0x03",
        "0x04",
        "0x05",
        "0x06",
        "0x07",
        "0x08"
       ],
       "B1": "no backward application fires at all -- no pattern has this byte as its consequent",
       "B2": "the stored column may still be nonempty, so B2 fires where B1 is silent",
       "note": "Until 2026-08-06 B1 substituted the k=0 background here. That was the background standing in for a pattern, and it is gone."
      },
      "provenance_B1": {
       "variant": "wordsv2-v002",
       "sample": "e10k",
       "sample_bytes": 10000,
       "dataset": "enwik9",
       "model": "tests/pprog/models/p8v2/enwik9/10000/wordsv2-v002.m",
       "computed_by": "tests/pprog/p8v2-replay.py",
       "replay_verified": true,
       "replay_checks": {
        "k1_table": true,
        "token_section": true,
        "trace_count": true
       }
      },
      "provenance_B2": {
       "variant": "wordsv2-v013",
       "sample": "e10k",
       "sample_bytes": 10000,
       "dataset": "enwik9",
       "model": "tests/pprog/models/p8v2/enwik9/10000/wordsv2-v013.m",
       "computed_by": "tests/pprog/p8v2-replay.py",
       "replay_verified": true,
       "replay_checks": {
        "k1_table": true,
        "token_section": true,
        "trace_count": true,
        "backward_lpp": true
       }
      },
      "does_the_disagreement_reach_the_trace": {
       "baseline_v002_e10k": {
        "p_gap": "1250",
        "p_trace": "4651",
        "p_backward": "0",
        "settled_ok": "5828",
        "mean_sweeps": "71.87"
       },
       "control_v013_e10k": {
        "p_gap": "1250",
        "p_trace": "4651",
        "p_backward": "65536",
        "settled_ok": "6043",
        "mean_sweeps": "126.54"
       },
       "answer": "Under D1 the trace is the causal pass and settling does not decide it, so on this vector the disagreement CANNOT reach P: compare p_gap and p_trace above. What B2 costs is p_backward bytes of class (a). Where it can reach the trace is D2/D3, which is what v015 and v016 are for.",
       "source": "tests/pprog/gen2.tsv"
      }
     }
    },
    {
     "id": "mem_cell_markov_1-lpp",
     "digit": 2,
     "type": "pattern",
     "label": "the control: store the full LPP in both directions -- the whole 65536-byte LSA matrix over ordered byte pairs, which is what was learned anyway.",
     "prose": "B2, the control: store the full LPP in both directions -- the whole 65536-byte LSA matrix over\nordered byte pairs, which is what was learned anyway.\n\nThe forward application from the argmax byte a is then the whole row of the matrix, and the backward\napplication from the argmax byte b is the whole column, each attenuated by the source's activation\nunder the frozen application rule in #f-p8. No normalization, no reconstruction.\n\n65536 bytes is fixed in SIZE (it does not scale with the input), so by the p7 accounting rule it\nrides in the fixed cost with the binary, the header and the two 256-byte tables, not in P.",
     "notes": null,
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    }
   ]
  },
  {
   "letter": "C",
   "name": "the AND gate at partial activation",
   "header_slot": "P",
   "header_byte": null,
   "question": "when the two source events are only partly active, does the joint token event fire at min(w_a, w_b), or does it sum them and fire only above a threshold?",
   "watch": "positions where one gate fires and the other does not. Two absolute sources give 255 either way, so only PARTIAL activations distinguish the two, and whether any occur at a sample is itself the finding.",
   "baseline_alternative": "token_and-min",
   "alternatives": [
    {
     "id": "token_and-min",
     "digit": 1,
     "type": "AND gate",
     "label": "the baseline: the joint event's activation is min(w_a, w_b), the simple and sufficient definition #token gives.",
     "prose": "C1, the baseline: the joint event's activation is min(w_a, w_b), the simple and sufficient\ndefinition #token gives. The gate always fires; it just fires weakly when either source is weak.",
     "notes": null,
     "is_baseline": true,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "token_and-sum",
     "digit": 2,
     "type": "AND gate",
     "label": "Input summation and thresholding, the traditional neuron shape.",
     "prose": "C2. Input summation and thresholding, the traditional neuron shape.\n\nThe joint event's activation is w_a + w_b - theta when that is positive and the gate does not fire\nat all otherwise; theta is 128 (#omega-p8-hyper), and the activation saturates at 255.\n\nTwo absolute sources give 255 either way, so this differs from #token_and-min only at partial\nactivation -- and it can fail to fire at all where min would have fired weakly.\n\nPRUNED, and kept runnable because #wordsv2-v005 and #wordsv2-v014 are on the record.",
     "notes": {
      "history": "PRUNED generation 3 (#p8v2_gen3: \"C2 is definitely wrong because it drops weak signals and therefore\ncan't support settling\"). The threshold is the whole objection: an event space of log support values\nat these sample sizes carries weights of 1 and 2, so a gate that requires w_a + w_b to reach 128\nbefore it fires anything discards exactly the evidence settling is supposed to propagate.",
      "why": "Generation 2 measured v014 as BYTE-IDENTICAL to the baseline in every column: over all 3140 gate\nevaluations at e64 the two gates differ 3140 times and what is delivered differs zero times, because\nit is capped by the rule's own learned weight of 1 or 2. So the axis was never visible at this\nsample and the prune rests on the argument rather than on the measurement -- which is the right way\nround, and is why the control is worth keeping against the day rule weights are large."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": {
      "title": "C1 min against C2 sum-and-threshold, at the activations that actually occur",
      "formula": "C1: the gate always fires, at min(w_a, w_b); what is delivered is min(rule weight, gate). C2: the gate fires only when w_a + w_b >= theta and then at min(w_a + w_b - theta, 255); theta is 128 (#omega-p8-hyper). Two absolute sources give 255 either way, so only PARTIAL activations can distinguish them -- and what is delivered is capped by the rule's own learned weight, so a difference in the gate only reaches what is delivered when one gate falls below that weight.",
      "theta": 128,
      "cases": {
       "C1_fires_and_C2_does_not": [],
       "the_gates_differ": [
        {
         "position": 2,
         "sweep": 2,
         "w_a": 255,
         "w_b": 253,
         "sum": 508,
         "rule_weight": 1,
         "C1_gate": 253,
         "C1_delivers": 1,
         "C2_fires": true,
         "C2_gate": 255,
         "C2_delivers": 1
        },
        {
         "position": 28,
         "sweep": 2,
         "w_a": 253,
         "w_b": 255,
         "sum": 508,
         "rule_weight": 1,
         "C1_gate": 253,
         "C1_delivers": 1,
         "C2_fires": true,
         "C2_gate": 255,
         "C2_delivers": 1
        },
        {
         "position": 29,
         "sweep": 2,
         "w_a": 255,
         "w_b": 253,
         "sum": 508,
         "rule_weight": 1,
         "C1_gate": 253,
         "C1_delivers": 1,
         "C2_fires": true,
         "C2_gate": 255,
         "C2_delivers": 1
        }
       ],
       "the_DELIVERED_WEIGHTS_differ": []
      },
      "counts_over_v002s_own_run": {
       "gate_evaluations": 3140,
       "C2_would_stay_silent": 0,
       "gates_differ": 3140,
       "delivered_differ": 0
      },
      "counts_over_v014s_own_run": {
       "gate_evaluations": 3140,
       "gate_fired": 3140,
       "gate_silent": 0,
       "note": "v014 is where C2 is the rule that actually ran, so its own state differs from v002's; both counts are given rather than one."
      },
      "what_the_sources_weights_actually_are": {
       "note": "w_a + w_b, min(w_a, w_b) and the rule's learned weight over every gate evaluation of v002's run at this sample. This is what decides whether the axis can show anything here at all.",
       "sum_w_a_plus_w_b": {
        "0 (both sources silent)": 0,
        "1..127 (C2 cannot fire)": 0,
        "128..135 (C2 gate 0..7)": 0,
        "136..509": 3140,
        "510 (both absolute)": 0
       },
       "sum_min": 414,
       "sum_max": 508,
       "min_w_a_w_b": {
        "0": 0,
        "1..7": 0,
        "8..254": 3140,
        "255 (absolute)": 0
       },
       "rule_weight_max": 2
      },
      "reading": "What an application delivers is min(rule weight, gate), and at e64 the learned k=2 weights are 1 or 2 -- a context seen once or twice. Both gates are far above that at almost every evaluation, so the cap decides the what is delivered and the axis is invisible here even where the gates differ. The counts above say exactly how often each of the three things happens rather than leaving it to be inferred.",
      "provenance_C1": {
       "variant": "wordsv2-v002",
       "sample": "e64",
       "sample_bytes": 64,
       "dataset": "enwik9",
       "model": "tests/pprog/models/p8v2/enwik9/64/wordsv2-v002.m",
       "computed_by": "tests/pprog/p8v2-replay.py",
       "replay_verified": true,
       "replay_checks": {
        "k1_table": true,
        "token_section": true,
        "trace_count": true,
        "pos_dump": true
       },
       "pos_dump": "tests/pprog/gen4-pos/wordsv2-v002.e64.pos"
      },
      "provenance_C2": {
       "variant": "wordsv2-v014",
       "sample": "e64",
       "sample_bytes": 64,
       "dataset": "enwik9",
       "model": "tests/pprog/models/p8v2/enwik9/64/wordsv2-v014.m",
       "computed_by": "tests/pprog/p8v2-replay.py",
       "replay_verified": true,
       "replay_checks": {
        "k1_table": true,
        "token_section": true,
        "trace_count": true,
        "pos_dump": true
       },
       "pos_dump": "tests/pprog/gen2-pos/wordsv2-v014.e64.pos"
      }
     }
    }
   ]
  },
  {
   "letter": "D",
   "name": "sparsification, which bytes the trace records",
   "header_slot": "Omega",
   "header_byte": null,
   "question": "is the trace the causal surprise set, or that set minus every byte settling can recover?",
   "watch": "p_trace and roundtrip. D2 and D3 are the only alternatives that let settling reach P at all, and the only ones that can fail to round-trip.",
   "baseline_alternative": "omega-p8-frozen",
   "alternatives": [
    {
     "id": "omega-p8-frozen",
     "digit": 1,
     "type": "Omega",
     "label": "p7's rule shape, frozen: one causal (left-context) pass, no settling, no removal.",
     "prose": "D1. p7's rule shape, frozen: one causal (left-context) pass, no settling, no removal.\n\nA position is recorded exactly when the composite prediction from its left context is not the byte\nthat is there:\n\n    position 0            always recorded (no predecessor)\n    position 1            predicted by the k=1 table from byte 0\n    position p >= 2       predicted by the kept k=2 rule for the token (byte p-2, byte p-1) if there\n                          is one, and by the k=1 table from byte p-1 otherwise\n\nThis is p7's procedure with p7's model replaced by the composite, so it isolates the k=2 model as\nthe only lever and the comparison against p7 is like for like. It is also the only alternative on\nthis axis that round-trips by construction: the decoder makes the same prediction from the same left\ncontext.",
     "notes": {
      "history": "The one place generation 1 reads the goal block rather than quoting it. The goal calls D1\n\"surprising under the k=1 argmax\", which taken literally reproduces p7's trace exactly and therefore\ncannot beat p7 once the token section is added to P. Read as the composite argmax it is the rule\nabove, the baseline beats p7 by construction, and axis D becomes an axis about settling and removal\nrather than about switching the push off. See \"Open after generation 1\"."
     },
     "is_baseline": true,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "omega-p8-settled",
     "digit": 2,
     "type": "Omega",
     "label": "start from the set #omega-p8-frozen records, then drop what settling can recover.",
     "prose": "D2: start from the set #omega-p8-frozen records, then drop what settling can recover. In increasing\nposition order, for each recorded position p: settle the W-window centred on p with every OTHER\nrecorded position clamped, and drop p if the settled argmax at p is the byte that is there.\n\nSingle pass, and no re-settling after a removal: every decision is taken against the ORIGINAL\nrecorded set, so the removals do not see each other. That is what makes this cheaper than\n#omega-p8-greedy, and what makes it liable to drop two bytes that were each other's evidence.",
     "notes": null,
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "omega-p8-greedy",
     "digit": 3,
     "type": "Omega",
     "label": "the placeholder #omega-p8 gives, made precise: greedy removal with re-settling.",
     "prose": "D3, the placeholder #omega-p8 gives, made precise: greedy removal with re-settling. In increasing\nposition order, for each still-recorded position p: settle the W-window centred on p with the\nCURRENT recorded set (minus p) clamped, and drop p if the settled argmax at p is the byte that is\nthere.\n\nEach candidate therefore sees the removals already accepted. The stopping rule is one pass over the\npositions -- the window is the uncertainty window, not the DSS, so a second pass would only find what\na later removal invalidated, and that is what the round-trip column is for.",
     "notes": null,
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    }
   ]
  },
  {
   "letter": "E",
   "name": "replay",
   "header_slot": "Omega",
   "header_byte": null,
   "question": "how many times is the model relearned as the pattern shape changes?",
   "watch": "the learned k=1 table itself, not only the rate: replay relearns k=1 against the k=2 mask, so a replayed variant ends with a different table and a different `removed` diagnostic even where its trace is the same size.",
   "baseline_alternative": "omega-p8-replay-1",
   "alternatives": [
    {
     "id": "omega-p8-replay-1",
     "digit": 1,
     "type": "Omega",
     "label": "the baseline: one round. The k=1 table is learned exactly as p7 learns it, over the resident chain; the k=2 tokens are learned over the same replayed trace; the trace is then sparsified once.",
     "prose": "E1, the baseline: one round. The k=1 table is learned exactly as p7 learns it, over the resident\nchain; the k=2 tokens are learned over the same replayed trace; the trace is then sparsified once.",
     "notes": null,
     "is_baseline": true,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "omega-p8-replay-2",
     "digit": 2,
     "type": "Omega",
     "label": "Two rounds. Round 1 is #omega-p8-replay-1.",
     "prose": "E2. Two rounds. Round 1 is #omega-p8-replay-1.\n\nThen the pattern shape has changed -- k=2 rules exist that did not -- so p7 is replayed into p8\nagain: round 2 relearns the k=1 model over the RESIDUAL, the positions no kept k=2 rule covers,\nrelearns the tokens, and re-sparsifies. The k=1 model stops paying for the positions the k=2 model\nhas taken over, which is the only way a second round can change anything.",
     "notes": {
      "why": "The other reading of \"relearn k=1 after the k=2 patterns exist\" -- relearn k=1 over the sequence the\nround-1 model reconstructs -- is a no-op whenever the model round-trips. See \"Open after generation\n1\"."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "omega-p8-replay-dry",
     "digit": 3,
     "type": "Omega",
     "label": "replay until the trace stops shrinking, capped at 4 rounds (#omega-p8-hyper).",
     "prose": "E3: replay until the trace stops shrinking, capped at 4 rounds (#omega-p8-hyper). Each round is a\nround of #omega-p8-replay-2; the loop ends when a round does not reduce the number of recorded bytes,\nand the model kept is the last round's.",
     "notes": null,
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    }
   ]
  },
  {
   "letter": "F",
   "name": "token creation and pruning",
   "header_slot": "Omega",
   "header_byte": null,
   "question": "does omega keep every distinct two-byte context, or a fixed budget of them chosen by total support or by sharpness?",
   "watch": "tokens_kept against the budget of 256. Below the budget the three alternatives coincide exactly, so the axis says nothing until the DSS is large enough for it to bind.",
   "baseline_alternative": "omega-p8-keep-all",
   "alternatives": [
    {
     "id": "omega-p8-keep-all",
     "digit": 1,
     "type": "Omega",
     "label": "Omega creates a k=2 token event for every distinct two-byte context observed in the scan, and never prunes.",
     "prose": "F1. Omega creates a k=2 token event for every distinct two-byte context observed in the scan, and\nnever prunes.\n\nThe DSS is small precisely so that this works, and the keep/prune score is deliberately unspecified\nuntil there are examples to look at.\n\nThe token section of the model is therefore data-dependent in SIZE and belongs in P, not in the\nfixed cost. Zero input still gives zero tokens and P = 0.",
     "notes": {
      "history": "This is the one place p8v2 differs from the size accounting sketched in\n#pprog_p8v2_questions_20260727 (2), which assumed a fixed per-k budget and put the k=2 table in the\nfixed cost."
     },
     "is_baseline": true,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "omega-p8-keep-support",
     "digit": 2,
     "type": "Omega",
     "label": "a fixed budget per k (256 at k=2), kept by TOTAL LSA SUPPORT -- the LSA sum over a token's successor distribution, i.e.",
     "prose": "F2: a fixed budget per k (256 at k=2), kept by TOTAL LSA SUPPORT -- the LSA sum over a token's\nsuccessor distribution, i.e. how often the context was seen at all.\n\nReady for when the DSS grows; at step-1 sizes the budget does not bind and this is expected to be\n#omega-p8-keep-all with extra bookkeeping.",
     "notes": null,
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "omega-p8-keep-sharp",
     "digit": 3,
     "type": "Omega",
     "label": "a fixed budget per k (256 at k=2), kept by SHARPNESS -- the LSA weight of a token's argmax successor less the weight of its runner-up.",
     "prose": "F3: a fixed budget per k (256 at k=2), kept by SHARPNESS -- the LSA weight of a token's argmax\nsuccessor less the weight of its runner-up. A mechanical rule over the patterns themselves, not\ncounting and not data replay, per the answer to Q5; the LSI has already captured the counting.\n\nReady for when the DSS grows; at step-1 sizes the budget does not bind.",
     "notes": null,
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    }
   ]
  },
  {
   "letter": "G",
   "name": "the forward pass, what a k=1 application delivers",
   "header_slot": "f",
   "header_byte": 42,
   "question": "how strong is a k=1 application, given that the model file stores an argmax and no weight at all, so the strength is a constant of the design rather than a learned quantity?",
   "watch": "that every row of the H ladder sits at the SAME delivery, which is what having this axis separately buys -- a difference between two decay rules is now a difference in decay alone. Two things say so on the page: byte 42 reads 1 in every variant that names the split (v026..v031) and is unwritten in the two carried over from generation 4, where an unnamed axis resolves to its baseline digit and is the same rule; and no entry a k=1 application wrote is ever above 8 in the f panel.",
   "baseline_alternative": "f-p8-forward",
   "alternatives": [
    {
     "id": "f-p8-forward",
     "digit": 1,
     "type": "f",
     "label": "A k=1 application delivers min(8, w_s).",
     "prose": "G1. A k=1 application delivers min(8, w_s).\n\nForward, fwd[table[a]] = min(8, wsrc). Backward, each predecessor a of b gets\nmin(8, lsa_sub(wsrc, ceil(log2 |preds|))), the subtraction saturating at 0. Forward and backward\nagree on w_p.\n\nUnder B2 the stored weights are the delivery and this axis has no effect at all. The k=2 token\napplications are never on this axis: their strength is in the file.\nconst: k1_strength = 8",
     "notes": {
      "history": "Generation 5 (#pprog_p8v2_gen5_goal_20260815) carved this axis out of #f-p8-cap8 so that delivery\nand decay vary separately, on MJC's instruction opening the generation. Until generation 4 the two\nwere one axis, which is why generation 4 had to make \"the pair\" the unit and why #f-p8-deficit and\n#f-p8-period carried the k=1 strength gap inside themselves -- an alternative that changed the rate\ncould 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,\nand the argmax's measured share at its contexts expresses as 9 / 8 / 7 at e64 / e1k / e10k\n(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\nNOT built in generation 5, which moves the decay axis only. Pass-through: deliver w_s unchanged,\nthe honest name for the 255 that generation 4 extirpated, 255 being the identity of min. Attenuate:\ndeliver lsa_sub(w_s, c) rather than a cap, which is the only form in which a strength of 1 can be\napplied at all -- min(1, w_s) puts the whole window in a 0-to-1 band where the stochastic add is\nnoise and recovers 18 of 833."
     },
     "is_baseline": true,
     "pruned": false,
     "constants": {
      "k1_strength": 8
     },
     "worked_examples": null
    }
   ]
  },
  {
   "letter": "H",
   "name": "the decay, what a position does with the applications that reach it",
   "header_slot": "f",
   "header_byte": 43,
   "question": "with the delivery held fixed, which decay rule is doing the work: a constant, a rate set by each pattern's own support, a count of what arrived, or a renormalisation of how much evidence the position claims?",
   "watch": "settled_ok, conv and bpc on the ladder, at all three samples, and the .pos dumps behind them. Read every row against the constraint that a UNIFORM fall-off cannot reorder an ES -- lsa_sub is monotone, so only the 0 floor can change an argmax -- which means an alternative here is visible only through the floor, through what the next time step accumulates, or by differing between the patterns feeding ONE position. H2 is the row to check first: it draws no entropy, so it must conform exactly.",
   "baseline_alternative": "f-p8-decay",
   "alternatives": [
    {
     "id": "f-p8-decay",
     "digit": 1,
     "type": "f",
     "label": "Accumulate every application that fires, then subtract a constant fall-off of 1.",
     "prose": "H1. Accumulate every application that fires, then subtract a constant fall-off of 1.\n\nTHE RULE. #f-p8-add's accumulation -- copy the position's row into an accumulator, then for each\napplication that fired, in the order forward, backward, token, make a COMPLETE pass over all 256\nentries with lsa_add before the next one begins (the nesting is application-outer, entry-inner and\nis part of the definition, because lsa_add draws from the shared entropy stream) -- and then\nlsa_sub(entry, 1) on every one of the 256 entries, floored at 0.\nconst: falloff = 1\n\nTHE STANDING CONSTRAINT ON EVERY ALTERNATIVE OF THIS AXIS, from generation 3's finding: a UNIFORM\nfall-off CANNOT REORDER AN ES. lsa_sub is monotone, so subtracting the same amount from every entry\nleaves the argmax exactly where it was; only the 0 floor can change it. An alternative that varies\nthe rate between positions or between time steps acts through the floor and through what the next\nstep accumulates; an alternative that varies it between the patterns feeding ONE position is the\nonly kind that can reorder anything directly. Read every measurement on this axis against that.",
     "notes": {
      "history": "Generation 5 (#pprog_p8v2_gen5_goal_20260815) carved this axis out of #f-p8-cap8 and held it at the\npair's fall-off. Generation 4 measured that the whole gain from 165 to 223 recovered positions at\ne1k, and the convergence from time step 47 to 16, was THE FALL-OFF and not the strength -- but it\ncould only say so by moving both and reasoning about a grid. With the delivery held fixed on axis G\nit is an axis, and the generation's question is clean for the first time: which decay rule is doing\nthe work?"
     },
     "is_baseline": true,
     "pruned": false,
     "constants": {
      "falloff": 1
     },
     "worked_examples": null
    },
    {
     "id": "f-p8-decay-assign",
     "digit": 2,
     "type": "f",
     "label": "ASSIGNMENT: the longest k that fires wins outright, and there is no accumulation and therefore no decay at all.",
     "prose": "H2. ASSIGNMENT: the longest k that fires wins outright, and there is no accumulation and therefore\nno decay at all.\n\nIf a k=2 token application reaches this position, the position's new state IS what that application\ndelivered; otherwise it is the elementwise LSA maximum of the forward and backward k=1\napplications; if neither fires, 256 zeros. The axis's degenerate point, and the control that shows\nwhat accumulating buys once the delivery is no longer saturating.\n\nIt is the one alternative on either f axis whose settling DRAWS NO ENTROPY, which is what makes it\nconformance-checkable in a viewer without replaying the stream.",
     "notes": {
      "history": "Generation 5, A1's idea (#f-p8-assign) restated on the cap-8 delivery. A1 ran with the k=1 delivery\nat 255, so an assignment wrote a saturated row: one entry at 255 and the rest at 0, a position\nclaiming absolute knowledge from a rule that holds twice in five occurrences. At the cap-8 delivery\nan assignment writes 8 and the rest 0, which is a claim of partial knowledge, and the readout's\ntie-break stops deciding a large share of the answers by default.",
      "why": "Pruned as a design in generation 1 and not un-pruned here: it is built because the generation\nrestates all six, and because a control that draws no entropy is worth having (#p8v2_gen3 wanted it\nkept for exactly that)."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "f-p8-decay-const2",
     "digit": 3,
     "type": "f",
     "label": "The same accumulation as the baseline, with a constant fall-off of 2 instead of 1.",
     "prose": "H3. The same accumulation as the baseline, with a constant fall-off of 2 instead of 1.\nconst: falloff = 2\n\nTHE ONE-CONSTANT CONTROL. With #f-p8-decay's (8, 1) and generation 4's retained (255, 2) runs, this\nis (8, 2): the corner of the square that was never measured. The attribution of generation 4's gain\nstops being an inference from a Python grid and becomes three runs.",
     "notes": {
      "history": "Generation 5, A2's idea (#f-p8-add) restated on the cap-8 delivery. Generation 4 could only compare\n(255, 2) against (8, 1); the two constants moved together and the grid had to argue which one\ncarried the gain.\n\nThe derivation the 2 came from -- each atomic pattern applied at rate f, the sum copied to both\nneighbours at rate f each, so the fall-off must be 2f -- was WITHDRAWN by MJC in generation 3: there\nis no constant sum in an ES. The 2 survives here as a measured constant with no argument behind it,\nwhich is exactly what a control is."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": {
      "falloff": 2
     },
     "worked_examples": null
    },
    {
     "id": "f-p8-decay-renorm",
     "digit": 4,
     "type": "f",
     "label": "Accumulate as the baseline does, then set the position's total support to what the arriving evidence justifies, rather than to a constant.",
     "prose": "H4. Accumulate as the baseline does, then set the position's total support to what the arriving\nevidence justifies, rather than to a constant.\n\nTHE RULE. Let s be lsa_sum256 of the accumulated vector, and let the target t be the LSA sum --\nlsa_add folded, not the maximum -- of the supports of the applications that fired at this position\non this time step, which is the correct combination when the applications come from disjoint\nobservations, per the second free parameter in #f-p8's derivation. Subtract lsa_sub(s, t) from every\none of the 256 entries, floored at 0. When nothing fired, t is 0 and the position decays to the\nfloor. When s is at or below t nothing is subtracted.\n\nWHAT A UNIFORM SUBTRACTION CAN AND CANNOT DO, which is what this alternative rests on. Subtracting a\nconstant d from every entry of a position's vector divides every count it represents by 2^d. That\nleaves the softmax distribution EXACTLY unchanged and changes only the total number of observations\nthe position claims to rest on. So a renormalisation is never a statement about WHICH byte the\nposition favours; it is only ever a statement about HOW MUCH EVIDENCE the position represents.\n\nWHAT TO EXPECT, stated before the run so the measurement can contradict it: because the subtraction\nis uniform it cannot reorder the ES, so every effect this alternative has arrives through the 0\nfloor and through what the next time step accumulates on top of a rescaled row. Its interest is not\nthe settled bytes but the CONFIDENCE the settled state reports -- it is the only alternative on this\naxis whose vectors mean the same thing at time step 5 and at time step 100.",
     "notes": {
      "history": "Generation 5, A3's idea (#f-p8-renorm) restated, and the restatement is a correction. A3\nrenormalised to a sum of 255 and was read as imposing an invariant on the distribution, which is\nboth the thing #p8v2_gen3 ruled out (\"there is no constant sum ever in an ES\") and a thing the\noperation cannot do. MJC on this generation's choice C: \"Renormalization was never understood\ncorrectly by the model... 'along the same lines' is fine if you interpret it like a good probability\ntheorist.\""
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "f-p8-decay-deficit",
     "digit": 5,
     "type": "f",
     "label": "Accumulate as the baseline does, then decay by the SUPPORT DEFICIT of the strongest evidence that arrived.",
     "prose": "H5. Accumulate as the baseline does, then decay by the SUPPORT DEFICIT of the strongest evidence\nthat arrived.\n\nTHE RULE. Let s be the largest support among the applications that fired here this time step and\nsmax the reference support; the position decays by lsa_sub(smax, s), floored at 0. Evidence as well\nsupported as the best-supported pattern in the model does not decay; evidence seen half as often\nloses one LSA unit per time step. In LSA a rate of one in 2^d IS a subtraction of d, so a fall-off\nwritten this way is a rate, and this alternative sets it from the pattern.\n\nAS BUILT. smax is the largest learned weight over the k=1 argmax pairs and the kept k=2 rules,\nfloored at 1: 2 at e64, 6 at e1k, 9 at e10k. A pattern's own support is the LEARNED weight --\nc1[a*256 + table[a]] for k=1, the stored weight for k=2.\n\nDeterministic: it draws no entropy of its own. Support is read from the learned tables, which under\nB1 are in memory but NOT in the model file; under the D1 baseline settling never runs at decode time\nso this is measurable as it stands, and combining it with D2 or D3 would need the support serialized.",
     "notes": {
      "history": "Generation 5, A4's idea (#f-p8-deficit) restated on the cap-8 delivery, and the restatement removes\na defect that was inside A4 rather than beside it: there a k=1 pattern simultaneously DELIVERED at\nthe absolute 255 and had a rate set by a support of 0, 1 or 2 -- maximally strong and minimally\nsupported in the same time step, which is not a design but the k=1 strength gap showing up inside an\nalternative. The delivery is now 8 on its own axis and the rate is set here, and the two can be read\nseparately for the first time.",
      "why": "The reference support smax is a sub-parameter, not a decision this block makes; 255 as the reference\nmakes the deficit 253 or 254 at these samples and annihilates everything, which is the failure\nalready recorded against w_p - (255 - w_s) in #f-p8."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "f-p8-decay-period",
     "digit": 6,
     "type": "f",
     "label": "The rate is a schedule rather than an attenuation, and there is no decay at all.",
     "prose": "H6. The rate is a schedule rather than an attenuation, and there is no decay at all.\n\nTHE RULE. A pattern of support s is applied only on the time steps whose step number is a multiple\nof 2^(smax - s), so the best-supported pattern in the model fires on every step, one at half that\nsupport on every second step, and so on. What an application delivers is unchanged; how often it\nhappens is the axis. This is the alternative that takes the word \"rate\" at face value.\n\nTHE PREDICTION IT MAKES AND THE OTHERS DO NOT: a window runs W = 128 time steps, so a pattern whose\nperiod exceeds W NEVER FIRES INSIDE A WINDOW. The periods are 2^(smax - s_p): 1, 2 or 4 at e64;\nreaching 64 at e1k; reaching 512 at e10k, where a support-0 pattern never fires at all, which at\nthat sample is 169 of the 256 bytes. Whether that is right for weak evidence or a defect is what the\ngeneration is for.\n\nIT BUYS NO WORK, and the alternative would otherwise be read as carrying a fix it does not carry.\nThe three vectors are computed, and settle_apps counted, BEFORE the period decides whether to apply\nthem, so a skipped application costs exactly what a taken one costs, while #f-p8's derivation says\napplying a pattern always costs energy. settle_apps here measures work done, not work saved.\n\nDeterministic, and with the same note as #f-p8-decay-deficit on smax and on where support comes from.",
     "notes": {
      "history": "Generation 5, A5's idea (#f-p8-period) restated on the cap-8 delivery. A5 fired its schedule on\napplications delivered at the absolute 255; this fires the same schedule on applications capped at\n8, so for the first time the rate is varied with the strength held still.\n\nGeneration 5 tried to move the gate decision ahead of the vector computation and BACKED IT OUT:\ndeciding the gates first requires restructuring the position loop, the generated settling then\nstopped honouring the frozen shell's clamping (every one of the 64 positions at e64 diverged from\nthe reference, including recorded positions that must never be updated), and the shell is frozen for\ngood reasons.",
      "later": "Realising the saving is an open item against the settling shell, not against this block."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    },
    {
     "id": "f-p8-decay-indegree",
     "digit": 7,
     "type": "f",
     "label": "The decay is the NUMBER OF APPLICATIONS THAT ACTUALLY ARRIVED at this position on this time step, rather than a constant.",
     "prose": "H7. The decay is the NUMBER OF APPLICATIONS THAT ACTUALLY ARRIVED at this position on this time\nstep, rather than a constant.\n\nTHE RULE. Same accumulation as the baseline, and the same SHAPE of decay, but the amount is\nfwd_fired plus bwd_fired plus tok_fired, subtracted with lsa_sub from every one of the 256 entries.\nA position that two patterns reached decays by 2, one that three reached decays by 3, and one that\nnothing reached does not decay at all.\n\nIt therefore differs from a constant fall-off exactly where applications are MISSING: the first and\nlast positions of a window (the non-overlapping tiling means an edge settles from one side only),\npositions before the second byte where no token context exists, and every position whose backward\ndirection has an empty predecessor set under B1, which at e64 is 218 of the 256 bytes. Under a\nconstant those positions decay at the full rate while receiving less than the full evidence.\n\nIt needs no support at all, so unlike #f-p8-decay-deficit and #f-p8-decay-period it is untouched by\nthe k=1 strength gap and by axis B, and it is the cheapest of the six to reason about.",
     "notes": {
      "history": "Generation 5, A6's idea (#f-p8-indegree) restated on the cap-8 delivery -- the smallest correction\nthat removes the withdrawn argument entirely. The 2 that A2 subtracted was the count of neighbours,\nfrom the constant-sum derivation that generation 3 withdrew. The invariant is gone; the COUNTING was\nnever the questionable part."
     },
     "is_baseline": false,
     "pruned": false,
     "constants": null,
     "worked_examples": null
    }
   ]
  }
 ],
 "settling_columns": {
  "definitions": {
   "settled_ok": {
    "definition": "Of the D positions actually settled, the number whose SETTLED ARGMAX equals the sample byte. D = min(M, 65536), the dump cap; the reported denominator is D and not M.",
    "counts_clamped_positions": true,
    "note": "Recorded positions are clamped to 255 on their own byte, so they are correct by construction and are included in the count. settled_ok is therefore bounded below by the number of recorded positions.",
    "where": "the .pos dump's okflag, summed; column settled_ok of the TSV"
   },
   "mean_sweeps": {
    "definition": "The mean, OVER WINDOWS, of the sweep at which that window's argmax sequence stopped changing. Not a mean over positions.",
    "note": "A window that never converged contributes W, the sentinel. At e64 there is one window, so mean_sweeps is that window's conv.",
    "where": "column mean_sweeps of the TSV"
   },
   "conv": {
    "definition": "The sweep after which the whole window's argmax sequence stops changing, initialised to W.",
    "per": "WINDOW, not position",
    "note": "Every row of a window carries the same conv; the .pos column is per-position only in layout. conv == W is the DID-NOT-CONVERGE sentinel, and W is 128 or what is left of the sample -- so at e64 'never converged' reads as 64, not 128.",
    "where": "the .pos dump's conv column"
   },
   "W": {
    "definition": "we - ws, the window's own length: 128, or what is left of the sample.",
    "note": "128 is the architecture; 64 is what the e64 dumps record."
   }
  },
  "numbers": {
   "generation-1": [
    {
     "variant": "wordsv2-v001",
     "axes": "111111",
     "sample": "e64",
     "U": "64",
     "settled_ok": "64",
     "mean_sweeps": "41.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v001",
     "axes": "111111",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "942",
     "mean_sweeps": "27.88",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v001",
     "axes": "111111",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "9828",
     "mean_sweeps": "14.53",
     "p_trace": "4651",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v002",
     "axes": "211111",
     "sample": "e64",
     "U": "64",
     "settled_ok": "19",
     "mean_sweeps": "35.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v002",
     "axes": "211111",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "332",
     "mean_sweeps": "37.38",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v002",
     "axes": "211111",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "5828",
     "mean_sweeps": "71.87",
     "p_trace": "4651",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v003",
     "axes": "311111",
     "sample": "e64",
     "U": "64",
     "settled_ok": "18",
     "mean_sweeps": "43.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v003",
     "axes": "311111",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "384",
     "mean_sweeps": "99.75",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v003",
     "axes": "311111",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "5942",
     "mean_sweeps": "37.68",
     "p_trace": "4651",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v004",
     "axes": "121111",
     "sample": "e64",
     "U": "64",
     "settled_ok": "38",
     "mean_sweeps": "64.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v004",
     "axes": "121111",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "948",
     "mean_sweeps": "48.38",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v004",
     "axes": "121111",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "9884",
     "mean_sweeps": "16.95",
     "p_trace": "4651",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v005",
     "axes": "112111",
     "sample": "e64",
     "U": "64",
     "settled_ok": "15",
     "mean_sweeps": "64.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v005",
     "axes": "112111",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "407",
     "mean_sweeps": "84.12",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v005",
     "axes": "112111",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "7962",
     "mean_sweeps": "60.71",
     "p_trace": "4651",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v006",
     "axes": "111211",
     "sample": "e64",
     "U": "64",
     "settled_ok": "64",
     "mean_sweeps": "41.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v006",
     "axes": "111211",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "942",
     "mean_sweeps": "27.88",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "no"
    },
    {
     "variant": "wordsv2-v007",
     "axes": "111311",
     "sample": "e64",
     "U": "64",
     "settled_ok": "64",
     "mean_sweeps": "41.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v007",
     "axes": "111311",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "942",
     "mean_sweeps": "27.88",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "no"
    },
    {
     "variant": "wordsv2-v008",
     "axes": "111121",
     "sample": "e64",
     "U": "64",
     "settled_ok": "64",
     "mean_sweeps": "60.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v008",
     "axes": "111121",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "771",
     "mean_sweeps": "52.62",
     "p_trace": "193",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v008",
     "axes": "111121",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "9696",
     "mean_sweeps": "17.68",
     "p_trace": "4632",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v009",
     "axes": "111131",
     "sample": "e64",
     "U": "64",
     "settled_ok": "64",
     "mean_sweeps": "60.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v009",
     "axes": "111131",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "771",
     "mean_sweeps": "52.62",
     "p_trace": "193",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v009",
     "axes": "111131",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "9703",
     "mean_sweeps": "16.09",
     "p_trace": "4678",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v010",
     "axes": "111112",
     "sample": "e64",
     "U": "64",
     "settled_ok": "64",
     "mean_sweeps": "41.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v010",
     "axes": "111112",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "942",
     "mean_sweeps": "27.88",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v010",
     "axes": "111112",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "9636",
     "mean_sweeps": "18.28",
     "p_trace": "6584",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v011",
     "axes": "111113",
     "sample": "e64",
     "U": "64",
     "settled_ok": "64",
     "mean_sweeps": "41.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v011",
     "axes": "111113",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "942",
     "mean_sweeps": "27.88",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v011",
     "axes": "111113",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "9435",
     "mean_sweeps": "28.57",
     "p_trace": "6628",
     "p_gap": "1250",
     "roundtrip": "yes"
    }
   ],
   "generation-2": [
    {
     "variant": "wordsv2-v002",
     "axes": "211111",
     "sample": "e64",
     "U": "64",
     "settled_ok": "19",
     "mean_sweeps": "35.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v002",
     "axes": "211111",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "332",
     "mean_sweeps": "37.38",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v002",
     "axes": "211111",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "5828",
     "mean_sweeps": "71.87",
     "p_trace": "4651",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v003",
     "axes": "311111",
     "sample": "e64",
     "U": "64",
     "settled_ok": "18",
     "mean_sweeps": "43.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v003",
     "axes": "311111",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "384",
     "mean_sweeps": "99.75",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v003",
     "axes": "311111",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "5942",
     "mean_sweeps": "37.68",
     "p_trace": "4651",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v013",
     "axes": "221111",
     "sample": "e64",
     "U": "64",
     "settled_ok": "5",
     "mean_sweeps": "64.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v013",
     "axes": "221111",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "348",
     "mean_sweeps": "125.00",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v013",
     "axes": "221111",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "6043",
     "mean_sweeps": "126.54",
     "p_trace": "4651",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v014",
     "axes": "212111",
     "sample": "e64",
     "U": "64",
     "settled_ok": "19",
     "mean_sweeps": "35.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v014",
     "axes": "212111",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "332",
     "mean_sweeps": "37.38",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v014",
     "axes": "212111",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "5828",
     "mean_sweeps": "71.87",
     "p_trace": "4651",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v015",
     "axes": "211211",
     "sample": "e64",
     "U": "64",
     "settled_ok": "19",
     "mean_sweeps": "33.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "no"
    },
    {
     "variant": "wordsv2-v015",
     "axes": "211211",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "330",
     "mean_sweeps": "61.38",
     "p_trace": "161",
     "p_gap": "125",
     "roundtrip": "no"
    },
    {
     "variant": "wordsv2-v015",
     "axes": "211211",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "5771",
     "mean_sweeps": "81.89",
     "p_trace": "4349",
     "p_gap": "1250",
     "roundtrip": "no"
    },
    {
     "variant": "wordsv2-v016",
     "axes": "211311",
     "sample": "e64",
     "U": "64",
     "settled_ok": "19",
     "mean_sweeps": "33.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "no"
    },
    {
     "variant": "wordsv2-v016",
     "axes": "211311",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "331",
     "mean_sweeps": "35.88",
     "p_trace": "162",
     "p_gap": "125",
     "roundtrip": "no"
    },
    {
     "variant": "wordsv2-v016",
     "axes": "211311",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "5803",
     "mean_sweeps": "80.46",
     "p_trace": "4383",
     "p_gap": "1250",
     "roundtrip": "no"
    },
    {
     "variant": "wordsv2-v017",
     "axes": "211121",
     "sample": "e64",
     "U": "64",
     "settled_ok": "6",
     "mean_sweeps": "2.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v017",
     "axes": "211121",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "194",
     "mean_sweeps": "1.88",
     "p_trace": "193",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v017",
     "axes": "211121",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "4633",
     "mean_sweeps": "1.58",
     "p_trace": "4632",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v018",
     "axes": "211131",
     "sample": "e64",
     "U": "64",
     "settled_ok": "6",
     "mean_sweeps": "2.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v018",
     "axes": "211131",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "194",
     "mean_sweeps": "1.88",
     "p_trace": "193",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v018",
     "axes": "211131",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "4679",
     "mean_sweeps": "1.57",
     "p_trace": "4678",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v019",
     "axes": "211112",
     "sample": "e64",
     "U": "64",
     "settled_ok": "19",
     "mean_sweeps": "35.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v019",
     "axes": "211112",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "332",
     "mean_sweeps": "37.38",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v019",
     "axes": "211112",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "8468",
     "mean_sweeps": "42.42",
     "p_trace": "6584",
     "p_gap": "1250",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v020",
     "axes": "211113",
     "sample": "e64",
     "U": "64",
     "settled_ok": "19",
     "mean_sweeps": "35.00",
     "p_trace": "5",
     "p_gap": "7",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v020",
     "axes": "211113",
     "sample": "e1k",
     "U": "1000",
     "settled_ok": "332",
     "mean_sweeps": "37.38",
     "p_trace": "167",
     "p_gap": "125",
     "roundtrip": "yes"
    },
    {
     "variant": "wordsv2-v020",
     "axes": "211113",
     "sample": "e10k",
     "U": "10000",
     "settled_ok": "8443",
     "mean_sweeps": "41.33",
     "p_trace": "6628",
     "p_gap": "1250",
     "roundtrip": "yes"
    }
   ]
  },
  "source": [
   "tests/pprog/gen1.tsv",
   "tests/pprog/gen2.tsv"
  ],
  "replaces": "the sentence 'v002 settles 27 of 64 and converges at 14', which named three quantities nothing defined (#pprog_p8v2_gen1_choices)"
 },
 "lsa_ops": {
  "source": "#f-p8, section LSA OPERATIONS USED BY f",
  "theory": "LSA.md",
  "note": "Every operation f performs, in ordinary arithmetic. The draws_entropy column is what decides whether a reimplementation can reproduce a run: the stream is one xorshift32 sequence seeded 0x5EED1234 and SHARED between learning and settling, so an operation that draws is only reproducible by replaying every prior draw in order.",
  "ops": [
   {
    "op": "lsa_inc",
    "arithmetic": "w+1 with probability 1/2^w, else w",
    "saturates": "at 255",
    "draws_entropy": "draws w bits"
   },
   {
    "op": "lsa_add",
    "arithmetic": "log2(2^a + 2^b): the larger of a and b, plus 1 with probability 1/2^d where d = abs(a-b)",
    "saturates": "at 255",
    "draws_entropy": "draws d bits"
   },
   {
    "op": "lsa_sub",
    "arithmetic": "a-b when b<a, else 0 -- division in the count domain",
    "saturates": "at 0",
    "draws_entropy": "no"
   },
   {
    "op": "lsa_max",
    "arithmetic": "the larger of a and b",
    "saturates": "none",
    "draws_entropy": "no"
   },
   {
    "op": "lsa_min",
    "arithmetic": "the smaller of a and b -- the application rule and the AND gate",
    "saturates": "none",
    "draws_entropy": "no"
   },
   {
    "op": "lsa_sum256",
    "arithmetic": "lsa_add folded over 256 entries from index 0 upward, NOT clamped to 255",
    "saturates": "none",
    "draws_entropy": "draws, once per fold step"
   },
   {
    "op": "lsa_ceil_log2",
    "arithmetic": "the smallest e with 2^e >= n; the LSA cost of choosing one of n alternatives",
    "saturates": "none",
    "draws_entropy": "no"
   }
  ]
 },
 "constants": {
  "source": "const: lines of the OFRA blocks in tests/pprog/p8v2-words.md",
  "note": "The numeric constants the design uses, as data. program is the frozen set; per_alternative are the constants an alternative moves, which override the program values under that alternative.",
  "program": {
   "k1_strength": {
    "value": 8,
    "source": "#f-p8"
   },
   "window_W": {
    "value": 128,
    "source": "#f-p8"
   },
   "time_steps_per_window": {
    "value": 128,
    "source": "#f-p8"
   },
   "clamp_weight": {
    "value": 255,
    "source": "#f-p8"
   },
   "entropy_seed": {
    "value": 1592594996,
    "source": "#f-p8"
   },
   "k": {
    "value": 2,
    "source": "#omega-p8-hyper"
   },
   "token_max_length": {
    "value": 64,
    "source": "#omega-p8-hyper"
   },
   "budget_per_k": {
    "value": 256,
    "source": "#omega-p8-hyper"
   },
   "replay_cap": {
    "value": 4,
    "source": "#omega-p8-hyper"
   },
   "and_threshold": {
    "value": 128,
    "source": "#omega-p8-hyper"
   }
  },
  "per_alternative": {
   "f-p8-add": {
    "falloff": 2
   },
   "f-p8-cap8": {
    "k1_strength": 8,
    "falloff": 1
   },
   "f-p8-forward": {
    "k1_strength": 8
   },
   "f-p8-decay": {
    "falloff": 1
   },
   "f-p8-decay-const2": {
    "falloff": 2
   }
  }
 }
}
