Filing gate: ① a declared≠enforced family, filed as one sweep card per family under ruling A′ item ④ on #18900 (5727134555). This is triage's standing request 5857165909 on the seat post. Family rest-api-retire, seat verdict RETIRE.
reach: the declared authoring door. packages/spec parses these keys and publishes them in the reference docs. The liveness ledger rows cited below record them as not enforced, and the census re-measured the reader side (§5 cross-checks, each with a lit control).
- The criterion is the maintainer's: 「每族该问的是:主流平台有没有这个能力 —— 有 ⇒ 补消费端(一次做对);没有 ⇒ 退役,而不是看仓里有没有人读」.
- The maintainer's one word, per ruling A′ ④: RETIRE (the seat's proposal: the capability is already delivered here under another key) or ENFORCE (build the consumer once, correctly).
Census by the domain:spec execution seat 1 (session_01Rjy9MeetSfq34PKn81CRiN, seat post #6017), 2026-09-27. Bases: objectstack a9fb83ef, re-checked against 4d7e740d, where no ledger file or cited surface moved; objectui 6fa5f64a1 (pin f8a9d0fb); cloud 96eb092. Ledger instrument: check-liveness.mts --json, whose byStatus equals the committed state-counts.md row for row. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. The ranking is by value, user-visible risk × keys. This family's rank is 9 of 16. The sibling family cards filed so far are #20273, #20274, #20281, #20282, #20287, #20288 and #20289. Ranks 8 and 9 are the two halves of rest_api: one ENFORCE, one RETIRE.
Capability: Server-wide toggles for the response envelope, response metadata and pagination info; a second on/off switch for the OpenAPI document
| key |
ledger status |
ledger row |
what the ledger cites |
rest_api.documentation.enabled |
dead (verified 2026-09-21) |
packages/spec/liveness/rest_api.json:109 |
note: Normalized by RestServer and read by NOTHING — the ADR-0049 fourth state (parsed, unmarked, unenforced). normalizeConfig lists documentation: api.documentation straight into this.config.api and no site ever reads it back. a .default(true) that ena… |
rest_api.responseFormat.envelope |
dead (verified 2026-09-21) |
packages/spec/liveness/rest_api.json:189 |
note: Normalized by RestServer and read by NOTHING — the ADR-0049 fourth state (parsed, unmarked, unenforced). normalizeConfig lists responseFormat: api.responseFormat straight into this.config.api and no site ever reads it back. `api.responseFormat.envel… |
rest_api.responseFormat.includeMetadata |
dead (verified 2026-09-21) |
packages/spec/liveness/rest_api.json:195 |
note: Normalized by RestServer and read by NOTHING — the ADR-0049 fourth state (parsed, unmarked, unenforced). normalizeConfig lists responseFormat: api.responseFormat straight into this.config.api and no site ever reads it back. no consumer; response met… |
rest_api.responseFormat.includePagination |
dead (verified 2026-09-21) |
packages/spec/liveness/rest_api.json:201 |
note: Normalized by RestServer and read by NOTHING — the ADR-0049 fourth state (parsed, unmarked, unenforced). normalizeConfig lists responseFormat: api.responseFormat straight into this.config.api and no site ever reads it back. no consumer; list respons… |
Mainstream evidence:
- Built-in data APIs have a fixed envelope that no admin can toggle server-wide: Salesforce REST, the Dataverse Web API (OData
value / @odata.nextLink), the ServiceNow Table API (result wrapper, with per-request sysparm_* options only), and the Airtable API (records / offset).
documentation.enabled duplicates enableOpenApi, which the mount already reads (rest-server.ts:4373).
Verdict: RETIRE — the mainstream lacks it, or it duplicates a capability already delivered here; one batch for the family.
Reader that must exist / disposition: none; this is a retirement with retiredKey tombstones and an ADR-0087 D3 entry (RestServerConfig is plugin TS configuration, the batch_endpoints precedent).
User-visible risk (2): envelope: false reads as "unwrap responses" and changes nothing, so a client built on that belief breaks.
Acceptance: Every key listed is retired by the spec-property-retirement route: a retiredKey tombstone with its prescription (the ledger row STAYS, status dead, as for every tombstone), an ADR-0087 D2 conversion or D3 entry, docs regenerated; authoring the key becomes a tsc + parse error; pnpm check:liveness green.
Lane: domain:spec (objectstack)
File surface: packages/spec/src/api/rest-server.zod.ts:206-229 · packages/rest/src/rest-server.ts (normalizeConfig) · packages/rest/CHANGELOG.md · packages/spec/liveness/rest_api.json
Dedupe: rest_api\b \| RestApiConfig \| responseFormat \| termsOfService \| documentation\.(enabled\|title\|contact\|license) \| includePagination → 1 open hit. None carries a key of this family:
四轴:
- 实际业务需求: 主流平台的数据 API 信封都是固定的,没有哪家让管理员全局开关信封。没有真实需求在拉这几个开关。
- 项目长远合理性: 一个固定的信封就是一份契约,客户端 SDK 只需要按一种形状写。可切换的信封会让契约分叉。
- 防 AI 写错: AI 写
envelope: false 期望拿到裸数据,结果仍是信封,解析就会出错。退役后在配置阶段就报错。
- 创业阶段不扩散: 4 个键一次退役,沿用 batch_endpoints 的退役先例。
Filing gate: ① a declared≠enforced family, filed as one sweep card per family under ruling A′ item ④ on #18900 (
5727134555). This is triage's standing request5857165909on the seat post. Familyrest-api-retire, seat verdict RETIRE.reach:the declared authoring door.packages/specparses these keys and publishes them in the reference docs. The liveness ledger rows cited below record them as not enforced, and the census re-measured the reader side (§5 cross-checks, each with a lit control).Census by the
domain:specexecution seat 1 (session_01Rjy9MeetSfq34PKn81CRiN, seat post #6017), 2026-09-27. Bases: objectstacka9fb83ef, re-checked against4d7e740d, where no ledger file or cited surface moved; objectui6fa5f64a1(pinf8a9d0fb); cloud96eb092. Ledger instrument:check-liveness.mts --json, whosebyStatusequals the committedstate-counts.mdrow for row. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. The ranking is by value, user-visible risk × keys. This family's rank is9of 16. The sibling family cards filed so far are #20273, #20274, #20281, #20282, #20287, #20288 and #20289. Ranks 8 and 9 are the two halves ofrest_api: one ENFORCE, one RETIRE.Capability: Server-wide toggles for the response envelope, response metadata and pagination info; a second on/off switch for the OpenAPI document
rest_api.documentation.enabledpackages/spec/liveness/rest_api.json:109RestServerand read by NOTHING — the ADR-0049 fourth state (parsed, unmarked, unenforced).normalizeConfiglistsdocumentation: api.documentationstraight intothis.config.apiand no site ever reads it back. a.default(true)that ena…rest_api.responseFormat.envelopepackages/spec/liveness/rest_api.json:189RestServerand read by NOTHING — the ADR-0049 fourth state (parsed, unmarked, unenforced).normalizeConfiglistsresponseFormat: api.responseFormatstraight intothis.config.apiand no site ever reads it back. `api.responseFormat.envel…rest_api.responseFormat.includeMetadatapackages/spec/liveness/rest_api.json:195RestServerand read by NOTHING — the ADR-0049 fourth state (parsed, unmarked, unenforced).normalizeConfiglistsresponseFormat: api.responseFormatstraight intothis.config.apiand no site ever reads it back. no consumer; response met…rest_api.responseFormat.includePaginationpackages/spec/liveness/rest_api.json:201RestServerand read by NOTHING — the ADR-0049 fourth state (parsed, unmarked, unenforced).normalizeConfiglistsresponseFormat: api.responseFormatstraight intothis.config.apiand no site ever reads it back. no consumer; list respons…Mainstream evidence:
value/@odata.nextLink), the ServiceNow Table API (resultwrapper, with per-requestsysparm_*options only), and the Airtable API (records/offset).documentation.enabledduplicatesenableOpenApi, which the mount already reads (rest-server.ts:4373).Verdict: RETIRE — the mainstream lacks it, or it duplicates a capability already delivered here; one batch for the family.
Reader that must exist / disposition: none; this is a retirement with
retiredKeytombstones and an ADR-0087 D3 entry (RestServerConfig is plugin TS configuration, the batch_endpoints precedent).User-visible risk (2):
envelope: falsereads as "unwrap responses" and changes nothing, so a client built on that belief breaks.Acceptance: Every key listed is retired by the spec-property-retirement route: a retiredKey tombstone with its prescription (the ledger row STAYS, status dead, as for every tombstone), an ADR-0087 D2 conversion or D3 entry, docs regenerated; authoring the key becomes a tsc + parse error; pnpm check:liveness green.
Lane: domain:spec (objectstack)
File surface: packages/spec/src/api/rest-server.zod.ts:206-229 · packages/rest/src/rest-server.ts (normalizeConfig) · packages/rest/CHANGELOG.md · packages/spec/liveness/rest_api.json
Dedupe:
rest_api\b \| RestApiConfig \| responseFormat \| termsOfService \| documentation\.(enabled\|title\|contact\|license) \| includePagination→ 1 open hit. None carries a key of this family:RestApiConfigSchemain the liveness ledger asrest_api#19594rest_apiledger enrolment; carries no key四轴:
envelope: false期望拿到裸数据,结果仍是信封,解析就会出错。退役后在配置阶段就报错。