fix(web): soften the collapsed composer banner shadow#22840

closed8
main
fix/issue-22819
opened12d agobyJJulius Marminge
View on GitHubTwo-way sync enabledPR last imported 1d ago

Problem

The collapsed Goal and Tasks banners darken the composer after f26ee08 replaced their 6% peek shadow with shadow-md. Restores the exact prior value as --shadow-composer-peek, used by ComposerBanner.Peek.

Change

Fixes #22819. No redesign; neighbouring composer and attached/floating banner shadows remain unchanged.

Scope and approval

Fixes #22819

Triaged bug via the automated issue flow.

Verification

Evidence captured per EVIDENCE.md: stills with two diff images for the resting banner states and a narrated before/after recording for the collapse/expand transition. Compared before 96f09c6558 with after 8c8993a824. All 7/7 rows of the sized matrix captured; capture index; proof audit: SUFFICIENT; an independent real-client rebuild matched the indexed after still with zero changed pixels.

Real app with identical copied projection fixtures: active Goal, three Tasks with one complete, empty blurred composer, tasks drawer closed, matching conversation scroll. Narrow captures confirm data-chat-composer-mobile-collapsed="true"; "expanded" below refers to the notice stack. Each server used its worktree's isolated .t3.

Environment E for every capture: Linux x86_64, Chrome 154, desktop user agent, DPR 2, 16px root font, stock appearance, glass opacity 80%, supported backdrop-filter, no touch emulation. Clock fixed to 2026-10-21T20:30:00Z. Whole surfaces: 1440×900 CSS → 1280×800 PNG, 390×844 CSS → 780×1688 PNG. Recordings retain 2880×1800. Sidebar and thread-details panel closed.

Diff0: every maximum RGB-channel delta >0/255, amplified to orange. DiffT: delta >16/255. Comparison uses the saved images without registration, filtering, or ignored regions.

Row 7: collapse/expand transition, 1440×900, light, environment E, 2880×1800 MP4. Same script on both revisions: rest two seconds; focus "Show other notices" and press Enter; wait two seconds; press Escape; move pointer outside and blur; let collapse settle. Encoded timestamps, before / after: 0:00 collapsed rest; 0:02.72 / 0:02.72 keyboard focus; 0:02.84 / 0:02.85 expansion begins; 0:03.15 / 0:03.01 Goal revealed and settled; 0:04.72 / 0:04.72 collapse begins; 0:05.28 / 0:05.17 blurred collapsed rest. Recorder startup adds about 0.6 s to scripted timing. Both clips contain settled endpoints.

What else changed: no other visible differences in the six final still pairs. All changed pixels surround the collapsed peek shadow; both expanded controls have zero changed pixels. The front banner, composer, content, borders and layout match. The runtime diff swaps the Peek shadow utility and adds the 6% shadow token.

Out of scope: custom themes, urgent borders and backdrop-filter fallback share the unconditional shadow and unchanged surface logic. Remaining expanded combinations use unchanged shadows and are represented by two controls. Focused narrow editors and zero/one-banner stacks add no changed shadow path. Desktop shell shares this component; native mobile uses separate code; connection modes do not select different shadow code. Hover handlers and styles are unchanged, so no separate hover recording is required.

Capture: Codex gpt-6.1-sol; proof audit: Claude Opus 5.5.

Model: GPT-6.1-Sol. Harness: Codex through T3 Code.

Checks

23 successful · 12 skipped
All checks passed
8c8993a

Added 6 commits

  • test(web): add the banner shadow takeover fixture8c8454d
  • fix(web): restore the subtle collapsed banner shadow93ffc03
  • test(web): make the banner capture fixture repeatable8214b4a
  • test(web): use synthetic text in banner fixture history2896072
  • test(web): cover warning and error peek capture fixtures65ff22f
  • test(web): isolate the banner capture harness from the app34c85fc
Synced from GitHub

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire5.0 KiB5.0 KiB0 B (0.0%)6.8 KiB✅
CodexThread snapshot wire3.8 KiB3.8 KiB0 B (0.0%)4.9 KiB✅
CodexLive turn WebSocket wire1.2 KiB1.2 KiB0 B (0.0%)2.0 KiB✅
CodexLive turn WebSocket decoded20.9 KiB20.9 KiB0 B (0.0%)29.3 KiB✅
CodexLive turn messages220 (0.0%)8✅
ClaudeTotal thread wire5.0 KiB5.0 KiB−7 B (−0.1%)6.8 KiB✅
ClaudeThread snapshot wire3.8 KiB3.8 KiB0 B (0.0%)4.9 KiB✅
ClaudeLive turn WebSocket wire1.2 KiB1.2 KiB−7 B (−0.6%)2.0 KiB✅
ClaudeLive turn WebSocket decoded21.2 KiB21.2 KiB0 B (0.0%)29.3 KiB✅
ClaudeLive turn messages220 (0.0%)8✅

Baseline: 96f09c6 · PR result: 8c8993a · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Added 2 commits

  • chore: register composer evidence harness entryee92537
  • chore: constrain composer fixture to its worktree8c8993a

Note

🤖 GPT-6.1 Terra [1m] responding on behalf of Theo

Closing because the merged composer fix removed the collapsed Peek shadow that caused the reported dark band. #25329 #22819