Filed by the domain:cli seat (#6024), session session_01UjujZN219uFzBhSYfMykCd, as the follow-on this seat committed to filing on #12404 once PR #12477 landed. It has: merged as 0e5fe7fc0.
Why this is a card and not a rider on #12405
#12405 is the declaredCode half at the same call site and is in flight now. Its ruling holds the two channels apart deliberately, and the reason is the one #12404 spent a round establishing:
declaredCode's presence means demotion, so its caller must pass demotedDeclaredCode(thrown) rather than the raw field. userMessage's presence means only that the producer opted in — declaredUserMessage already decided that — so its caller passes thrown.userMessagestraight through.
Two channels, opposite caller obligations, at one call site. Folding them into one PR merges the two reviews that difference exists to keep separate.
⛔ HARD SERIAL behind #12405 — same file, same function (packages/rest/src/package-routes.ts, sendThrownError). Ruling ①: released by the merge, never by the arming.
Measured
sendThrownError forwards thrown.details and nothing else:
sendError(res,thrown.status,thrown.code,message,thrown.details ? {details: thrown.details} : undefined);resolveThrownHttpError already populates ThrownHttpError.userMessage for every caller of the shared resolver (#12404 measured this end-to-end, including the sandboxed producer crossing the QuickJS boundary through SANDBOX_ERROR_PASSTHROUGH). Until 0e5fe7fc0 this door could not emit the field — a compile error to try. Now it can, and it still doesn't.
Not established here
Region
packages/rest/src/package-routes.ts, sendThrownError — and its sibling tests. ⛔ packages/spec/** is the contract being honoured, not changed. ⛔ packages/types/src/response-envelope.ts is done (#11719, #12404) and is read-only here.
Refs
Filed by the
domain:cliseat (#6024), sessionsession_01UjujZN219uFzBhSYfMykCd, as the follow-on this seat committed to filing on #12404 once PR #12477 landed. It has: merged as0e5fe7fc0.Why this is a card and not a rider on #12405
#12405 is the
declaredCodehalf at the same call site and is in flight now. Its ruling holds the two channels apart deliberately, and the reason is the one #12404 spent a round establishing:Two channels, opposite caller obligations, at one call site. Folding them into one PR merges the two reviews that difference exists to keep separate.
⛔ HARD SERIAL behind #12405 — same file, same function (
packages/rest/src/package-routes.ts,sendThrownError). Ruling ①: released by the merge, never by the arming.Measured
sendThrownErrorforwardsthrown.detailsand nothing else:resolveThrownHttpErroralready populatesThrownHttpError.userMessagefor every caller of the shared resolver (#12404 measured this end-to-end, including the sandboxed producer crossing the QuickJS boundary throughSANDBOX_ERROR_PASSTHROUGH). Until0e5fe7fc0this door could not emit the field — a compile error to try. Now it can, and it still doesn't.Not established here
sendError'sextracannot carryuserMessageeither — the samePickbars the second declared open channel from every nested-envelope route #12404 established the channel is live somewhere; whether a producer reaching/api/v1/packagescarries auserMessageis unmeasured.premise_still_valid: falsewithpr: nullwould be a legitimate delivery.rest-server.tstwin door should be made to agree. ⛔ Not here: that file is held by PR #12421 (client.reports.saveaccepts an input its own service contract refuses —SaveReportInput.queryis required and neither the SDK nor the route checks it #11926).Region
packages/rest/src/package-routes.ts,sendThrownError— and its sibling tests. ⛔packages/spec/**is the contract being honoured, not changed. ⛔packages/types/src/response-envelope.tsis done (#11719, #12404) and is read-only here.Refs
sendError'sextracannot carryuserMessageeither — the samePickbars the second declared open channel from every nested-envelope route #12404 / PR fix(types): let sendError'sextracarryuserMessage#12477 (0e5fe7fc0) — the writer change that makes this compilable, and the ruling that separates the two channelssendError'sextracannot carrydeclaredCode, so every nested-envelope route silently drops an unregistered producer's own code spelling #11719 / PR fix(types): letsendError'sextracarrydeclaredCode#12403 (db8c288) — thedeclaredCodehalf of the same writerpackage-routes'sendThrownErrorresolves aThrownHttpErrorand then drops itsdeclaredCode— the one unfenced nested-envelope call site that already holds a producer spelling #12405 — thedeclaredCodehalf of THIS call site; this card is serial behind it