Pre-PL1 closure (handoff 2026-09-10):
1. research_required: new nonterminal task status (records enum, state
machine edges created/running -> research_required -> running/
completed/failed/cancelled/superseded). The operator's RESEARCHED_CHANGE
disposition now transitions to research_required instead of failed —
research routing is not failure. Live canary: status=research_required,
outcome_ref=research_dispatch, route_ref set.
2. Experience consumer skips research-dispatch tasks — no false
failure-learning evidence in PL0 (verified: 0 FAILURE records for
research tasks).
3. recall_uplift A/B documented honestly in the module: latency 521-1213ms
→ 14-18ms; terms bounded (893-1665 → 16-21); recall ROW COUNTS identical
per query but 1/8-7/7 of recalled IDs differ (expansion terms differ →
different lexical candidates). Marked PROVISIONAL — quality not proven
equivalent; harness original retained for rollback.
4. Hook hardening: durable fire-trace (/tmp/rune-bridge-fire.log, one line
per actual injection with token count) + harness-internal-step guard
(checkpoint-writer/compaction steps no longer receive capsules).
5. QX7 canary fully purged: entries, contentless-FTS ghosts, both stores;
retrieval-level verification shows zero hits.
1227 tests pass; ratchet 353/80; henxels clean.
Handoff 2026-09-10 §§2–10. One canonical implementation, not copied logic:
1. Route authority moved into Rune Core (src/rune/):
adaptive_router.py, route_risk_flags.py (renamed — the old name
collided with the research-stage concept), evidence_probe.py.
Dependency direction enforced: executor imports Core; Core never
imports the executor. Research executor consumes via
rune.adaptive_router / rune.evidence_probe (dual-import guards for
standalone script execution).
2. derive_sufficiency() in Core (unified grounding semantics): the
research path passes contract-compiler fields; the operator path
grounds from task-text absence-of-defeaters. NONE vs UNKNOWN fixed
(no test surface = determined NONE, not unknown).
3. Live operator consumption: send_task routes every task via the same
authority, persists INITIAL_ROUTE to ~/.rune/routes/route.jsonl,
records task.route, and attaches an actionable research dispatch
(executor-consumable payload) for RESEARCHED_CHANGE. Proven live:
local task → STANDARD_CHANGE (research chain not entered);
floor architecture task → RESEARCHED_CHANGE + dispatch recorded.
The dispatch's downstream consumer is still the MiMo session
(documented §11 gap, not solved here).
4. builder_bridge.py: thin adapter over Rune Core — preflight(task)
runs derive_sufficiency → classify_route → (optional) memory
selection. Zero model calls, bounded capsule (12 memory / 6 lesson
lines). lesson_lines stays empty until PL1 promotes its first
lesson — the seam exists, the pressure does not.
5. PL0 qualification: qualify_experience() (TELEMETRY vs CANDIDATE,
cheap rule-based, no model). Live ledger: 132 raw → 54 candidates.
Raw outcomes preserved verbatim; SEED never auto-VALIDATED.
6. Umbrella manifest updated (4 new modules → capability umbrella).
Verification: 1213 tests pass; ruff clean; silent-handler ratchet at
baseline (353/80). The audit's §1 qualification is honored: the
earlier spine canary proved model routing, not task-class routing —
task-class routing on the live spine is proven HERE.
Runtime Reachability audit (reports/RUNTIME_REACHABILITY_AUDIT_2026-09-10.md,
4 parallel tracers + live canaries) established: ONE real end-to-end path
exists (send_task → ContextBroker → Ollama tool loop → durable events),
proven live by canary during the audit. The spine exists; the missing
pieces were edges, not architecture.
P0 implemented (choice-free items):
1. task.outcome producer edge: send_task emits a typed journal event on
EVERY terminal transition (completed AND failed) with task/model/
verification/route fields — the producer PL0/PL1 needs (outcome_ledger
was de-wired; experience ledger had zero producers).
2. Experience consumer: scripts/process_experience.py
record_operator_outcomes() reads the authoritative task-state
checkpoint (the journal is a one-way integrity journal — payload_hash
only) and appends idempotent SEED experience records. 132 live records
created; rerun = 0 (idempotent).
3. Spine defect: _routing_profiles_path and the profile-save site had bare
relative imports that fail in standalone CLI mode — trace recording
degraded to tier-2 on every CLI run (mislabeled 'inference_trace').
Fixed with the established dual-import pattern; verified clean run.
4. Standalone bootstrap: package parent now on sys.path for script
execution.
5. hook_engine.fire dead call removed (rune_tui called a nonexistent
function; AttributeError silently swallowed — hooks never ran). Left
as an honest note, not a false-liveness surface.
Verification: Phase 8 canary through the real spine — all 9 rungs
observable from persisted state (trace v5 fields incl. memory
abstention + broker budget, routing reason, checkpoint outcome, journal
event, idempotent experience record). 1213 tests pass; ruff clean;
ratchet at baseline.
The route-authority placement choice (A/B/C) is presented in the audit
report §G and awaits Nick's decision before wiring adaptive routing into
the operator path.