Raised as an open question by the domain:services dev that delivered #15788 (lane 2 of the #14945 ruling 2′, PR #18109), and filed here by the seat so the decision is not lost. ⛔ The dev does not file; it reports.
The question
The #14945 ruling says nothing about regions. An end node carrying outcome: 'refused' inside a loop body or a try_catch region is therefore undecided.
What shipped, and why it is an interim rather than an answer
Option A shipped: a refusing end inside a region is a loud failure at the region boundary — the same line where runRegion already refuses a durable pause.
The dev's reasoning, which this seat accepted:
- A refusal terminates the run, and a region body cannot end one.
- Left to propagate today, the signal unwinds into
try_catch's own catch arm, which reads every throw as the try region FAILING. So the author's refusal would run the error path and the run would still record completed — i.e. the old silence with an extra step.
- ⛔ Nothing an author had is narrowed: an
end inside a region was a no-op whatever its outcome, so this shape has never once been honoured.
⭐ It is the interim that 「prefer failing to falling back」 decides, and it forecloses a silent wrong answer. The loud message is the discoverable place a reader lands.
Option B — the real design question
Propagate the signal out of every container, so a refusal inside a loop or try region terminates the whole run. That needs:
try_catch (and a check of parallel / map) taught to rethrow the refusal rather than catch it — a refusal is a successful evaluation that says no, ⛔ not a failure, so a catch arm is the wrong receiver.
- A decision about the in-flight siblings of a parallel gateway — ⚠️ the same scope ADR-0019 M1 explicitly left out for the durable pause. Whatever is decided here should be decided for both, or the two signals diverge inside the same containers.
⇒ This is a ruling-seat decision, ⛔ not a lane-2 implementation detail, which is why PR #18109 did not ride it in.
Precedent to weigh
The durable pause (FlowSuspendSignal) already refuses at the same boundary, and ADR-0019 M1 left the parallel-sibling question open there too. Option A keeps the two signals consistent; option B fixes both or deliberately splits them.
Related: #14945 · #15788 · PR #18109 · ADR-0019 M1
⛔ domain:*, type and priority are the triage seat's; this card is filed ungraded. The DECISION belongs to the seat that owns the #14945 ruling.
Generated by Claude Code
Raised as an open question by the
domain:servicesdev that delivered #15788 (lane 2 of the #14945 ruling 2′, PR #18109), and filed here by the seat so the decision is not lost. ⛔ The dev does not file; it reports.The question
The #14945 ruling says nothing about regions. An
endnode carryingoutcome: 'refused'inside aloopbody or atry_catchregion is therefore undecided.What shipped, and why it is an interim rather than an answer
Option A shipped: a refusing
endinside a region is a loud failure at the region boundary — the same line whererunRegionalready refuses a durable pause.The dev's reasoning, which this seat accepted:
try_catch's own catch arm, which reads every throw as the try region FAILING. So the author's refusal would run the error path and the run would still recordcompleted— i.e. the old silence with an extra step.endinside a region was a no-op whatever its outcome, so this shape has never once been honoured.⭐ It is the interim that 「prefer failing to falling back」 decides, and it forecloses a silent wrong answer. The loud message is the discoverable place a reader lands.
Option B — the real design question
Propagate the signal out of every container, so a refusal inside a loop or try region terminates the whole run. That needs:
try_catch(and a check ofparallel/map) taught to rethrow the refusal rather than catch it — a refusal is a successful evaluation that says no, ⛔ not a failure, so a catch arm is the wrong receiver.⇒ This is a ruling-seat decision, ⛔ not a lane-2 implementation detail, which is why PR #18109 did not ride it in.
Precedent to weigh
The durable pause (
FlowSuspendSignal) already refuses at the same boundary, and ADR-0019 M1 left the parallel-sibling question open there too. Option A keeps the two signals consistent; option B fixes both or deliberately splits them.Related: #14945 · #15788 · PR #18109 · ADR-0019 M1
⛔
domain:*, type and priority are the triage seat's; this card is filed ungraded. The DECISION belongs to the seat that owns the #14945 ruling.Generated by Claude Code