cmux-next: harden sidebar motion and workspace journeys
Changelog
Fixed sidebar hover work during scroll/layout realization, preserved New Tab list motion without redundant layout reads, and added workspace settled-content receipts.
Problem
Recent cmux-next regressions made sidebar scrolling and row realization do avoidable hover/layout work, while New Tab list lifecycle changes could lose resize observation or read layout repeatedly. Workspace-switch measurements also had no strict settled-content coherence signal, and the frame-pacing workflow referenced a missing runner wrapper.
Changes
- Suppress hover marquee/layout and stale fade state while sidebar rows are realized during scroll/layout, including workspace, group, and section headers.
- Preserve New Tab FLIP-style motion while avoiding redundant geometry reads; cover root replacement, Strict Mode effect replay, resize, reorder, insertion, reduced motion, and create-action lifecycle paths.
- Add sidebar runtime budget validation and explicit unknown-metric handling.
- Add workspace-switch benchmark/receipt tooling with a narrow strict settled-content coherence gate; skipped, missing, and timed-out GUI capacity remain explicit non-blocking unknowns.
- Repair the frame-pacing workflow wrapper, inputs, dependency sparse checkout, and job wiring.
Validation
bun test test/new-tab-list-motion-render.test.tsx test/new-tab-create-actions.test.tsx— 10 passed, 31 assertions.python3 scripts/cmux-next/tests/test_sidebar_perf_validate.py— 9 passed.python3 scripts/cmux-next/tests/test_workspace_switch_receipt.py— 12 passed.actionlint .github/workflows/cmux-next-frame-pacing.yml— passed.- Python compilation, shell syntax, Swift syntax, and
git diff --check— passed. - Native app compilation/runtime dogfood is being run through the exact-head fleet build after this PR is opened.
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Harden cmux-next sidebar motion during scroll and layout realization, preserve New Tab list motion without redundant geometry reads, add portable performance receipts with a strict content-coherence gate for workspace switches, and arm a retrying cold-tab input hold before the focus transition.
Bug Fixes
- Sidebar rows skip hover marquee, fade, and layout work while rows are realized during scroll or layout projection; queued hover fades defer until the next frame.
- New Tab list motion rereads row geometry only when the list root, row selector, or row keys change; key lists are cached by value signature so unrelated owner renders skip layout reads, and resize observation survives root replacement and Strict Mode effect replays.
- A cold terminal-selection intent arms the input hold before the focus reducer runs and retries the flush as the pane and surface come up, settling only once the terminal view owns the keyboard so early keystrokes aren't lost, while keeping the app size cap exact.
- The
pin-cmux-tuiresolver rejects a publication whosesource.jsonnames a different cmux-tui tree than the candidate revision, so a stale key can't pass the daemon capability check. - The harnesses that measure sidebar performance now keep absent frame and tick metrics unknown instead of reporting them as zero.
Measurement and CI
- Visual motion suites run only when a test window lands on a visible, awake display; hosted runners without one skip instead of fail.
- Added portable receipt validators for sidebar runtime budgets and workspace-switch journeys, where absent metrics stay unknown; workspace-switch receipts cover cold, warm, and explicit-previsit journeys and fail only on settled content-coherence violations.
- The frame-pacing workflow now runs workspace-switch journeys with the workspace driver, and the rescue path routes every attempt after the second to the hosted fallback; the main
cmux-nextworkflow isolates process-global Swift visual suites, and cloud bring-back integration tests no longer wait on cloud move setup.