fix(web): align un-settle banner action - #9033
UI Consistency: All clear
All clear
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.
🔍 Agent activity — 13 tool calls
💭 The diff already includes the fix I suggested—min-h-4 self-start on the icon matches exactly, and the translate-y-2 issue on ChatView is gone entirely. Both my findings seem addressed, so now I want to check the ComposerBanner primitives to confirm Icon merges className properly and Content uses flex-col items-start gap-0.
1. browse_code — apps/web/src/components/**/ComposerBanner*
2. git_tools — e86604d..8a0e347
3. browse_code — apps/web/src/components/chat/ComposerBanner.tsx
💭 I'm checking whether making the icon's min-height 16px with self-start aligns it properly with the title's line height, and considering switching Content to a column layout with items-start so its children stack instead of centering horizontally. For Actions, since Row is items-center, the vertical centering happens against the whole taller content block rather than a single line, which matches what's expected. In the wrapped flex-wrap layout at narrower widths, I'm verifying the icon's self-start behavior still holds and Content's min-height still applies correctly when the container switches to flex. I'm also checking whether the description text, previously separated in its own row with its own min-height and muted styling, still lines up correctly now that it's a span inside the content block—it should retain the same visual indentation since the grid column structure is preserved. And I want to confirm that dropping font-medium from the content wrapper doesn't matter since the title span carries it directly. Now I'm going to look through ComposerBannerStack's other usages to check if any consumer relies on the old two-row DOM structure for descriptions, and search for tests that might assert against that layout.
4. browse_code — apps/web/src/components/chat/ComposerBannerStack.tsx
5. git_tools — composer-banner-content|ComposerBannerStack|composer-banner-icon
💭 I should check consumers passing description with children or long descriptions, and see if any item uses both description and children together, since the description previously rendered inside the children grid but now sits in the header row. I'll look at ChatView.tsx and ChatComposer.tsx for items using description.
6. git_tools — description:
💭 I'm checking the version-mismatch banner where the title is a Tooltip element, confirming that wrapping it in a span with font-medium styling works fine, then scanning for other banner items that might have both description and children to make sure the same pattern holds. The description text now sits inline within Content rather than as a separate grid row, and I'm verifying the icon alignment stays centered against the 16px title line-height whether the banner is in grid or flex-wrap mode at narrow widths. Checking that vertical spacing feels intentional now that content merges into a single 32px block instead of separate title/description rows, and confirming text wrapping still behaves correctly since flex-start alignment on the column just shrink-wraps children to fit the container width rather than causing overflow. I'm also thinking about whether any Playwright tests target the old description selector structure, so I should search the test files for banner description references to make sure nothing breaks.
7. browse_code — Are there any tests (unit, Playwright e2e, or snapshot) in apps/web or e2e directories that assert on the DOM structure of composer banners — for example expecting the banner description to render inside a separate ComposerBanner.Children row, or selectors like [data-slot=composer-banner-content] / [data-composer-banner-row] counts? List file paths and relevant assertions.
💭 I'm checking ThreadErrorBanner for how it handles icon alignment at the top of multi-line text, since it uses a similar min-height/padding pattern. The suggested
min-h-4 self-startoverride at the call site feels like a minor, acceptable exception to keeping geometry inside the primitive.
8. git_tools — ComposerBanner.Icon
💭 I want to check the ComposerTasksBadge component around lines 160-190 to see how it handles multi-line content and whether it passes styling classes like font-mono to the Icon.
9. browse_code — apps/web/src/components/chat/ComposerTasksBadge.tsx
💭 The two-line variant reshapes the primitive using call-site classes, but since there's only one call site, that doesn't violate the guidance about repeated patterns needing a named primitive — this matches the fix I already proposed. I'm now checking if there's anything else that still counts as a concrete violation. Looking at narrow layout behavior, in the flex-wrap mode at small widths, Content and Icon get their own sizing rules while actions wrap below if needed — that seems fine. I want to check one more subtlety: whether any consumer passes both description and children together, since previously the description sat inside the children grid but now lives in the header, so I'm searching ChatView for banner items with children to verify nothing breaks.
10. git_tools — ^ children:
💭 I'm wondering if any banner items actually pass children, so I want to search ChatView and ChatComposer for children definitions within those banner item objects.
11. git_tools — children:
💭 Since no consumers pass
childrento banner items, that path seems effectively dead but still retained. I'm double-checking whether item descriptions could be multi-element nodes rather than strings, then looking at ChatComposer's bannerItems to see if any construct descriptions with longer content alongside a ComposerBanner. Body pattern relying on indentation — that shouldn't matter functionally. The remaining concern is whether the version-mismatch item's title, a Tooltip trigger wrapped in a span, still behaves correctly now that it sits inside an extra wrapper rather than being a direct flex child with gap spacing, so I want to check lines 2280-2330 to confirm nothing breaks there.
12. browse_code — apps/web/src/components/ChatView.tsx
💭 That looks good. Now I want to check ChatView around lines 4912-4990 for the parked banner with the un-settle button, confirming the translate-y-2 was removed and nothing else looks off.
13. browse_code — apps/web/src/components/ChatView.tsx
💭 Good, the translate-y-2 change is gone since the diff no longer touches ChatView at all, so both prior findings are addressed with nothing remaining. I have an unresolved thread on ComposerBannerStack.tsx:284, but since I lack node IDs to resolve it and the fix was already applied, I'll leave it as is rather than take unnecessary action. Given there are no findings, the instructions want the final response to simply be "All clear," but I still need to fit that into the required JSON schema. I'll set the state to success and put "All clear" as both the title and summary to satisfy both requirements.
Agent Credits: 264 credits
Token usage: 44 uncached input · 1,505,888 cache-read input · 222,382 cache-write input · 14,529 output
Agent Credits may also include non-token charges from external tools such as web research.