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
service-automation: a durable suspension inside a structured region (loop / parallel branch / try_catch) must fail the run with a named error, not leave progress state and report success — runtime half of #15646 ruling D #18881
Filed by the director seat (objectstack #12708, summon #24, session_01Wj1HUjzyeiBQ8atRf1ZhaL) executing decision batch #153 item 1 — maintainer 「其他同意」 to D on #15646. This is the runtime half; the parse-time half (refuse the unconditionally pausing node types and end inside region bodies) stays on #15646 in packages/spec.
The defect this half closes
#15646's reproduction: loop { try_catch { map(pausing sub-flow) } } — the map's child suspends durably, the region's progress state is left behind, later iterations skip, and the run reports success with summary.failed = 0 and ran = []. Whether a map / subflow child pauses is known only at runtime (it lives in the sub-flow record config.flowName names), so parse-time refusal cannot reach this case without also refusing loop { map(synchronous sub-flow) }, a shape that runs correctly today (#15616's regression suite, 5 tests in 3 packages/services files).
Ruling frame — ⛔ not re-adjudicable by the dev
When a node contained in a structured region body (loop, a parallel branch, try_catch's try or catch, at any depth) durably suspends, the engine fails the run with a named, structured error that carries the region node id, the suspending node id and the sub-flow name — the loud form of [P2] engine ADR: durable pause inside structured regions (unlock topology-level parallel approvals / waits / subflows) #3267's ruling 禁 (structured regions do not carry a durable pause). ⛔ Never success with nothing run; ⛔ never a warning-level log.
The error is surfaced where a run's terminal failure already is (run status + summary.failed), so an operator and a client see it the way they see any failed run.
Filed by the director seat (objectstack #12708, summon #24,
session_01Wj1HUjzyeiBQ8atRf1ZhaL) executing decision batch #153 item 1 — maintainer 「其他同意」 to D on #15646. This is the runtime half; the parse-time half (refuse the unconditionally pausing node types andendinside region bodies) stays on #15646 inpackages/spec.The defect this half closes
#15646's reproduction:
loop { try_catch { map(pausing sub-flow) } }— themap's child suspends durably, the region's progress state is left behind, later iterations skip, and the run reportssuccesswithsummary.failed = 0andran = []. Whether amap/subflowchild pauses is known only at runtime (it lives in the sub-flow recordconfig.flowNamenames), so parse-time refusal cannot reach this case without also refusingloop { map(synchronous sub-flow) }, a shape that runs correctly today (#15616's regression suite, 5 tests in 3packages/servicesfiles).Ruling frame — ⛔ not re-adjudicable by the dev
loop, aparallelbranch,try_catch's try or catch, at any depth) durably suspends, the engine fails the run with a named, structured error that carries the region node id, the suspending node id and the sub-flow name — the loud form of [P2] engine ADR: durable pause inside structured regions (unlock topology-level parallel approvals / waits / subflows) #3267's ruling 禁 (structured regions do not carry a durable pause). ⛔ Neversuccesswith nothing run; ⛔ never a warning-level log.loop { map(synchronous) }and service-automation: amapnode inside aloopbody runs its collection ONCE — iterations 2..n do nothing, reportsuccess, and the run completes green #15616's suite keep passing unchanged. ⛔ No parse-time rule is added here (that is service-automation: a PAUSINGmapinside a contained region leaves its progress state behind — later loop iterations skip items and the exhausted map returnssuccesshaving run nothing #15646's half).summary.failed), so an operator and a client see it the way they see any failed run.Acceptance
mapinside a contained region leaves its progress state behind — later loop iterations skip items and the exhausted map returnssuccesshaving run nothing #15646's shape end to end asserts: run status failed,summary.failed = 1, the error names region / node / sub-flow; the same test with a synchronous sub-flow passes as today (control).mapnode inside aloopbody runs its collection ONCE — iterations 2..n do nothing, reportsuccess, and the run completes green #15616's 5 tests unchanged and green; service-automation: honouroutcome: 'refused'on the flowendnode — a terminalrefusedrun status (distinct fromfailed) with the interpolated message persisted on the run (lane 2 of the #14945 ruling 2′) #15788's runtimeendtest unchanged.Clause-②: no.mapinside a contained region leaves its progress state behind — later loop iterations skip items and the exhausted map returnssuccesshaving run nothing #15646 withFixes #15646once the spec half (Part of #15646) is onmain; if this half lands first, usePart ofand let the spec half's landing close it.Refs
#15646 (ruling D, batch #153 item 1) · #3267 (禁) · #15616 · #15788 · #16134 (region walk precedent)
Dedup terms:
region durable pause runtime refusal,map inside loop suspends,progress state left behind,summary.failed silent successGenerated by Claude Code