docs(arc): curriculum-license-loop plan of record + tier division of work #115
Loading…
Reference in a new issue
No description provided.
Delete branch "docs/curriculum-license-loop-plan"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Two docs, no code. Opens the next arc and records the tier split so a cold session can pick up a unit without re-deriving the analysis.
The finding that makes this arc necessary
Two prior arcs closed on "the binding constraint is ratified curriculum volume, not machinery." Verified against code — the machinery half is wrong in a load-bearing way:
evals/curriculum_serve/practice/does not exist. No producer foldsrun_practiceinto per-band tallies.seal_ledgerexists only for deduction (evals/deduction_serve/practice/runner.py:96), yetchat/curriculum_serve_license.py's own docstring namesevals.curriculum_serve.practice.runner.seal_ledgeras "the only writer" of the artifact it reads. That writer was never built, andchat/data/curriculum_serve_ledger.jsondoes not exist.RatificationReceipt.pending_stages = ("arena_queue_entry", "ledger_reseal").So the pipeline is
author → ratify → ??? → ??? → license → serve. Authoring curriculum today cannot earn a license at any volume. Content is necessary and currently insufficient.The build is still modest:
evals/curriculum_serve/oracle.pyis already an independent decision procedure usable as the gold tether, and ADR-0263 already extracted the sealers for exactly a third instance.Two measured facts that shape the content work
refutedhas never been produced. Physics lane gold isentailed 14 / unknown 12 / declined 6. The verdict exists inCurriculumDecision.verdict; no corpus row can express it.(domain, operator_family)(chat/curriculum_surface.py:184), so negative content must live insideoperator_family: "modal"with a row-level polarity marker. A separatemodal_negativefamily would create a new band at n=0 instead of adding refuted volume to the target band — the easiest available way to waste the whole authoring effort.The tiering criterion, and why it isn't difficulty
The evidence doesn't support a prestige split. In the same 48-hour window, Sonnet 5 found the
DEFAULT_SINKbug that wrote outside the repository and did the six-worktreepublic_demoarchaeology; Opus 5 mis-diagnosed the CGA hot path by multiplying a microbenchmark by a call count. Model tier wasn't the variable — verification discipline was.So units split on one question: would an error here be caught by a gate, or is it silent?
Two units are silent-failure because they are themselves the gate:
wrong=0still passes, because the lane's gold andoracle.pyboth read the same rows. Structurally unfalsifiable by every gate this repo has.conservative_floorcannot distinguish 657 independent facts from 16 asked 41 times, so the ledger clears θ=0.99 having earned nothing, and the license reads identical to a real one.Those two get Opus. Everything with a loud failure mode goes to the cheapest competent tier: producer implementation (gated by the invariant tests), the
resealverb, theassert_corpus_soundrename, the R7 code move, the Rust parity measurement → Sonnet. The 312-file ADR vocabulary sweep → Haiku, acceptance criterion being that the widened pin goes green.The brief also carries an escalation section — five conditions under which a cheaper tier must stop and hand back up, framed as the mechanism working rather than a failure.
Ordering correction to my own earlier plan
The epistemology ADR must precede the generator. Building Phase C first means building it twice, since polarity determines what the generator enumerates. Since the ADR is design-only, doing it first costs nothing in parallelism.
[Verification]: docs-only, no code paths touched. Every referenced path confirmed to exist, and all five line citations confirmed accurate at
HEAD—evals/deduction_serve/practice/gold.py:1163,evals/curriculum_serve/runner.py:71,teaching/discovery_yield.py:67-70,generate/proof_chain/entail.py:125,chat/curriculum_surface.py:184. Pre-push gate ran on push (smoke 555 / deductive 285 baselines unaffected).Not merged, per standing policy.