Terminate a single AI run (command.dispatch{ai:true} — spec review/compose,
Console prompt) that exceeds a wall-clock limit, so a hung/looping AI CLI no
longer leaves the web dispatch waiting on a `done` frame forever.
- ProfileConfig.aiRunTimeoutSec: machine-user default (Worker config; 0 = off,
default 300s) + read-only server-managed mirror projectAiRunTimeoutSec of the
serving project's override (pushed via ws_token.projectTokens).
- runAiPrompt resolves project-over-machine-user; threaded runAiFailover ->
runAttempt -> executor, enforced per failover attempt (SIGTERM -> SIGKILL,
terminal done exit 124 + note). Non-AI dispatch unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ELTjDUH4uFcFoHwFJPLFAy