Uh oh!
There was an error while loading. Please reload this page.
feat(spec): retire RestApiEndpoint.handlerStatus and the Route Coverage Report shapes (#13823) - #14531
Conversation
…ge Report shapes (#13823) WIP: tombstone, three whole-def removals, ADR-0087 registrations (key, defs, D3 semantic entry), pin tests and changeset. Generated artifacts follow in the next commit. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GDA48PuRFrHyRfdkBz8m21
…age retirement (#13823) json-schema.manifest and authorable-surface rows for the three whole-def removals deleted deliberately (route 3 — the #4725 manifest deletion gate and check (c) adjudicated them against RETIRED_DEFS_BY_MAJOR[18]); the tombstone row carries [RETIRED]; api-surface / export-origins / declaration-map lose the six retired names; the reference page and the strictness-ledger counts regenerate. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GDA48PuRFrHyRfdkBz8m21
…ic pin count rebalanced 835 -> 832 (#13823) check:doc-authoring refuses an issue id in customer-facing spec text — the prescription now cites ADR-0049 only (the id stays in the adjacent comment), with a negative pin. The type-alias pin count drops by the three pins whose schemas left the module, recorded in the file's own history block. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GDA48PuRFrHyRfdkBz8m21
…3823) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GDA48PuRFrHyRfdkBz8m21
📓 Docs Drift Check14 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. What this run could not see
Coarse fallback — 128 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 ba96272f6fedf9a4afda784a9aaaf3e413d04262 && git checkout ba96272f6fedf9a4afda784a9aaaf3e413d04262
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 99b8faf8f937d8d2992f1bf167e418687c5f2f71 875e3fa5eb9d9baa0c644041e001cb1148f3f2f5 && git checkout -B drift-repro 99b8faf8f937d8d2992f1bf167e418687c5f2f71 && git merge --no-ff 875e3fa5eb9d9baa0c644041e001cb1148f3f2f5
node scripts/docs-audit/affected-docs.mjs --json 99b8faf8f937d8d2992f1bf167e418687c5f2f71 |
CI red on head
Generated by Claude Code |
…eipt to 832 (#13823) Title, header and receipt already said 832; the toHaveLength literal under the receipt still read 835 (Test Core 2/6 on the PR head, and the local full run: 1 failed / 12190 passed). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GDA48PuRFrHyRfdkBz8m21
…e base (#13823) The published skill taught handlerStatus at this PR's base; main dropped that teaching in the #14448 optimization flight (bae4088), so the changeset — release-notes input — no longer claims an outstanding skills limb. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GDA48PuRFrHyRfdkBz8m21
Uh oh!
There was an error while loading. Please reload this page.
Fixes#13823
Ruling implemented
Director decision batch #27, maintainer 2026-09-01 verbatim 「同意」 (issue comment 5494755488), implemented exactly:
Clause ② applies (the published accept set narrows): draft PR,
needs:contract-reviewon both carriers, in-seat review. Item 4 is recorded here as the class direction for #13612 / #13613 — not ruled by this PR.Premise re-measured on
origin/main(a9b2be0, 2026-09-02)Identifier search for
handlerStatus,skills/**and tests excluded — three hits, all in the declaring file:packages/spec/src/api/plugin-rest-api.zod.ts:177RestApiEndpointSchema(HandlerStatusSchema.optional())packages/spec/src/api/plugin-rest-api.zod.ts:1415RouteCoverageEntrySchemapackages/spec/src/api/plugin-rest-api.zod.ts:1431handlerStatus !== 'implemented'Plus
CHANGELOG.md:1502(history) and generated artifacts.DispatcherErrorCode.enum.NOT_IMPLEMENTEDemitters, none consulting the key:packages/runtime/src/endpoint-executor.ts:320,505,517,packages/runtime/src/api-mapping.ts:225, and one more than the card counted —packages/runtime/src/api-endpoint-step.ts:343— every one the declarative-endpoint executor refusing a target or mapping it cannot serve.RouteCoverageEntrySchema/RouteCoverageReportSchemaconstructors: zero in objectstack (only the type-alias pin and generated artifacts reference them), zero in objectui at the pinned shad8ec8d6d, zero in cloud.RestApiEndpointSchemaitself is parsed by nothing in the tree outside its own unit tests. Premise still valid; no consumer has appeared.Teaching sweep (before retiring)
content/docs/references/api/plugin-rest-api.mdx:200,375,408,424,442handlerStatus/ the coverage shapesgen:docs(tombstone row now reads[REMOVED] …; coverage sections gone)content/docs/references/index.mdx:90HandlerStatus,RouteCoverageEntry,RouteCoverageReportcontent/docs/**hand-written treeshandlerStatus; the501prose atapi/index.mdx:161,171,kernel/services-checklist.mdx:193,permissions/authentication.mdx:1243,1281describes the service-slot / discoverystatus501, not this keyexamples/**,packages/*/README.md,packages/create-objectstack/**skills/objectstack-api/SKILL.md(at this PR's base a9b2be0::136handlerStatus: 'implemented',inside theos:check-markedRestApiEndpointSchema.parse({...})example;:380the501 NOT_IMPLEMENTED — Route declared but handler is a stubtable row;:383-391the "Handler Status" section;:393-395flight ⑦'s PR #13808 correction)main:bae4088f3(#14448, 08:27Z today) cut every one —git grep -n -i -E 'handlerStatus|handler status|RouteCoverage|HandlerStatus' origin/main -- skills/returns zero hits at99b8faf8f, withRestApiEndpointstill hitting the skill as the live control — so no skills-lane follow-up is needed. (check:skill-exampleswas measured green against the base's marked block too:parsetakesunknown, so the tombstone'sneverinput type never reached it.)Retirement steps (spec-property-retirement playbook)
RestApiEndpointSchemais a non-strictlazySchema(() => z.object(...))⇒retiredKey()tombstone for the key (packages/spec/src/api/plugin-rest-api.zod.ts:208-217), prescription hoisted asHANDLER_STATUS_RETIRED(:131-138) under the retirement record (:91-130).RouteCoverageEntrySchema/RouteCoverageReportSchema⇒ whole-def removal, route 3 (nobody parses or constructs one), recorded at the file tail (:1439-1453).HandlerStatusSchema/HandlerStatus⇒ orphan value def once both carriers are gone (refactor(spec)!: remove the plugin sandboxing / integrity / approval config that never existed (#3896 follow-up) #3950, theui/ThemeModeprecedent) — removed with them.dead, confirmed by the re-measure above. No ledger row moves:RestApiEndpointSchemais outside the walked population — it is not a registered metadata type and not inSPEC_ONLY_SCHEMAS(packages/spec/scripts/liveness/check-liveness.mts:328) — so there is no row to write and adding one would be an ORPHAN. The verdict is recorded in the schema comment, the D3 entry and the changeset.registry.tsregenerated bygen:migration-registry:entries/retired-keys/18.api__RestApiEndpoint__handlerStatus.ts;entries/retired-defs/18.api__HandlerStatus.ts,18.api__RouteCoverageEntry.ts,18.api__RouteCoverageReport.ts;entries/semantic/18.rest-api-endpoint-handler-status-retired.ts. No D2 conversion, deliberately — a REST API plugin route registration is not a stack collection member and never asys_metadatarow, so aMetadataConversionwould be a transform with no seam that ever runs (thekernel/Manifest:loading/kernel/KernelContext:previewModedisposition); for the same reason the tombstone carries noos migrate metasentence. Registered under 18 (launch-window convention).spec-changes.jsonand the upgrade guide are unchanged because both project majors up toPROTOCOL_MAJOR(17) only — the same as every 18-registered precedent.json-schema.manifest/api.json−3 keys (deleted deliberately; the json-schema.manifest.json 的「deliberate removal」删行仍是纪律而非门禁 —— #4650 的同类洞,上移一层(整 schema 级) #4725 manifest deletion gate adjudicated all three againstRETIRED_DEFS_BY_MAJOR[18]);authorable-surface/api.json−10 rows for the two defs (route 3, check (c) proof) andapi/RestApiEndpoint:handlerStatus→… [RETIRED];api-surface/api.json,export-origins/api.json,declaration-map/api.json−6 names each;content/docs/references/**and the strictness-ledger counts regenerated bycheck:generated --fix.authorable-surface.base.jsonlags (allowed;check:authorable-surfacegreen).*.form.tsoffers the key; no bundle changes.packages/spec/src/api/plugin-rest-api.handler-status-retirement.test.ts: all three former values (including the documented default'implemented'— prose only, never a Zod.default(), so no residue window) refused withcode: 'invalid_type',path: ['handlerStatus']and the prescription text (ADR named, no issue id); the same refusal through the route-registration embed at['endpoints', 0, 'handlerStatus']; positive control — a well-formed endpoint without the key parses and grows nohandlerStatusproperty; the eight shipped default route registrations still parse; a tsc-channel pin (@ts-expect-error, file proven in thetsconfig.test.jsonprogram via--listFiles); zero holders for all six retired names on every public entry with the carriers surviving;RETIRED_KEYS_BY_MAJOR[18]/RETIRED_DEFS_BY_MAJOR[18]/ step-18 semantic membership.type-alias-convention.pin.test.ts: pinsIso123/Iso125/Iso126left with their schemas, count rebalanced 835 → 832 with the file's history note..changeset/rest-api-endpoint-handler-status-retired.md—@objectstack/specminor, BREAKING under the launch-window convention, FROM → TO + one-line fix, ADR-0087 markerregistered rest-api-endpoint-handler-status-retired(check:adr-0087-registrationgreen).Verification
Every heavy step ran under
scripts/pm/os-verify-lock.sh(OS_VERIFY_LOCK_SLOT=issue-13823); every exit captured before any pipe; the gates' own verdict lines quoted.Final head
875e3fa5e(chain 4):pnpm --filter @objectstack/spec buildexit 0 (gen:schema: "3 schema(s) left the published set since a9b2be0, each declared (#4725)" and "2 baseline deletion(s) since a9b2be0 carry their own proof (#4650)";check-dts-emitted: 34/34);check:generated(check-only) exit 0 — "✓ All 15 generated artifacts are up to date."; targeted vitest viaexec vitest run --maxWorkers=2 FILES(type-alias-convention.pin,plugin-rest-api.handler-status-retirement,plugin-rest-api,retired-key-migrate-sentence,migrations) — "Test Files 5 passed (5)" / "Tests 172 passed (172)";check:skill-examplesexit 0 — "✅ 265 prose examples type-check across 3 surface(s)" (the@objectstack/client-reactclosure was built for it);check:adr-0087-registrationexit 0 — "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition";check:empty-changeset,check-changeset-no-major,check:nul-bytes,check:doc-authoring,check:spec-parsed-aliasall exit 0;git status --porcelainempty after the build (theauthorable-surface.base.jsonanchor was not rewritten — it lags, allowed).7cbf0ed60(chain 3, the pin-literal fix): targeted vitest 5 files / 172 tests passed;check:test-typecheckexit 0;check:spec-parsed-alias/check:doc-authoring/check:nul-bytesexit 0;check:api-surfacerefused to judge ("dist/**/*.d.ts is OLDER than packages/spec/src" — the test-file edit post-dated the build; not a measurement, settled by the rebuild above).90d567cd3(chain 2, the full union):pnpm --filter @objectstack/spec typecheckexit 0 (tsc, the scripts tsconfig, and "check:test-typecheck: OK — 54 file(s) / 262 error(s) / 146 pinned signature(s)", ledger unchanged, so the new test file compiles clean; its membership in thetsconfig.test.jsonprogram proven withtsc --listFiles); full spec vitest--maxWorkers=2: "Test Files 1 failed | 451 passed (452)" / "Tests 1 failed | 12190 passed (12191)" — the single failure wasstill declares all 832 isomorphic pins(thetoHaveLengthliteral still 835; the same red CI reported on Test Core 2/6), fixed in7cbf0ed60and green in chains 3 and 4;check:skill-examplesexit 0;check:exported-any,check:dual-source-exports,check:entry-nameability,check:browser-reachable-entriesexit 0;check:generatedexit 0 (15/15);check:doc-authoring/check:nul-bytes/check:adr-0087-registration/check:spec-parsed-aliasexit 0;check-dev-prereqsexit 1 = "The workspace is not built — 32 of 67 workspace packages declare an entry point under dist/ that is not on disk" (apnpm devprecondition on apps and services, unrelated to this diff — NOT MEASURED, not red).Earlier on the same tree (before the docs-only, test-literal and changeset-prose commits):
check:variant-docs,check:empty-state,check:llms-txt,check:yaml-examples,check:template-manifests,check:error-code-provenance,check:objectui-pin-citations,check:quick-reference-counts,check:corpus-claim-drift,check:skill-identifier-liveness,check:doc-anchors,check:docs-single-h1,check:docs-audit-scope,check:test-source-alias,check:cross-package-test-inputs,check:published-files,check:type-check-coverage,check:migration-registryandcheck:liveness(both insidecheck:generated), and the rootcheck-doc-frontmatter/check-docs-section-name/check-doc-route-spelling/check-section-landing-index/check-keyed-text-bounds/check-ci-filter-parity/check-comment-mask-adoption/check-shard-attestation/check-system-context-census/check-undeclared-dep-imports/check-plugin-teardown-shape/docs-audit/check-affected-docs/docs-audit/check-drift-comment/pm/check-half-statesscripts — all exit 0. Earlier reds that this PR fixed before landing:check:doc-authoring(the tombstone string carried#13823; now cites ADR-0049 only, with a negative pin) and the pin-count test above.Declared narrowing: the full 452-file spec suite ran on
90d567cd3; the two later commits change one assertion literal in a test file and changeset prose, re-verified with the targeted files rather than the whole suite (≈6 min held under a contended lock) — CI's Test Core runs the full suite on the final head. Gate list derived withnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; 74 commands at b862317); what was not run is the CI-owned farm named below. CI on 875e3fa at report time: 31 check-runs — completed/skipped: 2, completed/success: 14, in_progress/None: 15.Not measured here (CI-owned)
check:type-check-coverage --re-measure/check:type-check-debt(needs the whole package closure built — PREREQUISITE NOT MET, exit 3, not a finding),check:test-completeness(grades CI's turbo test log),check:react-declaration-parity(needs objectui's manifest), the repo-widepnpm lintand the rest of the 74-command derivation not named above.🤖 Generated with Claude Code
https://claude.ai/code/session_01GDA48PuRFrHyRfdkBz8m21
Generated by Claude Code