carlos / platform Public

docs: cohort-1 signing session opened, 5.1 done: roster rev 5, inputs staged

Signer i-0ea2852ef727929bb (sg-08c374c8c31ef448a, run-id
cohort1-20261018T101832Z) is up with the release key in tmpfs, held for
step 6. Every 5.1 dry run and apply passed; leo (cohort1), sophie
(console) and dev-console are enrolled; box inputs staged on both boxes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 102b1a1edb40f6c19e78a6e5f6ad8e59186d55e0 parent 6fa85bd
1 file changed, +33 −2
  • docs/superpowers/plans/2026-10-16-claim-activation-dev-cohort1.md +33 −2

CI passed — 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
ok  	github.com/carlosframework/platform	314.320s
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	2.835s
ok  	github.com/carlosframework/platform/cmd/moveprobe	93.344s
ok  	github.com/carlosframework/platform/cmd/zddprobe	0.712s
ok  	github.com/carlosframework/platform/internal/activator	250.786s
ok  	github.com/carlosframework/platform/internal/agentsock	0.038s
ok  	github.com/carlosframework/platform/internal/alerting	0.009s
ok  	github.com/carlosframework/platform/internal/analytics	0.026s
ok  	github.com/carlosframework/platform/internal/appconfig	2.577s
ok  	github.com/carlosframework/platform/internal/apperr	0.108s
ok  	github.com/carlosframework/platform/internal/applog	0.195s
ok  	github.com/carlosframework/platform/internal/awsinv	0.004s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.005s
ok  	github.com/carlosframework/platform/internal/boxid	0.663s
?   	github.com/carlosframework/platform/internal/boxid/boxidtest	[no test files]
?   	github.com/carlosframework/platform/internal/boxid/internal/signtest	[no test files]
ok  	github.com/carlosframework/platform/internal/boxvolumes	0.008s
ok  	github.com/carlosframework/platform/internal/caps	0.014s
ok  	github.com/carlosframework/platform/internal/certwarm	0.002s
ok  	github.com/carlosframework/platform/internal/cgroup	0.744s
ok  	github.com/carlosframework/platform/internal/changelog	0.342s
ok  	github.com/carlosframework/platform/internal/claimactivation	0.027s
ok  	github.com/carlosframework/platform/internal/clamd	0.063s
?   	github.com/carlosframework/platform/internal/cliflag	[no test files]
ok  	github.com/carlosframework/platform/internal/console	406.582s
?   	github.com/carlosframework/platform/internal/controlname	[no test files]
?   	github.com/carlosframework/platform/internal/controlsock	[no test files]
ok  	github.com/carlosframework/platform/internal/dbdoor	6.255s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.011s
ok  	github.com/carlosframework/platform/internal/dbverify	0.004s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.003s
ok  	github.com/carlosframework/platform/internal/docsite	0.007s
ok  	github.com/carlosframework/platform/internal/domains	2.509s
ok  	github.com/carlosframework/platform/internal/doorkey	0.006s
ok  	github.com/carlosframework/platform/internal/economics	0.004s
ok  	github.com/carlosframework/platform/internal/edge	44.865s
?   	github.com/carlosframework/platform/internal/edgeproof	[no test files]
ok  	github.com/carlosframework/platform/internal/edgesfile	0.008s
ok  	github.com/carlosframework/platform/internal/fleetapi	0.138s
ok  	github.com/carlosframework/platform/internal/gate	1.665s
ok  	github.com/carlosframework/platform/internal/genselect	0.016s
ok  	github.com/carlosframework/platform/internal/geo	0.016s
ok  	github.com/carlosframework/platform/internal/geoip	0.036s
ok  	github.com/carlosframework/platform/internal/historyreadback	0.165s
ok  	github.com/carlosframework/platform/internal/host	175.771s
ok  	github.com/carlosframework/platform/internal/hostactors	0.728s
ok  	github.com/carlosframework/platform/internal/hostbox	2.731s
ok  	github.com/carlosframework/platform/internal/hostclaim	0.606s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.006s
ok  	github.com/carlosframework/platform/internal/hostexec	4.818s
ok  	github.com/carlosframework/platform/internal/hostfence	0.033s
ok  	github.com/carlosframework/platform/internal/hostfiles	10.402s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.014s
ok  	github.com/carlosframework/platform/internal/hostguard	1.001s
ok  	github.com/carlosframework/platform/internal/hostops	1.689s
?   	github.com/carlosframework/platform/internal/hostops/fencerelease	[no test files]
ok  	github.com/carlosframework/platform/internal/hostops/internal/fencerelease	0.002s
ok  	github.com/carlosframework/platform/internal/hostquarantine	0.002s
ok  	github.com/carlosframework/platform/internal/hostrelocate	0.498s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.170s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.002s
ok  	github.com/carlosframework/platform/internal/infraview	0.003s
ok  	github.com/carlosframework/platform/internal/instancectl	5.212s
ok  	github.com/carlosframework/platform/internal/instanceexec	2.738s
ok  	github.com/carlosframework/platform/internal/instancefs	0.007s
ok  	github.com/carlosframework/platform/internal/instancekey	0.004s
ok  	github.com/carlosframework/platform/internal/instanceupdates	0.007s
ok  	github.com/carlosframework/platform/internal/layout	1.602s
ok  	github.com/carlosframework/platform/internal/lbhealth	0.004s
ok  	github.com/carlosframework/platform/internal/lease	9.819s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.007s
ok  	github.com/carlosframework/platform/internal/ledger	0.013s
ok  	github.com/carlosframework/platform/internal/mail	0.180s
ok  	github.com/carlosframework/platform/internal/maintenance	0.084s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.555s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.071s
ok  	github.com/carlosframework/platform/internal/metrics	0.005s
ok  	github.com/carlosframework/platform/internal/moves	21.068s
ok  	github.com/carlosframework/platform/internal/moves/archive	0.829s
ok  	github.com/carlosframework/platform/internal/objstore	0.189s
ok  	github.com/carlosframework/platform/internal/ops	0.167s
ok  	github.com/carlosframework/platform/internal/park	0.206s
ok  	github.com/carlosframework/platform/internal/privatefile	0.004s
ok  	github.com/carlosframework/platform/internal/provision	17.346s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.007s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	5.452s
ok  	github.com/carlosframework/platform/internal/relay	7.217s
ok  	github.com/carlosframework/platform/internal/release	21.854s
ok  	github.com/carlosframework/platform/internal/rollout	3.661s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.004s
ok  	github.com/carlosframework/platform/internal/rootaws	0.008s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.058s
ok  	github.com/carlosframework/platform/internal/rootstate	0.027s
ok  	github.com/carlosframework/platform/internal/runs	0.577s
ok  	github.com/carlosframework/platform/internal/s3compat	0.005s
ok  	github.com/carlosframework/platform/internal/safefile	0.004s
ok  	github.com/carlosframework/platform/internal/schedule	2.518s
ok  	github.com/carlosframework/platform/internal/seeds	0.011s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	8.962s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	4.267s
ok  	github.com/carlosframework/platform/internal/status	0.039s
ok  	github.com/carlosframework/platform/internal/steering	0.006s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.171s
ok  	github.com/carlosframework/platform/internal/svcrole	0.002s
ok  	github.com/carlosframework/platform/internal/telemetry	0.004s
ok  	github.com/carlosframework/platform/internal/termfence	0.004s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.004s
ok  	github.com/carlosframework/platform/internal/unixdial	0.003s
ok  	github.com/carlosframework/platform/internal/updatewords	0.004s
ok  	github.com/carlosframework/platform/internal/usage	0.004s
ok  	github.com/carlosframework/platform/internal/version	0.001s
ok  	github.com/carlosframework/platform/internal/vet	1.549s
=== cross ===
--- shard 0 of 5 ---
cross-compiling darwin/arm64
--- shard 1 of 5 ---
cross-compiling darwin/amd64
--- shard 2 of 5 ---
cross-compiling linux/arm64
linux/arm64 carlos binary: 48824482 bytes (ceiling 52000000)
--- shard 3 of 5 ---
cross-compiling windows/amd64
--- shard 4 of 5 ---
cross-compiling windows/arm64
=== minio-contract ===
minio contract: arm64, minio RELEASE.2025-09-07T16-13-09Z, mc RELEASE.2025-08-13T08-35-41Z
  minio: cached, digest verified
  mc: cached, digest verified
  minio healthy on 127.0.0.1:20999
