Skip to content

fix(webviews): seven react-apps-check base reds (WebKit table drag, empty rows, dev host trust, four stale tests) - #27794

Merged
teamleaderleo merged 4 commits into
feat-cmux-nextfrom
fix/webred-markdown-1029
Oct 30, 2026
Merged

teamleaderleo merged 4 commits into
feat-cmux-nextfrom
fix/webred-markdown-1029

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Base red: cmux-next web / web / react-apps-check ("Test webviews") has been red on feat-cmux-next since 2026-10-29 ~02:14Z, and it hides signal for every webviews merge. This fixes seven of its failing tests. Each one fails the same way twice, and again when retried alone.

Test What broke Cause Fix
test/markdown-table-obsidian.test.ts (webkit) "a drag across cells selects text…" In WebKit a drag from Ada to Navy selected only "Ada" a0a0b1d (tables select text, pushed to feat-cmux-next) let the native drag go on, but prosemirror-tables' normalizeSelection still cuts a text selection whose head lands on the next cell's start ($to.parentOffset === 0) down to the first cell's text. Chromium waits for mouseup before it writes the editor's selection back to the page (selectionToDOM's chrome && mouseDown delay). WebKit writes it right away, so the drag stays stuck on the first cell. Code. While the primary button is down after a press in a cell, tableTextSelectPlugin drops that normalization: a selection-only transaction with no pointer meta that narrows a cross-cell text selection to its first cell's text, or to a caret. The press ends on mouseup or dragstart, on the window's own blur, or on a mousemove with the button up (a release over another app never reaches the page), and the plugin view's destroy removes its listeners. A key pressed mid-drag (Shift, Cmd) does not end it.
test/transcript-fold-no-blank-space-browser.test.ts A row of only quiet thoughts (a5) was 4px tall instead of 0 #26704 put a .acpmux-row__gap span in every row, so article.acpmux-row:empty never matches any more. A row whose renderer draws nothing gets its padding back. Code. The rule now matches a row whose only child is the gap: article.acpmux-row:not(:has(> :not(.acpmux-row__gap))). Specificity is unchanged at (0,2,1), so it still outranks the row-kind paddings.
MarkdownMath.test.tsx "keeps shell command dollar signs…" The rendered HTML has <wbr/> inside hybrid_<wbr/>ref_… #27277 added break points in long tokens on purpose ("wrap long tokens at separators") Stale test. It strips <wbr/> before reading the text.
test/bare-ref-repo.test.tsx "an agent's message: its own address names…" 0 chips for #24175 #27312 shows another agent's message as one line until it is opened, and only the opened panel renders its Markdown and chips (Leo: "WITH NO WAY TO EXPAND WHAT WAS SAID TO SEE") Stale test. It opens the message (setMessageOpened) before reading the chips.
test/transcript-send-remount.test.tsx reply-1 drew twice on send #27313: a reply that something follows gets its own action row (hasReplyActions). In the fixture the reply was the chat's open end with no footer, so the sent prompt gave it a new action row. That redraw is a real content change. Stale fixture. The turn now ends with its footer, as a finished turn does. The footer owns the reply's actions, so the test's guard still covers both rows.
test/browser/trailing-plates-tool-output.test.ts Opacity read "0" after focus() Reduce Motion still runs every transition for 0.01ms (shared/desktop.css), so the reveal reads 0 in the frame it starts. #27560 passed reducedMotion=1, which removed the 120ms fade but not that 10µs transition. A probe on CI showed transition: 1e-05s with a running opacity animation at time 0, and opacity 1 a moment later. Stale test. It waits for the actions' animations to finish before reading them.
test/chat-open-long.test.ts "a 700-turn chat opened cold on a busy daemon…" The transcript shifted 73px after first content #24144 (a9a7653, bisected: green at its parent c838772). Before the pane's daemon client binds its actions, a trust read reaches the browser dev host (src/dev-host/host.ts), which answered every folder "unknown", and that drew a "Trust cmux?" card. #24144 scoped trust to its route authority, so the client's bind now reads the folder again (acpmux: trusted) and removes the card, and the rows move. Before #24144 the wrong card just stayed. A CI probe showed the dev host's "unknown" at ~3.0s, the authority change at ~3.4s, and acpmux's "trusted" at ~3.9s. Code (dev only). The dev host answers acp.trust.get with native.unsupported, as it does for other host-only calls. readFolderTrust reads that as "can't say" and draws no card, and the client's read after the bind gives acpmux's answer. The shipped app's native host is unchanged.

Verification (cmux-ci, Linux, real Chromium and WebKit)

At this branch's code: the six files above plus test/markdown-selection-drag.test.ts give 60 pass and 0 fail. For the dev host change: chat-open-long (quiet and busy) passes, and so do the trust and dev host suites (dev-host, trust-authority-switch, trust-pending-refusal-button, folder-trust-switch-no-blank, agent-pane-unknown-harness, agent-pane-btw-side-session, agent-pane-peer-chat, agent-pane-background-tasks): 55 pass. The one failure, classic-new-tab-trust "a start refused after a while…", fails the same way on base ("the chat composer is up", line 269) and is another fix's. vp lint is clean, bun run typecheck reports no type errors in 3140 files, and vp fmt --check is clean on the changed files. After the drag cleanup (2788068): the table and selection-drag suites give 32 pass and 0 fail in Chromium and WebKit, and lint, fmt and typecheck are clean.

Review (Codex gpt-6-astra, high, fast): CHANGES at 56ac5e6 (a release that never reached the page left the drag flag set), CHANGES at 11a2424 (keydown ended a drag with Shift held), and SHIP at 2788068.

At base (1dd8704, CI logs) every one of these tests failed, and failed again when retried alone.

Risk: low. One CSS selector in the transcript (same specificity, same intent as before). One ProseMirror filter that applies only while the mouse button is down after a press in a table cell, and only to prosemirror-tables' own normalization of a cross-cell text selection. One dev-only host answer (the browser dev slot, never the shipped app). Everything else is test-only.

Agent session: agent session

🤖 Generated with Claude Code

…y rows, stale tests)

