Skip to content

cmux-next: diff viewer paints big diffs fast and gets the cmux NEXT look - #23154

Merged
teamleaderleo merged 13 commits into
feat-cmux-nextfrom
cmux/diffviewer-fast
Oct 21, 2026
Merged

teamleaderleo merged 13 commits into
feat-cmux-nextfrom
cmux/diffviewer-fast

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

The diff viewer (the chat header's Changes page and every other diff-page.html host) now draws its first rows of a big diff 2.5-5x sooner. It gets the cmux NEXT chrome: a glass toolbar, accent-tinted open menus, a lifted file list and a per-file change bar. Word-level highlights are now on by default.

What was slow

I measured from the moment the host's patch was ready, in headless Chromium on huge-blue. The page was test/browser/diff-virtualization.html, which runs the same mountDiffSurface path as the app. I took a CPU profile for each fixture.

  1. A big file made the stream quadratic. createStreamingPatchFileSplitter appended every 256 KB chunk to its search buffer, and then searched it for the next diff --git. That flattened the whole V8 rope again on each chunk. On a 60 MB generated bundle, nextGitBoundaryIndex alone took 4.4 s before anything drew.
  2. The highlight pool started late. The WorkerPoolContextProvider mounted only with the first files, and each worker then compiles Shiki's WASM (300-450 ms). Until every worker is up, @pierre/diffs draws file headers with no rows.
  3. One long parse task. The first batch parsed on the main thread in one task, so worker replies and the first paint queued behind it.

What changed

  • diff-stream.ts: text that cannot contain a file boundary is held aside. It joins the search buffer only when a diff --git shows up (checked across the chunk seam) or at finish(). Each file is now flattened once. Parsing yields to the event loop every 12 ms through a MessageChannel post. scheduler.yield() measured worse, because its continuation runs ahead of the worker replies.

  • App.tsx / useRenderDiff.ts: the worker pool and the theme registration start as soon as the page knows a diff is coming, not when the first files arrive. The workers boot while the patch streams.

  • WorkerRenderOptionsSync.tsx (drawPlainBeforeWorkers): while the workers boot, the pool gets a Shiki highlighter on the JavaScript regex engine with no grammars. That highlighter draws plain rows in the right theme with no WASM. Once the workers are up they highlight as before. A changed @pierre/diffs that no longer has the field this reads reports unsupported, and the perf test fails on that.

  • Restyle, using existing tokens only (--cmux-accent, --surface-blur, --cmux-hairline, fg/bg mixes; no new literal colors):

    • The toolbar is glass (--surface-blur over a 3% fg lift).
    • The pills and round buttons have a hairline rim, a separate hover, and an accent tint while their menu is open.
    • The files sidebar sits on its own lifted surface, with an accent-tinted selection.
    • Each file header shows a 5-block added/deleted bar next to its counts, in --text-detail.
  • Word diffs default to on (diff.wordDiffs in DiffViewerSettingsSchema.swift and the webview default). They render as word-alt. No Debug toggle: the setting already exists in Settings and in the toolbar's options menu (Word diffs), so turning it off is one click. The settings exports (settings-schema.json, its source stamp, docs/mdm) were regenerated with scripts/cmux-next/regenerate-settings-exports.sh on cmux16, because the PR autofix's Mac job did not regenerate them on recent heads and its push job is skipped. The defaults snapshot is left to the base autofix (bot-only).

  • Review fixes (from an independent review; it also fuzzed the new splitter against the old one, 50,000 cases, no difference):

    • Parse yields share one MessageChannel for the page, with a queue of waiters. A channel per yield stayed alive (a started, connected port is never collected), hundreds per big patch.
    • The plain-rows Shiki instance is disposed once the pool replaces or clears it (the pool's next stats broadcast). Before, the pool overwrote it without disposing it.

Numbers

All numbers are in ms from the patch being ready, on huge-blue, headless Chromium.

Production build (vite build of the harness, best of 3):

fixture first row, before -> after first highlight, before -> after
default: 2,000 files 710 -> 253 788 -> 674
mixed: 2,000 files, every fifth line changed, then a 1,500-line rewrite (~10 MB) 1,181 -> 387 1,360 -> 1,046
huge: one 1,000,000-line bundle (~60 MB) ahead of 50 files 6,185 -> 1,195 6,250 -> 1,350

The new perf test itself (dev server, best of 2): base 7a4b464b375 vs this branch.

fixture first row first highlight first row as a share of the full stream
mixed 1,129 -> 456 1,414 -> 1,086 78% -> 21%
huge 5,896 -> 1,149 5,959 -> 1,366

At 940faca2aad (with the review fixes, word diffs on), the same test on huge-blue: mixed first row 398 ms, first highlight 962 ms, complete 1,505 ms (first row at 26% of the stream); huge first row 1,216 ms, first highlight 1,471 ms.

Streaming the whole of mixed takes slightly longer (about 1.6-1.8 s against 1.3-1.9 s), because parsing now yields so the rows can paint.

Perf test and budget

webviews/test/diff-paint-perf.test.ts is new, uses requireBrowserLane, and is Chromium only. The webviews runner picks it up from the git index; there is no registry for webviews tests. A probe script marks, each frame, the first diff row inside the viewer, the first row with Shiki token colors, and the end of the stream. The test runs each fixture twice, keeps the best run, and asserts:

  • the budgets: mixed row < 1,500 and highlight < 3,300; huge row < 3,500 and highlight < 4,500. They are about 3x this branch's dev-server numbers, which leaves room for a slower CI runner. Base misses the huge ones by 2,400 ms or more.
  • on mixed, that the first row is drawn before 60% of the stream. This check does not depend on machine speed (base 78-86%, this branch 21-34%).
  • that the plain-rows-before-workers path actually ran (drawn), so a @pierre/diffs upgrade cannot silently undo it.

Base fails the test and this branch passes it, on huge-blue.

webviews/test/diff-stat-blocks.test.ts is also new and covers the header bar.

webviews/test/diff-stream-splitter.test.ts is also new. It checks that the splitter returns the same files for every chunking, including a diff --git marker split across chunks. It also checks that a big file comes back once and whole, the no-git-header fallback, and format-patch commit headers.

Gallery

There are new pages.diff variants:

  • word-diff: unified, a config file with changes inside lines
  • word-diff-split
  • big-review: 120 files at 760 px, for the file list and the change bars
  • collapsed-files: a play step that clicks a header to collapse it

The existing variants show the new chrome. To compare: https://cmux-lawrences-mac-mini.tail137216.ts.net:18796/compare/cmux-diffviewer-fast/?entry=pages.diff

No capture: the only native-app change is one default value (diff.wordDiffs in DiffViewerSettingsSchema.swift); everything visible is the webview diff page, shown by the gallery stills below.

Gallery stills from the gallery dev server on huge-blue (Chromium, 1000 px). Base small-split, then this branch:

before: small-split, dark

after: small-split, dark

Word changes inside lines, dark and light (an even +6 -6 split draws two green blocks, two red, one neutral):

after: word-diff, dark

after: word-diff, light

120 files: the file list on its own surface, and the change bar in every header:

after: big-review, dark

A header clicked to collapse its file:

after: collapsed-files, dark

Changelog

  • Changed: big diffs in the diff viewer show their first rows several times sooner, the viewer has the cmux NEXT look (glass toolbar, file list, per-file change bars), and word-level highlights are on by default.

Observed / Not run

Observed:

  • On huge-blue (Linux, Chromium):
    • diff-paint-perf.test.ts, diff-stat-blocks.test.ts and diff-stream-splitter.test.ts pass at 940faca2aad (numbers above).
    • diff-paint-perf.test.ts fails on base 7a4b464b375.
    • diff-virtualization.test.ts passes at 940faca2aad (10/10, Chromium and WebKit). Run in one bun test process right after the perf file it timed out in setup (a cold dev-server warm-up); alone it passes.
    • The production-build measurements above.
    • The gallery screenshots.
  • On cmux16: regenerate-settings-exports.sh for the committed exports; defaults_guard.py check-stamp passes.
  • On cosmic-gray: diff-stream-splitter.test.ts and diff-stat-blocks.test.ts, tsc --noEmit, lint and prepush-gate.py.

Not run:

  • WebKit timing. The perf test is Chromium only; the app's diff page runs in WKWebView, where the same fixes apply but were not timed.
  • The native app and any Swift build. The Swift change is one default value.
  • The full webviews suite.

Agent session: cosmic-gray

🤖 Generated with Claude Code

…cmux NEXT chrome

Measured on huge-blue (headless Chromium, production build of the
virtualization harness, from the patch being ready):

- 2,000 files / 10 MB: first row 1,180-1,330 ms -> 390-510 ms
- one 1,000,000-line file: first row 6,190-6,740 ms -> 1,195-1,260 ms

What was slow and what changed:
- The patch splitter appended every 256 KB chunk to its buffer and searched
  it, flattening the whole rope each time: quadratic inside one big file
  (4.4 s of copying). Text with no file boundary now waits outside the buffer.
- The highlight pool was created with the first files; it now mounts with the
  viewer, so its workers start while the patch streams.
- Rows drew only after every worker compiled Shiki's WASM; the pool now gets
  a JavaScript-engine instance at once and draws plain rows until its colors
  arrive.
- Between batches the parse yields every 12 ms, so the first files' rows and
  worker replies are not held behind a 100 ms parse task.

Look: word changes are on by default (word-alt marks), a hairline rim and an
accent open state on toolbar chips, a translucent toolbar, the files panel on
one lift with an accent selection, and a five-block change bar per file.

A Chromium perf test (diff-paint-perf.test.ts) holds the first row and the
first highlight to a budget; a unit test covers the splitter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by projects-ba on cosmic-gray · session

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by projects-ba on cosmic-gray · session

@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 21, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 19ecab0: 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=pr23154 -f ref=cmux/diffviewer-fast -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 19ecab035c (run 39598170651 attempt 2): 1 code, 1 unknown.
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped.

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

Failures:

  • seen on other PRs agent-pane-stream-jitter.test.ts webkit: a queued prompt sent as the next turn moves the view up only: failed (job)
Matched log lines
web / react-apps-check (3): (fail) webkit: a queued prompt sent as the next turn moves the view up only [5852.92ms]

Not re-run automatically: web / react-apps-check (3), 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: web / Web status; NEW: green on the base 0284c98; do not merge until green; see lane-rules
red: web / react-apps-check; NEW: green on the base 0284c98; do not merge until green; see lane-rules
red: web / react-apps-check (3); NEW: green on the base 0284c98; do not merge until green; see lane-rules

CI fast guards failed on 19ecab035c (https://github.com/manaflow-ai/cmux/actions/runs/39598170651). 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.

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

gh run download 39598170674 -R manaflow-ai/cmux -n gallery-advisory-23154-19ecab035c3681461e81e986a504df38260ff1b2 (then read gallery-review.json)

States
State Theme Status Diff Picked by
diff.find-bar/empty Apple System Colors Light unchanged 0% own styles.css
diff.find-bar/empty Apple System Colors unchanged 0% own styles.css
diff.find-bar/matches Apple System Colors Light unchanged 0% own styles.css
diff.find-bar/matches Apple System Colors unchanged 0% own styles.css
diff.find-bar/next Apple System Colors Light unchanged 0% own styles.css
diff.find-bar/next Apple System Colors unchanged 0% own styles.css
diff.find-bar/previous Apple System Colors Light unchanged 0% own styles.css
diff.find-bar/previous Apple System Colors unchanged 0% own styles.css
diff.find-bar/keyboard Apple System Colors Light unchanged 0% own styles.css
diff.find-bar/keyboard Apple System Colors unchanged 0% own styles.css
diff.find-bar/refocus Apple System Colors Light unchanged 0% own styles.css
diff.find-bar/refocus Apple System Colors unchanged 0% own styles.css
diff.find-bar/no-matches Apple System Colors Light unchanged 0% own styles.css
diff.find-bar/no-matches Apple System Colors unchanged 0% own styles.css
pages.diff/word-diff Apple System Colors Light new 0% own App.tsx
pages.diff/word-diff Apple System Colors new 0% own App.tsx
pages.diff/word-diff-split Apple System Colors Light new 0% own App.tsx
pages.diff/word-diff-split Apple System Colors new 0% own App.tsx
pages.diff/big-review Apple System Colors Light new 0% own App.tsx
pages.diff/big-review Apple System Colors new 0% own App.tsx
pages.diff/collapsed-files Apple System Colors Light new 0% own App.tsx
pages.diff/collapsed-files Apple System Colors new 0% own App.tsx
pages.diff/small-split Apple System Colors Light changed 4.19% own App.tsx
pages.diff/small-split Apple System Colors changed 4.03% own App.tsx
pages.diff/unified Apple System Colors Light changed 4.19% own App.tsx
pages.diff/unified Apple System Colors changed 4.03% own App.tsx
pages.diff/deleted Apple System Colors Light changed 2.16% own App.tsx
pages.diff/deleted Apple System Colors changed 2.14% own App.tsx
pages.diff/many-files Apple System Colors Light changed 3.17% own App.tsx
pages.diff/many-files Apple System Colors changed 3.13% own App.tsx
agent-pane.add-project-panel/environment Apple System Colors Light unchanged 0% names styles.css
agent-pane.add-project-panel/environment Apple System Colors unchanged 0% names styles.css

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

@blacksmith-sh

blacksmith-sh Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Found 2 test failures on Blacksmith runners:

Failures

Test View Logs
test/agent-pane-stream-jitter.test.ts/agent-pane-stream-jitter.test View Logs
test/agent-pane-stream-jitter.test.ts/agent-pane-stream-jitter.test View Logs

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

teamleaderleo and others added 3 commits October 21, 2026 00:49
…t row mid-stream

The mixed fixture also asserts the first row draws before 60% of the stream,
which holds on any machine speed and fails on the old path (78-86%).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
+6 -6 drew two green blocks and three red; ties now drop a block from both
sides and leave a neutral one, as GitHub's bar does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
The settings exports regenerated by the PR autofix (its push job leaves them
in the pr-autofix-patch artifact), applied with scripts/cmux-next/pr-autofix-apply.sh:
diff.wordDiffs now defaults to true. The defaults snapshot stays with the base
autofix (bot-only).

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39566105569
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 21, 2026 08:30 — with GitHub Actions Inactive
The settings exports take the base's copies (GitHub merges them by line and
called the pull request conflicting); the PR autofix regenerates them with this
branch's diff.wordDiffs default on top.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
teamleaderleo and others added 3 commits October 21, 2026 03:04
…highlighter once replaced

Review findings: a MessageChannel per parse yield stayed alive (a started,
connected port is never collected), hundreds per big patch; and the pool
overwrites the plain-rows Shiki instance without disposing it. The yield now
shares one channel with a FIFO of waiters, and the plain highlighter is
disposed on the pool's first stats broadcast after it is replaced or cleared.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
…40faca

scripts/cmux-next/regenerate-settings-exports.sh on cmux16 (the PR autofix's
Mac job did not regenerate them on the last two heads, and its push job is
skipped). The export run's SettingsSchemaExportTests reports a base gap
(notifications.attention.flash keys have no agent policy) and still writes
the exports; defaults_guard.py check-stamp passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
The settings exports take the base's copies; the next commit regenerates
them on this merge with diff.wordDiffs on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
@cursor

cursor Bot commented Oct 21, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

scripts/cmux-next/regenerate-settings-exports.sh on cmux16 at this branch's
merge with feat-cmux-next cca5809. Three base test files that do not
compile there (PageEnginePolicyTests, ChiefAppAcpmuxTests,
BrowserProfileNewTabMenuTests; the exports do not read them) were left out of
that scratch build only. defaults_guard.py check-stamp passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 21, 2026 11:10 — with GitHub Actions Inactive
teamleaderleo and others added 3 commits October 21, 2026 04:13
The settings exports take the base's copies (#23239 regenerated them); the
next commit regenerates them on this merge with diff.wordDiffs on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
The settings exports the PR autofix regenerated on its Mac job (its push job
is skipped; artifact pr-autofix-patch), applied with
scripts/cmux-next/pr-autofix-apply.sh: diff.wordDiffs defaults to true. The
defaults snapshot stays with the base autofix (bot-only).

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39590411725
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 21, 2026 12:15 — with GitHub Actions Inactive
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (independent subagent, claude-opus-5-5): SHIP at 19ecab0

No blocking findings. Checked: streaming parse gives the same files as a whole-patch parse at every chunk size; cancellation drops batches from stale streams; plain rows before workers start can't use the wrong language and leak no worker; word diffs are capped on huge diffs (lines over 1000 chars, plain diffs over 1000 lines); the toolbar blur doesn't change how menus stack; the settings export sha matches.

cmux16, base → head: mixed first row ≈330 → ≈93 ms, huge ≈585 → ≈220 ms. The perf test fails on base, as intended.

Non-blocking:

  • The temporary highlighter takes its themes from the first-mount options, not from the pool's theme setting.
  • A highlighter created after the pool shuts down isn't disposed (garbage collection frees it).
  • Total stream time on mixed is about 15% longer, in exchange for the first row 3.5x sooner.
  • The wordDiffs: true default also applies to the classic app.
  • plans/cmux-next/customization.md:183 still says diff.wordDiffs: bool = false.

Reds at this head are base: PaletteMenuVocabularyTests.swift:74 compile failure (fixed on feat-cmux-next) and the agent-pane-stream-jitter flake in react-apps-check (3).

@teamleaderleo
teamleaderleo merged commit fc82e05 into feat-cmux-next Oct 21, 2026
@teamleaderleo
teamleaderleo deleted the cmux/diffviewer-fast branch October 21, 2026 14:17
@github-actions

Copy link
Copy Markdown
Contributor

Default changes

This pull request changes 1 default at 19ecab035c36 (what everyone gets without configuring anything):

  • setting.diff.wordDiffs: false -> true

Needs a call. It passes only with an approving review on this commit from @lawrencecchen or @austinywang (the call owners in .github/defaults-call-owners.json, never the author). The needs a call label alone does not pass, and a new push needs a new approval.

Merge receipt: merged as fc82e05c2263 with these defaults changed, WITHOUT an approving call owner review on its head.

Regenerate the snapshot with python3 scripts/ci/defaults_guard.py snapshot.

teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…3480)

#23154 added diff-paint-perf with a probe that read layout in a
requestAnimationFrame callback; #23374's frame-read rule (check:browser-lanes)
landed meanwhile, so webviews lint went red on feat-cmux-next for every PR.
The probe now reads in window.cmuxAfterPaint (test/support/paintedFrames.ts)
and marks each milestone at the painted frame's time.


Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…ghlighter uses the pool's themes (#23465)

* test: diff viewer word changes default per host, plain-rows highlighter themes from the pool (red)

The classic viewer (embedded config) should start with word changes off and
cmux NEXT (page host, transport `page`) with them on, NEXT's defaults matching
the exported settings schema. The plain-rows highlighter should load the
pool's own themes and not be handed to a pool shut down while it was built.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray

* cmux-next diff viewer: word changes default on in cmux NEXT only; plain-rows highlighter takes the pool's themes

#23154 turned word changes on in the shared webview default, which also
changed the classic viewer. The default now follows the host: on cmux NEXT's
page host (config transport `page`) the display defaults are the `diff.*`
settings' (DiffViewerSettingsSchema.swift; diff-option-defaults.test.ts holds
them to the exported schema), word changes on; the classic viewer and the dev
server keep word changes off. The virtualization harness seeds word changes on
so diff-paint-perf keeps measuring cmux NEXT's default.

drawPlainBeforeWorkers loaded its themes from the viewer options captured at
first mount; it now reads the pool's (getDiffRenderOptions().theme), the ones
the pool draws plain rows with. A pool terminated while the instance was built
no longer gets it (it is disposed; outcome `stopped`).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray

* test: diff-option-defaults installs the DOM globals @pierre/diffs reads at import

state.ts reaches @pierre/diffs, whose web components module reads
customElements when it loads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d24-cf0a-7373-a03a-75491e4d724a&host=cosmic-gray

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

This branch was previously deployed

4 inactive deployments
ci-routing-agent — 19ecab03 Deployed Oct 21, 2026 by github-actions[bot]
artifacts — 19ecab03 Deployed Oct 21, 2026 by teamleaderleo
sentry-dsyms — 19ecab03 Deployed Oct 21, 2026 by teamleaderleo
cmux-tui-merge-tree — 19ecab03 Deployed Oct 21, 2026 by teamleaderleo
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