Profiling a 2,745-session hub while scrolling a chat showed the two
longest main-thread stalls (~80 ms) came from the session list, not the
transcript:
- The home list, covered by the pushed chat, still rebuilt and diffed
every row on each session change. A covered list now keeps its last
rows and refreshes once on return; a side-by-side split stays live.
- DiskCache encoded the 2 MB session snapshot on the main actor after
every burst of changes. Encoding now runs with the file write, off it.
After the change the trace has no session-list or snapshot work on the
main thread and no stall over 50 ms (max 38 ms, from Markdown cells
entering the screen).