carlos / platform Public

spec: Astra review brief for the deploy credential

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev d30a74c25552e4a4871e6292d6f06d3374c5023f parent 34eb700
1 file changed, +74 −0
  • docs/superpowers/specs/CODEX-REVIEW-BRIEF-DEPLOY-CREDENTIAL.md +74 −0

CI passed — run details

diff --git a/docs/superpowers/specs/CODEX-REVIEW-BRIEF-DEPLOY-CREDENTIAL.md b/docs/superpowers/specs/CODEX-REVIEW-BRIEF-DEPLOY-CREDENTIAL.md
new file mode 100644
index 000000000..2d0cb9d67
--- /dev/null
+++ b/docs/superpowers/specs/CODEX-REVIEW-BRIEF-DEPLOY-CREDENTIAL.md
@@ -0,0 +1,74 @@
+# Review brief: the deploy credential spec
+
+You are Astra reviewing a design spec independently of its author. Your
+output is a findings report, not an edit. Do not modify any file.
+
+## What to read
+
+1. The spec under review:
+ `docs/superpowers/specs/2026-10-05-deploy-credential-design.md`.
+ §3's rulings R1 to R4 are fixed. Report a mechanism that fails one. Do
+ not re-argue one.
+2. The code it fits into, in this worktree:
+ - `internal/svcrole/svcrole.go` (roles, `Allow`, `Permits`);
+ - `internal/console/authcli.go` (`cliRoute` near 411, the route table
+ from 470 to 740, how a principal is resolved from a bearer token);
+ - `internal/console/svcprincipal.go` (`Principal`,
+ `NewServicePrincipal`, rotate, revoke) and
+ `internal/console/authstore.go` (the `cli_tokens` schema near 183 to
+ 255);
+ - `internal/console/apicli.go` (`apiAccountAppBy` near 58,
+ `handleAPIPromote` near 701, `handleAPIRollback` near 970,
+ `handleAPIShip` near 1569);
+ - `internal/console/controlplane.go` (`refuseServiceControlPlane`);
+ - `internal/console/apiservices.go` and `internal/console/svcpage.go`
+ (the two mint doors);
+ - `internal/release/ladder.go`, `grant.go`, `signer.go`, `pipeline.go`,
+ `serial.go`;
+ - the CLI at the repo root: `apimode.go` (`resolveMode`), `auth.go`,
+ `services.go`, `canary.go`, and the promote, rollback and ship verbs
+ in `cli.go`;
+ - `README.md` lines 100 to 185, and `docs/site/cli.md` around 1319 to
+ 1440.
+
+## What matters most
+
+- **Escapes from the rung scope.** Look for any way a `deploy` credential
+ moves a pointer outside its rungs: a channel name `release.Rung` maps
+ unexpectedly, the proposal path, a pending approval it can create or
+ execute, rollback's own paths, the hotfix flag, a pipelined app whose
+ pipeline names a rung, a version-target or tag door, or any other door
+ on the §6 list that writes more than the spec says. Check §7.1's order
+ and §7.2's placement against the handlers as written.
+- **Doors.** Is §6's list complete for `carlos ship`, `promote`,
+ `rollback` and `channels` in API mode as the CLI actually calls them?
+ Does any door on the list expose or change more than a deploy pipeline
+ needs? Is anything missing that makes the CLI fail?
+- **Mint and read-back (§5).** Can either mint door bypass the rules? Can
+ rotate, or any other write to `cli_tokens`, produce a `deploy` row with
+ no rungs or a non-`deploy` row with rungs? Is fail-closed at resolve
+ achievable where the spec puts it?
+- **Mixed versions (§9).** Is "an old console refuses an unknown role at
+ every door" true of `cliRoute` as written? Is there any path that
+ resolves a service token without going through `cliRoute`, or treats an
+ unknown role as something permissive?
+- **The CLI in CI (§8).** Does reading `CARLOS_SERVICE_TOKEN` in
+ `resolveMode` collide with anything: the in-instance variable of the
+ same name, box-side callers, `carlos auth` verbs, the `--owner` path?
+ Is the refusal beside a store variable consistent with the existing
+ `--console` ruling?
+- **§7.4's trade.** The limit moves from a grant every box verifies to a
+ check in the console. Is the exposure stated honestly? Is there a cheap
+ way to keep a box-side check that the spec missed, without breaking R3
+ or R4?
+- **Claims about the code.** Every `file:line` and every "already does"
+ claim: check it at this commit. Report each one that is wrong.
+
+## How to report
+
+Number findings R1-1 onward. For each: severity (P1 breaks a trust
+guarantee or makes the design unbuildable; P2 a contract or claim defect
+to fix before the plan; P3 advisory), the section, the problem, the
+evidence with citations, a proposed correction. End with a verdict:
+accept, accept with corrections, or request changes. Do not soften, do
+not pad, do not restate the spec.