Raxx · internal docs

internal · gated

RCA — internal-docs.raxx.app/flags/* soft-404 (main page served at every path)

Incident ID: 2026-05-18-internal-docs-flags-soft-404 Date: 2026-05-18 Severity: SEV-3 Duration: ~2 min deploy gap (23:25–23:27 UTC) — ongoing until fix merged Blast radius: Internal-only. All /flags/* paths on internal-docs.raxx.app served the 88,101-byte main landing page instead of flag docs. No customer-facing impact; CF Access gating was intact. Author: sre-agent

Summary

Two GitHub Actions workflows (deploy-flag-docs.yml and deploy-internal-docs.yml) both targeted the same Cloudflare Pages project (raxx-internal-docs). Each wrangler pages deploy creates a new immutable deployment that replaces the previous one as the production deployment. The deploy-internal-docs.yml run at 23:27 UTC overwrote the deploy-flag-docs.yml run from 23:25 UTC, erasing the /flags/* subpath content. CF Pages then served its SPA fallback (the main index.html) for every unmatched /flags/* path — a soft-404 that returned HTTP 200 with 88 KB of the wrong page.

The fix merges both builds into a single deploy: deploy-internal-docs.yml now builds flag docs into a staging directory and merges the output under dist/internal-docs/flags/ before the single wrangler pages deploy. deploy-flag-docs.yml retains its build + validate jobs as a PR-time gate but no longer deploys.

Timeline (all times UTC)

Impact

What went well

What didn't go well

Root cause analysis

Detection

Resolution

Action items

# Action Owner Due Issue
1 Add a CI lint check that detects two workflow files targeting the same CF Pages --project-name and fails the PR devops 2026-06-01 (filed below)
2 Add /flags/_index.html to synthetic monitoring probe for internal-docs.raxx.app sre-agent 2026-05-25 (filed below)
3 Review all other workflow pairs for "two deployers / one Pages project" pattern sre-agent 2026-05-25 (filed below)

References