docs(arc): curriculum-license-loop plan of record + tier division of work #115

Merged
core-labs merged 1 commit from docs/curriculum-license-loop-plan into main 2026-07-25 22:17:50 +00:00
Owner

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 folds run_practice into per-band tallies.
  • seal_ledger exists only for deduction (evals/deduction_serve/practice/runner.py:96), yet chat/curriculum_serve_license.py's own docstring names evals.curriculum_serve.practice.runner.seal_ledger as "the only writer" of the artifact it reads. That writer was never built, and chat/data/curriculum_serve_ledger.json does not exist.
  • The ceremony stops short: 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.py is 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

  • refuted has never been produced. Physics lane gold is entailed 14 / unknown 12 / declined 6. The verdict exists in CurriculumDecision.verdict; no corpus row can express it.
  • Bands key on (domain, operator_family) (chat/curriculum_surface.py:184), so negative content must live inside operator_family: "modal" with a row-level polarity marker. A separate modal_negative family 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_SINK bug that wrote outside the repository and did the six-worktree public_demo archaeology; 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:

  1. Negative-curriculum epistemology — if wrong, the corpus encodes falsehoods and wrong=0 still passes, because the lane's gold and oracle.py both read the same rows. Structurally unfalsifiable by every gate this repo has.
  2. Volume-honesty invariant — if wrong, conservative_floor cannot 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 reseal verb, the assert_corpus_sound rename, 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 HEADevals/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.

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 folds `run_practice` into per-band tallies. - **`seal_ledger` exists only for deduction** (`evals/deduction_serve/practice/runner.py:96`), yet `chat/curriculum_serve_license.py`'s own docstring names `evals.curriculum_serve.practice.runner.seal_ledger` as *"the only writer"* of the artifact it reads. **That writer was never built**, and `chat/data/curriculum_serve_ledger.json` does not exist. - **The ceremony stops short:** `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.py` is 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 - **`refuted` has never been produced.** Physics lane gold is `entailed 14 / unknown 12 / declined 6`. The verdict exists in `CurriculumDecision.verdict`; no corpus row can express it. - **Bands key on `(domain, operator_family)`** (`chat/curriculum_surface.py:184`), so negative content must live *inside* `operator_family: "modal"` with a row-level polarity marker. A separate `modal_negative` family 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_SINK` bug that wrote outside the repository and did the six-worktree `public_demo` archaeology; 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*: 1. **Negative-curriculum epistemology** — if wrong, the corpus encodes falsehoods and `wrong=0` still passes, because the lane's gold and `oracle.py` both read the same rows. Structurally unfalsifiable by every gate this repo has. 2. **Volume-honesty invariant** — if wrong, `conservative_floor` cannot 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 `reseal` verb, the `assert_corpus_sound` rename, 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.
core-labs added 1 commit 2026-07-25 22:15:25 +00:00
Two prior arcs closed on "the binding constraint is ratified curriculum volume,
not machinery." Verified against code 2026-07-25: the machinery half is wrong in
a load-bearing way, and the correction is the reason this arc exists.

evals/curriculum_serve/practice/ does not exist. seal_ledger exists only for
deduction (evals/deduction_serve/practice/runner.py:96), yet
chat/curriculum_serve_license.py's own docstring names
evals.curriculum_serve.practice.runner.seal_ledger as "the only writer" of the
artifact it reads -- that writer was never built, and
chat/data/curriculum_serve_ledger.json does not exist. And the ceremony stops
short: 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, because oracle.py is 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 shape the content work. `refuted` has NEVER been produced --
the physics lane gold is entailed 14 / unknown 12 / declined 6, and no corpus row
can express it. And bands key on (domain, operator_family), so negative content
must live INSIDE operator_family "modal" with a row-level polarity marker; a
separate modal_negative family 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.

DIVISION-OF-WORK.md records the tiering criterion and why it is not difficulty.
The evidence does not support a prestige split: in the same 48h window Sonnet 5
found the DEFAULT_SINK bug that wrote outside the repository and did the
six-worktree public_demo archaeology, while Opus 5 mis-diagnosed the CGA hot path
by multiplying a microbenchmark by a call count. Model tier was not the variable;
verification discipline was.

The split is therefore: would an error here be caught by a gate, or is it silent?
Two units are silent-failure BECAUSE THEY ARE THE GATE -- the negative-curriculum
epistemology (wrong => corpus encodes falsehoods and wrong=0 still passes, since
lane gold and the oracle both read the same rows) and the volume-honesty invariant
(wrong => conservative_floor cannot tell 657 independent facts from 16 asked 41
times, so the ledger clears theta=0.99 having earned nothing). Those get Opus.
Everything loud goes to the cheapest competent tier.

Also records the ordering correction: the epistemology ADR must precede the
generator, or the generator gets built twice.

[Verification]: docs-only; no code paths touched. Every referenced path confirmed
to exist and all five line citations confirmed accurate at HEAD (gold.py:1163,
curriculum_serve/runner.py:71, discovery_yield.py:67-70, entail.py:125,
curriculum_surface.py:184). Pre-push gate runs on push.
core-labs merged commit 6ada6f7a03 into main 2026-07-25 22:17:50 +00:00
core-labs deleted branch docs/curriculum-license-loop-plan 2026-07-25 22:17:50 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: core-labs/core#115
No description provided.