Plan of record for the generalization arc lands here
(docs/plans/generalization-arc-2026-07-24.md) with the risk-tiered
handoff pack (docs/handoff/generalization-2026-07/); Phase 0.1 executed.
Root-caused the three stale lane pins (docs/research/lane-drift-
investigation-2026-07-24.md):
- miner/curriculum: 5c69b741 (ADR-0244 §2.7) widened content digests
16→64 hex; intentional, pins were simply never updated. Re-pinned
surgically; SHAs triple-run deterministic.
- demo_composition: a REAL serving regression. #76's canonical-first
base precedence in resolve_surface, activated when #96 routed pipeline
turns through the resolver, served the pre-R6 canonical — the register
axis (ADR-0077 R6 substantive + ADR-0071 R4 decoration) was silently
stripped from every pipeline-served turn. T13's back-stamp then made
telemetry mirror the stripped bytes; register-tour claims went red and
the e2e tests pinning the axis (outside smoke) were failing on main.
Fix: response-first base precedence (served bytes = post-guard, post-R6,
post-R4) + new SurfaceResolution.hash_surface carrying the truth-path
canonical-precedence bytes through substrate overrides, folds, hedge,
logos-morph, and the speculative marker. compute_trace_hash folds
hash_surface, so the register axis varies the served surface ONLY and
trace_hash stays register-invariant (ADR-0069 inv C). _prior_surface
(correction binding) stays on the truth path. Dead FailureClass import
and _assessment_residual removed.
Also: generate_claims.py had raised on every run since the
deduction_serve_v1 pin landed without a _LANE_ADR entry — mapping added
(ADR-0256), CLAIMS.md regenerated, --check green.
[Verification]: register tour 6/6 claims (substantive-differs restored,
all_trace_hashes_identical held); 88 tests green in-worktree
(test_surface_resolution incl. 2 new fallback tests,
test_register_substantive_consumption incl. previously-red e2e tests,
test_grounded_open_hedge_arm, test_cognitive_turn_pipeline,
test_warmed_session_lane 10/10 T13 consistency); miner/curriculum lane
SHAs byte-identical across three runs; deduction_serve + deductive_logic
lane reports byte-identical to their unchanged pins; smoke suite via
pre-push gate.
2.9 KiB
Handoff Brief — Tier O (Opus 5, MEDIUM risk)
Read first: docs/plans/generalization-arc-2026-07-24.md (the plan of
record — §4 gold contract and §6 constraint set are binding), then
AGENTS.md. Reference ADRs on demand: 0256–0259 (band recipe),
0175/0199 (license doctrine), 0251/0252 (math-reader guardrails).
You own, in order:
- O1 — Band v6-EX (existential
somewitnesses). Follow the band recipe exactly as ADR-0258/0259 executed it: reader module ingenerate/proof_chain/, shape bands inshape.py, surface wiring inchat/deduction_surface.py, arena templates ≥720/band inevals/deduction_serve/practice/gold.py, hand-authored lane split, ledger reseal, tests, ADR, research doc. Gotchas that bit before: cross-module_Rejectidentity (catch both classes); band-N swallows band-N+1 test texts (verify the prior band really refuses your declined cases); surgical single-line pin edits only (neververify_lane_shas.py --update). - O2 — Phase 2 physics serve lane per the §4 curriculum-entailment
contract. Premises come ONLY from ratified domain chains
(
teaching/domain_chains/physics_chains_v1.jsonl+ pack mounts); anti-recall probes (gold=UNKNOWN for true-but-untaught) are mandatory or the lane must not ship. Independent closed-world oracle first, then the lane. Biology second, only after O3 lands. - O3 — generic consumption bridge: extract the seal→ratify→
SHA-verified-license→serve-gate pattern (models:
chat/deduction_serve_license.py,generate/determine/estimation_license.py) into a reusable ADR-0175 Phase-5 bridge so subject arenas plug in without bespoke wiring. - O4 — math reader: seeding-sentence injection (standing ruling
#77 — the 75% "no injection" wall). Then compare unblock (4.2).
Hard guardrails: no bespoke-per-case regex growth (ADR-0251); check
every new pattern against
docs/research/reader-arc-overfit-inventory-2026-07-19.md; measure on the frozen tune/measure split; wrong=0 on the full 500 is the gate, parse-rate gain is the goal.
Constraints (non-negotiable): wrong=0; all flags stay default-off —
flips are Shay's ratification only; Forgejo-primary (no gh); worktree
per unit off forgejo-https/main; fresh venv per worktree
(rm -rf .venv && uv sync --locked --offline, then uv run --no-sync);
pre-push hook runs smoke+warmed_session (~4.5 min — budget timeouts);
PRs opened by Shay via the compare URL the push prints (push PAT 403s
the PR API); Shay merges — never you; branch+worktree deleted after
merge; no timelines in any doc.
Your exit checkpoint (O→S): v6-EX merged; ≥1 subject lane serving
wrong=0 with earned licenses; bridge merged; math increment measured and
documented (a null result is a valid checkpoint). Then update
BRIEF-S-sonnet-low-tier.md with actual state, update memory, and stop
for the Sonnet handoff.