Skip to content

Sync the Cloudflare redirect lists after deploys and cleanups - #158

Open
mithro wants to merge 8 commits into
mainfrom
redirects-sync-hooks
Open

mithro wants to merge 8 commits into
mainfrom
redirects-sync-hooks

Conversation

@mithro

@mithro mithro commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Site-side half of the Cloudflare redirects sync. The redirects sync Worker loads https://wafer.space/redirects.json (written by #157) and https://preview.wafer.space/redirects.json (written by #162) into Cloudflare Bulk Redirect lists, on a 5-minute cron. This PR calls the Worker straight after each deploy and preview cleanup, so a new list applies within a minute or two of the file being served, not after the next cron.

The Worker has three endpoints: GET /source (the revision of the file the site serves), GET /list (the revision the list holds) and POST /sync (load the file if it's newer, answering with what the list then holds).

  • Sync client. .github/scripts/redirects-sync.py --list … --from-file redirects.json (or --number/--commit) repeats until the list holds that revision or a newer one: check GET /list; wait while GET /source shows the site doesn't serve it yet (Pages publishing delay, caches); otherwise POST /sync, and stop if its answer shows the list at that revision or newer.
    • Timing: every unfinished round waits, backing off from 10 s to 60 s, until --timeout (10 minutes). Each request gets at most 30 s and never more than the time left, and the last round is made at the deadline.
    • Retried: dropped or reset connections, timeouts, 202/502/503, and answers that aren't the Worker's JSON.
    • Stops at once: HTTP 400, 401, 404, 405 or 409, a commit mismatch, or a redirect. Redirects aren't followed, so the secret only goes to REDIRECTS_SYNC_URL, which must be https://.
    • Revision item: it must name exactly the list's host, as the Worker requires.
    • Without REDIRECTS_SYNC_URL/REDIRECTS_SYNC_SECRET: it skips, as on fork PRs; with --require-secrets it fails instead.
    • User-Agent: it sends its own, as Cloudflare's Browser Integrity Check answers urllib's default with 403 "error code: 1010".
  • Production (jekyll.yml).
    • The build job reads the list's revision; if it can't, the site still deploys.
    • A new sync-redirects job after deploy syncs wafer_space with --require-secrets, and fails the run if it can't, as the site is then live with stale redirects until the cron loads them.
    • Being a job of its own, re-running a failed sync never re-publishes that run's possibly older site.
    • The pages concurrency group moves onto the deploy job, so a slow sync doesn't hold up the next deploy.
  • Previews. pr-preview.yml and cleanup-previews.yml sync preview_wafer_space with the redirects.json they pushed, without failing their jobs, since the cron catches up. In pr-preview.yml it runs after the deployment status and PR comment, and only on branches that have the script.

Testing

  • Unit tests: .github/scripts/test_redirects_sync.py runs the client against a local stand-in for the Worker with a fake clock, and the new Script tests workflow runs it. It covers:
    • an applied sync;
    • a /sync that loads nothing: it waits rather than spinning;
    • the site serving an older copy;
    • dropped connections and non-JSON answers, which are retried;
    • busy/pending answers;
    • answers that stop it at once;
    • redirects, which aren't followed (the other server gets no request);
    • per-request timeouts limited to the time left;
    • the argument checks.
  • Against the real Worker, on this PR's preview deploy for 698f648: the client waited while Pages served the previous file (revision 500), then POST /sync answered applied with the list at 513, and it stopped on that answer. An earlier deploy caught the User-Agent problem: 403 "error code: 1010" on every call.
  • Live files: --print-revision reads today's wafer.space and preview.wafer.space files with their own list and refuses each with the other's.
  • Independent review: an independent review found the issues fixed in 83f53f9 and 698f648. It also noted that one secret serves both lists and that same-repo PR authors can read it. That can't inject redirects, as the Worker only loads each site's own file, and those authors already get the preview and theme deploy keys.

Setup

Done: the Worker runs at https://redirects.wafer-space.workers.dev, and this repository has the variable REDIRECTS_SYNC_URL and secret REDIRECTS_SYNC_SECRET (set by the Worker repository's scripts/setup.py).

🤖 Generated with Claude Code

https://claude.ai/code/session_018aHXTpnku3VjT9FFpoBEuy

@mithro
mithro force-pushed the redirects-sync-hooks branch from e120ac7 to 844875a Compare October 24, 2026 07:30
@mithro
mithro force-pushed the redirects-sync-hooks branch from 844875a to be4d74e Compare October 24, 2026 08:21
Base automatically changed from redirects-list to main October 24, 2026 09:16
@mithro mithro closed this Oct 24, 2026
@mithro mithro reopened this Oct 24, 2026
@github-actions
github-actions Bot had a problem deploying to pr-preview-158 October 24, 2026 09:18 Failure
@github-actions
github-actions Bot had a problem deploying to pr-preview-158 October 24, 2026 09:25 Failure
@mithro
mithro force-pushed the redirects-sync-hooks branch from be4d74e to 7144867 Compare October 24, 2026 09:26
@github-actions
github-actions Bot had a problem deploying to pr-preview-158 October 24, 2026 09:29 Failure
@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

📋 Previous verification results (archived)

Click to view archived verification results from 2026-10-24T09:36:29.000Z

❌ Preview Site Verification FAILED

Preview Site Verification Report

PR: #158
URL: https://preview.wafer.space/pr-158/
Timestamp: Sat Oct 24 09:35:58 UTC 2026

1. Basic Connectivity ✅

  • ✅ Site is accessible
  • ✅ HTTP Status: 200

2. Content Verification

  • ✅ Site contains expected content
  • ✅ Tagline present
  • ✅ JavaScript baseurl configuration found

3. Multi-Page Asset Verification

Discovering all pages in the site...
Found pages: 7 discovered + homepage
Testing critical assets...

  • ✅ favicon.png
  • ✅ assets/css/style.css
  • ✅ assets/js/jquery.min.js
  • ✅ assets/images/logo-light.webp
    Checking assets across all pages...
    Processing page 1: homepage
  • ✅ bootstrap.min.css (homepage)
  • ✅ plugins.css (homepage)
  • ✅ settings.css (homepage)
  • ✅ layers.css (homepage)
  • ✅ navigation.css (homepage)
  • ✅ type.css (homepage)
  • ✅ style.css (homepage)
  • ✅ sky.css (homepage)
  • ✅ dark.css (homepage)
  • ✅ custom.css (homepage)
  • ✅ jquery.min.js (homepage)
  • ✅ popper.min.js (homepage)
  • ✅ bootstrap.min.js (homepage)
  • ✅ jquery.themepunch.tools.min.js (homepage)
  • ✅ jquery.themepunch.revolution.min.js (homepage)
  • ✅ revolution.extension.actions.min.js (homepage)
  • ✅ revolution.extension.carousel.min.js (homepage)
  • ✅ revolution.extension.kenburn.min.js (homepage)
  • ✅ revolution.extension.layeranimation.min.js (homepage)
  • ✅ revolution.extension.migration.min.js (homepage)
  • ✅ revolution.extension.navigation.min.js (homepage)
  • ✅ revolution.extension.parallax.min.js (homepage)
  • ✅ revolution.extension.slideanims.min.js (homepage)
  • ✅ revolution.extension.video.min.js (homepage)
  • ✅ plugins.js (homepage)
  • ✅ simple-jekyll-search.min.js (homepage)
  • ✅ scripts.js (homepage)
  • ✅ favicon.png (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ dummy.webp (homepage)
  • ✅ rocket1.webp (homepage)
  • ✅ rocket2.webp (homepage)
  • ✅ rocket3.webp (homepage)
  • ✅ rocket4.webp (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ wafer-space-chip-on-board.jpg (homepage)
  • ✅ gf180mcu-wafer-edge-1.jpg (homepage)
  • ✅ gf180mcu-wafer-isometric.jpg (homepage)
  • ✅ concept12@2x.webp (homepage)
  • ✅ logo-light.webp (homepage)
    Processing page 2: about.html (/pr-158/about.html) -> https://preview.wafer.space/pr-158/about.html
    Processing page 3: design-help.html (/pr-158/design-help.html) -> https://preview.wafer.space/pr-158/design-help.html
    Processing page 4: faq.html (/pr-158/faq.html) -> https://preview.wafer.space/pr-158/faq.html
    Processing page 5: free.html (/pr-158/free.html) -> https://preview.wafer.space/pr-158/free.html
    Processing page 6: how.html (/pr-158/how.html) -> https://preview.wafer.space/pr-158/how.html
    Processing page 7: price.html (/pr-158/price.html) -> https://preview.wafer.space/pr-158/price.html
    Processing page 8: technology.html (/pr-158/technology.html) -> https://preview.wafer.space/pr-158/technology.html
    Checked 8 pages total.
    Asset Summary: 0/54 failed
  • ✅ All assets loaded successfully

4. Link and Asset Verification (muffet)

Running comprehensive muffet validation...

  • ❌ muffet found broken links or assets:
https://preview.wafer.space/pr-158/news/tinytapeout-feature
	500	https://rc2014.co.uk/

Summary: 0
0 broken links, 0
0 timeouts, 0
0 HTTP errors

Linked sites with invalid TLS certificates (warning only):

  • ⚠️ mabrains.com: certificate has expired

5. Performance Check

  • Page load time: 0.055413s
  • ✅ Load time acceptable

6. Mobile Responsiveness

  • ✅ Viewport meta tag present

Summary

❌ Some verification checks failed


🔍 Automated verification • Run ID: 40081961911 • 2026-10-24T09:36:28.982Z


⏰ This verification result has been archived by Run ID: 40083862082 • A newer verification is available below

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

📋 Previous verification results (archived)

Click to view archived verification results from 2026-10-24T10:02:46.000Z

❌ Preview Site Verification FAILED

Preview Site Verification Report

PR: #158
URL: https://preview.wafer.space/pr-158/
Timestamp: Sat Oct 24 10:02:16 UTC 2026

1. Basic Connectivity ✅

  • ✅ Site is accessible
  • ✅ HTTP Status: 200

2. Content Verification

  • ✅ Site contains expected content
  • ✅ Tagline present
  • ✅ JavaScript baseurl configuration found

3. Multi-Page Asset Verification

Discovering all pages in the site...
Found pages: 7 discovered + homepage
Testing critical assets...

  • ✅ favicon.png
  • ✅ assets/css/style.css
  • ✅ assets/js/jquery.min.js
  • ✅ assets/images/logo-light.webp
    Checking assets across all pages...
    Processing page 1: homepage
  • ✅ bootstrap.min.css (homepage)
  • ✅ plugins.css (homepage)
  • ✅ settings.css (homepage)
  • ✅ layers.css (homepage)
  • ✅ navigation.css (homepage)
  • ✅ type.css (homepage)
  • ✅ style.css (homepage)
  • ✅ sky.css (homepage)
  • ✅ dark.css (homepage)
  • ✅ custom.css (homepage)
  • ✅ jquery.min.js (homepage)
  • ✅ popper.min.js (homepage)
  • ✅ bootstrap.min.js (homepage)
  • ✅ jquery.themepunch.tools.min.js (homepage)
  • ✅ jquery.themepunch.revolution.min.js (homepage)
  • ✅ revolution.extension.actions.min.js (homepage)
  • ✅ revolution.extension.carousel.min.js (homepage)
  • ✅ revolution.extension.kenburn.min.js (homepage)
  • ✅ revolution.extension.layeranimation.min.js (homepage)
  • ✅ revolution.extension.migration.min.js (homepage)
  • ✅ revolution.extension.navigation.min.js (homepage)
  • ✅ revolution.extension.parallax.min.js (homepage)
  • ✅ revolution.extension.slideanims.min.js (homepage)
  • ✅ revolution.extension.video.min.js (homepage)
  • ✅ plugins.js (homepage)
  • ✅ simple-jekyll-search.min.js (homepage)
  • ✅ scripts.js (homepage)
  • ✅ favicon.png (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ dummy.webp (homepage)
  • ✅ rocket1.webp (homepage)
  • ✅ rocket2.webp (homepage)
  • ✅ rocket3.webp (homepage)
  • ✅ rocket4.webp (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ wafer-space-chip-on-board.jpg (homepage)
  • ✅ gf180mcu-wafer-edge-1.jpg (homepage)
  • ✅ gf180mcu-wafer-isometric.jpg (homepage)
  • ✅ concept12@2x.webp (homepage)
  • ✅ logo-light.webp (homepage)
    Processing page 2: about.html (/pr-158/about.html) -> https://preview.wafer.space/pr-158/about.html
    Processing page 3: design-help.html (/pr-158/design-help.html) -> https://preview.wafer.space/pr-158/design-help.html
    Processing page 4: faq.html (/pr-158/faq.html) -> https://preview.wafer.space/pr-158/faq.html
    Processing page 5: free.html (/pr-158/free.html) -> https://preview.wafer.space/pr-158/free.html
    Processing page 6: how.html (/pr-158/how.html) -> https://preview.wafer.space/pr-158/how.html
    Processing page 7: price.html (/pr-158/price.html) -> https://preview.wafer.space/pr-158/price.html
    Processing page 8: technology.html (/pr-158/technology.html) -> https://preview.wafer.space/pr-158/technology.html
    Checked 8 pages total.
    Asset Summary: 0/54 failed
  • ✅ All assets loaded successfully

4. Link and Asset Verification (muffet)

Running comprehensive muffet validation...

  • ❌ muffet found broken links or assets:
https://preview.wafer.space/pr-158/news/tinytapeout-feature
	500	https://rc2014.co.uk/

Summary: 0
0 broken links, 0
0 timeouts, 0
0 HTTP errors

Linked sites with invalid TLS certificates (warning only):

  • ⚠️ mabrains.com: certificate has expired

5. Performance Check

  • Page load time: 0.128113s
  • ✅ Load time acceptable

6. Mobile Responsiveness

  • ✅ Viewport meta tag present

Summary

❌ Some verification checks failed


🔍 Automated verification • Run ID: 40083862082 • 2026-10-24T10:02:45.592Z


⏰ This verification result has been archived by Run ID: 40084778281 • A newer verification is available below

@github-actions

Copy link
Copy Markdown

⚠️ Preview Deployment Partially Ready

Status Preview URL Issue
🟡 Partial View Preview Git commit hash verification failed - deployment may be outdated

The preview has been deployed but content verification is incomplete. The site may still be propagating or there may be loading issues.

Manual verification recommended: https://preview.wafer.space/pr-158/


⚡ Deployed to custom domain • Preview will be removed when PR is closed

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

📋 Previous verification results (archived)

Click to view archived verification results from 2026-10-24T10:15:22.000Z

❌ Preview Site Verification FAILED

Preview Site Verification Report

PR: #158
URL: https://preview.wafer.space/pr-158/
Timestamp: Sat Oct 24 10:14:54 UTC 2026

1. Basic Connectivity ✅

  • ✅ Site is accessible
  • ✅ HTTP Status: 200

2. Content Verification

  • ✅ Site contains expected content
  • ✅ Tagline present
  • ✅ JavaScript baseurl configuration found

3. Multi-Page Asset Verification

Discovering all pages in the site...
Found pages: 7 discovered + homepage
Testing critical assets...

  • ✅ favicon.png
  • ✅ assets/css/style.css
  • ✅ assets/js/jquery.min.js
  • ✅ assets/images/logo-light.webp
    Checking assets across all pages...
    Processing page 1: homepage
  • ✅ bootstrap.min.css (homepage)
  • ✅ plugins.css (homepage)
  • ✅ settings.css (homepage)
  • ✅ layers.css (homepage)
  • ✅ navigation.css (homepage)
  • ✅ type.css (homepage)
  • ✅ style.css (homepage)
  • ✅ sky.css (homepage)
  • ✅ dark.css (homepage)
  • ✅ custom.css (homepage)
  • ✅ jquery.min.js (homepage)
  • ✅ popper.min.js (homepage)
  • ✅ bootstrap.min.js (homepage)
  • ✅ jquery.themepunch.tools.min.js (homepage)
  • ✅ jquery.themepunch.revolution.min.js (homepage)
  • ✅ revolution.extension.actions.min.js (homepage)
  • ✅ revolution.extension.carousel.min.js (homepage)
  • ✅ revolution.extension.kenburn.min.js (homepage)
  • ✅ revolution.extension.layeranimation.min.js (homepage)
  • ✅ revolution.extension.migration.min.js (homepage)
  • ✅ revolution.extension.navigation.min.js (homepage)
  • ✅ revolution.extension.parallax.min.js (homepage)
  • ✅ revolution.extension.slideanims.min.js (homepage)
  • ✅ revolution.extension.video.min.js (homepage)
  • ✅ plugins.js (homepage)
  • ✅ simple-jekyll-search.min.js (homepage)
  • ✅ scripts.js (homepage)
  • ✅ favicon.png (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ dummy.webp (homepage)
  • ✅ rocket1.webp (homepage)
  • ✅ rocket2.webp (homepage)
  • ✅ rocket3.webp (homepage)
  • ✅ rocket4.webp (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ wafer-space-chip-on-board.jpg (homepage)
  • ✅ gf180mcu-wafer-edge-1.jpg (homepage)
  • ✅ gf180mcu-wafer-isometric.jpg (homepage)
  • ✅ concept12@2x.webp (homepage)
  • ✅ logo-light.webp (homepage)
    Processing page 2: about.html (/pr-158/about.html) -> https://preview.wafer.space/pr-158/about.html
    Processing page 3: design-help.html (/pr-158/design-help.html) -> https://preview.wafer.space/pr-158/design-help.html
    Processing page 4: faq.html (/pr-158/faq.html) -> https://preview.wafer.space/pr-158/faq.html
    Processing page 5: free.html (/pr-158/free.html) -> https://preview.wafer.space/pr-158/free.html
    Processing page 6: how.html (/pr-158/how.html) -> https://preview.wafer.space/pr-158/how.html
    Processing page 7: price.html (/pr-158/price.html) -> https://preview.wafer.space/pr-158/price.html
    Processing page 8: technology.html (/pr-158/technology.html) -> https://preview.wafer.space/pr-158/technology.html
    Checked 8 pages total.
    Asset Summary: 0/54 failed
  • ✅ All assets loaded successfully

4. Link and Asset Verification (muffet)

Running comprehensive muffet validation...

  • ❌ muffet found broken links or assets:
https://preview.wafer.space/pr-158/news/tinytapeout-feature
	500	https://rc2014.co.uk/

Summary: 0
0 broken links, 0
0 timeouts, 0
0 HTTP errors

Linked sites with invalid TLS certificates (warning only):

  • ⚠️ mabrains.com: certificate has expired

5. Performance Check

  • Page load time: 0.103618s
  • ✅ Load time acceptable

6. Mobile Responsiveness

  • ✅ Viewport meta tag present

Summary

❌ Some verification checks failed


🔍 Automated verification • Run ID: 40084778281 • 2026-10-24T10:15:22.173Z


⏰ This verification result has been archived by Run ID: 40090626325 • A newer verification is available below

@github-actions

Copy link
Copy Markdown

⚠️ Preview Deployment Partially Ready

Status Preview URL Issue
🟡 Partial View Preview Git commit hash verification failed - deployment may be outdated

The preview has been deployed but content verification is incomplete. The site may still be propagating or there may be loading issues.

Manual verification recommended: https://preview.wafer.space/pr-158/


⚡ Deployed to custom domain • Preview will be removed when PR is closed

@mithro mithro changed the title Build the preview redirect list and sync both lists after deploys Sync the Cloudflare redirect lists after deploys and cleanups Oct 24, 2026
@github-actions

Copy link
Copy Markdown

⚠️ Preview Deployment Partially Ready

Status Preview URL Issue
🟡 Partial View Preview Git commit hash verification failed - deployment may be outdated

The preview has been deployed but content verification is incomplete. The site may still be propagating or there may be loading issues.

Manual verification recommended: https://preview.wafer.space/pr-158/


⚡ Deployed to custom domain • Preview will be removed when PR is closed

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

📋 Previous verification results (archived)

Click to view archived verification results from 2026-10-24T11:43:58.000Z

❌ Preview Site Verification FAILED

Preview Site Verification Report

PR: #158
URL: https://preview.wafer.space/pr-158/
Timestamp: Sat Oct 24 11:43:33 UTC 2026

1. Basic Connectivity ✅

  • ✅ Site is accessible
  • ✅ HTTP Status: 200

2. Content Verification

  • ✅ Site contains expected content
  • ✅ Tagline present
  • ✅ JavaScript baseurl configuration found

3. Multi-Page Asset Verification

Discovering all pages in the site...
Found pages: 7 discovered + homepage
Testing critical assets...

  • ✅ favicon.png
  • ✅ assets/css/style.css
  • ✅ assets/js/jquery.min.js
  • ✅ assets/images/logo-light.webp
    Checking assets across all pages...
    Processing page 1: homepage
  • ✅ bootstrap.min.css (homepage)
  • ✅ plugins.css (homepage)
  • ✅ settings.css (homepage)
  • ✅ layers.css (homepage)
  • ✅ navigation.css (homepage)
  • ✅ type.css (homepage)
  • ✅ style.css (homepage)
  • ✅ sky.css (homepage)
  • ✅ dark.css (homepage)
  • ✅ custom.css (homepage)
  • ✅ jquery.min.js (homepage)
  • ✅ popper.min.js (homepage)
  • ✅ bootstrap.min.js (homepage)
  • ✅ jquery.themepunch.tools.min.js (homepage)
  • ✅ jquery.themepunch.revolution.min.js (homepage)
  • ✅ revolution.extension.actions.min.js (homepage)
  • ✅ revolution.extension.carousel.min.js (homepage)
  • ✅ revolution.extension.kenburn.min.js (homepage)
  • ✅ revolution.extension.layeranimation.min.js (homepage)
  • ✅ revolution.extension.migration.min.js (homepage)
  • ✅ revolution.extension.navigation.min.js (homepage)
  • ✅ revolution.extension.parallax.min.js (homepage)
  • ✅ revolution.extension.slideanims.min.js (homepage)
  • ✅ revolution.extension.video.min.js (homepage)
  • ✅ plugins.js (homepage)
  • ✅ simple-jekyll-search.min.js (homepage)
  • ✅ scripts.js (homepage)
  • ✅ favicon.png (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ dummy.webp (homepage)
  • ✅ rocket1.webp (homepage)
  • ✅ rocket2.webp (homepage)
  • ✅ rocket3.webp (homepage)
  • ✅ rocket4.webp (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ wafer-space-chip-on-board.jpg (homepage)
  • ✅ gf180mcu-wafer-edge-1.jpg (homepage)
  • ✅ gf180mcu-wafer-isometric.jpg (homepage)
  • ✅ concept12@2x.webp (homepage)
  • ✅ logo-light.webp (homepage)
    Processing page 2: about.html (/pr-158/about.html) -> https://preview.wafer.space/pr-158/about.html
    Processing page 3: design-help.html (/pr-158/design-help.html) -> https://preview.wafer.space/pr-158/design-help.html
    Processing page 4: faq.html (/pr-158/faq.html) -> https://preview.wafer.space/pr-158/faq.html
    Processing page 5: free.html (/pr-158/free.html) -> https://preview.wafer.space/pr-158/free.html
    Processing page 6: how.html (/pr-158/how.html) -> https://preview.wafer.space/pr-158/how.html
    Processing page 7: price.html (/pr-158/price.html) -> https://preview.wafer.space/pr-158/price.html
    Processing page 8: technology.html (/pr-158/technology.html) -> https://preview.wafer.space/pr-158/technology.html
    Checked 8 pages total.
    Asset Summary: 0/54 failed
  • ✅ All assets loaded successfully

4. Link and Asset Verification (muffet)

Running comprehensive muffet validation...

  • ❌ muffet found broken links or assets:
https://preview.wafer.space/pr-158/news/tinytapeout-feature
	500	https://rc2014.co.uk/

Summary: 0
0 broken links, 0
0 timeouts, 0
0 HTTP errors

Linked sites with invalid TLS certificates (warning only):

  • ⚠️ mabrains.com: certificate has expired

5. Performance Check

  • Page load time: 0.079275s
  • ✅ Load time acceptable

6. Mobile Responsiveness

  • ✅ Viewport meta tag present

Summary

❌ Some verification checks failed


🔍 Automated verification • Run ID: 40090626325 • 2026-10-24T11:43:58.434Z


⏰ This verification result has been archived by Run ID: 40249599356 • A newer verification is available below

mithro and others added 5 commits October 26, 2026 10:58
It reads the revision from a redirects.json's first item and asks the
Worker to load exactly that one, retrying while Pages still serves an
older file, another bulk operation is pending, or the write hasn't
finished, since the Worker itself doesn't retry. A newer revision
already loaded counts as success. It skips quietly when the Worker's
URL or secret isn't available, as on fork PRs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018aHXTpnku3VjT9FFpoBEuy
The production deploy asks for the revision it built once Pages has it;
preview deploys and preview cleanups ask for the preview list they
pushed. Preview syncs don't fail their job, since the Worker's cron
trigger catches up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018aHXTpnku3VjT9FFpoBEuy
The Worker now returns the revision it reads back from the list after
writing. Another sync's older write can land just after this one's, so
a 200 whose list revision is older than the one requested is retried
like a 409.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018aHXTpnku3VjT9FFpoBEuy
Until the list holds the deployed revision or a newer one, the client
checks GET /list, waits while GET /source shows the site doesn't serve
it yet, and otherwise calls POST /sync, backing off between rounds.
Checking /list after each sync also catches another sync's older write
landing just after this one's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018aHXTpnku3VjT9FFpoBEuy
mithro and others added 3 commits October 26, 2026 10:58
Cloudflare's Browser Integrity Check answers urllib's default
User-Agent (Python-urllib/3.x) with HTTP 403 "error code: 1010", so
every call the sync step made to the Worker failed until it gave up
after 10 minutes. The Worker's own check is now reached: a wrong secret
gets its 401.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018aHXTpnku3VjT9FFpoBEuy
From an independent review of this PR:

- A POST /sync answering 200 sent the loop straight back to GET /list,
  past the deadline check and the sleep. The Worker answers 200 when it
  loads nothing, too, which happens while Pages still serves /sync's own
  fetch an older copy than /source saw, so the client could spin with
  no pause and no end. /sync's answer now says what the list holds; the
  client stops if that's our revision or newer, and otherwise waits like
  any other unfinished round.
- Only URLError and TimeoutError were caught, so a dropped connection
  (RemoteDisconnected), a reset or a truncated read crashed it without a
  retry. All connection-level failures are retried now, and so is an
  answer that isn't a JSON object.
- urllib follows redirects and sends the Authorization header on to
  wherever they point, on any host. Redirects are refused (and stop the
  sync) and REDIRECTS_SYNC_URL must be https.
- The deadline only bounded the waits: each request could take 120 s.
  A request now gets at most 30 s and never more than the time left,
  and the last round is made at the deadline instead of giving up
  before it.
- --require-secrets fails rather than skips without the URL or secret,
  for production, where a missing secret would otherwise go unnoticed.
- The revision item must name exactly the list's host, as the Worker
  requires, so a file for the other list is refused at once. --from-file
  can't be combined with --number/--commit, --commit must be a full
  hash, and a file that can't be read is reported on stderr, as stdout
  may be $GITHUB_OUTPUT.

Tests run the client against a local stand-in for the Worker, with a
fake clock, and a new Script tests workflow runs them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018aHXTpnku3VjT9FFpoBEuy
Production: the sync was a step in the deploy job, after deploy-pages.
Re-running that job after a failed sync would publish this run's site
again, over any newer deploy, and the sync would then pass because the
list already held the newer revision. It's now a sync-redirects job
after deploy, so a re-run only syncs. The "pages" concurrency group
moves from the workflow to the deploy job, so a slow sync doesn't hold
up the next deploy. Reading the revision no longer stops a build: if it
fails, the site still deploys and sync-redirects reports it. The sync
passes --require-secrets.

Previews: the sync step ran before the deployment status and the PR
comment, holding them up for as long as 10 minutes when the Worker was
down. It now runs last, and only where the branch has the script, as
branches from before it get this workflow file but their own checkout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018aHXTpnku3VjT9FFpoBEuy
@github-actions

Copy link
Copy Markdown

⚠️ Preview Deployment Partially Ready

Status Preview URL Issue
🟡 Partial View Preview Git commit hash verification failed - deployment may be outdated

The preview has been deployed but content verification is incomplete. The site may still be propagating or there may be loading issues.

Manual verification recommended: https://preview.wafer.space/pr-158/


⚡ Deployed to custom domain • Preview will be removed when PR is closed

@github-actions

Copy link
Copy Markdown

✅ Preview Site Verification PASSED

Preview Site Verification Report

PR: #158
URL: https://preview.wafer.space/pr-158/
Timestamp: Mon Oct 26 00:39:27 UTC 2026

1. Basic Connectivity ✅

  • ✅ Site is accessible
  • ✅ HTTP Status: 200

2. Content Verification

  • ✅ Site contains expected content
  • ✅ Tagline present
  • ✅ JavaScript baseurl configuration found

3. Multi-Page Asset Verification

Discovering all pages in the site...
Found pages: 1 discovered + homepage
Testing critical assets...

  • ✅ favicon.png
  • ✅ assets/css/style.css
  • ✅ assets/js/jquery.min.js
  • ✅ assets/images/logo-light.webp
    Checking assets across all pages...
    Processing page 1: homepage
  • ✅ bootstrap.min.css (homepage)
  • ✅ plugins.css (homepage)
  • ✅ settings.css (homepage)
  • ✅ layers.css (homepage)
  • ✅ navigation.css (homepage)
  • ✅ type.css (homepage)
  • ✅ style.css (homepage)
  • ✅ sky.css (homepage)
  • ✅ dark.css (homepage)
  • ✅ custom.css (homepage)
  • ✅ jquery.min.js (homepage)
  • ✅ popper.min.js (homepage)
  • ✅ bootstrap.min.js (homepage)
  • ✅ jquery.themepunch.tools.min.js (homepage)
  • ✅ jquery.themepunch.revolution.min.js (homepage)
  • ✅ revolution.extension.actions.min.js (homepage)
  • ✅ revolution.extension.carousel.min.js (homepage)
  • ✅ revolution.extension.kenburn.min.js (homepage)
  • ✅ revolution.extension.layeranimation.min.js (homepage)
  • ✅ revolution.extension.migration.min.js (homepage)
  • ✅ revolution.extension.navigation.min.js (homepage)
  • ✅ revolution.extension.parallax.min.js (homepage)
  • ✅ revolution.extension.slideanims.min.js (homepage)
  • ✅ revolution.extension.video.min.js (homepage)
  • ✅ plugins.js (homepage)
  • ✅ simple-jekyll-search.min.js (homepage)
  • ✅ scripts.js (homepage)
  • ✅ favicon.png (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ logo-light.webp (homepage)
  • ✅ dummy.webp (homepage)
  • ✅ rocket1.webp (homepage)
  • ✅ rocket2.webp (homepage)
  • ✅ rocket3.webp (homepage)
  • ✅ rocket4.webp (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x0p5_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 0p5x1_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x0p5_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ 1x1_gelpack.jpg (homepage)
  • ✅ wafer-space-chip-on-board.jpg (homepage)
  • ✅ gf180mcu-wafer-edge-1.jpg (homepage)
  • ✅ gf180mcu-wafer-isometric.jpg (homepage)
  • ✅ concept12@2x.webp (homepage)
  • ✅ logo-light.webp (homepage)
    Processing page 2: free.html (/pr-158/free.html) -> https://preview.wafer.space/pr-158/free.html
    Checked 2 pages total.
    Asset Summary: 0/54 failed
  • ✅ All assets loaded successfully

4. Link and Asset Verification (muffet)

Running comprehensive muffet validation...

  • ✅ All links and assets are valid (muffet)

5. Performance Check

  • Page load time: 0.119581s
  • ✅ Load time acceptable

6. Mobile Responsiveness

  • ✅ Viewport meta tag present

Summary

✅ All verification checks passed!


🔍 Automated verification • Run ID: 40249599356 • 2026-10-26T00:39:56.139Z

This branch was successfully deployed

1 active deployment
pr-preview-158 — 88ce0c39 Deployed Oct 26, 2026 by github-actions[bot]
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.

1 participant