···11-- [ ] Precompute `to` element matching hints (`id`, `name`, `href`, `src`) in `visitChildNodes` to reduce repeated `getAttribute` calls.
22-- [ ] Split candidate pools by `localName` once (small `Map<string, number[]>`) so matching passes scan fewer candidates.
33-- [ ] Cache `candidate` element attribute hints (`name`/`href`/`src`) for heuristic matching instead of reading per comparison.
44-- [ ] Add an early fast path for identical child list lengths + stable id order to skip some matching passes.
55-- [ ] Reuse scratch arrays/typed arrays in `Morph` (size-grow strategy) to reduce per-call allocations in hot paths.
66-- [ ] Reduce `nodeListToArray` churn by using a shared reusable buffer for child snapshots when safe.
77-- [ ] Try replacing `Map<string, number[]>` for exact-id matches with a compact struct for the common single-index case.
88-- [ ] Add a narrow fast path for text-only child updates before running full child diff.
99-- [x] Benchmark preserving dirty form controls separately for text inputs vs checkboxes to target real bottlenecks.
1010-- [ ] Consider skipping LIS when match order is already monotonic (cheap monotonicity check first).
1111-- [x] Add a benchmark case for deep nested id-set trees (many ancestors per id) to pressure `#mapIdSets`/`#mapIdArrays`.
1212-- [x] Add a benchmark flag preset (`--repeats 3 --thorough`) helper script to standardize decision runs.