You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
4+ of the last ~8 releases touched the render loop. For a 1.0 the render path should stop churning.
Why this is fragile (verified constraints, don't re-litigate)
Ink's <Static> is append-only and index-tracked — it never redraws committed lines; the array passed to it must only ever grow (packages/cli/src/ui/components/MainContent.tsx:36-40).
Ink's live region redraws by erasing the previous frame's storedlog-update line count — after a resize the terminal has reflowed that frame to a different height, so the erase misses and stale frames land in scrollback.
In full-screen, layout height==rows forces Ink into the clearTerminal branch — it rewrites the whole alt-screen on every commit.
Proposed 1.0 gate
Soak the render path — a real-terminal pass over: drag-resize (inline + full-screen), long sessions, streaming + spinner, agent tabs, transcript overlay, dialogs. Resize duplication is real-TTY-only — ink-testing-library's fake stdout has no cursor/scrollback, so unit tests cannot catch it (this is exactly why fix(tui): stop live-region output duplicating on terminal resize #469 shipped unverified until a live check).
Regression tests at the seams we can test — resize→repaint wiring (done in DefaultAppLayout.test.tsx), <Static> growth invariant, refreshStatic call sites.
Tune RESIZE_THROTTLE_MS (currently 80ms, DefaultAppLayout.tsx) if the drag repaint flickers in daily use.
From the 1.0-readiness audit. Not a filed bug — a churn signal. The TUI render/resize path has dominated recent releases:
#467/ v0.71.1 — reflow<Static>history on resize#469/ v0.71.2 — stop live-region output duplicating on resize (the throttled clear+repaint)#440— full-screen + native selection (reversed v0.65.0's mouse capture)#444word-diff,#459thinking render,#449gradient spinner4+ of the last ~8 releases touched the render loop. For a 1.0 the render path should stop churning.
Why this is fragile (verified constraints, don't re-litigate)
<Static>is append-only and index-tracked — it never redraws committed lines; the array passed to it must only ever grow (packages/cli/src/ui/components/MainContent.tsx:36-40).log-updateline count — after a resize the terminal has reflowed that frame to a different height, so the erase misses and stale frames land in scrollback.refreshStatic()(clear +historyRemountKeybump) is the only lever that fully repaints; it's now called on model change,/clear, view switch, transcript toggle, and (as of fix(tui): stop live-region output duplicating on terminal resize #469) resize.height==rowsforces Ink into theclearTerminalbranch — it rewrites the whole alt-screen on every commit.Proposed 1.0 gate
ink-testing-library's fake stdout has no cursor/scrollback, so unit tests cannot catch it (this is exactly why fix(tui): stop live-region output duplicating on terminal resize #469 shipped unverified until a live check).DefaultAppLayout.test.tsx),<Static>growth invariant,refreshStaticcall sites.RESIZE_THROTTLE_MS(currently 80ms,DefaultAppLayout.tsx) if the drag repaint flickers in daily use.Related:
specs/tui-overhaul.md, #456 (minor follow-ups).