docs/solutions/logic-errors/2026-04-04-v2-element-primitives-should-compose-element-and-void-contracts.md
After packaging the v2 text-side contracts, the proof surfaces were still assembling the element side by hand:
That meant the text layer was packaged but the element layer still lived in examples.
slate-react-v2 now owns the next compositional layer:
Those build on the lower-level primitives:
SlateElementSlateSpacerThe proof surfaces and matrix routes now consume the element layer instead of reassembling it manually.
The void/browser proofs already established that spacer placement and void content boundaries are not optional markup details. They are part of the renderer/input contract.
Once that is true, hand-writing the void seam in every proof file is just another way to leak renderer ownership back into examples.
For slate-react-v2:
Do not stop halfway through the renderer stack and leave the remaining contract living in example files.