docs/solutions/logic-errors/2026-04-04-editor-benchmark-viewers-must-keep-live-and-snapshot-rows-separate.md
The standalone editor benchmark app tried to "prefer live rows" by mapping live results onto the frozen snapshot table with row-id replacement.
That was wrong.
The frozen snapshot rows used ids like mixed-core-mount.
The live contract rows used ids like 01_ready-empty and 10_type-middle.
Those are different benchmark registries, not two copies of the same row set.
The result was predictable garbage:
At the same time, the first Playwright runner used Promise.race(...) timeouts
around page.evaluate(...) without isolating lanes.
When one benchmark timed out, the underlying page evaluation kept running and
poisoned the rest of that target run.
Promise.race cancels page.evaluatewaitForRender() after setState(...), a fast render
can beat the waiter registration and hang the benchmark forever10k rich-markdown lanes may need one honest sample instead of five
fake timeoutsFor benchmark tooling:
If the viewer "prefers live rows" by id-mapping two different registries, or
the runner times out a page.evaluate without closing that page, the benchmark
tooling is lying.