supervis v1.2.2 — hung-worker fix, CLI flags, connection retry
A correctness pass over issues found in a full read of the codebase. No new features, no config migration needed.
Fixed
A hung Claude Code process hung supervis with it. claude_timeout was only applied to the process exit, which happens after stdout has already closed. The stdout read itself was unbounded, so a worker that wedged mid-task without closing its pipe blocked the supervisor forever and the timeout never fired. Every read is now bounded, output collected before a stall is handed back instead of discarded, and the child is reaped on cancellation.
supervis --version and --help failed. Both were read as a project directory and exited with Directory not found: .../--version. The CLI uses argparse now.
Network blips killed a turn. The retry path only recognised errors carrying an HTTP status code, so dropped connections and read timeouts went straight through as fatal. They now retry with the same backoff as 429s and 5xxs, and the client's own retry layer is disabled so there is one backoff policy instead of two stacked on each other.
Missing Claude Code CLI produced a confusing failure. Without claude on PATH the resulting FileNotFoundError was buried in a tool result and the supervisor treated it as a retryable task failure. supervis now checks at startup and points at the install docs.
An over-long line from Claude Code could abort the read. That line is skipped now and the run continues.
Changed
claude_timeout is now an idle timeout, and the default is 1800s. A task that keeps producing output runs as long as it needs; the clock only starts when it goes quiet. The old 300 was inherited from a setting that never actually governed the stream, so it was never validated for the job. Claude Code emits a line per assistant turn and per tool result, which means it goes silent for the entire duration of a long tool call — a full test suite, a release build, a container image. At 300 seconds those healthy runs would have been killed.
The DeepSeek request timeout moved to 300s for the same reason: prefill on a long conversation can take a while to produce the first chunk.
Legacy deepseek-chat / deepseek-reasoner wording moved to past tense; those ids were retired 2026-07-24. The remapping stays, so old configs still work. Pricing re-verified against the published rate card, rates unchanged.
CONTRIBUTING.md brought back in line with the codebase.
Housekeeping
Tests 123 to 140, coverage 49% to 52%. CI green on Python 3.10 through 3.14.
pipx upgrade supervis