* Add a network interface invariant validator and characterization tests as a refactor safety net
* Characterize stack, chain, layer move, signature edit, and preview behaviors in tests
* Sweep network interface invariants after every message in editor tests
* Deselect deleted layer children by pruning the expanded deletion set from the selection
* Rebuild the document structure on redo to match undo
* Check for cycles in set_input before applying layout side effects rather than reverting after
* Correct the swapped old/new exposure binding names in set_input
* Reload the document structure when an import or export is appended into the first two slots
* Treat toggling preview on a disconnected export as a preview with nothing to restore
* Replace panics on malformed networks with logged errors in the network interface
* Make is_artboard an identity check independent of scene connectivity
* Stop serializing the selection undo and redo history into saved documents
* Run the set_input cycle check before the node-to-node disconnect so a rejected wire swap leaves the graph unchanged
* Rename the node 'Length' -> 'Magnitude'
* Rename the node 'Flatten Path' -> 'Combine Paths'
* Replace the node 'Vec2 Value' with 'Combine Vec2' and add a new 'Vec2 Value' that's actually a vec2
* Update demo artwork
`Named<X>` in parameter position declares where a placeholder's name is
wired, and the macro gives that input constant text; `Attr<Named<X, V>>`
in the return writes under it. The kernel is handed the bare placeholder,
since the name is spent resolving the layout and a folded offset is all
the write needs, so the hot path matches a marker node's exactly.
A name-generic write names its value type through the wired generic,
which only an implementations row resolves, so those nodes emit their
layout meta per row rather than sharing one across rows.
`write_attribute` is the catalog's set half, restoring the identifier
master's documents carry with its input positions. Its name input is a
constant, so those documents resolve without migration, and the reset
marker that stood in for the missing node retires with it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>