Skip to content

1.4.9

Choose a tag to compare

@github-actions github-actions released this 30 Apr 19:02
· 59 commits to main since this release
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.