diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index fded52b..5f63b0d 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -1574,3 +1574,53 @@ nicht: Das Und der Notation ist `-` am Zeilenanfang — `&` ist gerade deshalb frei. Verworfen: `$` (Preis-Kollision), `%` (ein Tippfehler vom Auskommentieren), `:` (zu nah an `:#…`), `§` (fehlt auf US-Tastaturen), `*` (Markdown, schon in D29 verworfen). + +**Nachtrag — das XOR-Zeichen ist entschieden: `=`.** Das in §11 zunächst +vorgeschlagene `x` ist verworfen; ausschlaggebend war, **wann** seine +Glyph-Kollision auftritt: `x` teilt sich das Zeichen mit dem Statuscode für +*fertig*, und genau eine Alternative einer XOR-Gruppe **soll** fertig werden — +`x [x] …` wäre also der Endzustand jeder entschiedenen Gruppe und stünde +dauerhaft in jedem Plan. Dazu kam ein zweiter, bis dahin unbenannter Befund: +Das Zerlegungszeichen wird ohne erzwungenes Leerzeichen erkannt (`\s*` in der +Referenz-Regex darf leer sein); ein Buchstabe als Gate frisst damit +Label-Anfänge (`XSS-Schutz` → Gate `X`, Label „SS-Schutz“). + +`=` ist der einzige Kandidat **ohne jede** Kollision: kein Statuscode, kein +reserviertes Zeichen, keine Markdown-Bedeutung an dieser Position, auf DE- +(Shift+0) wie US-Layout (eigene Taste) direkt tippbar, nirgends Dead-Key. Seine +beiden Schwächen sind benannt und akzeptiert: + +- **Die Mnemonik trägt sich nicht selbst** („genau eine“ muss die Legende + sagen) — aber das gilt für `|` („mindestens eine“) genauso; jedes Gate steht + ohnehin in der Legende. +- **Optisch steht `=` neben der konjunktiven Familie** (ein doppeltes `-`), + gehört aber semantisch zu `|`. Dagegen arbeiten zwei Mechanismen: Im Diagramm + bleiben die Linien gestrichelt-grau wie bei any-of (das Bild korrigiert die + Lesart sofort), und jede Mischung mit `=` in einer Gruppe gibt die + `mixedGate`-Warnung. + +Die **Leerraum-Regel** (Gate `=` nur mit folgendem Leerraum, §11) ist die +erste ihrer Art; sie hält Labels wie `=SUMME(A1:B2)` heraus und wäre bei jedem +der Kandidaten nötig gewesen. + +**Verworfene Kandidaten**, je am entscheidenden Kriterium gescheitert: + +- **`x`** — siehe oben; die XOR-Mnemonik (für Informatiker stark) wiegt die + dauerhafte `x [x]`-Paarung nicht auf. +- **`^`** — XOR in C/Python, aber der Dead-Key schlechthin auf deutschen + Tastaturen (nicht nur Mac); ihn zu nehmen widerspräche dem im + `&tag`-Nachtrag festgehaltenen Kriterium. Zudem dieselbe Endzustands- + Kollision wie `x`, nur mit `[^]`: Per D30 befördert der Deploy die gewählte + Alternative auf `[^]` — `^ [^] …` stünde ausgerechnet im Vorzeigedokument. +- **`|1`** (Zweizeichen-Gate in der Pipe-Familie, „genau 1“) — semantisch die + ehrlichste Form und kollisionsfrei, dem Nutzer aber schlicht nicht gefällig; + Geschmack ist bei einem Zeichen, das man täglich tippt, ein zulässiges + Kriterium. +- **`/`** — das Alltags-Entweder/Oder (ja/nein, m/w/d); teilt sich die Glyphe + mit `[/]` *Durchstich* (immerhin nur ein Durchgangszustand) und mit + Pfad-Labels (`/api/…`). +- **`⊕`** — das echte XOR-Symbol, aber ohne Zeichenpicker auf keiner Tastatur + tippbar; der Moment des Tippens ist der Moment, in dem man nicht über Syntax + nachdenken will (D32). +- **`°`** — fehlt auf US-Layouts, und der kleine Kreis kollidierte semantisch + mit dem hohlen Kreis, der im Diagramm bereits *optional* bedeutet (D29). diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 7de8f62..a188e13 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -135,7 +135,7 @@ Pfad, der die Wahrheit sagt. Bearbeitungsstand des Knotens selbst. Effektiv fertig ist er erst, wenn auch seine Abhängigkeiten es sind. Der effektive Status wird gerechnet, nie geschrieben. -- **XOR** (`x`) — neben „mindestens eine" (`|`) eine Gruppe, in der **genau +- **XOR** (`=`) — neben „mindestens eine" (`|`) eine Gruppe, in der **genau eine** Alternative realisiert werden darf. Für die Pfadrechnung ändert das nichts (die wählt bei `|` ohnehin eine); es kommt eine Regel hinzu, die verletzt werden kann und dann gemeldet wird. diff --git a/docs/SPEC.md b/docs/SPEC.md index c3adde2..54db791 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -596,19 +596,28 @@ die Rechnung schwerer als heute — siehe D34. Zerlegungszeichen — und ob eingeklappte Teilbäume in Grafikexport und Druck eingeklappt bleiben. -### XOR — genau eine Alternative (`x`) +### XOR — genau eine Alternative (`=`) Neben `-` (all of), `+` (Zugabe) und `|` (any of, **mindestens** eine) soll es eine Gruppe geben, in der **genau eine** Alternative realisiert werden darf. -Vorgeschlagenes Zeichen: `x`, an derselben Stelle wie die übrigen -Zerlegungszeichen. +Zeichen: **`=`**, an derselben Stelle wie die übrigen Zerlegungszeichen +(entschieden; Begründung und verworfene Kandidaten: D34-Nachtrag). - Für den günstigsten Pfad ändert das nichts: Der wählt bei `|` ohnehin genau eine (§9). XOR fügt eine **Regel** hinzu, die verletzt werden kann — zwei realisierte Alternativen ergeben eine Warnung. -- **Offen** bleibt das Zeichen: `x` kollidiert nicht beim Parsen (das - Zerlegungszeichen steht vor der Statusbox), aber `x [x] …` liest sich - schlecht, weil `x` zugleich der Statuscode für *fertig* ist. +- `=` ist **disjunktiv** wie `|`; die Mischregel aus §3 gilt entsprechend: + Eine Gruppe ist einheitlich `-`/`+`, einheitlich `|` oder einheitlich `=` — + jede Mischung mit `=` ist ungültig (`mixedGate`). Auch die Darstellung folgt + any-of (gestrichelt in Grau); wie die Gruppe zusätzlich als „genau eine" + gekennzeichnet wird, ist offen (z. B. eine kleine „1" an der Sammelleiste). +- **Leerraum-Regel:** Als Gate wird `=` nur mit **folgendem Leerraum** + erkannt — ein Label wie `=SUMME(A1:B2)` bleibt damit ein Label. `=` ist das + erste Gate, das diese Regel braucht; für `-`/`+`/`|` ändert sich nichts. +- Das ursprünglich vorgeschlagene `x` ist verworfen: `x [x] …` stünde als + Endzustand jeder entschiedenen Gruppe **dauerhaft** im Text (genau eine + Alternative soll ja fertig werden), und als Buchstabe kollidierte es ohne + Leerraum-Regel mit gewöhnlichen Labels (`XSS-Schutz` → Gate `X`). ### Knotenbeschreibungen diff --git a/docs/TASKS.md b/docs/TASKS.md index 44f16b5..1aad562 100644 --- a/docs/TASKS.md +++ b/docs/TASKS.md @@ -82,6 +82,8 @@ entscheiden, **bevor** Code entsteht. - [ ] Querverbindungen zeichnen (eigene SVG-Ebene, optisch sekundär); bei ausgewähltem Knoten ein-/ausgehende hervorheben. - [ ] Faltmarken `>` / `<` parsen; interaktives Auf-/Zuklappen im Diagramm. -- [ ] XOR-Gruppe (`x`): Zeichen endgültig wählen, parsen, Verletzung melden. +- [ ] XOR-Gruppe (`=`) parsen (nur mit folgendem Leerraum, Mischung → + `mixedGate`), zwei realisierte Alternativen melden. + → Zeichen entschieden: `=` statt `x` (D34-Nachtrag). - [ ] Knotenbeschreibungen: Schreibweise für kurze und lange Form festlegen (Einrückung ist bereits Hierarchie), dann Tooltip/Pop-up. diff --git a/docs/examples/werkbaum.werkbaum b/docs/examples/werkbaum.werkbaum index 0391388..95b75ba 100644 --- a/docs/examples/werkbaum.werkbaum +++ b/docs/examples/werkbaum.werkbaum @@ -17,7 +17,7 @@ - [?] Effective status: intrinsic, plus what it depends on (S) - [?] Cycles are legal — they mean "finished together" (XS) - [ ] An id with no node behind it is a warning (XS) - - [?] XOR — exactly one alternative, not at least one (S) + - [?] XOR, = — exactly one alternative, not at least one (S) - [?] Node descriptions, shown as a tooltip or pop-up (M) - [?] A short text right at the node (S) %% indentation already means hierarchy - [?] A long block at the end, addressed by its id (S)