carlos / platform Public

docs: the gzip verify command needs a GET, not curl -I

curl -I sends a HEAD, and HEAD is deliberately excluded from edge
compression — so the verification command in the roll note could never
show the feature working however correct the deploy was. Found on the
2026-08-19 roll, where it read as a failed deploy for a minute.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NoqzkUVahW5ykubsBQitxc
Paul Campbell ac2d5801c4c8a44428e3ebaeedc4ae91bb871003 parent 09e6b5e
2 files changed, +15 −3
  • CLAUDE.md +3 −1
  • docs/superpowers/plans/2026-08-18-edge-response-compression.md +12 −2
diff --git a/CLAUDE.md b/CLAUDE.md
index 170c321a7..9fa6ab4a3 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -164,7 +164,9 @@ read as a single piece rather than commit by commit.
update-platform-binary.sh does it). `carlos deploy` is the member one-command
form: ship → promote → wait until `X-Carlos-Version` on the URL reports the
shipped build over 2xx. Verify deploys with that header (`curl -sI
- --resolve`), never a cached answer.
+ --resolve`), never a cached answer. `-I` is fine for the VERSION header, but
+ it sends a HEAD — and HEAD is excluded from edge compression, so anything
+ about `Content-Encoding` needs a GET (`curl -s -D - -o /tmp/b`) instead.
- **Console restarts: manual until the route is unit-stamped** (#110, fixed
in main 916cd6b, not yet rolled). Routes can now name the systemd unit that
owns their process (`carlos route -registry /data/registry.db -host
diff --git a/docs/superpowers/plans/2026-08-18-edge-response-compression.md b/docs/superpowers/plans/2026-08-18-edge-response-compression.md
index 06dda8858..202a42ea8 100644
--- a/docs/superpowers/plans/2026-08-18-edge-response-compression.md
+++ b/docs/superpowers/plans/2026-08-18-edge-response-compression.md
@@ -1447,10 +1447,20 @@ that a platform roll performs. Verify on a real host with the header, against
the box, not a cached answer:
```bash
-curl -sI -H 'Accept-Encoding: gzip' --resolve <host>:443:<box-ip> https://<host>/<asset.css> \
+# -D - (headers to stdout) with a GET body, NOT -I: curl -I sends a HEAD, and
+# HEAD is deliberately excluded from compression, so -I can never show this
+# working however correct the deploy is. This cost a confused minute on the
+# 2026-08-19 roll.
+curl -s -D - -o /tmp/body.gz -H 'Accept-Encoding: gzip' \
+ --resolve <host>:443:<box-ip> https://<host>/ \
| grep -iE 'content-encoding|vary|x-carlos-version'
+
+# and the identity half, from the same URL
+curl -s -o /tmp/body.id --resolve <host>:443:<box-ip> https://<host>/
+gunzip -c /tmp/body.gz | cmp - /tmp/body.id && echo "decompresses byte-identical"
```
Expect `content-encoding: gzip`, a `vary` naming `Accept-Encoding`, and the
`X-Carlos-Version` of the build you just rolled. A request without the
-`Accept-Encoding` header must come back identity from the same URL.
+`Accept-Encoding` header must come back identity from the same URL, and the
+compressed body must decompress to exactly those identity bytes.