docs: cohort-1 runbook: ownership after-state; third signing session open, refresh at revision 5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 file changed,
+18
−0
docs/superpowers/plans/2026-10-16-claim-activation-dev-cohort1.md+18 −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.013s ? 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/docs/superpowers/plans/2026-10-16-claim-activation-dev-cohort1.md b/docs/superpowers/plans/2026-10-16-claim-activation-dev-cohort1.md| index f761ce13d..0377d2f59 100644 |
| --- a/docs/superpowers/plans/2026-10-16-claim-activation-dev-cohort1.md |
| +++ b/docs/superpowers/plans/2026-10-16-claim-activation-dev-cohort1.md |
| @@ -1347,6 +1347,24 @@ Leo's host claims stay off until step 8. |
| On failure: hold. Arming is one-way: keep the local armed policy, and never delete the enrollment or the guard. Restore only an image at or above the floor. Never delete or rewrite either published identity, any staged `policy*.json` or `identity*.json`, or the files in `/opt/carlos/system/console/`. |
| +### The third session: 6.2 onward and step 7 (v0.28.4, 2026-10-19) |
| + |
| +Run by the executor for the controller, on Paul's go given directly to the controller: fix the ownership on leo and sophie (done first), then a third signing session for 6.2 onward and step 7, with the same stop points, teardown and CloudTrail check. Commands went from DOCS-T1 (profile `kass`), one SSM `send-command` per block, the signer's blocks sourcing `/root/claim-trial/helpers.sh`. No secret was printed. 6.1 (`publish-identity`) and 6.1a were not repeated. |
| + |
| +**Ownership fix, 2026-10-19 (before the session).** Done by the controller on Paul's go. Before: leo had 3 entries under `/opt/carlos` not owned by root (`/opt/carlos`, `versions` and `live`); sophie had 8 (also `versions/1f4f324/helloworld`, two `live/helloworld` symlinks and `channel-first-seen.json`). After, on both boxes: everything under `/opt/carlos` is `root:root`, with 0 entries not owned by root, 0 group- or other-writable, 0 set-id; `/etc/carlos/host.env` is `root:root 600`. Edge and instance-control `active` on both; claimtrial on leo, wakecheck, the dev console's `/` and `/healthz`, and helloworld all returned 200. The host-init fix (`chown -R carlos:carlos /data /opt/carlos`) is not part of this record. |
| + |
| +Re-checked read-only before the signer was created, 15:15Z to 15:18Z, all PASS: |
| +- Leo and sophie: `/opt`, `/opt/carlos` and `/opt/carlos/system` `root:root 755`; under `/opt/carlos` 0 entries not `root:root`, 0 group- or other-writable (symlinks aside), 0 set-id; `host.env` `root:root 600`. `/root/claim-trial` root `700`, every file root:root `600`, one link, the recorded sha256 and size: both `release.pub` `960d03ff` (45), `policy.json` `dfac87e6` (507), `identity.json` `2d22f05f` (1076), `policy.v0.28.4.json` `2114cdd0` (507), `identity.v0.28.4.json` `995e3c85` (1076); leo `leo-climbing-enrollment.json` `800b181f` (120); sophie `sophie-knitting-enrollment.json` `85380180` (123) and `console-id` `cfacdf55` (12). `carlos` and `carlos.prev` both `736826e4`, root:root `755`, `carlos v0.28.4`. `channel-identity.json` `995e3c85`. Absent: `host-actor.json`, `/opt/carlos/system/guard`, `carlos-edge.service.d`, `/opt/carlos/system/console`, `claim-console.env`, `91-claim-runtime.conf`, `host-evidence.key`. Leo: `CARLOS_HOST_CLAIM` and `CARLOS_SYSTEM_CHANNEL` unset; sophie: `CARLOS_HOST_CLAIM` unset, `CARLOS_SYSTEM_CHANNEL=canary`. Edge and instance-control `active`; sophie's console `active`, running `/opt/carlos/versions/f3bf1214/console`. |
| +- Bucket: `control/host-actors.json` 1967 bytes, etag `f3717d8d67f496ffd9525704c7a690b0` (2026-10-18 10:21:54Z); `control/moves-protocol.json` and `moves-protocol-auth.json` 404; `releases/` holds `v0.28.2.json` and `v0.28.4.json` (1076 bytes, etag `47c51f83…`, 09:17:58Z); nothing under `claim-signer/`; `stable.json` and `canary.json` name v0.28.4, `736826e4…4b21`, no `release_tag`, no `moves_protocol`. No `carlos-claim-signer` role, profile, security group or instance. |
| + |
| +Block 4, opening, 15:18Z to 15:20Z: PASS. |
| +- Tools from the public releases: `openssl pkeyutl -verify` with the README's pinned key printed `Signature Verified Successfully`; `sha256sum -c` `OK` for `carlos-linux-arm64`, `carlos-linux-amd64` and (jq's `sha256sum.txt`) `jq-linux-arm64`. `SHA256SUMS.txt` `b2dcd93c…cd2f` (704 bytes) names only `carlos_0.28.4_amd64.deb` and `carlos_0.28.4_arm64.deb`; `.sig` `480ecfb1…d812`; carlos arm64 `736826e4…4b21`, amd64 `2d53162f…8548` (`carlos v0.28.4`); jq `4dd2d8a0…b4a5`. `release.pub` fetched from leo's staged copy by sha256 (`960d03ff`, equal to leo's `CARLOS_RELEASE_PUBKEY`). `floor.json` `881acf53…37a9`. |
| +- Created: role `carlos-claim-signer` with `AmazonSSMManagedInstanceCore` and inline policy `claim-signer`, extracted verbatim from `signing-host.md` (the `WriteIdentity` check printed `ok`); instance profile `carlos-claim-signer`; security group `sg-0f97ee97ab8545ced` (no inbound, egress TCP 443 only); instance `i-0d2236c4b1924ee58` (launched 15:19:14Z on the first try, IMDSv2 required, hop limit 1, SSM `Online` 15:19:44Z). Exchange run-id `cohort1-20261019T151914Z`, holding `carlos-linux-arm64`, `jq-linux-arm64`, `SHA256SUMS.txt`, `SHA256SUMS.txt.sig`, `release.pub`, `floor.json` and `helpers.sh`. |
| +- On the signer: both `sha256sum -c` lines `OK`, `carlos v0.28.4`, `jq-1.7.1`, no swap, `/run` tmpfs. `claims help` hashed to `a909f5ef`, the same as the quoted text under "The signing session" with its three changes (and as the verified amd64 CLI's; `diff` empty). |
| +- Session start `2026-10-19T15:20:21Z`, recorded before the key fetch. Key at `/run/claim-signer/release.key`: `root 600 1 45`, tmpfs, in a root `700` directory. |
| + |
| +Block 5, `refresh` only, 15:21Z: PASS. `/root/claim-trial` on the signer (root `700`) holds `release.pub`, `floor.json`, `helpers.sh` (`208ee7d9`, the same bytes as the second session's), `SHA256SUMS.txt` and `.sig`, each root `600` and `OK`. `REV=5`, etag `f3717d8d…`; region `ie` (namespace `platform`, pools `cohort1` and `console`), `request_limit_ns` 120000000000; `leo-climbing` pool `cohort1`, `i-046c7fe43620944bc`, `active`; `sophie-knitting` pool `console`, `i-05498eada6f0afd23`, `active`; `dev-console` with compute `sophie-knitting`, namespaces `platform`; `holds` and `activations` empty (enrollments redacted). `inspect.json` `c9143bdf` and `roster.json` `6fc74d75`, the same bytes as both earlier sessions'. |
| + |
| ### The second session's step 6 (v0.28.4, 2026-10-19) |
| **2026-10-19: 6.1 PASS; 6.1a PASS on leo and sophie; 6.2 STOP. The session is closed.** Run by the executor for the controller, on Paul's go for step 6 (install-channel, guard-arm and the guarded console restart included), confirmed directly with the controller. Commands went over SSM from DOCS-T1, as in 5.1. No host.env or flag was changed. P9, `install-console`, `guard-arm --console`, `console-config` and the console restart were not run: the dev console is untouched (`f3bf1214` from 5.0a). |