docs: a scoped key constrains the direct path; memberships constrain the API path
Merge-resolution review F1/F5: record the mode-authority split in the scoped-keys spec and README so nobody believes a canary-only builder key limits what a console credential can promote.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2 files changed,
+11
−1
README.md+3 −1docs/superpowers/specs/2026-08-03-scoped-signing-keys-design.md+8 −0
diff --git a/README.md b/README.md| index 51136f1cc..e1aae8928 100644 |
| --- a/README.md |
| +++ b/README.md |
| @@ -126,7 +126,9 @@ refusal prints. |
| CI and operators keep the existing path unchanged: set |
| `CARLOS_DEPLOYMENT_BUCKET` (or `_DIR`) and every verb goes straight at the |
| bucket, exactly as before — logging in is for a human at a laptop, never a box |
| -or a pipeline. |
| +or a pipeline. Note the modes carry different authority: a scoped |
| +`CARLOS_RELEASE_KEY` constrains the direct path only — in API mode it is |
| +ignored and your console membership (plus the rung gates) is what decides. |
| **On a box, or in CI, don't log in.** There is no browser and no human, and a |
| long-lived token sitting on a box is a standing credential nobody is watching. |
diff --git a/docs/superpowers/specs/2026-08-03-scoped-signing-keys-design.md b/docs/superpowers/specs/2026-08-03-scoped-signing-keys-design.md| index 4b50a3dc9..8f45cbdf7 100644 |
| --- a/docs/superpowers/specs/2026-08-03-scoped-signing-keys-design.md |
| +++ b/docs/superpowers/specs/2026-08-03-scoped-signing-keys-design.md |
| @@ -107,6 +107,14 @@ holds. If that is a scoped seed, the accompanying `CARLOS_RELEASE_GRANT` |
| outside the grant fails LOCALLY with a clear error before any write — |
| matching the ladder's refusal style. |
| +That sentence is DIRECT-mode truth only. In the CLI's API mode (a stored |
| +`carlos auth login` credential and no store env — see the cli-console-api |
| +spec §1) a `CARLOS_RELEASE_KEY` in the environment is INERT: the console |
| +signs with the deployment's root key and authority is membership + the rung |
| +gate, so a "canary-only" scoped key on a laptop does not constrain what |
| +that laptop's console credential can promote. Scoped keys constrain the |
| +direct path; memberships constrain the API path. |
| + |
| ## 5. Verification surface |
| One function change: `verifyPointer` grows grant handling. Its callers — |