carlos / platform Public

spec: move-any-app rev 7.15, joint round 14

R14-1: the start restores what the run walk selected, a run generation
rooted at [1, 1] or the marker's through generation.json, as the
oracle does. R14-2: one writes_lost plus additional_writes_lost, unique
by (box, session), the source's cut session under its persisted identity,
one alert per declaration, INV-21. R14-3: the horizon after the evidence
is H, the signature-age limit plus request_limit; the scope persists
request_limit; a park-sweep acknowledges only after a listing later than
evidence_at + H (rev 7.14's formula corrected in §6.4 and §19.4). R14-4:
a running holderless sweep admits another region's chores. R14-5: every
remote chore runs under a persisted scope, INV-22. Fidelity limits in
§14.2.6 (occupancy by current objects; trimming and the publication's
precondition aligned with E). Three notes for the claim.

Model f6fb0579: 106 rules, 71 witnesses. Evidence under the policy: the
gate, the 30,000-seed baseline (clean, 45,026 operations, 97 s, niced),
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/rev715-sweeps/.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 63fc6a7111e6c7a886b08b5d500b6f8b21857141 parent f6fb057
1 file changed, +303 −86
  • docs/superpowers/specs/2026-10-02-move-any-app-design.md +303 −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 10fb74664..c779f3984 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,37 @@
# Move any app or instance to another region: Phase 1, a safe single-instance move
**Date:** 2026-10-06
-**Revision:** 7.14.
+**Revision:** 7.15.
+
+- **Rev 7.15** answers **joint round 14** (`CODEX-FINDINGS-JOINT-R14.md`,
+ cited "R14-n"), against claim spec rev 6.22 (0bf2f49f) with
+ platform-1e's answers to the six rev 7.14 notes, E f0127321 and F
+ d7621a29, both MERGE-READY there; §22.21 has every disposition. **The
+ start restores what the run walk selected** (R14-1): the open state
+ carries the restore mode, the marker's generation through
+ `generation.json` or a run generation rooted at `[1, 1]`, so the start
+ and the recovery oracle use one selection; witness
+ `wIntermediateBaseline` (R's first upload pending at its crash, an
+ empty R2, R's upload landing). **One `writes_lost` plus
+ `additional_writes_lost`, unique by `(box, session)`** (R14-2): the
+ source's cut session joins the list under its persisted identity, the
+ separate representation is gone, one alert per declaration, INV-21;
+ witnesses before and after the target's first admission. **The
+ horizon keeps its signature-age allowance** (R14-3): the park scope
+ persists `request_limit`, and every acknowledgement waits
+ `evidence_at + H` with `H` the signature-age limit plus
+ `request_limit`; a park-sweep acknowledges only after a verification
+ listing later than that (platform-1e's answer to note 2). **A running
+ holderless sweep admits another region's chores** (R14-4;
+ `TestJoinHolderlessSweep`). **Every remote chore runs under a
+ persisted scope** (R14-5): generation chores take theirs from the
+ publication, staging parks bind one before their first step, INV-22.
+ Two fidelity limits stated in §14.2.6 (occupancy by current objects;
+ the publication's precondition and trimming aligned with E). Rules
+ `restore-selected-baseline`, `unique-declarations` (106 in all);
+ witnesses `wIntermediateBaseline`, `wNoDuplicateDeclarationEarly`,
+ `wNoDuplicateDeclarationLate` (71 in all). Evidence under the policy
+ of §14.2.1: the gate, the 30,000-seed baseline, one 3,000-seed sweep.
- **Rev 7.14** answers **joint round 13** (`CODEX-FINDINGS-JOINT-R13.md`,
cited "R13-n") and is written against **claim spec rev 6.22**
@@ -1274,12 +1304,16 @@ 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). **Representation** (claim rev 6.22 item 2, R13-3): the
+ R12-1). **Representation** (claim rev 6.22 item 2, R13-3, R14-2): 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
+ sessions since the cut, and the source's cut session, under its
+ persisted identity `cut.session`, when `src_covered` is false),
+ each `{box, generation, session, remote_max_txid}`, **unique by
+ `(box, session)` across both**: a target destroyed after the flip
+ and before its first admission leaves the source's cut session as
+ the predecessor itself, declared once (rev 7.14 declared it twice,
+ through a separate field; INV-21); 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
@@ -1427,8 +1461,16 @@ fails there first (§14.2.6).
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
+ passed over; else the marker's generation. **The start restores
+ what the walk selected** (R14-1): the marker's generation through
+ `generation.json`, as every ordinary restore; a run generation the
+ walk selected **rooted at `[1, 1]`**, its first full upload, never
+ through the marker, which still names the run's baseline (rev
+ 7.14's start selected R from R2 → R → S and then refused it because
+ the marker named S, while the oracle restored it; the marker is
+ never published backwards). The model's `restoreCalc` over the
+ marker's generation and `restoreWith` rooted at `[1, 1]` over a
+ selected one are 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
@@ -1972,10 +2014,23 @@ 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
+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
+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
`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:
@@ -1986,8 +2041,11 @@ 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
+op runs **joins** it with its own scoped chores under the same op id
+(R14-4, platform-1e's preferred reading of rev 7.14 note 1;
+`TestJoinHolderlessSweep` has two regions' residue parked under one op
+and one `FreeAfterPark`); 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,
@@ -2762,9 +2820,10 @@ 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): `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
+ false, under its persisted `cut.session`): `writes_lost` (one) plus
+ `additional_writes_lost` (a list), each `{box, generation, session,
+ remote_max_txid}`, unique by `(box, session)` across both, one alert
+ per declaration (R13-3, R14-2; INV-21). 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
@@ -2772,8 +2831,10 @@ this text wins.
generation's remote in this region; in an unfinished run the newest
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.
+ link is passed over, a covered local baseline refuses and alerts; the
+ start restores the selected run generation rooted at `[1, 1]`, the
+ marker's through `generation.json` (R14-1); 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
@@ -2817,9 +2878,12 @@ 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.
+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`.
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
@@ -3223,9 +3287,10 @@ 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),
-`TestProbeWindow`, the probe deadline's boundary (§7.7, rev 7.13), and
+`TestProbeWindow`, the probe deadline's boundary (§7.7, rev 7.13),
`TestInterruptedCleanReturn`, the run walk across regions (§5.1 step 9,
-rev 7.14).
+rev 7.14), and `TestJoinHolderlessSweep`, two regions' residue under one
+holderless op (§6.4, rev 7.15).
**Rev 7.6: the pinned libraries, observed.** `internal/sim/litestreamfacts/`
is a second test-only package: it drives litestream v0.5.14 and
@@ -3751,6 +3816,52 @@ 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.15: joint round 14.**
+
+- **The selected baseline is restored (R14-1).** `openState.SourcePin`
+ carries the restore mode the run walk chose: `-1`, the marker's
+ generation through `generation.json` (`restoreCalc`); `0`, a run
+ generation rooted at `[1, 1]` (`restoreWith(..., 0)`), as
+ `restoreAsNext` always restored it. The restore stage calls
+ `restoreWith` with it. Rule `restore-selected-baseline` (the mutation
+ is rev 7.14's `restoreCalc` on the selected source, which the marker
+ refuses); witness `wIntermediateBaseline`: S named by the marker; R's
+ first upload held in flight, R crashes; R2 admitted over the empty R
+ and crashed before uploading; R's upload lands; the next start selects
+ R from R2 → R → S and restores it (`restore: run generation rooted`);
+ under the mutation the start cannot restore it and the valid recovery
+ stalls (INV-3).
+- **One plus a list, unique (R14-2).** `admissionRecord.LostSrc` is gone;
+ the source's cut session, under `op.CutSession`, joins
+ `AdditionalWritesLost` through one `add` that refuses a `(box,
+ session)` already in `Lost` or the list; one alert per entry; INV-21
+ after the CAS. Rule `unique-declarations` (the mutation appends without
+ the check, as rev 7.14's separate path did); witnesses
+ `wNoDuplicateDeclarationEarly` (the target destroyed after the flip and
+ before its first admission, `src_covered` false, the source's cut
+ session uncertified: declared once) and `wNoDuplicateDeclarationLate`
+ (after the target's probe: the predecessor is the target's session, the
+ list carries the cut session once, nothing twice).
+- **The horizon's parts (R14-3).** `horizonH = sigAgeH + requestLimitH`
+ (45 + 15); `parkScope.RequestLimit` persists the request bound; every
+ quiet and acknowledgement computation is `EvidenceAt + sigAgeH +
+ RequestLimit`; the park-sweep's acknowledgement waits that, its
+ straggler pass the verification listing.
+- **Joining (R14-4).** `sweep()`'s outer guard admits a holderless
+ sweep's claim; `sweep joined a running holderless op` counts;
+ `TestJoinHolderlessSweep`.
+- **Every remote chore scoped (R14-5).** `park-generation` chores carry
+ `Scope{EvidenceAt: now}` from the publication (both sites, the
+ `baseline-live` mutation's included) and their quiet is the scope's
+ horizon; `park-staging` binds a scope before its first step, keeping
+ `SealQuiet`; INV-22 in the runner: no remote chore runs a step
+ unscoped under `persisted-park-scope`.
+- **Fidelity.** The publication's precondition is that **any** entry
+ names the published generation, as A and E read it (rev 7.14 required
+ the last); trimming is E's: covered entries from the front only while
+ more than eight entries remain. Occupancy stays by current objects
+ (§14.2.6).
+
**Rev 7.14: joint round 13 and claim rev 6.22.**
- **The park scope and the holderless sweep (R13-4; claim rev 6.15).**
@@ -4490,6 +4601,43 @@ 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.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
+under the evidence policy of §14.2.1). Across the 30,000 seeds:
+45,026 completed operations, among them 20,602 cold and
+5,021 warm admissions (3,594 covered `sealed`,
+235 covered `clean-return`; 5,021 warm entries
+born covered, 126 born covered under a pending park,
+359 predecessors left uncovered by a publication for their
+own region, 0 live again and left uncovered,
+8,065 holding nothing anywhere, 229 records
+covered at the commit's park, 81 at a rollback's
+release, 1 at a lost-target release, 179 by
+the sweep; 160,230 park scopes bound before a chore's first step,
+11,341 holderless sweeps, 2 regions joining a
+running one and 11,341 `FreeAfterPark` transitions;
+0 starts that restored a selected run generation rooted at
+`[1, 1]`; 0 starts refused on a covered local
+baseline; 5,964 clean closes, 440 closes refused
+as uncertain, 330 wakes that waited for a draining writer,
+16,012 local databases purged, 1,267 starts that
+waited for a failed purge, 16,854 writes_lost records declaring
+2,455 acknowledged writes lost (78 of the
+records for a lost target's other sessions, 8 for the
+source's cut session behind a lost target), 8,276 full first
+uploads, 160 markers published again, 1,061
+probes restarted, 143 probe attempts ended (136
+by the deadline check before the start), 474 app starts
+retried within their session, 0 hosts marked failed;
+2,763 final recovery admissions run by the oracle,
+0 unverified), 226 completed moves,
+622 clean and 22 dirty rollbacks,
+96 pre-flip reverts, 74 declared losses,
+7,327 pushes, 27,180 delete-park-free cycles and
+1,485 lost disks (1,071 with a crash). Every oracle
+left the system unchanged.
+
**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
@@ -4887,36 +5035,49 @@ 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.14 model (4ebfa0a5), with the strict classification,
+on the final rev 7.15 model (f6fb0579), 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
+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 57 rules that have them. A rule is caught
+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 **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
+section does too. The model has **106 rules**: rev 7.14's 104 plus
+`restore-selected-baseline` (R14-1) and `unique-declarations` (R14-2).
+`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). **Every table below is
+(1f511c42); rev 7.14's in a4389280. **Every table below is
regenerated from the retained verdict files** (R9-6;
-`~/.cache/nearest-region/rev714-sweeps/`), none is carried over.
+`~/.cache/nearest-region/rev715-sweeps/`), none is carried over.
| | rules |
|---|---|
-| 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 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 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 |
| liveness only | 2 (`readiness-key`, `config-before-probe`) |
| unreachable under claim rev 5 | 1 (`readiness-quiet`) |
| unexercised | **0** |
+**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`
+3 / 3,000 (the source's cut session declared twice,
+INV-21). The rules the scope and declaration changes touched:
+`persisted-park-scope` witness; sweep 0 / 3,000, `holderless-park`
+561 / 3,000, `covered-baseline-refused`
+witness; sweep 0 / 3,000, `writes-lost` 11 / 3,000,
+`lost-return-park` 1 / 3,000, `quiet-before-ack`
+132 / 3,000, `straggler-sweep` 778 / 3,000,
+`sweep-namespace` 542 / 3,000, `cover-at-park`
+29 / 3,000, `baseline-live` witness; sweep 0 / 3,000.
+
**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`
@@ -5138,33 +5299,33 @@ witness to hold there; each witness violates with the failure it names.
| `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) | | 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 |
+| `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 |
| `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 |
+| `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 |
| `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 |
+| `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 |
| `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 |
+| `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 |
| `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 |
+| `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 |
+| `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) | | 38 / 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 |
| `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 |
+| `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 |
| `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 |
@@ -5177,6 +5338,8 @@ witness to hold there; each witness violates with the failure it names.
| `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 |
+| `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 |
+| `unique-declarations` (R14-2), two scenarios | (i) the target is destroyed after the flip and before its first admission, `src_covered` false, the source's cut session uncertified; (ii) the same after the target's probe was admitted | held: the source's cut session is declared once, in `writes_lost` (i) or in the list (ii); nothing twice | **violated** under the mutation: the cut session is declared twice, through `writes_lost` and the separate path (INV-21) | 3 / 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 |
@@ -5202,24 +5365,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: 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).
+**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).
| rule | seeds failing | | rule | seeds failing |
|---|---|---|---|---|
-| `abort-target-owner` | 962 / 3,000 | | `absent-marker-origin` ‡ | witness; sweep 0 / 3,000 |
+| `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` | 717 / 3,000 | | `anchor-acked` | 12 / 3,000 |
-| `baseline-live` ‡ | witness; sweep 0 / 3,000 | | `build-completion` | 710 / 3,000 |
+| `admit-everywhere` | 716 / 3,000 | | `anchor-acked` | 12 / 3,000 |
+| `baseline-live` ‡ | witness; sweep 0 / 3,000 | | `build-completion` | 711 / 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 |
+| `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 |
| `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 |
@@ -5231,26 +5394,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,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 |
+| `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` | 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 |
+| `restore-by-generation` | 120 / 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 |
+| `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 |
+| `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 |
**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`
@@ -5265,19 +5429,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.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 |
+| `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 |
| `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.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 |
+| `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 |
| `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.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 |
+| `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 |
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
@@ -5317,7 +5481,24 @@ baselines, this sweep and the witnesses are the evidence for rev 7.10.
identity (only one box writes staging, and a restarted agent's
goroutines die with it). Each could hide a fault; each is a next step,
in that order of likely yield.
-- **Timing is scaled, not real.** `H` (60 steps) is shorter than the cut
+- **Occupancy is by current objects (R14).** The model's run walk and
+ oracles judge a generation as holding an object by its **current**
+ versions in a region's bucket; a key whose every version was deleted
+ (a parked generation) counts as empty for selection and as "had
+ objects" only for INV-17 and the sweep's retired set. The selector F
+ also counts tombstoned or history-bearing generations as nonempty and
+ fails closed on them. The two agree on every case in F's table; a
+ generation with delete markers and no current version is where they
+ would differ, and the model's covered-local refusal (§5.1 step 9)
+ reaches such a generation before its emptiness is consulted in every
+ schedule the sweeps produced. Exact equivalence is not claimed.
+- **Admission trimming is E's rule, mirrored (R14).** Covered entries are
+ dropped from the front only while more than eight entries remain, and
+ an uncovered head stops the trimming; the model counted covered entries
+ rather than entries until rev 7.15. The publication's precondition is
+ that any entry names the published generation, as A and E read it.
+- **Timing is scaled, not real.** `H` (60 steps, the signature-age
+ allowance 45 plus the request bound 15) is shorter than the cut
budget (320), the reverse of production (over 15 minutes against 120 s).
Results about orderings carry over; results about which wait fits inside
which window do not (J2 §2).
@@ -5697,6 +5878,23 @@ 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.
+**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
+`FreeAfterPark`; a create waits on the parking op; the covered-baseline
+refusal; a warm record's region). Notes for platform-1e
+(`moves-claim-questions.md`, rev 7.15 heading): **(1)** a staging park
+(`park-staging`, CC20, this spec's kind) binds a persisted scope before
+its first step like a whole-location park but keeps the seal's own
+quiet time, bounded by the staging lease, rather than `evidence_at +
+H`; **(2)** a generation chore's scope takes `evidence_at` from the
+publication that queues it, the marker's publication being the evidence
+that the predecessor is dead, so its horizon is the publication's time
+plus `H`, equal to the chore's queued quiet time; **(3)** the model
+decomposes `H` into a signature-age allowance and the request bound
+(45 + 15 steps) so the scope's `request_limit` has the claim's meaning;
+nothing in the claim need change.
+
**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
@@ -5712,7 +5910,10 @@ 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
+after a verification listing later than `evidence_at + H`, `H` the
+signature-age limit plus `request_limit` (rev 7.14 wrote `evidence_at +
+request_limit` here and in §6.4, dropping the signature-age allowance,
+R14-3; platform-1e's answer confirmed the full `H`), 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
@@ -6224,6 +6425,22 @@ 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.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
+merge-ready, and held B on one P2 and C on two P2s and two P3s.
+Platform-1e agreed all six rev 7.14 notes.
+
+| finding | rev 7.15 |
+|---|---|
+| R14-1 (P2, C) the start could not restore an intermediate run generation the recovery oracle accepts (the marker names the run's baseline) | `openState.SourcePin` carries the walk's restore mode; the start restores a selected run generation rooted at `[1, 1]`, the marker's through `generation.json`, as the oracle does; rule `restore-selected-baseline`, witness `wIntermediateBaseline` (§5.1 step 9, §7.14 item 3) |
+| R14-2 (P2, C) the source-cut loss had a separate representation and could duplicate the ordinary declaration | one `writes_lost` plus `additional_writes_lost`, unique by `(box, session)`, the cut session under its persisted identity, one alert per declaration, INV-21; rule `unique-declarations`, witnesses before and after the target's first admission (§5.1 step 9, §7.14 item 2) |
+| R14-3 (P2, B) the persisted-scope acknowledgement formula dropped the signature-age allowance | `evidence_at + H`, `H` the signature-age limit plus `request_limit`; the scope persists `request_limit` (`parkScope.RequestLimit`), the model's `horizonH = sigAgeH + requestLimitH`; a park-sweep acknowledges only after a listing later than that (§6.4, §7.14 item 9, §19.4 note 2 corrected) |
+| R14-4 (P3, C) joining a running holderless sweep was unreachable | the sweep's outer guard admits the holderless state; `TestJoinHolderlessSweep` (§6.4) |
+| R14-5 (P3, C) not every remote chore had a persisted scope | generation chores take theirs from the publication, staging parks bind one before their first step; INV-22 (§6.4, §7.14 item 9) |
+| fidelity limits named by the review | occupancy by current objects stated in §14.2.6; trimming aligned with E's front-only rule over more than eight entries; the publication's precondition is any entry naming the generation |
+| E, F | MERGE-READY on f0127321 and d7621a29; nothing asked of them |
+
### 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