- markdown tables: a drag across cells in WebKit stayed on its first cell.
  prosemirror-tables normalizes a text selection whose head lands at the next
  cell's start to the first cell's text; Chromium waits for the mouseup to write
  the editor's selection to the page, WebKit writes it at once and its drag stops
  there. tableTextSelectPlugin drops that normalization while the button is down.
- transcript: a row whose renderer draws nothing took its padding again
  (`article.acpmux-row:empty` stopped matching once every row holds its
  `.acpmux-row__gap` target, #26704). The rule now matches a row with no child
  but the gap.
- MarkdownMath: the test reads the text without the <wbr> break points #27277 adds.
- bare-ref-repo: another agent's message is one line until opened (#27312); the
  test opens it before reading its chips.
- transcript-send-remount: the fixture's turn ends with its footer, so the reply
  does not gain its own action row on send (#27313), a redraw the test is not about.
- trailing-plates-tool-output: Reduce Motion still runs transitions for 0.01ms;
  the test reads the actions once their reveal has run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ffe9f4bb4afcf68decf6
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
chat-open-long (busy daemon) has been red since #24144. Before the pane's
daemon client binds its actions, a trust read reaches the browser dev host,
which answered every folder "unknown". That drew a "Trust cmux?" card
(73px) over a folder acpmux trusts. Since #24144 scoped trust to its route
authority, the client's bind reads the folder again and the card goes away,
so the transcript shifts. Before #24144 the wrong card just stayed.

The dev host now says it can't answer acp.trust.get (native.unsupported),
as it does for other host-only reads. readFolderTrust treats that as "can't
say" and draws no card, and the client's read after the bind gives acpmux's
real answer. The shipped app's native host is unchanged.

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

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 11a2424: 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=pr27794 -f ref=fix/webred-markdown-1029 -f platform=macos -f backend_mode=local

Stale: these images are of 11a2424; the head is now 2788068 and a new capture is running.

Gallery before/after for 11a2424: 16 states rendered, 0 images differ, 1179 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 41003650323 -R manaflow-ai/cmux -n gallery-advisory-27794-11a24242d4144a4ec5ab801931b7b1d99908b1c1 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.chat-find-bar/empty Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/empty Apple System Colors unchanged 0% own conversation.css
agent-pane.chat-find-bar/matches Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/matches Apple System Colors unchanged 0% own conversation.css
agent-pane.chat-find-bar/next-match Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/next-match Apple System Colors unchanged 0% own conversation.css
agent-pane.chat-find-bar/no-results Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/no-results Apple System Colors unchanged 0% own conversation.css
agent-pane.coderouter-offer/claude-key Apple System Colors Light unchanged 0% own conversation.css
agent-pane.coderouter-offer/claude-key Apple System Colors unchanged 0% own conversation.css
agent-pane.coderouter-offer/deepseek-key Apple System Colors Light unchanged 0% own conversation.css
agent-pane.coderouter-offer/deepseek-key Apple System Colors unchanged 0% own conversation.css
agent-pane.coderouter-offer/sign-in Apple System Colors Light unchanged 0% own conversation.css
agent-pane.coderouter-offer/sign-in Apple System Colors unchanged 0% own conversation.css
agent-pane.coderouter-offer/rate-limited Apple System Colors Light unchanged 0% own conversation.css
agent-pane.coderouter-offer/rate-limited Apple System Colors unchanged 0% own conversation.css
agent-pane.coderouter-offer/on-coderouter Apple System Colors Light unchanged 0% own conversation.css
agent-pane.coderouter-offer/on-coderouter Apple System Colors unchanged 0% own conversation.css
agent-pane.coderouter-offer/moving Apple System Colors Light unchanged 0% own conversation.css
agent-pane.coderouter-offer/moving Apple System Colors unchanged 0% own conversation.css
agent-pane.computer-use-preview/running Apple System Colors Light unchanged 0% own conversation.css
agent-pane.computer-use-preview/running Apple System Colors unchanged 0% own conversation.css
agent-pane.computer-use-preview/done Apple System Colors Light unchanged 0% own conversation.css
agent-pane.computer-use-preview/done Apple System Colors unchanged 0% own conversation.css
agent-pane.computer-use-preview/done-no-icon Apple System Colors Light unchanged 0% own conversation.css
agent-pane.computer-use-preview/done-no-icon Apple System Colors unchanged 0% own conversation.css
agent-pane.computer-use-preview/beside-chat Apple System Colors Light unchanged 0% own conversation.css
agent-pane.computer-use-preview/beside-chat Apple System Colors unchanged 0% own conversation.css
agent-pane.computer-use-preview/beside-inspector Apple System Colors Light unchanged 0% own conversation.css
agent-pane.computer-use-preview/beside-inspector Apple System Colors unchanged 0% own conversation.css
agent-pane.computer-use-preview/under-pushed-inspector Apple System Colors Light unchanged 0% own conversation.css
agent-pane.computer-use-preview/under-pushed-inspector Apple System Colors unchanged 0% own conversation.css

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 6ee25f9 to compare; do not merge until green; see lane-rules

@teamleaderleo teamleaderleo changed the title fix(webviews): six react-apps-check base reds (WebKit table drag, empty rows, four stale tests) fix(webviews): seven react-apps-check base reds (WebKit table drag, empty rows, dev host trust, four stale tests) Oct 30, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Found 9 test failures on Blacksmith runners:

Failures

Test View Logs
--from must install a complete prebuilt tree/
--from must install a complete prebuilt tree
View Logs
/tmp/tmp1byjg65w/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmpuby22h1q/summary-fail.json (live):/summary-fail.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)/
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)
View Logs
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)/
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)
View Logs

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

