Repository navigation
docs(spec): the routes / App.apis retire text stops sending app authors to an imperative http.server route (ruling C′ item 2) - #23785
Conversation
…o an imperative http.server route An app declares apis:, computes in a flow, and registers code as a stack function or a connector; http.server stays the platform's own primitive. Claude-Session: https://claude.ai/code/session_017dvSKLgBT3sjuE98di6PW1 Co-authored-by: Claude <noreply@anthropic.com>
…re text Claude-Session: https://claude.ai/code/session_017dvSKLgBT3sjuE98di6PW1 Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 5 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 4 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 142 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 6a531afee033122bbb394ba9d38426c72d4edb9e && git checkout 6a531afee033122bbb394ba9d38426c72d4edb9e
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin d3df3ba24bbbb280d138d98fed7af5fe05f4a9ce 846feb0c37f9c98ea5e4ed13e8d0638c222cb5f7 && git checkout -B drift-repro d3df3ba24bbbb280d138d98fed7af5fe05f4a9ce && git merge --no-ff 846feb0c37f9c98ea5e4ed13e8d0638c222cb5f7
node scripts/docs-audit/affected-docs.mjs --json d3df3ba24bbbb280d138d98fed7af5fe05f4a9ce
|
席位核对 · ACCEPT · PR #23785 @
|
Contract reviewServed-tier: Inputs read: card #23216 body and all three comments (pointer ① Derived judgmentsAccept set: nothing moves. Public-surface text changes the diff implies, each judged:
Gate verdicts on the head at the time of this record: 27 check-runs green, 5 skipped by path filter (Console Pin Gate, Temporal Conformance, Dogfood shards, Packed-tarball smoke), and 7 still in progress (Test Core 1/6 to 6/6, Type Check · workspace). The dev's three locally unmeasured families are CI-owned and sit under Build Core (green) and the still-running jobs; nothing in this record depends on their outcome, since the verdict is decided by item 4 above. ② Semver level
③ Boundary flags
Implemented-by: VERDICT: FAIL Generated by Claude Code |
…resenting http.server as the app-author door Claude-Session: https://claude.ai/code/session_017dvSKLgBT3sjuE98di6PW1 Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017dvSKLgBT3sjuE98di6PW1 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs read: card #23216 body and all six comments (pointer 6147168221, claim 6205765363, round-1 dev report 6206484307, ACCEPT pointer 6206598227, patch round 6206654655, round-2 dev report 6207289001); PR #23785 body, its 17-file list, and its three comments including the first contract review 6206636299 (FAIL on the earlier head 3c31cd9); the net diff of the branch against ① Derived judgmentsAccept set: nothing moves. Public-surface text changes the diff implies, each judged:
The dev's sweep ledger was re-derived, not trusted: Gate verdicts on the head at the time of this record: 48 check-runs, 41 success, 7 skipped by path filter (Auto Label, Check PR Size, Console Pin Gate, Dogfood Regression Gate matrix, Dogfood Verify CLI, Packed-tarball smoke, Temporal Conformance), 0 failed, 0 in progress. The four ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #23216
Clause-②: no
Ruling C′ on #23128 (
6142279866), item 2: the imperativehttp.serverroute is retired as an app-author surface. This PR changes the retire text and the published copies so they no longer send app authors to akernel:readyhandler. An app declaresdefineStack({ apis })(type: 'object_operation'or'flow', ADR-0121), computes in a flow, and registers code as a stack function (defineStack({ functions })) or a connector. Thehttp.serverservice,core-service-contracts.tsand the platform plugins that mount on it are untouched. No key is added or removed.What changed
packages/spec/src/kernel/manifest.zod.ts(contributes.routesretire message + TSDoc)packages/spec/src/ui/app.zod.ts(App.apisretire message)http.serverservice … register the route onkernel:ready". This is the source of themetadata.mdx/app.mdxhits that the acceptance grep covers, and the claim namesmetadata.mdx"where it renders the same text". Code now goes to a flow plus a stack function or connector.packages/spec/src/migrations/entries/semantic/18.plugin-manifest-contributes-routes-retired.tsreplacementno longer gives the imperative advice or names the deleted showcasePOST /api/v1/showcase/recalcroute.acceptanceCriterianow describes the current teaching sites.reasonis kept as is, because it records the earlier ruling.packages/spec/src/api/plugin-rest-api.zod.ts:34-39TSDocpackages/spec/src/api/dispatcher.zod.tsdocblock item 4 (+ generatedapi/dispatcher.mdx)6206636299on3c31cd913e):http.serveris the platform plugins' own door-building primitive; an app declaresdefineStack({ apis }), computes in a flow, and registers code as a stack function or connector. Thecontributes.routesremoval clause is kept.packages/spec/src/kernel/metadata-plugin.zod.ts:119,127,manifest.zod.ts:753,retired-keys/18.kernel__Manifest__contributes.routes.ts:10, migration 18reasonpackages/spec/liveness/manifest.jsonrow notehttp.serveris described as the platform plugins' primitive.scripts/check-optional-error-sink-contract.mjs:164scope commentexamples/**now holds zero further red sinks, not one, because the recalc route was deleted. Comment only.packages/spec/src/kernel/manifest.test.ts…http\.server(the old advice). It now asserts the new rule's substance (does not mount routes on http.server…defineStack({ apis })… flow …defineStack({ functions })… connector) and thatkernel:ready/ the imperative wording does not come back. The pin is changed, not deleted.content/docs/references/**(5 pages)pnpm --filter @objectstack/spec check:generated --fix(it proved onlycheck:docsstale) rewrotekernel/manifest.mdx,api/package-api.mdx,api/metadata.mdx,ui/app.mdx,api/plugin-rest-api.mdx..changeset/23216-routes-retire-text.md@objectstack/specpatch.Each of the four pointer sites from
6147168221was re-read onmainat4fe8b3def. All four were still stale, and all four are edited here; none had been fixed already.Acceptance
git grep -n "mounted imperatively" -- packages/spec content/docsfinds nothing (exit 1).content/docs/references/kernel/manifest.mdx:92): "… Delete the key. An app does not mount routes onhttp.server— that service is the platform's own door-building primitive, … Declare the endpoint underdefineStack({ apis })(type: 'object_operation'or'flow', ADR-0121), compute in a flow, and register code as a stack function (defineStack({ functions })) or a connector."pnpm --filter @objectstack/spec build && pnpm --filter @objectstack/spec check:generated: "All 14 generated artifacts are up to date", exit 0.pnpm --filter @objectstack/spec typecheck && pnpm --filter @objectstack/spec test: 680 files, 20784 passed, 1 todo, exit 0. This includesretired-key-migrate-sentence.test.tsand its family, andmanifest.test.ts.846feb0c(134 families): 131 exit 0, 3 NOT MEASURED (exit 3, declared to CI: teardown-shape self-test, dual-build-cjs-loads, lean-entry-closure);--ranreconciles 134 / 131 / 3 / 0 UNRUN, exit 0.Imperativ sweep (patch round)
git grep -n -i imperativ -- packages/spec/src content/docs (releases/ excluded) at 846feb0. FIXED (app-author route advice): api/dispatcher.zod.ts:17 + references/api/dispatcher.mdx:19; kernel/metadata-plugin.zod.ts:119,127; kernel/manifest.zod.ts:753 (provenance, supersede note added); migrations/entries/retired-keys/18.kernel__Manifest__contributes.routes.ts:10 (same); semantic/18.plugin-manifest-contributes-routes-retired.ts reason (closing sentence added). KEPT, platform-only: api/plugin-rest-api.zod.ts:32 + plugin-rest-api.mdx:32 heading, now 'Serving routes from a platform plugin (imperative http.server mount)'; the example is a platform plugin mounting its own doors, which the ruling keeps. KEPT, provenance of the 2026-08-22 ruling, with the narrowing now stated in the same field: semantic/18…routes-retired.ts reason lines 23/33/41. KEPT, different capability (not routes or http.server): manifest.zod.ts:811 and semantic/18.plugin-manifest-contributes-dead-members-retired.ts:15/36 plus retired-keys/18…contributes.events.ts:10 (event subscription in plugin code); manifest.zod.ts:851 + package-api.mdx:233/manifest.mdx:88 (engine.registerAction); studio/plugin.zod.ts + references/studio/plugin.mdx (Studio component activation). KEPT, unrelated word sense: concepts/glossary/protocol prose 'imperative code' vs declarative; retired-key.ts:303, retired-key.test.ts:159, ui/component.test.ts:1375/1382, ui/form-option-enum-derive.test.ts:86, kernel/manifest.test.ts:406/552 ('an imperative fix' = an imperative-mood prescription); manifest.test.ts:462 is the negative pin itself. kernel:ready beside http.server sweep: only content/docs/kernel/events.mdx:22/35 and contracts/plugin-lifecycle-events.ts:77, which describe kernel lifecycle and platform HTTP middleware, not app routes; kept. git grep 'mounted imperatively' -- packages/spec content/docs: exit 1.
Acceptance notes
skills/objectstack-api/SKILL.md:119still has a decision-table row: "http.servermount (plugin code) — The endpoint needs real handler CODE … Mount it onhttp.server." It is the same retired advice, and its evalskills/objectstack-api/evals/endpoints-auth-routes.jsonmay pin it. Both are outside this card's claimed surface, andskills/**is a Tier H governed surface, so they are not edited here. They are reported to the seat to file.🤖 Generated with Claude Code
https://claude.ai/code/session_017dvSKLgBT3sjuE98di6PW1
Generated by Claude Code