Summary
A `running` agent step that makes no progress (no agent CPU, no file mtime in cwd, no channel message) never times out. Only the coarse workflow-level timeout (e.g. 7_200_000ms) eventually fires. There is no per-step watchdog to retry/fail a stalled step.
Evidence
Every wedge in the factory build-out presented as a step stuck `running` 15–30+ min with zero activity, requiring manual detection + TaskStop. A per-step inactivity timeout would have auto-retried each.
Proposed fix
Configurable per-step inactivity timeout (default ~5–10 min of no completion-evidence event): on expiry → retry up to `retries`, then fail → `.repairable` / `needs_human` (#6). Heartbeat = any of {agent CPU, file mtime in cwd, channel message, verification poll}. Never hang.
Why this matters
This is the safety net that makes the other completion-reliability bugs non-fatal: a missed completion signal becomes an auto-retry instead of a hung run.
Summary
A `running` agent step that makes no progress (no agent CPU, no file mtime in cwd, no channel message) never times out. Only the coarse workflow-level timeout (e.g. 7_200_000ms) eventually fires. There is no per-step watchdog to retry/fail a stalled step.
Evidence
Every wedge in the factory build-out presented as a step stuck `running` 15–30+ min with zero activity, requiring manual detection + TaskStop. A per-step inactivity timeout would have auto-retried each.
Proposed fix
Configurable per-step inactivity timeout (default ~5–10 min of no completion-evidence event): on expiry → retry up to `retries`, then fail → `.repairable` / `needs_human` (#6). Heartbeat = any of {agent CPU, file mtime in cwd, channel message, verification poll}. Never hang.
Why this matters
This is the safety net that makes the other completion-reliability bugs non-fatal: a missed completion signal becomes an auto-retry instead of a hung run.