Severity: high | Category: correctness | Phase: P1.9
Problem
run() streams for line in process.stdout: (unbounded) before process.wait(timeout=...), so the 30-min timeout only bounds the window after stdout EOF. A hung external agent (claude/codex/opencode) that keeps stdout open blocks the run — and the batch worker — forever.
Evidence
codeframe/core/adapters/subprocess_adapter.py:124
Acceptance criteria
- A deadline wraps the read loop (reader thread + overall timer); on expiry the child is killed and a timeout failure returned.
- Test: a child that stalls with stdout open is terminated at the timeout.
Dependencies
None
Filed from the SaaS launch-readiness audit. Atomic: one developer, one session. Work order: strictly P0.1 → P3.12 (no forward dependencies).
Severity: high | Category: correctness | Phase: P1.9
Problem
run()streamsfor line in process.stdout:(unbounded) beforeprocess.wait(timeout=...), so the 30-min timeout only bounds the window after stdout EOF. A hung external agent (claude/codex/opencode) that keeps stdout open blocks the run — and the batch worker — forever.Evidence
codeframe/core/adapters/subprocess_adapter.py:124Acceptance criteria
Dependencies
None
Filed from the SaaS launch-readiness audit. Atomic: one developer, one session. Work order: strictly P0.1 → P3.12 (no forward dependencies).