Review (Codex, #27794): the drag flag ended only on a mouseup or dragstart
the page saw. A button released over another app never reaches the page,
so the flag stayed set, and the filter went on dropping a cross-cell text
selection's narrowing (a keyboard caret move out of it). The window
listeners also outlived an editor destroyed mid-press.

The press now also ends on the window's own blur (not capturing, since the
press's own focus change blurs an element), on a key, and on a mousemove
with the primary button up (as prosemirror-view's own MouseDown does). The
plugin view's destroy removes the listeners, and a new press clears any
earlier one first.

A browser test can't release the button without delivering a mouseup to
the page (Playwright keeps it pressed, and so does prosemirror-view's own
MouseDown), so the case isn't simulated. The existing drag, click and
Shift-click tests cover the paths that must keep working.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review (Codex, delta at 11a2424): Shift or Cmd pressed during a cross-cell
drag leaves the button down, but the capturing keydown listener ended the
press, so WebKit's drag went back to sticking on the first cell. The window's
blur and a mousemove with the primary button up still end a press whose
mouseup never reached the page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo
teamleaderleo merged commit 284e691 into feat-cmux-next Oct 30, 2026
145 of 154 checks passed
@teamleaderleo
teamleaderleo deleted the fix/webred-markdown-1029 branch October 30, 2026 05:13
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 2788068d Deployed Oct 30, 2026 by teamleaderleo via cmux-tui tree preflight #80673
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant