Today a stage-gate refusal still reports Succeeded — #96 fixed cancels only. Define the outcome contract — refused / failed / succeeded / succeeded-with-no-changes — and surface it on run status for the UI. Frame it as an extension of ADR 0011's exit-code contract: exit 2 → LimitReached (#119) is the precedent; a refusal wants the same shape, not a bespoke channel. Related hook: the "results pushed" notice overstates outcomes the same way — flagged in PR #114.
Done when:
- E2E shows a refused gate ≠
Succeeded.
- A no-change run is distinguishable from a changed one.
Depends on: #119 (rides the same termination mechanism).
Today a stage-gate refusal still reports
Succeeded— #96 fixed cancels only. Define the outcome contract — refused / failed / succeeded / succeeded-with-no-changes — and surface it on run status for the UI. Frame it as an extension of ADR 0011's exit-code contract: exit 2 →LimitReached(#119) is the precedent; a refusal wants the same shape, not a bespoke channel. Related hook: the "results pushed" notice overstates outcomes the same way — flagged in PR #114.Done when:
Succeeded.Depends on: #119 (rides the same termination mechanism).