core/docs/research/curriculum-grounded-serving-2026-07-24.md
Shay 44e78aa438 feat(generalization): curriculum-grounded serving — exams answered from ratified curriculum (ADR-0262)
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.
2026-07-24 14:38:08 -07:00

109 lines
6 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.

# 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.