carlos / platform Public

Runs started by a scoped service credential (PRO-6214): a run role that names its commands, sees only its own runs, and starts each keyed run exactly once

Fleet (Tito's back office) needs to run its Classic import and recurring sync
through carlos run without a person's token. Amends run spec § 2 ruling 1 for
the run role only. Spec: docs/superpowers/specs/2026-10-24-service-runs-design.md;
plan: docs/superpowers/plans/2026-10-24-service-runs.md.

- svcrole.Run, reachable only through svcrole.Exactly(Run); Allow(Run) panics,
  so no Allow set can carry Admin through a run door.
- A run credential is app-bound and carries its own credential_id (128-bit,
  unique, kept on rotate, new on every mint, backfilled once) and the command
  prefixes it may run (carlos services create --role run --commands "..."),
  word for word, fail-closed; CLIPrincipal refuses any run row it cannot fully
  read.
- The six run doors admit a run service for its own runs only (keyed on the
  credential, kind-scoped); another caller's run answers exactly as an unknown
  id; the open-run refusal is redacted for services; the requester is shown as
  "started by service <name> for <email> (as stated by the service)".
- Idempotency-Key: the admitted key is recorded in the instance record by the
  same CAS that admits the run (run_keys, 24h, 32 per caller), so twins and
  retries never run twice; keyed creates stay off (503 keys_not_ready) until
  CARLOS_RUN_KEYS=on. carlos run --idempotency-key; GET .../runs?key=.
- Run handler refusals carry stable codes; docs/site/cli.md documents the role,
  the commands rule, the run API, the codes and the key lifetime.

Reviewed task by task (Opus), whole-branch by Fable and by Astra (gpt-6-astra,
high), with every finding addressed. Copy approved by Paul 2026-10-24. Census
approved by Paul (census owner) 2026-10-24 at ffe8f40a, re-sealed onto main
3d7cbe30 with no change to the approved claims
(docs/superpowers/notes/census-proposal-pro-6214-service-runs.md).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev 5c7b0fa6d8f1cf670322c0a6b79253ff114ab48b parent 3d7cbe3
50 files changed, +6092 −205
  • apimode.go +21 −13
  • auth.go +10 −0
  • cmd/console/main.go +1 −0
  • docs/site/cli.md +72 −2
  • docs/superpowers/notes/census-proposal-pro-6214-service-runs.md +138 −0
  • docs/superpowers/plans/2026-10-24-service-runs.md +489 −0
  • docs/superpowers/specs/2026-10-08-carlos-run-design.md +2 −0
  • docs/superpowers/specs/2026-10-24-service-runs-design.md +318 −0
  • internal/console/apiruns.go +446 −44
  • internal/console/apiruns_key_test.go +819 −0
  • internal/console/apiruns_service_test.go +873 −0
  • internal/console/apirunsfollow.go +52 −35
  • internal/console/apiservices.go +86 −13
  • internal/console/authcli.go +17 −5
  • internal/console/authstore.go +115 −6
  • internal/console/claim_invariant_fixtures_test.go +6 −0
  • internal/console/deploycred_test.go +5 −5
  • internal/console/deploydoors_test.go +1 −1
  • internal/console/deploymixed_test.go +1 −1
  • internal/console/deployscope_test.go +1 −1
  • internal/console/deploysign_test.go +2 −2
  • internal/console/server.go +7 −0
  • internal/console/svcpage.go +41 −5
  • internal/console/svcprincipal.go +126 −18
  • internal/console/svcprincipal_run_test.go +572 −0
  • internal/console/svcroutes_test.go +51 −9
  • internal/console/templates/account_settings.html +5 −2
  • internal/console/testdata/claim-routes.txt +1 −0
  • internal/host/runevents.go +6 −1
  • internal/host/runevents_service_test.go +32 −0
  • internal/provision/plan9_b8_census_test.go +1 −1
  • internal/provision/provision.go +9 −0
  • internal/provision/run.go +102 −3
  • internal/provision/run_keys_test.go +409 −0
  • internal/provision/service_runs_census_test.go +56 −0
  • internal/provision/testdata/plan14-root-reads-chain.tsv +2 −0
  • internal/provision/testdata/plan14-root-reads-pro-6214-service-runs-decisions.tsv +20 −0
  • internal/provision/testdata/plan14-root-reads-pro-6214-service-runs.tsv +38 −0
  • internal/runs/commands.go +134 −0
  • internal/runs/commands_test.go +156 −0
  • internal/runs/keys.go +111 −0
  • internal/runs/keys_test.go +123 −0
  • internal/runs/runs.go +56 −4
  • internal/runs/runs_test.go +5 −5
  • internal/svcrole/svcrole.go +39 −4
  • internal/svcrole/svcrole_test.go +104 −0
  • run.go +77 −7
  • run_test.go +197 −0
  • services.go +39 −10
  • services_cli_test.go +98 −8

CI passed — run details

CI log
=== gate ===
.amadan/test-gate.sh
=== launchctx (1 s)
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]
=== vet (19 s)
=== gofmt (1 s)
gofmt -l .: clean
=== rest (178 s)
?   	github.com/carlosframework/platform/cmd/changelog	[no test files]
ok  	github.com/carlosframework/platform/cmd/console	4.024s
ok  	github.com/carlosframework/platform/cmd/moveprobe	11.770s
ok  	github.com/carlosframework/platform/cmd/zddprobe	0.777s
ok  	github.com/carlosframework/platform/internal/activator	58.113s
ok  	github.com/carlosframework/platform/internal/agentsock	0.021s
ok  	github.com/carlosframework/platform/internal/alerting	0.008s
ok  	github.com/carlosframework/platform/internal/analytics	0.020s
ok  	github.com/carlosframework/platform/internal/appconfig	2.960s
ok  	github.com/carlosframework/platform/internal/apperr	0.113s
ok  	github.com/carlosframework/platform/internal/applog	0.204s
ok  	github.com/carlosframework/platform/internal/assetcache	0.118s
ok  	github.com/carlosframework/platform/internal/awsinv	0.007s
ok  	github.com/carlosframework/platform/internal/boxchoice	0.005s
ok  	github.com/carlosframework/platform/internal/boxid	0.920s
?   	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.010s
ok  	github.com/carlosframework/platform/internal/caps	0.016s
ok  	github.com/carlosframework/platform/internal/certwarm	0.004s
ok  	github.com/carlosframework/platform/internal/cgroup	0.829s
ok  	github.com/carlosframework/platform/internal/changelog	0.469s
ok  	github.com/carlosframework/platform/internal/claimactivation	1.201s
ok  	github.com/carlosframework/platform/internal/clamd	0.061s
?   	github.com/carlosframework/platform/internal/cliflag	[no test files]
?   	github.com/carlosframework/platform/internal/controlname	[no test files]
?   	github.com/carlosframework/platform/internal/controlsock	[no test files]
ok  	github.com/carlosframework/platform/internal/dbdoor	7.585s
ok  	github.com/carlosframework/platform/internal/dbdoor/dbdoortest	0.013s
ok  	github.com/carlosframework/platform/internal/dbquery	0.007s
ok  	github.com/carlosframework/platform/internal/dbreads	2.114s
?   	github.com/carlosframework/platform/internal/dbreads/dbreadstest	[no test files]
ok  	github.com/carlosframework/platform/internal/dbverify	0.007s
ok  	github.com/carlosframework/platform/internal/dnsrec	0.003s
ok  	github.com/carlosframework/platform/internal/docsite	0.008s
ok  	github.com/carlosframework/platform/internal/domains	2.922s
ok  	github.com/carlosframework/platform/internal/doorkey	0.007s
ok  	github.com/carlosframework/platform/internal/economics	0.004s
ok  	github.com/carlosframework/platform/internal/edge	45.870s
?   	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.135s
ok  	github.com/carlosframework/platform/internal/gate	1.658s
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.029s
ok  	github.com/carlosframework/platform/internal/historyreadback	0.155s
ok  	github.com/carlosframework/platform/internal/host	147.891s
ok  	github.com/carlosframework/platform/internal/hostactors	6.378s
ok  	github.com/carlosframework/platform/internal/hostactors/awsmembership	0.007s
ok  	github.com/carlosframework/platform/internal/hostbox	3.094s
ok  	github.com/carlosframework/platform/internal/hostclaim	0.721s
ok  	github.com/carlosframework/platform/internal/hostenv	0.009s
ok  	github.com/carlosframework/platform/internal/hostevidence	0.012s
ok  	github.com/carlosframework/platform/internal/hostexec	5.526s
ok  	github.com/carlosframework/platform/internal/hostfence	0.032s
ok  	github.com/carlosframework/platform/internal/hostfiles	10.305s
ok  	github.com/carlosframework/platform/internal/hostfloor	0.017s
ok  	github.com/carlosframework/platform/internal/hostguard	1.077s
ok  	github.com/carlosframework/platform/internal/hostops	2.039s
?   	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.672s
ok  	github.com/carlosframework/platform/internal/hostresolve	0.163s
ok  	github.com/carlosframework/platform/internal/hostwrite	0.003s
ok  	github.com/carlosframework/platform/internal/infraview	0.002s
ok  	github.com/carlosframework/platform/internal/instancectl	5.255s
ok  	github.com/carlosframework/platform/internal/instanceexec	2.787s
ok  	github.com/carlosframework/platform/internal/instancefs	0.005s
ok  	github.com/carlosframework/platform/internal/instancekey	0.005s
ok  	github.com/carlosframework/platform/internal/instanceupdates	0.021s
ok  	github.com/carlosframework/platform/internal/layout	1.825s
ok  	github.com/carlosframework/platform/internal/lbhealth	0.008s
ok  	github.com/carlosframework/platform/internal/lease	10.114s
ok  	github.com/carlosframework/platform/internal/lease/leasetest	0.550s
ok  	github.com/carlosframework/platform/internal/ledger	0.017s
ok  	github.com/carlosframework/platform/internal/mail	0.244s
ok  	github.com/carlosframework/platform/internal/maintenance	0.089s
ok  	github.com/carlosframework/platform/internal/maintenanceexec	5.587s
ok  	github.com/carlosframework/platform/internal/maintenanceguard	0.091s
ok  	github.com/carlosframework/platform/internal/metrics	0.010s
ok  	github.com/carlosframework/platform/internal/moves	22.482s
ok  	github.com/carlosframework/platform/internal/moves/archive	1.094s
ok  	github.com/carlosframework/platform/internal/objstore	0.303s
ok  	github.com/carlosframework/platform/internal/ops	0.260s
ok  	github.com/carlosframework/platform/internal/park	0.284s
ok  	github.com/carlosframework/platform/internal/plans	0.009s
ok  	github.com/carlosframework/platform/internal/privatefile	0.010s
ok  	github.com/carlosframework/platform/internal/provision	24.769s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.008s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	5.760s
ok  	github.com/carlosframework/platform/internal/relay	7.228s
ok  	github.com/carlosframework/platform/internal/release	26.005s
ok  	github.com/carlosframework/platform/internal/rollout	3.877s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.004s
ok  	github.com/carlosframework/platform/internal/rootaws	0.011s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.062s
ok  	github.com/carlosframework/platform/internal/rootstate	0.027s
ok  	github.com/carlosframework/platform/internal/runs	0.641s
ok  	github.com/carlosframework/platform/internal/s3compat	0.005s
ok  	github.com/carlosframework/platform/internal/safefile	0.005s
ok  	github.com/carlosframework/platform/internal/schedule	2.716s
ok  	github.com/carlosframework/platform/internal/seeds	0.012s
ok  	github.com/carlosframework/platform/internal/sim/engines	2.702s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	11.846s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	3.896s
ok  	github.com/carlosframework/platform/internal/status	0.076s
ok  	github.com/carlosframework/platform/internal/steering	0.007s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.274s
ok  	github.com/carlosframework/platform/internal/svcrole	0.002s
ok  	github.com/carlosframework/platform/internal/telemetry	0.005s
ok  	github.com/carlosframework/platform/internal/termfence	0.004s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.005s
ok  	github.com/carlosframework/platform/internal/unixdial	0.004s
ok  	github.com/carlosframework/platform/internal/updatewords	0.005s
ok  	github.com/carlosframework/platform/internal/usage	0.005s
ok  	github.com/carlosframework/platform/internal/version	0.002s
ok  	github.com/carlosframework/platform/internal/vet	1.709s
=== internal_console@0 (84 s)
ok  	github.com/carlosframework/platform/internal/console	82.249s
=== internal_console@1 (42 s)
ok  	github.com/carlosframework/platform/internal/console	40.047s
=== internal_console@2 (44 s)
ok  	github.com/carlosframework/platform/internal/console	42.415s
=== internal_console@3 (46 s)
ok  	github.com/carlosframework/platform/internal/console	44.887s
=== internal_console@4 (43 s)
ok  	github.com/carlosframework/platform/internal/console	41.596s
=== internal_console@5 (39 s)
ok  	github.com/carlosframework/platform/internal/console	37.621s
=== internal_console@6 (44 s)
ok  	github.com/carlosframework/platform/internal/console	42.504s
=== internal_console@7 (47 s)
ok  	github.com/carlosframework/platform/internal/console	45.879s
=== root@0 (111 s)
ok  	github.com/carlosframework/platform	109.201s
=== root@1 (98 s)
ok  	github.com/carlosframework/platform	96.331s
=== root@2 (79 s)
ok  	github.com/carlosframework/platform	77.136s
=== 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: 50659490 bytes (ceiling 52000000)
--- shard 3 of 5 ---
cross-compiling windows/amd64
--- shard 4 of 5 ---
cross-compiling windows/arm64
=== minio-contract ===
minio contract: arm64, minio RELEASE.2025-09-07T16-13-09Z, mc RELEASE.2025-08-13T08-35-41Z
  minio: downloading https://github.com/minio/minio/releases/download/RELEASE.2025-09-07T16-13-09Z/minio.linux-arm64.RELEASE.2025-09-07T16-13-09Z
  minio: downloaded, digest verified
  mc: downloading https://github.com/minio/mc/releases/download/RELEASE.2025-08-13T08-35-41Z/mc.linux-arm64.RELEASE.2025-08-13T08-35-41Z
  mc: downloaded, digest verified
  minio healthy on 127.0.0.1:20999
