carlos / platform Public

db-region-forward: review brief for round 3

Lists findings 1 to 15 with rev 3's answer to each, and asks for a
disposition table, an invariant-by-invariant check of §5.2, then only new
findings.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 20524df4c65542a2f5c196903981e0fc62d22ee4 parent 944a61f
1 file changed, +64 −46
  • docs/superpowers/specs/CODEX-REVIEW-BRIEF-DB-REGION-FORWARD.md +64 −46

CI passed — run details

CI log
=== gate ===
.amadan/test-gate.sh
=== launchctx (2 s)
ok  	amadan.net/carlos/platform.git/launchctx	0.024s
?   	amadan.net/carlos/platform.git/launchctx/controlname	[no test files]
?   	amadan.net/carlos/platform.git/launchctx/wireid	[no test files]
=== vet (28 s)
=== gofmt (0 s)
gofmt -l .: clean
=== rest (187 s)
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	6.116s
ok  	github.com/carlosframework/platform/cmd/moveprobe	13.826s
ok  	github.com/carlosframework/platform/cmd/zddprobe	0.927s
ok  	github.com/carlosframework/platform/internal/activator	61.589s
ok  	github.com/carlosframework/platform/internal/agentsock	0.188s
ok  	github.com/carlosframework/platform/internal/alerting	0.187s
ok  	github.com/carlosframework/platform/internal/analytics	0.120s
ok  	github.com/carlosframework/platform/internal/appconfig	4.189s
ok  	github.com/carlosframework/platform/internal/apperr	0.482s
ok  	github.com/carlosframework/platform/internal/applog	0.721s
ok  	github.com/carlosframework/platform/internal/awsinv	0.013s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.014s
ok  	github.com/carlosframework/platform/internal/boxid	1.008s
?   	github.com/carlosframework/platform/internal/boxid/boxidtest	[no test files]
?   	github.com/carlosframework/platform/internal/boxid/internal/signtest	[no test files]
ok  	github.com/carlosframework/platform/internal/boxvolumes	0.029s
ok  	github.com/carlosframework/platform/internal/caps	0.040s
ok  	github.com/carlosframework/platform/internal/certwarm	0.008s
ok  	github.com/carlosframework/platform/internal/cgroup	1.031s
ok  	github.com/carlosframework/platform/internal/changelog	0.921s
ok  	github.com/carlosframework/platform/internal/claimactivation	2.592s
ok  	github.com/carlosframework/platform/internal/clamd	0.062s
?   	github.com/carlosframework/platform/internal/cliflag	[no test files]
?   	github.com/carlosframework/platform/internal/controlname	[no test files]
?   	github.com/carlosframework/platform/internal/controlsock	[no test files]
ok  	github.com/carlosframework/platform/internal/dbdoor	6.568s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.103s
ok  	github.com/carlosframework/platform/internal/dbverify	0.010s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.025s
ok  	github.com/carlosframework/platform/internal/docsite	0.055s
ok  	github.com/carlosframework/platform/internal/domains	4.610s
ok  	github.com/carlosframework/platform/internal/doorkey	0.024s
ok  	github.com/carlosframework/platform/internal/economics	0.025s
ok  	github.com/carlosframework/platform/internal/edge	46.424s
?   	github.com/carlosframework/platform/internal/edgeproof	[no test files]
ok  	github.com/carlosframework/platform/internal/edgesfile	0.022s
ok  	github.com/carlosframework/platform/internal/fleetapi	0.213s
ok  	github.com/carlosframework/platform/internal/gate	1.763s
ok  	github.com/carlosframework/platform/internal/genselect	0.022s
ok  	github.com/carlosframework/platform/internal/geo	0.029s
ok  	github.com/carlosframework/platform/internal/geoip	0.090s
ok  	github.com/carlosframework/platform/internal/historyreadback	0.395s
ok  	github.com/carlosframework/platform/internal/host	147.727s
ok  	github.com/carlosframework/platform/internal/hostactors	5.735s
ok  	github.com/carlosframework/platform/internal/hostactors/awsmembership	0.006s
ok  	github.com/carlosframework/platform/internal/hostbox	3.245s
ok  	github.com/carlosframework/platform/internal/hostclaim	0.863s
ok  	github.com/carlosframework/platform/internal/hostenv	0.012s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.014s
ok  	github.com/carlosframework/platform/internal/hostexec	5.639s
ok  	github.com/carlosframework/platform/internal/hostfence	0.057s
ok  	github.com/carlosframework/platform/internal/hostfiles	10.400s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.017s
ok  	github.com/carlosframework/platform/internal/hostguard	1.111s
ok  	github.com/carlosframework/platform/internal/hostops	2.183s
?   	github.com/carlosframework/platform/internal/hostops/fencerelease	[no test files]
ok  	github.com/carlosframework/platform/internal/hostops/internal/fencerelease	0.004s
ok  	github.com/carlosframework/platform/internal/hostquarantine	0.003s
ok  	github.com/carlosframework/platform/internal/hostrelocate	0.697s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.231s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.003s
ok  	github.com/carlosframework/platform/internal/infraview	0.003s
ok  	github.com/carlosframework/platform/internal/instancectl	5.257s
ok  	github.com/carlosframework/platform/internal/instanceexec	2.796s
ok  	github.com/carlosframework/platform/internal/instancefs	0.025s
ok  	github.com/carlosframework/platform/internal/instancekey	0.019s
ok  	github.com/carlosframework/platform/internal/instanceupdates	0.021s
ok  	github.com/carlosframework/platform/internal/layout	1.898s
ok  	github.com/carlosframework/platform/internal/lbhealth	0.020s
ok  	github.com/carlosframework/platform/internal/lease	10.264s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.688s
ok  	github.com/carlosframework/platform/internal/ledger	0.031s
ok  	github.com/carlosframework/platform/internal/mail	0.294s
ok  	github.com/carlosframework/platform/internal/maintenance	0.104s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.603s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.100s
ok  	github.com/carlosframework/platform/internal/metrics	0.005s
ok  	github.com/carlosframework/platform/internal/moves	24.840s
ok  	github.com/carlosframework/platform/internal/moves/archive	1.129s
ok  	github.com/carlosframework/platform/internal/objstore	0.315s
ok  	github.com/carlosframework/platform/internal/ops	0.215s
ok  	github.com/carlosframework/platform/internal/park	0.317s
ok  	github.com/carlosframework/platform/internal/plans	0.009s
ok  	github.com/carlosframework/platform/internal/privatefile	0.005s
ok  	github.com/carlosframework/platform/internal/provision	26.896s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.011s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	5.814s
ok  	github.com/carlosframework/platform/internal/relay	7.270s
ok  	github.com/carlosframework/platform/internal/release	30.050s
ok  	github.com/carlosframework/platform/internal/rollout	3.896s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.007s
ok  	github.com/carlosframework/platform/internal/rootaws	0.017s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.064s
ok  	github.com/carlosframework/platform/internal/rootstate	0.029s
ok  	github.com/carlosframework/platform/internal/runs	0.550s
ok  	github.com/carlosframework/platform/internal/s3compat	0.007s
ok  	github.com/carlosframework/platform/internal/safefile	0.006s
ok  	github.com/carlosframework/platform/internal/schedule	2.855s
ok  	github.com/carlosframework/platform/internal/seeds	0.011s
ok  	github.com/carlosframework/platform/internal/sim/engines	2.883s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	17.178s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	3.498s
ok  	github.com/carlosframework/platform/internal/status	0.081s
ok  	github.com/carlosframework/platform/internal/steering	0.008s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.331s
ok  	github.com/carlosframework/platform/internal/svcrole	0.002s
ok  	github.com/carlosframework/platform/internal/telemetry	0.004s
ok  	github.com/carlosframework/platform/internal/termfence	0.004s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.004s
ok  	github.com/carlosframework/platform/internal/unixdial	0.003s
ok  	github.com/carlosframework/platform/internal/updatewords	0.005s
ok  	github.com/carlosframework/platform/internal/usage	0.005s
ok  	github.com/carlosframework/platform/internal/version	0.002s
ok  	github.com/carlosframework/platform/internal/vet	1.685s
=== internal_console@0 (87 s)
ok  	github.com/carlosframework/platform/internal/console	85.177s
=== internal_console@1 (37 s)
ok  	github.com/carlosframework/platform/internal/console	35.322s
=== internal_console@2 (44 s)
ok  	github.com/carlosframework/platform/internal/console	41.691s
=== internal_console@3 (39 s)
ok  	github.com/carlosframework/platform/internal/console	36.595s
=== internal_console@4 (40 s)
ok  	github.com/carlosframework/platform/internal/console	37.800s
=== internal_console@5 (43 s)
ok  	github.com/carlosframework/platform/internal/console	40.565s
=== internal_console@6 (46 s)
ok  	github.com/carlosframework/platform/internal/console	43.416s
=== internal_console@7 (45 s)
ok  	github.com/carlosframework/platform/internal/console	43.018s
=== root@0 (36 s)
ok  	github.com/carlosframework/platform	34.259s
=== root@1 (46 s)
ok  	github.com/carlosframework/platform	44.830s
=== root@2 (45 s)
ok  	github.com/carlosframework/platform	43.542s
=== cross ===
--- shard 0 of 5 ---
cross-compiling darwin/arm64
--- shard 1 of 5 ---
cross-compiling darwin/amd64
--- shard 2 of 5 ---
cross-compiling linux/arm64
linux/arm64 carlos binary: 50069666 bytes (ceiling 52000000)
--- shard 3 of 5 ---
cross-compiling windows/amd64
--- shard 4 of 5 ---
cross-compiling windows/arm64
=== minio-contract ===
minio contract: arm64, minio RELEASE.2025-09-07T16-13-09Z, mc RELEASE.2025-08-13T08-35-41Z
  minio: downloading https://github.com/minio/minio/releases/download/RELEASE.2025-09-07T16-13-09Z/minio.linux-arm64.RELEASE.2025-09-07T16-13-09Z
  minio: downloaded, digest verified
  mc: downloading https://github.com/minio/mc/releases/download/RELEASE.2025-08-13T08-35-41Z/mc.linux-arm64.RELEASE.2025-08-13T08-35-41Z
  mc: downloaded, digest verified
  minio healthy on 127.0.0.1:20999
