You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[tracking] Envelope-position convergence line for packages/rest's flat dialect — the live ratchet owner #9559
Filed by the triage seat (session session_0138jAR5jeREBpm4dhVvbWY7, 2026-08-18) as the disposition of #9461: scripts/check-route-envelope.mjs requires each dialectOnly module to name a ratchet — the end state its outstanding drift is held against — and both packages/rest/src/rest-server.ts and packages/rest/src/error-response.ts pointed at #7035, closed 2026-08-10. A ratchet needs an owner nobody can close by accident. This card is that owner.
What this card owns
The convergence end state for packages/rest's flat dialect: route the remaining hand-built response bodies through the shared sendOk/sendError pair. Known held-down debt at filing time (per the gate's own header): rest-server.ts declared dialectOnly with a write-site count too hot to pin, including stringError 44 deliberately left behind by #7035/PR #7293; error-response.ts likewise.
Rules for this card
Tracking card, not a work card. It is not dispatchable as a unit; increments land on their own cards/PRs and shrink the gate's counts. tracking label keeps it out of triage sweeps and queue counts by design.
Do not close while any ratchet: field names it. Legal exits: (a) the counts reach zero and the dialectOnly entries are deleted, or (b) the maintainer rules the flat dialect's position permanently accepted — that is the open question ADR-0112 D5 leaves, and ruling it means amending D5's record and retiring the ratchet fields, not just closing this card.
Two new ratchet entries now name this card, filed by #9937's discovery walk (PR #10351) — recording them here because this card's own rule is that it stays open while any ratchet: field names it.
scripts/check-route-envelope.mjs's express-style surface stopped being an enumerated list and became a walk. It swept in two packages/rest modules that were invisible to all four surfaces — neither is a route module, neither follows the *-routes.ts convention, and both write a REST body a client reads:
packages/rest/src/query-allowlist.ts — unenveloped: 1 (L194), the 400 refuseUnknownQueryParams writes
packages/rest/src/query-multiplicity.ts — unenveloped: 1 (L139), the 400 refuseRepeatedQueryParams writes
Both are one key from conformant, and in the direction this card owns: the body is ADR-0112-nested already (error: { code, message } — the reference shape security-suggested-bindings-envelope.test.ts pins the family onto) but carries no success above it, so unwrapResponse hands it to callers raw. Routing them through the shared sendOk/sendError takes both to zero, which is this card's stated end state.
No wire answer changed in #10351 — the gate learned to see them, that is all.
Activity
chore(lint): repoint check-route-envelope.mjs's ratchet owner to #9559
feat(security): 401 anonymous-deny body carries code: UNAUTHENTICATED…
os-zhuang commentedon Aug 20, 2026
Two new ratchet entries now name this card, filed by #9937's discovery walk (PR #10351) — recording them here because this card's own rule is that it stays open while any
ratchet:field names it.scripts/check-route-envelope.mjs's express-style surface stopped being an enumerated list and became a walk. It swept in twopackages/restmodules that were invisible to all four surfaces — neither is a route module, neither follows the*-routes.tsconvention, and both write a REST body a client reads:packages/rest/src/query-allowlist.ts—unenveloped: 1(L194), the 400refuseUnknownQueryParamswritespackages/rest/src/query-multiplicity.ts—unenveloped: 1(L139), the 400refuseRepeatedQueryParamswritesBoth are one key from conformant, and in the direction this card owns: the body is ADR-0112-nested already (
error: { code, message }— the reference shapesecurity-suggested-bindings-envelope.test.tspins the family onto) but carries nosuccessabove it, sounwrapResponsehands it to callers raw. Routing them through the sharedsendOk/sendErrortakes both to zero, which is this card's stated end state.No wire answer changed in #10351 — the gate learned to see them, that is all.
Generated by Claude Code
Generated by Claude Code
chore(lint): repoint check-route-envelope.mjs's ratchet owner to obje…
feat(security): 401 anonymous-deny body carries code: UNAUTHENTICATED…
docs(protocol): the error-handling page documents BOTH live error env…
fix(rest): GET /meta/:type/:name answers absence in one envelope, whi…