[BUG] SIGWINCH relayout spills duplicate transcript + status bar stacking in Zellij (amplified repro)
Environment
- Claude Code: v2.1.117
- OS: macOS Darwin 25.1.0 (Apple Silicon)
- Terminal: Ghostty
- Multiplexer: Zellij 0.44.1
- Model: Claude Sonnet 4.6 / Opus 4.6
Related issues
This is the Zellij-specific amplification of #46834. The same root cause (ink/yoga re-emitting full transcript on SIGWINCH) manifests more severely inside Zellij because Zellij generates SIGWINCH on every tab switch, pane resize, and layout change — not just manual window resizes.
What happens
During an active Claude Code session inside a Zellij pane, the bottom status bar lines (ctx%, permission mode, auto-update notice) are repeatedly appended into the outer terminal's (Ghostty's) scrollback as new output lines instead of redrawing in place. Simultaneously, earlier response content is partially overwritten.
Captured via zellij action dump-screen --pane-id terminal_34 --full:
~/Code/my-ops on main [Sonnet 4.6] ctx:56%
⏵⏵ bypass permissions on (shift+tab to cycle)
✗ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
✗ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
⏵⏵ bypass permissions on (shift+tab to cycle)
✗ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
⏵⏵ bypass permissions on (shift+tab to cycle)
✗ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
❯
───────────────────────────────────────────────────────────────────
~/Code/my-ops on main [Sonnet 4.6] ctx:56% ← second copy
⏵⏵ bypass permissions on (shift+tab to cycle)
✗ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
[response content starting from mid-point — earlier content overwritten]
Each status bar block shows a different ctx% value (56% → 53% → 52%), confirming these are separate relayout events triggered by token streaming updates, not a single stale redraw.
Why Zellij amplifies the issue
Zellij sends SIGWINCH to pane processes on:
- Tab switch (switching away from and back to a tab)
- Pane resize (any layout change)
- Session attach/detach
In a long-running session (12+ hours, 10+ panes), this results in dozens of SIGWINCH events per hour. Each event triggers a full ink/yoga relayout that re-emits the entire transcript + status bar into Ghostty's primary scrollback.
After ~12 hours: the same response block appears 10–20 times in the scrollback, each copy at a slightly different column width and with a different ctx% in the status bar, making scrollback effectively unusable.
Content overwriting
Beyond duplication, each relayout re-emits content from a cursor position that overwrites the preceding response. In the dump above, a ~5-point numbered list had only point 5 onward visible — points 1–4 were overwritten by a status bar relayout that placed the cursor at the wrong screen position.
Repro steps
- Open Claude Code inside a Zellij pane
- Send a prompt that produces a long response (e.g. a multi-section analysis)
- While the response is streaming, switch to a different Zellij tab and back
- Observe: the status bar lines (ctx%, permission mode) appear as new output lines below the response
- Repeat step 3 a few times — each cycle adds another copy
Alternatively: resize the Zellij pane or the Ghostty window during streaming.
Expected behavior
Status bar updates should redraw in place (cursor-addressed write to fixed screen rows) without emitting new output lines or affecting the scrollback.
Notes
CLAUDE_CODE_NO_FLICKER=1does not resolve this in Zellij — it introduces a separate scroll artifact (\#42930)- The issue appears to originate around v2.1.68 (1M context release), per community reports
- Confirmed still present in v2.1.117
See also
- \#46834 — canonical issue (non-Zellij, general SIGWINCH trigger)
- \#46983 — same symptom on Terminal.app
- \#46462 — same symptom on window enlarge (closed as duplicate of \#46834)
- \#42930 —
CLAUDE_CODE_NO_FLICKER=1Zellij artifact (closed without fix)
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