feat(diagram): Personen-Leiste mit Personen-Linse und Belastungsanzeige (D87)

Je @Person eine Pille mit Anteil an der offenen Pfad-Arbeit (D71-Maß),
dazu ein Eintrag für Unzugewiesenes — die Anteile summieren auf 100 %.
Ein Tipp filtert das Diagramm auf die Knoten der Person: alles andere
faltet, ihre Pakete stehen als ▸ n, die Pillen färben petrol. Die Linse
ist rein Ansicht und Sitzungssache — in den Text wird nichts geschrieben,
in geteilten Dokumenten ginge der persönliche Filter sonst an alle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-27 10:38:53 +02:00
co-authored by Claude Fable 5
parent 1e1a00f794
commit deec39e82a
10 changed files with 439 additions and 7 deletions
+2
View File
@@ -19,6 +19,8 @@ reverse.
## 2026-08-27
- A people bar below the diagram shows each `@person` with their share of the open work on the cheapest path — plus an entry for what is assigned to nobody
- Tapping a person filters the diagram to their nodes: everything else folds, their packages stand collapsed as `▸ n`, their pills turn teal — a view-only lens that never writes into the text
- Folding regions in the text editor recorded as an idea in the plan — view-only and local, unrelated to the diagram's fold marks, deliberately not sized yet
- Fix: the root node's fold chip was white-on-pastel and barely visible — it now looks like every other node's, and the description mark and id line on a coloured root are readable too
- The caret on a node off the cheapest path now highlights only the ring — the fill stays pale instead of jumping back to full colour
+79
View File
@@ -7446,3 +7446,82 @@ lokales Dokument zeigt unverändert seine lokalen Stände. Der Namens-Dialog
beim Beitreten blockiert nichts (die Automation wies ihn ab — Dokument lädt,
nichts gemerkt, nächstes Mal wird wieder gefragt). 531 Frontend-Tests und
der Backend-`check` grün.
## D87 — Personen-Leiste mit Personen-Linse: eine Fläche für Filter und Belastung
Gewünscht: je `@`-Person die zuständigen Knoten hervorheben und alles andere
zuklappen — auch unter den explizit benannten Knoten —, dazu eine
Belastungsanzeige je Person. Zwei Bedienideen standen im Raum (Menü-Knopf im
Diagramm-Kopf oder die Namens-Pillen als Leiste unterm Diagramm); die
Entscheidungen fielen als Multiple-Choice-Runde:
**Die Leiste, nicht der Knopf** — und der Ausschlag ist das zweite Feature:
Ein Kopf-Knopf wäre das zwölfte Element in einer dreimal zurechtgemessenen
Zeile (D47/D56/D75) und zeigte die Belastung erst hinter einem Klick. Die
Leiste trägt beides in einer Fläche — Pille, Balken, Tipp = Linse — und
erscheint **nur bei Dokumenten mit Tags**: Für tag-lose Pläne (auch den
mitgelieferten) kostet sie nichts.
**Die Linse ist die erste bewusst rein sichtbare Faltung.** D38 schreibt
Falten in den Text — richtig für „so wird dieses Dokument eröffnet", falsch
für „zeig mir Annas Arbeit": In einem geteilten Dokument (D76) ginge der
persönliche Filter als Textänderung an alle Mitschreiber. Die Linse nutzt
deshalb nur die Darstellung (Sitzungszustand wie die News-Vorführung, D58);
Hand-Faltungen währenddessen bleiben in einer eigenen Überlagerung
(`lensOverrides`), der Falt-Durchschalter beendet die Linse (er arbeitet auf
dem Text-Zustand), und die Reihum-Prüfung des Durchschalters ruht solange —
sonst würfe der Linsen-Zustand die Position um, obwohl der Text unverändert
ist. **Export und Druck folgen ihr trotzdem** (Nutzer-Entscheidung): Die
D38-Regel „exportiert wird die sichtbare Struktur, eingeklappte Knoten tragen
▸ n" gilt wie überall — „Annas Sicht als Bild teilen" funktioniert damit von
selbst.
**Die Falt-Regel (`personFoldSet`, headless in model.js):** Zu klappt, wer
den Tag **selbst trägt** (das „▸ n" vertritt das Paket — mit der
D71-Vererbung ist alles darunter ohnehin dessen) und wer in seinem Teilbaum
**gar nichts** von der Person hat; offen bleiben genau die Vorfahren-Pfade.
Der interessante Fall ist getestet: Ein fremd getaggtes Paket, das tief innen
einen Knoten der gesuchten Person enthält, bleibt **offen** — die eigenen
Tags eines Knotens entscheiden nur über ihn, nicht über den Pfad hindurch.
Nicht faltbare Blatt-Geschwister auf offenen Pfaden bleiben sichtbar —
dieselbe Eigenschaft wie beim `path`-Preset (D75); welche Knoten gemeint
sind, sagt die **petrol gefärbte Pille** der Person (die Engpass-Warnfarbe
gewinnt: eine Warnung wiegt schwerer als eine Auswahl).
**„Ohne Zuständigen" ist ein eigener, klickbarer Eintrag** (gestrichelte
Pille — ein Loch, keine Person): Die Anteile summieren damit ehrlich auf
100 % (D71: Unzugewiesenes verwässert sie ohnehin), und seine Linse zeigt,
wofür noch niemand eingeteilt ist — jeder Knoten mit **eigenen** Tags klappt
zu, die Grenze ins zugewiesene Gebiet. Für Unzugewiesen taugt die
Personen-Regel nicht: „kein Tag" ist vorfahren-abgeschlossen (die Wurzel
wäre ihr eigener äußerster Vertreter), die Grenz-Formulierung ist die
tragfähige Umkehrung.
**Belastung: Anteile, keine absoluten Zahlen** (Nutzer-Entscheidung). Die
Größen sind ordinal (D46) — jede Summe ist eine Näherung, und eine Punktzahl
suggerierte Präzision, die die Schätzskala nicht hat. Gerechnet wird mit dem
vorhandenen D71-Maß (`assigneeLoads`: Marginalkosten der offenen Pfad-Arbeit,
Vererbung, geteilte Beiträge) — **eine** Kostenrechnung im System, Warnung
und Anzeige sagen dieselbe Zahl. Bei ausgeschaltetem Pfad-Umschalter wird der
Pfad eigens gerechnet (die D75-Linie: die Frage gilt dem Pfad, nicht seiner
Anzeige); die Bernstein-Färbung der Engpass-Person bleibt dagegen am
sichtbaren Pfad und färbt auch die Leisten-Pille.
**Eine Person zur Zeit** (Nutzer-Entscheidung): Tipp wechselt, zweiter Tipp
auf dieselbe schaltet aus — Mehrfachauswahl kann später dazukommen, umgekehrt
nicht. Die Linse erlischt von selbst, wenn es die Person (oder überhaupt
Tags) im Dokument nicht mehr gibt, und beim Dokumentwechsel
(`loadActiveIntoEditor`, die eine Stelle aus D80).
**Nebengewinn, notiert:** SPEC §11 reserviert `&tag` ausdrücklich bis zum
ersten Konsumenten — „Filter-/Hervorheben-Linse" ist dort wörtlich genannt.
Diese Linse baut genau die Mechanik; Schlagworte bekämen sie später
geschenkt.
**Nachgemessen** im Browser an einem Tag-Plan (anna/ben, elf Knoten): Leiste
ben 50 % · anna 21 % · ohne Zuständigen 29 % (Summe 100). Annas Linse:
`Backend` und `Frontend` als „▸ 2", `Infra` offen mit ihrem CI-Blatt, beide
anna-Pillen petrol, Text byte-identisch. Bens Linse hält annas Backend
**offen** (sein API liegt darin). Hand-Faltung während der Linse ändert den
Text nicht; Ausschalten stellt den textdefinierten Zustand wieder her;
Unzugewiesen-Linse klappt genau die getaggten Pakete zu. Tag-loses Dokument:
keine Leiste. 538 Tests, davon 7 neue in `tests/lens.test.js`.
+35
View File
@@ -760,6 +760,41 @@ Termine sagt die Warnung nichts (das tut in dieser Notation ohnehin nichts,
keine Pille und damit keine Färbung. Bei ausgeschaltetem Pfad entfällt
beides — ohne Pfad gibt es keine offene Front.
### Personen-Leiste und Personen-Linse
Trägt das Dokument `@`-Tags (§7), steht unter dem Diagramm eine **Leiste mit
einer Pille je Person** samt **Belastungs-Balken**: ihr Anteil an der offenen
Arbeit des günstigsten Pfads — dasselbe Maß wie der Zuständigen-Engpass
(oben), mit Vererbung und geteilten Beiträgen; die Bernstein-Färbung der
Engpass-Person erscheint auch hier. Angezeigt werden **Anteile, keine
absoluten Zahlen** — die Größen sind ordinal, jede Summe ist eine Näherung.
Der Rest **ohne Zuständigen** bekommt einen eigenen, gestrichelten Eintrag,
damit die Anteile auf 100 % summieren. Gerechnet wird auch bei
ausgeschaltetem Pfad-Umschalter (wie die `path`-Voreinstellung des
Falt-Durchschalters: die Frage gilt dem Pfad, nicht seiner Anzeige). Ohne
Tags gibt es die Leiste nicht.
Ein **Tipp auf eine Pille schaltet die Personen-Linse**: Sichtbar bleiben nur
die Vorfahren-Pfade zu den Knoten dieser Person; die getaggten Knoten selbst
stehen **eingeklappt** da — ihr „▸ n“ vertritt das Paket, und mit der
Vererbung ist alles darunter ohnehin ihres. Ihre Personen-Pillen an den
sichtbaren Knoten färben sich petrol (die Engpass-Warnfarbe gewinnt). Nicht
faltbare Geschwister auf offenen Pfaden bleiben stehen — dieselbe
Eigenschaft wie bei der Pfad-Voreinstellung des Falt-Durchschalters. Der
Eintrag „ohne Zuständigen“ zeigt als Linse die Struktur, deren Arbeit
niemandem gehört: Jeder Knoten mit eigenen Tags klappt zu. Ein zweiter Tipp
hebt die Linse auf, ein Tipp auf eine andere Person wechselt; es gilt
höchstens eine zugleich.
Die Linse ist **reine Ansicht und Sitzungssache**: Anders als das Falten (§9,
`>`/`<`) schreibt sie **nichts** in den Text — in einem geteilten Dokument
(`?live=`) ginge der persönliche Filter sonst als Textänderung an alle.
Hand-Faltungen während der Linse bleiben ebenso in der Sitzung;
Dokumentwechsel und Neuladen setzen zurück, der Falt-Durchschalter beendet
die Linse (er arbeitet auf dem Text-Faltzustand). **Grafikexport und Druck
folgen der sichtbaren Faltung** wie überall — „die Sicht einer Person als
Bild teilen“ funktioniert damit von selbst; die Leiste selbst erscheint in
beiden nicht.
### 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
+18
View File
@@ -87,6 +87,9 @@
- [^] #ed.fold.write: Folding writes the mark back into the text (S) %% one undo step
- [^] #ed.fold.preset: The fold button cycles through four presets (S) %% M-and-smaller, off-path, all, none — see D44/D75
+ [?] #ed.textfold: Fold regions in the text editor, next to the line numbers %% view-only, unrelated to the > marks; not sized yet
- [x] #ed.lens: A people bar with a person lens (M)
- [x] #ed.lens.fold: One person's nodes, everything else folds (S) %% view-only, never written into the text
- [x] #ed.lens.load: A load bar per person, shares of the open path work (S) %% the D71 measure
- [^] #ed.snaps: Earlier states of a document, every ten minutes (S) %% only when something changed
- [^] #ed.snaps.manual: Save a state by hand, before a larger change (XS) %% ten minutes is the wrong beat for that moment
- [^] #ed.files: Open and save .werkbaum files (S)
@@ -619,6 +622,21 @@
lines, so this hinges on the parked editor-rebuild question (CodeMirror,
D76); deliberately not sized yet.
#ed.lens
A bar below the diagram, one pill per @person, shown only when the
document carries tags at all. Tapping a pill filters the diagram to that
person's work; an extra entry shows what is assigned to nobody.
#ed.lens.fold
The lens keeps only the ancestor paths to the person's nodes open; their
tagged packages stand collapsed. Deliberately view-only: written fold
marks would push a personal filter to everyone in a shared document.
#ed.lens.load
Each pill carries a bar with the person's share of the open work on the
cheapest path — the same measure as the bottleneck warning, shares
rather than absolute numbers because the sizes are ordinal.
#ed.snaps
A safety net against mishaps: the text is put aside every ten minutes, but
only when it differs from the last one kept, and the last twenty are offered