docs/plans/2026-04-07-marks-basic-composition-batch.md
Take a bigger cut at the remaining 48_mount-10k-marks-basic red lane without
another plugin-by-plugin detour.
The remaining marks tax is broad per-leaf runtime overhead in the shared render path, especially:
Object.keys(leaf) / Object.keys(text) on every renderflatMap(...) allocation on every rendersort(...) on every renderThat work happens across tens of thousands of leaf renders in the standalone marks fixtures, so even "small" per-render overhead is now the bill.
pipeRenderLeaf / pipeRenderText tests.Kept.
The useful version is the hybrid activation scan:
That avoids per-render Object.keys(...).flatMap(...).sort(...) churn on
marked leaves without making plain leaves pay the full simple-mark loop.
Focused reruns on the kept path:
48_mount-10k-marks-basic: 1244.70 ms86_mount-10k-bold-basic: 557.20 ms90_mount-10k-bold-single: 399.90 ms91_mount-10k-italic-single: 388.30 ms