From d276c94840a79d1d465f9700e181ddf0ac0f677b Mon Sep 17 00:00:00 2001 From: mhoennig Date: Sat, 22 Aug 2026 16:08:37 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20XOR-Gruppen=20(`=3D`)=20=E2=80=94=20gen?= =?UTF-8?q?au=20eine=20Alternative=20(SPEC=20=C2=A73,=20D35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parser erkennt `=` als disjunktives Gate (nur mit folgendem Leerraum — `=SUMME(…)` bleibt Label); Mischungen melden mixedGate wie gehabt. Die XOR-Regel warnt je WEITERER realisierter Alternative (xorConflict mit Zeilennummer; realisiert = [~]/[/]/[x]/[^], siehe D35). Darstellung erbt die komplette any-of-Geometrie (ul class="or xor"), ergänzt um eine „1"-Plakette am Austritt der Sammelleiste — auch im Grafikexport. Legende (+ hint_root) und Warntext in allen 9 Sprachen; SPEC §11-Eintrag in §1/§3/§9 überführt; 13 neue Tests (tests/xor.test.js). Co-Authored-By: Claude Fable 5 --- docs/DECISIONS.md | 36 ++++++++++++ docs/ROADMAP.md | 2 +- docs/SPEC.md | 58 +++++++++--------- docs/TASKS.md | 8 ++- docs/examples/werkbaum.werkbaum | 2 +- frontend/CLAUDE.md | 8 +++ frontend/index.html | 3 +- frontend/src/app.js | 50 +++++++++++++--- frontend/src/model.js | 16 +++-- frontend/src/parser.js | 37 ++++++++++-- frontend/src/render.js | 12 ++-- frontend/src/style.css | 14 +++++ frontend/src/warnings.js | 5 ++ frontend/tests/xor.test.js | 101 ++++++++++++++++++++++++++++++++ 14 files changed, 291 insertions(+), 61 deletions(-) create mode 100644 frontend/tests/xor.test.js diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 5f63b0d..81fa374 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -1624,3 +1624,39 @@ der Kandidaten nötig gewesen. nachdenken will (D32). - **`°`** — fehlt auf US-Layouts, und der kleine Kreis kollidierte semantisch mit dem hohlen Kreis, der im Diagramm bereits *optional* bedeutet (D29). + +## D35 — XOR (`=`) umgesetzt: „realisiert“ definiert, „1“-Plakette, keine neue Linienart +Das in D34 entschiedene XOR-Gate ist gebaut (SPEC §1/§3/§9); beim Bauen waren +drei Dinge zu entscheiden, die die SPEC bis dahin offen ließ: + +**„Realisiert“ heißt: Kosten investiert oder mehr** — Status `[~]`, `[/]`, +`[x]`, `[^]`. Die XOR-Regel („genau eine Alternative darf realisiert werden“) +soll genau dann anschlagen, wenn der Plan tatsächlich doppelt einkauft — und +das beginnt mit `[~]`: Wer an zwei Alternativen zugleich **arbeitet**, verletzt +das „genau eine“ bereits, nicht erst beim zweiten `[x]`. `[?]`, `[ ]` und `[!]` +sind Absicht ohne Investition, `[-]` ist die Entscheidung dagegen, neutral sagt +nichts — alle fünf zählen nicht. Gemeldet wird **jede weitere** realisierte +Alternative einzeln (Warnung `xorConflict` mit ihrer Zeilennummer und ihrem +Label): Die Meldung zeigt so auf die Zeile, die man ansehen muss, statt +pauschal auf die Gruppe. Bewusst eine **Warnung, kein Fehler** — die Notation +bleibt fehlertolerant (§4), der Baum wird unverändert dargestellt. + +**Kennzeichnung: „1“-Plakette am Austritt der Sammelleiste.** Der D34-Nachtrag +hielt fest, dass `=` optisch bei der konjunktiven Familie steht und das +Diagramm die Lesart korrigieren muss. Die Linien übernehmen das schon +(gestrichelt grau wie any-of); die Plakette — kleiner weißer Kreis, graue +Ziffer, auf dem Leitungsstück zwischen Elternknoten und erstem Abzweig — sagt +das „genau eine“, das der Linienstil allein nicht sagen kann. Grau statt +Petrol, weil sie zur Gate-Codierung gehört (D15: keine Signalfarbe im +Diagramm); an der Sammelleiste statt am Knoten, weil sie eine Aussage über die +**Gruppe** ist und die Knoten-Ecken belegt sind (D18). Sie erscheint auch im +Grafikexport (dort nach den Knoten gezeichnet, wie der Optional-Kreis aus D29). + +**Keine neue Linienart, keine neue CSS-Familie:** Der Renderer gibt +XOR-Gruppen als `