Skip to content

Split the post-deploy smoke probe by what each half can prove - #113

Merged
stiebitzhofer merged 1 commit into
mainfrom
smoke-probe-split
Sep 13, 2026
Merged

stiebitzhofer merged 1 commit into
mainfrom
smoke-probe-split

Conversation

@stiebitzhofer

Copy link
Copy Markdown
Member

Summary

The post-deploy smoke step from #111 turned every deploy on main red. Fixing my own breakage.

From the runner, the two paths the step exists to guard passed; the two canaries did not:

path result
/ 403 (10 retries, ~100s)
/feed.xml 403 (10 retries, ~100s)
/.well-known/security.txt 200
/.well-known/pgp-security.asc 200

Cause: Cloudflare bot protection blocks the runner's datacenter IP on ordinary paths and exempts /.well-known/ by design, so ACME and security.txt keep working. Exactly the paths we care about got through. Not a site fault — verified simultaneously that the Pages origin serves all four, and that both canary paths return 200 from a residential IP.

Fix

Split the probe by what each half can actually prove:

Dropping the canaries is not a weakening. They existed to distinguish "site is down" from "well-known is missing", and a 200 from /.well-known/security.txt on that same host already settles the first. The origin half covers both paths for completeness.

Rejected: a Cloudflare WAF skip rule for GitHub's IP ranges. A manual console change (Manual-Setup-Checklist.md territory) that widens the site's exposure to make a test convenient, covering ground the origin probe already covers.

Closes #112

Test plan

  • deploy.yml parses; both steps present in order
  • Origin loop run locally against the live origin — all four 200, fail=0
  • Content-type function run locally under bash -e (the shell Actions uses) against the live site — both types match, and a deliberately missing path correctly yields fail=1 rather than passing silently or aborting the step
  • After merge: the deploy run must go green — that is the actual verification

The step added in #111 turned every deploy on main red. From the runner, the two
/.well-known/ paths returned 200 — the fix it was written to guard works — but
the / and /feed.xml canaries 403'd through ten retries each.

Cloudflare bot protection blocks the runner's datacenter IP on ordinary paths
and exempts /.well-known/ by design, so ACME and security.txt keep working.
Exactly the paths we care about got through; the canaries could not. Not a site
fault: the origin serves all four, and both canary paths return 200 from a
residential IP.

So the probe splits:

- the origin, all paths, for artifact completeness — no bot protection in front
  of it, and this is the #110 class (a directory silently missing from the
  artifact) generalized past the two files that happened to expose it
- the canonical host, /.well-known/ only, for the Worker's rewrite — the
  reachable subset, now asserting content types rather than status, since
  text/plain and application/pgp-keys ARE the requirement from #107 and #109
  and a 200 with the wrong type is still a regression

Dropping the canaries is not a weakening: they existed to show the site was up,
and a 200 from /.well-known/security.txt on that same host already shows it.

Rejected a Cloudflare WAF skip rule for GitHub's IP ranges — a manual console
change that widens the site's exposure to make a test convenient, covering
ground the origin probe already covers.

Closes #112
@stiebitzhofer
stiebitzhofer merged commit 7588039 into main Sep 13, 2026
2 checks passed
@stiebitzhofer
stiebitzhofer deleted the smoke-probe-split branch September 13, 2026 22:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Post-deploy smoke step fails on main: Cloudflare blocks the runner on non-.well-known paths

1 participant