Observed (2026-07-17)
A lane correctly halted mid-plan on an external gate (a required vendor component turned out to be behind a license key; standing directive forbids hand-rolling a copy). It ended its turn cleanly — and the ledger recorded a plain completed with zero artifacts, indistinguishable from the zero-deliverable false-success class (#1130/#1149) and invisible on the board as anything needing attention.
Fix
- Terminal classification: run ends with no pushed branch/PR AND the final message declares a blocker →
status=blocked + blocked_reason (from the result text), not completed.
blocked rows surface in squads status/board as needs-attention (amber), and in the kanban's stall/triage lane (squads-app#159 — this is exactly its 'catch up with tasks that don't move' requirement).
- Harness nudge: a lane declaring a blocker should also comment it on the issue before ending (tonight the orchestrator had to transplant the finding from the stream log to the issue by hand).
Builds on #1149's classifier seam. Public-repo hygiene: no internal vendor/pricing details in this issue.
Observed (2026-07-17)
A lane correctly halted mid-plan on an external gate (a required vendor component turned out to be behind a license key; standing directive forbids hand-rolling a copy). It ended its turn cleanly — and the ledger recorded a plain
completedwith zero artifacts, indistinguishable from the zero-deliverable false-success class (#1130/#1149) and invisible on the board as anything needing attention.Fix
status=blocked+blocked_reason(from the result text), notcompleted.blockedrows surface insquads status/board as needs-attention (amber), and in the kanban's stall/triage lane (squads-app#159 — this is exactly its 'catch up with tasks that don't move' requirement).Builds on #1149's classifier seam. Public-repo hygiene: no internal vendor/pricing details in this issue.