Added `local` successfully.
Bucket created successfully `local/contract-bucket`.
Bucket created successfully `local/denied-bucket`.
Created policy `contract-only` successfully.
Added user `scopeduser` successfully.
Attached Policies: [contract-only]
To User: scopeduser
  buckets and scoped user ready
=== RUN   TestDeliveredContractMinio
=== RUN   TestDeliveredContractMinio/put
=== RUN   TestDeliveredContractMinio/get_round-trips_the_body
=== RUN   TestDeliveredContractMinio/list_shows_the_key
=== RUN   TestDeliveredContractMinio/head_and_list_agree_on_the_version
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed
=== RUN   TestDeliveredContractMinio/delete_removes_it
=== RUN   TestDeliveredContractMinio/cross-bucket_denial
--- PASS: TestDeliveredContractMinio (0.02s)
    --- PASS: TestDeliveredContractMinio/put (0.00s)
    --- PASS: TestDeliveredContractMinio/get_round-trips_the_body (0.00s)
    --- PASS: TestDeliveredContractMinio/list_shows_the_key (0.00s)
    --- PASS: TestDeliveredContractMinio/head_and_list_agree_on_the_version (0.00s)
    --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload (0.00s)
    --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route (0.01s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict (0.00s)
        --- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed (0.00s)
    --- PASS: TestDeliveredContractMinio/delete_removes_it (0.00s)
    --- PASS: TestDeliveredContractMinio/cross-bucket_denial (0.00s)
PASS
ok  	github.com/carlosframework/platform/internal/objstore	0.022s
=== RUN   TestT4StorageProbeMinio
2026/10/18 10:31:20 moves: T4: STORE: list: operation error S3: ListObjectsV2, https response error StatusCode: 403, RequestID: 18DF991234FDFC5F, HostID: 7c420053e0fbcd7f41653fdd92ffa2802c903d05303b1aa15adc2e8bb65d183f, api error SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
--- PASS: TestT4StorageProbeMinio (0.00s)
PASS
ok  	github.com/carlosframework/platform/internal/host	0.021s
minio contract: PASS
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 7a06626ab..e3d373294 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
@@ -26,8 +26,8 @@ Prepared on 2026-10-18 for platform-1e to present. v0.28.2 is published (tag on
| 1 | Step 2: delete the 267 objects under `apps/bab//` (the script on main) | Paul's go; Paul runs it | not run |
| 2 | Step 4: `CARLOS_POOLS=cohort1` on leo and the disposable app `claimtrial` | approved 2026-10-16; apply after platform-d8 answers | not applied (`CARLOS_POOLS` unset on leo, no `claimtrial` in the bucket) |
| 3 | 5.0a: pointer digests on for all of `bab` on dev (eight apps, nine pointers), then ship and promote the prebuilt console `7c1beb2d` to `canary/console` | one go for both; outside any roll | 1a PASS, 1b listed, 1c PASS, 1d STOP and OPEN rows, 1e as expected, prebuilt console PASS |
-| 4 | Open the signing session: create the signer host and its role policy, with read on `apps/bab/console/*` and write on exactly `control/system/router/releases/v0.28.2.json` (`signing-host.md`) | one go for host and policy together | ready; IDs `SG`, `I` and `<run-id>` are created then |
-| 5 | 5.1 roster and enrollment | Paul's go | ready once 4 is done; the console enrollment token is generated at approval |
+| 4 | Open the signing session: create the signer host and its role policy, with read on `apps/bab/console/*` and write on exactly `control/system/router/releases/v0.28.2.json` (`signing-host.md`) | one go for host and policy together | DONE 2026-10-18: `SG` `sg-08c374c8c31ef448a`, `I` `i-0ea2852ef727929bb`, run-id `cohort1-20261018T101832Z`, session start 10:19:37Z |
+| 5 | 5.1 roster and enrollment | Paul's go | DONE 2026-10-18: roster revision 5 (leo, sophie, `dev-console`), inputs staged on both boxes; token generated on the signer, never printed |
| 6 | Step 6: sign the policy, publish the identity, arm leo, re-run P9, install the protected console, arm sophie, start the guarded console | Paul's go; restarts the dev console | P9 PASS today (09:13Z); re-run at 6.3 |
| 7 | Step 7: readers, floor, home, leo's key, console runtime | Paul's go; `home_region` becomes write-once | ready after 6 |
| 8 | Close the session: shred the key, terminate the signer, delete its role, profile and security group, CloudTrail check | none; always allowed | |
@@ -907,6 +907,37 @@ Expected: `staged` for each file. No private signing key is transferred. `policy
On failure: hold. A partly applied phase is resumed from the latest authenticated revision, never recreated.
+**Session opened and 5.1 done, 2026-10-18** (executor for the controller, on Paul's go for the whole signing session).
+
+Opening (`signing-host.md`, "Create"):
+- Created: role and inline policy `carlos-claim-signer` / `claim-signer` (extracted verbatim from `signing-host.md`; the `WriteIdentity` check printed `ok`), instance profile `carlos-claim-signer`, security group `sg-08c374c8c31ef448a` (no inbound, egress TCP 443 only), instance `i-0ea2852ef727929bb` (launched 10:18:32Z, SSM online 10:19:11Z), exchange run-id `cohort1-20261018T101832Z`.
+- On DOCS-T1, before upload: the v0.28.2 `SHA256SUMS.txt` signature printed "Signature Verified Successfully" with the README's pinned key. `carlos-linux-arm64` `7141e037...f492`, jq 1.7.1 `4dd2d8a0...b4a5`, `SHA256SUMS.txt` `9c29b3d3...` and `.sig` `0fdb8557...` all matched. `release.pub` was taken from leo's `CARLOS_RELEASE_PUBKEY`, identical on sophie, fingerprint `960d03ff`.
+- On the signer: both `sha256sum -c` lines `OK`, `carlos v0.28.2`, `jq-1.7.1`. Session start `2026-10-18T10:19:37Z`, recorded before the key fetch. Key at `/run/claim-signer/release.key`: `root 600 1 45`, tmpfs, no swap.
+- Console enrollment token generated on the signer at approval (`od -N16 /dev/urandom`), never printed. Format `^[0-9a-f]{32}$` ok, sha256 prefix `a611795b`. It lives only in the signer's `/root/claim-trial` and in the roster.
+
+How it ran: the signer has no attended shell. Each block went from DOCS-T1 as one SSM `send-command` that sources `/root/claim-trial/helpers.sh`, which holds this section's first helper block with `CARLOS=/usr/local/bin/carlos`, `KEY=/run/claim-signer/release.key` and no `AWS_PROFILE`. Each phase ran as a plain errexit statement with stdout to a file, which was printed with every `enrollment` value redacted. Run output carries the payload, enrollments included.
+
+5.1 results (every dry run, then its apply, succeeded):
+
+| Phase | Revision after | Write | Verdict |
+|---|---|---|---|
+| `initialize` | 1 | `control/host-actors.json`, empty roster | PASS |
+| `configure` | 2 | roster with region `ie` (namespace `platform`, pools `cohort1` and `console`) | PASS |
+| `invite-box` leo | 2 | `control/host-actor-invitations/leo-climbing.json` | PASS |
+| `enroll-box` leo | 3 | `leo-climbing`: pool `cohort1`, `i-046c7fe43620944bc`, state `active` | PASS |
+| `invite-box` sophie | 3 | `control/host-actor-invitations/sophie-knitting.json` | PASS |
+| `enroll-box` sophie | 4 | `sophie-knitting`: pool `console`, `i-05498eada6f0afd23`, state `active` | PASS |
+| `invite-console` | 4 | `control/host-console-invitations/dev-console.json`, compute `sophie-knitting` | PASS |
+| `enroll-console` | 5 | `dev-console`: namespaces `platform`, compute `sophie-knitting` | PASS |
+
+`invite-box` draws a fresh enrollment on every invocation, so the dry run's sha256 differs from the apply's; the apply's is what was written. The console's is fixed by the approved token, so its two values match.
+
+Final `refresh`: revision 5, etag `f3717d8d67f496ffd9525704c7a690b0`. `inspect.json` lists `leo-climbing` (pool `cohort1`, `i-046c7fe43620944bc`), `sophie-knitting` and `dev-console`; `holds` and `activations` are empty. Both enrollment files hold a 32-hex enrollment and the right instance ID. Outputs went through `claim-signer/cohort1-20261018T101832Z/out/` and were checked by sha256 on DOCS-T1: `inspect.json` `c9143bdf`, `roster.json` `6fc74d75`, `leo-climbing-enrollment.json` `800b181f`, `sophie-knitting-enrollment.json` `85380180`.
+
+Staging from DOCS-T1: `ok` for both directories, then `staged` for leo's `release.pub` and `leo-climbing-enrollment.json`, and for sophie's `release.pub`, `sophie-knitting-enrollment.json` and `console-id` (`dev-console`). A read-only check found each one root:root `600`, link count 1, its sha256 matching, in a root `700` `/root/claim-trial`. No host.env or flag was changed on any box.
+
+The signer stays up with the key in tmpfs for step 6.
+
## Step 6. Arm leo's guard and start the guarded console
Inside the signing session, after 5.1. Waits for v0.28.2 on dev and for 5.0a. Everything this step adds is on main 7c1beb2d, published (v0.28.2, tag on 7c1beb2d): the `claims run` phases `sign-policy` and `publish-identity`, `claims run --out`, and `claims install-console`. Never hand-make any of their files. The builder findings from the review of that branch (the release-tag stamp, 5.0a, the fixed console path and the verbatim identity inputs) are drafted here for Paul after v0.28.2.