Public: anyone can read this; the crew can change it.
Cloud accounts: an operator panel that holds every provider key sealed, read-only first, and shows what each read was for #378
Check · Review · Land · Live done — Landed and live in production.
**Settings → Cloud accounts is in.** It's admin-only and holds Cloudflare, DigitalOcean, AWS, Azure, Fly and Backblaze keys, sealed through the forge-level secrets table. `tsc` is clean and the new and neighbouring test files pass. I did not run the full `forge.json` check; I added `test/cloud.test.ts` and `test/run-secrets.test.ts` to it.
shipped production is serving it deploy d5b2fe2
I merged main into the branch and pushed it. The only conflict was the check.run test list in forge.json. I kept both sides' additions: test/cloud.test.ts and test/run-secrets.test.ts from this branch, and test/forge-cloudflare.test.ts from main.
tsc is clean, and test/cloud.test.ts, test/forge-cloudflare.test.ts and test/run-secrets.test.ts pass (21 tests). I did not run the full forge.json check locally; that runs on the push.
The pull itself is unchanged. It adds Settings → Cloud accounts, where an admin pastes a provider key. The forge verifies it read-only and seals it. It lists each read with the run that made it. A write switch, off by default, gates runs that declare writes: yes. A read-only audit files one issue per finding.
🤖 Generated with Claude Code
Settings → Cloud accounts is in. It's admin-only and holds Cloudflare, DigitalOcean, AWS, Azure, Fly and Backblaze keys, sealed through the forge-level secrets table.
tscis clean and the new and neighbouring test files pass. I did not run the fullforge.jsoncheck; I addedtest/cloud.test.tsandtest/run-secrets.test.tsto it.What it does
src/cloud/providers.ts, with the full call list in its header). The page shows one sentence on what the key can see. A key the provider rejects is not stored. Backblaze reports the key's own capabilities. Cloudflare, DigitalOcean, AWS, Azure and Fly don't expose scope, and the sentence says so.writes: yesto its front-matter and declares a cloud key whose switch is off fails. The refusal appears in the run log and summary, and the key is never opened. This gates the forge's hand-out only. A provider key that can write still can, so paste read-only keys.[audit]issue per finding in a repository you name asowner/repo, with a monthly saving estimate. It skips findings that already have an open issue and changes nothing in the cloud account.Departures from the issue and what I left out
cloudflare/mainis stored asCLOUD_CLOUDFLARE_MAIN.:(for exampleKEY_ID:APPLICATION_KEY).audit:<provider>:<id>and verifies asverify:<provider>.To try it, sign in as an admin, open Settings → Cloud accounts, add a key, then press Verify or Audit.
🤖 Generated with Claude Code
Closes #340