carlos / platform Public

harness: Run 11b (G10 on 27303f54, v0.28.17): TTL to 20:00Z; restore, task 9 PASS, plain roll PASS, task 9 again PASS, router cache present before 8.1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev fc2d387584f32a3c47aae87a66efab63103f5d32 parent 5969215
11 files changed, +780 −0
  • harness/RESOURCES.md +1 −0
  • harness/RUNLOG.md +75 −0
  • harness/evidence/run11/r16-roll.log +216 −0
  • harness/evidence/run11/roll2.log +145 −0
  • harness/evidence/run11b/roll.log +216 −0
  • harness/scenarios/cohort1/blocks/b4-pair2.sh +25 −0
  • harness/scenarios/cohort1/blocks/g10-r16.host.sh +10 −0
  • harness/scenarios/cohort1/blocks/g10-reroll.host.sh +5 −0
  • harness/scenarios/cohort1/blocks/g10-wait-cache.host.sh +16 −0
  • harness/scenarios/cohort1/blocks/g10-watch.host.sh +51 −0
  • harness/scenarios/cohort1/blocks/g10b-b4.host.sh +20 −0

CI cancelled — superseded by a newer push — run details

CI log
=== gate ===
cd launchctx && go vet ./... && go test ./... -count=1
ok  	amadan.net/carlos/platform.git/launchctx	0.012s
?   	amadan.net/carlos/platform.git/launchctx/controlname	[no test files]
?   	amadan.net/carlos/platform.git/launchctx/wireid	[no test files]
go vet ./...
gofmt -l .: clean
go test ./... -count=1 -timeout 30m

