docs: link the four sitemap-only orphan pages back into the site - #13780
Merged
Conversation
Three doc pages had zero inbound links from any other page's prose: `/docs/kernel/contracts/auth-service`, `/docs/kernel/contracts/cache-service` and `/docs/protocol/backward-compatibility`. The fourth page named in the report, `/docs/concepts/metadata-driven`, acquired an inbound link from `getting-started/glossary` on 2026-08-26 and is no longer orphaned. Structural: the Contract Catalog on `kernel/contracts/index.mdx` listed all five contracts that have their own page as plain text, so the section index linked none of its children. Each of the five now links to its page. Topical, so the link is one a reader has a reason to follow: - `permissions/authentication` -> the `IAuthService` contract, where the page already talks about a service that does not implement `handleRequest` - `plugins/packages` -> the `ICacheService` contract, from the sentence that names the contract the cache service sits behind - `protocol/index` and `upgrading` -> the Backward Compatibility Policy, which is what decides what a major may change Face touched: body prose links only. No frontmatter, no headings, no `meta.json` (all four pages were already listed in theirs).
os-project-manager
marked this pull request as ready for review
August 31, 2026 11:56
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 free
to 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 #12353
Docs-only. Face touched: body prose links. No frontmatter, no headings, no
meta.json, noapps/docs— the epic #12243 boundary stated in the dispatch order.The measurement first: the card's stated method does not produce the card's number
The card's method is "fetch every sitemap URL, collect every internal
href="/...", score eachpage by how many other sitemap pages link to it". Reproduced against a locally rendered site,
that instrument scores all four named pages at 6 or more inbound links — not zero. Two pieces
of fumadocs chrome are in the rendered HTML of every page:
kernel/contractspages linkeach other;
page tree (
fumadocs-ui@16.14.4,dist/layouts/docs/page/slots/footer.js,useFooterItems) —so every page in the tree has at least one inbound link from its neighbour. A grep for
NODE_ENVacross that package'sdist/layoutsreturns no match (exit 1), so this is not adev-only rendering.
Restrict the instrument to the prose the authors write — MDX bodies, fenced and inline code
stripped — and the card's number comes back exactly: on the card's base commit, four pages had
zero inbound links, and they are the four the card names (plus
/docsitself, which is linkedfrom the homepage hero in
apps/docs/app/[lang]/page.tsx, not from any MDX page).So the finding is real and the stated method is not what found it. The accurate statement is
"these pages carry no editorial link from anywhere in the docs" — not "a reader following the
docs' own navigation can never arrive at them", which the sidebar and the Previous/Next footer
both falsify. This PR fixes the real half.
The count is 3, not 4
/docs/concepts/metadata-drivenacquired an inbound prose link fromcontent/docs/getting-started/glossary.mdx:91inb000ab59b(2026-08-26T01:24Z, #12385) — themorning after the card was filed. The card's instrument was accurate when it ran; only the
count has drifted. Left as-is here, with the reasoning recorded: it is measurably no longer an
orphan.
The card's own hypothesis, checked and false
content/docs/kernel/contracts/meta.jsonlists all five pages,auth-serviceandcache-serviceincluded; each of the other three orphans is likewise listed in its section'smeta.json. Nometa.jsonneeded an entry, and none is edited. The real gap is one levelup: the Contract Catalog table on
kernel/contracts/index.mdxnamed all five contracts as plaintext, so the section index linked none of its own children.
Per-page calls
/docs/kernel/contracts/auth-servicepermissions/authentication, at the sentence about a service that does not implementhandleRequest/docs/kernel/contracts/cache-serviceplugins/packages, at the sentence naming the contract the cache service sits behind/docs/protocol/backward-compatibilityprotocol/index+upgrading, where a reader crossing a major needs the rule for what a major may change/docs/concepts/metadata-drivengetting-started/glossarysince 2026-08-26Deletion was considered for none of them:
backward-compatibilitycarries the SemVer guarantees,the deprecation timeline, the breaking-change table and the spec package guarantees, and an
existing redirect (
/docs/guides/cheatsheets/backward-compatibility) still points at it. Per thedispatch order, no page deletion is in this PR in any case.
The catalog rows for the three non-orphan contracts are linked in the same edit: they are the
same defect (a section index that links none of its children), and linking two of five rows would
leave the table inconsistent.
Verification
Prose-link graph over all 404 doc pages, code fences and inline code stripped:
Rendered check of the five edited pages against a locally running docs server: each new link is
present as an
hrefinside the article element, i.e. in the page body rather than in chrome.Positive control kept, as the card specifies:
/docs/data-modelingand/docs/aiscore 195 and195 inbound under the all-href instrument, 29 and 14 under the article-scoped one — non-zero
either way, so a zero elsewhere is a real zero.
Narrowing, declared with its measurement: the render was a dev server, not
next build && next start. What that costs is bounded and measured: the four card pages wereeach measured directly under both instruments (not extrapolated), the Previous/Next footer and
the sidebar are unconditional in the library's own compiled output (the
NODE_ENVgrep above),and the crawl covered 197 of 409 URLs before the dev server hit its heap limit — the four card
pages and both positive controls are inside those 197. The site-wide "zero orphans under the
all-href instrument" figure is therefore reported as partial; the per-page numbers are not.
Gates
Derived after the final commit with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstackon the merge of
origin/main, exit code read before any pipe.check:doc-anchorscheck:doc-authoringcheck:docs-single-h1check:docs-redirectscheck:docs-audit-scopecheck:corpus-claim-driftcheck:published-readme-linkscheck:docs-image-tagcheck:role-wordcheck-doc-frontmatter.mjscheck-doc-route-spelling.mjscheck-docs-section-name.mjscheck-section-landing-index.mjs@objectstack/lint check:doc-formula-expressions@objectstack/lint check:doc-security-posture@objectstack/spec check:docsAll sixteen were run on the final commit
1cb5a1b47(this branch merged withorigin/main), eachwith its output redirected to a file and
$?captured before any pipe. The last three neededprerequisites the checkout does not carry — they first reported
PREREQUISITE NOT MET(the gates'own words: "Nothing was measured") — so
@objectstack/formulaand@objectstack/lintwere builtand
packages/spec gen:schemawas run, and they were then measured green. Verdict lines, quotedfrom the gates themselves:
The rest of the derived family is repo-wide surface this diff does not touch (spec liveness,
type-check, ESLint) and is left to CI, which runs the farm regardless.
skip-changeset: this PR publishes nothing — the whole diff is fivecontent/docsMDX files.Filed, not fixed here
check-section-landing-indexenforces exactly this defect class ("a section landingpage enumerates its meta.json pages") but only over the 8 sections that carry the
What's in this moduleheading.kernel/contracts,conceptsandprotocolare outside thatcensus, which is how a catalog table naming five pages and linking none of them stayed green.
Bringing a section into the census means adding a body heading — epic epic(docs-site): the site is technically un-indexable — fix robots/sitemap/canonical/OG first, then the keyword shape #12243's territory, not
this PR's.
development phase, MINOR versions may contain breaking changes") on a platform shipping 17.2.0.
Content accuracy, not link repair.
Generated by Claude Code