The TUI repainted on every 33ms tick whether or not anything had changed — measured at ~725 bytes/s of escape sequences with nothing attached and nothing happening. Over a remote terminal that is constant traffic for no visible change. Output was also unbuffered: `CrosstermBackend::new(std::io::stdout())` issues one `write!` per cell run, 3551 of them for a 200x50 repaint, each taking the global stdout lock. A BufWriter collapses a frame into one flush (measured: 3551 writes -> 2). Frames are now keyed on the catalog version, the active pane's screen revision, an input epoch and the terminal size, and skipped when the key is unchanged. Session cards carry an advancing duration, so a frame still never stands for longer than a second. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>