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
hono adapter: render an escaped throw that carries a declared ADR-0112 status + registered code as that envelope, not as bare 500 INTERNAL_ERROR "No response from handler" — #15999's shared half #16545
Split from #15999 by the director seat (2026-09-07) — the domain:cli half that the #15999 ruling (decision batch #55, maintainer 「同意」, comment 5559668176) said triage would split and that sat unsplit for 14 hours under pm:retriage. The ruling is the specification; this card carries item 2 of it.
What is ruled (verbatim from the #15999 ruling, item 2)
Shared half (domain:cli, hono adapter / registrar wrapper): an escaped throw carrying a declared ADR-0112 status + registered code is rendered by them, not as a bare 500 INTERNAL_ERROR "No response from handler". This changes what an escaped throw means for every direct-mount route; the PR pins that an escaped non-envelope throw still answers 500 with no cause in the body.
packages/services/service-datasource/src/admin-routes.ts — requireDatasourceAdmin re-raises AuthzStoreUnavailableError (declared status: 503 / code: SERVICE_UNAVAILABLE, packages/core/src/security/authz-store-unavailable.ts:65-73); the call is not inside a try; the Hono adapter (adapter.ts, "route handler threw — request answered 500 with no cause in the body") renders it as 500 { code: "INTERNAL_ERROR", message: "No response from handler" }.
One place: the adapter (or the registrar wrapper it already funnels through — measure which one every direct-mount route actually passes) recognises an escaped error whose status is a declared ADR-0112 status and whose code is registered in ERROR_CODE_LEDGER / StandardErrorCode, and answers that envelope. ⛔ An escaped throw that is not such an envelope keeps today's behaviour exactly — 500, no cause in the body — and that is pinned in the same PR (both directions).
Existing security pins assert the outage class (status ∈ {500, 503}, never 200, never 403) and stay green.
Refs: #15999 (ruling, measurements for datasource / settings / storage) · #13279 · #6504 (badRequest already relays a service-thrown 503 envelope in the same file) · #16018 (docs page blocked on the outage status being promisable).
Split from #15999 by the director seat (2026-09-07) — the
domain:clihalf that the #15999 ruling (decision batch #55, maintainer 「同意」, comment 5559668176) said triage would split and that sat unsplit for 14 hours underpm:retriage. The ruling is the specification; this card carries item 2 of it.What is ruled (verbatim from the #15999 ruling, item 2)
Measured starting point (from #15999)
packages/services/service-datasource/src/admin-routes.ts—requireDatasourceAdminre-raisesAuthzStoreUnavailableError(declaredstatus: 503/code: SERVICE_UNAVAILABLE,packages/core/src/security/authz-store-unavailable.ts:65-73); the call is not inside atry; the Hono adapter (adapter.ts, "route handler threw — request answered 500 with no cause in the body") renders it as500 { code: "INTERNAL_ERROR", message: "No response from handler" }.Landing shape
statusis a declared ADR-0112 status and whosecodeis registered inERROR_CODE_LEDGER/StandardErrorCode, and answers that envelope. ⛔ An escaped throw that is not such an envelope keeps today's behaviour exactly — 500, no cause in the body — and that is pinned in the same PR (both directions).Clause-②: noas a contract door; the response for an already-declared envelope becomes what its declaration says. If measurement shows a code on this path is not registered, stop and report — that is a ledger gap under the [Decision] Clause ② on an UNREGISTERED error code carried by a thrown value: #14552 landedno, #15963 landsyes, and they are the same class #16404 ruling, not something to register in passing.AuthzStoreUnavailableErrorthe admin guard re-raises reaches the wire as500 INTERNAL_ERROR, not the503 SERVICE_UNAVAILABLEthe brand declares #15999 (settings' three route catches; storage'sauthorizeDownloadinnercatch { deny }): that half makes the brand reach this render; this half makes the render correct. Either may land first; the datasource family is the one that exercises this card end-to-end today, so the pin drivesGET /api/v1/datasourceswith atenancyservice registered through a throwing factory and asserts503 SERVICE_UNAVAILABLEon the wire.Refs: #15999 (ruling, measurements for datasource / settings / storage) · #13279 · #6504 (
badRequestalready relays a service-thrown 503 envelope in the same file) · #16018 (docs page blocked on the outage status being promisable).