Intent: a landed change is never written on the board as a failure.
Today: #8464's pull #8470 landed at 13:46 and the issue was then parked twice with "@scout's run ended without a pull: the pull landed" (same for #8460 after #8472). PULL_STOPPED[1] (src/core/runs.ts:320) is the summary a run gets when its pull lands under it (src/crew/dispatch.ts:828), and the stall path (leftWithoutPull in src/crew/stalls.ts, freeStalled in src/crew/autonomy.ts) still counts it.
Done:
A run whose summary is "the pull landed" (cancelled, or rewritten by answerCancelled) is not a stall: leftWithoutPull is false for it, no "Parked by the crew" note is written, and it does not count toward a second park.
"the pull closed" (closed without landing) keeps today's behaviour.
A test drives the #8464 shape (issue, pull with Closes #N, merge while the issue's run is live) and fails on today's code.
Files: src/crew/stalls.ts, src/crew/autonomy.ts, a test under test/.
Risk: do not hide a real stall; only the landed summary is exempt.
Intent: a landed change is never written on the board as a failure.
Today: #8464's pull #8470 landed at 13:46 and the issue was then parked twice with "@scout's run ended without a pull: the pull landed" (same for #8460 after #8472).
PULL_STOPPED[1](src/core/runs.ts:320) is the summary a run gets when its pull lands under it (src/crew/dispatch.ts:828), and the stall path (leftWithoutPullin src/crew/stalls.ts,freeStalledin src/crew/autonomy.ts) still counts it.Done:
answerCancelled) is not a stall:leftWithoutPullis false for it, no "Parked by the crew" note is written, and it does not count toward a second park.Files: src/crew/stalls.ts, src/crew/autonomy.ts, a test under test/. Risk: do not hide a real stall; only the landed summary is exempt.