carlos / platform Public

spec: move-any-app rev 7.16, joint round 15 and claim rev 6.23

R15-1: claim rev 6.23's park scope mirrored exactly: the location
grammar (instances/<host>, instances/<host>/<incarnation>,
moves/<host>/<op id>, moves/<host>; no trailing slash), the archive
incarnation, evidence_at always the original evidence or fencing bound
(a staging lane's seal bound, the seal plus the lease; never cleanup's
start), one deadline for every scope: a listing later than
evidence_at + H. Rev 7.15's separate staging treatment is gone; §6.4,
§7.14 item 9 rewritten; witness wStagingScopeDeadline; two notes for the
claim.

Model 6bfae153: 106 rules, 72 witnesses. Evidence under the policy: the
gate; the 30,000-seed baseline (clean, 45,059 operations, 71 s, niced,
started when the load fell below 12); one 3,000-seed sweep serially at
HOSTLIFE_PAR=2 under nice (92 caught, 14 expected misses, exit 0); 92 of
106 caught alone. Records in ~/.cache/nearest-region/rev716-sweeps/.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 6f2a93c91117f8e4e6d10d38bf3310e3a94614da parent 6bfae15
1 file changed, +234 −86
  • docs/superpowers/specs/2026-10-02-move-any-app-design.md +234 −86
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 c779f3984..7ab94241b 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,36 @@
# Move any app or instance to another region: Phase 1, a safe single-instance move
**Date:** 2026-10-06
-**Revision:** 7.15.
+**Revision:** 7.16.
+
+- **Rev 7.16** answers **joint round 15** (`CODEX-FINDINGS-JOINT-R15.md`,
+ cited "R15-1") and is written against **claim spec rev 6.23**
+ (876d6908, §2's park scope: the location grammar, the archive
+ incarnation, `evidence_at` always the original evidence or fencing
+ bound, one deadline for every scope); E is merged to main as 99084d7,
+ F merges next; §22.22 has the disposition. **Every remote chore
+ carries the claim's scope from its queuing CAS** (R15-1): `location`
+ exactly one of `instances/<host>`, `instances/<host>/<incarnation>`,
+ `moves/<host>/<op id>` (a move's staging or a rollback's return lane)
+ or `moves/<host>` (the staging sweep), no trailing `/` (INV-23);
+ `incarnation` the location's own, the staging op's holder incarnation
+ or, for a free host's `moves/<host>` sweep, the newest retired one;
+ **`evidence_at` the original bound**, the cut's stop for the commit's
+ source park, the release or the declaration for the target region's,
+ **the seal bound for a staging lane** (the time after which no staging
+ writer, its lease holder included, can still write: the seal plus the
+ staging lease), the listing for a sweep, the publication for a
+ generation chore; **never the cleanup's start time**. **One deadline
+ for every scope, staging included:** acknowledge only after a listing
+ later than `evidence_at + H`; there is no separate staging contract
+ (rev 7.15 bound a staging park at cleanup and then kept the seal's
+ quiet time instead, which Astra's example exposed: sealed at 100,
+ deadline 560, a cleanup first running at 600 must acknowledge at
+ once, not at 660). Witness `wStagingScopeDeadline` (delayed cleanup
+ through an agent restart; INV-9 under the mutation);
+ `wParkScopeSurvivesRestart` takes its deadline from the persisted
+ scope. Rules unchanged (106); witnesses 72. Evidence under the policy
+ of §14.2.1: the gate, the 30,000-seed baseline, one 3,000-seed sweep.
- **Rev 7.15** answers **joint round 14** (`CODEX-FINDINGS-JOINT-R14.md`,
cited "R14-n"), against claim spec rev 6.22 (0bf2f49f) with
@@ -2006,28 +2035,45 @@ 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 (R14-5): a whole-location park binds its scope in a CAS
-before its first step runs, once its stop evidence is in hand; a
-generation chore takes its scope from the publication that queues it
-(the marker's publication is the evidence that the predecessor is dead);
-a staging park binds one before its first step and keeps the seal's own
-quiet time; INV-22, no remote chore runs a step unscoped. **The horizon
-after the evidence is `H`** (R14-3): the scope persists `request_limit`,
-the longest request, and the acknowledgement waits `evidence_at + H`
-with **`H` = the signature-age limit plus `request_limit`** (claim §6.2a,
-§2: 15 minutes plus 120 s in production; `sigAgeH + requestLimitH =
-horizonH` in the model, 45 + 15 = 60 steps), never `evidence_at +
-request_limit` alone, which rev 7.14 wrote here and which would have
-let a retirement be declared complete inside the window the signature
-age still covers. The sweep parks at once and acknowledges, with its
+**The chore carries a persisted park scope** (claim rev 6.23 §2; R13-4,
+R14-5, R15-1): `{location, incarnation, evidence_at, request_limit}`,
+written at the queuing CAS, 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`). **`location`** is exactly one of
+`instances/<host>`, `instances/<host>/<incarnation>`, `moves/<host>/<op
+id>` (a move's staging or a rollback's return lane, the op id with no
+`/`) or `moves/<host>` (the staging sweep only, while no operation
+stages there), nothing else and no trailing `/` (the model's INV-23
+checks every scope against that grammar). **`incarnation`** names the
+archive: the location's own, the staging op's holder incarnation, or,
+for a free host's `moves/<host>` sweep, the newest retired incarnation.
+**`evidence_at` is always the original evidence or fencing bound**,
+never the cleanup's start time: the cut's stop evidence for the commit's
+park of the source region; the release's stop, or the declaration's
+`fenced_at`, for the target region's; **a staging lane's own seal
+bound**, the time after which no staging writer, its lease holder
+included, can still write (the seal plus the staging lease), persisted
+when the lane is sealed or fenced; the sweeping box's complete listing
+for a sweep; the publication that supersedes a generation for a
+generation chore. A chore queued without a scope (a delete's or an
+adoption's `park-replica`, whose CAS has no evidence time yet) binds one
+in a CAS before its first step runs, once its stop evidence is in hand,
+and never again; INV-22, no remote chore runs a step unscoped. **One
+deadline for every scope** (R15-1): acknowledge only after a
+verification listing later than **`evidence_at + H`**, with **`H` = the
+signature-age limit plus `request_limit`** (claim §6.2a, §2: 15 minutes
+plus 120 s in production; `sigAgeH + requestLimitH = horizonH` in the
+model, 45 + 15 = 60 steps). There is no separate staging contract: rev
+7.15 bound a staging park at cleanup and then kept the seal's quiet time
+instead of that bound, so a lane sealed at step 100, deadline 560, whose
+cleanup first ran at 600 would have waited until 660 (witness
+`wStagingScopeDeadline`: the cleanup acknowledges at once, through an
+agent restart, since the persisted deadline has passed). Rev 7.14 wrote
+`evidence_at + request_limit` here, dropping the signature-age
+allowance (R14-3). The sweep parks at once and acknowledges, with its
straggler pass, only after a **verification listing later than
`evidence_at + H`** (platform-1e's answer to rev 7.14 note 2: a
park-sweep is a retirement event and is not exempt from the horizon). **On a serving host** the chore's op is
@@ -2878,12 +2924,15 @@ 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, R14-3 to R14-5; §6.4). Every
- remote chore carries a persisted park scope, bound before its first
- step, at the sweep's queuing CAS or at the publication that queues a
- generation chore, and every retry uses its original evidence time;
- the scope persists `request_limit` and every acknowledgement waits
- `evidence_at + H`, `H` the signature-age limit plus `request_limit`.
+9. **Park state** (claim rev 6.23 §2; R13-4, R14-3 to R14-5, R15-1;
+ §6.4). Every remote chore carries a persisted park scope from its
+ queuing CAS (a delete's or adoption's park binds one before its first
+ step), `{location, incarnation, evidence_at, request_limit}` in the
+ claim's grammar; `evidence_at` is the original evidence or fencing
+ bound (a staging lane's is its seal bound, the seal plus the lease),
+ never the cleanup's start; every retry uses it; every acknowledgement,
+ a staging lane's included, waits a listing later than `evidence_at +
+ H`, `H` the signature-age limit plus `request_limit`.
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
@@ -3816,6 +3865,41 @@ 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.16: joint round 15 and claim rev 6.23.**
+
+- **The scope on every chore, from its queuing CAS (R15-1).**
+ `w.scoped(obligation, evidenceAt, inc)` attaches `parkScope{Location:
+ scopeLocation(prefix), Inc, EvidenceAt, RequestLimit}` at every
+ queuing site: the commit's source park (`op.StopAt`), the release's
+ target park (the release's step), the lost-target release
+ (`fenced_at`, the declaration's step), every staging lane
+ (`stagingBound(quiet)`, the seal bound: the lane's quiet time less
+ `H`, so the `staging-quiet` mutation's "now" yields a bound already
+ past), the sweep (the listing, now; the archive incarnation the
+ holder's or, on a free host, the newest retired), the generation
+ chores (the publication, now). `scopeLocation` strips the park
+ prefix's trailing `/`; INV-23 checks every scope's location against
+ the grammar (`scopeLocationRe`; the model's incarnation ids are
+ decimal). The delete's and adoption's `park-replica` still bind theirs
+ before the first step, once the stop evidence is in hand. Under the
+ `persisted-park-scope` mutation chores are queued unscoped and the
+ runner binds the cleanup's own clock, as rev 7.13 did.
+- **One deadline (R15-1).** `parkScope.deadline() = EvidenceAt + sigAgeH
+ + RequestLimit`; the runner's quiet for every scoped chore is the
+ larger of its queued quiet time and that deadline (a staging lane's
+ regardless of `quiet-before-ack`, since its queued quiet time was that
+ bound already); the acknowledgement's `quiet_after` uses it too. Rev
+ 7.15's staging exclusion is gone. Witness `wStagingScopeDeadline`: a
+ committed move's staging lane, deadline `seal + stagingTTL + H`; the
+ target region's obligation runner is withheld until 40 steps past it,
+ then the target's agent restarts and the cleanup begins: the
+ acknowledgement must come within 20 steps and never before the
+ deadline; under the mutation the fresh bound waits another `H` (568 →
+ acknowledged at 669 in the trace, the round's 560/600/660 example in
+ the model's steps). `wParkScopeSurvivesRestart` reads its deadline
+ from the chore's scope (the cut's stop plus `H`) and restarts the
+ agent 20 steps before it.
+
**Rev 7.15: joint round 14.**
- **The selected baseline is restored (R14-1).** `openState.SourcePin`
@@ -4601,6 +4685,25 @@ 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.16, on the final model (joint round 15, claim rev 6.23: the park
+scope on every chore from its queuing CAS, one deadline): 30,000 seeds,
+zero violations** (71 s; no 100,000-seed run under the evidence
+policy of §14.2.1). Across the 30,000 seeds: 45,059 completed
+operations, 20,487 cold and 4,803 warm admissions,
+148,810 scopes bound before a chore's first step (the delete's
+and adoption's parks; every other chore scoped at its queuing),
+11,350 holderless sweeps, 1 regions joining a
+running one, 11,350 `FreeAfterPark` transitions,
+0 starts restoring a selected run generation,
+16,733 writes_lost records declaring 2,408 writes
+(72 for a lost target's other sessions, 8 for
+the source's cut session), 224 completed moves,
+621 clean and 24 dirty rollbacks,
+97 reverts, 74 declared losses, 7,327
+pushes, 27,197 delete-park-free cycles, 2,746 final
+recovery admissions (0 unverified). Every oracle left
+the system unchanged.
+
**Rev 7.15, on the final model (joint round 14: the selected baseline
restored, declarations unique, the horizon's parts, joining, every chore
scoped): 30,000 seeds, zero violations** (97 s; no 100,000-seed run
@@ -5035,29 +5138,30 @@ 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.15 model (f6fb0579), with the strict classification,
+on the final rev 7.16 model (6bfae153), 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 are not run under 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 59 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 **106 rules**: rev 7.14's 104 plus
-`restore-selected-baseline` (R14-1) and `unique-declarations` (R14-2).
+section does too. The model has **106 rules**, unchanged since rev
+7.15 (rev 7.16 changes what `persisted-park-scope` persists, not the
+rule set).
`mutate.sh 3000`, run serially at `HOSTLIFE_PAR=2` under `nice -n 19`, 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.13's
counts, the last with the deeper sweeps, are in the rev 7.13 spec
-(1f511c42); rev 7.14's in a4389280. **Every table below is
-regenerated from the retained verdict files** (R9-6;
-`~/.cache/nearest-region/rev715-sweeps/`), none is carried over.
+(1f511c42); rev 7.14's in a4389280, rev 7.15's in 63fc6a71. **Every
+table below is regenerated from the retained verdict files** (R9-6;
+`~/.cache/nearest-region/rev716-sweeps/`), none is carried over.
| | rules |
|---|---|
| caught alone by the sweep at 3,000 seeds | 70 |
-| caught alone by the sweep at 30,000 (and by their witness, where one exists) | not run for rev 7.15 (evidence policy; 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.15 (evidence policy; Paul 2026-10-06) |
+| caught alone by the sweep at 30,000 (and by their witness, where one exists) | not run for rev 7.16 (evidence policy; 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.16 (evidence policy; Paul 2026-10-06) |
| caught alone by their witness only; the sweep at 3,000 misses them | 22 (`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`, `restore-selected-baseline`, `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 |
@@ -5065,6 +5169,15 @@ regenerated from the retained verdict files** (R9-6;
| unreachable under claim rev 5 | 1 (`readiness-quiet`) |
| unexercised | **0** |
+**What rev 7.16 moved.** No new rule; `persisted-park-scope`
+witness; sweep 0 / 3,000 gains the staging-deadline scenario, and
+the scope's queuing-time binding touched `quiet-before-ack`
+152 / 3,000, `straggler-sweep` 770 / 3,000,
+`sweep-namespace` 541 / 3,000, `sweep-staging`
+38 / 3,000, `staging-quiet` 1 / 3,000,
+`lost-return-park` 1 / 3,000, `holderless-park`
+561 / 3,000, `cover-at-park` 29 / 3,000.
+
**What rev 7.15 moved.** The two new rules: `restore-selected-baseline`
witness; sweep 0 / 3,000 (the start refuses the baseline the walk
selected and the recovery stalls) and `unique-declarations`
@@ -5296,36 +5409,36 @@ witness to hold there; each witness violates with the failure it names.
| `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 | 13 / 3,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 | 12 / 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) | | 304 / 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 | 303 / 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) | | 301 / 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 | 299 / 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 |
+| `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 | | 541 / 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) | | 20 / 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) | | 57 / 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) | | 16 / 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) | | 68 / 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 |
+| `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) | | 13 / 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) | | 711 / 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` | | 36 / 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` | | 3 / 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) | | 5 / 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 | | 716 / 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) | | 37 / 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 | | 11 / 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 | | 15 / 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 |
| `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 |
@@ -5335,7 +5448,7 @@ witness to hold there; each witness violates with the failure it names.
| `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 |
+| `persisted-park-scope` (claim rev 6.23 §2, R13-4, R15-1), two scenarios | (i) a committed move's source-region park, scoped at the commit with the cut's stop evidence; the source region's agent restarts 20 steps before the deadline; (ii) the move's staging lane, scoped with its seal bound; the target region's cleanup first runs 40 steps past the deadline, under a restarted agent | held: (i) acknowledged within the persisted deadline and slack; (ii) acknowledged at once, never before the deadline | **violated** under the mutation: the chores are unscoped and the runner binds the cleanup's own clock, so the horizon starts again at the restart (i) and the staging lane waits a fresh `H` past its deadline (ii) (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 |
| `restore-selected-baseline` (R14-1) | the marker names S; R's first upload is in flight when R crashes; R2 is admitted over the empty R and crashes before uploading; R's upload lands | held: the next start selects R from R2 → R → S and restores it rooted at `[1, 1]` | **violated** under the mutation: the start restores R through the marker, which names S, refuses it, and the valid recovery stalls (INV-3) | witness; sweep 0 / 3,000 |
@@ -5365,24 +5478,24 @@ 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: 92 of 106** (70 by the sweep at 3,000; 22 by their witness alone, marked ‡; the sweeps at 30,000 and 100,000 were not run for rev 7.15 (evidence policy; Paul 2026-10-06), so the one rare rule the sweep reaches only there, `hostguard`, has no verdict this round).
+**Caught alone: 92 of 106** (70 by the sweep at 3,000; 22 by their witness alone, marked ‡; the sweeps at 30,000 and 100,000 were not run for rev 7.16 (evidence policy; 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` | 961 / 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` | 716 / 3,000 | | `anchor-acked` | 12 / 3,000 |
-| `baseline-live` ‡ | witness; sweep 0 / 3,000 | | `build-completion` | 711 / 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` | 39 / 3,000 | | `declare-lost-compute` ‡ | witness; sweep 0 / 3,000 |
-| `dirty-return` | 1 / 3,000 | | `evidence-from-state` | 2,633 / 3,000 |
-| `evidence-whole-tree` ‡ | witness; sweep 0 / 3,000 | | `fence-by-installation` | 304 / 3,000 |
-| `fence-etag` | 22 / 3,000 | | `fence-stamp` | 303 / 3,000 |
-| `files-carried` | 25 / 3,000 | | `floor-boot-recovery` | 2,561 / 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` | 301 / 3,000 |
+| `fence-etag` | 22 / 3,000 | | `fence-stamp` | 299 / 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 |
@@ -5394,27 +5507,27 @@ proper subsets hold. It is no longer run.
| `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,908 / 3,000 |
-| `purge-reserve-first` | 2,142 / 3,000 | | `quiet-before-ack` | 132 / 3,000 |
-| `recovery-current-inputs` | 36 / 3,000 | | `recovery-generation` | 12 / 3,000 |
-| `recovery-pass` | 2,442 / 3,000 | | `registration-recovery` | 2,013 / 3,000 |
-| `remote-baseline` ‡ | witness; sweep 0 / 3,000 | | `restore-anchor` | 55 / 3,000 |
-| `restore-by-generation` | 120 / 3,000 | | `restore-gap-closed` ‡ | witness; sweep 0 / 3,000 |
+| `purge-claim-fence` | 28 / 3,000 | | `purge-journal` | 1,896 / 3,000 |
+| `purge-reserve-first` | 2,144 / 3,000 | | `quiet-before-ack` | 152 / 3,000 |
+| `recovery-current-inputs` | 37 / 3,000 | | `recovery-generation` | 13 / 3,000 |
+| `recovery-pass` | 2,432 / 3,000 | | `registration-recovery` | 2,011 / 3,000 |
+| `remote-baseline` ‡ | witness; sweep 0 / 3,000 | | `restore-anchor` | 57 / 3,000 |
+| `restore-by-generation` | 125 / 3,000 | | `restore-gap-closed` ‡ | witness; sweep 0 / 3,000 |
| `restore-overlap` ‡ | witness; sweep 0 / 3,000 | | `restore-selected-baseline` ‡ | witness; sweep 0 / 3,000 |
-| `retirement-ids` | 428 / 3,000 | | `return-stamp` | 68 / 3,000 |
-| `revalidate-before-effect` | 16 / 3,000 | | `revert-journal` | 12 / 3,000 |
-| `rollback-journal` | 1 / 3,000 | | `root-advance` | 20 / 3,000 |
-| `sdk-no-resign` | 15 / 3,000 | | `seal-by-version` | 1 / 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` | 16 / 3,000 |
+| `sdk-no-resign` | 11 / 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` | 14 / 3,000 | | `sign-before-safeuntil` | 14 / 3,000 |
-| `source-readiness` | 11 / 3,000 | | `staging-quiet` | 1 / 3,000 |
-| `stale-hold-release` | 1 / 3,000 | | `start-check` | 19 / 3,000 |
-| `start-check-claim-gen` | 15 / 3,000 | | `straggler-sweep` | 778 / 3,000 |
-| `strict-spawn` | 13 / 3,000 | | `sweep-namespace` | 542 / 3,000 |
+| `sign-at-check` | 15 / 3,000 | | `sign-before-safeuntil` | 19 / 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` | 12 / 3,000 | | `sweep-namespace` | 541 / 3,000 |
| `sweep-staging` | 38 / 3,000 | | `target-park` | 16 / 3,000 |
-| `timer-canonical` | 2 / 3,000 | | `timer-freeze` | 2 / 3,000 |
-| `unique-declarations` | 3 / 3,000 | | `valid-ltx` | 37 / 3,000 |
-| `writer-session` | 5 / 3,000 | | `writes-lost` | 11 / 3,000 |
+| `timer-canonical` | 2 / 3,000 | | `timer-freeze` | 3 / 3,000 |
+| `unique-declarations` | 3 / 3,000 | | `valid-ltx` | 38 / 3,000 |
+| `writer-session` | 5 / 3,000 | | `writes-lost` | 15 / 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`
@@ -5429,19 +5542,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) | not run for rev 7.15 (evidence policy; 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.15 (evidence policy; 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.15 (evidence policy; 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.15 (evidence policy; 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 |
+| `purge-claim-fence` + `fence-etag` (**the re-read alone**, rev 7's CC21 as proposed) | not run for rev 7.16 (evidence policy; 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.16 (evidence policy; 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.16 (evidence policy; 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.16 (evidence policy; 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` | not run for rev 7.15 (evidence policy; 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 |
+| `admit-bind-op` + `claim-cas-opid` | not run for rev 7.16 (evidence policy; 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` | not run for rev 7.15 (evidence policy; Paul 2026-10-06) | `claim-cas-opid` 0 / 3,000, `revalidate-before-effect` 16 / 3,000 | violated | a stale step destroys a store |
-| `strict-spawn` + `evidence-whole-tree` | not run for rev 7.15 (evidence policy; 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.15 (evidence policy; 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.15 (evidence policy; 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.15 (evidence policy; Paul 2026-10-06) | `fence-stamp` 303 / 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 |
+| `claim-cas-opid` + `revalidate-before-effect` | not run for rev 7.16 (evidence policy; 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.16 (evidence policy; Paul 2026-10-06) | `strict-spawn` 12 / 3,000, `evidence-whole-tree` witness; sweep 0 / 3,000 | violated | two writers |
+| `touched-incomplete` + `legacy-discovery` | not run for rev 7.16 (evidence policy; 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.16 (evidence policy; 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.16 (evidence policy; Paul 2026-10-06) | `fence-stamp` 299 / 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
@@ -5878,6 +5991,29 @@ 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.23 (876d6908), after joint round 15: no change requested,
+two notes.** Rev 6.23's §2 gives the park scope its grammar
+(`instances/<host>`, `instances/<host>/<incarnation>`, `moves/<host>/<op
+id>`, `moves/<host>`), the archive incarnation (the location's own, the
+staging op's holder's, the newest retired for a free host's
+`moves/<host>` sweep), `evidence_at` always the original evidence or
+fencing bound (a staging lane's seal bound, persisted at seal or fence
+time, never cleanup's start) and one deadline for every scope, a
+listing later than `evidence_at + H`; it also states that a second
+region's sweep joins the running op and that every sweep acknowledgement
+waits the horizon. Rev 7.16 mirrors it exactly (§6.4, §7.14 item 9,
+§14.2.2). Notes for platform-1e (`moves-claim-questions.md`, rev 7.16
+heading): **(1)** a delete's and an adoption's `park-replica` are queued
+by a CAS that has no evidence time yet (the stop evidence is proven by
+the parking box later), so the model binds their scope in a CAS before
+the first step, with the evidence time at which the stop evidence was
+first in hand, once and never again; the claim's "a chore without a
+scope is bound to one before its first step runs" is read to mean
+exactly that, and no other chore is bound late; **(2)** the model's
+incarnation ids are decimal where the claim's are 64 hex, and its op ids
+are its own; the grammar oracle (INV-23) checks the four forms with
+those alphabets.
+
**Platform-1e's answers to the rev 7.14 notes, and joint round 14: no
change requested, three notes.** All six notes agreed (joining
preferred; the sweep waits the full `H`; recovery replays only
@@ -6425,6 +6561,18 @@ 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.22 Joint round 15 (claim 0bf2f49f, moves rev 7.15 63fc6a71, model f6fb0579, library E f0127321, selector F d7621a29)
+
+Round 15 found all five round-14 items resolved and one new P2 across
+A, B and C; E and F stayed merge-ready, and E is merged to main
+(99084d7). Claim rev 6.23 (876d6908) answers the A half.
+
+| finding | rev 7.16 |
+|---|---|
+| R15-1 (P2, A/B/C) staging scopes did not satisfy the shared path and deadline contract: A's grammar excluded `moves/<host>/…`; B required every acknowledgement after `evidence_at + H` and C bound a staging park at cleanup, then kept the seal's quiet time instead | claim rev 6.23's grammar mirrored, with the staging and staging-sweep forms and the archive incarnation; every chore scoped at its queuing CAS with the original bound, a staging lane's the seal bound (seal plus lease), never cleanup's start; one deadline for every scope; INV-23; witness `wStagingScopeDeadline` (delayed cleanup through a restart: acknowledged at once, never before the deadline; a fresh bound under the mutation) (§6.4, §7.14 item 9, §14.2.2) |
+| the three rev 7.15 notes | note 1 superseded by 6.23 (the staging scope's grammar and bound); notes 2 and 3 accepted as stated |
+| E, F | E merged to main as 99084d7; F merges next; nothing asked of them |
+
### 22.21 Joint round 14 (claim 0bf2f49f, moves rev 7.14 a4389280, model 4ebfa0a5, library E f0127321, selector F d7621a29)
Round 14 found no P1, judged A ready as the claim contract and E and F