Found while implementing #11678 (the auditMetaItem declaration; PR #12003) — the history door is the audit door's explicitly named twin (rest-server.ts: "Same Number(...) -> NaN -> dropped-limit shape as the history twin above"; the audit route serves the Studio 审计日志 tab, this one serves the History tab) and it is now in exactly the state the audit door just left. Filed rather than touched: same packages/spec contract decision, one door over, outside the #11678+#11679 fold's declared scope.
Measured on the PR #12003 merge head 2c8a3183 (base d63b0143)
historyMetaItem appears zero times in packages/spec/src/api/protocol.zod.ts (grep -c → 0; positive control: auditMetaItem now returns 5 there via PR #12003).
The REST door (GET /meta/:type/:name/history, packages/rest/src/rest-server.ts ~:5779-5817 on that head) reaches the verb through casts twice — guard if (!(p as any).historyMetaItem) and call await (p as any).historyMetaItem({ ... }) — sending type, name, and conditionally environmentId, sinceSeq, limit.
The implementation (ObjectStackProtocolImplementation.historyMetaItem, packages/metadata-protocol/src/protocol.ts:14585) declares { type, name, organizationId?, sinceSeq?, limit? } and returns { events: MetadataEvent[] }.
Two secondary facts a future card should weigh, both measured on the same head:
Precedents: #11006 (maintainer ruling 2026-08-22, option B) · #11426 (publish) · PR #12003 (#11678 audit — the twin — and #11679 delete).
⛔ Nothing about this door is addressed in PR #12003; its casts and payload are byte-identical there.
Generated by Claude Code
Found while implementing #11678 (the
auditMetaItemdeclaration; PR #12003) — the history door is the audit door's explicitly named twin (rest-server.ts: "SameNumber(...)->NaN-> dropped-limit shape as the history twin above"; the audit route serves the Studio 审计日志 tab, this one serves the History tab) and it is now in exactly the state the audit door just left. Filed rather than touched: samepackages/speccontract decision, one door over, outside the #11678+#11679 fold's declared scope.Measured on the PR #12003 merge head
2c8a3183(based63b0143)historyMetaItemappears zero times inpackages/spec/src/api/protocol.zod.ts(grep -c→ 0; positive control:auditMetaItemnow returns 5 there via PR #12003).The REST door (
GET /meta/:type/:name/history,packages/rest/src/rest-server.ts~:5779-5817 on that head) reaches the verb through casts twice — guardif (!(p as any).historyMetaItem)and callawait (p as any).historyMetaItem({ ... })— sendingtype,name, and conditionallyenvironmentId,sinceSeq,limit.The implementation (
ObjectStackProtocolImplementation.historyMetaItem,packages/metadata-protocol/src/protocol.ts:14585) declares{ type, name, organizationId?, sinceSeq?, limit? }and returns{ events: MetadataEvent[] }.Two secondary facts a future card should weigh, both measured on the same head:
environmentIdinto the payload while the implementation's parameter type never declares or reads it — the same dead-weight member the audit door shed in auditMetaItem'sorganizationIdis dead on both ends — the audit read returns every org's rows for a (type, name), while its comment describes a scope filter that is not in the query #8747; under the [finding] Meta-read request schemas still omit previewDrafts / state / environmentId, so the REST call-site casts survive the organizationId catch-up #9741 ruling it is transport-level either way.organizationIdbut this door never sends it — the audit door's auditMetaItem'sorganizationIdis dead on both ends — the audit read returns every org's rows for a (type, name), while its comment describes a scope filter that is not in the query #8747 tenant-scoping question may or may not apply to history rows; that is a measurement for the card, not an assumption.error: 'History query not supported by protocol implementation', nocode) — the finding:rest-server.ts里三个相邻/metahandler 的错误信封是三种不同形状,其中两种不符合 ADR-0112 #7035-family drift the sibling/meta501s converged off;check:route-envelopecarries it as ratcheted debt. Declaring the member is the natural moment to converge it, but that is a behaviour change the declaration itself must not smuggle.Precedents: #11006 (maintainer ruling 2026-08-22, option B) · #11426 (publish) · PR #12003 (#11678 audit — the twin — and #11679 delete).
⛔ Nothing about this door is addressed in PR #12003; its casts and payload are byte-identical there.
Generated by Claude Code