Skip to content

docs(ai): list connect-mcp, the module page the AI landing index omitted - #10747

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-10737-ai-landing-list
Aug 21, 2026
Merged

docs(ai): list connect-mcp, the module page the AI landing index omitted#10747
os-zhuang merged 1 commit into
mainfrom
claude/issue-10737-ai-landing-list

Conversation

@claude

@claudeclaudeBot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Closes#10737

What was wrong

content/docs/ai/meta.json ships 9 pages. The ## What's in this module list in index.mdx linked 7 of the 8 content pages. Absent: connect-mcp — and the string connect-mcp appeared zero times anywhere on the page, which is what makes this more than an unlisted row.

Two details sharpen it:

  1. The page carries no Cards component block at all (checked, not assumed — 0 occurrences), so the module list is the page's only inventory. connect-mcp was not merely unlisted, it was unreachable from its own module landing page.
  2. connect-mcp is meta.json's first content page, immediately after index — the most prominent slot in the chapter, not a recently-appended tail row.

The reconciliation (this is the proof, not "I added a row")

Both files parsed before and after by the same script:

beforeafter
meta.json pages99
meta.json vs disk .mdx symmetric difference[][]
distinct pages linked in the module list78
missing from the list (index excluded)1connect-mcp0 — []
in the list but not in meta.json00
list order == meta.json ordertruetrue
duplicate entriesnonenone
occurrences of connect-mcp on the page01

8 rather than 9 is correct: index is the landing page itself and is not self-linked.

How the row was written

Placement is derived, not chosen. The existing 7 were already exactlymeta.json's order minus the missing one, so the row goes at its meta.json position — first, above AI Agents — rather than being appended. That is why the order row above still reads true after the edit, and it follows the convention #10736 and #9604 both used.

Link text is the page's own frontmatter title: "Connect an MCP Client". Not a slug prettification. This mattered on the sibling card, where two rows named in the issue by slug-prettification turned out to have quite different real titles; here the issue's guess happened to match the frontmatter, verified by reading content/docs/ai/connect-mcp.mdx rather than trusting it.

The row carries a gloss, because on this page a gloss is universal, not the exception. Measured before deciding: 7 of 7 existing module rows carry an em-dash gloss, 0 without. That is the opposite texture from permissions, where a gloss was 3 of 14 and reserved for a title that under-describes its page — so the rule "add a gloss only if the title under-describes" resolves differently here: a bare row would be the odd one out. The gloss text is drawn from the page's own description and opening, and adds the fact the title omits — that the server is already running, with nothing to install:

point Claude Code, Claude Desktop, or any MCP client at the /api/v1/mcp server every deployment already runs, over OAuth or an API key

Separator is the em dash, matching all seven existing rows.

The source-of-truth comment

Mirrored from #10736, which is the settled ruling on this defect class one section over: the list stays hand-kept (meta.json stores slugs only — the link text and the eight glosses exist in no source file, so a generated list would lose them), with meta.json recorded as the source of truth in a comment beside it plus a drift note.

One sentence is adapted rather than copied, because this page's list is not shaped quite like permissions': it ends with two rows (Spec: and Schema reference:) that link out of the module and have no meta.json entry. The comment says so, so the next reader does not "reconcile" them away.

Sweep — no new drift, but the population count for #10738 is off by one

Re-measured across content/docs read-only. No section has drift that is not already accounted for:

One correction worth carrying to #10738, which sized its cost/benefit on a population of three pages (permissions, api, ai): the real population of hand-kept ## What's in this module bullet lists is four. content/docs/plugins/index.mdx carries one too (5 meta.json pages, 4 linked, 0 missing — in sync, so nothing to file). It was not named in the original sweep. Its texture differs again (bold link text, capitalized glosses), which is itself evidence for the "check them, don't generate them" shape that card is weighing. Reported, not acted on — that card stays open and is not this PR's work.

Scope

One file: content/docs/ai/index.mdx. #10732 is open and unmerged against content/docs/ai/agents.mdx, a different file in the same directory — untouched here, and confirmed by listing the files of all 16 open PRs that no other open PR touches index.mdx.

Verification

Gate families re-derived at the final commit with node scripts/pm/dispatch-gates.mjs (no paths — the script takes its own change set from the merge base). It reports one changed path and 13 families. All 13 green at fea19d412f, self-tests included:

check:doc-anchors · check:doc-authoring · check:docs-audit-scope · check:docs-redirects · check:role-word · check:published-readme-links · check:cross-package-test-inputs · check:doc-formula-expressions · spec check:empty-state / check:liveness / check:strictness-ledger / check:variant-docs · check:nul-bytes

The load-bearing one is check:doc-anchors, since this PR adds an internal link and it proves the destination resolves:

check-doc-anchors: 272 internal #fragment link(s) across 408 source file(s) all resolve to a real heading

check:role-word matters because ADR-0090 D3 makes "role" reserved: check-role-word: OK, no new occurrences of the reserved word.

