Phase A of the curriculum-license-loop arc. Design only; no production code, no flag, no default changed. Rules R1-R9: polarity is a row-level field (absent => affirmative), negatives compile to the sentential-not form and MUST reuse the affirmative connective (atom identity), contradiction is rejected at ratification, premise compilation becomes query-scoped, an empty scope is UNKNOWN, premise_count keeps reporting family size, the oracle learns polarity independently, and a band's honest ceiling must be reported before anyone authors for it. Three findings, each measured in-tree and each reversing something: 1. `polarity` is read by nothing. A row authored to refute a question today serves a confident wrong "Yes" -- and the independent oracle ignores the field for the same reason, so gold agrees and wrong=0 stays green. This is the silent-failure class Phase A existed to prevent, now demonstrated. 2. The 16-premise honesty cap holds a family to <=16 chains; at 17 the band declines everything, including the taught positive that works today. So ADR-0262 §5.1's own remedy (author ~219 relations) destroys the capability at row 17, tripping the fix §6 deferred as a future contingency. Jointly: a band has <=16 entailed cases against a 657-committed threshold, so no curriculum band can earn SERVE until scoping lands. The blocker is engineering, not content -- inverting the conclusion two arcs closed on. 3. Honest volume is bounded by taught vocabulary, not corpus size. 8 of 11 bands cannot reach 657 at all, including the plan's chosen first target physics·modal (ceiling 480, counting every possible question). Retargets Phase F to philosophy_theology·modal (ceiling 44,104, same 8-chain start). R5 is the only rule that could change an existing answer, so it is the only one carrying evidence: 8,520 routable questions, 0 verdict mismatches for both candidate scopes. Verdict-identity holds for any scope that is a superset of the query-atom rows, since each premise mints one independent atom. That is stronger than ADR-0262 §6's soundness argument, and it is why this narrowing is not the ADR-0261 §5.1 premise-dropping failure. ADR-0262 §5.1/§5.2/§6 carry forward-pointers; original text preserved. [Verification]: uv sync --locked on canonical CPython 3.12.13; in-worktree `core test --suite smoke -q` 556 passed (555 baseline + 1: the derived ratify-on-merge pin picked up ADR-0264 and discharged it), `--suite deductive -q` 285 passed. Four probes reproducible from docs/research/curriculum-premise-scope-2026-07-25.md; the corpus-mutating one restores the file and asserts byte-identity.
13 KiB
ADR-0262 — Curriculum-grounded serving: exams answered from what was taught
- Status: Accepted — ratified by Joshua Shay via the
feat/curriculum-serve-physicsmerge (0ae54ebb, 2026-07-24). Accepting this ADR does NOT enablecurriculum_serving_enabled, which stays False pending ratified curriculum volume (§5.1) - Date: 2026-07-24
- Arc: generalization Phase 2 (docs/plans/generalization-arc-2026-07-24.md §4)
- Governs:
teaching/curriculum_premises.py,chat/curriculum_surface.py,chat/curriculum_serve_license.py, thecurriculum_<subject>_<family>bands, theevals/curriculum_servelane and its independent oracle, and thecurriculum_serving_enabledflag.
1. Context
The band cascade (ADR-0256 → 0261) decides arguments whose premises are IN the text. Exams are not shaped like that: the question supplies only the query, and the premises are supposed to be what the student was taught. Until now CORE had no path from "a ratified curriculum exists" to "a question is answered from it" — the 16 domain seed packs and 5 domain-chain corpora were inert.
The generalization plan §4 fixes the epistemology for that path in advance, so that implementing it cannot quietly become "answer from what the model knows". This ADR implements §4.
2. Decision
Add a second serving composer, chat/curriculum_surface.py, behind the
default-off curriculum_serving_enabled flag:
- Closed question grammar —
Does <term> <relation> <term>?. One shape. Anything else refusesquestion_shape_out_of_bandrather than guessing which token is the relation. The commit gate is routability, not shape (§5.4): the composer claims a turn only when the question parses AND its terms are vocabulary a served subject teaches. - Subject routing by vocabulary — the question goes to the subject whose
ratified pack vocabulary contains BOTH terms. No match is
untaught_vocabulary; more than one isambiguous_reading. The subject is never guessed. - Premise compilation from the ratified curriculum only
(
teaching/curriculum_premises.py). A chain is admitted iffreview_status == "reviewed"AND both terms are resident in the packs the chain declares. Compilation is scoped to the question's relation family. - The same decider — compiled premises plus the question as a "Therefore" conclusion are handed to the verb-predicate band (ADR-0260), falling through to the existential band (ADR-0261), then the ROBDD engine. No subject-specific decision code exists anywhere in this path.
- Bands = (subject × relation family), e.g.
curriculum_physics_causal, gated by the same earned-license machinery as deduction serving through a second ledger reader (chat/curriculum_serve_license.py).
The relation family comes from the CONNECTIVE, not from a chain row's declared
operator_family. A question carries a relation word and nothing else; a
family derived from anything the question cannot carry would let premise
compilation and question routing disagree, and a taught edge could then be
missing from the premises compiled to decide it — a wrong answer built out of a
correct curriculum. Two corpus rows currently declare a family their connective
does not imply; under this rule they are read as their connective says.
3. Why this is sound
- Gold is a function of (curriculum, question). No case-local hidden text, no world knowledge. A lane case pins the chain ids it draws on and the runner FAILS the case if a pinned chain is absent or unratified — so a curriculum that changes under a case breaks loudly instead of quietly answering from what remains.
- Open-world reading. A relation the curriculum does not state is UNKNOWN, never "no". Deciding otherwise would manufacture negative knowledge from silence, which is the same failure as manufacturing positive knowledge from silence.
- No composition. The curriculum teaches
force causes accelerationandacceleration causes motion; it does not teach that causation composes, soforce causes motionis UNKNOWN. Transitivity of a causal or modal relation is a substantive claim about the world, not a logical truth, and nothing ratified asserts it. The independent oracle reports the shortest path length with its verdict precisely so the lane can assert that a reachable pair is still answered UNKNOWN — composition is provably not happening rather than merely absent. - Face-value relations.
entropy reveals energydoes not licenseentropy causes energy. Same family, different relation: the reader mints distinct atoms per verb group (ADR-0260), so a family-level near-miss cannot become an entailment. - Independent gold.
evals/curriculum_serve/oracle.pyshares no code with the serving path — its own JSONL loader, ratification predicate, family table, agreement normalization, and verdict rule. It disagreed with the serving path once during authoring, on exactly the point in (4), and the ORACLE was the side that was wrong; that disagreement is why the check exists. - Anti-recall is a lane guard, not a hope. A split must carry ≥3 probes whose answer is true in the world and absent from the curriculum, and no probe may carry a committed gold, or the lane refuses to run.
4. License posture
Every curriculum_* band is UNEARNED today, so every answer is served
DISCLOSED through the same hedge deduction serving uses. This is not a
temporary shortcut around the license — it is the license working. The reason
is §5.1.
5. Findings
5.1 The binding constraint on Phase 2 is ratified curriculum VOLUME
Amended 2026-07-25 by ADR-0264 §4.1. The conclusion below — that the remaining work is "a curriculum-authoring and ratification task, not an engineering one" — is wrong, and the reason is in this ADR's own §6. Authoring the ≈219 relations prescribed here takes the family past
MAX_PREMISE_SENTENCESat row 17, at which point the band answers nothing. The §6 scope-out is therefore not a future contingency; it is a prerequisite. The criterion stated below (a band whose entailed class is ~1% of its volume demonstrates nothing) is upheld and promoted to a measured precondition. The original text is preserved unchanged.
A band earns SERVE at θ_SERVE=0.99 only with n ≥ 657 committed cases and a
genuine outcome mix. The question space of a subject is
|vocabulary|² − |vocabulary|, so volume is reachable (physics: 240,
philosophy_theology: 22,650). Entailed cases are not: physics teaches 7
causal and 9 modal relations, so at most 16 distinct questions in the whole
subject can come back ENTAILED. Sampling cannot fix this — repeating the same
16 questions 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.
Concretely: a balanced band (≈⅓ entailed) needs ≈219 distinct taught relations per subject × family. Physics has 7 and 9. That is a ~25× gap, and it is a curriculum-authoring and ratification task — Shay's call, not an engineering one.
The honest consequence, recorded rather than worked around: the machinery, the lane, the oracle, and the license gate all ship and pass; the licenses do not exist yet; every answer is hedged until they do. The plan's O→S checkpoint ("≥1 subject lane serving wrong=0 with earned licenses") is met on every clause except the last, and the last one cannot be met from present data.
5.2 REFUTED is unreachable from present corpora
Every ratified chain is a positive assertion. Refuting a question needs the
curriculum to teach a negative ("no X causes Y") or an exclusion. Until a
corpus does, refuted is a verdict this path can render but never reach. The
serving code handles it; the lane documents it.
Sharpened 2026-07-25 by ADR-0264 Fact 1. Stronger than "never reach": authoring a negative row without teaching the compiler polarity does not yield UNKNOWN — it yields a confident wrong
entailed, becauseCurriculumChain.sentenceis unconditionally affirmative. The independent oracle ignorespolarityfor the same reason, so gold agrees andwrong=0stays green. ADR-0264 R1–R4 and R8 close this before any negative is authored.
5.3 The commit gate must be routability, not shape
Shipped first as a shape gate (Does …?) with the deduction composer's
fail-closed posture copied verbatim. That was wrong, and flipping the flag
would have exposed it: Does the build pass? and Does anyone know the time?
would have been taken away from the rest of dispatch and answered with a
remark about curriculum gaps.
The asymmetry is the lesson. The deduction composer may commit on shape
because a sentence-initial "therefore" IS a signal of intent — text shaped
that way is an argument. Does …? is one of the most common ways to open any
English question and signals nothing. So the gate became
is_curriculum_question: claim the turn only when the question parses to
three tokens AND its terms are vocabulary some served subject teaches.
Everything past the gate stays fail-closed, including ambiguous_reading
(both terms taught, two subjects claim them) and out_of_curriculum (terms
taught, relation unknown) — those are real curriculum questions with honest
answers. A question whose vocabulary CORE has never been taught is simply not
this composer's turn, and the DECIDER still records it as
declined/untaught_vocabulary for the lane.
Generalizable rule: a fail-closed composer is only as safe as its commit gate is narrow. Before copying a fail-closed posture, check whether the new gate carries the same evidence of intent as the one it was copied from.
5.4 There is no biology domain-chain corpus
The plan names "physics and biology" as Phase 2's two subjects because "OOD
lanes, seed packs, and domain chains already exist". For biology only the first
two are true: evals/foundational_biology_ood is a fluency lane (its own
contract says it measures grammatical English, not truth) and there is no
biology_chains_*.jsonl. The four 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 be
chosen from those, or biology's chain corpus authored first.
6. Scope-outs
-
Question shapes beyond
Does <term> <relation> <term>?— multi-word terms, "why"/"how" questions, negated questions, and quantified questions all refuse typed. Each is a separate readable unit with its own lane. -
Composition, per §3.3 — a future ADR may license it for a family the curriculum itself declares transitive, but that requires the declaration to be an executable claim rather than a classification label, which today it is not.
-
Premise-set scaling — a family with more than
MAX_PREMISE_SENTENCES(16) ratified chains compiles to an argument the reader refuses, surfacing ascompiled_premises_unreadable. No current family exceeds 9. The fix when one does is to compile the query's k-hop neighborhood rather than the whole family (sound: fewer premises can lose an entailment, never create one), and to disclose the narrowing.Superseded 2026-07-25 by ADR-0264 R5. This is no longer a scope-out: §5.1's own remedy triggers it at row 17. Two corrections to the reasoning above. (i) "No current family exceeds 9" is measured against a corpus that §5.1 asks to grow 24×. (ii) Sound is the wrong property — a sound narrowing can still lose true entailments, which is coverage loss in exactly the class the license counts. The property needed is verdict-identical, which holds for any scope that is a superset of the query-atom rows, because each compiled premise mints one independent propositional atom. Verified over 8,520 questions with zero mismatches —
docs/research/curriculum-premise-scope-2026-07-25.mdprobe 3.
7. Verification
tests/test_curriculum_serve.py— 20 tests: premise provenance and the loud-failure guard, family scoping never losing a taught edge, taught-edge entailment, untaught composition staying UNKNOWN, untaught fact never REFUTED, relation read at face value, base-form question normalization, anti-recall declines, 3 typed refusals, non-question pass-through, routing, the disclosed-until-earned license posture and the authoritative path when a band IS licensed, and oracle independence including the depth-2 reachability assertion.evals/curriculum_servelane: 32/32, wrong=0, 5 anti-recall probes, both physics bands exercised. Pinned ascurriculum_serve_v1.