Phase 2 of the generalization arc, implementing the plan's §4 curriculum-entailment gold contract. "Does force cause acceleration?" is answered from the ratified physics chain corpus and nothing else; "Does gravity cause acceleration?" is declined because gravity is in no pack CORE has been taught; "Does force cause motion?" is unsettled even though the curriculum contains both links, because nothing ratified says causation composes. Path (flag-gated, default off): closed question grammar -> subject routing by ratified vocabulary -> family-scoped premise compilation from reviewed, pack-resident chains -> the SAME argument bands (ADR-0260/0261) -> the ROBDD engine. Zero subject-specific decision code: physics differs from philosophy only in which rows load. Epistemology enforced mechanically, not by convention: - gold is a function of (curriculum, question); cases pin chain ids and the runner FAILS a case whose pinned chain is absent or unratified; - untaught => UNKNOWN, never "no" (open-world; silence is not denial); - an independent oracle (own loader, ratification predicate, family table, agreement rules, verdict rule) re-derives every gold — it disagreed once, on "entropy reveals energy" vs "entropy causes energy", and the ORACLE was the side that was wrong; - anti-recall probes are a lane GUARD: a split without >=3 true-but-untaught probes refuses to run. Findings recorded rather than worked around (ADR-0262 §5): - every curriculum band is UNEARNED and every answer is hedged. A band needs n>=657 with a real outcome mix; physics teaches 7 causal + 9 modal relations, so at most 16 questions in the subject can ever be ENTAILED. A balanced band needs ~219 taught relations per subject×family — a ~25x gap that only ratified curriculum content closes. Phase 2's blocker is curriculum volume, not machinery. - REFUTED is unreachable from present corpora (every chain is positive). - there is NO biology domain-chain corpus; the biology OOD lane measures fluency, not truth. The four subjects with ratified chains and mounted packs are physics, mathematics_logic, systems_software, philosophy_theology — the composer serves all four. [Verification]: curriculum lane 32/32 wrong=0 with 5 anti-recall probes and all three contract guards passing; tests/test_curriculum_serve.py 20 passed; core test --suite deductive 252 passed; lane pinned as curriculum_serve_v1.
6 KiB
Curriculum-grounded serving — the first exam answered from what was taught
Date: 2026-07-24 · ADR: ADR-0262 · Arc: generalization Phase 2 (Tier O)
What shipped
"Does force cause acceleration?" is now answered — from the ratified physics chain corpus and nothing else. "Does gravity cause acceleration?" is declined, because gravity is not in any pack CORE has been taught. "Does force cause motion?" comes back unsettled, even though the curriculum contains both links in that chain, because nothing ratified says causation composes.
That third answer is the one worth staring at. It is the difference between a system that decodes a curriculum and one that pattern-matches over it.
The lane: 32 hand-authored physics cases, wrong=0, five anti-recall probes, an independent oracle re-deriving every gold, and three contract guards that fail the LANE (not the case) if provenance, soundness, or anti-recall coverage lapses. 20 unit tests. Zero subject-specific decision code: the composer routes by vocabulary, compiles premises from ratified chains, and hands the result to the same argument bands that decide "All philosophers teach. Socrates is a philosopher."
The design decision that carried the weight
The plan fixed the epistemology in §4 before any code existed, and that turned out to matter more than any implementation choice. Three of its clauses did real work:
- Gold is a function of (curriculum, question). No hidden premises in the case file. A case pins chain ids; the runner reconstructs premises from the corpus and fails loudly if a pinned chain is absent or unratified. A curriculum that moves under a case breaks the case instead of quietly changing its answer.
- Untaught ⇒ UNKNOWN, never "no". Open-world reading. Manufacturing a negative from silence is the same error as manufacturing a positive from it, and it is the more tempting one because it feels like rigor.
- Anti-recall probes are mandatory. The runner refuses to score a split that does not contain questions whose answers are true in the world and absent from the curriculum. Without them the lane cannot distinguish decoding from recall, so it must not ship.
Where the independent oracle earned its keep
The oracle disagreed with the serving path exactly once during authoring: "Does entropy cause energy?" The curriculum teaches entropy reveals energy. The serving path said UNKNOWN — different relation, different atom. The oracle said ENTAILED, because I had written its edge lookup to match on relation family rather than the relation itself.
The oracle was wrong, and the serving path was right. That is the useful shape of the result: an independent check is worth building even when — especially when — you expect it to agree, because the thing it catches is the assumption you did not notice you had made. Family scoping decides which premises are in play; the connective decides what was actually said.
A second authoring error surfaced the same way: two lane cases claimed both
directions of field requires charge were taught. Only one is. The provenance
and soundness guards caught it before the case file was committed.
The finding: Phase 2's blocker is curriculum volume, not machinery
Every curriculum_* band is unearned, so every answer is served hedged. That
is not a shortcut around the license — it is the license working, and the
reason is arithmetic.
A band earns SERVE at θ_SERVE=0.99 with n ≥ 657 committed cases and a genuine outcome mix. The question space is large enough (physics: 240 distinct questions per family; philosophy_theology: 22,650). The entailed space is not: physics teaches 7 causal and 9 modal relations, so at most 16 questions in the entire subject can come back ENTAILED. Repeating them to reach 657 inflates n without adding information, and a band whose entailed class is 1% of its volume is passed by a pipeline that never entails anything at all.
A balanced band needs roughly 219 distinct taught relations per subject × family. Physics has 7 and 9 — a ~25× gap. No sampling scheme closes it. What closes it is ratified curriculum content, which is an authoring and ratification decision, not an engineering one.
So the honest state of Phase 2: the lifecycle is ported and provably correct on real curriculum data; the earned-license half is blocked on how much has been taught. That is a much better problem to have than the reverse, and it is the one the plan's own doctrine (capability → practice → calibration → serve) predicts you would hit here.
Two corrections to the plan's ground truth
- There is no biology domain-chain corpus. The plan names physics and
biology as Phase 2's subjects on the basis that "OOD lanes, seed packs, and
domain chains already exist". For biology the first two are true; the third
is not, and
evals/foundational_biology_ood's own contract says it measures fluency, not truth. The subjects with ratified chains AND mounted packs are physics, mathematics_logic, systems_software, and philosophy_theology. The composer serves all four; the second subject should come from that list, or biology's chains should be authored first. operator_familyandconnectivedisagree in the corpora. Two rows declare a family their connective does not imply. The serving path reads the connective, because that is the only thing an exam question carries — and if routing and compilation disagreed about a row's family, a taught edge could go missing from the premises compiled to decide it. That would be a wrong answer assembled from a correct curriculum, which is the exact failure mode ADR-0261 §5.1 found in the categorical band a day earlier.
What is deliberately not built
Composition, negation, question shapes beyond Does <term> <relation> <term>?,
and premise-set scaling past the reader's 16-sentence honesty cap. Each is
scoped in ADR-0262 §6 with the condition that would unblock it. None of them
is a prerequisite for the next subject: adding one is a data operation now.