amadan: job cancelled — a newer push superseded it
diff --git a/harness/RESOURCES.md b/harness/RESOURCES.md
index b74046e43..3d9c1758d 100644
--- a/harness/RESOURCES.md
+++ b/harness/RESOURCES.md
@@ -18,3 +18,4 @@ Appended as each is created. Teardown commands: harness/TEARDOWN.md.
| 2026-10-20T09:5xZ | TTL extended | i-06a1ec144aa5226fb, sg-0b9cf4c2a508b7cec, vol-035c92e5b506cc3db, bucket carlos-harness-640012953448, role and instance profile carlos-harness | ttl and expires tags 2026-10-20T12:40Z -> 2026-10-20T18:40Z; on the host `shutdown -c; shutdown -h 18:40` (shutdown --show: 18:40:00 UTC); coordinator's request |
| 2026-10-20T16:02Z | TTL extended | i-06a1ec144aa5226fb, sg-0b9cf4c2a508b7cec, vol-035c92e5b506cc3db, bucket carlos-harness-640012953448, role and instance profile carlos-harness | ttl and expires tags 2026-10-20T18:40Z -> 2026-10-20T23:40Z; on the host `shutdown -c; shutdown -h 23:40` (shutdown --show: 23:40:00 UTC); Run 9 (v0.28.5 roll) and the offline-move rehearsal |
| 2026-10-20T20:54Z | TTL extended | i-06a1ec144aa5226fb, sg-0b9cf4c2a508b7cec, vol-035c92e5b506cc3db, bucket carlos-harness-640012953448, role and instance profile carlos-harness | ttl and expires tags 2026-10-20T23:40Z -> 2026-10-21T12:00Z; on the host `shutdown -c; shutdown -h +<minutes to 12:00Z>` (shutdown --show: Wed 2026-10-21 11:59:33 UTC); Run 10 (v0.28.6 candidate rehearsal, overnight) |
+| 2026-10-21T08:01Z | TTL extended | i-06a1ec144aa5226fb, sg-0b9cf4c2a508b7cec, vol-035c92e5b506cc3db, bucket carlos-harness-640012953448, role and instance profile carlos-harness | ttl and expires tags 2026-10-21T12:00Z -> 2026-10-21T20:00Z; on the host `shutdown -c; shutdown -h 20:00` (shutdown --show: Wed 2026-10-21 20:00:00 UTC); Run 11b (G10 on 27303f54); `df -h /` 8.4G free (86%) |
diff --git a/harness/RUNLOG.md b/harness/RUNLOG.md
index b48bdb595..e7dfb17b1 100644
--- a/harness/RUNLOG.md
+++ b/harness/RUNLOG.md
@@ -2464,3 +2464,78 @@ only `requested.json`.
**Resume, no hand fix:** restore `post-b5-run8b`, roll v0.28.15 again by the same plain update (identity and canary
console are recreated in that lineage), wait for leo's own agent to drop the cache (its hourly observe), check
`/data/system/router` = `requested.json` only, then a new WINDOW_ID.
+
+### The resume, and the switch to the owner's fix 27303f54
+
+- The resume on 64a98473 was started (`blocks/g10-reroll.host.sh`, `evidence/run11/roll2.log`): restore
+ `post-b5-run8b`, the same plain roll again, PASS a second time (session for identity `7792ad3b...`; promote 23:30:23Z,
+ rev 15 -> 16, activation `8732823b...`; dennis 23:32:44-23:33:02Z, leo 23:33:10-23:33:29Z, both `v0.28.15 current`,
+ rev 17 `[]`). The hour wait (`blocks/g10-wait-cache.host.sh`) was never run.
+- **Coordinator, 23:4xZ:** platform-1c fixed the stop in code, **27303f54** = 64a98473 + `claimBoxDataCensus` classifying
+ `<data>/system/router` as a census tree (`internal/host/claimcensus.go:92-99`, census ruled). Switch to it: restore,
+ build, plain roll, task 9, the window with NO hour wait; before 8.1, `ls /data/system/router` on leo (informational:
+ `requested.json` plus at most one version cache).
+- Build: `$TMPDIR/g10src2` @ 27303f54 + the same harness patch (`b2f1ad8f...`), stamp **v0.28.16** (first free, newer
+ than v0.28.15), CV `27303f54`: carlos `762c3e2b5ef594ed248b36bb42c934cd98f60e22e5a08fdd80228fd30789034d`, console
+ `2e37a4a0b1e32c489548f895ffc746350ccb2f6f1e898b50214ed3a6d482db4b`, `artefacts/v0.28.16-27303f54/`. Tests ok: the four
+ default packages, the two `-tags harness` packages, and the fix's `TestMigrationCensusKeepsRouterCache` (PASS).
+ `TestPlan14RootReadCensus` fails on this tree with 7 discrepancies, every one from the harness patch's files
+ (`s3compat/harness.go`, `hostfence/writer.go`, `publicrelease`): expected for the harness deviation, not the fix.
+
+# Run 11b: G10 on 27303f54 (2026-10-21 morning)
+
+Brief (coordinator, for the claim owner platform-1c): resume G10 on the owner's FINAL tip, `claim-empty-cohort-done`
+@ **27303f54** (= 64a98473 + the census class for `<data>/system/router`; census ruled; Astra approved; CI green).
+The branch tip has since moved to b20882e7, which changes only docs and a Plan 14 test fixture
+(`census-proposal-claim-step8-readiness.md`, `plan14_root_reads_test.go`, its `.tsv`), so 27303f54's runtime code is
+the branch's. Runbook `claim-dev-cohort1-runbook` @ **337fedcf** (adds the informational `ls -la /data/system/router`
+before 8.1). Order: restore `post-b5-run8b`, task 9, the plain roll, `ls`, a NEW window (8.1 to 8.2b, 8.4, step 9),
+B4 and G10 with no hour wait, acceptance, a second create, then wake the first. Harness only.
+
+The previous session (Run 11's resume, above) had already built 27303f54 as v0.28.16 and run restore, task 9, the roll
+and the `ls` (`evidence/run11/r16-roll.log`, PASS at 23:52Z: leo and dennis `v0.28.16 current`, rev 17 `[]`,
+`/data/system/router` = `requested.json` + `v0.28.16/`), then stopped before 8.1. This run starts again from the
+restore, on a fresh build, as briefed.
+
+## Setup (08:01-08:04Z)
+
+- TTL: every harness resource's `ttl`/`expires` 2026-10-21T12:00Z -> **20:00Z**; host `shutdown -h 20:00`
+ (RESOURCES.md). `df -h /`: 48G of 59G used, 8.4G free.
+- Build: `git worktree add --detach $TMPDIR/g10b 27303f54` + the harness patch (`git diff 6b905c11^ 6b905c11 --
+ internal`, sha256 `b2f1ad8f...`, the same seven files), `-tags harness`, `GOFLAGS=-buildvcs=false`, `CGO_ENABLED=0`,
+ linux/arm64, `-s -w -X .../internal/version.Build=v0.28.17`, for `.` and `./cmd/console`. Tests ok: `./internal/s3compat
+ ./internal/publicrelease ./internal/rootaws ./internal/hostfloor`; `-tags harness ./internal/s3compat
+ ./internal/publicrelease`; `-run TestMigrationCensusKeepsRouterCache ./internal/host` (ok).
+
+| stamp | plays | carlos sha256 | console sha256 | bucket prefix |
+|---|---|---|---|---|
+| **v0.28.17** | the fix release (27303f54) | `a79ed7263e3e92d3b7d25d856a46616dc39d2581bc5cdfedda510e5e43c0cdaa` | `ac3d2a5263f4e63842937648d988e659c8f075943124a40b6923fb33347e9713` | `artefacts/v0.28.17-27303f54/` |
+
+ Why v0.28.17: v0.28.16 is the previous session's build of the same commit (used once, from the same restore); the
+ next stamp used nowhere is v0.28.17. CV `27303f54`.
+- Note: outside the DOCS-T1 sandbox `$TMPDIR` is a different directory (`~/.cache/tmp`, not
+ `~/.cache/tmp/claude-1001`), so a sandbox-off `cd $TMPDIR/...` fails into the session cwd. A first build went that
+ way (from the wrong tree); its binaries were deleted unused. The build above used absolute paths. The default
+ `GOCACHE` is read-only inside the sandbox: builds and tests ran with the sandbox off.
+
+## Steps 1 to 4: restore, task 9, the plain roll, task 9 again, `ls`: PASS (08:04-08:15Z)
+
+`blocks/g10-r16.host.sh v0.28.17 v0.28.17-27303f54 a79ed726... ac3d2a52... 27303f54` (`evidence/run11b/roll.log`).
+- Restore `post-b5-run8b` 08:04:25Z (leo = the ext4 leo, as in Run 11); every container `failed=[]`.
+- **Task 9 pre-roll check: PASS** (08:04:49Z): every leo line `0`, `leo: all empty` (no `/var/lib/carlos-claims`, no
+ restarts dir, leo `carlos v0.28.12`); bucket `host-claim-files 0`, `evidence-objects-for-leo 0`,
+ `serving-evidence-objects-for-leo 0`, `roster-holds 0`, `roster-activations 0`, `bucket and roster: all empty`
+ (roster rev 15, no backfill plan).
+- **The roll: PASS, plain `system update`, no box step.** C2 first: sums signed and verified, operator CLI
+ `carlos v0.28.17`, console `27303f54` shipped and promoted to `canary/console` (08:05:0xZ). Signing session
+ 08:05:05Z, `publish-identity` v0.28.17 CV `27303f54`: one create-only write of
+ `control/system/router/releases/v0.28.17.json` (`before_etag ""`, `305d705c...`; router `a79ed726...`, console
+ `ac3d2a52...`); REV 15. Promote stable 08:05:51Z, rc 0, rev 15 -> 16 (activation `3485fc89...`). dennis
+ 08:07:51-08:08:1xZ, leo 08:09:02-08:09:22Z root apply. After: leo and dennis `carlos v0.28.17` / `.prev v0.28.12`,
+ path active, edge exe `a79ed726...` NRestarts 0; leo identities `v0.28.5 .7 .8 .12 .17`; `system status` leo and dennis
+ `v0.28.17 current`, sophie `canary v0.28.5 current`; roster rev **17** `activations []` `holds []` (08:10:12Z);
+ leo's report 08:15:27Z: v0.28.17, `a79ed726`, `activation_complete true`. Sophie's console untouched: pid 398 exe
+ `b2b431f3...` (the v0.28.4 stand-in, D10).
+- **Task 9 again after the roll: PASS** (08:15:38Z), every line `0` on leo and in the bucket, rev 17.
+- **`ls -la /data/system/router` on leo** (08:15:50Z, informational): `requested.json` (133 B, 08:09:02Z) and the
+ version cache `v0.28.17/` (08:09:02Z). Exactly the shape the runbook expects; Run 11's G7 refused this tree.
diff --git a/harness/evidence/run11/r16-roll.log b/harness/evidence/run11/r16-roll.log
new file mode 100644
index 000000000..08e879ea3
--- /dev/null
+++ b/harness/evidence/run11/r16-roll.log
@@ -0,0 +1,216 @@
+== restore post-b5-run8b 23:42:12
+sophie-console volume restored to post-b5-run8b
+leo: running failed=[] snapshots=post-b5-run8b,post-8.1-run8,g10-stuck-run8,post-window,g7-fail-r11
+sophie: running failed=[] snapshots=base,boot,pre62,s7,pre-window,pre-window-seeded,post-b5,post-b5-465c3a08,post-b5-465c3a08-c8,post-b5-clean,post-b5-run8,post-b5-run8b,post-8.1-run8,g10-stuck-run8,item6-plain-update-fail,post-window,pre-0285,post-0285,post-candidate,post-move-r10,g7-fail-r11
+sophie-console volume snapshots: s7,pre-window,pre-window-seeded,post-b5,post-b5-465c3a08,post-b5-465c3a08-c8,post-b5-clean,post-b5-run8,post-b5-run8b,post-8.1-run8,g10-stuck-run8,item6-plain-update-fail,post-window,pre-0285,post-0285,post-candidate,post-move-r10,g7-fail-r11
+######## task 9 pre-roll check 23:42:34
+== block 1 on leo 23:42:34.919Z
+launches 0
+stop_inventory 0
+journal_inventory_versions 0
+journal_requests 0
+authority/fences 0
+authority/serving-parks 0
+retire/serving 0
+retire/cold 0
+retire/retired 0
+retire 0
+unit-bindings 0
+unit-materializations 0
+restarts 0
+migration-items 0
+leo: all empty
+(context: ls: cannot access '/var/lib/carlos-claims': No such file or directory; ls: cannot access '/var/lib/carlos-release/private/restarts': No such file or directory; carlos carlos v0.28.12)
+[block 1 exit=0]
+== block 2 bucket 23:42:35.035Z
+host-claim-files 0 # information only; the lines below decide
+evidence-objects-for-leo 0
+serving-evidence-objects-for-leo 0
+staged
+
+staged
+
+roster-holds 0
+roster-activations 0
+bucket and roster: all empty
+(context: roster rev 15; control/hosts-backfill.json absent)
+[block 2 exit=0]
+######## roll 23:42:46
+== signing session (C2 order) 23:42:46.582Z
+== release-window v0.28.16 (23:42:46.585Z)
+== release v0.28.16
+762c3e2b5ef594ed248b36bb42c934cd98f60e22e5a08fdd80228fd30789034d carlos-linux-arm64
+c6f37682aa4d0ea56344031eeb3975e3b13420e262972872a0643b01594d6b6f carlos_0.28.16_amd64.deb
+2bec2182519eae25e3a347a9c11f8ce7344edf5bc2e5ec039c0cfe1f9895e642 carlos_0.28.16_arm64.deb
+22b09ca35fc72b6726a354109a4e6885d5fb48f84d3a51effc5655e4c615bc3d SHA256SUMS.txt
+5de09440c7867867e8cff62cf65c67a4d8b8235e13f1ac4bf497c8309e4ce4b4 SHA256SUMS.txt.sig
+2e37a4a0b1e32c489548f895ffc746350ccb2f6f1e898b50214ed3a6d482db4b console-linux-arm64
+verify sums: Signature Verified Successfully
+operator CLI: carlos v0.28.16
+harness info: harness build: yes endpoint: http://203.0.113.10:9000 sums key: mAnSlX23... sha256:85f6f13cb78c
+== 1a/1e
+CHANNEL VERSION PROMOTED TAG DIGESTS
+canary/console e2c006d2 2026-10-20T12:16:52Z yes
+pointer digests: on for bab since 2026-10-20T01:12:47Z
+every channel's pointer carries digests: CARLOS_REQUIRE_POINTER_DIGEST can be turned on
+== 2
+2e37a4a0b1e32c489548f895ffc746350ccb2f6f1e898b50214ed3a6d482db4b /home/operator/release-v0.28.16/console-linux-arm64
+0
+== 4
+shipped console 27303f54 (1 artifacts)
+promoted console 27303f54 -> canary/console
+CHANNEL VERSION PROMOTED TAG DIGESTS
+canary/console 27303f54 2026-10-20T23:42:50Z yes
+== session open (23:42:50.595Z)
+run-id cohort1-20261020T234250Z
+2026-10-20 23:42:51 267 SHA256SUMS.txt
+2026-10-20 23:42:52 89 SHA256SUMS.txt.sig
+2026-10-20 23:42:53 49873058 carlos-linux-arm64
+2026-10-20 23:42:57 203 console.json
+2026-10-20 23:42:54 37 floor.json
+2026-10-20 23:42:55 244 leo.json
+2026-10-20 23:42:55 191 regions.json
+2026-10-20 23:42:51 45 release.pub
+2026-10-20 23:42:58 1795 signer-helpers.sh
+2026-10-20 23:42:56 240 sophie.json
+Success /usr/local/bin/carlos: OK
+carlos v0.28.16
+jq-1.7
+/usr/bin/jq
+SHA256SUMS.txt: OK
+SHA256SUMS.txt.sig: OK
+helpers.sh: OK
+release.pub: OK
+swap devices: 0
+/run: tmpfs
+session-start 2026-10-20T23:43:09Z
+root 600 1 45
+ 2026/10/20 23:43:01 ALERT: root AWS file, profile, endpoint and trust-store environment overrides ignored
+
+== publish-identity v0.28.16, console 27303f54 (23:43:12.793Z)
+Success "writes": [
+ "key": "control/system/router/releases/v0.28.16.json",
+ "before_etag": "",
+ "key": "bootstrap/console/v0.28.16/carlos-linux-arm64",
+ "key": "bootstrap/router/v0.28.16/carlos-linux-arm64",
+ "key": "bootstrap/console/v0.28.16/carlos-linux-arm64",
+ "key": "bootstrap/router/v0.28.16/carlos-linux-arm64",
+publish-identity writes: [{"key":"control/system/router/releases/v0.28.16.json","before_etag":"","sha256":"67d98dbeed2785c3fa2ec8d91097bb114c36fe9dcdb8f24e208a8be584c9c482","payload":{"schema":1,"component":"router","channel":"stable","current":{"console_artifacts":{"linux-arm64":{"key":"bootstrap/console/v0.28.16/carlos-linux-arm64","sha256":"2e37a4a0b1e32c489548f895ffc746350ccb2f6f1e898b50214ed3a6d482db4b"}},"release_tag":"v0.28.16","moves_protocol":1,"version":"v0.28.16","artifacts":{"linux-arm64":{"key":"bootstrap/router/v0.28.16/carlos-linux-arm64","sha256":"762c3e2b5ef594ed248b36bb42c934cd98f60e22e5a08fdd80228fd30789034d"}},"source":"release:v0.28.16","released_at":"0001-01-01T00:00:00Z"},"spread":"0s","promoted_at":"2026-10-20T23:43:14Z"}}]
+{
+ "identity_key": "control/system/router/releases/v0.28.16.json",
+ "release": {
+ "console_artifacts": {
+ "linux-arm64": {
+ "key": "bootstrap/console/v0.28.16/carlos-linux-arm64",
+ "sha256": "2e37a4a0b1e32c489548f895ffc746350ccb2f6f1e898b50214ed3a6d482db4b"
+ }
+ },
+ "release_tag": "v0.28.16",
+ "moves_protocol": 1,
+ "version": "v0.28.16",
+ "artifacts": {
+ "linux-arm64": {
+ "key": "bootstrap/router/v0.28.16/carlos-linux-arm64",
+ "sha256": "762c3e2b5ef594ed248b36bb42c934cd98f60e22e5a08fdd80228fd30789034d"
+ }
+ },
+ "source": "release:v0.28.16",
+ "released_at": "0001-01-01T00:00:00Z"
+ }
+}
+67d98dbeed2785c3
+REV=15
+
+identity file = published object
+identity router 762c3e2b5ef594ed248b36bb42c934cd98f60e22e5a08fdd80228fd30789034d console 2e37a4a0b1e32c489548f895ffc746350ccb2f6f1e898b50214ed3a6d482db4b
+== done (23:43:21.036Z)
+REV after identity: {"rev":15,"activations":[],"holds":[]}
+box reports fresh at 23:43:35
+roster before: {"rev":15,"activations":[],"holds":[]}
+canary v0.28.5 promoted 2026-10-20T01:22:57Z spread 5m0s file
+stable v0.28.12 promoted 2026-10-20T12:22:46Z spread 5m0s file
+
+ada-letterpress linux-arm64 canary v0.28.5 current
+kathleen-juggling linux-arm64 stable v0.28.12 current
+noor-marquetry linux-arm64 stable v0.28.12 current
+-- leo before
+ carlos carlos v0.28.12 / prev carlos v0.28.8; path active
+ identities: v0.28.12.json v0.28.5.json v0.28.7.json v0.28.8.json
+ edge pid 231 exe sha 28923e4117924b4b NRestarts=0 ExecMainStartTimestamp=Tue 2026-10-20 23:42:31 UTC ActiveState=active
+-- dennis before
+ carlos carlos v0.28.12 / prev carlos v0.28.8; path active
+
+ edge pid 218 exe sha 28923e4117924b4b NRestarts=0 ExecMainStartTimestamp=Tue 2026-10-20 23:42:31 UTC ActiveState=active
+== promote stable v0.28.16 (23:43:36.342Z), plain system update, no step on any box
+promote v0.28.16 to router/stable — 2 box(es) will roll over 5m:
+ kathleen-juggling (linux-arm64, running v0.28.12)
+ noor-marquetry (linux-arm64, running v0.28.12)
+warning: v0.28.16 has not been on canary; promoting straight to stable
+ using uploaded v0.28.16 for linux-arm64
+ mirrored bootstrap/router/v0.28.16/carlos-linux-arm64
+ pointed router/stable at v0.28.16 (spread 5m0s)
+ serial bumped: boxes on stable start their spread
+promoted boxes on stable roll themselves; watch with: carlos system status --channel stable
+rc=0 roster: {"rev":16,"activations":["8435ca876b3aa877661e893107c8d4f1"],"holds":[]}
+== status 23:47:26.445Z
+canary v0.28.5 promoted 2026-10-20T01:22:57Z spread 5m0s file
+stable v0.28.16 promoted 2026-10-20T23:43:36Z spread 5m0s file
+
+ada-letterpress linux-arm64 canary v0.28.5 current
+kathleen-juggling linux-arm64 stable v0.28.16 current
+noor-marquetry linux-arm64 stable v0.28.16 current
+-- leo after
+ carlos carlos v0.28.16 / prev carlos v0.28.12; path active
+ identities: v0.28.12.json v0.28.16.json v0.28.5.json v0.28.7.json v0.28.8.json
+ edge pid 568 exe sha 762c3e2b5ef594ed NRestarts=0 ExecMainStartTimestamp=Tue 2026-10-20 23:46:12 UTC ActiveState=active
+ journal: 2026-10-20T23:46:09.904388+00:00 leo systemd[1]: Starting carlos-system-update.service - carlos platform self-update (root apply)...
+ journal: 2026-10-20T23:46:29.457564+00:00 leo systemd[1]: Finished carlos-system-update.service - carlos platform self-update (root apply).
+-- dennis after
+ carlos carlos v0.28.16 / prev carlos v0.28.12; path active
+
+ edge pid 504 exe sha 762c3e2b5ef594ed NRestarts=0 ExecMainStartTimestamp=Tue 2026-10-20 23:44:34 UTC ActiveState=active
+ journal: 2026-10-20T23:44:31.479989+00:00 dennis systemd[1]: Starting carlos-system-update.service - carlos platform self-update (root apply)...
+ journal: 2026-10-20T23:44:51.140168+00:00 dennis systemd[1]: Finished carlos-system-update.service - carlos platform self-update (root apply).
+23:47:57 roster {"rev":17,"activations":[],"holds":[]}
+roster end: {"rev":17,"activations":[],"holds":[]}
+{"generated_at":"2026-10-20T23:52:15.835439414Z","release":"v0.28.16","binary":"762c3e2b5ef594ed","activation_complete":true,"host_claim_enabled":null}
+sophie console pid 349 exe sha b2b431f3b2fb4600; router carlos v0.28.5
+######## task 9 again after the roll 23:52:18
+== block 1 on leo 23:52:18.218Z
+launches 0
+stop_inventory 0
+journal_inventory_versions 0
+journal_requests 0
+authority/fences 0
+authority/serving-parks 0
+retire/serving 0
+retire/cold 0
+retire/retired 0
+retire 0
+unit-bindings 0
+unit-materializations 0
+restarts 0
+migration-items 0
+leo: all empty
+(context: ls: cannot access '/var/lib/carlos-claims': No such file or directory; ls: cannot access '/var/lib/carlos-release/private/restarts': No such file or directory; carlos carlos v0.28.16)
+[block 1 exit=0]
+== block 2 bucket 23:52:18.365Z
+host-claim-files 0 # information only; the lines below decide
+evidence-objects-for-leo 0
+serving-evidence-objects-for-leo 0
+staged
+
+staged
+
+roster-holds 0
+roster-activations 0
+bucket and roster: all empty
+(context: roster rev 17; control/hosts-backfill.json absent)
+[block 2 exit=0]
+######## ls /data/system/router on leo 23:52:29
+total 16
+drwxr-xr-x 3 carlos carlos 4096 2026-10-20 23:46:09.883461064 +0000 .
+drwxr-xr-x 3 carlos carlos 4096 2026-10-20 01:24:53.462821206 +0000 ..
+-rw-r--r-- 1 carlos carlos 132 2026-10-20 23:46:09.875461230 +0000 requested.json
+drwxr-xr-x 2 carlos carlos 4096 2026-10-20 23:46:09.875461230 +0000 v0.28.16
+[hssm] i-06a1ec144aa5226fb 9b7e81e2-19f7-4166-9ff2-fcc6e3eb175f Success exit=0
diff --git a/harness/evidence/run11/roll2.log b/harness/evidence/run11/roll2.log
new file mode 100644
index 000000000..d56202d49
--- /dev/null
+++ b/harness/evidence/run11/roll2.log
@@ -0,0 +1,145 @@
+== restore post-b5-run8b 23:29:36
+sophie-console volume restored to post-b5-run8b
+leo: running failed=[] snapshots=post-b5-run8b,post-8.1-run8,g10-stuck-run8,post-window,g7-fail-r11
+sophie: running failed=[] snapshots=base,boot,pre62,s7,pre-window,pre-window-seeded,post-b5,post-b5-465c3a08,post-b5-465c3a08-c8,post-b5-clean,post-b5-run8,post-b5-run8b,post-8.1-run8,g10-stuck-run8,item6-plain-update-fail,post-window,pre-0285,post-0285,post-candidate,post-move-r10,g7-fail-r11
+sophie-console volume snapshots: s7,pre-window,pre-window-seeded,post-b5,post-b5-465c3a08,post-b5-465c3a08-c8,post-b5-clean,post-b5-run8,post-b5-run8b,post-8.1-run8,g10-stuck-run8,item6-plain-update-fail,post-window,pre-0285,post-0285,post-candidate,post-move-r10,g7-fail-r11
+== signing session (C2 order) 23:29:54.610Z
+== release-window v0.28.15 (23:29:54.614Z)
+== release v0.28.15
+3cdbf32b3d49a670aa66666f30c73e247e23652d5cc41d7d099ce8ec7f1cc51e carlos-linux-arm64
+f9cdffad5c10a7f352646147a4937860c08f4b017e5594f3ed4e4cb37aa42d54 carlos_0.28.15_amd64.deb
+85c7dcbc65565d6825674128af05b86d830b5f5ba94439796b822ce02bde181a carlos_0.28.15_arm64.deb
+4a20a04d21b8d44a226abe3174ea4b659fae26cc28bf2c69b1723f4a50d056e6 SHA256SUMS.txt
+967cf0889002cfdc9294137cd683a3991b9fc2e5db1d326e56bc99546a108b34 SHA256SUMS.txt.sig
+8b6c9b7b4932697c1ec8309d3aa8713a29894b015a75e23c94a9ce1001bc6032 console-linux-arm64
+verify sums: Signature Verified Successfully
+operator CLI: carlos v0.28.15
+harness info: harness build: yes endpoint: http://203.0.113.10:9000 sums key: mAnSlX23... sha256:85f6f13cb78c
+== 1a/1e
+CHANNEL VERSION PROMOTED TAG DIGESTS
+canary/console e2c006d2 2026-10-20T12:16:52Z yes
+pointer digests: on for bab since 2026-10-20T01:12:47Z
+every channel's pointer carries digests: CARLOS_REQUIRE_POINTER_DIGEST can be turned on
+== 2
+8b6c9b7b4932697c1ec8309d3aa8713a29894b015a75e23c94a9ce1001bc6032 /home/operator/release-v0.28.15/console-linux-arm64
+0
+== 4
+shipped console 64a98473 (1 artifacts)
+promoted console 64a98473 -> canary/console
+CHANNEL VERSION PROMOTED TAG DIGESTS
+canary/console 64a98473 2026-10-20T23:29:58Z yes
+== session open (23:29:58.897Z)
+run-id cohort1-20261020T232958Z
+2026-10-20 23:30:00 267 SHA256SUMS.txt
+2026-10-20 23:30:01 89 SHA256SUMS.txt.sig
+2026-10-20 23:30:02 49873058 carlos-linux-arm64
+2026-10-20 23:30:06 203 console.json
+2026-10-20 23:30:03 37 floor.json
+2026-10-20 23:30:04 244 leo.json
+2026-10-20 23:30:04 191 regions.json
+2026-10-20 23:29:59 45 release.pub
+2026-10-20 23:30:07 1795 signer-helpers.sh
+2026-10-20 23:30:05 240 sophie.json
+Success /usr/local/bin/carlos: OK
+carlos v0.28.15
+jq-1.7
+/usr/bin/jq
+SHA256SUMS.txt: OK
+SHA256SUMS.txt.sig: OK
+helpers.sh: OK
+release.pub: OK
+swap devices: 0
+/run: tmpfs
+session-start 2026-10-20T23:30:18Z
+root 600 1 45
+ 2026/10/20 23:30:10 ALERT: root AWS file, profile, endpoint and trust-store environment overrides ignored
+
+== publish-identity v0.28.15, console 64a98473 (23:30:21.625Z)
+Success "writes": [
+ "key": "control/system/router/releases/v0.28.15.json",
+ "before_etag": "",
+ "key": "bootstrap/console/v0.28.15/carlos-linux-arm64",
+ "key": "bootstrap/router/v0.28.15/carlos-linux-arm64",
+ "key": "bootstrap/console/v0.28.15/carlos-linux-arm64",
+ "key": "bootstrap/router/v0.28.15/carlos-linux-arm64",
+publish-identity writes: [{"key":"control/system/router/releases/v0.28.15.json","before_etag":"","sha256":"7792ad3b588d6897c61e8388a9439892f74b268202b6242c79772c99f8a1117a","payload":{"schema":1,"component":"router","channel":"stable","current":{"console_artifacts":{"linux-arm64":{"key":"bootstrap/console/v0.28.15/carlos-linux-arm64","sha256":"8b6c9b7b4932697c1ec8309d3aa8713a29894b015a75e23c94a9ce1001bc6032"}},"release_tag":"v0.28.15","moves_protocol":1,"version":"v0.28.15","artifacts":{"linux-arm64":{"key":"bootstrap/router/v0.28.15/carlos-linux-arm64","sha256":"3cdbf32b3d49a670aa66666f30c73e247e23652d5cc41d7d099ce8ec7f1cc51e"}},"source":"release:v0.28.15","released_at":"0001-01-01T00:00:00Z"},"spread":"0s","promoted_at":"2026-10-20T23:30:23Z"}}]
+{
+ "identity_key": "control/system/router/releases/v0.28.15.json",
+ "release": {
+ "console_artifacts": {
+ "linux-arm64": {
+ "key": "bootstrap/console/v0.28.15/carlos-linux-arm64",
+ "sha256": "8b6c9b7b4932697c1ec8309d3aa8713a29894b015a75e23c94a9ce1001bc6032"
+ }
+ },
+ "release_tag": "v0.28.15",
+ "moves_protocol": 1,
+ "version": "v0.28.15",
+ "artifacts": {
+ "linux-arm64": {
+ "key": "bootstrap/router/v0.28.15/carlos-linux-arm64",
+ "sha256": "3cdbf32b3d49a670aa66666f30c73e247e23652d5cc41d7d099ce8ec7f1cc51e"
+ }
+ },
+ "source": "release:v0.28.15",
+ "released_at": "0001-01-01T00:00:00Z"
+ }
+}
+7792ad3b588d6897
+REV=15
+
+identity file = published object
+identity router 3cdbf32b3d49a670aa66666f30c73e247e23652d5cc41d7d099ce8ec7f1cc51e console 8b6c9b7b4932697c1ec8309d3aa8713a29894b015a75e23c94a9ce1001bc6032
+== done (23:30:29.909Z)
+REV after identity: {"rev":15,"activations":[],"holds":[]}
+box reports fresh at 23:30:56
+roster before: {"rev":15,"activations":[],"holds":[]}
+canary v0.28.5 promoted 2026-10-20T01:22:57Z spread 5m0s file
+stable v0.28.12 promoted 2026-10-20T12:22:46Z spread 5m0s file
+
+ada-letterpress linux-arm64 canary v0.28.5 current
+kathleen-juggling linux-arm64 stable v0.28.12 current
+noor-marquetry linux-arm64 stable v0.28.12 current
+-- leo before
+ carlos carlos v0.28.12 / prev carlos v0.28.8; path active
+ identities: v0.28.12.json v0.28.5.json v0.28.7.json v0.28.8.json
+ edge pid 232 exe sha 28923e4117924b4b NRestarts=0 ExecMainStartTimestamp=Tue 2026-10-20 23:29:50 UTC ActiveState=active
+-- dennis before
+ carlos carlos v0.28.12 / prev carlos v0.28.8; path active
+
+ edge pid 218 exe sha 28923e4117924b4b NRestarts=0 ExecMainStartTimestamp=Tue 2026-10-20 23:29:50 UTC ActiveState=active
+== promote stable v0.28.15 (23:30:57.384Z), plain system update, no step on any box
+promote v0.28.15 to router/stable — 2 box(es) will roll over 5m:
+ kathleen-juggling (linux-arm64, running v0.28.12)
+ noor-marquetry (linux-arm64, running v0.28.12)
+warning: v0.28.15 has not been on canary; promoting straight to stable
+ using uploaded v0.28.15 for linux-arm64
+ mirrored bootstrap/router/v0.28.15/carlos-linux-arm64
+ pointed router/stable at v0.28.15 (spread 5m0s)
+ serial bumped: boxes on stable start their spread
+promoted boxes on stable roll themselves; watch with: carlos system status --channel stable
+rc=0 roster: {"rev":16,"activations":["8732823b8f6920a74417833e57736a3d"],"holds":[]}
+== status 23:34:16.962Z
+canary v0.28.5 promoted 2026-10-20T01:22:57Z spread 5m0s file
+stable v0.28.15 promoted 2026-10-20T23:30:57Z spread 5m0s file
+
+ada-letterpress linux-arm64 canary v0.28.5 current
+kathleen-juggling linux-arm64 stable v0.28.15 current
+noor-marquetry linux-arm64 stable v0.28.15 current
+-- leo after
+ carlos carlos v0.28.15 / prev carlos v0.28.12; path active
+ identities: v0.28.12.json v0.28.15.json v0.28.5.json v0.28.7.json v0.28.8.json
+ edge pid 549 exe sha 3cdbf32b3d49a670 NRestarts=0 ExecMainStartTimestamp=Tue 2026-10-20 23:33:12 UTC ActiveState=active
+ journal: 2026-10-20T23:33:10.128006+00:00 leo systemd[1]: Starting carlos-system-update.service - carlos platform self-update (root apply)...
+ journal: 2026-10-20T23:33:29.543791+00:00 leo systemd[1]: Finished carlos-system-update.service - carlos platform self-update (root apply).
+-- dennis after
+ carlos carlos v0.28.15 / prev carlos v0.28.12; path active
+
+ edge pid 500 exe sha 3cdbf32b3d49a670 NRestarts=0 ExecMainStartTimestamp=Tue 2026-10-20 23:32:45 UTC ActiveState=active
+ journal: 2026-10-20T23:32:44.696067+00:00 dennis systemd[1]: Starting carlos-system-update.service - carlos platform self-update (root apply)...
+ journal: 2026-10-20T23:33:02.785394+00:00 dennis systemd[1]: Finished carlos-system-update.service - carlos platform self-update (root apply).
+23:35:03 roster {"rev":17,"activations":[],"holds":[]}
+roster end: {"rev":17,"activations":[],"holds":[]}
+{"generated_at":"2026-10-20T23:39:58.358967055Z","release":"v0.28.15","binary":"3cdbf32b3d49a670","activation_complete":true,"host_claim_enabled":null}
+sophie console pid 317 exe sha b2b431f3b2fb4600; router carlos v0.28.5
+[hssm] i-06a1ec144aa5226fb 78283619-f609-491d-990b-741013bb7ff3 Success exit=0
diff --git a/harness/evidence/run11b/roll.log b/harness/evidence/run11b/roll.log
new file mode 100644
index 000000000..323b932ae
--- /dev/null
+++ b/harness/evidence/run11b/roll.log
@@ -0,0 +1,216 @@
+== restore post-b5-run8b 08:04:25
+sophie-console volume restored to post-b5-run8b
+leo: running failed=[] snapshots=post-b5-run8b,post-8.1-run8,g10-stuck-run8,post-window,g7-fail-r11
+sophie: running failed=[] snapshots=base,boot,pre62,s7,pre-window,pre-window-seeded,post-b5,post-b5-465c3a08,post-b5-465c3a08-c8,post-b5-clean,post-b5-run8,post-b5-run8b,post-8.1-run8,g10-stuck-run8,item6-plain-update-fail,post-window,pre-0285,post-0285,post-candidate,post-move-r10,g7-fail-r11
+sophie-console volume snapshots: s7,pre-window,pre-window-seeded,post-b5,post-b5-465c3a08,post-b5-465c3a08-c8,post-b5-clean,post-b5-run8,post-b5-run8b,post-8.1-run8,g10-stuck-run8,item6-plain-update-fail,post-window,pre-0285,post-0285,post-candidate,post-move-r10,g7-fail-r11
+######## task 9 pre-roll check 08:04:49
+== block 1 on leo 08:04:49.097Z
+launches 0
+stop_inventory 0
+journal_inventory_versions 0
+journal_requests 0
+authority/fences 0
+authority/serving-parks 0
+retire/serving 0
+retire/cold 0
+retire/retired 0
+retire 0
+unit-bindings 0
+unit-materializations 0
+restarts 0
+migration-items 0
+leo: all empty
+(context: ls: cannot access '/var/lib/carlos-claims': No such file or directory; ls: cannot access '/var/lib/carlos-release/private/restarts': No such file or directory; carlos carlos v0.28.12)
+[block 1 exit=0]
+== block 2 bucket 08:04:49.212Z
+host-claim-files 0 # information only; the lines below decide
+evidence-objects-for-leo 0
+serving-evidence-objects-for-leo 0
+staged
+
+staged
+
+roster-holds 0
+roster-activations 0
+bucket and roster: all empty
+(context: roster rev 15; control/hosts-backfill.json absent)
+[block 2 exit=0]
+######## roll 08:05:00
+== signing session (C2 order) 08:05:00.986Z
+== release-window v0.28.17 (08:05:00.989Z)
+== release v0.28.17
+a79ed7263e3e92d3b7d25d856a46616dc39d2581bc5cdfedda510e5e43c0cdaa carlos-linux-arm64
+8501a79b585b2280b71df1b2fb8d3e74cb4d8bdfb18ca0e980d4f8a8053133eb carlos_0.28.17_amd64.deb
+7f217031c6f76114d507b7005ce078a3d4a485118cc29c4928ac71816dce0feb carlos_0.28.17_arm64.deb
+f67347bf4c69ef0df43fe9499b72f99071420a52d0d699ec551afdeb36709f87 SHA256SUMS.txt
+4a737dc1152abcdfed0321547e2d03eae3066c86139fe25d5a585a10c4f3dc0c SHA256SUMS.txt.sig
+ac3d2a5263f4e63842937648d988e659c8f075943124a40b6923fb33347e9713 console-linux-arm64
+verify sums: Signature Verified Successfully
+operator CLI: carlos v0.28.17
+harness info: harness build: yes endpoint: http://203.0.113.10:9000 sums key: mAnSlX23... sha256:85f6f13cb78c
+== 1a/1e
+CHANNEL VERSION PROMOTED TAG DIGESTS
+canary/console e2c006d2 2026-10-20T12:16:52Z yes
+pointer digests: on for bab since 2026-10-20T01:12:47Z
+every channel's pointer carries digests: CARLOS_REQUIRE_POINTER_DIGEST can be turned on
+== 2
+ac3d2a5263f4e63842937648d988e659c8f075943124a40b6923fb33347e9713 /home/operator/release-v0.28.17/console-linux-arm64
+0
+== 4
+shipped console 27303f54 (1 artifacts)
+promoted console 27303f54 -> canary/console
+CHANNEL VERSION PROMOTED TAG DIGESTS
+canary/console 27303f54 2026-10-21T08:05:05Z yes
+== session open (08:05:05.256Z)
+run-id cohort1-20261021T080505Z
+2026-10-21 08:05:06 267 SHA256SUMS.txt
+2026-10-21 08:05:07 89 SHA256SUMS.txt.sig
+2026-10-21 08:05:08 49873058 carlos-linux-arm64
+2026-10-21 08:05:12 203 console.json
+2026-10-21 08:05:09 37 floor.json
+2026-10-21 08:05:10 244 leo.json
+2026-10-21 08:05:09 191 regions.json
+2026-10-21 08:05:05 45 release.pub
+2026-10-21 08:05:13 1795 signer-helpers.sh
+2026-10-21 08:05:11 240 sophie.json
+Success /usr/local/bin/carlos: OK
+carlos v0.28.17
+jq-1.7
+/usr/bin/jq
+SHA256SUMS.txt: OK
+SHA256SUMS.txt.sig: OK
+helpers.sh: OK
+release.pub: OK
+swap devices: 0
+/run: tmpfs
+session-start 2026-10-21T08:05:24Z
+root 600 1 45
+ 2026/10/21 08:05:16 ALERT: root AWS file, profile, endpoint and trust-store environment overrides ignored
+
+== publish-identity v0.28.17, console 27303f54 (08:05:27.826Z)
+Success "writes": [
+ "key": "control/system/router/releases/v0.28.17.json",
+ "before_etag": "",
+ "key": "bootstrap/console/v0.28.17/carlos-linux-arm64",
+ "key": "bootstrap/router/v0.28.17/carlos-linux-arm64",
+ "key": "bootstrap/console/v0.28.17/carlos-linux-arm64",
+ "key": "bootstrap/router/v0.28.17/carlos-linux-arm64",
+publish-identity writes: [{"key":"control/system/router/releases/v0.28.17.json","before_etag":"","sha256":"305d705c4341b6ef93c67fc2b5e7e9001aa6c8a9707560f12d8f5b2157a5ecb6","payload":{"schema":1,"component":"router","channel":"stable","current":{"console_artifacts":{"linux-arm64":{"key":"bootstrap/console/v0.28.17/carlos-linux-arm64","sha256":"ac3d2a5263f4e63842937648d988e659c8f075943124a40b6923fb33347e9713"}},"release_tag":"v0.28.17","moves_protocol":1,"version":"v0.28.17","artifacts":{"linux-arm64":{"key":"bootstrap/router/v0.28.17/carlos-linux-arm64","sha256":"a79ed7263e3e92d3b7d25d856a46616dc39d2581bc5cdfedda510e5e43c0cdaa"}},"source":"release:v0.28.17","released_at":"0001-01-01T00:00:00Z"},"spread":"0s","promoted_at":"2026-10-21T08:05:29Z"}}]
+{
+ "identity_key": "control/system/router/releases/v0.28.17.json",
+ "release": {
+ "console_artifacts": {
+ "linux-arm64": {
+ "key": "bootstrap/console/v0.28.17/carlos-linux-arm64",
+ "sha256": "ac3d2a5263f4e63842937648d988e659c8f075943124a40b6923fb33347e9713"
+ }
+ },
+ "release_tag": "v0.28.17",
+ "moves_protocol": 1,
+ "version": "v0.28.17",
+ "artifacts": {
+ "linux-arm64": {
+ "key": "bootstrap/router/v0.28.17/carlos-linux-arm64",
+ "sha256": "a79ed7263e3e92d3b7d25d856a46616dc39d2581bc5cdfedda510e5e43c0cdaa"
+ }
+ },
+ "source": "release:v0.28.17",
+ "released_at": "0001-01-01T00:00:00Z"
+ }
+}
+305d705c4341b6ef
+REV=15
+
+identity file = published object
+identity router a79ed7263e3e92d3b7d25d856a46616dc39d2581bc5cdfedda510e5e43c0cdaa console ac3d2a5263f4e63842937648d988e659c8f075943124a40b6923fb33347e9713
+== done (08:05:36.164Z)
+REV after identity: {"rev":15,"activations":[],"holds":[]}
+box reports fresh at 08:05:50
+roster before: {"rev":15,"activations":[],"holds":[]}
+canary v0.28.5 promoted 2026-10-20T01:22:57Z spread 5m0s file
+stable v0.28.12 promoted 2026-10-20T12:22:46Z spread 5m0s file
+
+ada-letterpress linux-arm64 canary v0.28.5 current
+kathleen-juggling linux-arm64 stable v0.28.12 current
+noor-marquetry linux-arm64 stable v0.28.12 current
+-- leo before
+ carlos carlos v0.28.12 / prev carlos v0.28.8; path active
+ identities: v0.28.12.json v0.28.5.json v0.28.7.json v0.28.8.json
+ edge pid 286 exe sha 28923e4117924b4b NRestarts=0 ExecMainStartTimestamp=Wed 2026-10-21 08:04:43 UTC ActiveState=active
+-- dennis before
+ carlos carlos v0.28.12 / prev carlos v0.28.8; path active
+
+ edge pid 239 exe sha 28923e4117924b4b NRestarts=0 ExecMainStartTimestamp=Wed 2026-10-21 08:04:44 UTC ActiveState=active
+== promote stable v0.28.17 (08:05:51.400Z), plain system update, no step on any box
+promote v0.28.17 to router/stable — 2 box(es) will roll over 5m:
+ kathleen-juggling (linux-arm64, running v0.28.12)
+ noor-marquetry (linux-arm64, running v0.28.12)
+warning: v0.28.17 has not been on canary; promoting straight to stable
+ using uploaded v0.28.17 for linux-arm64
+ mirrored bootstrap/router/v0.28.17/carlos-linux-arm64
+ pointed router/stable at v0.28.17 (spread 5m0s)
+ serial bumped: boxes on stable start their spread
+promoted boxes on stable roll themselves; watch with: carlos system status --channel stable
+rc=0 roster: {"rev":16,"activations":["3485fc896974a0d5fc485d1cf573e2a3"],"holds":[]}
+== status 08:10:11.999Z
+canary v0.28.5 promoted 2026-10-20T01:22:57Z spread 5m0s file
+stable v0.28.17 promoted 2026-10-21T08:05:51Z spread 5m0s file
+
+ada-letterpress linux-arm64 canary v0.28.5 current
+kathleen-juggling linux-arm64 stable v0.28.17 current
+noor-marquetry linux-arm64 stable v0.28.17 current
+-- leo after
+ carlos carlos v0.28.17 / prev carlos v0.28.12; path active
+ identities: v0.28.12.json v0.28.17.json v0.28.5.json v0.28.7.json v0.28.8.json
+ edge pid 631 exe sha a79ed7263e3e92d3 NRestarts=0 ExecMainStartTimestamp=Wed 2026-10-21 08:09:05 UTC ActiveState=active
+ journal: 2026-10-21T08:09:02.944013+00:00 leo systemd[1]: Starting carlos-system-update.service - carlos platform self-update (root apply)...
+ journal: 2026-10-21T08:09:22.324882+00:00 leo systemd[1]: Finished carlos-system-update.service - carlos platform self-update (root apply).
+-- dennis after
+ carlos carlos v0.28.17 / prev carlos v0.28.12; path active
+
+ edge pid 558 exe sha a79ed7263e3e92d3 NRestarts=0 ExecMainStartTimestamp=Wed 2026-10-21 08:07:52 UTC ActiveState=active
+ journal: 2026-10-21T08:07:51.044065+00:00 dennis systemd[1]: Starting carlos-system-update.service - carlos platform self-update (root apply)...
+ journal: 2026-10-21T08:08:09.153046+00:00 dennis systemd[1]: Finished carlos-system-update.service - carlos platform self-update (root apply).
+08:10:12 roster {"rev":17,"activations":[],"holds":[]}
+roster end: {"rev":17,"activations":[],"holds":[]}
+{"generated_at":"2026-10-21T08:15:27.576007184Z","release":"v0.28.17","binary":"a79ed7263e3e92d3","activation_complete":true,"host_claim_enabled":null}
+sophie console pid 398 exe sha b2b431f3b2fb4600; router carlos v0.28.5
+######## task 9 again after the roll 08:15:38
+== block 1 on leo 08:15:38.506Z
+launches 0
+stop_inventory 0
+journal_inventory_versions 0
+journal_requests 0
+authority/fences 0
+authority/serving-parks 0
+retire/serving 0
+retire/cold 0
+retire/retired 0
+retire 0
+unit-bindings 0
+unit-materializations 0
+restarts 0
+migration-items 0
+leo: all empty
+(context: ls: cannot access '/var/lib/carlos-claims': No such file or directory; ls: cannot access '/var/lib/carlos-release/private/restarts': No such file or directory; carlos carlos v0.28.17)
+[block 1 exit=0]
+== block 2 bucket 08:15:38.628Z
+host-claim-files 0 # information only; the lines below decide
+evidence-objects-for-leo 0
+serving-evidence-objects-for-leo 0
+staged
+
+staged
+
+roster-holds 0
+roster-activations 0
+bucket and roster: all empty
+(context: roster rev 17; control/hosts-backfill.json absent)
+[block 2 exit=0]
+######## ls /data/system/router on leo 08:15:50
+total 16
+drwxr-xr-x 3 carlos carlos 4096 2026-10-21 08:09:02.921399042 +0000 .
+drwxr-xr-x 3 carlos carlos 4096 2026-10-20 01:24:53.462821206 +0000 ..
+-rw-r--r-- 1 carlos carlos 133 2026-10-21 08:09:02.917399130 +0000 requested.json
+drwxr-xr-x 2 carlos carlos 4096 2026-10-21 08:09:02.917399130 +0000 v0.28.17
+[hssm] i-06a1ec144aa5226fb a35d0bdb-3d07-4c2b-b261-3fdf063d9b97 Success exit=0
diff --git a/harness/scenarios/cohort1/blocks/b4-pair2.sh b/harness/scenarios/cohort1/blocks/b4-pair2.sh
new file mode 100644
index 000000000..b1d81b094
--- /dev/null
+++ b/harness/scenarios/cohort1/blocks/b4-pair2.sh
@@ -0,0 +1,25 @@
+# B4 step 4 again for the SECOND create (Run 11b): b4-pair.sh with H2 (default claimtrial3.dev.harness.test), app claimtrial2.
+# report key status/boxes/ada-letterpress.json, profile harness.
+set -euo pipefail
+. ~/cohort1/box-helpers.sh
+export AWS_PROFILE=harness
+cd ~/cohort1/out
+DEV=http://127.0.0.1:8090
+H2=${H2:-claimtrial3.dev.harness.test}
+CR='cd /root/claim-trial && /opt/carlos/carlos system claims console-report --bucket harness-deployment --aws-region eu-west-1 --expect-revision "$(cat rev)" --console-id "$(cat console-id)" --public-key "$(cat release.pub)"'
+lm() { date -u -d "$(aws --region eu-west-1 s3api head-object --bucket harness-deployment --key status/boxes/ada-letterpress.json --query LastModified --output text)" +%s; }
+date -u +%FT%TZ
+box_inspect "$SOPHIE"
+ssm_run "$SOPHIE" "$CR --dry-run"
+LAST=$(lm)
+AGE=$(( $(date -u +%s) - LAST ))
+echo "sophie's report written $(date -u -d "@$LAST" +%FT%TZ), ${AGE}s ago"
+if [ "$AGE" -ge 210 ]; then
+ echo "next tick within 90s: waiting for it"
+ until [ "$(lm)" != "$LAST" ]; do sleep 5; done
+fi
+date -u +%FT%T.%3NZ
+ssm_run "$SOPHIE" "$CR"
+date -u +%FT%T.%3NZ
+carlos instances create --app claimtrial2 --account bab --host $H2 --console $DEV --no-prompt
+date -u +%FT%T.%3NZ
diff --git a/harness/scenarios/cohort1/blocks/g10-r16.host.sh b/harness/scenarios/cohort1/blocks/g10-r16.host.sh
new file mode 100644
index 000000000..15409c82d
--- /dev/null
+++ b/harness/scenarios/cohort1/blocks/g10-r16.host.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+# Run 11 on 27303f54 (= harness v0.28.16): restore post-b5-run8b, task 9 pre-roll check, the plain roll, task 9 again,
+# then (coordinator) `ls /data/system/router` on leo before 8.1, informational.
+# g10-r16.host.sh <TAG> <ART> <carlos sha> <console sha> <CV>
+set -uo pipefail
+echo "== restore post-b5-run8b $(date -u +%T)"; bash /root/harness/snapshot.sh restore post-b5-run8b 2>&1 | grep -E '^leo|^sophie|volume|WARN'
+echo "######## task 9 pre-roll check $(date -u +%T)"; bash /home/operator/cohort1/blocks/g10-preroll.host.sh
+echo "######## roll $(date -u +%T)"; bash /home/operator/cohort1/blocks/g10-roll.host.sh "$@"
+echo "######## task 9 again after the roll $(date -u +%T)"; bash /home/operator/cohort1/blocks/g10-preroll.host.sh
+echo "######## ls /data/system/router on leo $(date -u +%T)"; incus exec leo -- ls -la --time-style=full-iso /data/system/router
diff --git a/harness/scenarios/cohort1/blocks/g10-reroll.host.sh b/harness/scenarios/cohort1/blocks/g10-reroll.host.sh
new file mode 100644
index 000000000..3d6d8a943
--- /dev/null
+++ b/harness/scenarios/cohort1/blocks/g10-reroll.host.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+# Run 11: back to post-b5-run8b and the same plain roll of v0.28.15 (after G7's refusal on the lingering cache).
+set -uo pipefail
+echo "== restore post-b5-run8b $(date -u +%T)"; bash /root/harness/snapshot.sh restore post-b5-run8b 2>&1 | grep -E '^leo|^sophie|volume|WARN'
+bash /home/operator/cohort1/blocks/g10-roll.host.sh "$@"
diff --git a/harness/scenarios/cohort1/blocks/g10-wait-cache.host.sh b/harness/scenarios/cohort1/blocks/g10-wait-cache.host.sh
new file mode 100644
index 000000000..5d5b2e326
--- /dev/null
+++ b/harness/scenarios/cohort1/blocks/g10-wait-cache.host.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# Run 11: wait (read-only) until leo's own agent has dropped its router cache, so /data/system/router holds only
+# requested.json, then snapshot post-g4-r11. No hand change on leo. g10-wait-cache.host.sh [max minutes]
+set -uo pipefail
+MAX=${1:-80}
+ls_r() { incus exec leo -- find /data/system/router -mindepth 1 -printf '%y %u %m %s %TT %P\n' | sort -k6; }
+echo "$(date -u +%T) start:"; ls_r
+for i in $(seq 1 $((MAX*4))); do
+ [ "$(incus exec leo -- find /data/system/router -mindepth 1 ! -name requested.json | wc -l)" = 0 ] && break
+ sleep 15
+done
+echo "$(date -u +%T) end:"; ls_r
+incus exec leo -- journalctl -u carlos-edge.service --since -90min --no-pager -o short-iso | grep -iE 'system (update|pointer)|cache' | tail -5
+[ "$(incus exec leo -- find /data/system/router -mindepth 1 ! -name requested.json | wc -l)" = 0 ] || { echo "STILL CACHED"; exit 1; }
+echo "== snapshot post-g4-r11 $(date -u +%T)"; bash /root/harness/snapshot.sh create post-g4-r11 2>&1 | grep -E '^leo|^sophie|volume'
+df -h / | tail -1
diff --git a/harness/scenarios/cohort1/blocks/g10-watch.host.sh b/harness/scenarios/cohort1/blocks/g10-watch.host.sh
new file mode 100644
index 000000000..cd4bc444e
--- /dev/null
+++ b/harness/scenarios/cohort1/blocks/g10-watch.host.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+# Run 11 G10: watch a claim-mode create from the 202 to serving (read-only), then dump the evidence.
+# g10-watch.host.sh <host> <since, e.g. "2026-10-21 00:30:00"> [max minutes, default 12]
+set -uo pipefail
+H=$1 SINCE=$2 MAX=${3:-12}
+O=/root/harness/evidence-r11/$H; mkdir -p $O
+op() { runuser -l operator -c "$*"; }
+claim() { op "aws s3 cp --quiet s3://harness-deployment/control/hosts/$H.json -" 2>/dev/null; }
+route() { incus exec leo -- python3 -c "
+import sqlite3,sys
+c=sqlite3.connect('file:/data/registry.db?mode=ro',uri=True)
+print([r for r in c.execute('select host,app,pool,hibernate from routes where host=?',(sys.argv[1],))])" "$H"; }
+last=""
+for i in $(seq 1 $((MAX*4))); do
+ c=$(claim); et=$(op "aws s3api head-object --bucket harness-deployment --key control/hosts/$H.json --query '[ETag,LastModified]' --output text" 2>/dev/null)
+ line="$(echo "$c" | jq -c '{kind: (.op.kind // null), op: ((.op.id // "")[0:8]), ack: ((.op.journal.exec_ack // {}) | to_entries | map({box: .key, exp: (.value.expires // .value.lease_expires // null), le: ((.value.lease_etag // "")[0:8])})), serving: (.serving // .holder.serving // null | tostring | .[0:80])}' 2>/dev/null) etag=$et"
+ [ "$line" != "$last" ] && echo "$(date -u +%T) $line route=$(route)"
+ last=$line
+ k=$(echo "$c" | jq -r '.op.kind // "none"' 2>/dev/null)
+ if [ "$k" != creating ] && [ -n "$(route | grep "$H")" ]; then echo "$(date -u +%T) DONE: op.kind=$k, route present"; break; fi
+ sleep 15
+done
+echo "== claim now"; claim | tee $O/claim.json | jq -c 'del(.op.intent.record)' | cut -c1-1500
+echo "== bucket objects under control/hosts/$H/"; op "aws s3 ls --recursive s3://harness-deployment/control/hosts/$H/" | tee $O/hosts-ls.txt | grep -v '/exec/' | head -40
+echo "== leo journal since $SINCE: authority/typed/claim lines"
+incus exec leo -- journalctl -u carlos-edge.service -u carlos-instance-control.service --since "$SINCE" --no-pager -o short-iso > $O/leo-journal.txt
+grep -cE 'selected authority changed' $O/leo-journal.txt | sed 's/^/selected-authority-changed count: /'
+grep -cE 'ErrTypedInventory|typed (retirement )?inventory' $O/leo-journal.txt | sed 's/^/typed-inventory count: /'
+grep -iE "$H|claim|authority|binding|install|provision" $O/leo-journal.txt | tail -25
+echo "== leo journals.db"
+incus exec leo -- python3 -c "
+import sqlite3,json,re
+c=sqlite3.connect('file:/var/lib/carlos-claims/journals.db?mode=ro',uri=True)
+for t in ['launches','stop_inventory','journal_inventory_versions','journal_requests']:
+ try: print(t, c.execute('select count(*) from %s'%t).fetchone()[0])
+ except Exception as e: print(t,'ERR',e)
+for h,inc,st,b in c.execute('select host,incarnation,stamp,body from stop_inventory order by stamp'):
+ s=b.decode() if isinstance(b,bytes) else b
+ try: d=json.loads(s)
+ except Exception: d={}
+ keys={k:v for k,v in d.items() if re.search('revision|binding|actor|box|enroll',k,re.I)}
+ print('stop_inventory',h,inc[:12],st,json.dumps(keys)[:600])
+for r in c.execute('select host,incarnation,stamp,revision from journal_inventory_versions order by stamp'): print('inventory_version',r[0],r[1][:12],r[2],r[3])
+" 2>&1 | tee $O/journals-db.txt
+echo "== leo root state for $H"
+incus exec leo -- bash -c "ls -la /var/lib/carlos-claims/authority/fences/ 2>&1; for f in /var/lib/carlos-claims/authority/fences/*.json; do [ -f \"\$f\" ] && python3 -c 'import json,sys,re; d=json.load(open(sys.argv[1])); print(sys.argv[1], json.dumps(d)[:900])' \"\$f\"; done" 2>&1 | tee $O/fences.txt | cut -c1-1000
+echo "== sophie console recovery lines since $SINCE"
+incus exec sophie -- journalctl -u console.service --since "$SINCE" --no-pager -o short-iso > $O/sophie-console.txt
+grep -iE "recover|claim|$H|contract" $O/sophie-console.txt | tail -20
+echo "== roster"; op 'carlos system claims inspect --bucket harness-deployment --aws-region eu-west-1 --public-key "$(cat ~/release.pub)" 2>/dev/null | jq -c "{rev: .roster.revision, holds: (.roster.holds // {}), activations: (.roster.activations // {} | keys)}"'
+echo "WATCH END $(date -u +%T)"
diff --git a/harness/scenarios/cohort1/blocks/g10b-b4.host.sh b/harness/scenarios/cohort1/blocks/g10b-b4.host.sh
new file mode 100644
index 000000000..d0b9476b6
--- /dev/null
+++ b/harness/scenarios/cohort1/blocks/g10b-b4.host.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Run 11b: block B4 then G10 (host root). B4 1-3 (b4.sh, operator), the timed pair (b4-pair.sh, operator), then
+# /root/harness/g10-watch.host.sh on the create (14 minutes: the ack and the console's 5-minute recovery).
+# g10b-b4.host.sh [pair-only]
+set -uo pipefail
+H=claimtrial2.dev.harness.test
+if [ "${1:-}" != pair-only ]; then
+ echo "######## B4 1-3 $(date -u +%T.%3NZ)"
+ runuser -l operator -c 'bash ~/cohort1/blocks/b4.sh' 2>&1 | grep -v '^help| '
+ echo "[b4.sh exit=${PIPESTATUS[0]}]"
+fi
+SINCE=$(date -u '+%F %T')
+echo "######## B4 4 the timed pair, attempt 1 $(date -u +%T.%3NZ)"
+runuser -l operator -c 'bash ~/cohort1/blocks/b4-pair.sh' 2>&1 | grep -v '^help| ' | tee /root/harness/b4-attempt1-r11b.log
+echo "[b4-pair exit=${PIPESTATUS[0]}]"
+echo "######## G10 watch $(date -u +%T.%3NZ)"
+bash /root/harness/g10-watch.host.sh $H "$SINCE" 14
+echo "######## B4 5 $(date -u +%T.%3NZ)"
+runuser -l operator -c 'bash ~/cohort1/blocks/b4-after.sh' 2>&1 | grep -v '^help| '
+echo "G10B END $(date -u +%T.%3NZ)"