fix: replace queue virtualizer with tanstack ## Summary Replace the queue/history virtualization change from VueUse with TanStack virtualizer so the implementation matches the virtualizer layer Reka already builds on. ## Changes
Test focus: Verify the history list renders correctly with the TanStack virtualizer and row heights are accurate. Prerequisites: Load default workflow Steps: Queue a job to ensure there is an item to display in the list → Open the History sidebar tab → Wait for the virtual list to render → Capture the history list
# linux QA Video Report
- Generated at: 2026-04-12T13:19:31.606Z
- Model: `gemini-3-flash-preview`
- Target: https://github.com/Comfy-Org/ComfyUI_frontend/pull/10682
- Before video: `./qa-artifacts/qa-report-Linux-24307540335/qa-before-session.mp4` (3.1 MB)
- After video: `./qa-artifacts/qa-report-Linux-24307540335/qa-session.mp4` (2.8 MB)
- Mode: **Comparative (before/after)**
## AI Review
## Summary
The PR replaces the `VueUse` virtualizer with `TanStack Virtual` in the Queue and History list components to align with the application's overall virtualization architecture. The BEFORE and AFTER videos show identical test execution paths (Login -> Template selection -> Run failure -> Open Queue sidebar).
While the videos do not demonstrate a populated list with many items (which would exercise the virtualization logic like scrolling and recycling), they confirm that the refactor does not break the application's initialization, navigation, or the rendering of the Queue sidebar shell in its empty state.
## Behavior Changes
| Behavior | Before (main) | After (PR) | Verdict |
| :--- | :--- | :--- | :--- |
| **Queue Sidebar Rendering** | Sidebar opens correctly with "Queue" header. | Sidebar opens correctly with "Queue" header; no layout shifts. | **No Change** |
| **App Navigation** | Templates and Workspace navigate as expected. | Templates and Workspace navigate as expected. | **No Change** |
| **Empty State Handling** | Renders empty state/header without errors. | Renders empty state/header without errors. | **No Change** |
| **Virtualization Implementation** | Uses `useVirtualList` from VueUse (internal). | Uses `@tanstack/vue-virtual` (internal). | **Improved** |
## Timeline Comparison
| Time | Type | Severity | Before (main) | After (PR) |
| :--- | :--- | :--- | :--- | :--- |
| 0:00-0:04 | State | None | Application loads to login screen and transitions to workspace. | Application loads to login screen and transitions to workspace. |
| 0:05-0:08 | Interaction | None | User opens and browses the "Getting Started" templates. | User opens and browses the "Getting Started" templates. |
| 0:11-0:12 | Behavior | None | User clicks "Run", resulting in a workflow error (missing output nodes). | User clicks "Run", resulting in a workflow error (missing output nodes). |
| 0:13-0:15 | Layout | None | Queue sidebar is opened; "Queue" label and empty container visible. | Queue sidebar is opened; "Queue" label and empty container visible. |
## Confirmed Issues
No visual or functional issues were observed in the provided videos.
## Possible Issues (Needs Human Verification)
* **Virtualization Logic**: Because the queue is empty in both videos, the actual scrolling behavior and item recycling of the TanStack virtualizer (the core of the PR) are not visible. A verification with >20 jobs in the list would be required to confirm row-height derivation and scroll performance.
## Overall Risk
The risk is **low**. The PR is a technical refactor that swaps one well-supported virtualization library for another to maintain consistency across the codebase. The videos confirm that the integration is stable enough to handle basic navigation and empty states without regressions. Unit tests included in the PR diff (`JobAssetsList.test.ts`, `buildVirtualJobRows.test.ts`) further mitigate risk regarding row calculation logic.
## Verdict
The BEFORE video establishes a baseline of the application working correctly. The AFTER video shows identical functionality, confirming that the change in the virtualization engine did not introduce immediate regressions to the UI shell or general navigation.
{"verdict": "REPRODUCED", "risk": "low", "confidence": "high"}