Repository navigation
FIX Conversation drawer races - #3123
Merged
Richard Lundeen (richlundeen) merged 2 commits intoOct 11, 2026
Merged
Richard Lundeen (richlundeen) merged 2 commits into
Richard Lundeen (richlundeen) merged 2 commits into
Conversation
Apply the historical drawer default once per attack so late send refreshes cannot override the operator's panel choice. Synchronize selection on expanded state and verify destination routing and current rows. Cover closing drawers and delayed historical metadata on desktop and narrow screens without weakening recovered-image assertions. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Richard Lundeen (richlundeen)
approved these changes
Oct 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
The recurring merge-queue image-recovery timeout happens before recovery, while selecting another conversation (failure log). A delayed send refresh can auto-open the drawer after the helper checks visibility. Its pending toggle click then closes the drawer, moving and detaching the conversation row.
Apply the initial drawer default once per attack so later refreshes cannot override the operator's open/closed choice. The selection helper checks
aria-expanded, uses normal accessible clicks, and verifies the destination URL and selected row. Historical attacks still auto-open on desktop after asynchronous metadata loading; narrow screens remain closed until requested and close after selection. Creating, copying, and repeating conversations retain their existing drawer behavior.No API, image-conversion, recovered-draft, or FileReader serialization changes. No forced clicks, fixed sleeps, disabled motion, timeout increases, or weakened recovery assertions.
Tests and Documentation
Adds controlled real-backend coverage for delayed send refreshes, closing drawers, and delayed historical metadata on desktop and narrow viewports. The pre-fix closing-drawer regressions reproduced the original unstable-element/detached-row timeout. Updates the frontend README with drawer defaults and selection synchronization guidance.
Validation ran from
frontendon Windows. Seeded runs used the real in-memory backend with a scrubbed environment and only loopback provider fixtures with placeholder keys. No real provider APIs were called. CI merge-group runs were not rerun locally.npm test -- --runTestsByPath src\components\Chat\ChatWindow.test.tsx src\components\Chat\ConversationPanel.test.tsx --runInBandnpm run test:e2e -- --project seeded --grep "delayed send refresh|drawer is closing|preserves an image converter|repeats and nests|waits for the selected conversation" --repeat-each=3 --retries=0 --workers=1 --reporter=list --trace=on --output="C:\Users\romanlutz\.copilot\session-state\882ee962-a436-4346-ba02-d175591b3053\files\selection-final"npm run test:e2e -- --project seeded --grep "historical drawer defaults" --repeat-each=3 --retries=0 --workers=1 --reporter=list --trace=on --output="C:\Users\romanlutz\.copilot\session-state\882ee962-a436-4346-ba02-d175591b3053\files\selection-historical"npm run type-checknpx eslint src\components\Chat\ChatWindow.tsx src\components\Chat\ChatWindow.test.tsx e2e\chat-recovery.spec.ts --max-warnings 0Playwright used
E2E_FRONTEND_PORT=19388,PYRIT_BACKEND_URL=http://127.0.0.1:19387, the worktree's virtual-environment Python, andCIunset. An additional E2E TypeScript comparison found exactly the same two upstreamTS2339errors fororiginal_prompt_idin untouched repeat-history assertions, with no new diagnostics. Production type-check and commit hooks passed.JupyText was not run because no Python documentation or notebooks changed.