fix: Erledigte Knoten treten nie zurück (D46-Nachtrag)

Gemeldet: manche Knoten in Produktion werden grau dargestellt, etwa
`#ed.fresh`. Ursache war nicht der Status, sondern die Pfad-Inversion:
Der Knoten ist eine Zugabe (`+`) und liegt damit per D29 nie auf dem
günstigsten Pfad — `.cheap-on .node:not(.cheap)` blasste ihn aus
(Deckkraft 0,32, Sättigung 0,4; Pastellblau liest sich so als Grau).

D46 hatte „erledigt tritt nicht zurück" bereits entschieden, die Regel
hing aber an `cheapCls()` und griff nur für Knoten AUF dem Pfad. Durch
das Raster fielen die fertige Zugabe und die fertige, nicht gewählte
Alternative. Jetzt gilt sie unabhängig vom Pfad; Blässe heißt damit
einheitlich „hier ist nichts getan und wird auch nichts getan".

Umgesetzt als eigene Klasse `done` per `isDone(n)` in render.js, nicht
über `st-fertig`/`st-prod`: Die Statusklasse trägt den EFFEKTIVEN Status
(D39), die Ausnahme muss dem intrinsischen folgen — dieselbe Linie wie
bei D35, D28 und der Kostenrechnung aus D46. Gefärbt wird unverändert
nach dem effektiven Status.

Nachgemessen (Werkbaum-Plan, 149 sichtbare Knoten, Pfad an): vorher
blass und fertig waren genau drei Knoten (#ed.fresh, #ed.export.print,
#ed.closure.greedy) — jetzt alle drei opacity 1, filter none, Füllung
rgb(219,234,248) wie die fertigen Knoten auf dem Pfad. Weiterhin blass:
31 Knoten, darunter kein einziger fertiger. Der Grafikexport hatte den
Fehler nie (er liest backgroundColor, nicht opacity).

240 Tests grün (4 neue in tests/frontier.test.js).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-24 06:15:22 +02:00
co-authored by Claude Opus 5
parent 4619ce7a0b
commit b6e83b4f2a
8 changed files with 147 additions and 10 deletions
+6 -1
View File
@@ -92,8 +92,13 @@ function nodeHtml(n, extra, opts, fold){
/* Die Knotenfarbe zeigt den EFFEKTIVEN Status (SPEC §9/D39); bei Diskrepanz
trägt die Marke unten links die eigene Statusbox in den eigenen Farben. */
const effKey = opts.effStatus ? opts.effStatus.get(n) : undefined;
/* `done` = erledigt laut eigener Statusbox (`[x]`/`[^]`). Trägt allein die
Ausnahme von der Pfad-Inversion (D46-Nachtrag): Was getan ist, wird nie
ausgeblasst — auch als optionaler Knoten oder nicht gewählte Alternative.
Der INTRINSISCHE Status entscheidet, wie überall dort, wo es um geleistete
Arbeit geht (D35/D28/D46); die Farbe bleibt die des effektiven (D39). */
const cls = ['node', extra || '', fold && fold.collapsed ? 'folded' : '',
effKey ? 'held' : '',
effKey ? 'held' : '', isDone(n) ? 'done' : '',
n.status ? 'st-' + (effKey || n.status.key) : '']
.filter(Boolean).join(' ');
/* Zeilennummer am Knoten (D25): Grundlage für den Sprung ins Textfeld und
+8
View File
@@ -771,6 +771,14 @@
Zurücktreten die Aussage IST, ist hier gar keine Aussage über den Plan
gemeint — es ist eine Editierhilfe. */
.cheap-on .node:not(.cheap).current{opacity:1;filter:none}
/* Erledigtes tritt NIE zurück (D46-Nachtrag). D46 hatte das schon entschieden
— „sie auszublassen hieße, sie sähen aus wie eine verworfene Alternative" —,
die Regel griff aber nur für erledigte Knoten AUF dem Pfad. Ein fertiger
OPTIONALER Knoten (`+`, D29: nie auf dem Pfad) und eine fertige, nicht
gewählte Alternative fielen durch das Raster: `#ed.fresh` ist gebaut und
deployed, sah aber aus wie etwas, das nie passieren wird. Blassheit heißt
jetzt einheitlich „hier ist nichts getan und wird auch nichts getan". */
.cheap-on .node:not(.cheap).done{opacity:1;filter:none}
/* implizit als M angenommene Größe: invertiertes Badge (weiß statt petrol) */
.size.implicit{background:var(--card);color:var(--or);border-color:var(--or)}
/* Günstigster-Pfad-Linie: gestrichelt, geschwungen, petrol — fädelt durch