Skip to content

[finding] The envelope-position line has no live owner — check-route-envelope.mjs's two ratchet: fields both name #7035, closed since 2026-08-10 #9461

Description

@os-zhuang

Found while implementing #9232, which was asked to repoint the stale #7035 citations in packages/rest/src/** prose. It did. This is the same defect one file over, in a place #9232's declared file surface did not reach — scripts/check-route-envelope.mjs — so it is filed rather than folded in.

The measurement

check-route-envelope.mjs requires a dialectOnly module to declare a ratchet — a string naming the end state that outstanding drift is held against. Two entries carry one, and both name the same closed card:

  • packages/rest/src/rest-server.tsratchet: '#7035 (option 1: convert onto the shared sendOk/sendError)'
  • packages/rest/src/error-response.tsratchet: '#7035 (option 1: convert onto the shared sendOk/sendError)'

#7035 reached state completed on 2026-08-10 via PR #7293, having converged three /meta 501 handlers and nothing else. It is not, and never was, the owner of "convert this file onto the shared pair."

Why it matters more than an ordinary stale citation

The ratchet field is the only place these two entries say where the drift is going. The counts they hold down are substantial and real — rest-server.ts alone is declared dialectOnly because its write-site count is too hot to pin, and the gate's header records stringError 44 among what #7035/PR #7293 deliberately left behind. So the gate is enforcing a shrink-only ratchet toward an end state whose only written owner is a card nobody can open.

The failure mode is quiet: the gate stays green, the counts keep ticking down (or not), and a reader chasing the plan lands on a completed issue about three /meta handlers.

There is currently no live card to point at

Verified before filing, and this is the part that makes it a decision rather than a rename:

and no open issue owns the envelope-position line for packages/rest's flat dialect. Control for the "no open card" claim: the open domain:cli listing returns 27 issues, so the query works; the nearest neighbours are #9364 (plugin-route bodies) and #9436 (adapters/hono discovery bodies) — different files, different ratchet entries.

#9232's own card body anticipated exactly this: "The envelope-convergence line needs a live card to point at — this one, or a dedicated envelope card if triage prefers to split them."#9232 closes on merge, so it cannot be that card. Its in-prose citations were therefore repointed at the ratchet mechanism rather than at any card number — accurate and CI-enforced, but it leaves the ratchet: fields themselves, which structurally want a card.

What needs deciding

  1. Open a dedicated envelope-position convergence card for packages/rest's flat dialect (the "route these bodies through the shared sendOk/sendError pair" end state) and point both ratchet: fields at it. This is what the field is for.
  2. Or rule the flat dialect's position permanently accepted, retire the ratchet fields, and let the entries be plain dialectOnly declarations — which would also settle the question ADR-0112 D5 leaves open, and should be recorded there if so.

Not a code change either way until it is ruled; (1) is the cheap one and matches how #9364's family is tracked today.

⚠️ Note for whoever takes it: ADR-0112's D5 amendment says retiring the flat shape "belongs to the envelope-convergence line (#3843 family)" — also a closed card. Whatever card is opened should be the one that line names too.

Related: #9232 (where this was found; repointed the in-prose half) · #8087 / ADR-0112 D5 · #9364, #9436 (live ratchet-owner cards for other files).

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions