Repository navigation
Say when an interactive turn has gone silent, and keep the child's stderr - #727
Conversation
…derr (#715) A vendor waiting out a rate limit writes its whole diagnosis to stderr and nothing to the wire, so the drain now retains a bounded copy whatever the log level. The note never reaps: the retry usually wins, and the review-flow transcript is output rather than a conversation, so it is left out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PR Summary by QodoSurface silent ACP turns and retain child stderr
AI Description
Diagram
High-Level Assessment
Files changed (5)
|
Code Review by Qodo
1.
|
The delay can queue its continuation as the turn ends, so the registration is what proves the turn still runs. Metadata envelopes are named out of the signal: a vendor pinging usage while producing nothing is still silent.
|
Codex review flow — three findings, all taken.
Daemon unit suite 2884 total, 0 failed; AOT clean. |
…r line Disposing a CancellationTokenSource does not cancel its token, so the watcher held its delay for the whole window after every turn.
… uses A stall an hour in would otherwise be explained by startup chatter that filled the buffer, and a stall is not a reason to widen a privacy decision made about the same bytes — the size goes unconditionally so there is something to opt into.
Closes #715 — AI-2384
What & why
A hosted Gemini turn ran 11m43s producing no transcript events and no error: the CLI was silently retrying a rate-limited model call in ~70s waves, writing the whole diagnosis to stderr while the ACP wire carried nothing. From the launcher it reads as a hang from launch. Two gaps made it invisible, and both are ours:
AcpChildProcessdrained stderr for deadlock safety and logged only line lengths unless the operator had opted into frame debugging, so the vendor's own explanation was thrown away. It now retains a bounded copy (4KB, dropped over cap, daemon-local) the wayPiRpcProcessalready does.system_notesaying the agent is still running and that vendors go quiet this way, and logs a Warning carrying the retained stderr.Where to look
The note never reaps — a silent turn is usually a retry the vendor wins, and killing it would lose work the user cannot see coming. It is withheld from review flows for a different reason than from reviewer launches with a first-output deadline, and the two conditions are separate on purpose: only some vendors carry that deadline, so deriving one from the other would put a "keep waiting" note into a transcript that is consumed as review output.
Verification
AcpTurnSilenceNoticeTestsdrives the real factory againstFakeAcpAgentwith the prompt response held open and aFakeTimeProvider: the note arrives, names the window, the runtime is still alive, a second window produces no second note, and a review-flow launch gets none at all. Daemon unit suite 2884 total, 0 failed. AOT publish of the daemon clean of IL3050/IL2026.🤖 Generated with Claude Code