Migrate the two pure-mirror interaction flags off `useEditor` onto the
authoritative `useInteractionScope`. Both carried payloads byte-identical to
the scope union, so this is a zero-behaviour-change refactor: readers use the
reference-stable `useEditingHole()` / `useActiveHandleDrag()` hooks (or the
`getEditingHole()` imperative read), and producers drive the scope directly
with guarded `endIf` so clearing one interaction never stomps an unrelated
scope. Adds the `holeEditScope` builder + a no-leaked-flag invariant test.
Closes the first slice of the legacy-flag deletion; the rich-payload flags
(movingNode, curving*, *Endpoint, placementDragMode) remain.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- registry: getRoofAccessoryKinds() enumerates kinds declaring the
roofAccessory capability, in deterministic builtin-list order (mirrors
getSelectableKinds); exported from the registry barrel.
- apps/editor build-tab: a "Features" group under the Roof tile, discovered
from the registry (no DB) and activating each kind's roof-attach tool —
parity with the community editor's roof features.
- site-boundary-editor: hide the flag handle group around thumbnail captures
(they render on SCENE_LAYER so the thumbnail camera can't layer-filter them),
matching handle-arrow.tsx — keeps flags out of preset/snapshot thumbnails.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>