Uh oh!
There was an error while loading. Please reload this page.
fix(docs): three redirect destinations point at pages that do not exist - #9015
Merged
os-project-manager merged 1 commit intoAug 16, 2026
Merged
Conversation
…st (#8948) Three entries in apps/docs/redirects.mjs answered a permanent redirect (308) into a 404. Resolving every destination the way Fumadocs routes it (/docs/x -> content/docs/x.mdx | .md | x/index.mdx) reports 92 entries checked, 3 dead before this change, 0 after; no chains either way. - role-based-interfaces: the page was renamed to audience-based-interfaces (git records the rename, R100) and the redirect was never updated. Re-pointed at the successor page. - chatbot-integration and cloud-artifact-api: both pages were deleted as cloud-only content, in one commit, with no successor -- nav entries and inbound cross-links were removed rather than re-pointed. Both land on their section index, matching the objectql-migration entry already in the table under the same maintainer ruling. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011RB4waLuNbdruCo6X9oobm
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
os-project-manager
marked this pull request as ready for review
August 16, 2026 06:13
os-project-manager
enabled auto-merge
August 16, 2026 06:14
Uh oh!
There was an error while loading. Please reload this page.
os-project-manager
deleted the
claude/issue-8948-dead-redirect-destinations
branch
August 16, 2026 06:34
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
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Fixes#8948
Three entries in
apps/docs/redirects.mjshad destinations with no page behind them. Each was a live URL answering a permanent redirect (308) into a 404 — user-facing breakage, not tidying./docs/guides/solutions/role-based-interfaces/docs/ui/role-based-interfaces/docs/ui/audience-based-interfaces/docs/guides/plugin-chatbot-integration/docs/ai/chatbot-integration/docs/ai/docs/concepts/cloud-artifact-api/docs/deployment/cloud-artifact-api/docs/deploymentNo source entry was deleted: a live URL that 404s is bad, but a live URL that becomes an unhandled 404 is no better and loses the record that the URL was once real.
How each destination was chosen
Two branches were possible per entry — a real successor page, or the section index as the conservative landing. Which branch was taken, and the search behind it:
1.
role-based-interfaces→ successor page. Git records the rename directly:R100is a content-identical rename, in the directioncheck:role-wordenforces. The redirect was simply never updated to follow the second hop. Successor verified present:content/docs/ui/audience-based-interfaces.mdx.2.
chatbot-integration→ section index. No successor exists. The page was deleted, not renamed, in97ad5702c("remove cloud-only intro pages"), whose message names it explicitly: "ai/chatbot-integration.mdx — in-product chat / HITL wiring on @objectstack/service-ai (cloud, ADR-0025)". The same commit removed itsmeta.jsonnav entry and rewrote the inbound cross-link inai/index.mdxrather than re-pointing it anywhere. Searches run:git log --all --diff-filter=ADR -- '*chatbot*'; filename scan of the whole currentcontent/docstree forchat|bot; content grep forchatbot. Only hit outsidereleases/is the deleted path itself./docs/aiis more than a neutral default here: that index's callout is what now carries the in-product chat runtime's story, and it links onward to where that content actually lives.3.
cloud-artifact-api→ section index. Same commit, same reason ("the Cloud control-plane artifact HTTP contract"), also aD, not a rename. Notablydeployment/publish-and-preview.mdxdropped its two cross-links to the page instead of absorbing the content, so pointing there would assert a content move that provably did not happen. Searches run:git log --all --diff-filter=ADR -- '*cloud-artifact*' '*artifact-api*'; filename and content scans as above. Thereferences/**hits (package-artifact,environment-artifact) are spec-generated schema pages, not a successor to a hand-written HTTP-contract guide.Both fallbacks match the precedent already in this file, from the maintainer ruling of 2026-08-15 recorded in the retired-deployment-pages comment: a retired page with no successor lands on the section index (
/docs/deployment/migration-from-objectqland/docs/guides/objectql-migrationboth do exactly this).Verification
"The table looks right now" is not evidence, so every destination in the table was resolved the way Fumadocs routes it —
/docs/xtocontent/docs/x.mdx,.md,x/index.mdxorx/index.md; bare/docstocontent/docs/index.mdx; wildcard destinations to their target directory. Chain detection follows Next's own matching ('/a/:path*'matches/aand/a/deep, exact otherwise, first match wins).main(baseline)The baseline reproduces the filer's numbers from
a8189aef4exactly. The three repaired destinations land on files that other, already-accepted entries in the same table also land on (/docs/aifromai-capabilities,/docs/deploymentfromcloud-deploymentandobjectql-migration), so no new destination shape was introduced.The resolver was proven capable of failing in both directions — a sweep that silently resolves everything would be worthless here:
/docs/guides/skills(itself a source in the table); the sweep reportedDEAD/CHAIN … [CHAIN -> matched by source '/docs/guides/skills'],chained: 1, exit 1. Reverted, and the restore confirmed byte-identical to the commit (git hash-object=git rev-parse HEAD:=62e2092c7), working tree clean.Consumer output checked too:
toNextRedirects()yields 92 well-formed entries, 0 malformed, all stillpermanent: true.The sweep script is not shipped in this PR — it was the verification method. Gate recommendation below.
Gates
Run after the final commit, at
0b2d0f3ba:node scripts/pm/dispatch-gates.mjs apps/docs/redirects.mjs→ "No check family names the given paths in its own source" (98 families discovered). This independently confirms the card's "nothing gates this table" claim, from the derivation side.pnpm check:nul-bytes→ OK, 5947 files scanned, self-test 75 assertions.npx eslint apps/docs/redirects.mjs→ clean.pnpm check:role-word→ OK, 43 baselined files, no new occurrences. Not implicated by path (it scanscontent/docsandskills,.md/.mdxonly, soapps/docs/*.mjsis out of its reach) — run anyway because it is a ratchet family and the diff adds the words "role-based" to a file.No changeset:
apps/docs/is not published package source, so this isskip-changeset.The gate question — filed, not shipped
The card's suggestion that this table deserves a gate is correct, and it is the reason the rot went unnoticed. Deliberately not built here to keep this PR to the user-facing fix; filed as #9014 with the full recommendation — what it would assert (destination resolution, wildcard directories, chain freedom), where it would hook in (the required
lint.ymllane rather than the advisory links lane, which carries nomerge_grouptrigger), and how it would be proven capable of failing, including the note that its chain and wildcard limbs have no live failing example and need self-test fixtures rather than inspection.Generated by Claude Code
Generated by Claude Code