The Netlify validation job imports site listings before generated static device JSON exists in a clean checkout, so keep the small device table in tracked source and use it as the route fallback.
Constraint: static/device-list.json is ignored generated output and is absent in GitHub-hosted clean runners
Rejected: Force-add static/device-list.json | keeps generated output under source control
Confidence: high
Scope-risk: narrow
Directive: Keep disabled device rows in the fallback source but filter them from routable listings
Tested: pnpm run with-env vitest ./test/prebuild/site-listings.test.js
Tested: pnpm netlify-build reached Astro build after passing prebuild tests
Not-tested: Full local netlify-build completion blocked by unrelated uncommitted scanner worker build failure
Add a Bun health script that exercises top-level, dynamic, and representative video routes against one or more hosts so prod regressions are visible from a single command.
Device pages now fall back to the bundled device list when the external API misses a slug, and orphaned tv slugs redirect to /benchmarks instead of returning a 500. Video fallback logic reuses the existing YouTube-to-listing builder so route reconstruction stays aligned with the current build logic.
Constraint: The external API host can lag behind the frontend build and omit per-slug JSON files that public routes still expect
Rejected: Import the generated video list directly | static/video-list.json is too large for a safe SSR fallback
Rejected: Leave missing tv routes as 500s | a stale public URL should degrade to a useful redirect instead of breaking the request
Confidence: medium
Scope-risk: moderate
Reversibility: clean
Directive: Keep route fallbacks tied to build-time artifacts from the same repo so frontend and fallback data stay in sync
Tested: bun scripts/health http://127.0.0.1:4322; vitest ./test/prebuild/config-node.test.js ./test/prebuild/site-listings.test.js; pnpm run netlify-build
Not-tested: live production deploy before push