@@ -84,23 +84,33 @@ confined to the `bindings` block nulls every binding, marks
8484` summary.privacy_violations ` , which no flag relaxes. Evidence therefore
8585carries counters, cursors, outcome tokens, and sha256 prefixes only.
8686
87- ## Test seams later PRs must provide
88-
89- The pending ` s2c2.* ` rows will be implemented against these seams; a Stage 2C
90- parity PR that does not expose them cannot be ladder-verified:
91-
92- - a drain lock file at ` <runtime>/authority-shadow/outbox/<goal>/drain ` so the
93- ladder can hold the drain window with ` loopx.file_lock.exclusive_file_lock `
94- exactly as it holds ` <runtime>/authority-shadow/file/<goal>/observation `
95- today, then SIGKILL a writer before or during drain;
96- - one file per outbox entry under ` <runtime>/authority-shadow/outbox/<goal>/ `
97- with a prepared-then-committed marker, so pending entries are countable and
98- a rollback with pending entries is observable from disk;
99- - ` drain ` and ` verify ` product commands that emit JSON with ` drained_count ` ,
100- ` cursor_before ` , ` cursor_after ` , ` parity_verdict ` , and the source and
101- candidate digests, so parity-equal and foreign-edit rows can assert on
102- typed fields rather than prose;
103- - the same commands must resolve the runtime root the way ` todo ` and
104- ` task-lease ` do (` effective_runtime_root ` ), so the one-lineage guarantee that
105- ` s2c1.dual_runtime_root_consistency ` proves for the observation hooks also
106- holds for drain and verify.
87+ ## Bounded outbox correctness and the pending ladder
88+
89+ The independently runnable [ correctness suite] ( correctness.md ) covers the
90+ ` file_outbox_v1 ` capture lineage, strict cursor recovery, mixed writers,
91+ source fences, and recoverable bootstrap/rollback. It uses real CLI and native
92+ processes, the production ` FileAuthorityStore ` , and process death at persistence
93+ boundaries. [ Installed-package E2E] ( installed.py ) repeats the public lifecycle
94+ outside the checkout for both wheel and sdist. [ Negative controls] ( mutants.py )
95+ deliberately remove correctness checks in disposable source copies.
96+
97+ These checks do not change the nine pending ` s2c2.* ` ladder declarations above.
98+ Sustained production parity, the migration/growth gates, and promotion remain
99+ separate obligations. A bounded qualification result reports
100+ ` sustained_parity_verdict=not_evaluated ` .
101+
102+ Future ladder rows must use the actual product interfaces:
103+
104+ - ` authority-shadow drain ` for receipt-verified replay and cursor recovery;
105+ - ` coordination-shadow inspect / qualify / read-candidate ` for comparison,
106+ bounded historical qualification, and a qualified read from that same head;
107+ - ` coordination-shadow rollback ` with an exact revision or unfinished bootstrap
108+ operation selector, followed by explicit rebootstrap;
109+ - the stable management lock outside the goal outbox for scheduling a management
110+ boundary. Rollback moves the entire goal outbox, so a lock inside that directory
111+ cannot coordinate it. The tests retain scheduling-only barriers around real
112+ persistence calls rather than depending on the retired drain lock.
113+
114+ There is no ` verify ` command or generic ` reset ` . The independent v0 observation
115+ store and its runtime-root override behavior retain their original scope; its
116+ historical evidence is not an outbox qualification receipt.
0 commit comments