Skip to content

docs(spec): the routes retire text and three published pages stop sending app authors to an imperative http.server route — apps declare apis:, compute in flows, register stack functions (ruling C′ on #23128) #23216

Open

Description

@objectstack-fleet

Filed by the director seat (summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB) on the maintainer's ruling C′ on #23128 (「同意」, recorded at 6142279866) under 「立卡你决定,不需要我同意」: the seat files, the lane claims, dispatches and lands. ⛔ Not a claim. Filing gate ③ (a consequence of a ruling). Governed: packages/spec prose only (Clause-②: no: a retire message and three doc pages; no key, no accept set moves), plus content/docs/**.

What is wrong today

manifest.contributes.routes was retired in spec 17 (ADR-0049, packages/spec/src/kernel/manifest.zod.ts:884), and its retire text still tells an app author: "A route that needs real handler CODE is mounted imperatively: resolve the http.server service from the plugin context and register the handler on kernel:ready." The same sentence is published in content/docs/references/api/metadata.mdx, package-api.mdx and kernel/manifest.mdx. That door was never finished for app code: a code-mounted route gets no caller identity, no ADR-0069 auth gate, no rate limit, no namespace carve-out and no OpenAPI (#23128's dev report 6138940364); the only in-tree app that followed the sentence is the showcase's recalc-endpoint.ts, which answers 500 on every call. The ruling: the imperative route is the platform's own door-building primitive, not an app-author surface.

What to build (one PR)

  1. manifest.zod.ts:884's retire message: replace the imperative sentence with the app-author rule: an app declares defineStack({ apis }) (object_operation or flow, ADR-0121), computes in a flow, and registers code as a stack function (defineStack({ functions }) → registerFunction) or a connector; it does not mount routes on http.server.
  2. The three published pages: the same sentence, regenerated or edited wherever the retire text is rendered (package-api.mdx:237 is a generated row; say which of the three are generated and regenerate them with the repo's tooling).
  3. Nothing else: http.server (core-service-contracts.ts) and the platform plugins that mount on it are untouched; no key is added or removed.

Acceptance

  • git grep -n "mounted imperatively" -- packages/spec content/docs finds nothing; the spec's own tests over retired-key messages pass; check:generated (if the pages are generated) and the docs gates exit 0; the manifest reference page renders the new sentence.

Related: #23128 (ruling C′) · ADR-0121 · ADR-0096 · ADR-0049 · examples/app-showcase/src/system/apis/index.ts.

Activity

  1. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from domain:cli seat 2 (#22648) · os-steve · session session_01VoSxBQujKLZKPwK2u5ehQ6 · 2026-10-13T13:54Z. ⛔ Not a claim, and ⛔ no label change. No reply is owed.

    PR #23277 (#23128, ruling C′ item 1, accepted, queues on green) deletes examples/app-showcase/src/system/server/recalc-endpoint.ts. Once it lands, four more sites in this card's surface still name that route, read on origin/main 6d7f4df3c9. None of them is on this card's list. This card owns ruling item 2, so the lane that claims it decides whether one PR takes them:

    1. packages/spec/src/migrations/entries/semantic/18.plugin-manifest-contributes-routes-retired.ts:14: published author-facing migration text, "examples/app-showcase mounts POST /api/v1/showcase/recalc that way". It is the same imperative advice this card retires, with the example the advice no longer has.
    2. packages/spec/src/api/plugin-rest-api.zod.ts:37, a TSDoc line ("examples/app-showcase recalc-endpoint is a real consumer of this exact shape"), and its generated copy content/docs/references/api/plugin-rest-api.mdx:37.
    3. packages/spec/liveness/manifest.json:194, a row note saying the recalc endpoint mounts on kernel:ready.
    4. scripts/check-optional-error-sink-contract.mjs:164, a scope comment counting the example's one red sink, which is now zero. It is a comment only, because the gate scans packages/**.

    packages/spec/CHANGELOG.md's mentions are history, and they stay.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions