Skip to content

Merge branch 'main' into codex/feature-acp-integration

MacroscopeApp / Macroscope - UI Consistency failed Sep 2, 2026 in 10m 28s

UI Consistency: 1 new finding, 2 still open

New finding (posted inline)

  • apps/web/src/components/settings/providerDriverMeta.ts (registration site) / apps/web/src/components/settings/settingsSearch.ts — the new acp driver is a first-class Settings → Providers entry, but the hand-enumerated driver keywords in the providers (L299) and provider-update-checks (L192) search rows were not updated. searchSettings requires every query token to match some field (L507), so typing acp in settings search returns no results while every other shipped driver resolves to its panel.

Findings from the previous run, still unaddressed at this head (not re-posted)

  • apps/web/src/components/settings/SettingsPanels.tsx — textGenerationProviders filters ACP out of the read path, while both updateSettings handlers (resolveAppModelSelectionState(..., serverProviders) at L2569 and L2602) still resolve against the unfiltered list, so a write can persist a textGenerationModelSelection pointing at the ACP instance the panel deliberately hides (that driver installs makeUnsupportedTextGeneration).
  • apps/web/src/components/settings/SourceControlWritingSettings.tsx — the ACP exclusion is hand-rolled here and again in GeneralSettingsPanel, while ProviderSettingsPanel.tsx:493 still resolves the same setting against the unfiltered list. One exported predicate next to resolveAppModelSelectionState would give the rule a single owner.

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

In-scope changed files (apps/web/src/**/*.{ts,tsx,css}): components/chat/providerIconUtils.ts, components/settings/SettingsPanels.tsx, components/settings/SourceControlWritingSettings.tsx, components/settings/providerDriverMeta.ts, session-logic.ts.

Verification performed

  • Confirmed the head commit (39ca2a5) leaves the in-scope web changes identical to the previously reviewed commit (e863970); the two prior findings are still present verbatim (SettingsPanels.tsx L2564-2569 and L2593-2602 still pass serverProviders; ProviderSettingsPanel.tsx:493 still resolves against the unfiltered list).
  • Enumerated every web-side driver-kind registry to check the new acp kind is wired consistently: PROVIDER_CLIENT_DEFINITIONS, PROVIDER_ICON_BY_PROVIDER, PROVIDER_OPTIONS all include it; downstream surfaces (ProviderSettingsPanel PROVIDER_SETTINGS, AddProviderInstanceDialog driver grid, ProviderInstanceCard, ProviderSettingsForm) derive from those and need no per-kind code; model picker/ordering are instance-keyed.
  • Checked no-op / non-findings deliberately not reported: the missing CUSTOM_MODEL_PLACEHOLDER_BY_KIND entry (grok is also absent and AcpSettings.customModels is hidden), the PROVIDER_DISPLAY_NAMES gap in contracts (the ACP snapshot always supplies a displayName, and manual-only maintenance capabilities mean no update advisories reach ProviderUpdateLaunchNotification), and the duplicate ../Icons import lines in providerDriverMeta.ts / providerIconUtils.ts (no duplicate-import lint rule is enabled in the repo's oxlint config, and the pattern already exists in committed code).
  • No Tailwind, CSS, theme-variant, scroll/mask, or environment-routing changes are present in this diff, so those gates do not apply.

The settings-search note is anchored on the in-diff registration line in providerDriverMeta.ts because settingsSearch.ts is not part of this PR's diff and cannot take an inline comment.


🔍 Agent activity — 20 tool calls

💭 I'm noting the commit moved from e863970 to 39ca2a5, and now checking the diff scope to see which web files changed—provider icon utils, settings panels, source control writing settings, provider driver meta, and session logic—to verify whether my previously flagged issues still apply.

1. git_tools — e863970..39ca2a5

2. git_tools — ACPRegistryIcon

💭 The huge diff between those commits is just the merge with main, but the actual PR diff only shows the small ACP change since the merge base moved forward—so the web changes I reviewed earlier are unchanged at head. Let me check whether my two prior findings still hold. I want to verify the current state of SettingsPanels.tsx and SourceControlWritingSettings.tsx directly, particularly whether the onInstanceModelChange handlers still pass serverProviders at their current line numbers.

3. git_tools — resolveAppModelSelectionState

💭 Since the code hasn't changed since the last review, both findings about serverProviders duplication in the write handlers still hold, so I shouldn't repost duplicate comments. I'm noticing AddProviderInstanceDialog.tsx already references the ACPRegistryIcon at head, but that file isn't part of this PR's diff, which makes me question whether that's relevant here. That means it was likely already present at the merge base rather than introduced by this PR. I want to verify whether main already had ACP entries in that file before this diff, so I should check the merge base commit directly to confirm.

4. git_tools — acp — rejected: repo.url: required parameter is missing or empty;repo: required parameter is missing or empty

5. git_tools — acp

💭 I notice the merge base already has an "acpRegistry" driver kind in AddProviderInstanceDialog, but this PR adds a new "acp" driver kind elsewhere without updating that dialog's list—that seems like a UI consistency gap worth checking. I want to look at AddProviderInstanceDialog to understand how users would actually add a new ACP Agent instance.

6. browse_code — apps/web/src/components/settings/AddProviderInstanceDialog.tsx

💭 I notice the ACP Agent gets added to the provider driver definitions, giving it an entry in the Add Provider dialog. But the same ACPRegistryIcon is used both for the "coming soon" ACP Registry item and this new selectable ACP Agent driver, which could be a UI consistency issue worth flagging since two distinct entries in the same picker share an icon. I also notice mobile's ProviderIcon uses a distinct plug icon for acp, while web reuses the ACP Registry icon — a cross-platform inconsistency, though mobile is out of scope here. It's a low-severity ambiguity rather than a hard violation. Now I want to check providerDriverMeta more closely for other inconsistencies, like whether badge labels ("Early Access" vs "new") are used consistently across providers.

7. browse_code — apps/web/src/components/settings/providerDriverMeta.ts

8. browse_code — apps/web/src/session-logic.ts

💭 I notice providerDriverMeta.ts now has two separate import statements from the same "../Icons" module, which is a minor duplicate-import lint nit rather than a real UI consistency issue—worth a small mention but not a major finding. Let me check whether the same pattern shows up in providerIconUtils.ts.

9. browse_code — apps/web/src/components/chat/providerIconUtils.ts

10. browse_code — apps/web/src/components/Icons.tsx

💭 Reusing the ACP wordmark icon for the generic "ACP Agent" driver actually makes sense since it's the protocol's own logo, even though "ACP Registry" shares it in the coming-soon list—not a real issue. I want to check if there are other spots in the web UI where a new driver kind needs to be registered for things to work consistently, so I'm searching the web source for exhaustive pattern matches.

11. git_tools — ProviderDriverKind.make("(cursor|grok|opencode)")

💭 I'm checking whether ACP's customModels field should surface in ProviderModelsSection, since the driver reads customModels via providerModelsFromSettings but the form currently hides that field — I need to see if the section renders based on the presence of customModels per driver.

12. browse_code — apps/web/src/components/settings/ProviderModelsSection.tsx

💭 The placeholder map gap for grok isn't really a finding worth flagging. More important is checking whether the web UI actually reads the sessionModelSwitch: "unsupported" capability from the generic ACP adapter to control the model picker or composer behavior — I should trace where that flag gets consumed in the web code.

13. git_tools — sessionModelSwitch

💭 Confirming the web picker likely already supports arbitrary option descriptors, so that's fine. I'm also checking that pickerSidebarBadge and badgeLabel stay consistent for cursor/grok, both flagged as new and Early Access. Let me also check whether there's anything else a new driver needs in web—setup instructions, auth flows, binaryPath hints, keyboard shortcuts, thread defaults—by searching for exhaustive provider-keyed maps in the web code that enumerate every driver.

14. browse_code — In apps/web/src, list every place that enumerates provider driver kinds (maps, switch statements, arrays, Record types keyed by ProviderDriverKind) used for UI presentation, auth/login flows, provider setup instructions, model picker grouping, or provider labels. For each, say whether the new "acp" driver kind (added in PR #9060 to providerDriverMeta.ts PROVIDER_CLIENT_DEFINITIONS, providerIconUtils.ts, session-logic.ts PROVIDER_OPTIONS) has an entry or is missing and what the fallback rendering would be.

💭 I'm noticing the settings search terms don't include "acp" or "ACP Agent" even though the new provider now appears in the Providers settings panel. It's a marginal gap since the search enumeration wasn't directly touched by this PR, but it's worth flagging as a minor consistency issue. Second, I'm checking whether PROVIDER_DISPLAY_NAMES needs an "acp" entry — the contracts package is technically out of scope, but the display name fallback logic in the snapshot presentation layer seems to already handle this correctly since a display name is always sent, so the banner should render fine without needing that lookup. Now I want to check settingsSearch.ts around lines 189 and 295 to see if providers are listed there as search keywords and whether the convention requires listing each provider individually.

15. browse_code — apps/web/src/components/settings/settingsSearch.ts

💭 I notice the new provider isn't added to the settings search terms, so searching "acp" in Settings would find nothing—a real consistency gap worth flagging, though I need to check whether this falls within the UI Consistency check's actual remit around shared components and Tailwind usage versus being more of a functional completeness issue. Given it's a true, low-effort fix directly caused by the changed behavior rather than unrelated cleanup, I'm leaning toward including it despite the check's narrower stated focus. I also notice both providerIconUtils.ts and providerDriverMeta.ts import from the same Icons path twice on adjacent lines — a small duplicate-import hygiene issue introduced by the changed lines. It's stylistic though, so I want to check whether the lint config would actually flag it before deciding to mention it.

16. browse_code — Does the repo's lint configuration (eslint/oxlint/biome config files at root or apps/web) enable a rule against duplicate imports from the same module (e.g. import/no-duplicates, no-duplicate-imports)? Quote the relevant config.

💭 Skipping the duplicate-import nit since there's no lint rule for it. That leaves settingsSearch.ts missing "acp" as the one worthwhile finding—a genuine, low-severity discoverability gap with a one-line fix, which I'll post as an inline comment on line 299 since that file matches the scoped include patterns. But settingsSearch.ts isn't part of the actual diff, so an inline comment there won't attach properly since GitHub review comments require diff positions—I'd need to post it at the PR level instead, which is noisier and only marginally worth it. More important is that my two prior findings remain unresolved, particularly the read/write asymmetry around persisted selection of an unsupported provider, which is a real behavioral inconsistency justifying a failure state on the check, with the summary restating those open issues rather than duplicating comments. For the new finding, I'm confirming that searching "acp" in settings turns up no results even though a user searching by provider name should land on the Providers row—checking the search token matching logic confirms this gap is real and worth noting concisely in the review body since inline placement isn't possible.

17. browse_code — apps/web/src/components/settings/settingsSearch.ts

💭 I've confirmed the finding, so I'll post the review body now. My final answer should be a failure state with a title and summary listing all three findings—the two previously posted plus this new one—so let me draft that review.

18. modify_pr — apps/web/src/components/settings/settingsSearch.ts — the new ACP Agent driver is now a first-class entry in Settings → Providers (providerDriverMeta.ts PROVIDER_CLIENT_DEFINITIONS), but the settings-search rows that enumerate driver names by hand were not updated, so the provider is unreachable from settings search: - providers (L299): "agents cli codex claude cursor grok opencode instances authentication …" - provider-update-checks (L192): "installed cli versions newer available codex claude cursor grok opencode" searchSettings requires every query token to match some field (L507), and no other item mentions ACP, so typing acp in settings search returns zero results while every other shipped driver resolves to its panel. Suggest adding the driver keywords to both rows, e.g. … grok opencode acp agent client protocol … on the providers row and … grok opencode acp on provider-update-checks. (This file is outside the diff, so the note could not be attached inline.) — not performed: the agent's request was refused before it ran

💭 The review seems to have been filtered since all comments fell outside the configured scope, leaving nothing posted—I should retry with just the body text, or consider posting a plain PR conversation comment instead. Prior runs did successfully post a review body as a top-level PR comment, so that approach seems reliable; let me retry github_pr_review with the body only and comments omitted.

19. modify_pr — apps/web/src/components/settings/settingsSearch.ts — the new ACP Agent driver is now a first-class entry in Settings → Providers (via providerDriverMeta.ts PROVIDER_CLIENT_DEFINITIONS), but the settings-search rows that enumerate driver names by hand were not updated, so the provider is unreachable from settings search: - providers (L299): "agents cli codex claude cursor grok opencode instances authentication …" - provider-update-checks (L192): "installed cli versions newer available codex claude cursor grok opencode" searchSettings requires every query token to match some field (L507) and no other item mentions ACP, so typing acp in settings search returns zero results while every other shipped driver resolves to its panel. Suggest adding the driver keywords to both rows (e.g. … grok opencode acp agent client protocol … and … grok opencode acp). The two findings from the previous run on this branch — the read/write asymmetry in GeneralSettingsPanel's text-generation handlers, and the hand-rolled ACP exclusion duplicated across text-generation call sites — are still open at this head and are not repeated here. — not performed: the agent's request was refused before it ran

💭 The review body seems to be getting filtered too, likely because it's treated as out of scope. Maybe I should instead post an inline comment on an in-scope, in-diff line — like the new ACP definition block in providerDriverMeta.ts, or session-logic.ts, providerIconUtils.ts, or SettingsPanels — to raise the settingsSearch gap there instead. I'll anchor it at providerDriverMeta.ts around line 74, since that's where the ACP definition is registered, and attach the settings-search finding there with side RIGHT.

20. modify_pr — Submitted review with 1 inline comment


Agent Credits: 634 credits

Token usage: 88 uncached input · 4,455,725 cache-read input · 464,369 cache-write input · 36,000 output
Agent Credits may also include non-token charges from external tools such as web research.