Static publishing removes application runtime complexity, but it does not remove the boundary between a generated directory and a public response. A release check should cover both.
Start from a clean artifact
Build with the pinned generator into a clean destination. Record the source commit, generator version, output file list, and checksums of files that users download. A clean build catches stale files that a copy-over deployment can accidentally preserve.
make verify
find public -type f -print | sort
The file list is evidence, not decoration. If a route disappears, the diff should explain whether the source was removed or the generator failed to emit it.
Exercise three response classes
Request one HTML page, one static resource, and one missing path. Inspect status, content type, cache policy, and security headers:
curl -fsS -D - -o /dev/null https://www.example.test/
curl -fsS -D - -o /dev/null https://www.example.test/downloads/check-http-headers.sh
curl -sS -D - -o /dev/null https://www.example.test/does-not-exist
The third command intentionally does not use -f: a 404 is the expected result and should still be captured. Compare the public body with the generated 404.html and verify that the status remains 404.
Keep rollback simple
Do not delete the previous directory until the new one has passed the checks. A rollback should select a known-good directory, not reconstruct one from memory during an incident. The release checklist and HTTP header check are deliberately small enough to run from a clean shell.
Sources
- RFC 9110 — HTTP Semantics, status and representation semantics, checked 2026-08-22.
- curl manual, response inspection options, checked 2026-08-22.
- Static-site release checklist, local companion resource.