Reported by the domain:services dev dispatched on #18110 as an out-of-scope finding, and filed here by the seat — dev agents report findings with dedupe words; they ⛔ do not file.
Mechanism
packages/services/service-automation/src/builtin/map-node.ts has the identical shape as #18110's file: it branches on child.status === 'paused' (:191) and on !child.success (:207), and has no refused arm. Every other child status falls through the same success path, and the child's output is pushed into state.results at :232.
⇒ A refusing end inside a map unit's child flow is rolled up by the parent as an ordinary success — the same fail-open direction #18110 describes for subflow, in a second file.
Seat verification, ⛔ not carried from the report
Re-taken by the domain:services seat on origin/main 79a046f8 with git show origin/main:PATH, ⛔ not a worktree grep:
| reading |
result |
child.status === 'paused' |
present, :191 |
!child.success |
present, :207 |
refused anywhere in the file |
0 hits |
control: child in the same file |
31 hits ⇒ the instrument is reading |
⛔ The runtime effect was not driven on map specifically. #18110's dev did reproduce the equivalent on subflow live (parent records completed, fires its own successMessage, downstream nodes run). Whoever takes this card should drive it on map rather than reason by analogy from subflow.
Why this is its own card and ⛔ not part of #18110
Blocked on the same decision
Blocked-by: #18110
Both files need the same new channel: a node executor currently has no way to terminate its run as refused. NodeExecutionResult (barrel-exported from src/index.ts:9) declares suspend? but no refusal member, and FlowRefusalSignal is thrown from exactly one site (engine.ts:9319), only for node.type === 'end'. #18110 is in the decision box awaiting the maintainer's choice of mechanism; that one decision governs this card too, so ⛔ this should not be dispatched ahead of it.
Dedupe words
map node refused child rollup · map-node.ts child.status paused · refused map unit parent continues · ADR-0037 A2 map refused · #18110 inverse map
Related: #18110 · #16314 · #14945 · #15788
⛔ type and priority are the triage seat's; this card is filed ungraded and unassigned. domain:services applied because the landing site is packages/services/service-automation, this lane's.
Generated by Claude Code
Reported by the
domain:servicesdev dispatched on #18110 as an out-of-scope finding, and filed here by the seat — dev agents report findings with dedupe words; they ⛔ do not file.Mechanism
packages/services/service-automation/src/builtin/map-node.tshas the identical shape as #18110's file: it branches onchild.status === 'paused'(:191) and on!child.success(:207), and has norefusedarm. Every other child status falls through the same success path, and the child's output is pushed intostate.resultsat:232.⇒ A refusing
endinside amapunit's child flow is rolled up by the parent as an ordinary success — the same fail-open direction #18110 describes forsubflow, in a second file.Seat verification, ⛔ not carried from the report
Re-taken by the
domain:servicesseat onorigin/main79a046f8withgit show origin/main:PATH, ⛔ not a worktree grep:child.status === 'paused':191!child.success:207refusedanywhere in the filechildin the same file⛔ The runtime effect was not driven on
mapspecifically. #18110's dev did reproduce the equivalent onsubflowlive (parent recordscompleted, fires its ownsuccessMessage, downstream nodes run). Whoever takes this card should drive it onmaprather than reason by analogy fromsubflow.Why this is its own card and ⛔ not part of #18110
subflowchild that endsrefusedis rolled up by the parent as an ordinary success — the refusal reaches nobody #18110 names onlysubflow. Its body, its triage grading and its dispatch order are all scoped tosubflow-node.ts. Ridingmapin would widen a p1 card's verification surface after grading.subflowandmaproll a child's contained failures into the parent'sfailedthrough theExecutionStepMetricsfailure slot ruled on #15617 #16314 treatedsubflowandmapas ONE surface — but for the FAILURE direction (rolling a child's contained failures into the parent'sfailed). This card and [finding] service-automation: asubflowchild that endsrefusedis rolled up by the parent as an ordinary success — the refusal reaches nobody #18110 are the refusal direction, which service-automation:subflowandmaproll a child's contained failures into the parent'sfailedthrough theExecutionStepMetricsfailure slot ruled on #15617 #16314 explicitly does not cover. ⛔ Do not close either as a duplicate of service-automation:subflowandmaproll a child's contained failures into the parent'sfailedthrough theExecutionStepMetricsfailure slot ruled on #15617 #16314.Blocked on the same decision
Blocked-by: #18110
Both files need the same new channel: a node executor currently has no way to terminate its run as
refused.NodeExecutionResult(barrel-exported fromsrc/index.ts:9) declaressuspend?but no refusal member, andFlowRefusalSignalis thrown from exactly one site (engine.ts:9319), only fornode.type === 'end'. #18110 is in the decision box awaiting the maintainer's choice of mechanism; that one decision governs this card too, so ⛔ this should not be dispatched ahead of it.Dedupe words
map node refused child rollup·map-node.ts child.status paused·refused map unit parent continues·ADR-0037 A2 map refused·#18110 inverse mapRelated: #18110 · #16314 · #14945 · #15788
⛔
typeandpriorityare the triage seat's; this card is filed ungraded and unassigned.domain:servicesapplied because the landing site ispackages/services/service-automation, this lane's.Generated by Claude Code