- BuildOps.place_mirrored / update_mirrored / remove_mirrored /
inside_match_bounds: pure Statics in build_ops.gd, sym-Kopplung aus M1,
gleiche Snap-Regeln (Paritaet bleibt), tiefe Kopien (kein Aliasing).
- V9-Grenzen scharf: laege der Zwilling ausserhalb der Match-Grenzen
(Loader-Regel _inside_bounds ±1 m), wird er NICHT gespeichert und der
Status meldet V9 im Klartext — auch kein halber sym-Link.
- SpawnTool-Spiegelung im GEGNER-Team (Blau West <-> Rot Ost = faire
Gegenstelle, Radius 1:1), Partner-Map in design_notes.spawn_mirror
(Loader-frei, rundtrip-sicher). Auf der Mitte: nicht gedoppelt.
- build_tool.gd: duenne Hooks an den 6 Klick-Mutationen + demo_place —
EIN Undo-Schritt nimmt Original UND Zwilling zurueck.
- spawn_tool.gd: Hooks in setzen/verschieben/loeschen/demo_place/demo_move;
_sym_mode() defensiv ueber main.get() (Mock-Mains ohne sym_mode -> OFF,
statt SCRIPT ERROR — Lektion aus test_shortcuts).
- Neue Suite tests/test_build_spawn_mirror.gd (76 Checks ALL OK) +
Probe tests/probe_m4_mirror_render.gd (2 Beweis-Bilder).
- Regression: 19/20 Suiten gruen; test_glb_view 15/25 FAIL pre-existing
(per git-stash gegen 437f6bf verifiziert, Ursache unabhaengig vom Diff).