`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>
`compute_layouts` resolves every name-from-input write against the text
its name input carries, so a folded meta is indistinguishable from a
marker node's and the layout holds a `&'static str` from there on. That
leaves nowhere for a name to be computed, which is the whole of the
rule: a name input that is not a constant is refused right here, per
node, with the path the editor pins its diagnostic to.
One name carries one value type, checked across the census and the
names a node folds together, so no graph can declare one field at two
widths. `compute_layouts` returns those refusals rather than panicking.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Scaffolding merge for the reconcile; the final series to master is
authored fresh. Rank plumbing resolves to our axis-IR model, the node
macro and the LaneSource render walk stay ours, master's vector
restructure and gradient vocabulary are adopted, and the paint and
appearance adoption is deliberately deferred behind our fill and stroke
markers.
* Draw raster images with pad extension instead of repeat
* Add the GPU basic brush renderer
* Rework the brush tool around the GPU basic brush
* Remove the CPU brush implementation
* Let the Fill and Stroke paint inputs take Item<Graphic>, replacing the IntoPaint trait
* Rename the FIll node's "fill" input to "paint"
* Let the graphic-consuming nodes take List<Graphic> directly, relying on the embedding adapters
* Remove outdated todo comments
* Re-save the demo art
* Split 'To Graphic' and 'Wrap Graphic' into the 'As Graphic' type assertion and 'Into Group' reducer nodes
* Make 'Into Group' reduce List<DVec2> not Item<DVec2>
* Reset the Merge definition for every legacy alias of its coercion nodes
* Improve test