Repository navigation
fix(conversations): picker keyboard never acts on rows from an older query; highlight survives enablement refreshes - #1297
Conversation
…rowing CI for #1266 (0c962aa) failed 'resumes the highlighted row…': Enter resumed row 0 because the picker's head-keyed highlight reset (a passive effect) flushed after the test's ArrowDown. findByText resolves when the rows paint, not when effects settle. Flush, then confirm the arrow landed. Ordering only, no wider timeout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…highlight (steering q27) The highlight reset depended on the providers ARRAY's identity, and the enablement effect rebuilds that array on every store update, so a refresh with an unchanged filter threw the user's highlight back to row 0 and Enter resumed a conversation they had not chosen. It is now keyed by content. The reset also moved from a passive effect into render, so a new list head's first paint already highlights row 0 (CI's effect-after-key ordering came from act batching; the app's discrete-event flush made it unreachable, but the render-time reset removes the reliance). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on rows from an older query While a new scope, query or filter loads, the old rows stay on screen. Enter resumed a row the new scope excludes, and an arrow press moved the highlight onto a row the arriving page then replaced (the same head means no reset), so Enter resumed a conversation the user never highlighted. useConversationList now reports when its rows answer other parameters, and the picker ignores arrows and Enter until they match; a mouse click on a visible row stays allowed. Tests pin both races and that the reset still happens on a new query (review B). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…der query; say 'loading' while stale A loadMore across a filter change appended new-scope rows to old ones and labelled the mix as the new scope, clearing 'stale' and reopening Enter on an out-of-scope row. loadMore now does nothing while the rows are stale. The status reads 'loading…' as soon as the rows are stale, so keys the picker ignores during the debounce are explained. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s, so it reaches loadMore ArrowDown is swallowed by the stale key guard before loadMore, so the round-2 test passed with the loadMore guard removed. A scroll reaches it; the test now fails without the guard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Final disposition (pre-merge), head 4533252 (the reviewed code plus a test fix and a main remerge). Two independent reviewers (A: picker keyboard selection; B: tests), two rounds each. Round 2 was on 5c91a90. The round-2 fix, a9138ad, came after that and was not re-reviewed.
Findings and dispositions: Round 2
Round 1
Caveats / residuals:
The PR body is rewritten to describe what merges; it had described only the first test commit. 🤖 Generated with Claude Code |
|
Correction (steering q37): the disposition above covers only reviewers A and B. The plan requires three independent reviewers. A third reviewer (C, Grok) is now reviewing the final head, with focus on stale-row selection, paging and overlap with #1221. This PR will not merge until C's verdict is added here. 🤖 Generated with Claude Code |
…ies to the new page The highlight reset also fires when the fresh page lands (stale is in the reset key), and a stale list ignores hover. A hover over an old row used to stick when the new page kept its head, so Enter resumed the row that replaced it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Final disposition (pre-merge), head 6112e84. This replaces the A/B-only disposition posted earlier. Three independent reviewers:
Findings and dispositions: Round 1, A and B (fixed in 291f56e)
Round 2, A and B
Round 1, C (at 4533252)
C round 2: no new findings. C1 fixed and C2 handled. Residuals:
Merges through batch PR #1318 once every member passes its gate. 🤖 Generated with Claude Code |
Conflicts resolved (steering q41 overlaps): - RestoreBanner: main's swap/focus + button styling, with the batch's save-failure label; the two test files combined on one mutable context. - BulkProviderSwitchModal: main's DialogActions footer, with #1312's stop (Cancel becomes "Stop after this agent" while locked). - NewAgentPlacementOverlay: main's list keys under #1286's `active` gate; main's new listbox autofocus is gated on `active` too (a hidden overlay must not take focus). - pane.ts: #1286's spawnFailureToast over main's raw err.message toasts (q22). - ConversationsPicker: main's useListNavigation, with #1297's stale guard before nav.onKeyDown for every list key (PageUp/Down, Home/End, ⌃N/⌃P), hover stripped while stale, and `stale` in the reset key. Also fixes main's red CI on 13ae608: nine tests still queried #1221's old accessible names ("everywhere", the recorder's "Add"/"Press keys…"). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Follows CI for #1266 (head 0c962aa, which doesn't touch the picker). It failed
ConversationsPicker > resumes the highlighted row under its own cwd and provider on Enter:replaceSessionwas called with row 0 instead of the highlighted row 1. Assessing that test found three real picker bugs, all fixed here. No issue was filed for them; this PR is their record.What merges
providersarray, and the enablement effect rebuilds that array on every store update. So an enablement refresh with an unchanged filter moved the highlight back to row 0, and Enter resumed a conversation the user hadn't chosen.stale.staleis in the key, the highlight also resets when the fresh page lands (review C1).useConversationListexposesstale: the response key differs from the current parameters (cwd, scope, providers, includeChildren, trimmed query).loadMoredoes nothing while stale. Before, a scroll during a filter change fetched the old query's next page, appended it to the old rows and labelled the mix as the new scope.aria-selectedbefore Enter. No timeout is widened.Tests
ConversationsPicker.renderer.test.tsxhas 18 tests. They cover:loadMore. The scroll version fails with thestaleguard inloadMoreremoved.npx tsc -bis clean.Residual
stale. The integration requirement is posted on feat(ui): make every surface keyboard-operable with compact key hints and consistent chrome #1221: every navigation key and hover must respectstale, with one reset.🤖 Generated with Claude Code