carlos / platform Public

docs: carlos proof in the CLI page (H6, needs Paul's copy review)

TestCLICommandsAreDocumented requires a heading for every dispatched command, and proof had none. The section sits after release-keygen, in the usage order, with one example each for keygen, get and put. User-facing copy: not to merge before Paul's copy review.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 96e05e4ec1a01414b713e756d014b1200e3b9dd5 parent 303cc13
1 file changed, +39 −0
  • docs/site/cli.md +39 −0
diff --git a/docs/site/cli.md b/docs/site/cli.md
index f1c082b36..285e67361 100644
--- a/docs/site/cli.md
+++ b/docs/site/cli.md
@@ -1584,6 +1584,45 @@ a grant. The grant carries no secret material but has to travel with the key,
because a scoped key on its own signs pointers nothing will accept. Only the
root key can mint a grant, which is what stops a scoped key widening itself.
+### carlos proof
+
+Makes and carries the proofs a box can require before it adopts a build. A
+proof is signed by a proving deployment (dev, usually) and says it ran these
+exact bytes healthily. A box whose proof policy lists an app adopts a new
+build of it only with a proof, or when it has run those bytes well itself.
+
+```sh
+carlos proof keygen
+```
+
+`keygen` runs as root on the proving box. It writes a fresh signing key to
+`/etc/carlos/proving.key`, readable by root only (`--out` puts it somewhere
+else), and prints the public half. That public half goes into the `require`
+entry of each requiring box's `/etc/carlos/proof-policy.json`. It never
+overwrites a key that is already there.
+
+```sh
+carlos proof get --app console --sha256 <sha256> > proof.json
+```
+
+`get` reads a build's proof from the proving deployment's bucket and prints
+it. `--sha256` is the build's artifact hash. `--prover` picks whose proof,
+when there is more than one. When there is no proof yet, it says how long the
+build has been live on the proving box, if it has been seen there.
+
+```sh
+carlos proof put --app console proof.json
+```
+
+`put` writes that proof into the requiring deployment's bucket, where its
+boxes look for it. It checks the proof's shape but not its signature. The
+requiring box checks that against the key in its policy. Putting the same
+proof twice is fine. A different proof for the same build and prover is
+refused.
+
+`get` and `put` work only with `CARLOS_DEPLOYMENT_BUCKET` or
+`CARLOS_DEPLOYMENT_DIR` set, because a proof lives only in a bucket.
+
### carlos economics
Records one month's AWS bill so the console's economics dashboard has a real