docs/plans/2026-04-09-slate-v2-operations-family-deleted-test-closure.md
Close the deleted packages/slate/test/operations/** family with explicit
cluster accounting instead of leaving it as a vague shadow behind
snapshot-contract.ts.
| Cluster id | Deleted count | Status | Current proof owner | Resolution |
|---|---|---|---|---|
operations.move_node | 2 | recovered now | operations-contract.ts | direct proof covers no-op, later-slot destination rebasing, and current selection rebasing on the raw move_node seam |
operations.split_node | 4 | recovered now | operations-contract.ts | direct proof covers text/element behavior plus the *-empty-properties rows |
operations.remove_node | 11 | recovered now | operations-contract.ts | restored as direct family proof and fixed at the core operation seam; snapshot overlap stays incidental, not the owner |
operations.remove_text | 9 | recovered now | operations-contract.ts | restored as direct expanded-selection proof on the raw remove_text seam instead of only surviving inside snapshot |
operations.set_node/remove-omit | 1 | recovered now | operations-contract.ts | direct proof covers omit-to-remove semantics on the current raw set_node seam |
operations.set_node/null-undefined | 2 | explicit skip | none | null/undefined removal sentinels are backwards-compat legacy and not part of the current public claim |
operations.set_selection | 2 | explicit skip | none | custom selection props are outside the current Range contract and are not part of the live public claim |
Totals:
mirrored now: 0recovered now: 27explicit skip: 431remove_node was not just a deleted-fixture nostalgia row. The engine in
core.ts was not
rebasing transaction.selection at all for remove_node.remove_text now has direct expanded-selection proof instead of only a
collapsed cursor case buried in the snapshot suiteset_node omitted-property removal and split_node empty-properties behavior
are now direct raw-operation rows instead of indirect behavioroperations.set_selectioncustom-props.tsxremove.tsxSkip reason:
anchor and focusoperations.set_noderemove-null.tsxremove-undefined.tsxSkip reason:
remove-omit.tsxremove_node by finding the nearest surviving point in
the draft tree before removal, then transforming that fallback through the
operation