Uh oh!
There was an error while loading. Please reload this page.
docs: retire the /graphql endpoint contract and its protocol-page residue - #10845
Conversation
) /graphql is not mounted. `packages/runtime/src/http-dispatcher.ts:2026` records its removal, there is no `createGraphQLDomain` among the domains registered at `http-dispatcher.ts:556-574`, and no `handleGraphQL` survives outside CHANGELOGs. Remove-vs-rewrite follows the 404/501 distinction in `packages/runtime/src/domains/unavailable.ts`: 404 = the route is not there; 501 = the route is there, the implementation is not. /graphql is in neither state, so it belongs in neither row of a catalog of servable routes. Deleted (the construct asserts a surface that does not exist): - `api/plugin-endpoints.mdx` — the whole `### GraphQL (/graphql)` section and its POST method/path table, plus GraphQL from the frontmatter enumeration. - `api/declarative-endpoints.mdx` — /graphql from the exemplar list pointing at that catalog; the two remaining examples are real mounted routes. - `protocol/diagram.mdx` — the `GQL[GraphQL]` node AND both its edges (`CLIENT --> GQL`, `GQL --> KERNEL`); mermaid materialises an undeclared node from a dangling edge, so deleting the declaration alone still renders a box. - `protocol/diagram.mdx` — GraphQL from the `src/api/` layer-table cell; that directory contains zero graphql files (re-measured). Rewritten (the surrounding claim is true; only the enumeration was wrong): - `protocol/diagram.mdx` sequence label → `HTTP Request (REST)`. - `protocol/kernel/lifecycle.mdx` → `Start HTTP server`, box width preserved. - `protocol/kernel/error-handling.mdx` → `(HTTP, WebSocket)`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…oval Keeps the em dash attached to the clause it belongs to instead of orphaning it at the start of a line, and refills the paragraph. No claim changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
✅ ACCEPT — reviewer of record: |
Uh oh!
There was an error while loading. Please reload this page.
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32490852845 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Fixes#10832
content/docs/api/plugin-endpoints.mdxhanded the reader a method, a path and a payloadcontract for a route that is not mounted. That is the same defect class as #10710, one
level worse: the earlier card advertised a behaviour, this one advertised an endpoint.
The three facts, re-measured at this base (
origin/main@5f2e54cc66)POST /graphqlis a servable routepackages/runtime/src/http-dispatcher.ts:2026is the whole of it:// /graphql removed — GraphQL is not in the product plan (#2462 follow-on).createGraphQLDomainanywhere inpackages/*/src(0 hits); the fifteen domains athttp-dispatcher.ts:556-574do not include one.src/api/contains a GraphQL modulepackages/spec/src/api/(re-measured: 68 files, 0 named graphql). The one string hit isprotocol.zod.ts:105, a docblock naming GraphQL as an industry design style — not a module.Remove vs. rewrite — reasoned per site, not applied uniformly
packages/runtime/src/domains/unavailable.tsdraws the line: 404 = "the route is notthere"; 501 = "the route is there, the implementation is not", and every 501 domain is
mounted unconditionally.
/graphqlis in neither state. So a construct whose job is toenumerate servable routes must lose the entry entirely — rewriting it to "not available"
would still assert GraphQL was a surface worth listing. That is why #10710 deleted its
status-table row.
But the card is right that a mermaid node and a prose enumeration are not the same object,
so the sites split two ways:
Deleted — the construct itself asserts a surface that does not exist:
api/plugin-endpoints.mdx— the entire### GraphQL (/graphql) — Plugin Requiredsectionand its
POST /graphqlmethod/path table, plus GraphQL from the frontmatter enumerationat
:3. A table headed Method | Endpoint | Description is a promise that the row is callable.api/declarative-endpoints.mdx—/graphqlfrom the exemplar list pointing at thatcatalog. The two survivors (
/auth,/automation) are real mounted domains.protocol/diagram.mdx— theGQL[GraphQL]node and both its edges (CLIENT --> GQL,GQL --> KERNEL). Deleting only the declaration would not have been enough: mermaidmaterialises an undeclared node from a dangling edge, so the box would still render, now
without its label.
protocol/diagram.mdx— GraphQL from thesrc/api/layer-table cell.Rewritten — the surrounding claim is true; only the enumeration was wrong:
protocol/diagram.mdx:163sequence label →HTTP Request (REST). The request is real; theparenthetical listed one transport too many.
protocol/kernel/lifecycle.mdx:70→Start HTTP server. Phase 6 genuinely starts a server.ASCII box width preserved (all Phase-6 rows remain byte-identical in length to their siblings).
protocol/kernel/error-handling.mdx:10→(HTTP, WebSocket). The error protocol does spanthe remaining surfaces.
Wording precedent followed:
content/docs/permissions/authorization.mdx:53, which alreadysays
/graphqlnow 404s and is left untouched.Sibling PR
#10828's diff was read before editing (its three files:
api/index.mdx,data-modeling/fields.mdx,getting-started/quick-reference.mdx). It is disjoint by filefrom all five files here — no overlap, no shared hunk. One correction to the dispatch premise:
that PR is still open and unmerged (base
a7ea3289eb, the previousmain), so its changesare not in
origin/main@5f2e54cc66; the threeapi/index.mdxGraphQL sites this branchleaves alone are its work, not residue.
Gates
node scripts/pm/dispatch-gates.mjsderived 15 families from the changed paths — includingcheck:error-status-conformance, which the dispatch clue list did not name and which matchesonly via
protocol/kernel/error-handling.mdx. All 15 green at451fe92153, the head ofthis branch. Exit codes captured by redirect before any pipe, never off a
tail; each logverified to carry real output, so no
pnpm --filterzero-match could pass as green. Their ownverdict lines:
check:doc-anchors— "272 internal #fragment link(s) across 408 source file(s) all resolve to a real heading" — the deleted###heading broke no anchor (independently confirmed: no#graphqlfragment exists anywhere incontent/).check:error-status-conformance— "every derivable runtime status is documented, and every documented status is reachable."check:doc-authoring— "389 files clean — no bare metadata literals."check-doc-frontmatter— "403 page(s) under content/docs parse with yaml@2.9.0"check:docs-audit-scope— "scope is in sync with content/docs/: 189 hand-written doc(s)"check:docs-redirects— "OK (apps/docs/redirects.mjs: 92 entries ...)"check:doc-formula-expressions— "self-test: 30 cases passed", "22 record-scoped formula example(s) ... judged clean"check:role-word— "OK, no new occurrences of the reserved word."check:published-readme-links— "165 outbound link(s) across 60 published markdown file(s)"check:cross-package-test-inputs(×2, pnpm + direct node) andspec/check:{empty-state,liveness,strictness-ledger,variant-docs}.check:quick-reference-countsis not in the derived set here — it keys onquick-reference.mdx, which is #10828's file and not in this diff.No ablation applies: this is a docs-only change with no guard under test.
No changeset — decided from the real file list, not defaulted. All five files are under
content/, which matches no glob inpnpm-workspace.yaml(packages/*,apps/*,examples/*, …), and its only consumerapps/docs(@objectstack/docs) isprivate: true.This publishes nothing ⇒
skip-changeset.Deliberately not touched
packages/**— out of scope for this card. The code is correct; the docs were wrong.content/docs/automation/webhooks.mdx:724— a comparison to other ecosystems, not a claimabout our surface.
content/docs/permissions/authorization.mdx:53— already correct; it is the precedent.content/docs/kernel/services-checklist.mdx:17,97andgetting-started/index.mdx:99—already correct: they state GraphQL was removed.
content/docs/references/**— generated, filed against the generator during [finding] GraphQL residue outside #10583's site list:api/index.mdxstill documents a/graphqlroute that the dispatcher removed #10710's triage.skills/**and its mirrorcontent/docs/ai/skills-reference.mdx:156— GraphQL residue foundin five places, but the source of truth is
skills/**, which is governed/human-merge-only.Filed separately rather than patching the consumer page into disagreement with the skill it
catalogs.
Generated by Claude Code
Generated by Claude Code