Added `local` successfully.
Bucket created successfully `local/contract-bucket`.
Bucket created successfully `local/denied-bucket`.
Created policy `contract-only` successfully.
Added user `scopeduser` successfully.
Attached Policies: [contract-only]
To User: scopeduser
  buckets and scoped user ready
=== RUN   TestDeliveredContractMinio
=== RUN   TestDeliveredContractMinio/put
=== RUN   TestDeliveredContractMinio/get_round-trips_the_body
=== RUN   TestDeliveredContractMinio/list_shows_the_key
=== RUN   TestDeliveredContractMinio/head_and_list_agree_on_the_version
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed
=== RUN   TestDeliveredContractMinio/delete_removes_it
=== RUN   TestDeliveredContractMinio/cross-bucket_denial
--- PASS: TestDeliveredContractMinio (0.03s)
    --- PASS: TestDeliveredContractMinio/put (0.00s)
    --- PASS: TestDeliveredContractMinio/get_round-trips_the_body (0.00s)
    --- PASS: TestDeliveredContractMinio/list_shows_the_key (0.00s)
    --- PASS: TestDeliveredContractMinio/head_and_list_agree_on_the_version (0.00s)
    --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload (0.00s)
    --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route (0.02s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed (0.00s)
    --- PASS: TestDeliveredContractMinio/delete_removes_it (0.00s)
    --- PASS: TestDeliveredContractMinio/cross-bucket_denial (0.00s)
PASS
ok  	github.com/carlosframework/platform/internal/objstore	0.035s
=== RUN   TestT4StorageProbeMinio
2026/10/22 11:43:02 moves: T4: STORE: list: operation error S3: ListObjectsV2, https response error StatusCode: 403, RequestID: 18E0D74E40DFE509, HostID: 7c420053e0fbcd7f41653fdd92ffa2802c903d05303b1aa15adc2e8bb65d183f, api error SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
--- PASS: TestT4StorageProbeMinio (0.01s)
PASS
ok  	github.com/carlosframework/platform/internal/host	0.032s
minio contract: PASS
diff --git a/docs/superpowers/specs/CODEX-REVIEW-BRIEF-DB-REGION-FORWARD.md b/docs/superpowers/specs/CODEX-REVIEW-BRIEF-DB-REGION-FORWARD.md
index 16add9656..e3d48cc88 100644
--- a/docs/superpowers/specs/CODEX-REVIEW-BRIEF-DB-REGION-FORWARD.md
+++ b/docs/superpowers/specs/CODEX-REVIEW-BRIEF-DB-REGION-FORWARD.md
@@ -7,49 +7,67 @@ yet; you are reviewing the design against the code on `main`.
**Spec:** `docs/superpowers/specs/2026-10-22-db-region-forward-design.md`,
at the commit named in the prompt. Read `AGENTS.md` first.
-## Round 2
-
-This is round 2. Rev 2 of the spec answers your round 1 findings,
-`docs/superpowers/specs/CODEX-FINDINGS-DB-REGION-FORWARD.md` (reviewed at
-`a12757a1`). Each change is marked **(codex N)** where it lands, and §18
-gives the reasons for the two parts that were declined.
-
-| # | Round 1 finding | Spec's answer |
-|---|---|---|
-| 1 | P1: the incarnation check does not cover the replica reads | accepted in part: the identity bracket, §8.2 (checks A and B around the download; no output before B). Version pinning declined, §18 |
-| 2 | `Accept=yes` does not put the connection on stdin | accepted: `StandardInput=socket`, `StandardOutput=socket`, `StandardError=journal`, §8.3 |
-| 3 | progress acks indistinguishable from the final ack | accepted: separate `ack` and `done` routes; `done` carries the result's SHA-256, §5.4, §9.1 |
-| 4 | a lost result does not stop a late writer | accepted: heartbeat removed; a box deadline in `picked`, a 60 s bound on each PUT, and a fence before `lost`, §5.8 |
-| 5 | immediate cleanup reopens the election | accepted: `picked` is a tombstone kept until the read has ended and the acceptance window has passed, §5.8, §5.9 |
-| 6 | the CLI cannot promise it showed none of a rejected answer | accepted: the CLI buffers up to 64 MiB and writes nothing until the summary checks out, §5.4 |
-| 7 | the window does not bound stored ciphertext | accepted: acknowledged chunks are deleted on each progress ack, §5.7 |
-| 8 | disk checks can spend the same space twice | accepted: one reservation table in the agent; restart waits for old workers, §5.7 |
-| 9 | a socket inode does not prove a worker can run | accepted: capability from the armed loop and a readiness probe through the real units, §7.1 |
-| 10 | snapshot-load failure is not in the error return | accepted: refuse up front only on `Complete` and `BoxesComplete` evidence, §7.1 |
-| 11 | separate regional store servers need per-store endpoints | accepted in part: the overclaim is withdrawn and the supported shape stated, §12. Per-store endpoints declined, §18 |
-| 12 | "non-root" is not a census class; the runner stays CLI-reachable | accepted: a class per declaration with both callers named, §13 |
-
-Rev 2 also folds in the coordinator's provisional answers to rev 1's open
-questions (§16). They await Paul. Do not argue them; report only a
-mechanism that fails to honour one.
-
-**Start with a disposition table** for findings 1 to 12: fixed, declined
-with an acceptable reason, or not fixed. Check each answer against the code,
-not against the spec's summary of it. Then give **only new findings**. Do
-not repeat a round 1 finding unless its fix is wrong or incomplete; then
-say so in the table and give the new evidence.
-
-Worth extra attention in round 2, because rev 2 added them:
-
-- the write fence (§5.8): can any box write land after the console's
- `lost`, given clock skew and the SDK's retry behaviour inside a 60 s
- PUT timeout?
-- the tombstone's deletion rule against a read that runs the full 20
- minutes;
-- the reservation table across an agent restart (§5.7);
-- the readiness probe: what it proves, and whether a probe can itself be
- abused or leak a worker;
-- the worker protocol's `ready` and `run` split (§8.2, §8.3).
+## Round 3
+
+This is round 3. Rev 3 of the spec answers your round 2 findings,
+`docs/superpowers/specs/CODEX-FINDINGS-DB-REGION-FORWARD-R2.md` (reviewed
+at `8c118ae7`). Your round 1 findings are in
+`CODEX-FINDINGS-DB-REGION-FORWARD.md`. Each change is marked
+**(codex N)** where it lands, and §18 records what was declined.
+
+Rounds 1 and 2 kept finding defects in one area: which object ends a read,
+and who deletes what when. Rev 3 does not patch those cases one by one. It
+states the lifecycle as seven invariants (§5.2, I1 to I7) and builds the
+simplest mechanism that keeps them: every protocol object is a create-only
+write under `db-reads/`, nothing in the protocol replaces or deletes
+anything, one create-only `result.json` decides how a read ended, and a
+bucket lifecycle rule expires everything.
+
+| # | Finding | Round 2 said | Rev 3's answer |
+|---|---|---|---|
+| 1 | incarnation check does not cover the replica reads | fixed; pinning decline agreed | unchanged, §8.2 |
+| 2 | `Accept=yes` does not put the connection on stdin | fixed | unchanged, §8.3 |
+| 3 | progress ack indistinguishable from the final ack | fixed | superseded: no acks at all (I1, I4), §5.2, §9.1 |
+| 4 | late writes after `lost` | partly | I4 and I5: `lost` is a conditional create of `result.json`, so storage decides between it and a late box result; late chunks are never accepted, §5.2, §5.8 |
+| 5 | cleanup reopens the election | fixed | `picked` is never deleted by the protocol (I1, I2) |
+| 6 | the CLI cannot promise it showed none | fixed | unchanged, §5.5 |
+| 7 | the window does not bound stored ciphertext | partly | I1 and I2: no deletes; the lifecycle rule expires current and noncurrent versions; the bound is restated as at most the output cap per read for at most two days, §5.7. This invalidates the bound in provisional ruling 1, which §16 flags for re-confirmation |
+| 8 | disk reservations | partly | the two-minute escape is gone; a reservation is released only when the worker unit has stopped; the agent admits nothing while an orphan worker unit is active; the worker cancels its work on EOF, §5.7, §8.3 |
+| 9 | worker readiness | partly | `MaxConnections=3`: two reads and one connection kept for the probe; a blocked probe is skipped, not failed, §7.1, §8.3 |
+| 10 | incomplete snapshot evidence | partly | incomplete evidence (either flag false) is checked first and admits; DBF-1 and DBF-2 both need `Complete` and `BoxesComplete`, §7.1 |
+| 11 | separate store endpoints | decline agreed | unchanged, §12, §18 |
+| 12 | census classifications | fixed | unchanged apart from the new sites, §13 |
+| 13 | completion deletes the evidence that a read ended | new | I1 and I4: nothing is deleted on completion; the result stays until expiry, §5.2 |
+| 14 | cleanup removes the identity needed to follow | new | I1, I2 and I6: the request lives as long as every other object of the read, §5.2, §5.3 |
+| 15 | the full db gate on follow routes hides `record-changed` | new | two gates: only create reads the current record; follow and cancel check membership and the signed request, §9.1 |
+
+The provisional rulings in §16 await Paul. Do not argue them; report only
+a mechanism that fails to honour one. Ruling 1's bound is flagged by the
+spec itself; you need not report it again.
+
+**Your answer has three parts, in this order.**
+
+1. **A disposition table** for findings 1 to 15: fixed, declined with an
+ acceptable reason, or not fixed. Check each answer against the code, not
+ against the spec's summary of it.
+2. **An invariant check.** For each of I1 to I7 in §5.2: does every
+ mechanism in the spec keep it (name any write, delete, route or timer
+ that breaks it, with the section), and does the "closed by" table in
+ §5.2 hold, finding by finding? Look in particular for:
+ - any protocol path that still deletes or replaces an object, including
+ the housekeeping pass and its boundary with the protocol;
+ - any way two parties both believe they own a read or ended it;
+ - whether `expired` and `lost` created lazily on follow calls can be
+ missed, doubled or created against a read that is still being picked;
+ - whether conditional creates behave as the spec needs on S3 and on
+ MinIO, including a create whose answer is lost, and the box's
+ read-back rule in §5.3;
+ - whether the queue under `db-reads/queue/<region>/<hour>/` can make a
+ box miss a read across an hour boundary or a clock skew;
+ - whether the storage bound in §5.7 is now true on a versioned bucket.
+3. **Only new findings.** Do not repeat an earlier finding unless its fix
+ is wrong or incomplete; then say so in the table and give the new
+ evidence.
## Fixed rulings: do not re-argue them
@@ -179,6 +197,6 @@ A numbered list of findings. Each one gives:
Then a one-line verdict: accept, or revise. Do not rewrite the spec. No
praise.
-On a later round you will be given your earlier findings files. Start with a
-disposition table (finding: fixed, declined with an acceptable reason, or not
-fixed), then give only new findings.
+On every round after the first, follow the three-part answer in the round
+section at the top: the disposition table, the invariant check, then only
+new findings.