programme_continuation was TEST-PROVEN but UNWIRED (16M finding). Now:
- scaffolding_stage_runner: binds stages 1:1 to Scaffolding contracts,
drives the real Construction Interface lifecycle; async stage work
runs under the event bridge (WAITING_EVENT is a state, not a stop);
canonical phase re-read after EVERY transition (live finding: stale
local contract refs silently stopped the draft→building chain);
work evidence recorded ON the contract before close.
- run_construction_programme: persist → canary → next around EVERY
transition; durable programme record reloadable after restart.
- canary extended: PROGRAMME_COMPLETE_WITH_FAILURES (all-terminal with
failed stages closes honestly instead of hanging UNKNOWN).
LIVE PROOF (17E, real bridge, 4.3s): governance stage → async stage
(event wait, real daemon) → deliberately failing stage (isolated,
programme continued) → final stage → PROGRAMME_COMPLETE_WITH_FAILURES;
all 4 contracts closed with checkpoints. 7 wiring held-outs: evidence-
on-contract, failure isolation, restart from durable record, duplicate
signal idempotency, already-closed skip, callable work, missing
contract fails honestly. 15M verdict enum extended.
15M: src/rune/programme_continuation.py — after EVERY stage completes the
canary asks 'is the programme objective satisfied?'; if open and eligible
stages remain the NEXT stage starts immediately (no user re-prompt, no
voluntary stop); event-wait is PROGRAMME_OPEN_WAITING (no polling);
blocked branches fall back to pre-authorized work; every stop carries an
honest verdict (PROGRAMME_COMPLETE/ALL_REMAINING_BLOCKED/APPROVAL_
REQUIRED/UNKNOWN). 7 held-outs incl. the required 4-stage auto-continuation
proof + durable persist/reload. Bounded to ONE construction programme —
not a Substrate scheduler.
15L: authority boundary record persisted (construction=Scaffolding,
wait=event bridge, research-state continuity=FUTURE Substrate (not
built), research execution=Research Core, TUI=client/projection) +
negative held-out: research intents never PROJECT_BUILD.