cmux-next: strict page strings on every PR, no export deadlock on a stale schema, and the schema's two web reds
Tip app builds were broken from 12:42Z to 13:27Z on 10-20, and are fine at the current tip. From 6902095664e (the push after the layout.focusPaneOnScroll rename) to 12286201804, every web bundle build of feat-cmux-next failed in strict gen-strings.mjs with settings: 63 strings missing. Every app build runs that step first. cmux-next web bundle publish failed on all 7 pushes in that window (first failure 39424353789, last 39429311428), and passed again at 12286201804 and 3d7f4872c1. nightly-next didn't ship a broken app: it skips commits whose strings are stale, and its last builds (399fe63234, 359e196638) predate the rename. They failed for an unrelated reason, Verify third-party notices (cnx-hostd and cmux-remote-browser-host aren't in the bundle map). At e775c2af222, strict gen-strings.mjs, defaults_guard.py check-fresh and gen-settings-sources.py --check all pass. defaults-snapshot is still red, but only on check-menu-actions.py, which this PR doesn't touch.
12286201804 (a Mac regeneration) has already refreshed the stale schema. No strings were actually missing: the catalogs already had settings.layout.focusFollowsMouse* in all 21 locales, and the schema still named the old keys. This PR fixes the two gaps that let that turn into a deadlock.
-
Nothing failed where the rename landed. Strict string generation only runs in webviews/ tests (path-filtered) and in bundle builds. So the first red showed up on every later push and on every webviews/ PR.
cmux-next guardsnow has apage-stringsjob that runsnode webviews/scripts/pages/gen-strings.mjsstrict on every PR and push, with no path filter. It needs only node, no install, and takes seconds. -
The job that regenerates the schema couldn't run. The base and PR autofix
action exports (Mac)jobs build the web bundles before they regenerate the settings exports, and that build was strict. A stale schema stopped the very job that would fix it (run 39424689785, job 118634516382). Those two bundle builds now setCMUX_STRINGS_BEST_EFFORT=1, so a missing translation is a warning. Their bundles only build the Swift test host for the exports. Nothing caches or ships them (actions/cache/restoreonly, and they're never uploaded). Shipped, nightly and published builds don't set it and stay strict. -
Two web reds that the regenerated schema caused, which show up on every webviews/ PR (#22513, run 39431672533):
editors.test.tsx"every schema row renders the editor for its kind" failed on four rows.appearance.density,customDensityandcustomDensities: the density card draws these and SectionView hides their rows, but the test didn't know that.browser.siteEngines: it's astring_map. The page has no editor for that kind, so it drew a title with no control. SectionView and search now leave out everystring_maprow, the same way they already left outappearance.themeEdits. Site Engines is still edited in cmux.json, and a page editor for it is a separate follow-up.
settings-scroll.test.ts"WebKit: scrolling Appearance top to bottom": WebKit scrolls about 110px per 120px wheel step, so the 80-step cap stopped 4px short of the now 8839px-tall page (8835 vs 8839). The cap is now 200, and the loop still stops at the end.
-
A third settings red that showed up at the tip while this PR was open: categories.test "every page row has exactly one home" failed for the eleven
ui.animations.*Motion rows from f35023e54c1c. Their group,settings.group.motion, was never placed inSettingsPageLayout, so once the schema was regenerated (6d0c5e5a1dbd) those rows had no home on the page. d1973b08863 adds the group to Appearance, after Density and Motion. The PR autofix regenerated the schema (455f7bd70c7), and itsaction exports (Mac)job ran with the best-effort bundle build. -
The comment card's shadow (66e02b9b17b): 7cca3d350f8d gave
.cmux-comment-carda blurred shadow of its own, which turnedsubtle-elevation.test.tsred on every webviews/ PR. The card is a popover, so it now uses--cmux-md-popover-shadow(--elevation-2).
Waiting on #22572. The regenerated schema for item 4 needs the PR autofix's Mac export. That export builds the test targets, and they don't compile at the base: TransferProgressGateTests.swift, from #22455. Run 39484271119 hit that and regenerated nothing. #22572 fixes it, and after it lands, a base merge here lets the autofix regenerate. Until then defaults-snapshot check-fresh and categories.test stay red on this PR.
#22513 was merged in earlier. #22516 has since landed the same base web fixes, so this branch takes the base's versions of #22513's files and no longer carries it.
gen-strings.mjs reads the env var as --best-effort for writes. --check now exits 1 on any difference even under best effort, so the env var can't make a check pass. No caller combines --best-effort with --check.
Verification
At 2c661dec960b, with this PR's generator:
node webviews/scripts/pages/gen-strings.mjs(the new guard's command) exits 1 withsettings: 63 strings missing, so the guard would have been red on the rename.- With
CMUX_STRINGS_BEST_EFFORT=1it exits 0, so the export job would have reached the regeneration. - With
CMUX_STRINGS_BEST_EFFORT=1 ... --checkit exits 1.
At e775c2af222 (tip), strict and --check both exit 0. actionlint is clean on the three workflows.
On big-red, at 455f7bd70c7 (which includes #22513), every settings test file passes on its own and settings-scroll passes on Chromium. Earlier, with this branch merged into #22513's head 0ed403144e:
- Every
webviews/src/pages/settings/*.test.*file passes when run on its own. Before the fix,editors.test.tsxfailed with exactly the four rows above. settings-scroll.test.tspasses on Chromium (CMUX_BROWSER_TESTS=1).- WebKit can't launch on big-red (missing host libraries), so this PR's
web / react-apps-checkrun is the WebKit evidence. vp fmt --checkandvp lintare clean on the changed files.
Observed / Not run
Observed: the commands above, plus the run history cited at the top. Not run: WebKit locally (CI covers it). Also not run: the autofix Mac export job with the env var set. It runs after this lands, on the next push that changes settings or actions.
Risk
risk:normal. CI workflows and a build script; no release, signing, publish or nightly file. Rollback is a revert: the guard is a new job, and the export jobs go back to strict.
Related: #22541 (another session) hand-edits the same schema entry. 12286201804 has since replaced that edit with a regenerated schema. No conflict with #22518 (Swift test files only).
Changelog
none
🤖 Generated with Claude Code