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
automation resume door: the 400 FLOW_FAILED envelope drops the engine's status: 'stranded' verdict — the wire mirror's member is unreachable on the wire #15221
Found while delivering the services half of #13937 (branch claude/issue-13937-stranded-run-operator-verb, draft PR pending). ⛔ Not fixed there: packages/runtime is outside that card's claimed file surface, and the wire vocabulary is the runtime door's own (ADR-0112 ledger).
The reading, on origin/main50d6c92 plus that branch
The REST resume door (packages/runtime/src/domains/automation.ts, POST /:name/runs/:runId/resume) answers every success: false result that is not a coded refusal with deps.error(result.error, 400, { code: 'FLOW_FAILED', errorMessage?, summary? }). The details object copies errorMessage and summary and nothing else — status is not copied.
The trigger doors never produce a stranded result (only resume reaches that catch arm), and the resume door's 200 body (deps.success(result)) is reached only for a paused or completed result.
⇒ data.status: 'stranded' cannot appear on the wire through any door today. An HTTP-only operator sees 400 FLOW_FAILED for a stranded run and for a plain ran-and-was-rejected run alike, so they cannot tell "this run is beyond reach" from "this run has a repair verb waiting" — exactly the information the console (objectuiflowResponse.ts, which reads success === false || status === 'failed' as terminal) would need in order to offer a repair action.
#13937 (the ruling; services half on the named branch) · #14384 (the contract half) · #13953 (doorless operator verbs) · #8684 (the resume door's 400 FLOW_FAILED arm)
Found while delivering the services half of #13937 (branch
claude/issue-13937-stranded-run-operator-verb, draft PR pending). ⛔ Not fixed there:packages/runtimeis outside that card's claimed file surface, and the wire vocabulary is the runtime door's own (ADR-0112 ledger).The reading, on
origin/main50d6c92 plus that branchAutomationResult.statuscarries'stranded'(spec: name the terminally-failed run state onAutomationResult.status— contract half of #13937 (shape 4 ruling) #14384), and the wire mirrorTriggerFlowResponseSchema.data.status(packages/spec/src/api/automation-api.zod.ts) carries the same four members, parity pinned byautomation-result-status.pin.test.ts.AutomationEngine.resume()returns{ success: false, status: 'stranded', ... }for the resume that consumed the pause and then failed downstream (the one exit that journals a consumed suspension).packages/runtime/src/domains/automation.ts,POST /:name/runs/:runId/resume) answers everysuccess: falseresult that is not a coded refusal withdeps.error(result.error, 400, { code: 'FLOW_FAILED', errorMessage?, summary? }). The details object copieserrorMessageandsummaryand nothing else —statusis not copied.resumereaches that catch arm), and the resume door's 200 body (deps.success(result)) is reached only for a paused or completed result.⇒
data.status: 'stranded'cannot appear on the wire through any door today. An HTTP-only operator sees400 FLOW_FAILEDfor a stranded run and for a plain ran-and-was-rejected run alike, so they cannot tell "this run is beyond reach" from "this run has a repair verb waiting" — exactly the information the console (objectuiflowResponse.ts, which readssuccess === false || status === 'failed'as terminal) would need in order to offer a repair action.What a fix has to decide (not decided here)
status(and possiblyrunId) on the stranded arm, or whether that arm gets its own ADR-0112 code (aFLOW_STRANDEDsibling ofFLOW_FAILED). The console treats 400FLOW_FAILEDas terminal (the automation: the run-resume route still answers HTTP 200 wrapping an inner {success:false} — the route #3962's status-code unification left behind #8684 hazard pins inautomation-resume-envelope.test.ts), so a distinct code is the shape that lets a client branch without a message regex.Related
#13937 (the ruling; services half on the named branch) · #14384 (the contract half) · #13953 (doorless operator verbs) · #8684 (the resume door's 400 FLOW_FAILED arm)