# EXP-54: does teaching only where the answer differs (upstream PR #197) let a label's content through?

- Date: 2026-10-14 | Cadence version: PR #197 head `8d99c75` (0.83.0 + the opt-in `learning_surprise` gene, unmerged), pinned in worktree `~/_cadence_197` | Program iter: none (teaching track; the content-carrying-channel test EXP-53 asked for, and an outside development reading for #197)
- Script: `exp/EXP-54_surprise_teaching.py` | Evidence: `exp/EXP-54-check.*`, `exp/EXP-54-pilot.*`, `exp/EXP-54-full.json/.jsonl/.out`

## Summary
- Question: EXP-53 found a teacher that knows the whole chain worth no more than one labelling at random, at every lesson length. PR #197 adds `Brain.compose(..., learning_surprise=True)`: a lesson teaches only the rows whose answer (the settle the brain's act reads) differs from the label, and the episodic memory records only the taught rows. Its stated reason is that repeated lessons on cases a brain already answers saturate its readout. If that saturation is what hid content in EXP-53, the gene should let it through.
- Setup: EXP-53 exactly (EXP-48's weather chamber, the default memory brain, labels on every executed mistake in a guided window, 40/120/240 lesson attempts, 20 alone through `live`, per-state greedy accuracy on unseen weather), same student seeds and world draws, with `learning_surprise=True`. Arms: know-4, random labels, untaught. The every-row arms are EXP-53's rows for the same seeds (valid only if P0 holds). Lessons taught and dropped as agreeing are counted per arm from `last_learning`.
- RUN GATE: (1) prediction below, written before any run. (2) Window: a pilot of 3 students per length at exact run conditions; EXP-53 sets the every-row expectation (know-4 .714/.742/.820, random .701/.635/.753). (3) Variance: paired twins share seed and world draws; the gene effect is paired against EXP-53's row for the same seed. (4) Metric: content under surprise (know-4 minus random), paired per student. (5) Chain: gene on -> agreeing lessons dropped (mostly know-4's) -> know-4 / random accuracy -> content.
- Prediction (written before any run):
  - (P0, gate) With `learning_surprise=False` the pinned PR head reproduces EXP-53's rows bit-identically (students 0 and 1 at 40), and the untaught twin under the gene equals EXP-53's untaught twin for every student (the gene only touches lessons). Fails -> the comparison to EXP-53 is invalid; stop and rerun the every-row arms in-run.
  - (P1, mechanism) Under the gene, know-4 drops a larger share of its lessons as agreeing than random does, at least twice random's share at 240.
  - (P2, headline) Under the gene, content at 240 is >= .10 and more than 2 SEM above zero.
  - (P3) The gene does not hurt the know-4 student: know-4 under the gene minus know-4 every-row, paired, is >= 0 at both 120 and 240.
- Decision rule (written before any run): P2 holds -> lessons only where the answer differs are a channel that carries content in a continuing life; Noesis-lite v2 can price teaching through it, and the reading goes to #197 as an outside development reading (Will-gated). P2 fails -> in a protocol that already labels only executed mistakes, the rule is not what hid content; P1 says how much it removed, and the next content test moves to a different channel (demonstrations at every decision, settled lessons, or EXP-45's delayed-credit brain).
- P0 gate (`exp/EXP-54-check.out`): gene off at the pinned PR head reproduces EXP-53's rows bit-identically (students 0 and 1 at 40, all three twins). Held, so EXP-53's rows are a valid every-row control.
- Pilot (3 students per length, `exp/EXP-54-pilot.out`), read before the full run: untaught equal to EXP-53 at every student; the gene dropped about a fifth of lessons for both teachers (know-4 .17 to .22, random .19 to .25); content +.06 / +.42 / -.15 at SEM .09 to .20, direction only. No floor or ceiling; no design change. Two free-phase budget warnings appeared; see the side check below. The full run reuses the pilot rows and adds 21 students per length.
- Result (24 students per length, paired twins; per-state accuracy on unseen weather after 20 attempts alone; every-row = EXP-53's row for the same seed):

  | lesson | know-4 | random labels | untaught | content under the gene (SEM) | content every-row | gene effect on know-4 (SEM) | gene effect on random (SEM) | lessons dropped as agreeing, know-4 / random |
  |---|---|---|---|---|---|---|---|---|
  | 40 | .633 | .641 | .453 | -.008 (.077) | +.013 | -.081 (.067) | -.060 (.081) | .163 / .213 |
  | 120 | .781 | .656 | .695 | +.125 (.077) | +.107 | +.039 (.059) | +.021 (.078) | .136 / .203 |
  | 240 | .755 | .753 | .659 | +.003 (.062) | +.068 | -.065 (.063) | +.000 (.067) | .125 / .203 |

  P0 HELD (and the untaught twin equals EXP-53's at all 72 students: the gene touches lessons only). P1 FAILED, in the opposite direction: random labels are dropped at chance (.20 of 5 actions), know-4 labels less often (.13 to .16), because right after an executed mistake the brain's own answer is mostly the mistake it just made, so it rarely agrees with the right action. P2 FAILED (content at 240 is +.003). P3 FAILED at 240 (-.065, within 1 SEM; +.039 at 120).
- Side check (`exp/EXP-54_side_budget_probe.py`, 12 students per condition at 120 and 240, gene off and on): the founder's free phase runs out of its `free_steps` budget on about 0.1 to 0.5% of lessons with or without the gene (know-4 8 of 1509 off, 7 of 1616 on; random 3 and 3). The warnings in this run's log are a property of the founder in this protocol, not of #197; EXP-53's log did not show them because its stderr was not kept.
- Verdict: NULL. The gate held; 0 of 3 substantive predictions held. Decision rule: P2 failed, so in a protocol that labels only executed mistakes the surprise rule is not what hid content. It removed 12 to 16% of the perfect teacher's lessons and the chance fifth of the random teacher's, and the content gap stayed within noise at every length.

## Reflection
- What it means: PR #197's rule acts where a brain is shown answers it already gives, and this protocol hardly ever does that: the label arrives only after an executed mistake, and at that moment the brain's own answer agrees with the right action less often than chance. So EXP-53's null is not the readout saturation #197 names, at least not through mistake-only lessons. For #197 this is a narrow outside reading: on a continuing life with episodic memory, mistake-triggered teaching, the rule is close to a no-op for a correct teacher and costs nothing measurable (gene effect within 1.3 SEM of zero at every length, untaught twin bit-identical). It says nothing about the cases the PR targets (row-by-row sequences shown for many passes, repeated lessons on answered rows).
- Process: pre-registered before any run, gate before pilot, pilot read before the full run, no design change; every-row arms reused from EXP-53 only after the gate proved them bit-identical at the pinned PR head; the PR pinned in its own worktree (`~/_cadence_197`, `8d99c75`) so the main clone stays at 0.83. P1 was written expecting the rule to thin the perfect teacher's lessons; the opposite came out, and the reason (the post-mistake answer repeats the mistake) is the most useful thing the run produced. Limits: one chamber, one teaching protocol, the default memory brain, 24 students per length, an unmerged PR head.
- Lesson: before testing a rule that filters lessons by the learner's own answer, measure how often the answer agrees with the label at the moments the protocol teaches; if the protocol only teaches after mistakes, that rate is near or below chance and the filter has nothing to remove.
- Next: the test where #197's rule has something to remove: demonstrations at every guided decision (not only after mistakes), every-row against surprise, know-4 against random. If content shows up there under the gene, it is both the content-carrying channel Noesis-lite needs and the reading #197 asks for.
