spec: move-any-app rev 7.14, joint round 13 and claim rev 6.22
The model's park state is the claim's (R13-4): a persisted park scope on every remote chore, a free host's sweep as a holderless parking op freed by FreeAfterPark, session:<n> on a serving host, INV-20. Coverage in exactly four ways (R13-2): birth (warm; a pending whole-location park), publication over every entry with its precondition, CoverRegionPredecessors at the three park CASes, CoverParkedPredecessors for what the sweep parks. The run walk stated precisely (R13-1): a covered foreign link is passed over, a covered local baseline refuses and alerts; restoreCalc the reference; TestInterruptedCleanReturn. additional_writes_lost (R13-3). Six notes for the claim under the rev 7.14 heading. The evidence policy (Paul, 2026-10-06) in §14.2.1: the gate and one 3,000-seed mutation sweep per revision, serially and niced; baselines at 30,000 only; the deep runs once, at a pre-implementation checkpoint. Model 4ebfa0a5: 104 rules, 68 witnesses; 30,000 seeds clean (169 s); 100,000 seeds clean (1021 s, run before the policy); mutation sweep at 3,000: 90 caught, 14 expected misses, exit 0; 90 of 104 caught alone (69 by the sweep, 21 by witness). The 30,000 and 100,000 sweeps were stopped and are marked not run. Records in ~/.cache/nearest-region/rev714-sweeps/.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1 file changed,
+524
−183
docs/superpowers/specs/2026-10-02-move-any-app-design.md+524 −183
diff --git a/docs/superpowers/specs/2026-10-02-move-any-app-design.md b/docs/superpowers/specs/2026-10-02-move-any-app-design.md| index 4f6e7e7af..10fb74664 100644 |
| --- a/docs/superpowers/specs/2026-10-02-move-any-app-design.md |
| +++ b/docs/superpowers/specs/2026-10-02-move-any-app-design.md |
| @@ -1,7 +1,53 @@ |
| # Move any app or instance to another region: Phase 1, a safe single-instance move |
| -**Date:** 2026-10-05 |
| -**Revision:** 7.13. |
| +**Date:** 2026-10-06 |
| +**Revision:** 7.14. |
| + |
| +- **Rev 7.14** answers **joint round 13** (`CODEX-FINDINGS-JOINT-R13.md`, |
| + cited "R13-n") and is written against **claim spec rev 6.22** |
| + (0bf2f49f, which adopts rev 7.13's seven notes in rev 6.21 and |
| + answers R13-1 to R13-3; rev 6.15 and 6.16 added the persisted park |
| + scope and the holderless sweep), the library E on |
| + `feat/hostclaim-r713` at f0127321 and the generation selector F on |
| + `feat/hostclaim-genselect` at d7621a29; §22.20 has every disposition. |
| + **The model's park state is the claim's** (R13-4): every remote chore |
| + carries a persisted **park scope** `{location, incarnation, |
| + evidence_at, request_limit}`, bound in a CAS before its first step or |
| + at the sweep's queuing CAS, so a retry after an agent restart keeps the |
| + original evidence time and never restarts the horizon; a free host's |
| + at-rest sweep is a **holderless parking op** `{kind: parking, intent: |
| + {park_sweep: "v1"}}` with no exec and no holder, carrying only scoped |
| + remote chores, which blocks the successor create and frees the claim |
| + again in its last acknowledgement's CAS (`FreeAfterPark`); on a |
| + serving host the sweep's chores carry `session:<n>`; INV-20, a create |
| + never claims a host over an outstanding park. **Coverage, completely** |
| + (R13-2): an entry becomes covered in exactly four ways, at birth (a |
| + warm entry; an entry admitted under a pending whole-location park of |
| + its predecessor's region), by publication (which requires an entry to |
| + name the published generation and walks every entry in order, skipping |
| + covered ones), by `CoverRegionPredecessors` in the three |
| + whole-location-park CASes, and by `CoverParkedPredecessors(region, |
| + generations)` in the sweep's queuing and acknowledgement CASes, only |
| + for the generations the sweep parks. **The run walk, precisely** |
| + (R13-1): from `holder.generation` back to the marker's generation, a |
| + link whose generation keeps its objects in another region is passed |
| + over, covered or not; a link in this region must be uncovered, and a |
| + covered local generation reached as a needed baseline refuses the |
| + start and alerts; `restoreCalc` stays the reference and |
| + `TestInterruptedCleanReturn` walks R → T → S and R2 → R → T → S. |
| + **`additional_writes_lost`** (R13-3): the lost-target return's extra |
| + declarations, one per target session since the cut, unique by `(box, |
| + session)`, each alerted. Rules `persisted-park-scope`, |
| + `holderless-park`, `covered-baseline-refused` (104 in all); witnesses |
| + `wParkScopeSurvivesRestart`, `wFreeSweepVsCreate`, |
| + `wCoveredLocalBaseline` (68 in all). Results in §14.2.3 and §14.2.5. |
| + **The evidence policy** (Paul, 2026-10-06; §14.2.1): each revision |
| + runs the gate and one mutation sweep at 3,000 seeds, serially and |
| + niced; baselines at 30,000 only; the 100,000-seed baseline and the |
| + 30,000- and 100,000-seed mutation sweeps run once, at a final |
| + pre-implementation checkpoint, when Paul says so. Rev 7.14's 100,000 |
| + baseline ran before the policy and is reported; its deeper sweeps were |
| + stopped and are marked not run. |
| - **Rev 7.13** answers **joint round 12** (`CODEX-FINDINGS-JOINT-R12.md`, |
| cited "R12-n") and is written against **claim spec rev 6.14** |
| @@ -1228,7 +1274,18 @@ fails there first (§14.2.6). |
| continuation that died are two; the first's writes are durable only |
| in the lost target's region, and no return lane carries either's; |
| seed 33373 / 100,000, hidden until the session-scoped match of |
| - R12-1), each alerted. Only |
| + R12-1). **Representation** (claim rev 6.22 item 2, R13-3): the |
| + admission entry carries `writes_lost` (one, the predecessor's |
| + session) and **`additional_writes_lost`** (a list, the other target |
| + sessions since the cut, and the source's cut session when |
| + `src_covered` is false), each `{box, generation, session, |
| + remote_max_txid}`, unique by `(box, session)`; the caller supplies |
| + the list and the library records it in the admitting CAS; the |
| + admitting box raises **one alert per declaration** after the CAS |
| + and retries until delivered, and the console's durable loss record |
| + is the long-term copy, so trimming a covered entry never loses a |
| + declaration (the model: `admissionRecord.AdditionalWritesLost`, an |
| + alert each, INV-14 counts them). Only |
| coverage `""` with no certificate records `writes_lost`, and the |
| record always names its coverage, certified or not. A seal built |
| from the **remote** because the disk was gone (`seal.from_db` false, |
| @@ -1271,16 +1328,19 @@ fails there first (§14.2.6). |
| bound to the observed operation and phase like the admission, legal |
| while serving and inside any operation a writer runs in (a restarted |
| landing probe, a rollback's or a revert's source; R11-5), it |
| - **walks every uncovered cold record** of `holder.admissions` (claim |
| - rev 6.14 item 5): a predecessor whose `predecessor_region` is `""` |
| - (it holds nothing anywhere) is covered with no chore; one that is |
| - the published, live generation again (a clean return's source |
| - generation, a republished lagging marker's) is **left uncovered** |
| - with no chore (item 5's first bullet covers it; covered, nothing |
| - would retire it once a later admission supersedes it, since that |
| - admission's predecessor is the last record and not the generation |
| - it restored from: seed 41914 / 100,000 left the source's generation |
| - as residue; a reading for the claim, §19.4); one whose objects are in the publishing |
| + **requires `holder.generation` to be the published generation and |
| + an entry to name it, then walks every entry of `holder.admissions` |
| + in order, skipping covered ones** (claim rev 6.22 item 5, R13-2; |
| + bounded by the list's length; warm entries are born covered, so it |
| + visits every uncovered cold entry): a predecessor whose |
| + `predecessor_region` is `""` (it holds nothing anywhere) is covered |
| + with no chore; one that is the published, live generation again (a |
| + clean return's source generation, a republished lagging marker's) |
| + is **left uncovered** with no chore (covered, nothing would retire |
| + it once a later admission supersedes it, since that admission's |
| + predecessor is the last record and not the generation it restored |
| + from: seed 41914 / 100,000 left the source's generation as residue; |
| + rev 7.13 note 6, adopted); one whose objects are in the publishing |
| `region` gets one deduplicated `park-generation` chore there and is |
| covered; one whose objects are in **another region** stays |
| uncovered, with no chore, and the walk goes on. The walk finds what |
| @@ -1304,29 +1364,36 @@ fails there first (§14.2.6). |
| admission, and the adoption writes `holder.writer_box` as the box |
| running the pre-release process, so the first cold admission's |
| `writes_lost` names the writer whose unuploaded writes it leaves |
| - behind (R10-5, R11-3). **Coverage is per region and recorded** (claim rev |
| - 6.13 and 6.14, R12-3): a record is covered when its predecessor's |
| - retirement is in hand in the region that holds the predecessor's |
| - objects. A predecessor whose objects live in another region (a |
| - move's source generation, seen by the target's publication) is |
| - **never queued into its region from here**, since the rollback may |
| - still need it (seeds 1036 and 1296 / rev 7.12; witness |
| - `wRollbackBaselinePreserved`); it is covered either by that |
| - region's own next publication or by |
| - **`CoverRegionPredecessors(op, phase, region)`**, composed into the |
| - CAS that queues that region's park of the whole location, which |
| - retires those generations wholesale and so queues nothing: the |
| - commit's `park-superseded` of the source region (§7.9), a |
| - rollback's `park-superseded` of the target region at the target's |
| - release (§7.8), and the console's release of a declared-lost target |
| - (§7.10). Two readings for the claim (§19.4): a cold admission made |
| - while the claim already holds such a park for its predecessor's |
| - region is **born covered**, since a rollback's return is admitted |
| - after the release queued the target region's park and the CAS that |
| - queued it could not see the record (seed 1036 / 3,000); and the |
| - at-rest sweep (§6.4), which parks a region's dead generations |
| - wholesale, covers the records whose predecessors it parks in the |
| - CASes that queue and acknowledge its `park-sweep`. INV-17: when a |
| + behind (R10-5, R11-3). **Coverage, completely** (claim rev 6.22 item 5, |
| + R13-2): a record is covered when its predecessor's retirement is in |
| + hand in the region that holds the predecessor's objects, and an |
| + entry becomes covered in **exactly four ways**, no other transition |
| + covers anything: **at birth**, a warm entry (its predecessor is its |
| + own generation, which nothing retires; the next cold admission's |
| + record names it and queues the chore), or an entry admitted while |
| + the claim already holds a whole-location park of its |
| + `predecessor_region` (that park retires the predecessor: a |
| + rollback's return admitted after the release queued the target |
| + region's park, which the CAS that queued it could not see; seed |
| + 1036 / 3,000); **by publication**, above; **by |
| + `CoverRegionPredecessors(op, phase, region)`** in one of the three |
| + CASes that queue a whole-location park of `region`, every uncovered |
| + entry whose `predecessor_region` is `region`: the commit's |
| + `park-superseded` of the source region (§7.9), a rollback's |
| + `park-superseded` of the target region at the target's release |
| + (§7.8), and the console's release of a declared-lost target (§7.10), |
| + which retire those generations wholesale and so queue nothing; and |
| + **by `CoverParkedPredecessors(op, phase, region, generations)`** in |
| + the CAS that queues an at-rest `park-sweep` and in the CAS that |
| + acknowledges it, only the uncovered entries whose predecessor is one |
| + of the listed generations, the ones that sweep actually retires (a |
| + predecessor with a sweepable object at the queuing; one whose |
| + objects it retired on the way, at the acknowledgement): a sweep |
| + never covers a predecessor it did not park. A predecessor whose |
| + objects live in another region (a move's source generation, seen by |
| + the target's publication) is **never queued into its region from |
| + here**, since the rollback may still need it (seeds 1036 and 1296 / |
| + rev 7.12; witness `wRollbackBaselinePreserved`). INV-17: when a |
| whole-location park of `holder.location` completes in a region, no |
| record whose predecessor's objects were there is uncovered. A dead |
| generation holding nothing yet still gets its chore in the |
| @@ -1342,8 +1409,26 @@ fails there first (§14.2.6). |
| died before its marker (two in a row happen: the second's purge |
| failed after its CAS), that is the normal unfinished state, every |
| generation of the chain and the marker's is live, and there is no |
| - alert; the baseline for the next admission is the nearest generation |
| - of the chain that holds an object, else the marker's; an empty |
| + alert. **The run walk, in one region's bucket** (claim rev 6.22 |
| + §6.2a, R13-1): the next admission follows each record's |
| + `predecessor` back from `holder.generation` to the marker's |
| + generation, newest first. A link whose generation keeps its objects |
| + in **another region** is passed over, covered or not: it holds |
| + nothing in this bucket, and its own region's park retires it (a |
| + clean rollback's fresh source admission R, admitted after the |
| + target region's park was queued and dead before its first upload, |
| + walks R, then the target's T in the other region, born covered under |
| + that park, then the source's S, and restores S; |
| + `TestInterruptedCleanReturn` walks that and R2 → R → T → S after |
| + it). A link **in this region** must be uncovered: a covered local |
| + generation is retired or being retired here, so reaching one as a |
| + needed baseline **refuses the start and alerts** (rev 7.13 read |
| + objects alone and would restore the marker's retired generation as |
| + an empty database; witness `wCoveredLocalBaseline`); an uncovered |
| + local link that holds an object is the baseline, the nearest such; |
| + one that holds none (a fresh generation that never uploaded) is |
| + passed over; else the marker's generation. The model's `restoreCalc` |
| + over that baseline is the reference the selector F mirrors. An empty |
| `holder.generation` for any other reason is unexplained missing data: |
| refuse the start and alert. A `holder.generation` that holds objects |
| has its marker published again (from the operation's build journal |
| @@ -1879,6 +1964,32 @@ no later retirement of that location may ever run. Claim rev 5's at-rest |
| sweep owns it: for a host with no operation running, each region's box |
| lists the host's namespace and parks what is not live, as a further |
| retirement event, under a `park-sweep` obligation the sweeping box owns. |
| +**The chore carries a persisted park scope** (claim rev 6.15 §2, R13-4): |
| +`{location, incarnation, evidence_at, request_limit}`, written at the |
| +queuing CAS (the sweeping box's complete listing is the evidence, taken |
| +then), so every retry, an agent restart's included, uses the same |
| +location, archive incarnation and **original** evidence time; a retry's |
| +own clock is never evidence, and a restart never starts the horizon |
| +again (rev 7.13's model kept the evidence time in a box-local map that |
| +the restart cleared; witness `wParkScopeSurvivesRestart`). Every remote |
| +chore has one: a whole-location park binds its scope in a CAS before its |
| +first step runs, once its stop evidence is in hand. The sweep parks at |
| +once and acknowledges, with its straggler pass, only after the scope's |
| +`evidence_at + request_limit`. **On a serving host** the chore's op is |
| +`session:<holder.session>`, as for `PublishGeneration`. **On a free host** |
| +(no holder) the sweep is a **holderless sweep** (claim rev 6.15 §6.2a): |
| +one CAS sets `op = {kind: parking, id: <new op id>, intent: {park_sweep: |
| +"v1"}}` with no `exec` and no holder and queues only scoped remote chores |
| +owned by that op; it is the only holderless claim that may carry |
| +obligations, so it blocks `free`'s successor create while it runs (the |
| +create waits, it is not refused), and its last acknowledgement frees the |
| +claim again in the same CAS (`FreeAfterPark`), keeping `quiet_after` |
| +(witness `wFreeSweepVsCreate`; INV-20: a create never claims a host while |
| +a park of its namespace is outstanding). Another region's sweep while the |
| +op runs joins it with its own scoped chores; any other operation running |
| +suppresses new sweeps; the console's recovery pass leaves the op to its |
| +runners and only replays `FreeAfterPark` for one whose chores are all |
| +acknowledged. |
| **It discovers locations from the namespace itself** (claim rev 6 §6.2a, |
| R3-4), not from `retired_incarnations`, which is capped at 32 entries and |
| exists only to stop an incarnation being reused: it lists |
| @@ -2621,10 +2732,10 @@ and a new agent process never resumes it (a new agent is a new session): |
| | anchor (warm, when the restored position is above the level-0 maximum) | `[N, N]`, acknowledged to the client; in the ledger (R10-7) | retried with the same bytes; the session is uncertain for good | |
| | open | replication opens; the replica reads its remote position at its first sync; every later upload is the session's. An app stopped idle before this point is not closed: the replicator opens, ships what the app wrote, then closes cleanly | | |
| -#### Admissions, coverage and retirement (operative, rev 7.13) |
| +#### Admissions, coverage and retirement (operative, rev 7.14) |
| This list, with §5.1 step 9 and the two tables above, is the operative |
| -rule set for writer admission (R12-4), mirroring claim rev 6.14 §6.4a's |
| +rule set for writer admission (R12-4), mirroring claim rev 6.22 §6.4a's |
| operative subsection item for item. Where any other passage of this |
| spec reads differently (the restore contract's older wording in §5.1, |
| the §7.8 rows as rev 7.11 had them, the authoritative-region table, the |
| @@ -2638,10 +2749,11 @@ this text wins. |
| holder's fields (INV-16); `region` is the admitted box's region, where |
| its generation's objects are; `predecessor_region` is the last |
| record's `region`, before any record the writer box's region, `""` |
| - when the generation holds nothing anywhere. A record is **born |
| - covered** when the claim already holds a whole-location park of |
| - `holder.location` for its predecessor's region (a reading for the |
| - claim, §19.4). |
| + when the generation holds nothing anywhere; a warm admission |
| + continues the same generation in the same region, so its region |
| + equals its predecessor record's (a clean return's first admission is |
| + cold: an old source certificate does not certify the target's |
| + session). Born covered: item 5. |
| 2. **Coverage** `""` | `sealed` | `clean-return`, as §5.1 step 9 states |
| it: `sealed` for a `from_db` seal of the stopped predecessor, |
| `clean-return` for a clean rollback with `src_covered`, a target that |
| @@ -2650,34 +2762,48 @@ this text wins. |
| without a certificate it records `writes_lost` (behind a lost target, one |
| record for every session the target was admitted into since the cut, |
| and a second for the source's cut session when `src_covered` is |
| - false). A `writes_lost` record declares the writes of the session it |
| - names and no other (INV-18, R12-1). |
| + false): `writes_lost` (one) plus `additional_writes_lost` (a list), |
| + each `{box, generation, session, remote_max_txid}`, unique by `(box, |
| + session)`, one alert per declaration (R13-3). A `writes_lost` record |
| + declares the writes of the session it names and no other (INV-18, |
| + R12-1). |
| 3. **The baseline.** A prepared generation from its pinned snapshot in |
| the admitting box's region, opened once; otherwise the predecessor |
| generation's remote in this region; in an unfinished run the newest |
| - generation of the run that holds an object, else the marker's; an |
| + generation of the run that holds an object **in this region**, else |
| + the marker's, walked as §5.1 step 9 says (R13-1): a covered foreign |
| + link is passed over, a covered local baseline refuses and alerts; an |
| empty generation outside an unfinished run is refused and alerted. |
| 4. **Stamps.** A cold admission takes a new stamp except under |
| `KeepStamp` (`holder.stamp > holder.session`); a clean return's CAS may |
| name the source's generation and stamp again, leaving |
| `holder.session` alone. |
| -5. **Publication.** After the marker names the generation, one |
| - `PublishGeneration(observedOpID, observedPhase, observedSession, |
| - publishedGeneration, region, newID)` walks the uncovered records as |
| - §5.1 step 9 states: no objects anywhere, covered, no chore; live |
| - again, left uncovered, no chore; in `region`, one deduplicated chore, |
| - covered; another region, uncovered, no chore, the walk continues. |
| - Every cold admission publishes. Retirement happens only through it or |
| - through item 6. |
| -6. **Whole-location parks cover.** `CoverRegionPredecessors(op, phase, |
| +5. **Coverage, completely.** An entry becomes covered in exactly four |
| + ways (R13-2): at birth (a warm entry; an entry admitted while the |
| + claim holds a whole-location park of its predecessor's region); by |
| + publication; by `CoverRegionPredecessors` (item 6); by |
| + `CoverParkedPredecessors` (item 6). **Publication:** after the marker |
| + names the generation, one `PublishGeneration(observedOpID, |
| + observedPhase, observedSession, publishedGeneration, region, newID)` |
| + requires `holder.generation` to be the published generation and an |
| + entry to name it, then walks every entry in order, skipping covered |
| + ones, as §5.1 step 9 states: no objects anywhere, covered, no chore; |
| + live again, left uncovered, no chore; in `region`, one deduplicated |
| + chore, covered; another region, uncovered, no chore, the walk |
| + continues. Every cold admission publishes. Retirement happens only |
| + through it or through item 6. |
| +6. **Parks cover what they retire.** `CoverRegionPredecessors(op, phase, |
| region)` runs inside the CAS that queues a region's park of the whole |
| location: the commit's park of the source region, the target's |
| release and the console's lost-target release for the target region. |
| It covers every record whose predecessor's objects are that region's |
| - and queues nothing. The at-rest sweep covers what it parks in its own |
| - CASes (a reading, §19.4). INV-17 checks the composition as each such |
| - park completes. A foreign-region predecessor is never queued into its |
| - region from another one. |
| + and queues nothing. `CoverParkedPredecessors(op, phase, region, |
| + generations)` runs in the CAS that queues an at-rest `park-sweep` and |
| + in the CAS that acknowledges it, and covers only the records whose |
| + predecessor is among the generations that sweep parks. INV-17 checks |
| + the composition as each whole-location park completes. A |
| + foreign-region predecessor is never queued into its region from |
| + another one. |
| 7. **Starts.** The admitting CAS first; a new agent process stops a |
| running app, admits a new session and restarts it; failed starts are |
| the retry policy's, five under one session with a doubling backoff; |
| @@ -2691,6 +2817,14 @@ this text wins. |
| past an uncovered one; no compaction. A declared-lost box's timers are |
| declared on the console's record and alerted; adoption sets |
| `holder.writer_box` to the pre-release writer's box. |
| +9. **Park state** (claim rev 6.15, R13-4; §6.4). Every remote chore |
| + carries a persisted park scope, bound before its first step or at the |
| + sweep's queuing CAS, and every retry uses its original evidence time. |
| + A free host's at-rest sweep is a holderless `parking` op with |
| + `intent.park_sweep`, no exec and no holder, which blocks the successor |
| + create until `FreeAfterPark` frees the claim in its last |
| + acknowledgement's CAS; on a serving host sweep chores carry |
| + `session:<holder.session>`. |
| **History.** The paragraphs that follow and §14.2.2's per-revision |
| blocks record how these rules were reached; where they differ from the |
| @@ -2990,6 +3124,29 @@ combination-only, unexercised), each with its reason. The sweep exits |
| nonzero on any ERROR, any unexpected MISSED, and any expected miss that is |
| now caught (STALE). |
| +**The evidence policy (Paul, 2026-10-06).** The deep sweeps were using |
| +half the shared box's cores and starving other agents. From rev 7.14 on: |
| +each revision runs **the gate** (300 seeds plus the witnesses) and **one |
| +mutation sweep at 3,000 seeds**, serially, with `HOSTLIFE_PAR=2` under |
| +`nice -n 19`, never alongside another sweep or a baseline; **baselines |
| +run at 30,000 seeds only**; the 100,000-seed baseline and the 30,000- |
| +and 100,000-seed mutation sweeps run **once**, at a final |
| +pre-implementation checkpoint, and only when Paul says so. A table cell |
| +or column those sweeps would have filled says "not run" for the |
| +revision, never a placeholder and never a number carried over from an |
| +earlier revision. Rev 7.14's 100,000-seed baseline had already run, |
| +clean, before the policy was set and is reported in §14.2.3; its 30,000- |
| +and 100,000-seed mutation sweeps were stopped mid-run and are not |
| +evidence. |
| + |
| +**Rev 7.14: `TestInterruptedCleanReturn`, INV-20.** `go test` runs the |
| +positive case of the run walk across regions beside the witnesses: a |
| +clean rollback's fresh source admission dies before its first upload and |
| +the recovery walks R → T → S, then one more interrupted admission walks |
| +R2 → R → T → S; both restore the source's data. INV-20 is checked in the |
| +create's claim CAS: no obligation may be outstanding when a create claims |
| +a host. |
| + |
| **Rev 7.13: INV-17 at the park, `TestProbeWindow`.** The oracle for |
| regional coverage runs when a whole-location park of `holder.location` |
| completes in a region, not at the end: a record whose predecessor's |
| @@ -3065,8 +3222,10 @@ under a second. `mutate.sh` now fails on a scratch directory it cannot |
| create and on an `xargs` failure, requires exactly one well-formed |
| verdict per requested mutation, and reports a rule that has witnesses |
| but produced no witness output as an ERROR, never as "none" (R3-6). |
| -`go test` also runs `TestReadinessBudget`, T11's arithmetic (§7.3), and |
| -`TestProbeWindow`, the probe deadline's boundary (§7.7, rev 7.13). |
| +`go test` also runs `TestReadinessBudget`, T11's arithmetic (§7.3), |
| +`TestProbeWindow`, the probe deadline's boundary (§7.7, rev 7.13), and |
| +`TestInterruptedCleanReturn`, the run walk across regions (§5.1 step 9, |
| +rev 7.14). |
| **Rev 7.6: the pinned libraries, observed.** `internal/sim/litestreamfacts/` |
| is a second test-only package: it drives litestream v0.5.14 and |
| @@ -3592,6 +3751,69 @@ readiness, and same-operation lease identities. |
| review's 3 GiB workload is reproduced (108.68 s with three passes at one |
| rate, 124.04 s with the fourth) and refused by rev 7.7's arithmetic. |
| +**Rev 7.14: joint round 13 and claim rev 6.22.** |
| + |
| +- **The park scope and the holderless sweep (R13-4; claim rev 6.15).** |
| + `obligation.Scope *parkScope{Location, Inc, EvidenceAt, Limit}`. A |
| + `park-replica` or `park-superseded` chore binds its scope in a CAS the |
| + first time its owner has the stop evidence (`park scope bound`), and |
| + every later step, an agent restart's included, reads `EvidenceAt` and |
| + `Limit` from the claim; the sweep writes the scope at its queuing CAS |
| + and acknowledges after `EvidenceAt + Limit` with its straggler pass. |
| + `sweep()` on a free claim sets `op = {Kind: "parking", ID, ParkSweep: |
| + "v1", Exec: -1}` in the CAS that queues its chores; another region's |
| + sweep joins the running op; on a serving host the chores carry |
| + `session:<n>`; the obligation runner's acknowledgement CAS performs |
| + `FreeAfterPark` (`op = {}`) when it removes the op's last chore |
| + (`free after park`, equal to `holderless sweeps` in every run); the |
| + console's recovery pass leaves such an op to its runners and replays |
| + `FreeAfterPark` only for one whose chores are gone. `createSteps` waits |
| + on a holderless sweep instead of abandoning the create, and its claim |
| + CAS checks INV-20 (no obligation outstanding). Rules |
| + `persisted-park-scope` (the mutation keeps rev 7.13's box-local |
| + evidence map, which `forget()` clears at an agent restart) and |
| + `holderless-park` (the mutation queues rev 7.13's bare `sweep` chores |
| + on the free claim and drops the create's wait on bare obligations); |
| + witnesses `wParkScopeSurvivesRestart` (a committed move's source park, |
| + 45 steps, the source's agent restarts, the acknowledgement must come |
| + within the commit's evidence plus the horizon and slack; INV-9 under |
| + the mutation) and `wFreeSweepVsCreate` (a deleted host, late residue |
| + in its region, a create requested at once; the create waits for |
| + `FreeAfterPark`; INV-20 under the mutation). |
| +- **Coverage, completely (R13-2; claim rev 6.22 item 5).** |
| + `publishGeneration` requires the last record to name the published |
| + generation and walks every entry in order, skipping covered ones, with |
| + the explicit bound `e.Session > session` (never reached under the |
| + CAS's session check); warm entries are born covered in `admitCommit` |
| + (`admissions born covered: warm`); born covered under a pending park |
| + applies to every mode; `coverRegionPredecessors` and INV-17 apply to |
| + every entry; `coverSweptPredecessors` became |
| + `coverParkedPredecessors(n, region, generations)` with |
| + `sweptPredecessors(n, region, retired)` supplying the list (sweepable |
| + predecessors at the queuing CAS, retired ones at the acknowledgement); |
| + trimming counts covered entries only. |
| +- **The run walk (R13-1; claim rev 6.22 §6.2a).** `unfinishedRun(c, bg)` |
| + returns the run's cold records newest first; `runBaseline(b, c, run, |
| + bg)` walks their predecessor links: a link whose `PredRegion` is not |
| + this region is passed over, covered or not; a covered link in this |
| + region refuses the start with an alert (`start refused: covered local |
| + baseline`); the nearest local link holding an object is the baseline, |
| + else the marker's. `hasFiles` reads current objects (rev 7.13 counted |
| + a key's presence, so a parked generation still looked like a |
| + baseline). `restoreAsNext`, the oracle's baseline, walks the same way. |
| + Rule `covered-baseline-refused` (the mutation ignores the covered flag |
| + and selects by objects alone); witness `wCoveredLocalBaseline` (an |
| + unfinished run g2 → g1 whose record is covered and whose g1 was |
| + retired: refused under the rule; under the mutation the walk passes |
| + over the empty g1 and restores the marker's g1 as an empty database, |
| + INV-2); `TestInterruptedCleanReturn` (above). `wOriginSwept` names the |
| + refusal as its failure under `absent-marker-origin`: the swept origin |
| + is a covered local baseline since rev 7.14, so the recovery refuses |
| + with an alert rather than restoring nothing. |
| +- **`additional_writes_lost` (R13-3).** `admissionRecord.LostMore` is |
| + `AdditionalWritesLost`, each entry alerted; the model already declared |
| + every target session since the cut (rev 7.13). |
| + |
| **Rev 7.13: joint round 12 and claim rev 6.14.** |
| - **Regions on the record (claim rev 6.14 item 1, R12-3).** |
| @@ -4268,6 +4490,51 @@ adds and one it makes stricter: |
| app is idle. Writes past the last completed checkpoint are lost by |
| design and declared so; every durable write must come back. |
| +**Rev 7.14, on the final model (claim rev 6.22: the persisted park |
| +scope, the holderless sweep, coverage in four ways, the run walk across |
| +regions): 30,000 seeds, zero violations; 100,000 seeds, zero |
| +violations** (169 s and 1021 s; the 100,000-seed run finished |
| +before the evidence policy of §14.2.1 was set). Across the 100,000 seeds: |
| +150,124 completed operations, among them 69,017 cold and |
| +16,058 warm admissions (12,090 covered `sealed`, |
| +763 covered `clean-return`; 16,058 warm entries |
| +born covered, 384 born covered under a pending park, |
| +1,157 predecessors left uncovered by a publication for their |
| +own region, 0 live again and left uncovered, |
| +27,264 holding nothing anywhere, 748 records |
| +covered at the commit's park, 275 at a rollback's |
| +release, 3 at a lost-target release, 609 by |
| +the sweep's `CoverParkedPredecessors`; 497,273 park scopes bound |
| +before a chore's first step, 38,098 holderless sweeps and |
| +38,098 `FreeAfterPark` transitions; 0 |
| +starts refused on a covered local baseline; 19,236 clean closes, |
| +1,430 closes refused as uncertain, 0 stale |
| +certificates, 984 wakes that waited for a draining writer, |
| +52,808 local databases purged, 4,085 starts that |
| +waited for a failed purge, 56,370 writes_lost records declaring |
| +8,101 acknowledged writes lost (175 of the |
| +records in `additional_writes_lost`), 27,597 full first uploads, |
| +105,879 start steps that waited for their marker, |
| +608 markers published again, 3,614 probes |
| +restarted, 486 probe attempts ended by their window, a |
| +late readiness or their fifth failure (456 refused before |
| +the start by the deadline check), 1,554 app starts that |
| +failed and were retried within their session, 0 hosts |
| +marked failed by the retry policy, 90 seals whose source |
| +replica was short and 38 returns that carried the seal; |
| +9,339 final recovery admissions run by the oracle, |
| +0 unverified), 735 completed moves, |
| +2,105 clean and 89 dirty rollbacks, |
| +318 pre-flip reverts, 264 declared losses, |
| +24,755 pushes, 90,312 delete-park-free cycles and |
| +4,827 lost disks (3,474 with a crash); |
| +9,221 LTX compactions, 6,478 snapshot rotations, |
| +583 level-0 upload retries, 28,962 anchors; |
| +26,123 local stamp records lost and re-initialized; |
| +46,605 requests completed after `H`; 35,592 staging |
| +signatures refused as stale; 14,432 creates restarted on a |
| +412. Every oracle left the system unchanged. |
| + |
| **Rev 7.13, on the final model (claim rev 6.14: regions on the record, |
| the publication walk, `CoverRegionPredecessors` at whole-location parks, |
| the declared identity, the probe deadline before the start): 30,000 |
| @@ -4620,36 +4887,57 @@ Each was a failing seed first, then a rule; each rule's mutation is in |
| #### 14.2.5 Mutation results |
| Every rule was dropped in turn, with the one prebuilt binary of §14.2.1, |
| -on the final rev 7.13 model (42af7bfc), with the strict classification, |
| -**in two ways**: the **random sweep**, 3,000 seeds each, 30,000 for every |
| -rule not caught at 3,000 and for the new and the rare ones, 100,000 for |
| -the rarest, 30,000 for each combination and 100,000 for the rarest; and |
| +on the final rev 7.14 model (4ebfa0a5), with the strict classification, |
| +**in two ways**: the **random sweep**, 3,000 seeds each (the 30,000- and |
| +100,000-seed sweeps of earlier revisions were not run for rev 7.14: the |
| +evidence policy of §14.2.1, Paul 2026-10-06; their columns say so); and |
| the rule's **witness scenarios** (§14.2.2, `witness_test.go`) under the |
| -same mutation, for the 54 rules that have them. A rule is caught |
| +same mutation, for the 57 rules that have them. A rule is caught |
| if either catches it; `mutate.sh` reports the two separately, and this |
| -section does too. The model has **101 rules**: rev 7.12's 96 plus |
| -`foreign-region-uncovered` and `cover-at-park` (claim rev 6.14 items 5 |
| -and 6, R12-3), `session-scoped-loss` (R12-1), `probe-window` (R12-2) |
| -and `absent-marker-origin` (R12's evidence note). `mutate.sh 3000` exited 0: no ERROR, no unexpected |
| +section does too. The model has **104 rules**: rev 7.13's 101 plus |
| +`persisted-park-scope` and `holderless-park` (claim rev 6.15, R13-4) and |
| +`covered-baseline-refused` (claim rev 6.22 §6.2a, R13-1). `mutate.sh 3000` exited 0: no ERROR, no unexpected |
| MISSED, no STALE; every live combination was rerun this round. Seed |
| numbers reproduce any sweep line with `HOSTLIFE_SEED`; |
| -`HOSTLIFE_WITNESS=<rule>` replays a witness with its trace. Rev 7.12's |
| -counts are in the rev 7.12 spec (dd3e35f6). **Every table below is |
| +`HOSTLIFE_WITNESS=<rule>` replays a witness with its trace. Rev 7.13's |
| +counts, the last with the deeper sweeps, are in the rev 7.13 spec |
| +(1f511c42). **Every table below is |
| regenerated from the retained verdict files** (R9-6; |
| -`~/.cache/nearest-region/rev713-sweeps/`), none is carried over. |
| +`~/.cache/nearest-region/rev714-sweeps/`), none is carried over. |
| | | rules | |
| |---|---| |
| -| caught alone by the sweep at 3,000 seeds | 66 | |
| -| caught alone by the sweep at 30,000 (and by their witness, where one exists) | 11 (`declare-lost-compute`, `evidence-whole-tree`, `hostguard`, `lost-quarantine`, `markers-last`, `orphan-order`, `restore-overlap`, `seal-by-version`, `seal-return`, `staging-quiet`, `stale-hold-release`) | |
| -| caught alone by the sweep at 100,000 (and by its witness, where one exists) | 0 (none this round: rev 7.12's two moved, `declare-lost-compute` to 30,000 and `baseline-live` to witness-only) | |
| -| caught alone by their witness only; the sweep misses them at 30,000 | 11 (`absent-marker-origin`, `admit-before-start`, `baseline-live`, `close-evidence`, `close-waits`, `closed-marker`, `newest-l0`, `probe-window`, `remote-baseline`, `restore-gap-closed`, `session-scoped-loss`) | |
| +| caught alone by the sweep at 3,000 seeds | 69 | |
| +| caught alone by the sweep at 30,000 (and by their witness, where one exists) | not run for rev 7.14 (CPU budget; Paul 2026-10-06); without a verdict this round, the rare rules the sweep reaches only at 30,000: 1 (`hostguard`) | |
| +| caught alone by the sweep at 100,000 (and by its witness, where one exists) | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | |
| +| caught alone by their witness only; the sweep at 3,000 misses them | 21 (`absent-marker-origin`, `admit-before-start`, `baseline-live`, `close-evidence`, `close-waits`, `closed-marker`, `covered-baseline-refused`, `declare-lost-compute`, `evidence-whole-tree`, `generation-conditional`, `lost-quarantine`, `markers-last`, `newest-l0`, `orphan-order`, `persisted-park-scope`, `probe-window`, `remote-baseline`, `restore-gap-closed`, `restore-overlap`, `seal-return`, `session-scoped-loss`) | |
| | caught only in a stated combination: the witness holds alone and under every proper subset, and violates with the partners | 8 | |
| | subsumed: the witness holds under every combination tried, or the scenario is unreachable by construction | 2 (`door-reread`, `door-by-version`, by C3a and by writer epochs; historical results only, below). `start-check`, subsumed in rev 7.10, is caught alone by the sweep again since rev 7.11: with the whole check gone the lagging-marker reading is skipped and an empty generation is restored as if it held the data | |
| | liveness only | 2 (`readiness-key`, `config-before-probe`) | |
| | unreachable under claim rev 5 | 1 (`readiness-quiet`) | |
| | unexercised | **0** | |
| +**What rev 7.14 moved.** The three new rules: `persisted-park-scope` |
| +witness; sweep 0 / 3,000 (an agent restart mid-park starts the |
| +horizon again from the restart's clock), `holderless-park` |
| +561 / 3,000 (a create claims a host over an outstanding park, |
| +INV-20) and `covered-baseline-refused` witness; sweep 0 / 3,000 |
| +(the run walk restores a retired local baseline as an empty database). |
| +The rules the coverage and park changes touched: `cover-at-park` |
| +29 / 3,000, `foreign-region-uncovered` |
| +4 / 3,000, `absent-marker-origin` |
| +witness; sweep 0 / 3,000 (its witness names the covered-baseline |
| +refusal now), `baseline-live` witness; sweep 0 / 3,000, `writes-lost` |
| +13 / 3,000, `clean-return-identity` |
| +13 / 3,000, `lost-return-park` 1 / 3,000, |
| +`obligations-block-ops` 21 / 3,000, `sweep-namespace` |
| +542 / 3,000, `sweep-staging` 36 / 3,000, |
| +`straggler-sweep` 770 / 3,000, `quiet-before-ack` |
| +152 / 3,000, `hostguard` 0 / 3,000, |
| +`stale-hold-release` 1 / 3,000, `strict-spawn` |
| +13 / 3,000. The rules rev 7.13 caught only at 30,000 or 100,000 |
| +have no sweep verdict this round; the summary table lists them. |
| + |
| **What rev 7.13 moved.** The five new rules: `foreign-region-uncovered` |
| 2 / 3,000, 34 / 30,000 (a chore queued into the source's region |
| from the target's publication parks the rollback's baseline), |
| @@ -4833,61 +5121,64 @@ witness to hold there; each witness violates with the failure it names. |
| | rule | the scenario | witness alone | witness with partners | sweep alone | |
| |---|---|---|---|---| |
| -| `generation-conditional` (model 29) | push p1's first `generation.json` PUT is accepted and its response lost; the agent publishes again and p1 completes; push p2 completes; the stale PUT lands | **violated**: the marker names p1, the claim p2, and the serving box cannot start | | 1 / 3,000, 9 / 30,000, 36 / 100,000 | |
| -| `lost-return-park` (model 27) | the target writes in the settle window, the settle check fails, the target is stopped after its first return PUT and declared lost | **violated**: INV-10, the lane in the source region at the release | | 2 / 3,000, 27 / 30,000, 64 / 100,000 | |
| -| `declare-lost-compute` (model 5) | the target is frozen in its settle window and its execution lease expires; the VM resumes once the source has recovered | **violated**: INV-1, two boxes run the host | | 0 / 3,000, 1 / 30,000, 1 / 100,000 | |
| +| `generation-conditional` (model 29) | push p1's first `generation.json` PUT is accepted and its response lost; the agent publishes again and p1 completes; push p2 completes; the stale PUT lands | **violated**: the marker names p1, the claim p2, and the serving box cannot start | | witness; sweep 0 / 3,000 | |
| +| `lost-return-park` (model 27) | the target writes in the settle window, the settle check fails, the target is stopped after its first return PUT and declared lost | **violated**: INV-10, the lane in the source region at the release | | 1 / 3,000 | |
| +| `declare-lost-compute` (model 5) | the target is frozen in its settle window and its execution lease expires; the VM resumes once the source has recovered | **violated**: INV-1, two boxes run the host | | witness; sweep 0 / 3,000 | |
| | `watchdog-independent` (§7.1) | as above, with the agent alone paused, so the application keeps running | held | with `declare-lost-compute`: **violated**, INV-1 | 0 / 3,000 | |
| -| `lost-quarantine` (CC12) | the target is stopped while landing, declared lost, and started again with its old disk | **violated**: INV-10, local state for a host served elsewhere | | 0 / 3,000, 5 / 30,000 | |
| -| `markers-last` (R2-6) | the source has a registered timer; the target's agent crashes between extracting the files and writing the marker | **violated**: INV-2, the timer is lost | | 0 / 3,000, 4 / 30,000 | |
| -| `rollback-journal` (R2-3) | a dirty rollback; the source's agent crashes after its probe spawned the instance, which wrote and replicated into the return generation | **violated**: INV-2 on cold restore | | 1 / 3,000, 9 / 30,000 | |
| -| `seal-by-version` (J-N2) | a pre-cut staging round completes after the seal; the source wrote and replicated between them | **violated**: INV-2 on cold restore; the landing installs the stale snapshot | | 0 / 3,000, 5 / 30,000 | |
| -| `staging-quiet` (J-N2) | a staging round completes after the landing's staging park acknowledged, before the release | **violated**: INV-10 at the release | | 0 / 3,000, 1 / 30,000 | |
| -| `dirty-return` (INV-2) | the target writes during its probe and replicates; the rollback is dirty and the return lane carries the write | **violated**: treated as clean with the source's replica covering the stop, the return is covered `clean-return`, nothing is declared and the serving database lacks the target's write (INV-2 local at the final recovery; rev 7.11 saw INV-15 at the declaration) | | 1 / 3,000, 9 / 30,000 | |
| -| `commit-before-open` (INV-5; R3-5) | a public request reaches the target's edge while its probe runs | **violated**: INV-5 | | 2 / 3,000, 48 / 30,000 | |
| +| `lost-quarantine` (CC12) | the target is stopped while landing, declared lost, and started again with its old disk | **violated**: INV-10, local state for a host served elsewhere | | witness; sweep 0 / 3,000 | |
| +| `markers-last` (R2-6) | the source has a registered timer; the target's agent crashes between extracting the files and writing the marker | **violated**: INV-2, the timer is lost | | witness; sweep 0 / 3,000 | |
| +| `rollback-journal` (R2-3) | a dirty rollback; the source's agent crashes after its probe spawned the instance, which wrote and replicated into the return generation | **violated**: INV-2 on cold restore | | 1 / 3,000 | |
| +| `seal-by-version` (J-N2) | a pre-cut staging round completes after the seal; the source wrote and replicated between them | **violated**: INV-2 on cold restore; the landing installs the stale snapshot | | 1 / 3,000 | |
| +| `staging-quiet` (J-N2) | a staging round completes after the landing's staging park acknowledged, before the release | **violated**: INV-10 at the release | | 1 / 3,000 | |
| +| `dirty-return` (INV-2) | the target writes during its probe and replicates; the rollback is dirty and the return lane carries the write | **violated**: treated as clean with the source's replica covering the stop, the return is covered `clean-return`, nothing is declared and the serving database lacks the target's write (INV-2 local at the final recovery; rev 7.11 saw INV-15 at the declaration) | | 1 / 3,000 | |
| +| `commit-before-open` (INV-5; R3-5) | a public request reaches the target's edge while its probe runs | **violated**: INV-5 | | 3 / 3,000 | |
| | `claim-cas-opid` (C2) | a stalled source goroutine with the rollback's last read resumes after a purge claimed the host | held | with `revalidate-before-effect`: **violated**, the store is torn down under a serving host | 0 / 3,000 | |
| | `exec-admission`, `hold-op-open`, `start-check-claim-gen`, `exec-writer` (J2-R2-8; claim rev 6.8.1) | a paused open from an earlier operation lands after the commit while the source's row is still held; a request wakes the source | held, each, and under every proper subset | all four: **violated**, INV-1 (the non-exec source is admitted cold into a fresh generation restored from its own region's old files and serves beside the target) | 0 / 3,000 | |
| | `start-check` (INV-4) | the same, dropping the whole start check | retired in rev 7.10: with every restore from the box's own region, the stale source finds nothing of the target's generation to restore and cannot start; subsumed (`expected-outcomes.txt`) | | 0 | |
| -| `strict-spawn` (J-D3) | the source runs a main process and a descendant placed as its parent was; the move cuts | held | with `evidence-whole-tree`: **violated**, INV-1 | 9 / 3,000, 110 / 30,000, 374 / 100,000 | |
| +| `strict-spawn` (J-D3) | the source runs a main process and a descendant placed as its parent was; the move cuts | held | with `evidence-whole-tree`: **violated**, INV-1 | 13 / 3,000 | |
| | `touched-incomplete` (J-N5) | a legacy host with a pre-release replica in another region is adopted, then deleted | held | with `legacy-discovery`: **violated**, INV-10 after `free` | 0 / 3,000 | |
| | `registration-check` (CC21) | the first create of a host registers and its console pauses; a purge of the app drains the expired registration, tears the store down and finishes; the creator resumes | held | with `fence-etag`: **violated**; with `purge-claim-fence`: **violated** | 0 / 3,000 | |
| -| `fence-by-installation` (claim rev 6.4 §6.4, R3-3) | UK→US, then US→UK; **unmutated, the instance must serve on UK again, running** | **violated**: the landing probe on UK is refused by the box's own installation record (INV-3) | | 327 / 3,000, 2,978 / 30,000 | |
| -| `fence-stamp` (claim rev 6.4 §6.4, R4-2) | a config-sync pass selects the row under the first installation and pauses; UK→US→UK; a new bundle is published; the pass takes the guard | held: the host guard's fresh re-validation refuses its stale bundle | with `hostguard`: **violated**, INV-6, a pass of a retired installation wrote host state | 332 / 3,000, 2,946 / 30,000 | |
| -| `orphan-order` (claim rev 6 §5.1 step 5, R3-2) | the recovery pass's cleanup pauses after its first observation; a create removes the orphan, claims and publishes; the paused cleanup resumes | **violated**: the record of the incarnation the claim names is deleted | | 0 / 3,000, 1 / 30,000 | |
| -| `sweep-namespace` (claim rev 6 §6.2a, R3-4) | a replication PUT of incarnation 1 completes after 33 recreates dropped it from `retired_incarnations` | **violated**: INV-10, residue the sweep never finds | | 544 / 3,000 | |
| -| `live-set-region` (claim rev 6.4 §6.2a, R4-3) | a legacy host serving in UK with an earlier replica in US; discovery parks US; an old US replication PUT lands after | **violated**: INV-10, residue the US sweep exempts by key alone | | 1 / 3,000, 18 / 30,000 | |
| -| `restore-overlap` (§5.1, R4-1) | a generation's snapshot ends at the push's TXID; the only continuation is a compacted file starting one below it; the disk is lost and the host wakes cold | **violated**: INV-3 since rev 7.10, the restore stops short of the certificate's `max_txid` and the box never starts (rev 7.4's `min == current + 1` discarded the file and lost four writes) | | 0 / 3,000, 1 / 30,000 | |
| -| `restore-gap-closed` (§5.1, R4-1) | the same generation with the next file missing and the one after current | **violated**: a restore across the gap returns a database short of the acknowledged writes | | witness; sweep 0 / 3,000, 0 / 30,000 | |
| -| `restore-anchor` (§5.1 step 7, R5-1) | a push installs a snapshot alone; the host wakes, writes three times, replicates, loses its disk and wakes cold | **violated**: INV-2, every write since the push is lost: replication restarted at TXID 1 below the snapshot and the planner skipped the files (facts R5-1a, b) | | 50 / 3,000, 521 / 30,000, 1,740 / 100,000 | |
| -| `root-advance` (§5.1 step 8, R5-3) | a push, then twelve replicated writes: four compactions, four snapshot rotations, retention expiring every file that continued from the pinned snapshot; the disk is lost | **violated**: INV-3, the host refuses to wake on a gap the retention made, while the newest snapshot holds every write (facts R5-3d, e) | | 9 / 3,000, 122 / 30,000, 432 / 100,000 | |
| -| `anchor-acked` (§5.1 step 7, R6-1) | a push installs a snapshot alone; the install's anchor PUT is held across forty attempted opens, then released; the host writes, replicates, loses its disk and wakes cold | **violated**: the host opened before its anchor was acknowledged; litestream's position would be 0 and the writes below the snapshot are lost on the cold restore (INV-2) | | 12 / 3,000, 91 / 30,000, 334 / 100,000 | |
| -| `return-stamp` (claim rev 6.5, R6-4) | a dirty rollback; the source's local stamp record is lost after the target's return; the return CAS writes the source installation's stamp back and the source re-initializes from it, installs under it and serves under its probe CAS's new stamp | **violated**: the source activates the target's stamp, issued for another box's installation (INV-6) | | 69 / 3,000, 706 / 30,000, 2,339 / 100,000 | |
| -| `recovery-generation` (claim rev 6.6 §6.4a, R7-1), three scenarios and a crash | writer A's upload `[N+1]` is held in flight, A dies with its disk, B wakes; (i) B replicates its own `[N+1]`, then A's lands; (ii) A's lands after B's position is initialized and before B's upload, so litestream's loop skips B's file; (iii) A's held write updated K, B durably updates K, A's lands; (iv) a clean stop drains, then the agent crashes before the certificate | **violated** in each: with the rule B recovers into a fresh generation and A's file lands in the dead one; without it B's acknowledged write is lost on the cold restore taken the moment A's file lands (INV-2), or no recovery runs after the crash (iv) | | 10 / 3,000, 100 / 30,000, 354 / 100,000 | |
| -| `closed-marker` (claim rev 6.6 §6.4a; a certificate since rev 7.9) | a stale certificate (`max_txid` behind the remote maximum) beside the dead writer's outstanding upload | **violated**: taken as intact, B continues in place and A's late file replaces B's (INV-2) | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `close-waits` (claim rev 6.6 §6.4a) | a clean stop with an upload in flight | **violated**: written at once, the marker vouches for an upload that has not returned | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `newest-l0` (§5.1 step 8, R7-3) | the local position runs ahead of the uploads across two compactions and snapshot rotations | **violated**: retention below the previous snapshot removes the newest uploaded level-0 file | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `build-completion` (§5.1 step 2, §7.6, R7-4) | a push's build with its snapshot, then its anchor, held, the agent crashing in between each | **violated**: `generation.json` published before its snapshot landed (INV-11) | | 707 / 3,000 | |
| -| `evidence-whole-tree` (§6.1, J-D3) | an adopted legacy host runs a descendant outside the cgroup; the move cuts | **violated**: evidence blind to the escapee certifies the stop and two boxes run the host (INV-1) | | 0 / 3,000, 5 / 30,000 | |
| -| `timer-freeze` (J-N14) | a registered timer on the source; the move holds the row; the runner's deliveries are refused; a clean rollback | **violated**: the refused deliveries advanced the runner's bookkeeping, the timer digest differs from the stop's, the source is `stuck` | | 3 / 3,000, 13 / 30,000 | |
| -| `recovery-current-inputs` (§7.7, §7.8; R2-5) | a bundle is published after admission; the target writes; the rollback is dirty | **violated**: `stuck` | | 33 / 3,000 | |
| -| `writer-session` (claim rev 6.8 §6.4a, R8-1) | two sessions certify; the third dies with its disk and an upload in flight; the dead certificates still match the remote maximum | **violated**: the newest certificate readmits the box into the generation and the late upload replaces its file (INV-2) | | 4 / 3,000, 27 / 30,000, 77 / 100,000 | |
| -| `admit-everywhere` (claim rev 6.8 §6.4a, R8-2), two scenarios | (i) the committed move's target dies with its disk and an upload in flight before finalization; (ii) the landing's probe dies with its disk and an upload in flight in its settle window | **violated** in each: admitted for ordinary wakes alone, the target continues the generation and the late upload replaces its file (INV-2); the restarted probe reuses the install generation and the landing's restore loses its write | | 711 / 3,000, 6,844 / 30,000, 23,089 / 100,000 | |
| -| `exec-writer` (claim rev 6.8.1) | the admission scenario above | held alone, and under every proper subset of the four | with the three box-side fences: **violated**, INV-6 | 0 / 3,000, 0 / 30,000 | |
| -| `valid-ltx` (R8-3) | a create's first wake into an empty generation (no LTX file), then a move of the never-written incarnation, whose seal is at position 0 | **violated**: the install writes `[1, 0]` and `[0, 0]`, which the encoder refuses (INV-12) | | 39 / 3,000, 395 / 30,000 | |
| -| `close-evidence` (claim rev 6.8 §6.4a, R8-5) | an upload is held past the client's timeout; the retry lands; the original stays outstanding; a clean stop | **violated**: the certificate is written while the original is unresolved | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `close-evidence` (R9-5), two more scenarios | (i) a compaction's level-1 PUT is held past the client's timeout, the next pass retries and lands, the original completes afterwards; (ii) a snapshot PUT completes on the server after the client gave up on it | **violated** in each: the certificate is written while a request of the session was retried after a timeout, or its response was lost | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `remote-baseline` (claim rev 6.9 §6.4a, R9-1) | a session closes cleanly through N+1; the box's local database is a cached copy through N; the next wake | **violated**: the stale copy is served without the acknowledged write, and its upload for N+1 is skipped at the remote position (INV-2) | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `writes-lost` (claim rev 6.9 §6.4a, R9-2) | a writer acknowledges a write and crashes before uploading it; the next wake is cold | **violated**: lost silently, the serving database differs from the acknowledged writes (INV-2); with the rule the admission records writes_lost and alerts | | 13 / 3,000, 110 / 30,000, 368 / 100,000 | |
| +| `fence-by-installation` (claim rev 6.4 §6.4, R3-3) | UK→US, then US→UK; **unmutated, the instance must serve on UK again, running** | **violated**: the landing probe on UK is refused by the box's own installation record (INV-3) | | 303 / 3,000 | |
| +| `fence-stamp` (claim rev 6.4 §6.4, R4-2) | a config-sync pass selects the row under the first installation and pauses; UK→US→UK; a new bundle is published; the pass takes the guard | held: the host guard's fresh re-validation refuses its stale bundle | with `hostguard`: **violated**, INV-6, a pass of a retired installation wrote host state | 306 / 3,000 | |
| +| `orphan-order` (claim rev 6 §5.1 step 5, R3-2) | the recovery pass's cleanup pauses after its first observation; a create removes the orphan, claims and publishes; the paused cleanup resumes | **violated**: the record of the incarnation the claim names is deleted | | witness; sweep 0 / 3,000 | |
| +| `sweep-namespace` (claim rev 6 §6.2a, R3-4) | a replication PUT of incarnation 1 completes after 33 recreates dropped it from `retired_incarnations` | **violated**: INV-10, residue the sweep never finds | | 542 / 3,000 | |
| +| `live-set-region` (claim rev 6.4 §6.2a, R4-3) | a legacy host serving in UK with an earlier replica in US; discovery parks US; an old US replication PUT lands after | **violated**: INV-10, residue the US sweep exempts by key alone | | 2 / 3,000 | |
| +| `restore-overlap` (§5.1, R4-1) | a generation's snapshot ends at the push's TXID; the only continuation is a compacted file starting one below it; the disk is lost and the host wakes cold | **violated**: INV-3 since rev 7.10, the restore stops short of the certificate's `max_txid` and the box never starts (rev 7.4's `min == current + 1` discarded the file and lost four writes) | | witness; sweep 0 / 3,000 | |
| +| `restore-gap-closed` (§5.1, R4-1) | the same generation with the next file missing and the one after current | **violated**: a restore across the gap returns a database short of the acknowledged writes | | witness; sweep 0 / 3,000 | |
| +| `restore-anchor` (§5.1 step 7, R5-1) | a push installs a snapshot alone; the host wakes, writes three times, replicates, loses its disk and wakes cold | **violated**: INV-2, every write since the push is lost: replication restarted at TXID 1 below the snapshot and the planner skipped the files (facts R5-1a, b) | | 55 / 3,000 | |
| +| `root-advance` (§5.1 step 8, R5-3) | a push, then twelve replicated writes: four compactions, four snapshot rotations, retention expiring every file that continued from the pinned snapshot; the disk is lost | **violated**: INV-3, the host refuses to wake on a gap the retention made, while the newest snapshot holds every write (facts R5-3d, e) | | 17 / 3,000 | |
| +| `anchor-acked` (§5.1 step 7, R6-1) | a push installs a snapshot alone; the install's anchor PUT is held across forty attempted opens, then released; the host writes, replicates, loses its disk and wakes cold | **violated**: the host opened before its anchor was acknowledged; litestream's position would be 0 and the writes below the snapshot are lost on the cold restore (INV-2) | | 12 / 3,000 | |
| +| `return-stamp` (claim rev 6.5, R6-4) | a dirty rollback; the source's local stamp record is lost after the target's return; the return CAS writes the source installation's stamp back and the source re-initializes from it, installs under it and serves under its probe CAS's new stamp | **violated**: the source activates the target's stamp, issued for another box's installation (INV-6) | | 69 / 3,000 | |
| +| `recovery-generation` (claim rev 6.6 §6.4a, R7-1), three scenarios and a crash | writer A's upload `[N+1]` is held in flight, A dies with its disk, B wakes; (i) B replicates its own `[N+1]`, then A's lands; (ii) A's lands after B's position is initialized and before B's upload, so litestream's loop skips B's file; (iii) A's held write updated K, B durably updates K, A's lands; (iv) a clean stop drains, then the agent crashes before the certificate | **violated** in each: with the rule B recovers into a fresh generation and A's file lands in the dead one; without it B's acknowledged write is lost on the cold restore taken the moment A's file lands (INV-2), or no recovery runs after the crash (iv) | | 12 / 3,000 | |
| +| `closed-marker` (claim rev 6.6 §6.4a; a certificate since rev 7.9) | a stale certificate (`max_txid` behind the remote maximum) beside the dead writer's outstanding upload | **violated**: taken as intact, B continues in place and A's late file replaces B's (INV-2) | | witness; sweep 0 / 3,000 | |
| +| `close-waits` (claim rev 6.6 §6.4a) | a clean stop with an upload in flight | **violated**: written at once, the marker vouches for an upload that has not returned | | witness; sweep 0 / 3,000 | |
| +| `newest-l0` (§5.1 step 8, R7-3) | the local position runs ahead of the uploads across two compactions and snapshot rotations | **violated**: retention below the previous snapshot removes the newest uploaded level-0 file | | witness; sweep 0 / 3,000 | |
| +| `build-completion` (§5.1 step 2, §7.6, R7-4) | a push's build with its snapshot, then its anchor, held, the agent crashing in between each | **violated**: `generation.json` published before its snapshot landed (INV-11) | | 710 / 3,000 | |
| +| `evidence-whole-tree` (§6.1, J-D3) | an adopted legacy host runs a descendant outside the cgroup; the move cuts | **violated**: evidence blind to the escapee certifies the stop and two boxes run the host (INV-1) | | witness; sweep 0 / 3,000 | |
| +| `timer-freeze` (J-N14) | a registered timer on the source; the move holds the row; the runner's deliveries are refused; a clean rollback | **violated**: the refused deliveries advanced the runner's bookkeeping, the timer digest differs from the stop's, the source is `stuck` | | 2 / 3,000 | |
| +| `recovery-current-inputs` (§7.7, §7.8; R2-5) | a bundle is published after admission; the target writes; the rollback is dirty | **violated**: `stuck` | | 37 / 3,000 | |
| +| `writer-session` (claim rev 6.8 §6.4a, R8-1) | two sessions certify; the third dies with its disk and an upload in flight; the dead certificates still match the remote maximum | **violated**: the newest certificate readmits the box into the generation and the late upload replaces its file (INV-2) | | 7 / 3,000 | |
| +| `admit-everywhere` (claim rev 6.8 §6.4a, R8-2), two scenarios | (i) the committed move's target dies with its disk and an upload in flight before finalization; (ii) the landing's probe dies with its disk and an upload in flight in its settle window | **violated** in each: admitted for ordinary wakes alone, the target continues the generation and the late upload replaces its file (INV-2); the restarted probe reuses the install generation and the landing's restore loses its write | | 717 / 3,000 | |
| +| `exec-writer` (claim rev 6.8.1) | the admission scenario above | held alone, and under every proper subset of the four | with the three box-side fences: **violated**, INV-6 | 0 / 3,000 | |
| +| `valid-ltx` (R8-3) | a create's first wake into an empty generation (no LTX file), then a move of the never-written incarnation, whose seal is at position 0 | **violated**: the install writes `[1, 0]` and `[0, 0]`, which the encoder refuses (INV-12) | | 38 / 3,000 | |
| +| `close-evidence` (claim rev 6.8 §6.4a, R8-5) | an upload is held past the client's timeout; the retry lands; the original stays outstanding; a clean stop | **violated**: the certificate is written while the original is unresolved | | witness; sweep 0 / 3,000 | |
| +| `close-evidence` (R9-5), two more scenarios | (i) a compaction's level-1 PUT is held past the client's timeout, the next pass retries and lands, the original completes afterwards; (ii) a snapshot PUT completes on the server after the client gave up on it | **violated** in each: the certificate is written while a request of the session was retried after a timeout, or its response was lost | | witness; sweep 0 / 3,000 | |
| +| `remote-baseline` (claim rev 6.9 §6.4a, R9-1) | a session closes cleanly through N+1; the box's local database is a cached copy through N; the next wake | **violated**: the stale copy is served without the acknowledged write, and its upload for N+1 is skipped at the remote position (INV-2) | | witness; sweep 0 / 3,000 | |
| +| `writes-lost` (claim rev 6.9 §6.4a, R9-2) | a writer acknowledges a write and crashes before uploading it; the next wake is cold | **violated**: lost silently, the serving database differs from the acknowledged writes (INV-2); with the rule the admission records writes_lost and alerts | | 13 / 3,000 | |
| | `admit-bind-op` (claim rev 6.9 §6.4a, R9-4) | a wake's admission closure computed under serving resumes after a delete began that kept session, generation and executor | held: the model's general CAS condition on `op.id` (C2) refuses it too | with `claim-cas-opid`: **violated**, INV-13, a writer admitted into a host being deleted | 0; the pair 0 / 30,000, 0 / 100,000 | |
| -| `admit-before-start` (claim rev 6.10 §6.4a, R10-1) | a background worker acknowledges a write right after the app starts; the box crashes before replication opens; admitted before the start, the acknowledgement is the session's and the next cold admission declares it | **violated**: under rev 6.8.2's order the acknowledgement is in a database the next warm admission purges silently (INV-2 local) | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `baseline-live` (claim rev 6.10 §6.4a, R10-2) | a cold admission into a fresh generation; the box crashes before the first upload; the predecessor's retirement runs out its quiet time; the recovery | **violated**: with the chore at the CAS the predecessor is parked and the recovery restores nothing (INV-2 local) | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `clean-return-identity` (claim rev 6.12, R11-4) | a move's target is probed and writes nothing; the seal recorded `src_covered`; a clean rollback; the source's re-admission | held: the record's predecessor is the target's writer and its coverage `clean-return`; nothing is declared | **violated** under the mutation: INV-16, the record names the target's session and box with the source's generation, a writer that never was | 15 / 3,000, 112 / 30,000, 332 / 100,000 | |
| -| `absent-marker-origin` (R11-1; its own rule since rev 7.13) | an adopted host's origin replica with durable writes and no `generation.json`; a cold admission crashes before its first upload; the ordinary sweep runs for three horizons; the recovery | **violated**: the sweep, reading absence as agreement, parks the origin and the recovery restores nothing (INV-2 local) | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `session-scoped-loss` (R12-1) | two writer sessions of one box each acknowledged an unuploaded write; a `writes_lost` record for the second is applied (a constructed-state oracle test) | held: only the second session's write is exempted | **violated** under the mutation: INV-18, the record for session 2 exempted session 1's undeclared write | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `foreign-region-uncovered` (claim rev 6.14 item 5, R12-3) | a probed landing whose target published; the chore's quiet time brought forward; the source region's runner works within the settle window; a clean rollback | held: no chore was queued into the source's region, the return restores the source's generation | **violated** under the mutation: the chore parked the rollback's baseline and the return restored an empty database (INV-2) | 2 / 3,000, 34 / 30,000 | |
| -| `cover-at-park` (claim rev 6.14 item 6, R12-3), three scenarios | (i) a committed move: the commit's CAS queues the source region's park; (ii) the record flips to committed and every actor pauses past the horizon before anyone follows it; (iii) `followRecord` is called again after the commit | held: in each the target's record is covered in the CAS that queued the park, one park is queued, the replay is refused | **violated** under the mutation: INV-17 as the source region's park completes, the target's record uncovered | 34 / 3,000, 337 / 30,000 | |
| -| `probe-window` (R12-2) | the landing probe's launch environment is ready exactly 30 steps after the attempt's first app stage | held: the attempt fails before the start, the next admission's probe is accepted | **violated** under the mutation: the expired attempt starts and is accepted (INV-19) | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `seal-return` (rev 7.11 §7.8) | the source's last upload is in flight when the cut stops it; the landing is rolled back after its build; the return must carry the seal | **violated**: treated as clean, the source's cold admission declares a write the landing's built generation holds (INV-15) | | 0 / 3,000, 8 / 30,000, 22 / 100,000 | |
| -| `close-evidence` (R10-7), two more scenarios | (i) a fresh generation's first upload is held past the client's timeout and its retry lands; (ii) a warm admission's anchor is held and its retry lands; then a clean stop | **violated** in each: the certificate is written while a request of the session was retried after a timeout | | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| +| `admit-before-start` (claim rev 6.10 §6.4a, R10-1) | a background worker acknowledges a write right after the app starts; the box crashes before replication opens; admitted before the start, the acknowledgement is the session's and the next cold admission declares it | **violated**: under rev 6.8.2's order the acknowledgement is in a database the next warm admission purges silently (INV-2 local) | | witness; sweep 0 / 3,000 | |
| +| `baseline-live` (claim rev 6.10 §6.4a, R10-2) | a cold admission into a fresh generation; the box crashes before the first upload; the predecessor's retirement runs out its quiet time; the recovery | **violated**: with the chore at the CAS the predecessor is parked and the recovery restores nothing (INV-2 local) | | witness; sweep 0 / 3,000 | |
| +| `clean-return-identity` (claim rev 6.12, R11-4) | a move's target is probed and writes nothing; the seal recorded `src_covered`; a clean rollback; the source's re-admission | held: the record's predecessor is the target's writer and its coverage `clean-return`; nothing is declared | **violated** under the mutation: INV-16, the record names the target's session and box with the source's generation, a writer that never was | 13 / 3,000 | |
| +| `absent-marker-origin` (R11-1; its own rule since rev 7.13) | an adopted host's origin replica with durable writes and no `generation.json`; a cold admission crashes before its first upload; the ordinary sweep runs for three horizons; the recovery | **violated**: the sweep, reading absence as agreement, parks the origin and the recovery restores nothing (INV-2 local) | | witness; sweep 0 / 3,000 | |
| +| `session-scoped-loss` (R12-1) | two writer sessions of one box each acknowledged an unuploaded write; a `writes_lost` record for the second is applied (a constructed-state oracle test) | held: only the second session's write is exempted | **violated** under the mutation: INV-18, the record for session 2 exempted session 1's undeclared write | witness; sweep 0 / 3,000 | |
| +| `foreign-region-uncovered` (claim rev 6.14 item 5, R12-3) | a probed landing whose target published; the chore's quiet time brought forward; the source region's runner works within the settle window; a clean rollback | held: no chore was queued into the source's region, the return restores the source's generation | **violated** under the mutation: the chore parked the rollback's baseline and the return restored an empty database (INV-2) | 4 / 3,000 | |
| +| `cover-at-park` (claim rev 6.14 item 6, R12-3), three scenarios | (i) a committed move: the commit's CAS queues the source region's park; (ii) the record flips to committed and every actor pauses past the horizon before anyone follows it; (iii) `followRecord` is called again after the commit | held: in each the target's record is covered in the CAS that queued the park, one park is queued, the replay is refused | **violated** under the mutation: INV-17 as the source region's park completes, the target's record uncovered | 29 / 3,000 | |
| +| `probe-window` (R12-2) | the landing probe's launch environment is ready exactly 30 steps after the attempt's first app stage | held: the attempt fails before the start, the next admission's probe is accepted | **violated** under the mutation: the expired attempt starts and is accepted (INV-19) | witness; sweep 0 / 3,000 | |
| +| `persisted-park-scope` (claim rev 6.15 §2, R13-4) | a committed move's source-region park binds its scope in the claim; 45 steps on, the source region's agent restarts mid-park | held: the acknowledgement comes within the commit's evidence time plus the horizon and slack | **violated** under the mutation: the box-local evidence map is gone with the agent, the horizon starts again, the acknowledgement is late (INV-9) | witness; sweep 0 / 3,000 | |
| +| `holderless-park` (claim rev 6.15 §6.2a, R13-4) | a deleted host's region keeps late residue; the free host's sweep and a create requested at once | held: the sweep runs as a holderless parking op, the create waits for `FreeAfterPark`, then serves | **violated** under the mutation: bare chores on the free claim, the create claims the host over the outstanding park (INV-20) | 561 / 3,000 | |
| +| `covered-baseline-refused` (claim rev 6.22 §6.2a, R13-1) | an unfinished run g2 → g1 whose record is covered and whose g1 was retired in the region | held: the start is refused and alerts, the host does not run | **violated** under the mutation: the walk passes over the empty g1 and restores the marker's retired g1 as an empty database (INV-2) | witness; sweep 0 / 3,000 | |
| +| `seal-return` (rev 7.11 §7.8) | the source's last upload is in flight when the cut stops it; the landing is rolled back after its build; the return must carry the seal | **violated**: treated as clean, the source's cold admission declares a write the landing's built generation holds (INV-15) | | witness; sweep 0 / 3,000 | |
| +| `close-evidence` (R10-7), two more scenarios | (i) a fresh generation's first upload is held past the client's timeout and its retry lands; (ii) a warm admission's anchor is held and its retry lands; then a clean stop | **violated** in each: the certificate is written while a request of the session was retried after a timeout | | witness; sweep 0 / 3,000 | |
| **The purge fence, the ETag condition and C5a.** `purge-claim-fence` |
| (CC21) is caught alone by the sweep: 28 / 3,000, 240 / 30,000. |
| @@ -4911,56 +5202,55 @@ combination** (R4 §3): each door rule's two-rule pair with C3a already |
| fails, so the three-rule row is a wider set and inherits no claim that its |
| proper subsets hold. It is no longer run. |
| -**Caught alone: 88 of 101** (66 by the sweep at 3,000; 11 by the sweep at |
| -30,000, marked †; 0 at 100,000, |
| -marked ††; 11 by their witness alone, marked ‡). |
| +**Caught alone: 90 of 104** (69 by the sweep at 3,000; 21 by their witness alone, marked ‡; the sweeps at 30,000 and 100,000 were not run for rev 7.14 (CPU budget; Paul 2026-10-06), so the one rare rule the sweep reaches only there, `hostguard`, has no verdict this round). |
| | rule | seeds failing | | rule | seeds failing | |
| |---|---|---|---|---| |
| -| `abort-target-owner` | 933 / 3,000 | | `absent-marker-origin` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `admission-registration` | 34 / 3,000 | | `admit-before-start` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `admit-everywhere` | 711 / 3,000, 6,844 / 30,000, 23,089 / 100,000 | | `anchor-acked` | 12 / 3,000, 91 / 30,000, 334 / 100,000 | |
| -| `baseline-live` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | | `build-completion` | 707 / 3,000 | |
| -| `cancelled-creates` | 385 / 3,000 | | `claim-never-deleted` | 4 / 3,000, 57 / 30,000 | |
| -| `claim-op-exclusive` | 82 / 3,000 | | `clean-return-identity` | 15 / 3,000, 112 / 30,000, 332 / 100,000 | |
| -| `close-evidence` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | | `close-waits` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | |
| -| `closed-marker` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | | `commit-before-open` | 2 / 3,000, 48 / 30,000 | |
| -| `cover-at-park` | 34 / 3,000, 337 / 30,000 | | `cut-deadline` | 39 / 3,000 | |
| -| `declare-lost-compute` † | 0 / 3,000, 1 / 30,000, 1 / 100,000 | | `dirty-return` | 1 / 3,000, 9 / 30,000 | |
| -| `evidence-from-state` | 2,610 / 3,000 | | `evidence-whole-tree` † | 0 / 3,000, 5 / 30,000 | |
| -| `fence-by-installation` | 327 / 3,000, 2,978 / 30,000 | | `fence-etag` | 26 / 3,000, 226 / 30,000 | |
| -| `fence-stamp` | 332 / 3,000, 2,946 / 30,000 | | `files-carried` | 29 / 3,000 | |
| -| `floor-boot-recovery` | 2,577 / 3,000 | | `foreign-region-uncovered` | 2 / 3,000, 34 / 30,000 | |
| -| `fresh-admission` | 10 / 3,000 | | `fresh-incarnation` | 41 / 3,000 | |
| -| `generation-conditional` | 1 / 3,000, 9 / 30,000, 36 / 100,000 | | `hostguard` † | 0 / 3,000, 2 / 30,000, 2 / 100,000 | |
| -| `legacy-discovery` | 367 / 3,000, 3,561 / 30,000 | | `live-set-region` | 1 / 3,000, 18 / 30,000 | |
| -| `location-per-incarnation` | 28 / 3,000, 358 / 30,000, 1,185 / 100,000 | | `lost-quarantine` † | 0 / 3,000, 5 / 30,000 | |
| -| `lost-return-park` | 2 / 3,000, 27 / 30,000, 64 / 100,000 | | `markers-last` † | 0 / 3,000, 4 / 30,000 | |
| -| `newest-l0` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | | `obligations-block-ops` | 29 / 3,000 | |
| -| `orphan-no-deadline` | 41 / 3,000 | | `orphan-order` † | 0 / 3,000, 1 / 30,000 | |
| -| `park-all-versions` | 564 / 3,000 | | `park-by-version` | 2,527 / 3,000 | |
| -| `park-skip-lock` | 2,728 / 3,000 | | `participant-rows` | 4 / 3,000 | |
| -| `probe-window` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | | `purge-adopts` | 7 / 3,000 | |
| -| `purge-claim-fence` | 23 / 3,000, 235 / 30,000 | | `purge-journal` | 1,888 / 3,000 | |
| -| `purge-reserve-first` | 2,125 / 3,000 | | `quiet-before-ack` | 180 / 3,000 | |
| -| `recovery-current-inputs` | 33 / 3,000 | | `recovery-generation` | 10 / 3,000, 100 / 30,000, 354 / 100,000 | |
| -| `recovery-pass` | 2,473 / 3,000 | | `registration-recovery` | 2,114 / 3,000 | |
| -| `remote-baseline` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | | `restore-anchor` | 50 / 3,000, 521 / 30,000, 1,740 / 100,000 | |
| -| `restore-by-generation` | 124 / 3,000 | | `restore-gap-closed` ‡ | witness; sweep 0 / 3,000, 0 / 30,000 | |
| -| `restore-overlap` † | 0 / 3,000, 1 / 30,000 | | `retirement-ids` | 426 / 3,000 | |
| -| `return-stamp` | 69 / 3,000, 706 / 30,000, 2,339 / 100,000 | | `revalidate-before-effect` | 15 / 3,000, 178 / 30,000 | |
| -| `revert-journal` | 12 / 3,000 | | `rollback-journal` | 1 / 3,000, 9 / 30,000 | |
| -| `root-advance` | 9 / 3,000, 122 / 30,000, 432 / 100,000 | | `sdk-no-resign` | 10 / 3,000 | |
| -| `seal-by-version` † | 0 / 3,000, 5 / 30,000 | | `seal-return` † | 0 / 3,000, 8 / 30,000, 22 / 100,000 | |
| -| `session-scoped-loss` ‡ | witness; sweep 0 / 3,000, 0 / 30,000, 0 / 100,000 | | `sign-at-check` | 9 / 3,000 | |
| -| `sign-before-safeuntil` | 20 / 3,000 | | `source-readiness` | 10 / 3,000 | |
| -| `staging-quiet` † | 0 / 3,000, 1 / 30,000 | | `stale-hold-release` † | 0 / 3,000, 14 / 30,000, 52 / 100,000 | |
| -| `start-check` | 17 / 3,000, 214 / 30,000 | | `start-check-claim-gen` | 14 / 3,000, 167 / 30,000 | |
| -| `straggler-sweep` | 783 / 3,000 | | `strict-spawn` | 9 / 3,000, 110 / 30,000, 374 / 100,000 | |
| -| `sweep-namespace` | 544 / 3,000 | | `sweep-staging` | 32 / 3,000 | |
| -| `target-park` | 17 / 3,000 | | `timer-canonical` | 2 / 3,000 | |
| -| `timer-freeze` | 3 / 3,000, 13 / 30,000 | | `valid-ltx` | 39 / 3,000, 395 / 30,000 | |
| -| `writer-session` | 4 / 3,000, 27 / 30,000, 77 / 100,000 | | `writes-lost` | 13 / 3,000, 110 / 30,000, 368 / 100,000 | |
| +| `abort-target-owner` | 962 / 3,000 | | `absent-marker-origin` ‡ | witness; sweep 0 / 3,000 | |
| +| `admission-registration` | 48 / 3,000 | | `admit-before-start` ‡ | witness; sweep 0 / 3,000 | |
| +| `admit-everywhere` | 717 / 3,000 | | `anchor-acked` | 12 / 3,000 | |
| +| `baseline-live` ‡ | witness; sweep 0 / 3,000 | | `build-completion` | 710 / 3,000 | |
| +| `cancelled-creates` | 377 / 3,000 | | `claim-never-deleted` | 5 / 3,000 | |
| +| `claim-op-exclusive` | 120 / 3,000 | | `clean-return-identity` | 13 / 3,000 | |
| +| `close-evidence` ‡ | witness; sweep 0 / 3,000 | | `close-waits` ‡ | witness; sweep 0 / 3,000 | |
| +| `closed-marker` ‡ | witness; sweep 0 / 3,000 | | `commit-before-open` | 3 / 3,000 | |
| +| `cover-at-park` | 29 / 3,000 | | `covered-baseline-refused` ‡ | witness; sweep 0 / 3,000 | |
| +| `cut-deadline` | 40 / 3,000 | | `declare-lost-compute` ‡ | witness; sweep 0 / 3,000 | |
| +| `dirty-return` | 1 / 3,000 | | `evidence-from-state` | 2,632 / 3,000 | |
| +| `evidence-whole-tree` ‡ | witness; sweep 0 / 3,000 | | `fence-by-installation` | 303 / 3,000 | |
| +| `fence-etag` | 22 / 3,000 | | `fence-stamp` | 306 / 3,000 | |
| +| `files-carried` | 25 / 3,000 | | `floor-boot-recovery` | 2,563 / 3,000 | |
| +| `foreign-region-uncovered` | 4 / 3,000 | | `fresh-admission` | 11 / 3,000 | |
| +| `fresh-incarnation` | 53 / 3,000 | | `generation-conditional` ‡ | witness; sweep 0 / 3,000 | |
| +| `holderless-park` | 561 / 3,000 | | `legacy-discovery` | 367 / 3,000 | |
| +| `live-set-region` | 2 / 3,000 | | `location-per-incarnation` | 29 / 3,000 | |
| +| `lost-quarantine` ‡ | witness; sweep 0 / 3,000 | | `lost-return-park` | 1 / 3,000 | |
| +| `markers-last` ‡ | witness; sweep 0 / 3,000 | | `newest-l0` ‡ | witness; sweep 0 / 3,000 | |
| +| `obligations-block-ops` | 21 / 3,000 | | `orphan-no-deadline` | 45 / 3,000 | |
| +| `orphan-order` ‡ | witness; sweep 0 / 3,000 | | `park-all-versions` | 585 / 3,000 | |
| +| `park-by-version` | 2,539 / 3,000 | | `park-skip-lock` | 2,733 / 3,000 | |
| +| `participant-rows` | 3 / 3,000 | | `persisted-park-scope` ‡ | witness; sweep 0 / 3,000 | |
| +| `probe-window` ‡ | witness; sweep 0 / 3,000 | | `purge-adopts` | 7 / 3,000 | |
| +| `purge-claim-fence` | 28 / 3,000 | | `purge-journal` | 1,897 / 3,000 | |
| +| `purge-reserve-first` | 2,144 / 3,000 | | `quiet-before-ack` | 152 / 3,000 | |
| +| `recovery-current-inputs` | 37 / 3,000 | | `recovery-generation` | 12 / 3,000 | |
| +| `recovery-pass` | 2,431 / 3,000 | | `registration-recovery` | 2,011 / 3,000 | |
| +| `remote-baseline` ‡ | witness; sweep 0 / 3,000 | | `restore-anchor` | 55 / 3,000 | |
| +| `restore-by-generation` | 126 / 3,000 | | `restore-gap-closed` ‡ | witness; sweep 0 / 3,000 | |
| +| `restore-overlap` ‡ | witness; sweep 0 / 3,000 | | `retirement-ids` | 459 / 3,000 | |
| +| `return-stamp` | 69 / 3,000 | | `revalidate-before-effect` | 14 / 3,000 | |
| +| `revert-journal` | 13 / 3,000 | | `rollback-journal` | 1 / 3,000 | |
| +| `root-advance` | 17 / 3,000 | | `sdk-no-resign` | 12 / 3,000 | |
| +| `seal-by-version` | 1 / 3,000 | | `seal-return` ‡ | witness; sweep 0 / 3,000 | |
| +| `session-scoped-loss` ‡ | witness; sweep 0 / 3,000 | | `sign-at-check` | 16 / 3,000 | |
| +| `sign-before-safeuntil` | 15 / 3,000 | | `source-readiness` | 12 / 3,000 | |
| +| `staging-quiet` | 1 / 3,000 | | `stale-hold-release` | 1 / 3,000 | |
| +| `start-check` | 17 / 3,000 | | `start-check-claim-gen` | 15 / 3,000 | |
| +| `straggler-sweep` | 770 / 3,000 | | `strict-spawn` | 13 / 3,000 | |
| +| `sweep-namespace` | 542 / 3,000 | | `sweep-staging` | 36 / 3,000 | |
| +| `target-park` | 16 / 3,000 | | `timer-canonical` | 2 / 3,000 | |
| +| `timer-freeze` | 2 / 3,000 | | `valid-ltx` | 38 / 3,000 | |
| +| `writer-session` | 7 / 3,000 | | `writes-lost` | 13 / 3,000 | |
| **Caught only in a combination: 9 rules**, every live combination rerun this |
| round; `admit-bind-op` joins with `claim-cas-opid` (R9-4); the `start-check` |
| @@ -4975,19 +5265,19 @@ subset in the gate. |
| | combination | sweep | partners alone (sweep) | witness | what the model finds | |
| |---|---|---|---|---| |
| -| `purge-claim-fence` + `fence-etag` (**the re-read alone**, rev 7's CC21 as proposed) | 342 / 30,000 | `purge-claim-fence` 23 / 3,000, 235 / 30,000, `fence-etag` 26 / 3,000, 226 / 30,000 | (the two `registration-check` rows below) | a store destroyed under a creating or serving host | |
| -| `registration-check` + `purge-claim-fence` | 274 / 30,000 | `registration-check` 0 / 3,000, `purge-claim-fence` 23 / 3,000, 235 / 30,000 | violated | the same | |
| -| `registration-check` + `fence-etag` | 267 / 30,000 | `registration-check` 0 / 3,000, `fence-etag` 26 / 3,000, 226 / 30,000 | violated | the same | |
| -| `exec-admission` + `hold-op-open` + `start-check-claim-gen` + `exec-writer` | 166 / 30,000, 574 / 100,000 | `exec-admission` 0 / 3,000, `hold-op-open` 0 / 3,000, `start-check-claim-gen` 14 / 3,000, 167 / 30,000, `exec-writer` 0 / 3,000, 0 / 30,000 | violated, INV-1 | the non-exec source admitted cold beside the target, Astra's J2-R2-8 trace under writer sessions | |
| +| `purge-claim-fence` + `fence-etag` (**the re-read alone**, rev 7's CC21 as proposed) | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `purge-claim-fence` 28 / 3,000, `fence-etag` 22 / 3,000 | (the two `registration-check` rows below) | a store destroyed under a creating or serving host | |
| +| `registration-check` + `purge-claim-fence` | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `registration-check` 0 / 3,000, `purge-claim-fence` 28 / 3,000 | violated | the same | |
| +| `registration-check` + `fence-etag` | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `registration-check` 0 / 3,000, `fence-etag` 22 / 3,000 | violated | the same | |
| +| `exec-admission` + `hold-op-open` + `start-check-claim-gen` + `exec-writer` | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `exec-admission` 0 / 3,000, `hold-op-open` 0 / 3,000, `start-check-claim-gen` 15 / 3,000, `exec-writer` 0 / 3,000 | violated, INV-1 | the non-exec source admitted cold beside the target, Astra's J2-R2-8 trace under writer sessions | |
| | `exec-admission` + `hold-op-open` + `start-check` + `exec-writer` (**historical**, rev 7.9: 7 / 30,000, violated INV-6) | not rerun: the `start-check` witness is retired, subsumed by regional restores | | retired | the stale source cannot restore the target's generation from its own region | |
| -| `admit-bind-op` + `claim-cas-opid` | 0 / 30,000, 0 / 100,000 | `admit-bind-op` 0 / 3,000, 0 / 30,000, `claim-cas-opid` 0 / 3,000 | violated, INV-13 | a stale serving-time closure admits a writer into a host being deleted | |
| +| `admit-bind-op` + `claim-cas-opid` | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `admit-bind-op` 0 / 3,000, `claim-cas-opid` 0 / 3,000 | violated, INV-13 | a stale serving-time closure admits a writer into a host being deleted | |
| | `door-reread` + `location-per-incarnation` (**historical**, rev 7.7: 432 / 30,000, 196 door violations, witness violated) | not rerun: the witness is retired and the rule is subsumed | `location-per-incarnation` 28 / 3,000, 360 / 30,000, 1,179 / 100,000 this round (rev 7.10's row said 336 / 30,000 against its own result of 357, R10-9) | retired | under writer epochs the pair adds nothing the partner's own count does not show; no current witness evidence is claimed | |
| | `door-by-version` + `location-per-incarnation` (**historical**, rev 7.7: 385 / 30,000, 60 door violations, witness violated with C3a alone) | not rerun: the witness is retired and the rule is subsumed | `location-per-incarnation` 28 / 3,000, 360 / 30,000, 1,179 / 100,000 this round | retired | the same | |
| -| `claim-cas-opid` + `revalidate-before-effect` | 859 / 30,000 | `claim-cas-opid` 0 / 3,000, `revalidate-before-effect` 15 / 3,000, 178 / 30,000 | violated | a stale step destroys a store | |
| -| `strict-spawn` + `evidence-whole-tree` | 175 / 30,000 | `strict-spawn` 9 / 3,000, 110 / 30,000, 374 / 100,000, `evidence-whole-tree` 0 / 3,000, 5 / 30,000 | violated | two writers | |
| -| `touched-incomplete` + `legacy-discovery` | 7,475 / 30,000 | `touched-incomplete` 0 / 3,000, `legacy-discovery` 367 / 3,000, 3,561 / 30,000 | violated | a freed host's residue | |
| -| `declare-lost-compute` + `watchdog-independent` | 1 / 30,000, 3 / 100,000 | `declare-lost-compute` 0 / 3,000, 1 / 30,000, 1 / 100,000, `watchdog-independent` 0 / 3,000 | violated | two writers after a paused or frozen target resumes | |
| -| `fence-stamp` + `hostguard` (no longer combination-only) | 3,877 / 30,000 | `fence-stamp` 332 / 3,000, 2,946 / 30,000, `hostguard` 0 / 3,000, 2 / 30,000, 2 / 100,000 | violated | a stale pass writes host state for a retired installation (INV-6); the witness is what shows the stamp load-bearing against the guard's own check | |
| +| `claim-cas-opid` + `revalidate-before-effect` | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `claim-cas-opid` 0 / 3,000, `revalidate-before-effect` 14 / 3,000 | violated | a stale step destroys a store | |
| +| `strict-spawn` + `evidence-whole-tree` | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `strict-spawn` 13 / 3,000, `evidence-whole-tree` witness; sweep 0 / 3,000 | violated | two writers | |
| +| `touched-incomplete` + `legacy-discovery` | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `touched-incomplete` 0 / 3,000, `legacy-discovery` 367 / 3,000 | violated | a freed host's residue | |
| +| `declare-lost-compute` + `watchdog-independent` | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `declare-lost-compute` witness; sweep 0 / 3,000, `watchdog-independent` 0 / 3,000 | violated | two writers after a paused or frozen target resumes | |
| +| `fence-stamp` + `hostguard` (no longer combination-only) | not run for rev 7.14 (CPU budget; Paul 2026-10-06) | `fence-stamp` 306 / 3,000, `hostguard` 0 / 3,000 | violated | a stale pass writes host state for a retired installation (INV-6); the witness is what shows the stamp load-bearing against the guard's own check | |
| Every live combination was rerun on the rev 7.9 model; the gate runs |
| every proper subset of the admission four with the witness, which holds |
| @@ -5407,6 +5697,40 @@ although the seal carries every write; the admitted writer's start |
| agent loop; and the model's C2 already binds every CAS to `op.id`, so |
| the `admit-bind-op` witness needs both rules off. |
| +**Claim rev 6.15 to 6.22 (0bf2f49f), after joint round 13: no change |
| +requested, six notes.** Rev 6.15 and 6.16 added the persisted park scope |
| +and the holderless sweep; rev 6.21 adopted rev 7.13's seven notes; rev |
| +6.22 answers R13-1 to R13-3 (the run walk across regions, coverage in |
| +exactly four ways with warm entries born covered and |
| +`CoverParkedPredecessors`, the `additional_writes_lost` representation |
| +with one alert per declaration) and keeps E's warm-region check with |
| +note 4's reading. Rev 7.14 encodes all of it (§5.1 step 9, §6.4, §7.14's |
| +operative list, §14.2.2). Notes for platform-1e |
| +(`moves-claim-questions.md`, rev 7.14 heading): **(1)** another region's |
| +sweep while the holderless parking op runs **joins** it, adding its own |
| +scoped chores under the same op id, rather than waiting for |
| +`FreeAfterPark`; the claim's "one CAS queues only scoped remote chores |
| +owned by that op" is read to allow later CASes adding to the op; |
| +**(2)** the sweep's chore is acknowledged, with its straggler pass, only |
| +after the scope's `evidence_at + request_limit`, so a free host's |
| +successor create waits up to the horizon after the sweep found residue; |
| +rev 7.13's sweep acknowledged at once; **(3)** the console's recovery |
| +pass leaves a holderless sweep to the obligation runners and replays only |
| +`FreeAfterPark`, for an op whose chores are all acknowledged (a crash |
| +between the last acknowledgement's CAS and nothing: the CAS is one, so |
| +this is belt and braces); **(4)** INV-20 is the model's statement of |
| +"blocks `free`'s successor create": a create's claim CAS never finds an |
| +obligation outstanding; the create **waits** on the parking op rather |
| +than being refused, and `userCreate` does not even plan one while it |
| +runs; **(5)** the covered-baseline refusal also fires where rev 7.13 |
| +restored nothing: an origin swept under an unfinished admission by rev |
| +7.11's sweep (the `absent-marker-origin` mutation) is a covered local |
| +baseline now, and the recovery refuses with an alert instead of |
| +starting on an empty database; both are INV-2 for the witness, the |
| +refusal is the better failure; **(6)** a warm record's `region` is the |
| +admitted box's, which equals its predecessor record's region in every |
| +reachable warm admission, as 6.22 states; the model records the box's. |
| + |
| **Claim rev 6.13 (b3825827) and 6.14 (dc146058), after joint round 12: |
| no change requested, seven notes.** Rev 6.13 adopted rev 7.12's five |
| notes (the lost-target return is `""`; a probe never marks the host |
| @@ -5900,6 +6224,23 @@ answers the rest and reruns every number. |
| | R6-5 (P3) replayed anchor bytes differ (the encoder's `time.Now()`) | the encoding inputs, timestamp included, are journaled in the install manifest before the PUTs and a replay reuses a current object (§5.1 step 2, §7.6 `building`); `TestFact_R6_5_AnchorReplayBytes` shows identical bytes for identical inputs and different bytes one millisecond apart | |
| | fidelity: compaction deleted the newest level-0 file, creating anchor-required cold restores the library would not | compaction keeps the newest input (§14.2.2); time-based level-0 retention stays deferred (§14.2.6) | |
| +### 22.20 Joint round 13 (claim 1915bac2, moves rev 7.13 1f511c42, model 42af7bfc, library E 47426cc1, selector plan 85aa53f8) |
| + |
| +Round 13 found no P1 and judged E merge-ready; it held A, B, C and F on |
| +four P2s. Claim rev 6.22 (0bf2f49f) answers R13-1 to R13-3; E for round |
| +14 is `feat/hostclaim-r713` at f0127321 (47426cc1 plus rev 6.21 and |
| +6.22), F's code is `feat/hostclaim-genselect` at d7621a29 with plan 7b |
| +rev 3 (c3ea8fbd) and the four R13-1 table cases. |
| + |
| +| finding | rev 7.14 | |
| +|---|---| |
| +| R13-4 (P2) the model's sweep queued bare `sweep` chores on a free claim, with no holderless `parking` op, no persisted incarnation, evidence time or request bound; an agent restart cleared the evidence map and started the horizon again | `obligation.Scope` persisted (bound before the first step, or at the sweep's queuing CAS); a free host's sweep is `{kind: parking, intent.park_sweep: "v1"}` with no exec and no holder, freed by `FreeAfterPark` in its last acknowledgement's CAS; `session:<n>` on a serving host; the create waits, INV-20; rules `persisted-park-scope`, `holderless-park`; witnesses `wParkScopeSurvivesRestart`, `wFreeSweepVsCreate` (§6.4, §7.14 item 9, §14.2.2) | |
| +| R13-2 (P2) publication and coverage described different transitions (traversal bound, warm records, the live predecessor), and coverage composition was incomplete in A | claim rev 6.22's complete algorithm encoded: four coverage mechanisms, warm entries born covered, the publication walk over every entry with the precondition that an entry names the published generation, `CoverParkedPredecessors(region, generations)` selective at the sweep's queuing and acknowledgement CASes (§5.1 step 9, §7.14 items 5 and 6) | |
| +| R13-1 (P2) F rejected the interrupted clean-return recovery; B needed the walk stated precisely | §5.1 step 9 states the run walk: a covered foreign link is passed over, a covered local baseline refuses and alerts; `runBaseline` in the model with `restoreCalc` as the reference; rule `covered-baseline-refused`, witness `wCoveredLocalBaseline`; `TestInterruptedCleanReturn` (R → T → S, then R2 → R → T → S) | |
| +| R13-3 (P2) A lacked the all-target-sessions rule and a representation | `additional_writes_lost` as claim rev 6.22 states it: one `writes_lost` plus a list, unique by `(box, session)`, one alert per declaration; the model's `AdditionalWritesLost` (§5.1 step 9, §7.14 item 2) | |
| +| the seven rev 7.13 notes | all adopted in claim rev 6.21 and 6.22; note 4 with the round's reading (a clean return's first admission is cold) and E's warm-region check kept | |
| +| E verdict requested | round 14: an explicit MERGE-READY on f0127321 | |
| + |
| ### 22.19 Joint round 12 (claim b3825827, moves rev 7.12 dd3e35f6, model af9b89ed, library E 47426cc1) |
| Round 12 found no P1 and judged E merge-ready on static review; it held |