Split out of #8073 at triage (2026-08-12), per the domain:cli seat's serial/split analysis on that card (comment 5269022297): the explain pair and the /sharing/* family are different blast radii, and this half carries a question the explain half does not.
Fact (inherited from #8073's measurement — re-verify at claim)
registerSharingEndpoints's single emitter respondSharingError in packages/rest/src/rest-server.ts answers { code, error: msg.replace(...) } — a bare-string error — feeding 400 / 403 / 404 / 409 / 422 across the whole /sharing/* family. body.error.code, the one position ADR-0112 D5 declares, reads undefined on all of them.
Why this is held as a finding rather than queued
The envelope convergence itself is implementation of the settled ADR-0112 D5 ruling. But this emitter carries a second, unrelated protocol: msg.startsWith(CODE) — the error code is recovered by parsing the message text. Whether that string-prefix protocol survives (kept alongside the D5 envelope) or is retired with it must be ruled before dispatch, not during it — retiring it silently changes what programmatic consumers can read.
Also inherited scope notes from #8073:
Promotion path: at the findings round, either (a) the prefix-protocol question goes to the maintainer and this queues after the ruling, or (b) if a measured consumer census shows nothing reads the prefix, it collapses into a plain convergence card.
Provenance: #8073 (measurement record), PR #8071 / #7981 (the pattern to follow), #7035 / PR #7293 (the dialect retirement).
Split out of #8073 at triage (2026-08-12), per the
domain:cliseat's serial/split analysis on that card (comment 5269022297): the explain pair and the/sharing/*family are different blast radii, and this half carries a question the explain half does not.Fact (inherited from #8073's measurement — re-verify at claim)
registerSharingEndpoints's single emitterrespondSharingErrorinpackages/rest/src/rest-server.tsanswers{ code, error: msg.replace(...) }— a bare-stringerror— feeding 400 / 403 / 404 / 409 / 422 across the whole/sharing/*family.body.error.code, the one position ADR-0112 D5 declares, readsundefinedon all of them.Why this is held as a finding rather than queued
The envelope convergence itself is implementation of the settled ADR-0112 D5 ruling. But this emitter carries a second, unrelated protocol:
msg.startsWith(CODE)— the error code is recovered by parsing the message text. Whether that string-prefix protocol survives (kept alongside the D5 envelope) or is retired with it must be ruled before dispatch, not during it — retiring it silently changes what programmatic consumers can read.Also inherited scope notes from #8073:
registerSecurityEndpointsanswers THREE different error-envelope shapes on the same three routes (ADR-0112) #7981 (ObjectStackClient.fetchreads both envelopes' spots) was taken for that card's consumers; it must be re-run for the/sharing/*consumers, not inherited.packages/rest/src/rest-server.tsis the repo's hottest file ([finding] ADR-0076 D11 的第二半从未落地:packages/rest/src/rest-server.ts已 8593 行(ADR 记录约 5.1k),且无 issue 承接 #5949); check in-flight writers before any claim.Promotion path: at the findings round, either (a) the prefix-protocol question goes to the maintainer and this queues after the ruling, or (b) if a measured consumer census shows nothing reads the prefix, it collapses into a plain convergence card.
Provenance: #8073 (measurement record), PR #8071 / #7981 (the pattern to follow), #7035 / PR #7293 (the dialect retirement).