Repository navigation
UI Consistency: 1 issue found
apps/web/src/components/threadActionMenu.logic.ts: the newfilter-by-projectitem is the only entry in the shared thread action menu built without anicon. The web context-menu fallback reserves no icon column, so this row's label sits ~1.5rem left of every other row and, because the item renders first, the menu opens with a misaligned top row in the browser. Suggested fix posted inline: collapse the two label variants into one item and give it an icon present in the fallback'sICON_PATHSmap (e.g.folder-tree).
Details
Note
Your check run agent prompt is: .macroscope/check-run-agents/ui-consistency.md
More information about how Check Run Agents work can be found in our Help Center.
Methodology and files examined:
apps/web/src/components/threadActionMenu.logic.ts/.test.ts/apps/web/src/hooks/useThreadActionMenu.ts: theprojectFilter: { isActive } | nullstate field correctly suppresses the item on the chat header, and the label flip is covered by focused tests. Menu contract itself is sound.apps/web/src/contextMenuFallback.ts(lines 292-347): rows areflex ... gap-2with the icon<svg>conditionally prepended and no spacer/inset for icon-less items, confirming the alignment regression is real in the browser path.folder-treeis already present inICON_PATHS.- Desktop path (
apps/desktop/src/electron/ElectronMenu.ts) stripsiconfrom native menus, so adding an icon is browser-only and carries no desktop risk. apps/web/src/components/Sidebar.tsx: theprojectGroupsRefpattern and the addedprojectScopeKeydependency preserve row memoization during streaming while keeping the scope read fresh at menu-open time; scope resolution uses the thread's ownenvironmentId/projectIdagainst the logical project group, so no active-environment fallback is introduced.toggleProjectScopeinSidebar.logic.tsis pure, tested, and consistent with the existing dropdown radio-group semantics (documented divergence is intentional and commented).- No Tailwind, theme, CSS-ownership, scroll/virtualization, or shared-primitive changes are present in this diff.
🔍 Agent activity — 13 tool calls
💭 I'm checking whether adding
projectScopeKeyto the useCallback dependencies undermines the memoization benefit from using a ref for projectGroups—since it changes infrequently, it should be fine. Let me pull up the actual file to verify.
1. git_tools — projectScopeKey
2. browse_code — apps/web/src/components/threadActionMenu.logic.ts
💭 I notice the new "filter-by-project" item lacks an icon while nearly all other menu items have one, which could cause a misalignment issue. I should check how ContextMenuItem renders icons to see if a missing icon leaves a visible gap.
3. browse_code — How are ContextMenuItem entries with and without an icon rendered in the web app's context menu component (apps/web/src)? Does a missing icon cause label misalignment (e.g. icon slot reserved) or is layout fine? Show the rendering code.
4. browse_code — apps/web/src/components/Sidebar.tsx
💭 I'm noticing the new menu item is missing an icon, which breaks alignment in the fallback context menu since every other top-level item—rename, mark-unread, copy, archive, delete, new thread, pin/unpin, settle, snooze—all have icons assigned. I'm also curious about a
folder-treeicon defined in ICON_PATHS that doesn't seem used anywhere—maybe it was meant for this feature, so I want to verify whether it's actually referenced by any menu item, and check the ContextMenuItem type and native Electron menu path to see how icon validation works there. I'm also considering whether addingprojectScopeKeyto the dependency array of the context menu handler causes unnecessary recreation, though that seems like a minor, rare-case concern since it only changes on user action.
5. git_tools — folder-tree
6. git_tools — icon
💭 I notice folder-tree exists in ICON_PATHS but isn't used by any current menu item, so it was likely intended for exactly this kind of feature, or was used previously. I'm going to check other ContextMenuItem builders to confirm the convention that all items have icons.
7. git_tools — label: "
8. git_tools
💭 I'm checking whether the folder-tree icon is used anywhere else besides contextMenuFallback.ts, and it seems it's unused elsewhere. I'm also considering whether the missing icon on this new menu item counts as a legitimate UI consistency issue, since other thread action items all have icons. I should verify whether the Electron native menu even renders icons, since if it doesn't, the misalignment would only affect the web fallback. But regardless, since every other item in this builder has an icon and this one doesn't, that's a clear, concrete inconsistency worth flagging with an inline comment. I'm also noting a separate issue where a ref is being mutated during render, but that's not really a UI-consistency concern per the instructions, so I'll set that aside. Looking at the "Filter by project" item's placement, it lacks a separator even though other item groups in this menu use one, and since it's really a view/list-scoping action distinct from thread actions, that could warrant its own separator, but I'll keep the focus on the missing icon issue rather than expanding scope further. I want to check how Electron's native context menu handles icons — whether items without one render with a shifted label position, since if icon presence affects alignment across platforms that strengthens the case for flagging the missing icon here.
9. browse_code — In the Electron/desktop app, how is contextMenu.show implemented for ContextMenuItem lists — does it render the icon field (e.g. mapping icon names to nativeImage) in the native menu, or ignore it? Also confirm whether apps/web/src/contextMenuFallback.ts is used in the desktop app or only in browser.
💭 The issue only shows up in browser web fallback rendering, since the new menu item lacks an icon while every other top-level row has one, pushing its label left of alignment. The fix is to add a "folder-tree" icon to both variants, including the "Show all projects" one, and since that icon already exists in ICON_PATHS it should resolve correctly. I'm checking the exact indentation and formatting of the affected lines in threadActionMenu.logic.ts (lines 64-70) to make sure the suggested edit fits cleanly, including verifying line length against the repo's prettier printWidth config, and mapping the change to the correct diff line numbers on the right side of the file for the review comment. Now I'm weighing severity: this is a genuine visual inconsistency—mixing icon and no-icon items within the same menu level would misalign the shared menu component—rather than a purely aesthetic nitpick, so I'm leaning toward flagging it as a failing finding with an inline suggestion rather than dismissing it as optional. But I want to verify before committing, so I'm going to check lines 300-360 of contextMenuFallback.ts to confirm how the fallback computes icon spacing.
10. browse_code — apps/web/src/contextMenuFallback.ts
11. git_tools — printWidth
💭 No icon slot is reserved, confirmed. Let me check the biome.json config for line width settings.
12. browse_code — What is the configured formatter line width (biome.json or prettier config) for the repo, specifically for apps/web TypeScript files?
💭 Checking the line length against the 100-character limit to see if it needs wrapping. Since it lands right at the edge, I'm restructuring into a cleaner multi-line array that computes the label dynamically based on active filter state, replacing lines 64-70 with something formatter-safe. I'm confirming the added lines span 64-70 in the new file, so my inline suggestion can target that whole block cleanly. I'm now drafting the actual review comment for apps/web/src/components/threadActionMenu.logic.ts, and leaning toward flagging this as a real (if minor) visual inconsistency worth failing the check over, since it's a shared menu component.
13. modify_pr — One finding: the new filter-by-project menu item is the only entry in the shared thread action menu without an icon, which misaligns its label in the web context-menu fallback. Details inline.
Agent Credits: 292 credits
Token usage: 64 uncached input · 1,186,464 cache-read input · 258,144 cache-write input · 22,845 output
Agent Credits may also include non-token charges from external tools such as web research.