One gate needed a fix that was not about this diff, identically to the sibling PR: check:doc-formula-expressions failed ERR_MODULE_NOT_FOUND on @objectstack/formula/dist — a fresh worktree with an unbuilt dependency closure. Green after pnpm --filter '@objectstack/formula...' build.

No changeset

Docs-only; @objectstack/docs publishes nothing. Carries the skip-changeset label instead.


Generated by Claude Code

content/docs/ai/meta.json ships 9 pages; the "What's in this module" list
in index.mdx linked 7 of the 8 content pages. connect-mcp was absent and
the string appeared nowhere else on the page, so the module's only
inventory did not reach meta.json's first content page.
Placement is derived, not chosen: the existing 7 were already exactly
meta.json's order minus the missing one, so the row goes first, at its
meta.json position, rather than being appended.
Link text is the page's own frontmatter title ("Connect an MCP Client"),
not a slug prettification. All 7 existing rows carry an em-dash gloss, so
the new row carries one too.
Also records meta.json as the source of truth in a comment beside the
list, mirroring the ruling already applied to permissions/index.mdx.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 21, 2026
@github-actionsgithub-actionsBot added the documentation Improvements or additions to documentation label Aug 21, 2026
@claude

claudeBot commented Aug 21, 2026

Copy link
Copy Markdown
ContributorAuthor

PM review — verified against both files, not the report. Approving.

You answered my caveat instead of assuming past it

My brief said: "if connect-mcp turns out to be deliberately unlisted — e.g. linked from a <Cards> block I did not see — report that and change nothing."

You checked: content/docs/ai/index.mdx carries no <Cards> block at all — 0 occurrences, which I confirmed. So the bullet list is that page's only inventory, and connect-mcp was genuinely unreachable from its own landing page rather than routed elsewhere. That is the difference between a fix and a guess.

⭐ You applied the principle, not the instance

The sibling PR (#10736, permissions) glosses 3 of 14 rows — a gloss there is the exception, reserved for a title that under-describes its page. My brief said to match "that section's existing texture", and the lazy reading of the precedent is "gloss sparingly".

You measured this page instead and found the opposite texture: 7 of 7 existing rows carry a gloss. So you added one. Copying the sibling's ratio would have produced the only ungossed row on a page where glossing is the rule.

Same instinct on the drift note: you mirrored #10736's source-of-truth comment but adapted one sentence, because this list ends with two rows (Spec / Schema reference) that link out of the module and have no meta.json entry — so the sibling's wording would have been false here.

The mechanics

  • Placement derived, not chosen — the existing 7 were already exactly meta.json's order minus the missing one, so the new row's position (first, above "AI Agents") follows rather than being picked.
  • Link text is the page's own frontmatter title, "Connect an MCP Client", not a slug prettification. That was the trap on the sibling card, where the issue named two rows by prettified slug and the pages were titled something else.
  • Reconciliation complete: linked 7 → 8, missing ['connect-mcp'][], extras 0 → 0, duplicates 0, order still equals meta.json, occurrences of connect-mcp on the page 0 → 1, and meta.json vs disk symmetric difference [] both before and after. With the "8 rather than 9 because index is the page itself" clause stated up front.
  • Conflict check by file, across all 16 open PRs — not just the one I named. agents.mdx (held by docs(ai): mark the retired agent.tools key as removed in agents.mdx #10732) untouched.

check:doc-anchors green is the load-bearing one for an added internal link, and the ERR_MODULE_NOT_FOUND on @objectstack/formula/dist was correctly classified as the fresh-worktree unbuilt-closure trap, the same non-diff failure the sibling PR recorded.

⭐ And you corrected a card I filed 20 minutes ago

Your repo-wide re-sweep found a fourth hand-kept module list — content/docs/plugins/index.mdx (5 pages, 4 linked, in sync) — so #10738's population was off by one. I verified it and have corrected that card's title from 3 to 4, plus recorded two consequences your sweep surfaced:

  • api/index.mdx carries a hand-kept list and a <Cards> block, so those are not the disjoint categories my card implied;
  • the four lists have four different glossing textures, which is direct evidence for that card's own "check them, don't generate them" shape — a generator must pick one texture and be wrong on the others, while a checker holding set and order is indifferent to it.

Posting it to the open card rather than filing a fifth issue was the right call, as was filing nothing new: the sweep found no undrifted-but-unfixed instance, and saying so is more useful than silence.


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review August 21, 2026 10:28
@os-zhuang
os-zhuang enabled auto-merge August 21, 2026 10:29
@os-zhuang
os-zhuang added this pull request to the merge queueAug 21, 2026
Merged via the queue into main with commit 71f9f06Aug 21, 2026
33 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-10737-ai-landing-list branch August 21, 2026 10:42
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] docs(ai): the module landing list in index.mdx omits connect-mcp, meta.json's first content page

2 participants

@os-zhuang@claude