* Remove the dead InputAccessor traits and the uncallable test helper built on them
* Replace raw node input indices with macro-generated parameter symbols across the editor
* Audit dynamic input index usage, converting to parameter symbols and named input position constants
* Abstract the remaining input index plumbing behind ParameterRef APIs and accessors
* Build SetInputValue messages as struct literals to keep message enums impl-free
* Delete the typed parameter markers in favor of explicit-output test introspection
* Wire the interpolation control path input per chain node type
* Return no input when a parameter symbol is read against the wrong node's parameter view
* Fix parsing regressions, make parsing 2.5x faster than the old pest parser, and clean up the math-parser rewrite
* Fix review findings: whitespace-juxtaposed numbers, mixed real/complex logic, correctly rounded literals, unified NaN truthiness, and gcd/lcm range checks
* Box the `value` field of `NodeGraphMessage::SetInputValue`
* Box the `ExecutionResponse` variant of `NodeGraphUpdate`
* Box the `Layer` variant of `NodeTypeClickTargets`
* Box the `Scope` variant of `ParsedValueSource`
* Route the remaining view queries through the logging query helper
* Name the cache readers by their loading contract and stop cloning the owned nodes per collision check
* Deduplicate the port center, output count, and upstream connector helpers and drop dead accessors
* Collapse the TransientMetadata enum into the Option inside TransientCache
* Extract the shared history snapshot install from undo and redo
* Remove commented-out code and fix stale names and doc comments
* Validate that the pinned node order only references existing nodes
* Abort remove_import before any mutation when the import's wires cannot be resolved
* Purge the deleted nodes' cached wire paths in delete_nodes
* Disconnect a deleted node's inputs by position so hidden inputs cannot mask a later exposed wire
* Gather the delete_nodes layer sweep only when deleting children needs it
* Move drag offsets out of the stack dependents cache into dedicated drag session state
* Replace the move_layer_to_stack selection hijack with a seeded stack dependents load
* Move text measurement into a neutral utility module out of the overlays layer
* Deduplicate the document bounds queries and name the artboard clip input index
* Replace the remove_references_from_network selection hijack with an explicit shift set
* Extract shared import and export wire disconnection used by the expose handlers
* Extract the shared epilogue of the import and export removal operations
* Move the post node lookup into the network interface to fix the layering inversion
* Clear drag offsets when the stack dependents cache unloads so programmatic shifts cannot replay them
* Use the thread-local text context for text measurement instead of a process-global mutex
* Resolve the post node lookup within the network being edited instead of the document root
* Back the outward wires cache with an interior-mutability cell readable through &self
* Convert the remaining network-level caches to interior-mutability TransientCache cells
* Move the owned nodes cache out of persistent layer metadata into a transient cell
* Flatten the transient node type enum into a layer width cell with &self loading
* Back the per-node click targets cache with a TransientCache cell
* Unify the per-input and per-export wire caches into one connector-keyed map
* Flip the click target, position, and stack dependent load chains to &self
* Flip the bounding box, import export position, and port load chains to &self
* Flip the wire geometry and resolved type query families to &self
* Flip the hit testing and frontend click target surface to &self
* Flip the frontend assembly, clipboard copy, and chain validation queries to &self
* Load stack dependents before filtering layer-owned nodes out of a selected-nodes shift
* Unify NodeTemplate into a single flat recursive shape with from_parts/into_parts as the storage split points
* Unify the three sole-dependent traversals onto one is_sole_dependent kernel
* Scan network exports for resource values when collecting used resources
* Introduce a NetworkView cursor with typed errors and convert the primitive queries to it
* Convert the composite name, selection, and eligibility queries onto NetworkView
* 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
* Add Vec2 support to the scalar math operator nodes
* Support the scalar-with-Vec2 operand order in the Exponent, Root, Logarithm, Min, Max, and Clamp nodes
* Detect an f32 base of e in the Logarithm node despite inexact widening to f64
* Make wasm wrapper not depend on editor on native
* Introduce pkg-native
* Fix tests
* Fix fmt
* Correct span and make cargo fmt work inside editor_commands block
* Review
* Fix lint
* 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
One read node per value type, mirroring master's read family. A name
means one value type, so there is no coercion between them: master's
number read silently widened integers, and these refuse instead, which
is the same rule the write side already enforces.
Each takes any record wire through the opaque reading input and serves
the name's own default where the attribute is absent, so the value
carries the declared type either way.
The gradient enums join the value-type rows now that a family exists to
read them at.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
An element generic declared on a reading input, absent from the output
and from every other input, has nowhere to go and nothing to be: the
node reads its declared attributes and never the element. That is an
attr-to-element map, so it accepts any upstream record wire.
The blessing is inferred rather than marked, since the signature already
says it. The two substrate pieces were both in place: the element rides
as the byte-carried token, so the registry takes one generic row instead
of a row per element type, and the reads resolve against the input's own
layout as they always have. Only the passthrough rule stood in the way,
in the three places that enforced it.
A generic the output carries, or one on an input with no reads, is
unchanged and still owes an implementations list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The read is a number read, not a read of whatever the name holds: our
model has no coercion, so a name written at another value type is a graph
error rather than a conversion. The name says so.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>