Repository navigation
UI Consistency: 1 issue found
Finding
apps/web/src/components/Sidebar.tsx(~1582-1584): the thread row's environment glyph now resolves throughgetEnvironmentIcon, butSidebarThreadTooltip(~318, shared withSidebarSearchResultRow) still rendersServerIconfor the same environment, so a row and its own hover card disagree. The change also switches every remote non-desktop-local row from a server glyph toCloudIcon, which is broader than the WSL fix this PR targets and diverges from the server glyph used for environments inCommandPalette.tsx(~1048) andPullRequestDetailPanel.tsx(~258). Suggested fix: threadisDesktopLocalEnvironmentinto the tooltip and resolve its icon with the same helper (usingtext-muted-foregroundinstead ofstroke-muted-foreground, sinceLinuxIconis fill-based), or retainServerIconfor the non-desktop-local case.
An inline comment was posted for this finding. Previously flagged items (the OS assertion behind LinuxIcon, the LegacySidebar EnvironmentIcon/CloudIcon ternary at ~2334-2338, and the OS-neutral "Local sandbox" wording around it) remain unresolved but were not re-posted.
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.
Scope reviewed: apps/web/src/components/Icons.tsx, Sidebar.tsx, LegacySidebar.tsx, BranchToolbarEnvironmentSelector.tsx, BranchToolbar.logic.ts, ChatView.tsx, sidebarProjectGrouping.ts, plus untouched consumers of the same environment-glyph mapping (settings/ProviderSettingsPanel.tsx, CommandPalette.tsx, pullRequest/PullRequestDetailPanel.tsx, routes/_chat.pull-requests.tsx).
Checks performed
- Traced all
ServerIcon/CloudIcon/MonitorIcon/ContainerIconenvironment call sites to compare the pre- and post-change glyph for each environment class. - Verified
getEnvironmentIconconsumers pass consistent inputs and thatEnvironmentOption.isDesktopLocalis populated at its only producer (ChatView.tsx~1966-1994); no other constructor of that interface exists, so the added required field is satisfied. - Confirmed
LegacySidebarintentionally suppresses the remote glyph for desktop-local threads (~854), so the project-header path is the only glyph surface there. - Noted that
LinuxIconusesfill="currentColor"while lucide icons are stroke-based; existing call sites inherittext-*color so they render, but anystroke-*-colored slot (the thread tooltip) would need the class changed if the helper is adopted there. - Not treated as findings: icon weight/aesthetics, the pre-existing
ProviderSettingsPanelLaptopIconmapping (untouched file, reported as context only), and unrelated legacy code in the large touched files.
🔍 Agent activity — 18 tool calls
💭 I'm checking the current head at f01bc91 against prior flagged issues — the LegacySidebar ternary flagged earlier has been resolved, now just rendering EnvironmentIcon directly. I'm now looking at whether Sidebar.tsx's thread row switch to EnvironmentIcon stays consistent with other usages. I want to verify whether SidebarThreadTooltip still uses ServerIcon despite the earlier switch elsewhere, and whether the aria-label wording inconsistency flagged in LegacySidebar around the "Local sandbox project" text has been addressed. Let me pull up the relevant files to check.
1. git_tools — ServerIcon|getEnvironmentIcon|LinuxIcon|ContainerIcon
2. browse_code — apps/web/src/components/Icons.tsx
💭 I'm checking whether the SidebarThreadTooltip still uses ServerIcon while the row was updated to EnvironmentIcon, revisiting that earlier flagged inconsistency to see if it's still unresolved. Since I already commented on this at Sidebar.tsx:1581 in a prior run, I need to weigh whether the author's partial fix — adding the helper but not applying it to the tooltip — justifies a follow-up comment rather than a duplicate one. Given the code did change in response, a focused follow-up seems fair, so I want to verify the current state around Sidebar.tsx lines 300-330, 720-800, and 1560-1600, and also recheck the LegacySidebar wording issue near lines 2320-2345 that I flagged in an earlier run. I also want to check whether hard-coding
isPrimary: falseand swapping ContainerIcon for CloudIcon changes behavior for non-desktop-local sandbox projects in a way that's worth flagging. Beyond that, I want to trace how isDesktopLocal and environmentById are used in ChatView, and grep for other places constructing EnvironmentOption to make sure the new required field on BranchToolbar doesn't break other producers.
3. browse_code — apps/web/src/components/Sidebar.tsx
4. browse_code — apps/web/src/components/Sidebar.tsx
💭 I'm noticing an inconsistency: the sidebar row now uses CloudIcon for remote threads while the tooltip, CommandPalette, and PullRequestDetailPanel still use ServerIcon for the same environment concept. This looks like a partial glyph change that wasn't applied consistently across all the places representing remote/server context. I want to flag this as a focused comment—either keep ServerIcon as the fallback in the row or update the tooltip to match. Next I should check the LegacySidebar code around lines 2320-2345 and how SidebarProjectItem defines its semantics.
5. browse_code — apps/web/src/components/LegacySidebar.tsx
6. browse_code — apps/web/src/components/LegacySidebar.tsx
💭 I'm noticing the diff only swaps ContainerIcon for EnvironmentIcon at line 2335, but the surrounding ternary I flagged earlier for collapsing is still present in the head commit — so my previous feedback wasn't fully addressed. Similarly, the LegacySidebar aria-label and Linux icon issue I noted earlier remains unchanged, so no need to repeat it. The more interesting one is the Sidebar row-vs-tooltip icon mismatch: the shared helper I requested got applied to the row but not the tooltip, and now the regression is actually broader — every remote thread shows Cloud in the row versus Server in the tooltip, not just the WSL case I originally called out. I'll write a single follow-up comment covering this expanded mismatch. Before posting, I want to verify whether
isRemoteis true for desktop-local threads and check the environment label/tooltip logic, plus confirm whether LegacySidebar's thread row uses ServerIcon so I can tell if the two sidebars are now consistent with each other. Let me look at where LegacySidebar's SidebarThreadRow renders its remote indicator icon.
7. git_tools — CloudIcon|isRemote
8. git_tools — isRemote|environmentLabel
💭 I notice the legacy sidebar deliberately suppresses the cloud icon for desktop-local threads, showing them labeled "Local" instead, while the new sidebar shows a Tux icon for that same state — a genuine cross-surface divergence that might be an intentional design choice rather than a bug. I want to trace how
isRemoteis computed and confirm whether SidebarSearchResultRow needs the sameisDesktopLocalEnvironmentflag as SidebarThreadRow, since only the thread row currently receives it and the shared tooltip component uses the icon from both rows. Let me check the surrounding code to verify this is consistent.
9. browse_code — apps/web/src/components/Sidebar.tsx
10. browse_code — apps/web/src/components/Sidebar.tsx
💭 I'm noting that the sidebar call sites hardcode isPrimary as false since it's irrelevant when isRemote is false anyway—slightly smelly but not a real bug. Also checking that LinuxIcon uses currentColor for its fill. More importantly, if the tooltip were switched to use getEnvironmentIcon, its className would need to shift from stroke-muted-foreground to text-muted-foreground, since fill-based icons don't respond to stroke classes—worth flagging in review. Now I'm checking the ChatView diff for how environmentById is used.
11. git_tools — EnvironmentOption
12. browse_code — apps/web/src/components/ChatView.tsx
💭 I should check whether buildEnvironmentOption in BranchToolbar.logic was updated to include isDesktopLocal when constructing EnvironmentOption, since the diff only touched the interface definition — if the construction site was missed, this would cause a typecheck failure.
13. browse_code — apps/web/src/components/BranchToolbar.logic.ts
💭 The line numbers don't match between what grep reported and what the view showed, which is odd since they should be from the same revision. Let me search more carefully for the actual buildEnvironmentOption definition.
14. git_tools — export function buildEnvironmentOption|export interface EnvironmentOption
💭 I'm noticing a discrepancy in the line numbers between my two greps of the same revision — one showed buildEnvironmentOption at line 70, while the interface addition appears around line 9-14, so I need to reconcile whether these results are actually from the same file state.
15. git_tools — buildEnvironmentOption
💭 The buildEnvironmentOption import doesn't seem to exist in the logic file at head, but earlier I found ChatView.tsx referencing it around line 268 -- that grep might've been against a different revision, so I should re-check ChatView at the current head to confirm.
16. git_tools — buildEnvironmentOption
17. git_tools — isDesktopLocal
💭 I'm noticing that ProviderSettingsPanel still uses its own LaptopIcon-based resolver for local device labeling, separate from the new shared getEnvironmentIcon helper, so there's a duplication the new helper doesn't actually consolidate. This is a real cross-surface inconsistency for the same state, but I've already raised the OS-assertion concern twice so I shouldn't repeat it a third time. Instead I'll shift to checking the tooltip ServerIcon usage that was partially flagged earlier and see if it still needs attention. I'm now tracing the diff more carefully: the Sidebar thread row switches from ServerIcon to the new EnvironmentIcon helper, which means every remote thread's glyph silently changes from Server to Cloud, while the row's own tooltip still uses ServerIcon — a genuine unintended visual inconsistency introduced by this change, not just a hypothetical. The smallest fix would be threading the same
isDesktopLocalEnvironment/getEnvironmentIconhelper into the tooltip component too, adjusting the icon's stroke/fill styling since LinuxIcon behaves differently, or alternatively just preserving ServerIcon for the tooltip's non-desktop-local case. I also note that LinuxIcon is fill-based unlike the stroke-based lucide icons used elsewhere, and while most parent elements use fill-compatible text-color classes so it should render fine, the visual weight at small sizes might look heavier — a minor aesthetic issue I'll skip mentioning since it's not a functional bug. Checking SidebarSearchResultRow, it only passes environmentLabel to the tooltip and doesn't include the desktop-local prop, so it stays consistent with the tooltip's existing ServerIcon behavior. Actually, lucide icons default toaria-hidden="true"automatically, but LinuxIcon doesn't have that built in. So swapping ContainerIcon/CloudIcon for LinuxIcon in the LegacySidebar tooltip trigger and BranchToolbar removes that implicit accessibility behavior—worth flagging as a real regression. Other custom icons like GitHubIcon follow the same convention without aria-hidden, so this stays consistent with repo norms and I'll skip that comment. I'll anchor the one comment I do have at Sidebar.tsx line 1584, and I'm also considering flagging that ProviderSettingsPanel has a parallel resolver duplicating the same environment glyph mapping the new shared helper is meant to own—worth raising since the PR introduces that helper as the single source of truth. I'm weighing whether raising the ProviderSettingsPanel duplication is fair game here, since that file isn't touched by the diff—it could read as demanding unrelated cleanup. But since the newgetEnvironmentIconhelper explicitly claims to be the shared mapping, the pre-existing duplicate resolver in ProviderSettingsPanel (which maps the same desktop-local-connection state to LaptopIcon plus "Local device" text) becomes directly relevant context. I'll fold this in as an inline comment on the Icons.tsx diff line noting that the new helper doesn't actually unify the mapping, and suggest routing that resolver through it instead. I do want to watch comment volume though—I've already flagged five things across runs, and this overlaps thematically with my earlier note on the LinuxIcon/ContainerIcon divergence, even though it cites a different component. I'll keep it brief and treat it as a secondary, low-weight observation rather than a primary finding. I'll settle on posting one inline comment on Sidebar.tsx:1584 for the tooltip regression, plus a review body summarizing everything. Since this is a concrete regression, the state defaults to failure. A full diff fix isn't self-contained here since it requires threading a prop through to the tooltip across components, so I'll describe the fix in words rather than provide a patch.
18. modify_pr — One finding: the sidebar thread row's environment glyph now disagrees with its own details tooltip, and the non-WSL fallback silently changed from ServerIcon to CloudIcon for every remote thread. See the inline comment on apps/web/src/components/Sidebar.tsx. Context (not blocking, no action required in this PR): getEnvironmentIcon is now the shared owner of the primary / desktop-local / cloud mapping, but apps/web/src/components/settings/ProviderSettingsPanel.tsx (~157/165) still resolves the same isDesktopLocalConnectionTarget state to LaptopIcon + "Local device", so the same environment class remains Tux in the sidebar/toolbar and a laptop in settings. Previously flagged points about the OS assertion and the LegacySidebar ternary/"Local sandbox" wording still stand and are not repeated here.
Agent Credits: 100 credits
Token usage: 24 uncached input · 505,738 cache-read input · 62,349 cache-write input · 12,284 output
Agent Credits may also include non-token charges from external tools such as web research.