PoC acceptance: integrated evidence and assessment¶
| Date | 2026-10-19 |
| Work item | E6: demonstrate PoC acceptance |
| Design reference | §18.1 E6, §18.2; the acceptance plan (AP) |
| Artifacts | The nine historical run records of §4, two repair regressions (§4.1) and their bin/evidence bundles: kept by the owner, not published (§3.4) |
| Decision enabled | Whether the owner accepts the configuration-control PoC on the fixture profile, with the gaps of §8 carried or closed. It makes no production claim. |
1. Question¶
Does the implementation of ginsys/bronzeward#21 to ginsys/bronzeward#30 pass the acceptance plan? The plan defines the runs (AP §1 to §6) and the evidence each keeps (AP §2). This review records those runs and answers AP §7 and §7.1 row by row, as AP §7.1 requires.
2. What binds every result here¶
- Fixture: the AP §2 fixture at
the pins of
fixtures/versions.env, blobefd7c1431ebc0c3da9d258a13bb60c1c6112243f. This is design §7.7's selected profile in its single-instance topology. - Commits: Bronzeward and the fixture, one repository, every run's checkout with no changed path
(§3.3).
runandcontrols:fcecfcaf2a6f724972688d1a21d81a06b7a72054, this change's fixture fixes. The other seven runs:ab327884527fee3b3ed32f0e2dfc8ffde5bf0ce3, main after ginsys/bronzeward#235. Between the two, no Go file differs. The fixture differs where a worker S5 step 4 pointed back at S3's handover cluster fragment selects no workers profile: S5 step 4 itself, the dispatch helper adding a role fragment to the worker's assignment instead of the workers profile there, and S7 step 3, which sends the worker's current selection with its cluster fragment added where ab32788 sent the workers profile with that fragment. In the S7 runs at ab32788 the worker's assignment is S2's,{"profiles": ["workers"], "fragments": {}}: no step between S2 and S7 puts it. So S7 step 3 sends the same JSON value at both commits, compact at fcecfca, with no same-key retry. None of the seven runs at ab32788 runs S5, so the dispatch helper's path there is the unchanged one. Only S7 step 3's check text differs: it read "beside the workers profile" at ab32788. The text of S0'sSKIProw for the earlier-epoch automation token,fixtures/README.mdand the acceptance plan also differ. - Repair regressions: the two additional chains at
7fe6f14a6853d8e7be65d46bda72884b4a4cc040are recorded separately in §4.1; they do not change the historical revision bindings above. - Limits: the plan's §9 limits bind every result. A pass is a pass on the fixture, never a production claim.
3. Runs¶
Nine historical acceptance runs, each from its own fresh bin/up, all through fixtures/scenarios/integrated: the
run and controls presets at fcecfca, the s6 preset and six step lists at ab32788 (§2). The
runner runs the steps in order, stops at the first that fails, and writes
chain.log (the checkout and each step's start, end and exit status), one <step>.log per step
and a copy of the fixture's evidence directories, under <preset>-<UTC start> for a preset and
steps-<UTC start> for a step list; a list names each step at most once. Each scenario step writes
<scenario>.tsv in its evidence directory: one row per check, with PASS, FAIL or SKIP, its
acceptance-plan reference and what it checked. A pass mode (a step ending in p) runs the pass
paths alone. It writes one SKIP row for each negative control or matrix it leaves out, ending
"the full mode runs this, from a fresh up"; the controls run is that full mode.
| Run | Steps | What it carries |
|---|---|---|
run |
up s0p s1p s3h s2p s3rp s4 s5p s7 s8 down |
the integrated run (AP §2, "Execution"): the pass paths of S0 to S5, S7's nominal run and S8, S3's handover between S1 and S2 |
controls |
up s0 s1 s3h s2 s3r s4c s4x s4 s5 s5roles down |
the same chain in the full modes: the negative controls, matrices and Go rows run leaves out, S4's controls (s4c) and commitment-level controls (s4x, from restores of S3's snapshots) before S4's run, and S5 step 7 (s5roles) |
s6 |
up s1 s3h s2 s3r s4 s4ds s6 down |
S4's dispatch-safety rows (s4ds) and S6.1's interruption points; S8's step 2 reads its S6.1 timeline |
| S1 node ID | up s1nid down |
S1's Talos access refusal for another node ID |
| S3 handover controls | up s1 s3hc down |
the controls that refuse or hold an adoption before it commits |
| S7 closing | up s1 s3h s2 s3r s4 s7c down |
S7's closing run (ER §9.3 item 3): C as the missed stale instance, its epoch refusals and the refusals that leave no state |
| S7 variants | up s1 s3h s2 s3r s4 s7 s7n s7t s7o down |
S7's nominal run, then its no-entry, Transit and older-OpenBao variants on the same up |
| S0 walk | up s0walk down |
S0 step 4's denied walk and the identity revocation it ends with, from its own bin/up as S0 specifies |
| S8 controls | up s1 s8controls s8revocation down |
S8's negative controls and the revocation-alone case, on instance A as the disposable environment |
S6.2's measurement is already landed in the late-landing report.
3.1 The integrated run¶
| Step | Command | Exit | Checks (PASS / FAIL / SKIP) | Retained evidence |
|---|---|---|---|---|
up |
bin/up |
0 | — | — |
s0p |
scenarios/s0 pass |
0 | 56 / 0 / 2 | s0-pass-20261019T052351Z, 1 bundle |
s1p |
scenarios/s1 pass |
0 | 36 / 0 / 2 | s1-pass-20261019T053359Z, 5 bundles |
s3h |
scenarios/s3 handover |
0 | 29 / 0 / 0 | s3-handover-20261019T053514Z, 3 bundles |
s2p |
scenarios/s2 pass |
0 | 53 / 0 / 4 | s2-pass-20261019T053559Z, 4 bundles |
s3rp |
scenarios/s3 pass |
0 | 74 / 0 / 1 | s3-pass-20261019T053733Z, 4 bundles |
s4 |
scenarios/s4 run |
0 | 33 / 0 / 0 | s4-run-20261019T053935Z, 3 bundles |
s5p |
scenarios/s5 pass |
0 | 73 / 0 / 3 | s5-pass-20261019T054036Z, 8 bundles |
s7 |
scenarios/s7 run |
0 | 125 / 0 / 0 | s7-run-20261019T054312Z, 4 bundles |
s8 |
scenarios/s8 run |
0 | 55 / 0 / 2 | s8-run-20261019T055053Z, 3 bundles |
down |
bin/down |
0 | — | — |
3.2 Separate runs¶
Each from a fresh bin/up (AP §2). AP §7.1 items marked check are the CI tests of §6.1.
| Run | Step | Command | Exit | Checks (PASS / FAIL / SKIP) | Retained evidence |
|---|---|---|---|---|---|
controls |
up |
bin/up |
0 | — | — |
controls |
s0 |
scenarios/s0 run |
0 | 62 / 0 / 1 | s0-run-20261019T055929Z, 1 bundle |
controls |
s1 |
scenarios/s1 run |
0 | 453 / 0 / 0 | s1-run-20261019T061151Z, 52 bundles |
controls |
s3h |
scenarios/s3 handover |
0 | 29 / 0 / 0 | s3-handover-20261019T063830Z, 3 bundles |
controls |
s2 |
scenarios/s2 run |
0 | 334 / 0 / 0 | s2-run-20261019T063944Z, 23 bundles |
controls |
s3r |
scenarios/s3 run |
0 | 95 / 0 / 0 | s3-run-20261019T070417Z, 5 bundles |
controls |
s4c |
scenarios/s4 controls |
0 | 63 / 0 / 2 | s4-controls-20261019T070820Z, 3 bundles |
controls |
s4x |
scenarios/s4 restores |
0 | 138 / 0 / 1 | s4-restores-20261019T071208Z, 8 bundles |
controls |
s4 |
scenarios/s4 run |
0 | 33 / 0 / 0 | s4-run-20261019T071945Z, 3 bundles |
controls |
s5 |
scenarios/s5 run |
0 | 170 / 0 / 0 | s5-run-20261019T072136Z, 17 bundles |
controls |
s5roles |
scenarios/s5 roles |
0 | 17 / 0 / 0 | s5-roles-20261019T073612Z, 1 bundle |
controls |
down |
bin/down |
0 | — | — |
s6 |
up |
bin/up |
0 | — | — |
s6 |
s1 |
scenarios/s1 run |
0 | 453 / 0 / 0 | s1-run-20261018T191441Z, 52 bundles |
s6 |
s3h |
scenarios/s3 handover |
0 | 29 / 0 / 0 | s3-handover-20261018T194024Z, 3 bundles |
s6 |
s2 |
scenarios/s2 run |
0 | 334 / 0 / 0 | s2-run-20261018T194202Z, 23 bundles |
s6 |
s3r |
scenarios/s3 run |
0 | 95 / 0 / 0 | s3-run-20261018T200723Z, 5 bundles |
s6 |
s4 |
scenarios/s4 run |
0 | 33 / 0 / 0 | s4-run-20261018T201127Z, 3 bundles |
s6 |
s4ds |
scenarios/s4 ds |
0 | 298 / 0 / 0 | s4-ds-20261018T201439Z, 18 bundles |
s6 |
s6 |
scenarios/s6 run |
0 | 199 / 0 / 0 | s6-run-20261018T205620Z, 13 bundles |
s6 |
down |
bin/down |
0 | — | — |
| S1 node ID | up |
bin/up |
0 | — | — |
| S1 node ID | s1nid |
scenarios/s1 node-id |
0 | 24 / 0 / 0 | s1-node-id-20261019T005223Z, 4 bundles |
| S1 node ID | down |
bin/down |
0 | — | — |
| S3 handover controls | up |
bin/up |
0 | — | — |
| S3 handover controls | s1 |
scenarios/s1 run |
0 | 453 / 0 / 0 | s1-run-20261019T005521Z, 52 bundles |
| S3 handover controls | s3hc |
scenarios/s3 handover-controls |
0 | 43 / 0 / 0 | s3-handover-controls-20261019T012047Z, 4 bundles |
| S3 handover controls | down |
bin/down |
0 | — | — |
| S7 closing | up |
bin/up |
0 | — | — |
| S7 closing | s1 |
scenarios/s1 run |
0 | 458 / 0 / 0 | s1-run-20261019T012517Z, 52 bundles |
| S7 closing | s3h |
scenarios/s3 handover |
0 | 29 / 0 / 0 | s3-handover-20261019T015252Z, 3 bundles |
| S7 closing | s2 |
scenarios/s2 run |
0 | 334 / 0 / 0 | s2-run-20261019T015412Z, 23 bundles |
| S7 closing | s3r |
scenarios/s3 run |
0 | 95 / 0 / 0 | s3-run-20261019T021640Z, 5 bundles |
| S7 closing | s4 |
scenarios/s4 run |
0 | 33 / 0 / 0 | s4-run-20261019T022109Z, 3 bundles |
| S7 closing | s7c |
scenarios/s7 closing |
0 | 142 / 0 / 3 | s7-closing-20261019T022326Z, 4 bundles |
| S7 closing | down |
bin/down |
0 | — | — |
| S7 variants | up |
bin/up |
0 | — | — |
| S7 variants | s1 |
scenarios/s1 run |
0 | 458 / 0 / 0 | s1-run-20261019T023518Z, 52 bundles |
| S7 variants | s3h |
scenarios/s3 handover |
0 | 29 / 0 / 0 | s3-handover-20261019T030306Z, 3 bundles |
| S7 variants | s2 |
scenarios/s2 run |
0 | 334 / 0 / 0 | s2-run-20261019T030426Z, 23 bundles |
| S7 variants | s3r |
scenarios/s3 run |
0 | 95 / 0 / 0 | s3-run-20261019T032901Z, 5 bundles |
| S7 variants | s4 |
scenarios/s4 run |
0 | 33 / 0 / 0 | s4-run-20261019T033334Z, 3 bundles |
| S7 variants | s7 |
scenarios/s7 run |
0 | 125 / 0 / 0 | s7-run-20261019T033536Z, 4 bundles |
| S7 variants | s7n |
scenarios/s7 no-entry |
0 | 49 / 0 / 0 | s7-no-entry-20261019T034544Z, 3 bundles |
| S7 variants | s7t |
scenarios/s7 transit |
0 | 46 / 0 / 0 | s7-transit-20261019T035054Z, 1 bundle |
| S7 variants | s7o |
scenarios/s7 old-bao |
0 | 41 / 0 / 0 | s7-old-bao-20261019T035825Z, 1 bundle |
| S7 variants | down |
bin/down |
0 | — | — |
| S0 walk | up |
bin/up |
0 | — | — |
| S0 walk | s0walk |
scenarios/s0 walk |
0 | 52 / 0 / 0 | s0-walk-20261019T040259Z, 1 bundle |
| S0 walk | down |
bin/down |
0 | — | — |
| S8 controls | up |
bin/up |
0 | — | — |
| S8 controls | s1 |
scenarios/s1 run |
0 | 453 / 0 / 0 | s1-run-20261019T040539Z, 52 bundles |
| S8 controls | s8controls |
scenarios/s8 controls |
0 | 18 / 0 / 1 | s8-controls-20261019T043234Z, 2 bundles |
| S8 controls | s8revocation |
scenarios/s8 revocation |
0 | 9 / 0 / 0 | s8-revocation-20261019T043327Z, 1 bundle |
| S8 controls | down |
bin/down |
0 | — | — |
3.3 Versions¶
Per run, from its record:
- Record: the record directory, <preset>-<UTC start> or steps-<UTC start>.
- Checkout: the first line of chain.log, checkout <OID>, <n> changed paths; steps: …, with
<n> 0; each bundle's versions.txt (manifest commit, created at) naming the same OID and
its fixtures-diff.txt empty.
- Pins: the fixtures/versions.env blob, git rev-parse <checkout>:fixtures/versions.env.
- Server image: the image ID bin/up built and recorded in .state/up-image, and the image
rows of bw-fixture-bronzeward-a, -b, -c and -b-recovery in versions.txt.
- Versions: from versions.txt: talosctl and talos nodes, kubernetes, openbao and
postgres with their image rows, docker and compose.
A run whose bundles disagree on any of these is not one run. Versions the runs share are given once, under the table.
| Run | Record | Checkout (changed paths) | Pins blob | Server image |
|---|---|---|---|---|
run |
run-20261019T052145Z |
fcecfcaf2a6f (0) |
efd7c1431ebc |
6e31bb6ab4aa |
controls |
controls-20261019T055715Z |
fcecfcaf2a6f (0) |
efd7c1431ebc |
d4b8c1c21333 |
s6 |
s6-20261018T191226Z |
ab327884527f (0) |
efd7c1431ebc |
74661b51c9cc |
| S1 node ID | steps-20261019T005015Z |
ab327884527f (0) |
efd7c1431ebc |
e5dd6e22b059 |
| S3 handover controls | steps-20261019T005313Z |
ab327884527f (0) |
efd7c1431ebc |
a3cb9895bc26 |
| S7 closing | steps-20261019T012309Z |
ab327884527f (0) |
efd7c1431ebc |
f2e6efca2bb5 |
| S7 variants | steps-20261019T023237Z |
ab327884527f (0) |
efd7c1431ebc |
17e4616f9b37 |
| S0 walk | steps-20261019T040050Z |
ab327884527f (0) |
efd7c1431ebc |
82cdf5079447 |
| S8 controls | steps-20261019T040326Z |
ab327884527f (0) |
efd7c1431ebc |
dc0f3ca92012 |
Every bundle of every run (569) agrees: manifest commit and created at its run's
checkout (fcecfca for run and controls, ab32788 for the others) and an empty
fixtures-diff.txt. The server image is built by each bin/up, so its ID is the run's own; within
a run all four server containers share it. Versions, the same for all runs:
- Talos v1.13.6, talosctl and both nodes, image
ghcr.io/siderolabs/talos:v1.13.6@sha256:f2e2b7e5812b2b59c1acfe6af7516231aeeef79fb1ffff6b57ad987f8dd47a6e;
- Kubernetes 1.36.2 (requested);
- OpenBao v2.6.1 (ba7ad8861d0578cd4da4f7b9e5a6756d30484f8f), image
ghcr.io/openbao/openbao:2.6.1@sha256:5b2486ab0fb90bbc788cc345b0a08616dfb375873ee8be5df3a2fd4d378a67e0;
- PostgreSQL 17.11, image
docker.io/library/postgres:17-alpine@sha256:f02121de6f74d30d8a94cd1d9584125e2178d7e6c377d8130112d4e52d867995;
- Docker 26.1.5+dfsg1 (client and server), Compose 2.27.1; sops 3.13.3, age v1.3.2.
3.4 Common evidence¶
Per run (AP §2):
- the fixture and Bronzeward commits and the versions.env blob;
- commands and exit codes;
- request and response transcripts with tokens withheld;
- the migration record;
- machine timelines as served;
- a bin/evidence bundle with its positive control found.
Each run's record and bundles are kept by the owner, not published: the bundles hold the fixture's synthetic secrets with their scans. The commands of §4 regenerate them.
4. Reproduction¶
From fixtures/ in a clean checkout at each revision below (§2), with mise run dev-db and
mise run dev-bao up for the Go rows (S0's, S1's, S2's, S4's dispatch-safety rows and S8's), and
<rec> a record directory outside fixtures/ (bin/down removes the fixture's state). s6 runs
before run, whose S8 step reads the S6.1 timeline it kept. Finish each chain, including down,
before changing checkout. The commands reproduce the historical runs at their own revisions;
running them at a later revision produces new evidence.
At ab327884527fee3b3ed32f0e2dfc8ffde5bf0ce3:
scenarios/integrated <rec> s6
scenarios/integrated <rec> up s1nid down
scenarios/integrated <rec> up s1 s3hc down
scenarios/integrated <rec> up s1 s3h s2 s3r s4 s7c down
scenarios/integrated <rec> up s1 s3h s2 s3r s4 s7 s7n s7t s7o down
scenarios/integrated <rec> up s0walk down
scenarios/integrated <rec> up s1 s8controls s8revocation down
At fcecfcaf2a6f (the run and controls checkout in §3.3), using the retained S6.1 timeline
from the preceding revision:
S8_S6_KEPT=<rec>/s6-<UTC start>/evidence/s6-run-<UTC> scenarios/integrated <rec> run
scenarios/integrated <rec> controls
Records written:
- s6: s6-20261018T191226Z. It supersedes s6-20261018T153139Z, which passed but checked out
3a1ffdb, a branch commit before its merge, not the commit of §2.
- run: run-20261019T052145Z, with S8_S6_KEPT the s6 record's s6-run-20261018T205620Z.
S5 step 4 pointed the worker's assignment back at S3's handover cluster fragment, since S2's
label fragment was the workers profile's only one. From then on the worker selects no workers
profile, so S7's held-operation release and S8's release added their role fragments to the
worker's assignment, and S7 step 3 added its cluster fragment beside the worker's current
selection. It supersedes three records:
- run-20261018T213240Z, the run preset at ab32788, stopped at s5p (exit 1, S5 step 4's
profile change refused with 400 for an empty fragment list);
- steps-20261018T220329Z, which passed at ab32788 with s4ds before s5p, so that S5 relied on
the dispatch-safety rows' fragments, where AP §2 runs those separately;
- run-20261019T045222Z, the run preset at an earlier commit of this change, stopped at s7
(S7 step 3's release left the worker's configuration digest unchanged).
- controls: controls-20261019T055715Z. With no S4 dispatch-safety rows before it, S5 step 4
again pointed the worker's assignment back at S3's handover cluster fragment. It supersedes
steps-20261018T224934Z, which passed at ab32788 with s4ds before s5.
- S1 node ID: steps-20261019T005015Z.
- S3 handover controls: steps-20261019T005313Z.
- S7 closing: steps-20261019T012309Z.
- S7 variants: steps-20261019T023237Z.
- S0 walk: steps-20261019T040050Z.
- S8 controls: steps-20261019T040326Z.
Every step of these nine records exited 0 and no check failed. Across the 569 bundles, each leak
scan found only its positive control, except where S8's negative control planted a copy of a
secret to be found (S8 negative controls, "the scan reports the copy"); no bundle names a source
it could not capture.
4.1 Repair regression: both worker selections¶
Local review found that the older-OpenBao variant would remove s2-labels from
the unused workers profile after S5 had reassigned the worker. That profile
contained only that fragment, so the edit would be refused with 400 for an empty
fragment list. This was a source finding, not another recorded failed chain. Commit
7fe6f14a6853d8e7be65d46bda72884b4a4cc040 skips the edit when the worker does not
select workers; when it does, the existing fragment-removal behavior remains.
No public API, schema or Go code changed.
These two fresh chains ran serially at that clean commit, with no tracked edits during execution. They supplement the nine historical records above. They do not replace the AP §2 integrated run, its S8 timeline or the separate S6 evidence.
| Path | Record | UTC start to finish | Bundles | Server image (sha256) |
|---|---|---|---|---|
| Reassigned worker | steps-20261019T100727Z |
2026-10-19T10:07:27Z to 2026-10-19T11:43:35Z | 112 | bd18cd9f76b9c0fba3212dd5ce7d74c0d2f9b259cc869316ec98b841492dc8a6 |
| Selected workers profile | steps-20261019T114919Z |
2026-10-19T11:49:19Z to 2026-10-19T12:14:38Z | 28 | 37c24cb5baf555816f53b1808f31367a18d788c9415237d798c39940f99e4f94 |
| Path | Step | Exit | Checks (PASS / FAIL / SKIP) | Retained evidence |
|---|---|---|---|---|
| Reassigned worker | s1 |
0 | 458 / 0 / 0 | s1-run-20261019T100935Z |
| Reassigned worker | s3h |
0 | 29 / 0 / 0 | s3-handover-20261019T103717Z |
| Reassigned worker | s2 |
0 | 334 / 0 / 0 | s2-run-20261019T103831Z |
| Reassigned worker | s3r |
0 | 95 / 0 / 0 | s3-run-20261019T110350Z |
| Reassigned worker | s4 |
0 | 33 / 0 / 0 | s4-run-20261019T110747Z |
| Reassigned worker | s5 |
0 | 170 / 0 / 0 | s5-run-20261019T110935Z |
| Reassigned worker | s7 |
0 | 125 / 0 / 0 | s7-run-20261019T112413Z |
| Reassigned worker | s7n |
0 | 49 / 0 / 0 | s7-no-entry-20261019T113249Z |
| Reassigned worker | s7t |
0 | 46 / 0 / 0 | s7-transit-20261019T113456Z |
| Reassigned worker | s7o |
0 | 41 / 0 / 0 | s7-old-bao-20261019T114126Z |
| Selected workers profile | s1p |
0 | 36 / 0 / 2 | s1-pass-20261019T115132Z |
| Selected workers profile | s3h |
0 | 29 / 0 / 0 | s3-handover-20261019T115245Z |
| Selected workers profile | s2p |
0 | 53 / 0 / 4 | s2-pass-20261019T115330Z |
| Selected workers profile | s3rp |
0 | 74 / 0 / 1 | s3-pass-20261019T115519Z |
| Selected workers profile | s4 |
0 | 33 / 0 / 0 | s4-run-20261019T115713Z |
| Selected workers profile | s7 |
0 | 125 / 0 / 0 | s7-run-20261019T115807Z |
| Selected workers profile | s7n |
0 | 49 / 0 / 0 | s7-no-entry-20261019T120540Z |
| Selected workers profile | s7t |
0 | 46 / 0 / 0 | s7-transit-20261019T120646Z |
| Selected workers profile | s7o |
0 | 41 / 0 / 0 | s7-old-bao-20261019T121255Z |
Every up and down also exited 0. Teardown reported no fixture containers,
networks, volumes or state left. The profile-selected chain deliberately uses
S1/S2/S3 pass modes; their explicit skips remain in their TSVs. It exercises the
selected-profile branch, not another full interruption matrix. The first chain
runs the full modes and S5's reassignment before the same S7 variants.
Each bundle's manifest commit and created at equal the repair commit, each
fixtures-diff.txt is empty, and each leak scan finds only its intentional
positive control. No source is recorded as unavailable. All versions and pinned
images are those in §3.3, except the per-run server image IDs above; the pins blob
is unchanged. Bundles remain owner-kept and unpublished under §3.4.
From the repository root at the repair commit, with the same development services
as §4, <rec> outside fixtures/ and an existing writable <tmp> outside the
fixture state:
export TMPDIR='<tmp>' GOTMPDIR='<tmp>'
mise exec -- fixtures/scenarios/integrated '<rec>' up s1 s3h s2 s3r s4 s5 s7 s7n s7t s7o down
mise exec -- fixtures/scenarios/integrated '<rec>' up s1p s3h s2p s3rp s4 s7 s7n s7t s7o down
The first run's older-OpenBao check explicitly records that the worker selects
no workers profile and skips the unused profile edit. The second run retains
the selected-profile removal check. Both publish and apply the imported artifact
before the database snapshot, then restore the older provider, record its missing
dependency alerts and refuse regeneration. Neither changes the acceptance limits
or supplies an owner's verdict.
5. Coverage (AP §7)¶
Runs and steps are those of §3; "controls: s1" is the s1 step of the controls run.
Scenario passes describe their observed paths. The dated supplement in §6.3
adds the R5 refusal and R45 observation-access mapping and committed checks.
The 20 October independent timeline reading and delegated assessment supply
the current six criterion verdicts in §7, with their limits in §9.
| Design §18.2 | Scenario | Runs: steps | Result | Verdict |
|---|---|---|---|---|
| Item 1: import without mutation, extraction before persistence, exact encrypted baseline | S1; S3's handover part | run: s1p, s3h; controls: s1, s3h; S3 handover controls: s3hc |
passed: every step named exited 0, no check failed (§4) | met |
| Item 2: native fragments, references, revisions, provenance, validation stages | S2 | run: s2p; controls: s2 |
passed: every step named exited 0, no check failed (§4) | met |
| Item 3: immutable encrypted artifacts, exact dependencies, redacted review data, no apply | S2, S3 step 1 | run: s2p, s3rp; controls: s2, s3r |
passed: every step named exited 0, no check failed (§4) | met |
| Item 4: authenticated API; plan and approval of one safe worker change | S0, S3 | run: s0p, s3rp; controls: s0, s3r; S0 walk: s0walk |
passed: every step named exited 0, no check failed (§4) | evidenced by the runs and R5 supplement (§6.3); dated verdict in §7 |
| Item 5: direct dispatch, verification, separate desired/applied/observed | S4 | run: s4; s6: s4ds |
passed: every step named exited 0, no check failed (§4) | evidenced by the runs and R45 supplement (§6.3); dated verdict in §7 |
| Item 6: external change detected; freeze, sanitized adoption, approved revert | S5 | run: s5p; controls: s5 |
passed: every step named exited 0, no check failed (§4) | met |
| Item 7: interrupted execution | S6 | s6: s6 |
passed: every step named exited 0, no check failed (§4) | met |
| Item 7: external restoration through explicit recovery mode | S7 | run: s7 (the nominal run; its pass criterion "every pre-restore automation token until reissued", PA §17 choice 27: S7 step 6, the seed automation token 401 after the restore and after its reissue, which S0 step 3 leaves out with a SKIP); S7 closing: s7c; S7 variants: s7, s7n, s7t, s7o |
passed: every step named exited 0, no check failed (§4) | met |
| Selected database/provider behaviour (§7.7) | S0 to S8 on the AP §2 fixture | all nine runs | passed: every step named exited 0, no check failed (§4) | met |
| Scoped authorization (§13.7) | S0 steps 4 and 5, and the scenario-table rows AP §7 names | S0 walk: s0walk; run: s0p, s2p (step 7), s3h, s3rp, s4, s5p (step 3), s7; controls: s4c, s4x, s5roles (step 7); s6: s6 (step 7); S7 closing: s7c |
passed: every step named exited 0, no check failed (§4) | met |
| Usable operation timeline | S8, with a second reviewer's record | run: s8; S8 controls: s8controls, s8revocation; the reviewer's record (run's s8 writes SKIP for it) |
passed: every step named exited 0, no check failed (§4) | live part met; independent reading assessed on 20 October (§7, §9), preserving the original SKIP |
| §18.1 E6: the existing-cluster vertical slice | §3.1 and S6's runs | run; s6 |
passed: every step named exited 0, no check failed (§4) | checks supplemented in §6.3; independent reading and dated verdicts in §7 and §9 |
6. Required verification (AP §7.1)¶
Row Rn is the nth row of AP §7.1, in its order. The item is shortened to its leading clause; the full item and its "Where" are in the plan. An item with no retained result leaves its issue incomplete (AP §7.1).
| Row | Contract item (leading clause) | Issue (ginsys/bronzeward) | Checks (§6.1; supplement §6.3) | Left for the live run | Verdict |
|---|---|---|---|---|---|
| R1 | C §15: ingestion success, refusal and interruption at each pipeline step, every surface scanned | #22, #27, #23 | drift-adoption success and its start refusals | S1; S5 step 4 with drift adoption's interruption at each step and its scan; S2's negative controls | met live and in CI |
| R2 | C §15: the compiler process's surfaces scanned over successful, rejected and interrupted publications, killed at … | #23 | original six-point checks; #247's seven-point run can retain earlier observation entries but no release/Desired change before commit; generation-2 takeover | S2's revision-bound scans, including #247 full S2 at aede267 |
met live and in CI |
| R3 | C §15: claim lease extension by its owner only, takeover of held and resumed claims only after lapse, stale … |
#22 | every named takeover test, lease extension, a crash inside the draft transaction, provider unreachable | S1's negative controls | met live and in CI |
| R4 | C §15: SR and SP matrices through the compiler's path, with import-base references and SP's oracle over Bronzeward's … | #23 | — | S2's precondition and negative controls | met live |
| R5 | C §15 and PA §16: every refusal of C §13, every walk-through of PA §13 and refusal of PA §14 | #21 to #29 | clause-level mapping in the supplement; separate #247 publication-minor evidence; PA14-13 synchronous failure and control checked | retained scenario refusals and scans, including early publication access refusal | evidenced by the clause mapping, landed repairs and fresh combined-tree checks (§6.3); #241 landed and accepted (§6.3) |
| R6 | ER §9.2: DS rows 001–023 through the implementation over the worker's endpoint, with controls 006, 008, 011 and row … | #26 | — | S4's precondition (DS rows over the worker's endpoint); the fallback's scan does not apply, the fallback is not built (ER §9.2) | met by live rows and Go interleaving checks (ER choice §10.32); the fallback is not built (ER §9.2) |
| R7 | ER §9.2: sending only after the attempt commits | #25, #26 | every named lock test with its control | S4 and DS rows 003 and 011 | met live and in CI |
| R8 | ER §9.2: expiry, observation age, a contradicting newer observation, the attempt bound, each refusing | #25, #26, #28 | the attempt bound refusing; the bound exhausted after a lost response | expiry, observation age and a contradicting newer observation (S3, S4) | met live and in CI |
| R9 | ER §9.2: plan cancellation before commitment and after it with no attempt | #25, #26 | — | S3's and S4's negative controls | met live |
| R10 | ER §9.2: a plan for a release that is not the machine's Desired refused at creation |
#25, #26 | the publication racing the commitment in both orders, with the unlocked control; the attempt still admitted | the refusal at plan creation (S3) and the refused commitment (S4) | met live and in CI |
| R11 | ER §9.2: a bound health check failing before the verification deadline then passing | #26, #27, #188 | a contradicting digest: failed at once, the drift record in the same transaction |
— | contradicting digest met in CI; health cases carried (§8) |
| R12 | ER §9.2: the fixture's nodes each reporting a distinct Talos node ID, no SMBIOS UUID and one Talos cluster ID through … | #26, #29 | the commitment's and retry's identity cases with their controls against a stub; the restoration half | the fixture's nodes read through the real client | met live and in CI |
| R13 | ER §9.2: an apply-config operation with no attempt not completed by a completion observation of its artifact applied … |
#28 | the schema refusing completion with no attempt; a recovery observation not completing it; a completion observation of the artifact applied not completing it, with its control | — | met in CI |
| R14 | ER §9.2: assignment change refused while the scope is held; comparison 6 under freeze/recovery before release | #26, #29 | comparison 6 under a freeze and before release in recovery mode | S4's held-assignment refusal and S5's frozen-scope revert passed over | met live and in CI |
| R15 | ER §9.2: takeover at start | #28 | takeover at start, the §5 precedence, unresolved kept, a terminal operation refused |
S6.1 | met live and in CI |
| R16 | ER §9.2: identity revocation before commitment, after it with no attempt, after an attempt with its retry refused | #25, #26, #28 | the retry refused after an attempt | before commitment and after it with no attempt (S4) | met live and in CI |
| R17 | ER §9.2: observation ordering, contradicting higher-basis reads, confirmed reads, the late-read residual | #28, #27 (adoption read) | ordering, contradicting higher-basis and confirmed reads, the late-read residual, the adoption read; a completion read in flight across a concurrent accounting, with the record-order control | — | PoC observation predicates met in CI; bound-health ordering carried to #188 (§8) |
| R18 | ER §9.2: plan and commitment refusals on undetected drift | #27 | a commitment refused on drifted evidence, opening the record, and comparison 6 refusing an ordinary plan while it is open; a drifted adoption's refusals; a revert's refusals, re-drift and a manual return closing returned |
S5, and two of its negative controls: the revert on a frozen scope passed over, the unfreeze by a non-approver refused | met live and in CI |
| R19 | ER §9.2: recovery-mode entry after a restore older than a takeover, an approval, a revocation and an attempt | #29 | — | S7 | met live |
| R20 | ER §9.2: the complete existing-cluster E6 slice | #31 | — | the integrated run (§3.1) | live run and R5/R45 checks evidenced; independent reading and delegated assessment recorded in §7 and §9 |
| R21 | PA §16: FOR SHARE at publication (DB row 011) |
#23 | — | S2's negative controls | met live |
| R22 | PA §16: ownership check inside the attempt's UPDATE (row 018) |
#25, #26 | the conditional write and its read-then-write control | S4's negative controls | met live and in CI |
| R23 | PA §16: claim eligibility re-check (row 020) | #22 | the refusal after expiry in the lock wait, with the earlier-read control | — | met in CI |
| R24 | PA §16: the orphan report's identity, its policy read back and compared exactly, with the extra-stanza control | #22 | every clause, each with its control; both reference kinds read, with the one-kind-only control (the defect fixed by ginsys/bronzeward#233) | S1's negative controls | met live and in CI |
| R25 | PA §16: migration advisory lock (row 026) | #21, #23 | the startup refusal on each schema mismatch | the migration lock and immutability triggers (S0, S2) | met live and in CI |
| R26 | PA §16: role checks whose outcome needs the route's handler or state, against the design §13.7 scenarios | #23, #25, #26, #27, #28, #29 | — | S2 step 7, S3 to S5, S6.1 step 7, S7 | met live |
| R27 | PA §16: the epoch term and process-epoch checks | #29 | — | S7 | met live |
| R28 | PA §16: one idempotency key in flight twice, with the key-lock control | #21 | one key in flight twice, with the key-lock control | — | met in CI |
| R29 | DM §10.1 items 2 and 3: each provider object state classified through the metadata client under the fixture's policy, with exactly its alerts | #24 | the provider states against CI's development OpenBao | the same against the fixture's OpenBao (S2) | met live and in CI |
| R30 | DM §10.1 items 2 and 8's publication refusal | #24 | — | S2 step 6 and its negative controls | met live |
| R31 | DM §10.1 items 2 and 3 across a restore: a deleted Transit key and an OpenBao snapshot older than the database | #29 | — | S7's variants | met live |
| R32 | DM §10.1 items 1, 4 to 7, 9 to 12, 14 and 15: every classification rule, persistent unknown, metadata-only access, … | #24 | each listed item, with item 1's clock control and item 4's no-last-alert control | — | met in CI |
| R33 | DM §10.1 item 8's dispatch half: no dispatch admitted by a retained class | #26 | no dispatch admitted while the artifact key is retained | — | met in CI |
| R34 | DM §10.1 item 13: recovery start records nothing before its entry commits | #29 | the monitor and sweep start only after the entry, with the normal-start control | — | met in CI |
| R35 | PA §16: approval revocation racing commitment (DS row 003) | #25, #26 | approval revocation waits for commitment (TestCommitmentRevocationsWait/approval) |
the same Go checks replayed by s4ds for DS row 003, using a stand-in node (ER choice §10.32) |
met in CI and replayed in the fixture suite |
| R36 | PA §10.4: an approval surviving its approver's loss of the role, contrasted with its revocation (choice §17.23) | #25, #26 | — | S4's negative controls, contrasted with S3 | met live |
| R37 | PA §16: identity revocation racing commitment, with the lock control | #25 | the race; the T5c entries on exactly the machines touched; the T5c installation lock with its FOR SHARE control |
— | met in CI |
| R38 | PA §16: a lapsed publish job claimed again |
#23 | — | S2's negative controls | met live |
| R39 | PA §16: leaving recovery mode racing an inventory request, with the FOR SHARE control |
#29 | the exit refused, with the FOR SHARE control |
— | met in CI |
| R40 | PA §16: concurrent rotations of one service identity, and rotation racing its revocation, with the principal-lock … | #21 | both races, each with the principal-lock control | — | met in CI |
| R41 | PA §16: a reissue after a restore refused for a service identity deniedSubjects lists |
#29 | the reissue refused after a simulated restore, with the no-list control | — | met in CI |
| R42 | PA §16: two inventory requests for one SMBIOS UUID under different keys, one refused, and the same for one Talos node … | #22 | each identity key's race with its control; both keys/neither and platform refusals; matching/mismatched release-mode controls | — | met in CI; platform checks rerun in §6.3 |
| R43 | PA §16: Talos access, ingestion | #22 | every named test; the access path's grants and refusals | TestLiveRoleProbe (skips in CI: no Talos node); S1's scan |
met live and in CI |
| R44 | PA §16: Talos access, executor | #26, #172 | every named test, against a stand-in node | S4's scan of refused and interrupted dispatches | met live and in CI |
| R45 | PA §16: Talos access, observations | #26, #27, #29 | six purposes and 30 access failures; 12 latest/stale loop assertions, mutating-call and post-revocation controls; plan-less drift | retained S4, S5, S7 evidence; #247 publication observations | fresh six-purpose checks passed (§6.3); #241 landed and accepted (§6.3) |
| R46 | PA §16: Talos access, endpoint | #22, #25, #29 | the grammar, atomicity, recovery mode, a plan dialling its old endpoint, with the current-endpoint and dispatch-time-resolution controls; a later plan bound to the new endpoint | — | met in CI |
| R47 | PA §16: machine revisions allocated in commit order under concurrent writers, with the unlocked control | #26 | commit order under concurrent writers, with the unlocked control | — | met in CI |
| R48 | PA §16: an event stream ended by its token's exp, resumption refused after revocation |
#26 | the stream ended at exp (in CI too) |
S8 step 3 | met live and in CI |
| R49 | PA §16: no request body in the data directory, write-ahead log or backups | #22, #23 | — | S1's and S2's scans | met live |
| R50 | PA §16 and C §15: the operator review (C §3.6) | #125 | every clause but the killed mark runs; paused claims in the orphan report, live and past expiry | S1's review rows and scans, which alone show a mark's run killed at each point it re-enters | met live and in CI |
6.1 Tests per row¶
Paths and lines are at cde5e38, main after ginsys/bronzeward#234. Each test ran in CI's go-db job (PostgreSQL 17, OpenBao 2.6.1 in development mode, no Talos node): on main at a636c2a, workflow run 39136967990, which succeeded, or, for the tests and subtests marked at cde5e38, in the go-db job of ginsys/bronzeward#234, which added them. At ab32788, main after ginsys/bronzeward#235 and the commit seven of the live runs checked out, and at fcecfca, which run and controls checked out, no Go file differs from cde5e38; CI workflow run 39157577288 there succeeded, its go-db job with 21 packages ok and none failing. A test that skips without a Talos node is marked; it counts only in the live run.
- R1:
TestDriftAdoptionIngestion(internal/api/drift_adoption_test.go:187),TestDriftAdoptionRefusals(internal/api/drift_adoption_test.go:218). - R2:
TestPublishRunStopped(internal/api/worker_test.go:309). - R3:
TestTakeOver(internal/staging/takeover_test.go:82),TestTakeOverRefusals(internal/staging/takeover_test.go:148),TestTakeOverConcurrentTakers(internal/staging/takeover_test.go:332),TestTakeoverResumesToT1(internal/api/takeover_test.go:112),TestTakeoverRefusals(internal/api/takeover_test.go:248),TestTakeoverNothingToDecrypt(internal/api/takeover_test.go:351),TestTakeoverDecryptFailureLeavesResumed(internal/api/takeover_test.go:382),TestTakeoverDigestMismatchAbandons(internal/api/takeover_test.go:432),TestTakeoverRacesT1(internal/api/takeover_test.go:456),TestTakeoverConcurrentTakers(internal/api/takeover_test.go:538),TestTakeoverNoEcho(internal/api/takeover_test.go:564),TestHeartbeat(internal/staging/claim_test.go:236),TestCrashInsideT1LeavesDraft(internal/api/runner_test.go:343),TestProviderUnavailableAbandons(internal/api/runner_test.go:465). - R5: all clause mappings and the additional checks are in the refusal/access supplement; earlier named checks:
TestCommitmentRefusals(internal/api/commit_test.go:274),TestPlanCreationRefusals(internal/api/plans_test.go:455),TestInventoryRefusals(internal/api/inventory_test.go:355),TestProblemCodesAreSpecified(internal/api/router_test.go:98). - R7:
TestCommitmentHoldsItsReads(internal/api/commit_test.go:637),TestAttemptHoldsItsReads(internal/api/attempt_test.go:471),TestCommitmentReadLockControls(internal/api/commit_test.go:882),TestAttemptReadLockControls(internal/api/attempt_test.go:522),TestAttemptWaitsForTheMachine(internal/api/attempt_test.go:668),TestCommitmentRolloutWaitPrecedesTime(internal/api/commit_test.go:830),TestCommitmentRolloutLockControl(internal/api/commit_test.go:916),TestCommitmentFreezeRace(internal/api/commit_test.go:948). - R8:
TestCommitmentRefusals(internal/api/commit_test.go:274) andTestAttemptRefusals(internal/api/attempt_test.go:217), "a newer observation shows another digest",TestSettle(internal/api/settle_test.go:374), "bound exhausted after a lost response". - R10:
TestCommitmentPublicationRace(internal/api/commit_test.go:763),TestCommitmentPublicationWaits(internal/api/commit_test.go:990),TestAttemptAccepts(internal/api/attempt_test.go:132). - R11:
TestSettle(internal/api/settle_test.go:374), "contradicted". - R12:
TestExecutorCommitmentIdentityKeys(internal/api/executor_test.go:306),TestCommitmentRefusals(internal/api/commit_test.go:274),TestSettle(internal/api/settle_test.go:374), "retry evidence identity",TestRecoveryScopeMark(internal/api/recovery_marks_test.go:91). - R13:
TestAttempts(internal/migrate/attempt_test.go:104),TestSettle(internal/api/settle_test.go:374), "safe to retry before the first attempt"; at cde5e38:TestSettle(internal/api/settle_test.go:374), "no attempt not completed by its artifact applied" (line 735). - R14:
TestCommitmentRefusals(internal/api/commit_test.go:274), "frozen";TestCommitmentScopeGateControl(internal/api/epoch_test.go:201), recovery mode before release, with the dropped-gate control. - R15:
TestExecutorTakesOverAtStart(internal/api/executor_test.go:1188),TestExecutorCompletesATakenOverAcceptedAttempt(internal/api/executor_test.go:785),TestSettle(internal/api/settle_test.go:374), "no retry",TestTakeOver(internal/api/outcome_test.go:79),TestTakeOverRefusals(internal/api/outcome_test.go:131). - R16:
TestSettle(internal/api/settle_test.go:374), "identity revoked after an attempt". - R17:
TestSettle(internal/api/settle_test.go:374),TestAccountByDecision(internal/api/settle_test.go:180),TestMachineObservedHighestBasis(internal/api/operations_read_test.go:271),TestResidualLateRead(internal/api/residual_test.go:80),TestRevertRefusals(internal/api/drift_revert_test.go:140),TestAdoptionRefusals(internal/api/adoption_test.go:301); at cde5e38:TestSettle(internal/api/settle_test.go:374), "read in flight across a concurrent accounting" (line 815), with its record-order control. - R18:
TestCommitmentDrift(internal/api/drift_test.go:34),TestDriftedAdoptionRefusals(internal/api/drift_adoption_test.go:136),TestRevertRefusals(internal/api/drift_revert_test.go:140). - R22:
TestAttemptStaleOwner(internal/api/attempt_test.go:742). - R23:
TestTakeOverRechecksEligibility(internal/staging/takeover_test.go:304). - R24:
TestSelection(internal/orphans/orphans_test.go:249),TestClusterScope(internal/orphans/orphans_test.go:309),TestReleaseDuringRun(internal/orphans/orphans_test.go:325),TestHeldPastExpiryUnderLock(internal/orphans/orphans_test.go:350),TestFailures(internal/orphans/orphans_test.go:385),TestOrphansSelects(cmd/bronzeward/orphans_test.go:282),TestOrphansClusterScope(cmd/bronzeward/orphans_test.go:316),TestOrphansTokenFileRefused(cmd/bronzeward/orphans_test.go:346),TestOrphansTokenReadAtUse(cmd/bronzeward/orphans_test.go:417),TestOrphansFailuresPrintNothing(cmd/bronzeward/orphans_test.go:444),TestOrphansNoCustomMetadata(cmd/bronzeward/orphans_test.go:499),TestOrphansChangesNothing(cmd/bronzeward/orphans_test.go:558),TestLiveReportPolicyExact(internal/provider/report_live_test.go:96),TestLiveReportIdentity(internal/provider/report_live_test.go:227),TestNoOrphanReportRoute(internal/api/router_test.go:196); at cde5e38:TestSelection(internal/orphans/orphans_test.go:249), generations named only by fragment reference rows, with the one-kind-only control in one and two statements (lines 292-293). - R25:
TestCheckNoSchema(internal/migrate/check_test.go:42),TestCheckNotInstalled(internal/migrate/check_test.go:48),TestCheckOlderSchema(internal/migrate/check_test.go:53),TestCheckNewerSchema(internal/migrate/check_test.go:60),TestCheckStaleSchemaVersion(internal/migrate/check_test.go:70),TestCheckEditedMigration(internal/migrate/check_test.go:85),TestRenamedMigrationRefused(internal/migrate/check_test.go:94),TestServeRefusesAnUnmigratedDatabase(cmd/bronzeward/main_test.go:36). - R28:
TestSameKeyInFlight(internal/api/tx_test.go:214),TestSameKeyInFlightNoKeyLockControl(internal/api/tx_test.go:238). - R29:
TestLiveProviderStates(internal/monitor/live_test.go:129). - R32:
TestClassify(internal/classify/classify_test.go:60),TestPassPersistent(internal/monitor/monitor_test.go:258),TestPassMetadataIdentity(internal/monitor/evidence_test.go:64),TestLiveMetadataIdentity(internal/provider/identity_live_test.go:170),TestRecordOneAlertAcrossInstances(internal/monitor/evidence_test.go:136),TestWatchdogStalled(internal/monitor/watchdog_test.go:41),TestWatchdogSlowPass(internal/monitor/watchdog_test.go:84),TestWatchdogHungHolder(internal/monitor/watchdog_test.go:139),TestRunHungPasses(internal/monitor/watchdog_test.go:172),TestProgressAfterMonitorLock(internal/monitor/monitor_test.go:554),TestEncryptArtifactsRefuses(internal/compile/dependencies_test.go:326),TestReadPinned(internal/compile/dependencies_test.go:208),TestPublishRacingMonitorNamedByAlert(internal/api/publish_monitor_test.go:129),TestPublishFirstNamedByTwoNamedByAlert(internal/api/publish_monitor_test.go:185),TestPublishFirstNamedConcurrentlyRefused(internal/api/publish_monitor_test.go:262),TestPublishAfterMonitorWaitedRefused(internal/api/publish_monitor_test.go:280),TestPassDeletionScheduled(internal/monitor/monitor_test.go:283),TestLoggerOrderAndCursor(internal/monitor/logger_test.go:129),TestLoggerPausedWrite(internal/monitor/logger_test.go:194),TestLoggerBacklog(internal/monitor/logger_test.go:446),TestDependencyStaleOwnObservation(internal/api/dependencies_test.go:130),TestOverlappingMonitors(internal/monitor/evidence_test.go:252),TestOverlappingMonitorIdleSession(internal/monitor/evidence_test.go:282),TestPassRequestTimeout(internal/monitor/evidence_test.go:328),TestLoggerAfterRestore(internal/monitor/evidence_test.go:385); at cde5e38:TestClassify(internal/classify/classify_test.go:60), item 1's clock control (line 300),TestPersistentEveryInterval(internal/monitor/transition_test.go:120), item 4 with its no-last-alert control. - R33:
TestExecutorUseTimeCheckFailure(internal/api/executor_test.go:245). - R34:
TestRecoveryStartMonitorsAfterEntry(cmd/bronzeward/sweep_test.go:336),TestRecoveryStartDoesNotSweep(cmd/bronzeward/sweep_test.go:296),TestRecoveryStartSweepsAfterEntry(cmd/bronzeward/sweep_test.go:320). - R35:
TestCommitmentRevocationsWait/approval(internal/api/commit_test.go:715).TestExecutorRevocationHeld(internal/api/executor_test.go:677) exercises the executor through the Talos client againsttalostest.Serve, a stand-in node. Both run in CI and are replayed bys4ds; the replay does not establish an additional real-node interleaving (ER choice §10.32). - R37:
TestCommitmentRevocationsWait/identity(internal/api/commit_test.go:715),TestIdentityRevocationMachineEntries(internal/api/revocation_machines_test.go:48),TestIdentityRevocationHoldsInventory(internal/api/revocation_machines_test.go:103); at cde5e38:TestIdentityRevocationHoldsInventory(internal/api/revocation_machines_test.go:103), the T5c lock with itsFOR SHAREcontrol (line 106). - R39:
TestRecoveryExitRacesInventory(internal/api/recovery_exits_test.go:75). - R40:
TestConcurrentRotationsSerialize(internal/auth/race_test.go:182),TestConcurrentRotationsNoLockControl(internal/auth/race_test.go:202),TestRotationThenIdentityRevocation(internal/auth/race_test.go:244),TestIdentityRevocationThenRotation(internal/auth/race_test.go:264),TestRevocationRaceNoLockControl(internal/auth/race_test.go:291). - R41:
TestReissueAfterRestoreRefusedForDeniedIdentity(internal/auth/tokens_test.go:232). - R42: platform coverage additionally uses
TestInventoryPlatform,TestMachinePlatformandTestReleaseConstraints(§6.3); earlier named checks:TestIdentityKeyConcurrent(internal/api/inventory_test.go:261),TestSMBIOSUUIDIsOneMachine(internal/api/inventory_test.go:210),TestSMBIOSUUIDControl(internal/api/inventory_test.go:243),TestInventoryRefusals(internal/api/inventory_test.go:355). - R43:
TestMachineIdentityMismatch(internal/api/machine_ingest_test.go:239),TestMachineIngestionIdentityControls(internal/api/machine_ingest_test.go:216),TestMachineAccessUnavailable(internal/api/machine_ingest_test.go:314),TestMachineIngestion(internal/api/machine_ingest_test.go:180),TestMachineAccessEventFencedByTheClaim(internal/api/machine_ingest_test.go:400),TestMachineAccessErrorTextControl(internal/api/machine_ingest_test.go:378),TestLiveTalosAccess(internal/provider/live_test.go:447); skipped in CI:TestLiveRoleProbe(internal/talos/live_test.go:199). - R44:
TestExecutorCompletes(internal/api/executor_test.go:157),TestExecutorUseTimeCheckFailure(internal/api/executor_test.go:245),TestExecutorNodeSideAccessFailure(internal/api/executor_test.go:386),TestExecutorAccessErrorTextControl(internal/api/executor_test.go:431),TestExecutorSendsWithTheObservedAccess(internal/api/executor_test.go:1013),TestExecutorRetryFollowsAccessRotation(internal/api/executor_test.go:961),TestExecutorAttemptAfterAccessRotation(internal/api/executor_test.go:518). - R45:
TestObservationPurposeAccessFailure,TestMachineryCallsAllowlisted,TestExecutorRevokedControl,TestExecutorRevocationHeld,TestObserveNodeReadFailsandTestObserveErrorTextControlsupplement the earlier checks (§6.3):TestObservationRecordsTheAccessItRead(internal/api/observe_test.go:588),TestObserveAccessReadFails(internal/api/observe_test.go:304),TestObserveDrift(internal/api/observe_test.go:218). - R46:
TestParseEndpointRefuses(internal/talos/endpoint_test.go:23),TestTalosEndpointRefusals(internal/api/endpoint_test.go:78),TestInventoryTalosEndpoint(internal/api/inventory_test.go:128),TestTalosEndpointReplacement(internal/api/endpoint_test.go:37),TestTalosEndpointAtomic(internal/api/endpoint_test.go:121),TestTalosEndpointConcurrent(internal/api/endpoint_test.go:152),TestTalosEndpointInRecoveryMode(internal/api/endpoint_test.go:178),TestObservePlanRoute(internal/api/observe_test.go:484); at cde5e38:TestObservePlanRoute(internal/api/observe_test.go:484), with the dispatch-time-resolution control and a later plan bound to the new endpoint. - R47:
TestRevisionsInCommitOrder(internal/api/observe_test.go:628). - R48:
TestEventStreamEndsAtTokenExpiry(internal/api/operations_read_test.go:333). - R50:
TestReviewNeedsEncryptedStaging(internal/api/review_test.go:55),TestPause(internal/staging/pause_test.go:35),TestPausedOwnerTransitionsRefused(internal/staging/pause_test.go:105),TestReviewRouteAnswersPaused(internal/api/review_route_test.go:61),TestReviewRouteRoles(internal/api/review_route_test.go:117),TestReviewRouteFailuresLeaveClaim(internal/api/review_route_test.go:207),TestMarkRefusalNamesNoPath(internal/api/marks_test.go:288),TestMarkFirstGenerationFailureReturnsPaused(internal/api/marks_test.go:338),TestMarkPartWayFailureAbandons(internal/api/marks_test.go:364),TestMarkRace(internal/api/marks_test.go:445),TestTakeOverPausedRefused(internal/staging/pause_test.go:136),TestMarkInterruptedTakeoverPausesWithoutMarks(internal/api/marks_test.go:470),TestMarkStoppedAtEncryptionHolds(internal/api/marks_test.go:510),TestContinuationKilledBeforeT1TakeoverCommits(internal/api/continuations_test.go:307),TestContinuationDraftChecks(internal/api/continuations_test.go:164),TestAbandonPaused(internal/api/review_test.go:172),TestPausedDueAtExpiry(internal/staging/pause_test.go:159),TestRecoveryEntryAbandonsPausedClaim(internal/api/review_route_test.go:256),TestStartSweepKeepsPausedClaim(cmd/bronzeward/sweep_test.go:161); at cde5e38:TestSelection(internal/orphans/orphans_test.go:249) andTestWrite(internal/orphans/orphans_test.go:425), a paused claim's generations kept while live and reported past its expiry.
6.2 Runs per row¶
This table preserves the original run results and their then-open R5/R45 gaps. It does not attribute later checks to those historical revisions. The dated supplement in §6.3 supplies the current additional evidence.
Where each row's live part runs (§3), with the references its checks carry in <scenario>.tsv. A
row a pass mode leaves out shows there as a SKIP row naming what; the controls run, or the run
named, carries it. "CI" is §6.1. Counts given are the checks each reference held in the s1 step of
the s6 run, s6-20261018T191226Z (scenarios/s1 run, 453 checks), the full mode. The S1 review
rows take the path the claim's state allows, so their count can differ between runs.
| Row | Live runs: steps (check references) | CI or carried | Result |
|---|---|---|---|
| R1 | run: s1p (S1 step 1 to S1 step 5, S1 pass), s5p (S5 step 4); controls: s1 (S1 interruption, C §3.4, 99; S1 interruption, C §3.5, 99), s2 (S2 negative controls, C §15: the draft updates), s5 (S5 step 4, C §15: the drift adoption's matrix) |
CI: drift adoption | passed |
| R2 | controls: s2 (S2 negative controls, C §15: the publications) |
CI: the stop at each point | passed |
| R3 | controls and s6: s1 (S1 takeover, C §3.4, 25; S1 takeover, C §15 check, 9; S1 lease extension, C §3.3, 5; S1 interruption, 2; S1 Go tests, 1) |
CI | passed |
| R4 | run: s2p (S2 precondition, C §10.1); controls: s2 (S2 negative controls, S2 Go tests) |
— | passed |
| R5 | each scenario's refusals in run, and their negative controls in controls |
CI: the listed refusal tests and specified-codes check; full mapping pending #241 | partially evidenced; clause-level coverage pending #241 (§8) |
| R6 | s6: s4ds (S4 DS row 001 to S4 DS row 021, the table ds.tsv; the rows no request reaches, as the Go checks of ds-go.log) |
CI: the scan | passed |
| R7 | run: s4 (S4 step 1 to S4 step 5); s6: s4ds (DS rows 003 and 011) |
CI: every named lock test | passed |
| R8 | controls: s3r (S3 negative controls: expiry), s4c (S4 negative controls: the evidence older than the plan binds, no evidence, nothing refused; ER choice §10.28) |
CI: a contradicting newer observation (TestCommitmentRefusals and TestAttemptRefusals, "a newer observation shows another digest"), the bound |
passed |
| R9 | controls: s3r (S3 negative controls: cancellation before commitment), s4x (S4 negative controls: the plan cancelled once committed with no attempt) |
— | passed |
| R10 | controls: s3r (S3 negative controls: the superseded release refused at creation), s4x (S4 negative controls: comparison 2 refusing the commitment) |
CI: the race and the attempt | passed |
| R11 | — | CI: the contradicting digest; the health cases carried (§8) | contradicting digest met in CI; health cases carried (§8) |
| R12 | run: s1p (S1 step 1: two node IDs, one cluster ID; then the imports through the application's client), s4 (the commitment's evidence observation) |
CI: the refusals and their controls | passed |
| R13 | — | CI | met in CI |
| R14 | controls: s4c (S4 negative controls: the publication changing the worker's assignment, 409 scope-busy), s5 (S5 negative controls: the frozen-scope revert plan passed over) |
CI: comparison 6 under a freeze (TestCommitmentRefusals/frozen) and before release in recovery mode (TestCommitmentScopeGateControl) |
passed |
| R15 | s6: s6 (S6.1 018 to S6.1 021, S6.1 stale, S6.1 send, S6.1 cancel; the table s6-points.tsv) |
CI | passed |
| R16 | controls: s4x (S4 negative controls: the identity revoked before the commitment, comparison 1; and once committed with no attempt) |
CI: after an attempt | passed |
| R17 | — | CI | PoC observation predicates met in CI; bound-health ordering carried to #188 (§8) |
| R18 | run: s5p; controls: s5 (S5 negative controls: the revert on a frozen scope passed over, the unfreeze by a non-approver 403) |
CI: the commitment, adoption and revert refusals | passed |
| R19 | run and S7 variants: s7 (S7 before T, S7 at T, S7 after T, S7 step 1 to S7 step 11; step 4 is the closing run's); S7 closing: s7c |
— | passed |
| R20 | run, whole; s6 |
— | live run passed; R5/R45 coverage and the second reviewer remain open (§8) |
| R21 | controls and s6: s2 (S2 Go tests) |
— | passed |
| R22 | s6: s4ds (TestAttemptStaleOwner in ds-go.log) |
CI | passed |
| R23 | — | CI | met in CI |
| R24 | controls and s6: s1 (S1 interruption, orphans, 4) |
CI | passed |
| R25 | run: s0p, s2p (S2 pass); controls: s0 (S0 negative control: the schema controls and the restore) |
CI: startup | passed |
| R26 | run: s2p (S2 step 7), s3h, s3rp, s4, s5p (S5 step 3), s7; controls: s5roles (S5 step 7); s6: s6 (S6.1 cancel, step 7) |
— | passed |
| R27 | run: s7 (the recovery-start process in the new epoch); S7 closing: s7c (S7 step 4: C's takeover and import, 503 epoch-superseded; S7 negative controls: the second entry, plan and approval on an unaccounted scope, the blocked release, the exit with a scope unreleased, and three SKIP rows naming the Go controls) |
CI: the dropped-comparison controls TestFenceEpochTermRow027 (internal/staging/epoch_test.go:138), TestProcessEpochControl (internal/api/epoch_test.go:88), TestCommitmentScopeGateControl (internal/api/epoch_test.go:201) |
passed |
| R28 | — | CI | met in CI |
| R29 | controls and s6: s2 (S2 negative controls (DM §10.1 items 2 and 3): TestLiveProviderStates in go-bao-rows.log) |
CI | passed |
| R30 | run: s2p (S2 step 6); controls: s2 (S2 negative controls (step 6)) |
— | passed |
| R31 | S7 variants: s7t (S7 Transit key), s7o (S7 older OpenBao) |
— | passed |
| R32 | — | CI | met in CI |
| R33 | — | CI | met in CI |
| R34 | — | CI | met in CI |
| R35 | s6: s4ds (DS row 003 in ds.tsv; TestCommitmentRevocationsWait/approval and TestExecutorRevocationHeld in ds-go.log) |
CI: the same approval and executor tests, using a stand-in node | passed; Go interleaving checks (ER choice §10.32) |
| R36 | controls: s4x (S4 negative controls: h-approver's next approval 403 without the approver group, the earlier approval committed and its attempt admitted), contrasted with s3r (S3 negative controls: the approval revocation) |
— | passed |
| R37 | — | CI | met in CI |
| R38 | controls and s6: s2 (S2 Go tests: TestPublishRunLapsed) |
CI | passed |
| R39 | — | CI | met in CI |
| R40 | — | CI | met in CI |
| R41 | — | CI | met in CI |
| R42 | — | CI | met in CI |
| R43 | controls and s6: s1 (S1 access, 14; S1 access, PA §16, 1; S1 access, PA §16 check, 6; S1 inventory, PA §16 check, 5; S1 Go tests: TestLiveRoleProbe against the fixture's nodes); S1 node ID: s1nid (the refusal for another node ID) |
CI | passed |
| R44 | run: s4; s6: s4ds (the scans of its refused and interrupted dispatches) |
CI | passed |
| R45 | run: s4, s5p, s7 |
CI | partially evidenced; observation-access coverage pending #241 (§8) |
| R46 | — | CI | met in CI |
| R47 | — | CI | met in CI |
| R48 | run: s8 (S8 step 3); S8 controls: s8controls (S8 negative controls), s8revocation (S8 revocation alone) |
CI | passed |
| R49 | run: s1p (S1 backups, PA §16; S1 step 5), s2p (S2 backups, C §15) |
— | passed |
| R50 | controls and s6: s1 (S1 review, PA §16, 47; S1 review kill, PA §16, 90) |
CI | passed |
6.3 Refusal and observation supplement (19 October 2026)¶
#241's
clause-level report maps all C §13 refusals,
PA §13 examples and PA §14 refusals, and every observation-access clause of
R45. Its sanitized results bind the fresh
checks to c9398d45c1b690e8e11ce541dbb76af0ec690308: the normal database/provider
suite passed (21 tested packages); the focused run passed 17 tests, with 63
PASS lines and six explicit environment skips. Both removed-authoring-scope
controls failed as intended. Log screens and their positive control passed;
the report states their exact limits. No new live Talos result is claimed.
The audit found a publication-stage defect: an inconsistent stored source could
reach a provider read across clusters. Supported authoring already filtered that
reference. #244 repaired the
missing publication check and landed as bc59346428ea267addfca37881c14eb4ecfda108
(repair evidence); the retained failing
probe is not evidence of remote exploit reachability.
R42's platform/mode assertions were also traced and rerun. R11 and R17 retain
future bound-health validation in #188. The original scenarios, revisions,
failed attempts, skips and fixture limits above remain unchanged. This
supplement supplies additional R5/R45 evidence; it does not supply the independent
S8 review, any of the six delegated criterion verdicts (§7), or the dated
assessment (§9).
Local review then reproduced a second publication defect: a node-minor mismatch
did not refuse publication at the reviewed revision.
#247 now has separately
recorded repair evidence in the publication report:
the database/provider gate at e04d627, four guard-removal controls and full
S2 at aede267, and the repaired integrated chain at 44e8cf8. The
clause-level report links each exact revision and preserves the failed chains.
Its #247 report reference at 032ecd4 also retains the S2 assertion controls at
6fe0af3 (old assertion: 13 PASS / 15 FAIL, expected exit 1; corrected assertion:
28 PASS, exit 0; zero SQL errors) and the committed-reply-loss checks at
7d06094 (seven top-level tests, nine PASS records, zero FAIL/SKIP, exit 0).
The former use nullable temporary tables, not evidence of reachable production
corruption. The latter retain already-committed success and original evidence
without reclaim or reread; the rolled-back 08006 control remains a separate
unfinished-operation case. Neither replaces any live run. PR248 landed at
b3a479c0c0a4170d95d33e71b0ce799cd51a5eb7 on 2026-10-19
at 19:14:04 UTC, with an equal verified tree and passing branch/queue CI;
247 was assessed and closed. R2's current summary names all seven publication interruption points¶
and retained observation entries; §6.2's original runs remain unchanged.
Provider-wide outages now refuse at the required publication access read;
TestReadPinnedRefuses separately retains compiler dependency-read coverage.
Failed publication observation starts/results can persist without a release.
The original 25-case run covers five purposes. At 1cc6ddc4960615e42db646e21e8428960d95606f,
the fresh combined-tree run passed 22 focused top-level tests (100 PASS records,
no FAIL/SKIP), including all 30 named failures across six purposes and 12
latest/stale loop assertions. The full verbose database/provider suite passed
21 tested packages (two without tests), with 6 explicit environment skips
retained in the sanitized results.
Both complete logs passed the four-canary/private-key-header screen with its
five-pattern positive control. Exact commands, versions, timing and hashes are
retained there; no new live Talos or human S8 review is claimed. PR249 landed as
c9b70ffbf4d3b13b775ee949d67bca1f03183294 on 19 October at 19:57:05 UTC;
#241 was assessed and closed.
The review also identified missing synchronous T1 database-failure
response coverage. The added check and its successful-commit control pass at
02d012c222d51714a9ce08b7087f8c9d1fab35fb; changing the failure's HTTP 503 to
500 makes the check fail as intended. The supplement retains both outcomes.
7. Acceptance criteria of ginsys/bronzeward#31¶
The current verdicts below come from the 20 October delegated assessment and its independent agent timeline reading. The owner's negative usability feedback and the assessment's limits still apply. The original pending verdicts remain in the historical revision; no run or human-review skip is relabelled.
| Criterion | Answered by | Verdict |
|---|---|---|
| Adoption without mutation, extraction before persistence, immutable encrypted artifacts with redacted provenance | §5 items 1 to 3 | Technical evidence met by the complete campaign and guided adoption |
| Publication alone cannot dispatch; plan and approval bind the exact safe no-reboot worker change | §5 items 3 and 4 | Met; proposal/publication performed no apply, and immutable plan bindings were re-read before approval |
| Direct apply and verify, separate desired/applied/observed, a usable approval-to-outcome timeline | §5 item 5 and the timeline row | Met for the PoC: execution, traceability and independent factual interpretation; no general usability pass |
| Drift report, freeze, sanitized adoption, approved revert | §5 item 6 | Met on the selected fixture, preserving earlier refusal coverage |
| Interrupted-operation and restoration recovery; unresolved old execution blocks conflicting mutations | §5 item 7 (both rows) | Met within the documented decision-based recovery limits |
| Reproducible integrated evidence and owner assessment, with limitations and no production claim | §3, §4, §9 and §10 | Met once this assessment lands, supported by the retained campaign, delegated assessment and independent reading |
8. Gaps and carried items¶
- R11's health-window cases and R17's bound-health observation-ordering cases are carried to ginsys/bronzeward#188. The PoC binds no health check (ER choice §10.33).
- Found while mapping §6 to the tests in CI, and closed by ginsys/bronzeward#233 (merged as cde5e38, tests in §6.1):
- R24: the orphan report read
import_base_referenceonly, so a generation that only afragment_referencerow named was reported. A code defect, fixed: both kinds are read, with the one-kind-only control. - R13, R17, R32, R37, R46: the missing test or control added.
- R50: paused claims in the orphan report added. A mark's run killed at each point it re-enters has no Go test: AP S1 assigns it to the live run's review rows (AP S1), so R50 rests on them.
- Open after the original runs; later disposition is in the dated assessment (§9):
- The timeline's second reviewer (§5): AP S8's pass criterion needs a second reviewer to reach
the same answers from the timeline;
run'ss8writesSKIPfor it and for the reads after the operator walkthrough of ginsys/bronzeward#30, by a person. That added characterization is distinguished from AP S8's actual reviewer criterion in the 20 October assessment. - R5 and R45 additional evidence: the clause audit, missing checks and controls
are recorded in §6.3 and the linked #241 supplement. The publication defect
found by that audit was separately repaired and landed under #244. A second
publication-minor defect has separate repair evidence under #247, mapped in
§6.3 with its verified PR248 landing. The synchronous T1 failure check and
control passed, with the wrong-status control failing. The fresh six-purpose
matrix and full database/provider suite passed at
1cc6ddc; #241's publication, review and closeout assessment are complete (§6.3). These later results do not retroactively change any original run's coverage. - Pointer
SKIProws, each naming the check that carries what it leaves out: S7's three dropped-comparison controls (§6.1, R27), S4's frozen-scope, index-drop and revocation-wait rows (s4ds,s5, §6.1), and S0 step 3's earlier-epoch automation token (S7 step 6, §5).
9. Owner assessment¶
On 20 October 2026 the owner delegated straightforward factual assessment to the executing agent. Its dated assessment records the criterion verdicts, exact timeline evidence and limitations. The owner separately assessed the API-and-script operator experience negatively. This is not a claim that the owner performed the walkthrough or independently interpreted the four timelines. The independent agent reading and delegated S8 disposition are recorded there; issue closure still requires this evidence to land.
10. Limits¶
- The fixture's limits (AP §9) bind every result. A scenario shows the build it ran against, on the paths it drove.
- Excluded by design §18.2, and not exercised: new-machine enrolment, reset and reuse, cluster bootstrap, upgrades, remote transports and managed-cluster etcd recovery (AP §8).
- No result here is a production-readiness claim.
11. Publication node evidence supplement (2026-10-19)¶
ginsys/bronzeward#247 adds fresh read-only executor observations before
publication, including first adoption, and retains each machine's evidence
link. The repair report records the
full database/provider gate at e04d627, the matching and refusal stand-ins,
four guard-removal controls at aede267, full S2 with 373 passing checks at
that same revision before its chain stopped at S3, and the fresh live chain
at 44e8cf8:
up s1p s3h s2p s3r s4c s4x s4 s5p s7 s7n s7t s7o down.
Every step passed; all 48 bundles passed the revision, empty-diff,
capture and positive-control-only scan audit; teardown completed. Pass-mode
skips and all three failed attempts remain explicit in the
sanitized evidence.
The live profile is Talos 1.13.6. Different/missing/malformed version reports are stand-in evidence, not a second live profile or an upgrade. Provider-wide outages now refuse at the required publication node-access read before compiler pinned-value reads; the separate compiler refusal tests retain that coverage.
This supplies the publication-minor repair evidence for R5. The clause-level R5 mapping and all-purpose R45 access checks remain with ginsys/bronzeward#241, including the new publication purpose. The older rows above retain their original revisions and limitations. This supplement alone supplies no independent S8 review or acceptance assessment; the later reading and six delegated verdicts are recorded separately in §7 and §9.