Skip to content

fix(next): four webview tests that are red at the tip follow the product again (status glyphs, table widths, warm New Tab, folder cut) - #22519

Closed
teamleaderleo wants to merge 5 commits into
feat-cmux-nextfrom
fix/next-webview-base-reds
Closed

teamleaderleo wants to merge 5 commits into
feat-cmux-nextfrom
fix/next-webview-base-reds

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Four webview browser tests fail at the feat-cmux-next tip, so web / react-apps-check is red on every PR that touches webviews/. In every case the product was changed on purpose or is right, and the test, its fixture or the gallery's stand-in host had fallen behind. Each commit fixes one:

  • status-glyphs (9 of 12 failed). 3207401 removed the talk-bubble wait icon (the wait now uses the attention dot), and 301bd27 redrew the static waiting glyph as a filled circle. The test still expected the bubble. It now expects ["idle","dot","shieldLine","dot","info"]. Colors are checked by state position, so done stays Codex blue and the wait's tint must differ from done's. The wait and done dots must now match in shape exactly. The @2x edge probes now check the circle's edges.
  • markdown-table-obsidian (the resize-width test; the width came back 90 px off). 452cce0 moved column widths into the file's xattr through cmux.markdown.setTableWidths and the config's tableWidths. The gallery's mock markdown host (src/gallery/frame/pages.ts) implemented neither, so a reload lost the width. The mock now stores widths per path in the frame's sessionStorage and returns them in the config, the way the app's xattr store does. The test is unchanged.
  • new-tab-warm-first-frame (4 of 6 failed). 9215b25 made Cards, with 3 recent chats, the default New Tab template. The fixture had 3 sessions, so the device chat that arrives after the handshake never got a card. The fixture now has 2 sessions. The test still checks that the warm open paints exactly one state, and that state is the final one (the sessions plus "Older device chat").
  • composer-location-strip (the 340 px folder cut). The 340 px step caps the folder button at 128 px. The mid-folder fixture, atlas-checkout, measured 124 px in Linux Chromium's Noto Sans, so it never got cut. It fails at the commit that added the test (CmuxNext: composer location strip lines up with the prompt; middle-cut folder, icon-only computer when narrow #20791), and CI only started running it again after ci(web): lint and budget gates no longer skip the webview and sidecar tests #22197 and ci: feat-cmux-next pushes run the web checks and cmux-next checks again #22205. The fixture is now atlas-api-checkout (102.7 px of text in Noto Sans). That cuts at 340 px and shows whole at 341 px in any font from about 17% narrower to 19% wider.

No skips, no loosened tolerances, no product code changes beyond the gallery's dev-only mock host.

Not in this PR, because other open PRs cover them:

Testing

On big-red, with CMUX_BROWSER_TESTS=1 bun test in webviews/ and real Chromium. Each test failed at e9c6f20 and passes at 0142fbf:

  • composer-location-strip: 21 pass, 1 fail before; 22 pass after.
  • markdown-table-obsidian: 3 pass, 1 fail before; 4 pass after.
  • new-tab-warm-first-frame: 2 pass, 4 fail before; 6 pass after.
  • status-glyphs: 3 pass, 9 fail before; 12 pass after.
  • Also run: markdown-wide-table-scroll (5 pass) and bun run check:status-glyphs. vp fmt --check and vp lint pass on the changed files.

Observed / Not run

Observed: the before and after results above.

Not run: the WebKit cases, because WebKit isn't installed on big-red. CI runs them. No Mac run.

Risk

Not UI: test expectations and fixtures, plus the gallery's dev-only stand-in markdown host. Nothing the app ships changes.

Changelog

