Each denied node family alone, idname shape, 500/64/8/4096/1e9 limits, location, readonly
property, linked/default-less input, foreign modifiers, createNodeGroup rollback, a real
invalid-link removal (the old test hit the cycle check first), and CAPABILITIES for this cut.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
GeometryNodeImageTexture, GeometryNodeInputImage and ShaderNodeTexIES passed check_idname
though the docs said image-texture nodes are refused. The design doc is not in this tree.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A refused link restores the displaced link's is_muted; removeModifier no longer applies the
creation-name pattern to a lookup, so hand-made Unicode modifier names are removable; the
pattern message lists the space it allows. Live: 166 checks pass on Blender 5.2.3.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
bpy hands out a fresh wrapper per access, so id() keys made reaches() stop early and accept cycles
on chains of six or more nodes; keyed by as_pointer() with one adjacency map per call. Objects the
stopped instance scan never reached report instanceCount null. removeModifier validates its name.
Live: 158 checks pass on Blender 5.2.3.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Cycles and self links are refused before Blender is asked; the snapshot's instance scan stops at
100k depsgraph items and says instancesComplete=false (2000x2000 instanced grid: 22 s -> 1.4 s);
the daemon advertisement lists the scene-action and node-graph capabilities. Live: 156 checks pass
on Blender 5.2.3.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A refused linkSockets puts back the link it displaced; snapshot positions keep local and world
bounds apart, scan instances once per capture, skip positions above 1M vertices and flag
non-finite values; Int values capped at 4096; id/key patterns use fullmatch; addModifier names
the object type it cannot take; setObjectCustomProperty refuses only a modifier input identifier.
Live: 108 checks pass on Blender 5.2.3.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
createNodeGroup, addNode, linkSockets, addModifier, setModifierInput (node_actions.py);
setObjectCustomProperty refuses a name that is a Geometry Nodes modifier input instead of
accepting with no effect; object snapshots carry the evaluated counts, bounds and locations.
Live proof on Blender 5.2.3: ring, boundary_step and seeded scatter rebuilt by actions only
match the native trees (66 checks).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Builds a ring array, boundary_step and a seeded scatter natively and through
BrokkrBlenderTarget actions on Blender 5.2.3; records the gaps.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>