The snapping model (Shift = cycle mode, Alt = force/free, mode-driven reads via
isGridSnapActive/isMagneticSnapActive/isAngleSnapActive, snapProfile-declared
context) lived only in code and the plan; tools.md still preached the legacy
"Shift = bypass snapping". Close the drift so the architecture review refuses
tool changes that revert to the old pattern:
- tools.md: replace the held-Shift-bypass manipulation policy with the unified
mode-driven model + the single snap read path.
- interaction-scope.md: new "Snapping mode & modifiers" section (contexts, read
path, modifiers, the chip-needs-a-scope rule) + a Rules bullet + the
known-legacy MEP movers (migrate-on-touch) incl. the dual-path constraint
(a bespoke mover must not open a `moving` scope — it re-mounts the generic
mover via useMovingNode).
- review-architecture skill: add interaction-scope.md to the reads and a new
"F. Interaction scope, snapping & modifiers" checklist — new shiftKey-bypass,
ungated grid step, missing snapProfile, a new useEditor interaction flag, or a
bespoke mover opening a moving scope are blockers; touching the legacy MEP
movers forces migration.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds a Section B rule to the review-architecture skill: a new node kind or
geometry change that exposes paintable parts must carry overrides in a
schema `slots` record resolved via def.capabilities.paint (and thread it
through clone/duplicate/preset paths), and texturable def.geometry must
emit UVs in metres (1 unit = 1 m) so catalog finishes tile. Surfaced in the
skill description too.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Two invariants weren't captured by the wiki or the review-architecture
skill, so a PR could break them and pass review:
- node-schemas.md documented no backward-compat rule, even though
migrateNodes() runs at load. Add a Schema Evolution section (new
fields need a Zod default; renames/removals/retypes need a
migrateNodes entry) plus a Rules bullet.
- review-architecture skill only checked the narrow host-children
case for migrations and had no editor-layer check at all. Add a
general schema-migration item (§B) and an editor-overlay-layer
item (§E, overlay meshes must set EDITOR_LAYER or they leak into
thumbnails/snapshots and the ink/SSGI buffers).
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Add bullets to §4.B for surfaces that landed after the 2026-05-20
skill update:
- def.capabilities.paint (PaintCapability dispatch for paint mode)
- def.capabilities.floorPlaced (generic FloorElevationSystem)
- def.surfaceRole (Solid/Rendered/Clay render-mode pipeline)
Also add a verb-not-host-kind rule and mark capabilities.roofAccessory
as documented tech debt — extending the *Accessory / *Hosted shape is
now a blocker rather than a precedent.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Phase 6 of the node-registry plan landed the @pascal-app/nodes package,
the three-checkbox composition model (def.geometry / def.renderer /
def.system), capability-driven move dispatch, and the deletion of
per-kind dispatch / per-kind files across viewer + editor. Update the
review skill so it catches reintroductions of those legacy patterns
and reviews registry-driven additions against the new contract.
- Add packages/nodes as the 4th layer in the package-boundary pass.
- Add a "Node registry & composition" checklist section.
- Require reviewers to read node-definitions.md and plugin-authoring.md.
- Flag new `case '<kind>':` clauses, kind-specific files in legacy
locations, framework imports of @pascal-app/nodes, force-routing
bespoke-move kinds through MoveRegistryNodeTool, useLiveTransforms-
driven drag motion, builders that import useScene, missing
`__fromGeometry` markers, and v1-plugin-surface overreach.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace per-tool rule trees (.cursor/rules, .claude/rules, .codex/rules)
with a single wiki/architecture/ source — 11 pages + README — readable
as plain markdown by any agent. Canonical skills live in .agents/skills/;
.claude/skills, .cursor/skills, .codex/skills are directory symlinks.
AGENTS.md is the entrypoint (rewritten as a lean overview, no per-tool
path lists). CLAUDE.md, GEMINI.md, and .github/copilot-instructions.md
all point to it.
Add open-pr skill (uses .github/pull_request_template.md as the source
of truth for the PR body) and remove the dangling .claude/CLAUDE.md
relative symlink.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>