None (tests only).

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Fixes four webview browser tests that were red at the feat-cmux-next tip, so web / react-apps-check now passes on PRs touching webviews/. Product behavior is unchanged; only test expectations, fixtures, and the gallery's dev-only mock markdown host are updated.

  • status-glyphs: expects the attention dot (not the removed talk bubble) for a wait, and checks colors by state position since wait and done dots now share a shape.
  • markdown-table-obsidian: the gallery mock host now answers cmux.markdown.setTableWidths and returns saved widths as tableWidths (kept in the frame's sessionStorage, forgotten on a null value like the app), so a reload keeps column widths.
  • new-tab-warm-first-frame: the fixture now has two sessions so the device chat gets the third card on the Cards New Tab page; the test still checks that a warm open paints the final state on its first frame.
  • composer-location-strip: the mid-folder fixture is now atlas-api-checkout, which crosses the 128 px folder cap at 340 px in both Linux Noto Sans and macOS SF Pro.

No skips, no loosened tolerances, and no shipped code changes.

Written for commit 960b872. Summary will update on new commits.

View guided diff Turn on auto-fix

teamleaderleo and others added 4 commits October 20, 2026 04:37
3207401 dropped the talk bubble from the Codex-like set (a wait is now
the set's one dot in the attention tint) and 301bd27 redrew the static
waiting glyph as that dot. The test still expected the bubble: the Codex
order, the waiting grey, and the bubble's 2x edge probes.

Expect the dot for a wait, check done's blue and the wait's tint by state
(both dots share one shape, so they must differ in color), keep the error
red apart from the permission grey, and probe the dot's top and left
edges at 2x.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cross a reload

452cce0 moved table column widths from the page's localStorage to the
host (cmux.markdown.setTableWidths, sent back as the config's tableWidths).
The gallery's mock markdown host had neither, so with a host client the page
sent its widths nowhere and a reload laid the table out at natural widths:
markdown-table-obsidian "the width stays across a reload" got 90 px off.

The gallery host now answers setTableWidths and returns the saved value as
tableWidths, keeping it in the frame's sessionStorage as the app keeps it in
the file's extended attribute.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cards became the unset New Tab template in 9215b25 and shows three chat
cards, sessions first. The fixture listed three sessions, so the device
chat the host pushes after the handshake never had a card and the four
warm openings failed on "Older device chat". The fixture now has two
sessions, so the third card is the device chat and the test still checks
that every warm opening paints the final list, device chat included, on
its first frame.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nux fonts too

The 340 px step caps the folder button at 128 px. The mid-folder fixture,
"atlas-checkout", draws a 124 px button in Noto Sans (system-ui on Linux
CI), so it never cut there and the 340 px test has failed on Linux since
#20791 added it. It went unseen until #22197 and #22205 made CI run the
webview tests again. The fixture is now "atlas-api-checkout": past the cap
and inside the 341 px pane with room both ways in either system font.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 960b872: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr22519 -f ref=fix/next-webview-base-reds -f platform=macos -f backend_mode=local

Unclear: web / react-apps-check failed: no known signature; failed step: Check webview test shards.

CI failed on 960b87210a (run 39418089333 attempt 1): 4 code, 1 unknown.

Job Verdict Why
web / react-apps-check (1) code a web test failed
web / react-apps-check (3) code a web test failed
web / react-apps-check (4) code a web test failed
web / react-apps-check (2) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs composer-type-scale.test.ts agent-pane.composer model-menu-starred draws its text on the type scale: failed (job)
  • seen on other PRs markdown-table-keys.test.ts markdown table keys > Cmd-A selects the cell's text, then the whole table, then lets the document ta...: failed (job)
  • seen on other PRs markdown-selection-drag.test.ts markdown selection (chromium) > Cmd-A selects the document and reveals no syntax: failed (job)
  • seen on other PRs markdown-selection-drag.test.ts markdown selection (webkit) > Cmd-A selects the document and reveals no syntax: failed (job)
  • seen on other PRs settings-scroll.test.ts webkit > scrolling Appearance top to bottom: one scroller, no row removed or moved: failed (job)
  • seen on other PRs strings.test.ts every key the page uses exists in all 21 locales: failed (job)
  • seen on other PRs check-layers.test.ts check-layers > this checkout passes with its baseline: failed (job)
  • seen on other PRs whats-new-text-selection.test.ts chromium > the Updated card's changes select with a drag and a double-click, and fire nothing: failed (job)
  • seen on other PRs whats-new-text-selection.test.ts chromium > in a sidebar-wide card a long change wraps to two lines, never cut on one: failed (job)
  • seen on other PRs whats-new-text-selection.test.ts webkit > the Updated card's changes select with a drag and a double-click, and fire nothing: failed (job)
  • ... 3 more in the job logs
Matched log lines
web / react-apps-check (1): (fail) agent-pane.composer model-menu-starred draws its text on the type scale [1662.53ms]
web / react-apps-check (3): (fail) markdown selection (chromium) > Cmd-A selects the document and reveals no syntax [1694.68ms]
web / react-apps-check (4): (fail) every key the page uses exists in all 21 locales [12.24ms]
web / react-apps-check (2): (fail) every page row has exactly one home [0.94ms]

Not re-run automatically: web / react-apps-check (1), web / react-apps-check (3), web / react-apps-check (4), web / react-apps-check (2), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: red check: Tier routing (+4 more) is not red on the base cff72bf; do not merge until green; see lane-rules
red: web / Web status; NEW: green on the base cff72bf; do not merge until green; see lane-rules
red: web / react-apps-check; no finished base run on cff72bf to compare; do not merge until green; see lane-rules
red: web / react-apps-check (1); no finished base run on cff72bf to compare; do not merge until green; see lane-rules
red: web / react-apps-check (2); no finished base run on cff72bf to compare; do not merge until green; see lane-rules
red: web / react-apps-check (3); no finished base run on cff72bf to compare; do not merge until green; see lane-rules
red: web / react-apps-check (4); no finished base run on cff72bf to compare; do not merge until green; see lane-rules

CI fast guards failed on 960b87210a (https://github.com/manaflow-ai/cmux/actions/runs/39418089333). It does not block the merge; a red guard merged into main breaks it for every open PR.
The log named no failed step; see the run.

Agents: python3 scripts/ci/guard_attribution.py fix applies the mechanical fixes locally.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-ms9au created for this PR by the cmux coordinator.

@blacksmith-sh

blacksmith-sh Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Found 25 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp6xoldrjn/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpof932sns/summary-missing.json (live):/summary-missing.json (live): View Logs
convention violations found (ERROR lines above)./
convention violations found (ERROR lines above).
View Logs
src/pages/settings/categories.test.ts/categories.test View Logs
src/pages/settings/categories.test.ts/categories.test View Logs
src/pages/settings/strings.test.ts/strings.test View Logs
src/pages/settings/strings.test.ts/strings.test View Logs
test/agent-pane-no-capsules.test.ts/agent-pane-no-capsules.test View Logs
test/agent-pane-no-capsules.test.ts/agent-pane-no-capsules.test View Logs
test/check-layers.test.ts/check-layers.test View Logs

...and 15 more test failures. View all on Blacksmith: run 39427681107, run 39418074751

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

…ng value too, like the app

Review follow-up on #22519: FilePageProvider+TableWidths.swift treats a
missing value as a forget; the mock now does the same instead of storing
the string "undefined".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent, correctness first): SHIP at 960b872

The subagent reviewed 0142fbf and checked each claim against its cited commit. The talk-bubble removal (3207401, 301bd27), table widths in the xattr (452cce0), the Cards default with recent: 3 (9215b25) and the 128 px folder cap at 340 px all hold. It found no assertion weakened: the waiting/done dot pair must now match exactly (stricter than before), the warm open must still paint exactly one state containing the late device chat, and the strip's 340/341 pair is unchanged. 960b872 applies its one suggestion: the mock host now forgets a width on a missing value as well as null (== null), matching FilePageProvider+TableWidths.swift. markdown-table-obsidian still passes, 4 of 4, on big-red. Non-blocking: status-glyphs could also assert that the wait's tint is the warning color, not only that it differs from done's.

@teamleaderleo teamleaderleo added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 20, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / defaults-snapshot is red on 20 of 20 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo teamleaderleo removed the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 20, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Unlabelled, because #22513 (combined web reds) covers status-glyphs and new-tab-warm-first-frame. CI also passes composer-location-strip without this PR's fixture change; it only fails under big-red's fonts.

One part here still matters. #22513's gallery-host fix for markdown-table-obsidian keeps the widths in localStorage, and on #22513 that test still fails in chromium (job 118627855019: Received 90). This PR's version uses the frame's sessionStorage and treats a missing value as a forget, and it passes in both engines in CI (job 118612540136) and on big-red. If #22513 takes the sessionStorage version, this PR can close.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Closing: #22513 covers status-glyphs, new-tab-warm-first-frame and the gallery host's table widths. The obsidian CI failure there was a reload racing the width write, fixed in #22513 by waiting for the write. composer-location-strip passes in CI's fonts, so its fixture change isn't needed to unblock anything.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant