fix(perf): measure transcript scroll coverage and missed refresh slots

Merged
TE
3d ago
+412-42

The transcript-scroll workflow currently measures pane operations, while the web wheel benchmark reports blank frames as zero and treats intervals over 25 ms as dropped frames. Route the native part to the ACP benchmark with raw results and measure missed refresh slots against a configurable nominal rate (120 Hz by default).

Leo's report: ā€œi feel like the app is slow on scrolling thru stuff... claude desktop is 120hz or something and ours is wack + it has sometimes not even rendered stuff!?ā€

The existing web benchmark gains a 15-second traversal and an optional post-paint DOM coverage pass (CMUX_SCROLL_COVERAGE=1). Coverage records blank frames/time and uncovered pixels; the normal timing pass excludes rectangle reads. Both paths reject missing samples or movement, and fling rejects truncated samples. The sampler stops explicitly or at its deadline. Seven unit cases cover geometry, intentional trailing room, duration attribution and cleanup.

This changes measurement only. Headless frame intervals are diagnostic, not proof of native 120 Hz presentation. Native row count/gesture shape and sidebar blank coverage still need extension. Consecutive rendered row spacing is treated as intentional, matching the existing fling oracle. Prior art: #31320, #32170, #31760, #31754 and #27365; their product behavior is unchanged.

Claude Opus 5.5 medium reviewed final head a567667a8f6f55c580f494a38eeec9554108c88e: SHIP. Final fleet validation passed the test-root guard, all seven coverage tests, formatting, lint, typecheck, protocol check, and the separate coverage benchmark. The initial tooling failure was our test outside the typed test roots; relocating it to test/ fixed that failure.

Performance

This is a measurement correction, so the following are baselines rather than a product before/after speedup. Headless timing and instrumented coverage run separately. The native baseline measures CEF on a 120 Hz virtual display; it is not a WebKit receipt.

MetricBeforeAfterDeltaHarness or run link
Fast-fling painted blank frames/time, 3000 rowsnot recorded1 frame / 16 ms in each of 2 roundsnewly observablecoverage run
Long-scroll / wheel painted blank framesnot recorded0 in both roundsnewly observablesame coverage run
Fast-fling React p95, timing passno comparable old-harness value74 / 68 msno speedup claimedtiming run
Fast-fling frame p95, timing passno comparable old-harness value100 / 98 msno speedup claimedsame timing run

Native baseline: CEF fling p95 58.3 ms, max 58.4 ms, 294 missed slots across 68 drawn frames (4998 rows); sidebar at 3000 rows p95 8.33 ms. This does not prove zero native blank frames or nightly acceptance. Filtered-suite budget rows were missing and are not cited.

šŸ¤– Generated with Codex

Agent session: agent session