You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
deploy-docs.yml has never published this site. It pushes the build to gh-pages — and for three months everyone, including me, read that as "the docs
deployed".
docs.conduction.nl is served by the Cloudflare Worker conduction-docs
(Workers Static Assets), the same pattern as the ~33 other *.conduction.nl
docs sites. That Worker was deployed from Forgejo
(.forgejo/workflows/documentation-deploy.yml). When Forgejo was retired the
deploy stopped and the Worker froze at its 2026-06-01 build.
Three green lights over a site three months stale. The gap was never visible
because nothing measured whether the bytes reached the public host.
What this adds
A publish-worker job that deploys the gh-pages build to the Worker, with two
deliberate choices:
A missing secret FAILS, it does not skip. A skipped publish is precisely the
silence that hid this: the workflow goes green while the live site quietly stops
tracking main. Red here means "the docs did not reach the public site", which
is the truth worth reporting.
The last step round-trips the bytes. It compares an md5 of the index.html
just published against what https://docs.conduction.nl/ actually serves, and
fails if they differ. HTTP 200 is not evidence — the stale Worker answered 200
for months.
Required before this can go green
Two repo secrets, neither of which currently exists here (the repo holds only ALGOLIA_CRAWLER_ID / ALGOLIA_CRAWLER_SECRET, and total_count for
org-visible secrets is 0):
CF_API_TOKEN — Cloudflare API token scoped to Account → Workers Scripts → Edit
CF_ACCOUNT_ID — a2d03dfcc6758e48447baee66d7a8fa5
Until they are added this job fails with an explicit annotation naming the
missing secrets. That is intended: the failure already existed, it simply
had no way to announce itself.
Note on the current state
The site is live and current right now — I deployed this build to the Worker by
hand to verify the procedure end to end (app-health 200, 61,600 bytes, and a
page that exists only in the new build also 200). This PR is what stops it going
stale again on the next docs commit.
Finding a Worker-backed hostname
For anyone who hits this next: GET /accounts/{id}/workers/domains. Worker
custom domains do not appear under zones/{id}/workers/routes — checking
routes and seeing nothing is what led me to exclude Workers for an hour.
Restructured after review of what this gate should actually assert.
Before: the job failed when CF_API_TOKEN / CF_ACCOUNT_ID were absent.
That alarms on configuration, which is a proxy for the real defect and would
have put this repo into a red state it could not clear without a new credential.
Now: the job asserts "the public host serves what we just built" — an
md5 of the published index.html against https://docs.conduction.nl/ — and
fails only on drift.
That distinction is the entire lesson of the three-month outage. gh-pages was
updating, GitHub Pages reported the domain verified, and the URL answered 200.
All three were true while the site was stale. Only a byte comparison against the
live host could see it.
Behaviour:
Credentials
Site state
Result
absent
already current
pass — nothing to do, nothing to alarm about
absent
stale after a docs change
fail, naming the two secrets to add
present
any
deploys, then verifies the bytes landed
Verified against production as it stands: the built index.html and the live
homepage are the same object (a154356d873f), so this gate passes today rather
than importing a red state.
The deploy step is skipped rather than failed when credentials are missing —
but the skip cannot hide anything, because the verification step runs
unconditionally and is what decides the job.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
deploy-docs.ymlhas never published this site. It pushes the build togh-pages— and for three months everyone, including me, read that as "the docsdeployed".
docs.conduction.nl is served by the Cloudflare Worker
conduction-docs(Workers Static Assets), the same pattern as the ~33 other
*.conduction.nldocs sites. That Worker was deployed from Forgejo
(
.forgejo/workflows/documentation-deploy.yml). When Forgejo was retired thedeploy stopped and the Worker froze at its 2026-06-01 build.
Why nothing reported it
Every instrument said fine:
gh-pagesbranchcname: docs.conduction.nl,protected_domain_state: verifiedThree green lights over a site three months stale. The gap was never visible
because nothing measured whether the bytes reached the public host.
What this adds
A
publish-workerjob that deploys thegh-pagesbuild to the Worker, with twodeliberate choices:
A missing secret FAILS, it does not skip. A skipped publish is precisely the
silence that hid this: the workflow goes green while the live site quietly stops
tracking
main. Red here means "the docs did not reach the public site", whichis the truth worth reporting.
The last step round-trips the bytes. It compares an md5 of the
index.htmljust published against what
https://docs.conduction.nl/actually serves, andfails if they differ. HTTP 200 is not evidence — the stale Worker answered 200
for months.
Required before this can go green
Two repo secrets, neither of which currently exists here (the repo holds only
ALGOLIA_CRAWLER_ID/ALGOLIA_CRAWLER_SECRET, andtotal_countfororg-visible secrets is 0):
CF_API_TOKEN— Cloudflare API token scoped to Account → Workers Scripts → EditCF_ACCOUNT_ID—a2d03dfcc6758e48447baee66d7a8fa5Until they are added this job fails with an explicit annotation naming the
missing secrets. That is intended: the failure already existed, it simply
had no way to announce itself.
Note on the current state
The site is live and current right now — I deployed this build to the Worker by
hand to verify the procedure end to end (
app-health200, 61,600 bytes, and apage that exists only in the new build also 200). This PR is what stops it going
stale again on the next docs commit.
Finding a Worker-backed hostname
For anyone who hits this next:
GET /accounts/{id}/workers/domains. Workercustom domains do not appear under
zones/{id}/workers/routes— checkingroutes and seeing nothing is what led me to exclude Workers for an hour.