Summary
While analyzing our local Claude Code session transcripts (JSONL under ~/.claude/projects/), we found one session where a tool permission request failed with Tool permission request failed: Error: Stream closed and the harness then retried the identical permission request ~128 times in a row with no visible backoff, burning the session's turn/token budget on a dead stream.
Evidence
- One session transcript contains exactly 128 occurrences of the string
Tool permission request failed: Error: Stream closed (verified with grep -c against the raw JSONL).
- All occurrences are the same underlying incident retried, not independent failures — they are consecutive and identical.
- Environment: Claude Code CLI on macOS (darwin), session ran in a git worktree; the failure began mid-session while a permission prompt was outstanding.
Expected behavior
- Bounded retries with backoff when the permission-request stream breaks, then a clear surfaced error to the user (e.g. "permission channel lost — restart the session"), instead of an unbounded retry loop.
Impact
A single broken stream can silently consume a large share of a session's budget and leave the user with a session that appears alive but cannot make progress.
Happy to provide redacted excerpts of the transcript pattern if useful.
Summary
While analyzing our local Claude Code session transcripts (JSONL under
~/.claude/projects/), we found one session where a tool permission request failed withTool permission request failed: Error: Stream closedand the harness then retried the identical permission request ~128 times in a row with no visible backoff, burning the session's turn/token budget on a dead stream.Evidence
Tool permission request failed: Error: Stream closed(verified withgrep -cagainst the raw JSONL).Expected behavior
Impact
A single broken stream can silently consume a large share of a session's budget and leave the user with a session that appears alive but cannot make progress.
Happy to provide redacted excerpts of the transcript pattern if useful.