Skip to content

Commit 55e6777

Browse files
authored
Merge pull request #1731 from AdaWorldAPI/lab/exo129-learned-lut-composition-20261023
probe(EXO-129): a learned 256×256 table does not compose where the codebook is not closed
2 parents 9b7db23 + e207e5c commit 55e6777

3 files changed

Lines changed: 504 additions & 1 deletion

File tree

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
# 2026-10-23 — EXO-129: does a LUT learned from observed transitions compose? (pre-registration)
2+
3+
**Status:** PRE-REGISTERED (written and committed before any probe code)
4+
**Thread:** TORQUE T-2026-10-23-1, Linear EXO-129. Crumb trail T-CLOSURE (EXO-132).
5+
**Owner:** CC:session_01G22yT6htkcdyXsihxxXdrg
6+
7+
## Question
8+
9+
P-S2 (#1726) showed that `ComposeTable` does not survive two hops. It snaps
10+
`entry[a] ⊕ entry[b]` back to the nearest entry, and most bound pairs land
11+
outside the codebook. This probe asks two things:
12+
13+
1. Does a 256×256 table **learned from observed one-hop transitions**
14+
(`PaletteLut`-shaped, cell = modal next state) compose over k hops where
15+
`ComposeTable` does not?
16+
2. **Mechanism M:** does a data-only statistic, the **purity** `P` of the
17+
learned table (the share of training observations that equal their cell's
18+
modal result), predict how well it composes? This is the testable form
19+
of T-CLOSURE's "is the carrier closed under the operation".
20+
21+
## Setup
22+
23+
- **Operation per hop, with key index `b`:** `x ← x ⊕ entry[b]` in Base17
24+
(`xor_bind`), as in P-S2.
25+
- **Truth for a chain** `(x0, b1..bk)`: `assign(x0 ⊕ e_b1 ⊕ … ⊕ e_bk)`, one
26+
snap at the end. `x0` is a population row, not a palette entry.
27+
- **Arms:**
28+
- **C:** the `ComposeTable` chain from `s0 = assign(x0)`.
29+
- **L:** the learned-table chain from `s0`.
30+
- **Training:** 20 000 trajectories of 6 hops from population rows (seed A).
31+
Each hop records `(assign(x_t), b, assign(x_{t+1}))`. `L[a][b]` is the
32+
modal result. Unobserved cells fall back to `ComposeTable`, and the
33+
unobserved fraction is reported.
34+
- **Test:** 2 000 fresh chains (seed B) for each k = 1..6.
35+
- **Worlds (six settings):**
36+
- **W1 clustered** and **W2 uniform:** P-S2's generators and seed,
37+
palette from `WeightPalette::build`. These are inherited from P-S2, not
38+
built for this probe.
39+
- **W3 group-closed:** 256 palette entries built directly as an XOR group.
40+
`entry[g]` has `dims[i] = 4096` for each set bit `i < 8` of `g`, so
41+
`entry[a] ⊕ entry[b] = entry[a ^ b]` exactly. Population: 4 members per
42+
element, each `entry[g] + u`, with `u` non-negative per-dim noise in
43+
`[0, n]` (non-negative so that XOR never touches the sign bit).
44+
Noise levels: `n ∈ {0, 500, 1500, 3000}`, four settings. Larger noise
45+
lets XOR of noise reach bit 12 and break closure gradually.
46+
47+
## Measures
48+
49+
- `agreement_L(k)` and `agreement_C(k)` for k = 1..6: the share of test
50+
chains whose arm result equals the truth.
51+
- `P` (purity of L on its training observations) and the unobserved-cell
52+
fraction.
53+
54+
## Decision rules (fixed now)
55+
56+
1. **Harness control:** in W3 with n = 0, both L and C read ≥ 0.99 at every
57+
k. Otherwise the harness is broken and nothing below is read.
58+
2. **EXO-129 torque card:**
59+
- **PROMOTE** if L ≥ 0.90 at k = 2 in **both** W1 and W2.
60+
- **KILL** if L < 0.90 at k = 2 in both.
61+
- Mixed: report, and the row stays TORQUE with the next probe named.
62+
3. **Mechanism M:** passes if, over the six settings, the Spearman rank
63+
correlation between `P` and `agreement_L(2)` is ≥ 0.9. The prediction
64+
`agreement_L(k) ≈ P^k` (independent per-hop errors) is reported with its
65+
residual, but it does not gate.
66+
4. **Disables (both must behave, or no claim is made):**
67+
- **D1:** shuffle L's result bytes across cells. Agreement at k = 2 must
68+
drop to ≤ 0.10 in every setting.
69+
- **D2:** set L := C. This must reproduce C's numbers exactly.
70+
71+
## Applying GOLDSTAUB G-2026-10-23-1 to this probe
72+
73+
The world that passes by construction is W3 with n = 0. That is why it is
74+
only a harness control. The world expected to fail is W2, which has no
75+
structure for a table to learn. So no conclusion is drawn from a single
76+
world's pass or fail:
77+
78+
- the **mechanism** verdict comes only from M across the six settings;
79+
- the **torque** verdict comes from W1/W2, which P-S2 fixed before this
80+
probe existed.
81+
82+
## Results (2026-10-23, after the run; nothing above was changed)
83+
84+
`cargo test --release --test exo129_learned_lut_probe -- --nocapture`
85+
(bgz-tensor, debug info off). Agreement with the truth at k = 1..6:
86+
87+
| setting | purity P | unobserved | L k=1 | L k=2 | C k=1 | C k=2 | L k=6 | C k=6 |
88+
|---|---|---|---|---|---|---|---|---|
89+
| W1 clustered | 0.471 | 0.199 | 0.242 | **0.017** | 0.579 | 0.029 | 0.005 | 0.005 |
90+
| W2 uniform | 0.479 | 0.170 | 0.112 | **0.009** | 0.279 | 0.027 | 0.005 | 0.005 |
91+
| W3 n=0 | 1.000 | 0.159 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 |
92+
| W3 n=500 | 1.000 | 0.159 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 |
93+
| W3 n=1500 | 1.000 | 0.159 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 |
94+
| W3 n=3000 | 0.544 | 0.340 | 0.263 | 0.145 | 0.231 | 0.260 | 0.041 | 0.248 |
95+
96+
- **Rule 1 (harness control):** holds. W3 with n = 0 reads 1.000 for both
97+
arms at every k.
98+
- **Rule 4 (disables):** both hold.
99+
- D1 (shuffled table) reads ≤ 0.005 at k = 2 in every setting.
100+
- D2 (L := C) reproduces C exactly.
101+
- **Rule 2 (torque): KILL.** L reads 0.017 / 0.009 at k = 2 in W1 / W2,
102+
against the 0.90 bar. The learned table is worse than `ComposeTable`
103+
there, even at k = 1.
104+
- **Rule 3 (mechanism M): PASS by the registered rule**, Spearman ρ = 0.935,
105+
**but the evidence is thin.** Four of the six settings tie at P = 1.0 /
106+
agreement = 1.0, so the rank correlation rests on three distinct points.
107+
The unregistered magnitude prediction `agreement_L(k) ≈ P^k` fails badly:
108+
W1 k = 2 is 0.017 against P² = 0.222.
109+
- **Pin:** both verdicts are asserted in the test. Disable run: inverting
110+
purity (`1 − P`) makes the M assertion fail, so the pin is real.
111+
112+
### What the numbers say (reading, not a ruling)
113+
114+
- **Purity < 1 means the palette state is not Markov for this operation.**
115+
The cell does not determine the next cell: members of one cell go to
116+
different cells. In W1/W2 the purity is about 0.47. No 256×256 table
117+
can compose there, learned or derived, because one byte of state does not
118+
carry the information the next hop needs. In Markov-chain terms this is a
119+
**lumpability** failure (Kemeny–Snell): the partition is not lumpable for
120+
the operation. That is a candidate name for trail T-CLOSURE. It is not
121+
adopted here.
122+
- **Learning made W1/W2 worse at k = 1** (0.242 vs C 0.579). Training cells
123+
pool starts from population rows with states reached after several hops,
124+
and 5/6 of the observations are reached states. The modal result then
125+
favours the reached-state distribution, while the test starts from
126+
population rows. This is a real cost of the pre-registered design, and it
127+
is itself a non-lumpability symptom: where in the cell a state sits
128+
matters.
129+
- **W3 n=3000 separates two error sources.** C stays flat at about 0.25 from
130+
k = 1 to 6. The table is the exact group law, so composition adds no
131+
error, and the loss comes from the start and end snaps alone, which
132+
depend on the fixed member noise. L decays (0.263 → 0.041), because its
133+
cells were filled from mis-snapped observations. A closed carrier
134+
therefore composes with its exact law even when snapping is noisy. A
135+
table learned from noisy snaps does not.
136+
137+
### Closeout
138+
139+
PR (this branch) | STATUS: measured | OUTCOME: a learned 256×256 table does
140+
not compose where the codebook is not closed (KILL); purity < 1 marks those
141+
cases, with thin rank evidence (M PASS on three distinct points) |
142+
OPEN: whether a purity bar (for example P ≥ 0.99) predicts composition on
143+
real Moore/DR pair data. That needs labelled data (GOLDSTAUB
144+
G-2026-10-23-1).

‎.claude/board/entries/README.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@ index row, (3) no duplicate entry id. Checks 1 and 2 are deliberately
2525
opposite directions; the stranding this convention prevents shows up in
2626
exactly one of them, never both.
2727

28-
443 entries, 2026-08-06 .. 2026-10-23.
28+
444 entries, 2026-08-06 .. 2026-10-23.
2929

3030
| date | entry id | finding | file |
3131
|---|---|---|---|
3232
| 2026-10-23 | `ps2-compose-chain-preregistration` | | [2026-10-23-ps2-compose-chain-preregistration.md](2026-10-23-ps2-compose-chain-preregistration.md) |
3333
| 2026-10-23 | `ledger-revision-1635-1726` | | [2026-10-23-ledger-revision-1635-1726.md](2026-10-23-ledger-revision-1635-1726.md) |
34+
| 2026-10-23 | `exo129-learned-lut-preregistration` | | [2026-10-23-exo129-learned-lut-preregistration.md](2026-10-23-exo129-learned-lut-preregistration.md) |
3435
| 2026-10-22 | `probes-pd4-pe2-pd3` | | [2026-10-22-probes-pd4-pe2-pd3.md](2026-10-22-probes-pd4-pe2-pd3.md) |
3536
| 2026-10-22 | `pal256-salience-mp3-probe` | | [2026-10-22-pal256-salience-mp3-probe.md](2026-10-22-pal256-salience-mp3-probe.md) |
3637
| 2026-10-22 | `pal256-nars-bayes-evidence-contract` | | [2026-10-22-pal256-nars-bayes-evidence-contract.md](2026-10-22-pal256-nars-bayes-evidence-contract.md) |

0 commit comments

Comments
 (0)