Found while working #8904 (retiring the Vercel and ObjectQL-migration pages). Pre-existing and unrelated to those two pages — not introduced by #8904's PR, and deliberately left untouched there to respect that card's scope ceiling.
The defect
Three entries in apps/docs/redirects.mjs have destinations with no page behind them. Each is a live URL that answers a permanent redirect (permanent: true, so 308) into a 404:
| Source URL (still live) | Destination | Destination page |
|---|
/docs/guides/solutions/role-based-interfaces | /docs/ui/role-based-interfaces | missing |
/docs/guides/plugin-chatbot-integration | /docs/ai/chatbot-integration | missing |
/docs/concepts/cloud-artifact-api | /docs/deployment/cloud-artifact-api | missing |
Verified against the tree at a8189aef4 by resolving every destination the way Fumadocs routes it (/docs/x to content/docs/x.mdx, .md, or /index.mdx). 92 entries checked, these 3 fail; nothing else in the table is dead or chained.
Why nothing caught it
apps/docs/redirects.mjs is checked by no gate at all. Its only consumer is apps/docs/next.config.mjs; nothing in scripts/ or .github/workflows/ reads it. Check Documentation Links runs lychee --offline over content/**, root README.md and ARCHITECTURE.md — the redirect table is outside that surface, so a destination can rot indefinitely with CI fully green. This is the same blind spot #8904 was raised to handle for its own two pages.
Likely causes, for whoever picks this up
role-based-interfaces — content/docs/ui/audience-based-interfaces.mdx exists. The page looks renamed (consistent with the direction check:role-word enforces) without its redirect being updated. Re-pointing at /docs/ui/audience-based-interfaces is the probable fix.chatbot-integration — no near-match under content/docs/ai/. Needs a judgement call on the successor (/docs/ai is the neutral default).cloud-artifact-api — no near-match under content/docs/deployment/. Same judgement call (/docs/deployment).
The first is mechanical; the other two need a destination decision, so this is not a pure chore.
Suggested scope
Fix the three destinations, and consider whether the table deserves a gate — a dependency-free resolver over docsRedirects is roughly the 30-line script used to find this, and would close the blind spot permanently rather than one rotted entry at a time.
⚠️ Serialization note for triage: this edits apps/docs/redirects.mjs, which PR #8947 (for #8904) also edits. Schedule after that merges to avoid a conflict on the same file.
Generated by Claude Code
Found while working #8904 (retiring the Vercel and ObjectQL-migration pages). Pre-existing and unrelated to those two pages — not introduced by #8904's PR, and deliberately left untouched there to respect that card's scope ceiling.
The defect
Three entries in
apps/docs/redirects.mjshave destinations with no page behind them. Each is a live URL that answers a permanent redirect (permanent: true, so 308) into a 404:/docs/guides/solutions/role-based-interfaces/docs/ui/role-based-interfaces/docs/guides/plugin-chatbot-integration/docs/ai/chatbot-integration/docs/concepts/cloud-artifact-api/docs/deployment/cloud-artifact-apiVerified against the tree at
a8189aef4by resolving every destination the way Fumadocs routes it (/docs/xtocontent/docs/x.mdx,.md, or/index.mdx). 92 entries checked, these 3 fail; nothing else in the table is dead or chained.Why nothing caught it
apps/docs/redirects.mjsis checked by no gate at all. Its only consumer isapps/docs/next.config.mjs; nothing inscripts/or.github/workflows/reads it.Check Documentation Linksrunslychee --offlineovercontent/**, rootREADME.mdandARCHITECTURE.md— the redirect table is outside that surface, so a destination can rot indefinitely with CI fully green. This is the same blind spot #8904 was raised to handle for its own two pages.Likely causes, for whoever picks this up
role-based-interfaces—content/docs/ui/audience-based-interfaces.mdxexists. The page looks renamed (consistent with the directioncheck:role-wordenforces) without its redirect being updated. Re-pointing at/docs/ui/audience-based-interfacesis the probable fix.chatbot-integration— no near-match undercontent/docs/ai/. Needs a judgement call on the successor (/docs/aiis the neutral default).cloud-artifact-api— no near-match undercontent/docs/deployment/. Same judgement call (/docs/deployment).The first is mechanical; the other two need a destination decision, so this is not a pure chore.
Suggested scope
Fix the three destinations, and consider whether the table deserves a gate — a dependency-free resolver over
docsRedirectsis roughly the 30-line script used to find this, and would close the blind spot permanently rather than one rotted entry at a time.apps/docs/redirects.mjs, which PR #8947 (for #8904) also edits. Schedule after that merges to avoid a conflict on the same file.Generated by Claude Code