Field bug (v1.4.144-rc.4): switching to a workspace with a streaming
inline TUI (Codex) periodically shows a mostly-blank pane (viewport
stranded mid-buffer, input box missing) or a bottom gap (PTY rows !=
pane rows) until a manual resize forces SIGWINCH.
Three independent losing legs on the reveal path, each fixed:
1. Stranded corrective fit: the reattach/hidden-snapshot replay parks
its PTY-resize continuation behind "the next successful fit"; when
the pane is momentarily unmeasurable mid-reveal, no later fit is
guaranteed (container size may already be final), leaving xterm at
snapshot dims with no forwarded resize. safeFitAndThen now actively
retries on settled frames (bounded) and breadcrumbs on exhaustion.
2. Swallowed replay paint: the cold-park remount path has no reveal
repaint, so a replay parsed while xterm's RenderService is paused
(IntersectionObserver lags the reveal) never painted. The settle
refresh now drives one synchronous render through the pause latch
(extends the #7614 release to the remount path).
3. Viewport stranded at the snapshot bottom: the reveal's bottom anchor
is a one-shot that runs before deferred live chunks parse; an inline
TUI keeps appending across the reveal. Re-enforce the restored scroll
intent after the deferred drain parses (pins preserved).
New regression harness: tests/e2e/terminal-inline-tui-reveal-convergence
drives a codex-shaped inline fixture (agent-marked tab, scrollback
inserts + bottom live block, synchronized output, mouse reporting)
through hidden/parked/flapping/resize reveals under CPU throttle and
asserts convergence with no resize: viewport at bottom, fresh frame +
input row visible, still following, xterm == fit proposal == applied
PTY size, and painted-pixel ink in the live-block band (WebGL forced).
Co-authored-by: Orca <help@stably.ai>