Added `local` successfully.
Bucket created successfully `local/contract-bucket`.
Bucket created successfully `local/denied-bucket`.
Created policy `contract-only` successfully.
Added user `scopeduser` successfully.
Attached Policies: [contract-only]
To User: scopeduser
  buckets and scoped user ready
=== RUN   TestDeliveredContractMinio
=== RUN   TestDeliveredContractMinio/put
=== RUN   TestDeliveredContractMinio/get_round-trips_the_body
=== RUN   TestDeliveredContractMinio/list_shows_the_key
=== RUN   TestDeliveredContractMinio/head_and_list_agree_on_the_version
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict
=== RUN   TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed
=== RUN   TestDeliveredContractMinio/delete_removes_it
=== RUN   TestDeliveredContractMinio/cross-bucket_denial
--- PASS: TestDeliveredContractMinio (0.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.023s
=== RUN   TestT4StorageProbeMinio
2026/10/24 21:44:16 moves: T4: STORE: list: operation error S3: ListObjectsV2, https response error StatusCode: 403, RequestID: 18E1954682F48B01, HostID: 7c420053e0fbcd7f41653fdd92ffa2802c903d05303b1aa15adc2e8bb65d183f, api error SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
--- PASS: TestT4StorageProbeMinio (0.01s)
PASS
ok  	github.com/carlosframework/platform/internal/host	0.023s
=== RUN   TestS3StoreMinioContract
=== RUN   TestS3StoreMinioContract/conditional_get_and_etag_listing
=== RUN   TestS3StoreMinioContract/bump_through_every_mutation_path
--- PASS: TestS3StoreMinioContract (0.03s)
    --- PASS: TestS3StoreMinioContract/conditional_get_and_etag_listing (0.01s)
    --- PASS: TestS3StoreMinioContract/bump_through_every_mutation_path (0.02s)
PASS
ok  	github.com/carlosframework/platform/internal/release	0.031s
Bucket created successfully `local/dbf-deploy`.
Bucket created successfully `local/dbf-data-ie`.
Bucket created successfully `local/dbf-data-uk`.
local/dbf-deploy versioning is enabled
Created policy `dbf-console` successfully.
Created policy `dbf-ukbox` successfully.
Added user `dbfconsole` successfully.
Added user `dbfukbox` successfully.
Attached Policies: [dbf-console]
To User: dbfconsole
Attached Policies: [dbf-ukbox]
To User: dbfukbox
=== RUN   TestDBForwardMinio
2026/10/24 21:44:19 INFO replica sync system=store db=source.db replica=file txid.replica=0000000000000000 txid.db=0000000000000001
2026/10/24 21:44:19 INFO ltx file uploaded system=store db=source.db replica=file level=0 minTXID=0000000000000001 maxTXID=0000000000000001 size=720
2026/10/24 21:44:19 INFO replica sync system=store db=source.db replica=file txid.replica=0000000000000001 txid.db=0000000000000001
2026/10/24 21:44:19 INFO replica sync system=store db=source.db replica=file txid.replica=0000000000000001 txid.db=0000000000000002
2026/10/24 21:44:19 INFO ltx file uploaded system=store db=source.db replica=file level=0 minTXID=0000000000000002 maxTXID=0000000000000002 size=370
2026/10/24 21:44:19 INFO replica sync system=store db=source.db replica=file txid.replica=0000000000000002 txid.db=0000000000000002
2026/10/24 21:44:19 INFO replica sync system=store db=source.db replica=file txid.replica=0000000000000002 txid.db=0000000000000003
2026/10/24 21:44:19 INFO ltx file uploaded system=store db=source.db replica=file level=0 minTXID=0000000000000003 maxTXID=0000000000000003 size=454
2026/10/24 21:44:19 INFO replica sync system=store db=source.db replica=file txid.replica=0000000000000003 txid.db=0000000000000003
2026/10/24 21:44:19 INFO replica sync system=store db=source.db replica=file txid.replica=0000000000000000 txid.db=0000000000000001
2026/10/24 21:44:19 INFO ltx file uploaded system=store db=source.db replica=file level=0 minTXID=0000000000000001 maxTXID=0000000000000001 size=720
2026/10/24 21:44:19 INFO replica sync system=store db=source.db replica=file txid.replica=0000000000000001 txid.db=0000000000000001
2026/10/24 21:44:19 console: CARLOS_SECRETS_PUBKEY is unset, so no region outside the home can be chosen automatically
2026/10/24 21:44:19 console: could not notify member@example.com of a CLI token issue: keymail: lookup member@example.com: keymail: GET /api/federation/lookup?addr=member%40example.com&from=console%40127.0.0.1%3A39131: could not determine target mailbox
    agent.go:135: dbreads: dbr_2p7wp2pvsrn2ero3l2qij7sgea: planned 3 files (1544 bytes) and restored to 3 in 10ms
    agent.go:135: dbreads: dbr_2p7wp2pvsrn2ero3l2qij7sgea: output 5 bytes in 1 confirmed chunks in 1ms
2026/10/24 21:44:20 console: db read dbr_2p7wp2pvsrn2ero3l2qij7sgea: relayed 1 chunks (102 bytes) in 1.004s, ended done
    agent.go:135: dbreads: dbr_qq3cjueylh5uf7hzygwjmij764: planned 1 files (720 bytes) and restored to 1 in 8ms
    agent.go:135: dbreads: dbr_qq3cjueylh5uf7hzygwjmij764: output 5 bytes in 1 confirmed chunks in 1ms
2026/10/24 21:44:21 console: db read dbr_qq3cjueylh5uf7hzygwjmij764: relayed 1 chunks (102 bytes) in 1.003s, ended done
    agent.go:135: dbreads: dbr_rf5rpuiha6pgvdzwgka25vihqi: planned 3 files (1544 bytes) and held through 3 in 9ms
    agent.go:135: dbreads: dbr_rf5rpuiha6pgvdzwgka25vihqi: output 1544 bytes in 1 confirmed chunks in 1ms
2026/10/24 21:44:22 console: db read dbr_rf5rpuiha6pgvdzwgka25vihqi: relayed 1 chunks (1641 bytes) in 1.004s, ended done
=== RUN   TestDBForwardMinio/by_disconnect
=== NAME  TestDBForwardMinio
    agent.go:135: dbreads: dbr_c44syfsi3spogq2byr3r5coauq: planned 3 files (1544 bytes) and restored to 3 in 9ms
2026/10/24 21:44:22 console: db read dbr_c44syfsi3spogq2byr3r5coauq: relayed 0 chunks (0 bytes) in 17ms, ended client gone
    agent.go:135: dbreads: dbr_c44syfsi3spogq2byr3r5coauq: output 5 bytes in 1 confirmed chunks in 103ms
=== RUN   TestDBForwardMinio/by_timeout
=== NAME  TestDBForwardMinio
    agent.go:135: dbreads: dbr_vrdpbcbsn44lz2maekbfxheewi: planned 3 files (1544 bytes) and restored to 3 in 9ms
2026/10/24 21:44:42 console: db read dbr_vrdpbcbsn44lz2maekbfxheewi: relayed 0 chunks (0 bytes) in 19.51s, ended no-result
    agent.go:135: dbreads: dbr_vrdpbcbsn44lz2maekbfxheewi: output 5 bytes in 1 confirmed chunks in 19.486s
--- PASS: TestDBForwardMinio (22.94s)
    --- PASS: TestDBForwardMinio/by_disconnect (0.22s)
    --- PASS: TestDBForwardMinio/by_timeout (19.62s)
PASS
ok  	github.com/carlosframework/platform/internal/console	22.965s
minio contract: PASS
apimode.go

Loading diff…

auth.go

Loading diff…

cmd/console/main.go

Loading diff…

docs/site/cli.md

Loading diff…

docs/superpowers/notes/census-proposal-pro-6214-service-runs.md

Loading diff…

docs/superpowers/plans/2026-10-24-service-runs.md

Loading diff…

docs/superpowers/specs/2026-10-08-carlos-run-design.md

Loading diff…

docs/superpowers/specs/2026-10-24-service-runs-design.md

Loading diff…

internal/console/apiruns.go

Loading diff…

internal/console/apiruns_key_test.go

Loading diff…

internal/console/apiruns_service_test.go

Loading diff…

internal/console/apirunsfollow.go

Loading diff…

internal/console/apiservices.go

Loading diff…

internal/console/authcli.go

Loading diff…

internal/console/authstore.go

Loading diff…

internal/console/claim_invariant_fixtures_test.go

Loading diff…

internal/console/deploycred_test.go

Loading diff…

internal/console/deploydoors_test.go

Loading diff…

internal/console/deploymixed_test.go

Loading diff…

internal/console/deployscope_test.go

Loading diff…

internal/console/deploysign_test.go

Loading diff…

internal/console/server.go

Loading diff…

internal/console/svcpage.go

Loading diff…

internal/console/svcprincipal.go

Loading diff…

internal/console/svcprincipal_run_test.go

Loading diff…

internal/console/svcroutes_test.go

Loading diff…

internal/console/templates/account_settings.html

Loading diff…

internal/console/testdata/claim-routes.txt

Loading diff…

internal/host/runevents.go

Loading diff…

internal/host/runevents_service_test.go

Loading diff…

internal/provision/plan9_b8_census_test.go

Loading diff…

internal/provision/provision.go

Loading diff…

internal/provision/run.go

Loading diff…

internal/provision/run_keys_test.go

Loading diff…

internal/provision/service_runs_census_test.go

Loading diff…

internal/provision/testdata/plan14-root-reads-chain.tsv

Loading diff…

internal/provision/testdata/plan14-root-reads-pro-6214-service-runs-decisions.tsv

Loading diff…

internal/provision/testdata/plan14-root-reads-pro-6214-service-runs.tsv

Loading diff…

internal/runs/commands.go

Loading diff…

internal/runs/commands_test.go

Loading diff…

internal/runs/keys.go

Loading diff…

internal/runs/keys_test.go

Loading diff…

internal/runs/runs.go

Loading diff…

internal/runs/runs_test.go

Loading diff…

internal/svcrole/svcrole.go

Loading diff…

internal/svcrole/svcrole_test.go

Loading diff…

run.go

Loading diff…

run_test.go

Loading diff…

services.go

Loading diff…

services_cli_test.go

Loading diff…