MZP · Diagramm-Engine · Abnahme

RadialLayout — Smoke-Test & Abnahme

Feature: serverseitiges radiales Auto-Layout für type:mindmap

Commit 1ca4ca6 · getestet 2026-09-08 gegen die Live-Instanz publisher.maierzone.de

Spec: docs/superpowers/specs/2026-09-08-mindmap-radial-layout-design.md

Was das Feature tut

Bei type:mindmap liefert der Agent künftig nur die Struktur — Knoten, Kanten und genau einen Knoten mit nodeType=focal als Zentrum. Koordinaten entfallen. Der Server rechnet über application/support/diagram/layout/RadialLayout.java:

Zusätzlich gehärtet: DiagramService.prepare bricht jetzt bei jeder ERROR-Notice aus dem Layout ab (vorher nur bei Parser-/Validator-Fehlern).

Testergebnisse (validateDiagram, kein Publish)

FallEingabeErwartetErgebnis
Happy path 1× focal, keine Koordinaten Server positioniert alle Knoten radial ok:true — LAYOUT_APPLIED, 0 gepinnt
Kein Zentrum 0× focal harter Fehler, keine Ausgabe ok:false — MINDMAP_ROOT_REQUIRED (ERROR)
Mehrdeutig 2× focal harter Fehler, keine Ausgabe ok:false — MINDMAP_ROOT_AMBIGUOUS: „Mindmap hat 2 Knoten mit nodeType=focal — genau einer ist erlaubt.“

Beide Fehlerfälle kommen als benannte ERROR-Notice zurück, nicht als stumm durchgereichte Info — genau der Punkt aus Abschnitt 6 der Spec.

Diagramm 1 — Happy path (3 Äste, symmetrisch)

Äste A (2 Blätter) / B (1) / C (1). Sektoren: A = 180°, B = 90°, C = 90°. A sitzt bei 0° (Ost), B bei 135° (Südwest), C bei 225° (Nordwest). Enkel bei r ≈ 400.

RadialLayout Smoke Diagramm vom Typ mindmap mit 7 Knoten und 6 Kanten. Zentrale Idee Ast A A.1 A.2 Ast B B.1 Ast C
mindmap · 7 Knoten · 6 Kanten · viewBox 960×920 · Zentrum akzentuiert

Diagramm 2 — Sektor proportional zur Ast-Größe

Ast A hat jetzt 3 Blätter, B und C je 1. Blattzahl gesamt = 5 → A bekommt 3/5 · 360° = 216°, B und C je 72°. Man sieht A deutlich breiter aufgefächert als in Diagramm 1.

RadialLayout — Sektoren proportional zur Ast-Groesse 1x nodeType=focal, keine Koordinaten geliefert Zentrale Idee Ast A A.1 A.2 A.3 Ast B B.1 Ast C
mindmap · 8 Knoten · 7 Kanten · viewBox 1044×1036 · Sektor-Aufteilung nach Teilbaumgröße

Koordinaten nachgerechnet

Aus dem gerenderten SVG von Diagramm 1 (Zentrum root bei 540,540):

KnotenZentrumΔ zu rootWinkelRadius
a (Tiefe 1)740, 540+200, 00° (Ost)200 ✓
b (Tiefe 1)400, 680−140, +140135°≈198 ✓
c (Tiefe 1)400, 400−140, −140225°≈198 ✓
a1 (Tiefe 2)824, 256+284, −284−45°≈401 ✓
a2 (Tiefe 2)824, 824+284, +284+45°≈401 ✓
b1 (Tiefe 2)256, 824−284, +284135°≈401 ✓

Radius exakt Tiefe × 200, Winkel exakt in der Sektormitte, alle Koordinaten auf 4-px-Raster.

Ein kosmetischer Fund: die Erfolgs-Notice meldet direction: LR bzw. „(LR)“ im Text, obwohl bei einem Radiallayout keine Laufrichtung existiert. Die LayoutEngine reicht dort die generische LAYOUT_APPLIED-Meldung durch. Kein Funktionsfehler — nur irreführende Telemetrie.

Abnahme-Checkliste