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.
109 lines
6 KiB
Markdown
109 lines
6 KiB
Markdown
# 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_family` and `connective` disagree 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.
|