feat: Zuständigen-Engpass — Warnung, wenn eine Person mehr als die Hälfte des Pfads trägt (D71)

Trägt ein @name mehr als die Hälfte der offenen Arbeit des günstigsten
Pfads (Marginalkosten-Maß, D69) und tragen mindestens zwei Personen Last
auf der offenen Front, meldet die zeilenlose Warnung assigneeOverload die
mögliche Engstelle; die Pillen der Person wechseln an offenen Pfad-Knoten
auf die Warnfarbe. Knoten ohne Tags erben für die Rechnung vom nächsten
getaggten Vorfahren, mehrere Tags teilen sich den Beitrag.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-25 11:29:52 +02:00
co-authored by Claude Fable 5
parent d1da6a3529
commit 35b72fc178
10 changed files with 343 additions and 4 deletions
+1
View File
@@ -19,6 +19,7 @@ reverse.
## 2026-08-25
- A warning flags the bottleneck when one `@name` carries more than half of the open work on the cheapest path — their tag pills turn amber on the open nodes
- The estimated size of an unsized node now prices the remaining work — done sub-packages drop out, and a subtree with everything named done counts as XS
- The fold chip is solid white with an ink glyph now — the translucent box vanished on the pastel node colours
- A size prices its whole subtree on the cheapest path — sub-packages no longer add on top, so a carefully decomposed `(S)` beats a coarse `(L)`
+69
View File
@@ -5219,3 +5219,72 @@ fallen; XS-Boden auf M zurück → genau die drei XS-Tests; „Gruppe fertig"
entfernt → genau die zwei disjunktiven. Der mitgelieferte Plan ist
unberührt (sein einziger größenloser Knoten ist ein Blatt): weiterhin
0 Warnungen, 137 Pfadknoten, 57 Stationen, exakt gerechnet.
## D71 — Zuständigen-Engpass: warnen, wenn eine Person mehr als die Hälfte des Pfads trägt
Gewünscht: „eine Warnung, wenn ein und derselbe Verantwortliche (@name) zu oft
auf dem Lean-Path liegt — so eine Art Konflikt-Indikator." Kein neues
Zeichen — Tags (§7) und der günstigste Pfad existieren, es fehlte der
Konsument, der sie übereinanderlegt. Die Entscheidungen (Vorschlag bestätigt):
**Was der Indikator sagt:** Werkbaum ist bewusst kein Netzplan — die Warnung
behauptet nichts über Termine, sondern: Die **nächste Ausbaustufe ist nicht
parallelisierbar**, alles Weitere serialisiert sich durch eine Person. Genau
die Auskunft, die man beim Lean Pathfinding braucht.
**Maß: Marginalkosten, Stationen nur für den Text.** Zählen und Gewichten
standen zur Wahl; gewählt ist die Rollenteilung — Schwelle und Anteil rechnen
**gewichtet** (5×XS sind weniger Last als 2×XL), der Meldungstext nennt
zusätzlich die **Stationszahl**, weil Stationen sichtbare, mit dem Auge
nachprüfbare Objekte sind (die Punkte, die der D47-Knopf abgeht). Das
Gewichts-Maß gab es schon: die Marginalkosten des Belegungs-Vergleichs
(D69) — jeder nötige Knoten zählt mit dem, was seine Größe über die nötigen
Teilpakete hinaus behauptet; Erledigtes hat `ownCost` 0 und fällt von selbst
heraus. Die Personen-Summen ergeben zusammen exakt den Pfadpreis — kein
zweites Kostenmodell.
**Zuständigkeit erbt vom nächsten getaggten Vorfahren.** Die übliche
WBS-Lesart: Wer das Paket hat, hat die Teilpakete. Ohne Vererbung zählte in
sparsam getaggten Plänen fast nichts — im Test trüge die Person eines
zerlegten L-Pakets nur dessen Marge (1 statt 4). Mehrere Tags einer Zeile
**teilen** sich den Beitrag zu gleichen Teilen — voll doppelt gezählt bliese
gemeinsame Pakete künstlich zum Engpass auf. Beiträge ohne getaggten
Vorfahren gehen nur in die Gesamtsumme ein: Sie **verwässern** die Anteile
(konservativ — gemeldet wird nur, was sicher ist), warnen aber nicht selbst;
„viel ist niemandem zugewiesen" wäre eine eigene Aussage und, wenn überhaupt,
eine eigene Meldung.
**Schwelle: strikt mehr als die Hälfte, und mindestens zwei Personen mit Last
auf der offenen Front.** Der Solo-Plan ist die Falle — eine Person mit 100 %
ist dort keine Engstelle, sondern die Realität. Gezählt werden Personen **auf
der Front** (Last > 0), nicht im Dokument: Wer nur erledigte Knoten trägt,
macht aus einem faktischen Solo-Rest kein Zwei-Personen-Problem. Mehr als
eine Person über der Hälfte kann es nicht geben — die Meldung ist eindeutig.
Die Schwelle ist gesetzt, nicht hergeleitet (wie die 32 Zeichen in D64);
justiert wird nach Erfahrung.
**Anzeige: zeilenlose Warnung plus Warn-Pille.** Der Engpass hat keine
einzelne Zeile — `assigneeOverload` ist zeilenlos wie `cheapApprox` und nennt
Person, Anteil und Stationen. Zusätzlich wechseln die **Personen-Pillen** der
betroffenen Person an offenen Pfad-Knoten auf `--warn` — derselbe Griff wie
beim Größen-Konflikt-Badge (D62); der Grafikexport folgt von selbst, weil er
die gemessenen Pillen-Farben liest (D62). Geerbte Zuständigkeit hat keine
Pille und damit keine Färbung — benannt, kein Fehler. Kein neuer Umschalter,
kein Panel; bei ausgeschaltetem Pfad entfällt beides (ohne Pfad keine offene
Front).
**Headless nach Hausregel** (D54-Nachtrag 3): `assigneeLoads`/
`overloadedAssignee` in model.js, der Renderer bekommt nur `overloadTag`;
app.js verdrahtet Warnung und Option. Die mitgelieferten Dokumente bleiben
still (der Werkbaum-Plan hat keine Knoten-Tags; im Example liegt anna bei
3 von 13) — nachgemessen, nicht angenommen.
**Nachgemessen** im Browser an einem Wegwerf-Dokument: „@anna trägt 80 % der
offenen Arbeit auf dem günstigsten Pfad (1 von 2 Stationen) — mögliche
Engstelle.", genau eine Pille bernstein (`rgb(180,83,9)`) — am offenen
Pfad-Knoten, nicht am erledigten und nicht bei @ben; Pfad aus ⇒ Warnung und
Färbung weg, wieder an ⇒ beides zurück. 470 Tests, davon 13 neue in
`tests/overload.test.js`. Gegenproben per Mutation: Solo-Wächter entfernt →
genau der Solo-Test fällt; Schwelle aufgeweicht → genau die drei
Schwellen-Tests; Vererbung entfernt → genau der Vererbungs-Test; Teilung
entfernt → genau der Mehrfach-Tag-Test; Erledigt-Ausnahme der Pille
entfernt → genau der Pillen-Test.
+31
View File
@@ -396,6 +396,9 @@ Größe als **Bereich** gelesen (Untergrenzen verdoppeln sich):
- `@name` mit `name` aus Unicode-Buchstaben, Ziffern, `.`, `_`, `-`.
- Mehrere Tags pro Zeile möglich, Position im Text egal.
- Anzeige: helle Pillen unten rechts an der Knoten-Ecke.
- Für den **Zuständigen-Engpass** (§9) erbt ein Knoten ohne Tags die Tags des
nächsten Vorfahren mit Tags — nur für diese Rechnung; an der Anzeige der
Pillen ändert das nichts.
## 8. Kommentare
@@ -727,6 +730,34 @@ vorn. Der Knopf ist **verborgen**, solange es keine Station gibt — bei
ausgeschaltetem Pfad ebenso wie bei einem durchweg erledigten Plan; sein
Tooltip nennt die Zahl der offenen Stationen. Siehe D47.
**Zuständigen-Engpass.** Trägt **eine** Person zu viel der offenen Arbeit des
günstigsten Pfads, meldet eine zeilenlose Warnung `assigneeOverload` die
mögliche Engstelle: Die nächste Ausbaustufe ist dann nicht parallelisierbar —
alles Weitere serialisiert sich durch diese Person. Über Reihenfolge oder
Termine sagt die Warnung nichts (das tut in dieser Notation ohnehin nichts,
§1). Siehe D71.
- **Last:** Jeder nötige Knoten zählt mit dem, was seine Größe über die
nötigen Teilpakete hinaus behauptet (dasselbe Maß wie der Belegungs-Vergleich
der Closure-Suche, oben) — Erledigtes also mit 0. Mehrere `@name`-Tags einer
Zeile teilen sich den Beitrag zu gleichen Teilen.
- **Zuständig** ist, wer auf der Zeile getaggt ist (§7); ein Knoten **ohne**
Tags erbt für diese Rechnung die Tags des nächsten Vorfahren **mit** Tags —
die übliche WBS-Lesart: Wer das Paket hat, hat die Teilpakete. Ohne
getaggten Vorfahren zählt der Beitrag als nicht zugewiesen — er verwässert
die Anteile, warnt aber nicht selbst.
- **Gemeldet** wird, wenn mindestens **zwei** Personen Last auf der offenen
Front tragen und eine davon **mehr als die Hälfte** der gesamten offenen
Pfad-Arbeit hält. Ein Solo-Plan warnt damit nie — eine Person, die alles
trägt, ist dort keine Engstelle, sondern die Realität. Die Schwelle ist
gesetzt, nicht hergeleitet (wie die ~32 Zeichen des Label-Umbruchs).
- **Anzeige:** Die Warnung nennt Person, Anteil und Stationen („@anna trägt
62 % der offenen Arbeit … 7 von 9 Stationen"); zusätzlich wechseln die
Personen-Pillen (§7) der betroffenen Person an **offenen Pfad-Knoten** auf
die Warnfarbe (`--warn`) — auch im Grafikexport. Geerbte Zuständigkeit hat
keine Pille und damit keine Färbung. Bei ausgeschaltetem Pfad entfällt
beides — ohne Pfad gibt es keine offene Front.
### Diagramm aus einer URL laden (`?sourceUrl=`)
Der Editor kann den Notationstext aus einer externen Textdatei beziehen:
`…?sourceUrl=https://example.org/plan.txt` (relative Angaben werden gegen die
+7
View File
@@ -49,6 +49,7 @@
- [^] #ed.path.started: Started work is on the path, extras included (S) %% see D61
- [^] #ed.path.line: Metro-map line through the leaves (S)
- [^] #ed.path.step: Step from station to station, one button (S) %% see D47
- [x] #ed.path.load: Warn when one person is the bottleneck (S) %% see D71
- [^] #ed.closure: Count the whole dependency closure (M)
- [^] #ed.closure.once: Shared dependencies counted only once (S)
- [^] #ed.closure.nonlocal: The cheapest alternative is no longer the local one (M) %% see D34, D42
@@ -423,6 +424,12 @@
next. Seeing the front was solved; walking it across a very wide tree was
not.
#ed.path.load
Warns when one @name carries more than half of the open work on the
cheapest path while at least two people are on it: the next increment
would serialize through that person. Untagged nodes inherit the nearest
tagged ancestor, and the person's tag pills turn amber on open path nodes.
#ed.closure
The cheapest path pulls every dependency of a needed node into the needed
set, and shared targets count only once. That is why an alternative can win