A scheduled reminder that couldn't reach its seat, for example after a reboot where the daemon starts before tmux, now stays owed and recovers instead of silently moving on to the next cycle. Each periodic occurrence, including each parked-row digest member, gets its own receipt in the existing outbox and retries through the existing scheduler and wake retry settings (default three retries, five minutes apart). A confirmed delivery is never sent again after interrupted accounting or a restart, and an uncertain one is never replayed. Exhaustion or an unconfirmed result ends only that occurrence, with its cause and next action recorded, and a recurring reminder keeps its normal cadence under a new occurrence; only a permanent transport failure ends the job. A one-shot park timer records its failed wake on its row before it ends, and a pending retry leaves its binding armed with a retry note. The fire stamp and the queue wake receipt and one-shot retirement commit in one transaction, with input outside it. Refusals are read with the transport's own rule (sent false or input not reached), and the external-CLI and interactive-prompt refusals are labelled, which the queue wake classifier, draft-aware delivery, compaction preparation, claim hints and the transport receipt also read. Abandoned occurrence claims are marked indeterminate at startup, before anything sends. Limits: scope is periodic reminders and parked-row digests, while condition watches, the parked-owner policy and explicit sends are unchanged; no schema, API, scheduler or replay of earlier failures is added, and previously recorded failures can't be reconstructed; while a retry waits, the existing one-second loop still evaluates it; a later recurring cycle is a new occurrence, not confirmation of an uncertain one.
Integration scenarios
The first PR automation increment is described in ci/README.md.
It runs the existing daemon-restart baton fixture plus a fault control in the
installed-package testbed, now alongside the library's queue-baton scenario and
its explicit seed binding. The same job also runs transcript-reads-addressed-seat
and capture-returns-addressed-seat once each, healthy only (ci/result.mjs).
Hosted green/red execution is required before claiming either verified. The
fifteen authored scenarios below are a broader target; they are not fifteen
admitted CI passes.
Historical 51-03 seed contract — the ten (+ one)
Compose-only L2 scenario set for the OpenRig containerized test system (mission release-0.5.1). Each scenario pins a NAMED defect class from the 0.4.8/0.5.0 marathon and becomes standing infrastructure instead of a hand-built probe.
Authoring authority (verified at authoring time)
- 51-03 spec: README
99f35af5c2d854a7/ PRDaa0638f161cc3b82(hash-verified). - Format is the LOCKED 51-02 spec (README
b157f5bc68940963/ PRD1bf3340188e39212) and the BINDING arch shapeARCH-SHAPE-scenario-format-and-runnersha256fc30a736c104863a…. The daemon-lifecycle step verb for #11 is arch-ruled inARCH-RULING-51-09-host-identity-and-51-02-step-verb(daemon: {op: sigterm|restart}on the shared env-helper's lifecycle surface). emit.behaviorvocabulary = 51-01's LOCKED FOUR {compaction, slow_output, mid_turn_death, restore}.usage_limitis real-runtime-only and MUST fail validation loud in a stub topology — no scenario here names it.- Assertions ride the shipped-observable surface set ONLY:
ps·queue·stream·scope·pane·transcript·tui_socket·policy_provenance.proofis reserved: the scenario runner has no read binding for it (rig proof showexists, but no scenario surface reads it), and the validator rejects it. No internal DB pokes.
Layout
scenarios/— the fifteen scenarios (§6 ten, the A1 eleventh, and four later ones:capture-returns-addressed-seat,down-stops-every-seat,send-renders-in-addressed-pane,transcript-reads-addressed-seat), one YAML file each, the scenario name naming its defect class. Beside them: the topology rig specs they bring up (*-stub.yaml, seatsruntime: stub) and theagents/andculture.mdthose specs reference.scenarios/scripts/— four per-seat stub scripts (JSON). A scenario names them withenv.stub_scripts(paths relative to the scenario file); the built-in default script applies when a scenario names none.scripts/— only its README, on the scripted-response contract.evals/— the live-model eval harness, a separate gate from these scenarios (seeevals/README.md).ROUTING.md— the runner, stub and format capabilities this set depends on, and which of them have landed. Per 51-03 mini-req 2 these are ROUTED, never shimmed here.
The seed contract (per-scenario, binding — kills the unfalsifiable-RED risk)
Each of the eleven historical scenarios carries a seed_regression: {class: …} step
and, in its header, a SEED definition: exactly what a seeded regression of its class plants, and why the
scenario's expect legs MUST catch it. Acceptance per scenario = the PAIR: GREEN on the
shipped tip + RED on the seeded run whose runner diff (expected vs last-observed) names
the class. A scenario that cannot be shown RED is not delivered.
The four later scenarios carry no seed step. Each header names a planted negative instead, and that negative is a product-code mutation.
For executable seeds, place the step before the affected action and supply the
pipeline's deps.seedRegression controller. It must arm a real local fault in the
seeded run and explicitly record that fault as disabled in the healthy run. The
paired harness verifies the injection receipt and the specific failed observation.
The remaining historical markers after their assertions are not executable proofs.
Run status honesty
The runner (packages/daemon/scripts/run-scenarios.mjs, over
packages/daemon/test/helpers/scenario-*.ts) and its hermetic env-helper exist. The stub
runs the four emit behaviors only from a per-seat launch script (env.stub_scripts); the
step verbs restore, mutate and policy are refused at load time (UNBOUND_STEP_VERB
— the format names them but the runner has no shipped binding), and a non-refocus emit
behavior throws UnboundActionError when the runner reaches it. In CI, queue-baton-survives-restart runs with
its seed, and transcript-reads-addressed-seat and capture-returns-addressed-seat run
healthy only (see ci/README.md). The other ten historical scenarios are
not yet runnable as meaningful checks, and down-stops-every-seat and
send-renders-in-addressed-pane don't run in CI. Scenario #11 is RED-FIRST: its GREEN gates on the 51-06 transactional
execution-closure fix and on its own setup and assertion-shape gaps (R-17, R-20); until
then its expected-RED runs are recorded as expected-RED, never massaged. See ROUTING.md
for the exact per-item dependencies.