fix(perf): measure transcript scroll coverage and missed refresh slots
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.
| Metric | Before | After | Delta | Harness or run link |
|---|---|---|---|---|
| Fast-fling painted blank frames/time, 3000 rows | not recorded | 1 frame / 16 ms in each of 2 rounds | newly observable | coverage run |
| Long-scroll / wheel painted blank frames | not recorded | 0 in both rounds | newly observable | same coverage run |
| Fast-fling React p95, timing pass | no comparable old-harness value | 74 / 68 ms | no speedup claimed | timing run |
| Fast-fling frame p95, timing pass | no comparable old-harness value | 100 / 98 ms | no speedup claimed | same 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