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
{{ message }}
Repository navigation
bug(dispatch): Grid Dispatch first lanes lost their selector strip when the index began following focus #850
In Grid Dispatch, every lane can be switched to a different agent with one click on a selector that belongs to that lane, so moving between agents in any lane is a single gesture.
Actual behavior
The first (leftmost) lane of every Grid Dispatch row has no compact index strip. Every other lane has one.
How it got that way (corrected; see the comment below):
Before Grid Dispatch, one sidebar index always wrote lane 0, so lane 0 correctly had no strip.
So the first lane now has no selector of its own. To change the agent in it you have to click into the lane first to move focus, then pick from the index. Every other lane takes one click on its strip.
Reproduction
Enter Dispatch and switch to Grid Dispatch with a row of two or more lanes.
Focus lane 2 of a row.
Try to change the agent shown in lane 1 of the same row.
There is no strip beside lane 1. Clicking an agent in the row's index replaces lane 2 (the focused lane), not lane 1.
Evidence
src/renderer/src/workspace/dispatch/TiledDispatchLayout.tsx renders DispatchMiniList only for column > 0. The WHY comment still argues that the row's index "is its selector".
gridDispatchLayout.renderer.test.tsx pins the old rule ("leaves each row's FIRST lane to that row's index list").
Related, same JSX: the empty-lane hint branches on gridRow.projectTabId, the legacy single binding that normalizeGridShape folds into projectTabIds on read. That read is always undefined, so the branch is dead. It is harmless, though: it was added in 524671b to withhold "⌥↓ for the top of the index" from bound rows while ⌥↓ still walked the global list, and 29ecd82 has since made ⌥↓ row-scoped (tiledRowScopedRows), so the copy the dead read falls through to is correct in every row. The fix deletes the branch rather than "correcting" the read, which would withhold a true promise.
Impact
Navigation regression in the main multi-agent layout. The leftmost lane of each row is also the widest by default, so it is where the user most often wants to swap agents.
Correction to the original report: the "Related, same JSX" paragraph said a project-bound row's hint makes a false promise because ⌥↓ takes the top of the global index. That was true when 524671b split the copy, but 29ecd82 later made ⌥↓ walk the focused row's own filtered list (tiledRowScopedRows in useKeybinds.ts), so "the top of the index" is true in bound rows too. The stale projectTabId read is dead code that already shows the correct copy, so the fix deletes the branch rather than changing what bound rows display. The body has been edited to match. The main bug (no strip on each row's first lane) is unchanged.
Second correction, from the #859 review: the original report said #687 kept the first lane strip-less. It did the opposite. 524671b (#687) gave every lane a strip because the index had started following focus. 1eb9a47 (#691, the lane-wake fix) removed the first lane's strip as a side change. The body now attributes the regression to #691. The fix in #859 is unchanged by this; only the record was wrong.
Activity
Juliusolsson05 commentedon Sep 10, 2026
Correction to the original report: the "Related, same JSX" paragraph said a project-bound row's hint makes a false promise because ⌥↓ takes the top of the global index. That was true when 524671b split the copy, but 29ecd82 later made ⌥↓ walk the focused row's own filtered list (
tiledRowScopedRowsinuseKeybinds.ts), so "the top of the index" is true in bound rows too. The staleprojectTabIdread is dead code that already shows the correct copy, so the fix deletes the branch rather than changing what bound rows display. The body has been edited to match. The main bug (no strip on each row's first lane) is unchanged.test(dispatch): pin each Grid Dispatch strip's lane, row binding and …
docs(dispatch): correct the first-lane strip regression history
fix(dispatch): withhold the empty-lane hint when the row offers no ag…
Juliusolsson05 commentedon Sep 11, 2026
Second correction, from the #859 review: the original report said #687 kept the first lane strip-less. It did the opposite. 524671b (#687) gave every lane a strip because the index had started following focus. 1eb9a47 (#691, the lane-wake fix) removed the first lane's strip as a side change. The body now attributes the regression to #691. The fix in #859 is unchanged by this; only the record was wrong.