Skip to content

bug(dispatch): Grid Dispatch first lanes lost their selector strip when the index began following focus #850

Closed

Description

@Juliusolsson05

Expected behavior

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):

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

  1. Enter Dispatch and switch to Grid Dispatch with a row of two or more lanes.
  2. Focus lane 2 of a row.
  3. Try to change the agent shown in lane 1 of the same row.
  4. 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

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.

Environment

Agent Code 0.0.2-beta.1, main at 037da45.

Activity

  1. Juliusolsson05 commented on Sep 10, 2026

    @Juliusolsson05
    OwnerAuthor

    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.

  2. Juliusolsson05 commented on Sep 11, 2026

    @Juliusolsson05
    OwnerAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions