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
2 files changed,
+15
−3
CLAUDE.md+3 −1docs/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. |