core/docs/research/dev2-frontier-measurement-spike-2026-07-18.md
Shay 09172da204 docs(reader-arc): fold PR #76 amendments into compare increment plan; X=15 ratified
Four amendments (Shay, #76 review) folded:
1. Summation registers-driven (NEW CODE): summation orders by program.seeds
   (initial_state) today, so a compare-DEFINED register (no seed) is silently
   excluded from the total — all 5 real cases are totals. Fix: sum all registers
   at solve time, deterministic order (seed order then definition order);
   compile-side validation admits defined entities as answer targets with unit
   propagation from the reference. Pin: defined register in the certified sum.
2. Compare record spec: record identifies the reference entity + binds the
   reference state digest via the existing conditional operand_source_digest
   (non-compare/non-summation digests unchanged); deterministic re-verification
   reconstructs the dilation's source register from records alone.
3. Tune/measure split pinned deterministically (sha256(id)-ordered) FIRST,
   before any grammar work, documented + fixed in advance.
4. 'N times more than' pinned to N× as a disclosed convention; gold mismatches
   tracked as recorded findings, never silent wrongs.

X = 15 ratified as the arc escalation threshold (spike §7.3 updated). §6 risks
reclassified (risk 4 -> new code §3.1; risk 1 -> pinned convention §4). Build
proceeds under this ruling — no separate re-ruling.
2026-07-18 16:07:41 -07:00

203 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# dev-holdout-2 / Frontier-Measurement Spike — verdict
**Status**: SPIKE VERDICT — for ruling before any build
**Date**: 2026-07-18
**Base**: `forgejo/main @ b87cd46c` (ADR-0249 + ADR-0250 Accepted; compiler solves the authored dev/public corpus)
**Branch**: `feat/dev2-frontier-spike`
**Charge (Shay)**: public-seal + floors; the Reader A answer; the raw-incidence measurement with an
(a)/(b)/(c) verdict; the draw-protocol trace — before building anything.
---
## 0. Headline correction (load-bearing — read first)
**`evals/gsm8k_math/dev` (50) and `public` (150) are NOT real GSM8K.** ADR-0119.2 authors them as
200 **CORE-original, GSM8K-*style*** problems written in CORE's own vocabulary/grammar to a chosen
operation distribution (case notes: "Generated public case exercising divide operations"). My
ADR-0249/0250 evidence called these "the real GSM8K dev holdout" — that is inaccurate and should be
corrected to "CORE-authored GSM8K-style." The compiler's verified result is **200/200 wrong=0 on
authored, grammar-matched, mostly depth-1 problems** — a real validation of the *mechanism*, not of
real-GSM8K capability.
## 1. Draw-protocol trace (Shay's ask: was the draw annotability-conditioned?)
| Slice | Real GSM8K? | How drawn |
| :--- | :--- | :--- |
| `train_sample` (50) | **Real** | `openai/gsm8k` main/train, rev `740312a…`; deterministic `sha256(f"{i}:SALT")` rank, top 50. What the grammar was hand-built against (overfit). |
| `holdout_dev/v1` (500) | **Real** | train split minus train_sample, sorted by `sha256(question)`, first 500. "Real GSM8K CORE was NOT built on." |
| sealed test (1,319) | **Real** | GSM8K test split, sealed (`.age`). |
| **`dev` (50), `public` (150)** | **Authored** | **CORE-authored** (ADR-0119.2), CORE grammar, chosen op/depth distribution. |
So (b) is not subtle "selection bias in a real draw" — it is **authoring**: dev/public are synthetic
and their frontier-freeness is an authoring choice, carrying zero information about real GSM8K's
distribution. The real draws (train_sample, holdout_dev) are unbiased and were the right place to
measure all along.
## 2. The real measurement (end-to-end on 500 real holdout_dev cases)
Pipeline: real text → `parse_and_solve` (Reader A) → my compiler (Tier-1/Tier-2) → execute → gold.
| Metric | Value |
| :--- | :--- |
| Reader A parses a graph | **5 / 500 (1%)** — refuses **495** |
| Reader A own solver correct | 5 / 500 (1%) |
| **My compiler solved** | **0 / 500** |
| …compiler wrong | 0 (fail-closed held) |
| The 5 parsed graphs' op kinds | **all `compare_multiplicative`** (a frontier kind) |
Corroborates the holdout_dev README's 2026-06-04 baseline ("real GSM8K capability 0%"). The compiler
solves 0 real cases — not because it is wrong, but because the reader feeds it only 5 graphs and those
5 are a frontier kind the affine compiler refuses.
## 3. Censored-incidence fix — the parse-independent measurement
The 500-run's op-kind incidence (§2) is **censored data**: it reads kinds only from the 5 graphs the
reader produced, so it says nothing about what the 495 refusals *need*. To answer (b)-vs-(c) honestly,
frontier incidence must be measured **around** the refusing reader. Protocol: the first **100** of the
sha256-ordered holdout_dev (deterministic), classified by **keyword/pattern markers in the raw text**
— parse-independent, multi-label, imperfect (a marker need not mean the op is required; over/under-count
possible), but the *scale* is robust to that noise.
| Frontier kind (marker) | Incidence /100 |
| :--- | :--- |
| `apply_rate` ("per", "each … costs", "every …") | **31** |
| `fraction_portion` ("half", "third", "%", "a/b") | **28** |
| `compare_multiplicative` ("twice", "N times as many") | **20** |
| `compare_additive` ("more/fewer than") | 9 |
| `unit_partition` ("split into", "divided among") | 1 |
| **basic-only (no frontier marker)** | **30 / 100** |
| **≥1 frontier marker** | **70 / 100** |
## 4. The (a)/(b)/(c) verdict (de-censored)
- **(a) — DOMINANT. Real GSM8K is reader-gated.** Reader A refuses 495/500 at parse; text does not
become graphs. A *mechanism* gap in the reader, not the compiler's affine scope.
- **(b) — CONFIRMED as authoring bias.** dev/public are authored frontier-free; they carry zero
information about real GSM8K's distribution. Every "real GSM8K" claim on them needs the correction.
- **(c) — REFUTED, now with parse-independent evidence.** The frontier is **common, not rare**:
**70/100** official problems carry frontier markers; rate + fraction alone appear in ~55%. Widening
off-serving capability against this frontier does NOT fail the decidable-done-when test — the reader
reaching it does.
**Bonus: this table is the reader arc's curriculum, ordered by real-world frequency** — rate (31) →
fraction (28) → compare_multiplicative (20) → compare_additive (9) → partition (1). Practice earns the
most real coverage by attacking rate/fraction/comparison first.
## 5. Two instruments, cleanly named, both kept (ruling)
The finding is a **reframe, not a retraction** — nothing measured is thrown away, it is relabeled.
- **Authored corpus = the mechanism-correctness instrument.** A controlled curriculum that proved the
compiler end-to-end. Its **200/200 wrong=0 stands, as exactly that** — evidence the mechanism
(versor transport + chained certified relaxation + conservation + atomicity + chain-of-custody) is
correct on clean inputs.
- **Official holdout = the generalization instrument.** `holdout_dev` (500), sealed test (1,319) —
real GSM8K, never authored.
**The scoreboard, never blended:**
| Instrument | Slice | Score | Reads as |
| :--- | :--- | :--- | :--- |
| Mechanism-correctness | authored (200) | **200/200 wrong=0** | the compiler is correct |
| Generalization | official holdout_dev (500) | **5/500 Reader-A-symbolic · 0/500 corridor** | real reach is ~0 |
Seal `public` and pin both floors (dev-1 50/50, public 150/150) — but **label them mechanism floors,
not coverage claims**, each carrying an op-kind histogram + ops-per-case depth + the authored-not-real
flag (public: depth-1, divide 53 + transfer 97). A regression floor that guards mechanism correctness;
it says nothing about real-GSM8K coverage, and the record must say so.
## 6. Sequencing verdict (resolved by the data)
The three-branch skeleton doesn't fire: the frontier is common (§3), so "frontier-rare → serve
landing" is out; and the biggest bucket isn't a compiler tier — **it's the reader** (495/500). Stated
plainly: **corridor real end-to-end capability is 0/500, so serve-landing of corridor arithmetic loses
priority — there is nothing real-reaching to serve.** §3.7 calibration stays queued; the **reader
practice volume is what eventually generates §3.7's calibration data.** Order unchanged:
**capability → practice → calibration → serve** — and the reader arc is now the **critical path for all
three**.
## 7. The arc (RULED) — reader, design-first: per-family increments in lockstep
Superseding §10's practice-loop recommendation: the frontier being **common, formulaic, and
frequency-ordered** (§3) argues *for* designed grammar-family extensions, not against — a formulaic
frontier is exactly what designed grammar eats efficiently, each increment cheaply measurable.
**Learning earns its complexity only when design stops paying — decided by number, not feel.** The
practice loop is the paper-designed backup (§7.4), not the arc.
### 7.1 Increment = a grammar family + its compiler tier, landed together
Reader and compiler move in **lockstep**. §2 is the proof they cannot move separately: the 5 real
`compare_multiplicative` parses **die at the affine compiler today** (reader emits, compiler refuses →
0/500). A reader family with no compiler tier produces graphs nothing solves; a compiler tier with no
reader family has no inputs — that is the *only* thing §10.2 de-prioritizes. **Paired, they are the
arc.** Each increment is its own smoke-gated PR carrying a measured `holdout_dev` delta (new correct),
the `wrong=0` floor held, and the sealed test untouched.
### 7.2 Increment order
1. **`compare_multiplicative` FIRST** — jumps the §3 frequency queue because the reader *already emits
real parses for it* (the 5/500), so pairing a compare compiler tier moves corridor real-reach from
**0/500 → >0 immediately** — the cheapest possible end-to-end proof the increment loop works on
official data.
2. Then strict §3 frequency order: **rate (31) → fraction (28) → compare_additive (9) → partition (1)**.
### 7.3 Escalation threshold X — **RATIFIED (Shay, 2026-07-18, PR #76): X = 15**
Fixed before anyone is attached, so "switch when design stops working" cannot drift.
**X = 15 new-correct on `holdout_dev` per full family increment.** When a completed increment
buys fewer than X, escalate to a practice-lane ruling. Rationale: these families carry 2031% incidence
(~100155/500 problems each); a design that is paying converts far more than 15, so falling below
15/500 (3%) means design has stopped efficiently converting known incidence — a number trips the
switch, not a feeling.
### 7.4 Backup lane — the practice loop (PAPER DESIGN only; starts warm if X trips)
Same decidable loop (`attempt-parse → compile → execute → gold-check`, wrong=0-gated). Its leverage —
how it reuses what these arcs already built, so only two things are genuinely new:
- **Verifier** = the Tier-1/Tier-2 compiler stack: a candidate parse is correct **iff**
`compile → execute → gold` agrees. No separate oracle.
- **Audit** = the certificate chains (`RelaxationCertificate`, `TurnRecord`, chain-of-custody).
- **Consolidation gating** = `prepare → validate → commit` generalized: a candidate consolidates only
on full success.
- **Holdout hygiene** = ADR-0119 sealing (split discipline; sealed test untouched).
- **Genuinely new** = a **candidate generator** (proposes parses/grammar variants) + a **consolidation
store** (what survives wrong=0). That is the whole delta the lane adds.
### 7.5 Non-negotiable constraints (bind the increments now; carry to the lane verbatim)
1. Eval/practice signal is **real held-out official data only** — never the authored corpus (§3's
200/200-vs-5/500 gap is the overfit fingerprint).
2. `wrong=0` gates what consolidates / lands.
3. The sealed test (1,319) is **never touched** — final exam only.
4. `holdout_dev` **splits**: tuned/practiced-against cases disjoint from the measured metric split —
"getting better" can only mean "generalizes to real problems."
### 7.6 Design-first work IS the backup's curriculum (record, don't discard)
Every increment's refusal taxonomy, tagged incidence, and labeled `(parse, compile, execute, gold)`
tuples are **practice-lane artifacts**, not throwaway — the labeled data + failure map a candidate
generator would train against. Design-first pre-pays the backup's cold-start.
## 8. Errata proposal — ADR-0249 / ADR-0250 (statuses stay Accepted)
A prominent **errata section** (not silent rewording) is added to both ADRs and their acceptance
evidence, and to the PR #74 review record: the mechanism claims all survive; the single correction is
the corpus label — **"real GSM8K dev holdout" → "CORE-authored GSM8K-style corpus (ADR-0119.2)."** The
record thus shows we caught our own mislabel, which is the honest-measurement doctrine working, not a
failure to hide. (Errata text lands in this PR alongside the spike.)
## 9. The generalization reframe (Shay, live)
"Generalize, don't overfit" is right, and the compiler honors it: it is a general *mechanism*, not
memorized answers. The measurement only forces one distinction — **mechanism-generality ≠ real-problem
coverage.** The mechanism is general but starved: 1% reader reach, affine scope. The reader practice
loop is precisely how that value becomes real coverage without re-introducing the overfit.
## 10. Ruling outcome (Shay, on this PR)
The arc is the **reader, design-first**: per-family increments — a grammar family in Reader A plus its
matching compiler tier, landed **in lockstep** (§7) — starting with **`compare_multiplicative`**, then
strict §3 frequency order (rate → fraction → compare_additive → partition). Each increment is its own
smoke-gated PR with a measured `holdout_dev` delta, `wrong=0` held, sealed test untouched.
The **practice loop is the paper-designed backup** (§7.4), not the arc; it starts warm only if a full
increment buys **fewer than X = 15 new-correct on `holdout_dev`** (proposed §7.3, Shay rules with the
merge). §5 (mechanism floors + never-blended scoreboard), §6 sequencing
(capability → practice → calibration → serve; serve-landing deferred at 0/500), the errata (§8), and
the four non-negotiable constraints (§7.5) are affirmed and merge with this.
**Next: the `compare_multiplicative` increment plan as the arc's first PR. Nothing else starts.**