Summary
In OpenClaw 5.22, streamed assistant messages occasionally finish but never paint to screen in the TUI. The workaround is toggling /verbose on then /verbose off, which forces a full repaint.
Root cause
handleChatEvent in the TUI bundle has three early-return paths (lines 2949, 2960, 2972 in tui-LVkXuSWn.js) that call tui.requestRender() without the true flag. The pi-tui differential renderer (requestRender() without args) compares against previousLines and sometimes computes no visible diff, skipping the paint entirely. requestRender(true) resets diff state and forces a full repaint.
The three early-return cases are:
state === "final" with no message + local BTW run (line 2949)
state === "final" with no message (line 2960)
state === "final" with a command message (line 2972)
Workaround (local patch)
Change all three tui.requestRender() calls inside handleChatEvent to tui.requestRender(true).
This bug has also been reported upstream against pi-tui: earendil-works/pi#4970
Summary
In OpenClaw 5.22, streamed assistant messages occasionally finish but never paint to screen in the TUI. The workaround is toggling
/verbose onthen/verbose off, which forces a full repaint.Root cause
handleChatEventin the TUI bundle has three early-return paths (lines 2949, 2960, 2972 intui-LVkXuSWn.js) that calltui.requestRender()without thetrueflag. Thepi-tuidifferential renderer (requestRender()without args) compares againstpreviousLinesand sometimes computes no visible diff, skipping the paint entirely.requestRender(true)resets diff state and forces a full repaint.The three early-return cases are:
state === "final"with no message + local BTW run (line 2949)state === "final"with no message (line 2960)state === "final"with a command message (line 2972)Workaround (local patch)
Change all three
tui.requestRender()calls insidehandleChatEventtotui.requestRender(true).This bug has also been reported upstream against pi-tui: earendil-works/pi#4970