diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index b8ab4e8..3457955 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -1834,3 +1834,43 @@ Stiel-Messung, Treppe und Pfadlinie sind damit ohne Zusatzcode konsistent per CSS zu verstecken). Die Kennzeichnung „▸ n“ ist Teil des Knotentexts und wandert von selbst in den SVG-Export; das ▾ offener Knoten wird dort und im Druck entfernt — es ist Bedienelement, keine Aussage über den Plan. + +## D39 — Effektiver Status: die Farbe sagt die Wahrheit, die Marke die Box +Mit den Abhängigkeiten (D37) gibt es zwei Aussagen je Knoten: was in der +Statusbox steht (intrinsisch) und wie weit er wirklich ist (effektiv, §4). +Erwogen waren drei Darstellungen — Diskrepanz-Kennzeichnung bei intrinsischer +Farbe (die ursprüngliche Empfehlung), ein Umschalter, oder Farbe = effektiv. +**Entschieden (Nutzer): Die Knotenfarbe zeigt den effektiven Status; wo der +eigene Status weiter ist, kommt eine Diskrepanz-Marke dazu.** Das ist die +stärkere Wahl: Das Diagramm beantwortet „wie weit ist das wirklich?“ — genau +die Frage, für die man auf einen Plan schaut. Ein grünes `[x]`, das auf ein +rosé `[~]` wartet, wäre die hübschere Lüge. + +**Die Rechenregel ist ein Minimum über die Abhängigkeits-Hülle.** Jeder Status +bekommt einen Fortschritts-Rang entlang der Ergebnis-Skala (D5); effektiv ist +das Minimum des intrinsischen Rangs über den Knoten selbst und alles, was er +direkt oder mittelbar braucht. Diese Form hat zwei angenehme Folgen: **Zyklen +brauchen keine Sonderregel** — alle Knoten eines Zyklus teilen ihr Minimum, +und das ist wörtlich das „wird gemeinsam fertig“ aus D34; und die Rechnung ist +eine schlichte Fixpunkt-Iteration (Ränge sinken nur, Abbruch garantiert). +Außerhalb der Skala: neutral und `[-]` zählen als 0 — wer auf etwas +Verworfenes oder nie Begonnenes zeigt, ist effektiv am Anfang, und genau das +soll auffallen —, `[!]` als 1 (die Absicht-ohne-Investition-Gruppe aus D35). +Bei doppelter ID gilt die **erste** Vergabe — das löst das in D36 offen +gelassene „wer gewinnt bei Verweisen“ konsistent zur `duplicateId`-Warnung. + +**Die Diskrepanz-Marke ist die eigene Statusbox in den eigenen Farben.** +Unten links (die letzte freie Knoten-Ecke: oben rechts Größe, unten rechts +Tags, oben links ⚠) sitzt ein kleines `[x]`-Etikett in den §4-Farben des +intrinsischen Status — die Notation kennzeichnet sich mit ihrem eigenen +Vokabular, niemand lernt ein neues Symbol, und die Farben tragen die ganze +Geschichte: Knoten rosé (effektiv in Arbeit), Etikett grün (selbst fertig). +Tooltip („effektiv … — selbst schon …, wartet auf Abhängigkeiten“) und +`a11yEffective` sagen es in Worten. Marke und Färbung gehören in Export und +Druck — sie sind eine Aussage über den Plan, nicht über den Betrachter. + +**Was beim intrinsischen Status bleibt:** die XOR-Regel (§3) — „realisiert“ +heißt Kosten investiert, und investiert ist investiert, auch wenn +Abhängigkeiten den Knoten zurückhalten; und „Was ist neu?“ (D28) — der gelbe +Kranz meldet das `[^]` im Text, also den Deploy des Knotens selbst. Beide +Prüfungen laufen im Parser bzw. auf dem Text und bleiben unberührt. diff --git a/docs/SPEC.md b/docs/SPEC.md index eccc482..a99f9e1 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -190,6 +190,24 @@ Codiert als Checkbox nach dem Zeichen (Erweiterung der Markdown-Task-Syntax): verloren, Folgezeilen bleiben unberührt. (Eine mehrzeichige Klammer wie `[xyz]` ist keine Statusbox und bleibt Teil des Labels.) +**Intrinsischer und effektiver Status (Abhängigkeiten, §1).** Der Status in +der Box ist der **intrinsische** — der Bearbeitungsstand des Knotens selbst. +Der **effektive** Status berücksichtigt die Abhängigkeiten: Ein Knoten kann +effektiv nicht weiter sein als das, was er braucht. + +- **Fortschritts-Rang** entlang der Ergebnis-Skala (D5): + `[?]` 0 · `[ ]` 1 · `[~]` 2 · `[/]` 3 · `[x]` 4 · `[^]` 5. Außerhalb der + Skala zählen neutrale Knoten und `[-]` als Rang 0 („nichts Anrechenbares“), + `[!]` als Rang 1 (Absicht ohne Investition, D35). +- **Effektiver Rang = Minimum des intrinsischen Rangs über die + Abhängigkeits-Hülle**: der Knoten selbst plus alles, was er per `:#…` direkt + oder mittelbar braucht. Zyklen brauchen keine Sonderregel — alle Knoten + eines Zyklus teilen so von selbst ihr Minimum („wird gemeinsam fertig“, §1). + Unbekannte IDs zählen nicht (sie sind schon gewarnt); bei doppelter ID gilt + die **erste** Vergabe (D36). +- Der effektive Status wird **gerechnet, nie geschrieben** (D14: der Text ist + die eine Quelle der Wahrheit). Darstellung: §9; Begründung: D39. + ## 5. Aufwand (T-Shirt-Größen) - Werte: `XS < S < M < L < XL < XXL`, notiert in Klammern, z. B. `(L)`. @@ -241,6 +259,17 @@ Stück zwischen Elternknoten und erstem Abzweig — eine kleine **„1“-Plaket (weißer Kreis mit grauem Rand, graue Ziffer): „genau eine“. Sie erscheint auch im Grafikexport. Siehe D35. +**Die Knotenfarbe zeigt den effektiven Status (§4)**, nicht den intrinsischen — +das Diagramm beantwortet „wie weit ist das wirklich?“. Wo der eigene Status +**weiter** ist als der effektive (der Knoten wird von Abhängigkeiten +zurückgehalten), sitzt unten links eine kleine **Status-Marke** mit der +eigenen Statusbox (z. B. `[x]`) in den §4-Farben des intrinsischen Status; +Tooltip und `aria-label` benennen beide. Ohne Diskrepanz ändert sich nichts — +und für die XOR-Regel (§3) und „Was ist neu?“ (unten) zählt weiterhin der +**intrinsische** Status: Investiert ist investiert, und `[^]` im Text bleibt +die Deploy-Aussage. Marke und Färbung erscheinen auch im Grafikexport und im +Druck. Siehe D39. + **Optionale Knoten (`+`, §3):** Sie hängen an der normalen all-of-Zerlegung, die Anordnung bleibt unverändert. Zwei Kennzeichen, beide auch im Grafikexport: @@ -661,17 +690,9 @@ die Closure-Rechnung des günstigsten Pfads (alle drei unten). ### Intrinsischer und effektiver Status -- Der **intrinsische** Status ist der, der in der Statusbox steht (§4) — der - Bearbeitungsstand des Knotens selbst. -- Der **effektive** Status berücksichtigt zusätzlich die Abhängigkeiten: Ein - intrinsisch fertiger Knoten ist effektiv **nicht** fertig, solange eine - Abhängigkeit es nicht ist. -- Der effektive Status wird **gerechnet, nie geschrieben**. Im Notationstext - steht ausschließlich der intrinsische — sonst gäbe es zwei Quellen der - Wahrheit für dieselbe Aussage. -- **Offen ist die Darstellung.** Die Knotenfarbe zeigt heute den intrinsischen - Status (§4); beide zugleich brauchen entweder einen zweiten visuellen Kanal - oder einen Umschalter. +**Umgesetzt** — Rechenregel in §4 (Fortschritts-Rang, Minimum über die +Abhängigkeits-Hülle), Darstellung in §9 (Knotenfarbe = effektiver Status, +Diskrepanz-Marke unten links). Siehe D39. ### Querverbindungen im Diagramm diff --git a/docs/TASKS.md b/docs/TASKS.md index 938fc28..ca17d0a 100644 --- a/docs/TASKS.md +++ b/docs/TASKS.md @@ -83,8 +83,13 @@ entscheiden, **bevor** Code entsteht. `deps` als ID-Strings am Knoten, Warnung `unknownDep`, Zyklen bewusst ungeprüft; sichtbar als `→ #a, #b` im Tooltip + `a11yDeps`; SPEC-§11-Teil nach §1 überführt; `tests/deps.test.js`. -- [ ] Effektiven Status rechnen (intrinsisch + Abhängigkeiten); Darstellung +- [x] Effektiven Status rechnen (intrinsisch + Abhängigkeiten); Darstellung entscheiden — die Knotenfarbe zeigt heute den intrinsischen Status. + → Entschieden und umgesetzt (D39): Fortschritts-Rang (SPEC §4), effektiv + = Minimum über die Abhängigkeits-Hülle (Fixpunkt, Zyklen teilen ihr + Minimum); **Knotenfarbe = effektiver Status**, bei Diskrepanz die eigene + Statusbox als Marke unten links in den eigenen Farben (auch im Export); + Tooltip + `a11yEffective`; `tests/effective.test.js`. - [ ] Günstigsten Pfad auf die Dependency Closure umstellen (gemeinsame Abhängigkeiten nur einmal zählen). Erweitert D18; die gierige Wahl je Alternativgruppe ist damit nicht mehr optimal — Verfahren wählen und diff --git a/docs/examples/werkbaum.werkbaum b/docs/examples/werkbaum.werkbaum index 66ea85b..237ffa9 100644 --- a/docs/examples/werkbaum.werkbaum +++ b/docs/examples/werkbaum.werkbaum @@ -12,9 +12,9 @@ - [x] Node IDs (#auth) (S) %% often just the ticket number, see SPEC §11 + [?] Free tags, &tag (M) %% only together with a consumer, see D34 - [?] A lens: highlight every node tagged &x (S) - - [~] Dependencies across the tree, (:#auth,#api) (M) - - [?] They constrain the status, not when work may start (S) - - [?] Effective status: intrinsic, plus what it depends on (S) + - [x] Dependencies across the tree, (:#auth,#api) (M) + - [x] They constrain the status, not when work may start (S) + - [x] Effective status: intrinsic, plus what it depends on (S) - [x] Cycles are legal — they mean "finished together" (XS) - [x] An id with no node behind it is a warning (XS) - [x] XOR, = — exactly one alternative, not at least one (S) diff --git a/frontend/CLAUDE.md b/frontend/CLAUDE.md index 8eb82e9..27981c7 100644 --- a/frontend/CLAUDE.md +++ b/frontend/CLAUDE.md @@ -292,6 +292,15 @@ verworfene Elemente. Quelle sind ES-Module unter `src/`; `index.html` ist der Knoten-Referenzen; der Parser prüft nur Existenz (`unknownDep`), Zyklen werden bewusst nicht einmal erkannt (zulässig, „gemeinsam fertig"). Keine Diagramm-Darstellung — nur Tooltip (`→ #a, #b`) und `a11yDeps`. +- Effektiver Status (SPEC §4/§9, D39): `effectiveStatus(roots)` in model.js + liefert NUR die Diskrepanzen (Map Knoten → effektiver Status-Key; Minimum + des Fortschritts-Rangs über die Abhängigkeits-Hülle, Fixpunkt — Zyklen + teilen ihr Minimum, erste ID-Vergabe gewinnt). Der Renderer färbt dann + `st-` statt des intrinsischen und hängt die Marke + `.chip.ownst.st-` (eigene Statusbox, eigene Farben) unten links an — + im Export via `drawBadge`, aus dem Label-Klon entfernen (`.ownst`). XOR- + „realisiert" (Parser) und „Was ist neu?" (`[^]` im Text) bleiben bewusst + **intrinsisch**. - XOR-Gruppen `=` (SPEC §3/D35): Der Parser setzt `type:'xor'` (nur mit folgendem Leerraum — `=SUMME(…)` bleibt Label); der Renderer gibt `