You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
release: 1.4.9 — interrupted runs no longer pin agent capacity
User reported: clicked Play on a card, got 'Ton agent est déjà en
train de tourner sur une autre tâche' — but nothing was visibly
running. Investigation:
ls ~/.backlog/twoody/runs/active/
run_001 (status=interrupted, agent=codex-default, finished 2 days ago)
run_002 (status=succeeded, finished 2 days ago)
run_001 was an orphaned run that the orchestrator-loop.ts reaper had
correctly marked 'interrupted' (executor process gone, subtask kicked
back to queued). But isAgentBusyStatus() included 'interrupted' in
its busy set, so the dead run kept codex-default permanently pinned
at max_concurrent_runs=1.
Two fixes:
1. Status reclassification (run-store.ts):
- isTerminalRunStatus now includes 'interrupted' — listActiveRuns
drops it, treating it like succeeded/failed/blocked/canceled.
- isAgentBusyStatus no longer includes 'interrupted' — symmetric
with terminal: a dead executor can't hold an agent slot.
2. Auto-archive on hydrate (orchestrator-loop.ts):
- On every server start, sweep runs/active/ for any run whose
status is terminal and physically move it to runs/archive/ via
archiveRun(). Removes the directory clutter that the reaper
left behind, and handles the related case where a succeeded
run never got archived because the server crashed during
finalisation.
Verified locally: twoody workspace had run_001 (interrupted) +
run_002 (succeeded) in active/. After hydrate with new code, both
moved to archive/, claude-default reports active_runs=0, capacity
is restored.