Skip to content

#4 M0 predictability harness → GATE: FAIL - #4

Merged
schmug merged 2 commits into
mainfrom
issue-4-m0-harness
Jul 14, 2026
Merged

#4 M0 predictability harness → GATE: FAIL#4
schmug merged 2 commits into
mainfrom
issue-4-m0-harness

Conversation

@schmug

@schmug schmug commented Jul 14, 2026

Copy link
Copy Markdown
Owner

#4 — M0 predictability harness → GATE: FAIL

harness/m0_gate.py: per-(source,gen,indiv) trajectories → 32-step windows → six
predictors of s_{t+1} (persistence, mean, ridge, MLP, GRU, ctx-32 transformer),
scored per-sensor R² on held-out trajectories. All models share the identical
(context,target) test set; NN models train on per-sensor-standardized targets for a
fair fit. Aggregate R² is never reported; constant gate sensors are const (ΔR²≡0).

GATE: FAIL — on the evolved gen-119 population (5 seeds): mean ΔR² = −0.0019
over the 11 non-trivial sensors (need > 0.05), transformer wins 1/11 (need ≥ 6).
The criterion was not modified.

Why: persistence already wins. 4 of 11 gate sensors are dead constants
(BARRIER_FWD/LR, LONGPROBE_BAR_FWD — no barriers; SIGNAL0 — evolution selects
emission away); the other 7 sit at persistence R² ≈ 0.99. Fails at gen 0 too, so the
verdict is structural. See RESULTS.md and data/m0_report.html.

Acceptance

  • Per-sensor table (6 predictors + ΔR²) + explicit GATE: line.
  • Runs on the bundled sensors_gen0_gen4.csv smoke fixture without error.
  • python3 harness/test_m0_gate.py → 9/9 (incl. a PASS case and constant handling).

RESULTS.md: the number, what it means, and the recommended first world-enrichment
lever (moving barriers via replaceBarrierType, after restoring Miller-level
mutation) for #5.

schmug and others added 2 commits July 14, 2026 17:57
harness/m0_gate.py reconstructs per-(source,gen,indiv) trajectories from sensor
CSVs (.gz supported), builds 32-step context windows, and fits six predictors of
s_{t+1} — persistence, per-sensor mean, ridge (s_t only), MLP, GRU, and a ctx-32
transformer (d64/4L/4H) — scoring PER-SENSOR R^2 on a held-out split of whole
trajectories. All predictors share the identical (context, target) test set, so
dR^2 over persistence is apples-to-apples.

The gate (SPEC §2, fixed): the transformer must beat persistence by mean dR^2 >
0.05 AND on >= 6 of the 11 non-trivial sensors. Aggregate R^2 is never reported —
AGE/OSC1 are free ~1, RANDOM free ~0, LOC_*/BOUNDARY_* already near-perfect under
persistence. Zero-variance gate sensors are reported as `const` (persistence exact,
dR^2=0, non-winnable) rather than crashing on 0/0.

The three NN models train on per-sensor-standardized targets (equal loss weight)
and are scored on the raw scale, so low-variance sensors like POPULATION get a fair
fit rather than being ignored by the optimizer.

- harness/test_m0_gate.py — 9 unit tests (R^2 edge cases, window alignment, gate
  math incl. a PASS case and constant-sensor handling). All pass.
- scripts/build_report.py — renders gate JSON(s) into a self-contained HTML report.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ran the harness on the #3 evolved population (5 seeds, gen 119, 87 200 windows,
17 440 held out) and a gen-0 contrast.

GATE: FAIL — mean ΔR² = -0.0019 over the 11 non-trivial sensors (threshold > 0.05),
transformer beats persistence on 1/11 (need >= 6). The criterion was NOT modified.

Why: persistence already wins. 4 of the 11 gate sensors are dead constants
(BARRIER_FWD/LR and LONGPROBE_BAR_FWD — no barriers; SIGNAL0 — evolution selects
signal emission away), and the other 7 already sit at persistence R² ~0.99, leaving
no headroom. The gate also fails at gen 0, so the verdict is structural, not an
artifact of the (weak) evolution observed in #3.

- RESULTS.md — the number, what it means, robustness, caveats, and the recommended
  world-enrichment lever (moving barriers via replaceBarrierType, after restoring
  Miller-level mutation) for issue #5.
- data/gate_gen119.json, data/gate_gen0.json — full per-sensor records.
- data/m0_report.html — self-contained per-sensor table + verdict (both gens).
- README: M0 status = FAIL.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant