Agent chat: no thread minimap by default (the column of marks down the left edge)

Merged
TE
15d ago
+181-20

Leo on the nightly (2026-10-21): a column of dashes, one per message, plus a thumb box down the left edge of the agent chat, and a second scroller.

What it was

  • The full-height thread minimap (ScrollMap.tsx) has been the default arm of the thread-minimap-layout experiment since #22784 (644642e1e3c, 2026-10-20). Before that, the compact Codex rail from #22228 was on by default. A minimap has been on by default ever since it first landed (225ea2749d7, 2026-10-06), so this is not a re-add after a removal: no PR ever turned it off. #22879 (33596f544f4) added the lit band of marks under the view.
  • #23285 (a4046305413) removed the scrollbar hiding from the compact rail's list (scrollbar-width: none / ::-webkit-scrollbar, which SCROLLBARS-THIN forbids), so that list drew its own scroller next to the transcript's.
  • Nothing else turns it on: no Swift, Settings or dogfood preset sets thread-minimap-layout. Only the experiment default, a cmux.experiments localStorage key, and the gallery or test harness overrides do.

Change

  • thread-minimap-layout gets an off arm, and off is now the default. The transcript draws no map, no rail and no marks; its one scroller is the shared thin overlay one. The transcript never reserved a gutter for the rail (the rail only used the column's existing inset), so there is nothing to reclaim. Previous and Next Turn and the bookmarked-prompt steps still work. full and compact stay selectable for dogfood: cmux.experiments = {"thread-minimap-layout":"full"}.
  • The compact rail's list is overflow: hidden. It still scrolls from script and on focus (it keeps the band in view, a scrub reaches past an edge, Tab), but it never draws a scroller, and it uses none of the properties check-scrollbars forbids.
  • New webviews/test/thread-minimap-default-off.test.tsx checks three things: the shipped arm is off; a 30-prompt chat with no override has no .acpmux-minimap, .acpmux-scrollmap or [data-tick] in the DOM and keeps the centered column; Previous Turn still steps the transcript. It also checks that the list's CSS never scrolls and that the map uses no accent or Highlight color. The existing rail tests already pin their arm (compact/full); only their comments changed.

Testing

  • Red: bun test test/thread-minimap-default-off.test.tsx fails 3 of 3 on 727fd4e30d6 (test only). The default arm is "full", a .acpmux-minimap is in the DOM, and the list CSS is overflow-y: auto.
  • Green: at the head, that test plus thread-minimap-rail, thread-scroll-map-rail, thread-bookmarks, thread-turn-keys, thread-minimap-current and hover-intent-cards: 28 pass, 0 fail.
  • bun run check passes at the head. check-scrollbars has no webviews hits; its remaining hits are Swift base debt.

Observed / Not run

  • Observed: the runs above, on huge-blue.
  • Not run: screenshots. The gallery advisory run renders agent-pane.thread-minimap, and with this change the default cell shows no rail.
  • Not in this PR: the blue ring around the chat pane. It is the agent-turn attention ring from #22678, not a focus ring, and #23754 fixes it.

Changelog

  • Changed: the agent chat no longer shows the thread minimap (the column of marks down the transcript's left edge) by default.

Webview only; no native UI change.

Agent session: cosmic-gray

🤖 Generated with Claude Code