Files
werkbaum/docs/prs/2026-09-08-PR#6-kanban-anzeige.md
c6fd41a1bf
Deploy to GitHub Pages / build (push) Canceled after 0s
Deploy to GitHub Pages / deploy (push) Canceled after 0s
feat(kanban): Board als vierter Modus — Spalten aus den Boxen, Rollen aus Tags oder abgeleitet, Karten als Knoten (D98) (#6)
board.js rechnet headless Rollen (&epic/&story/&task, sonst aus
Schachtelung und Größe), Lanes aus den obersten Epics, Karten mit
Aufgabenzeilen und Status-Leiste; renderBoardHtml zeichnet, Karten und
Zeilen sind .node mit den Attributen des Baums. Nur Anzeige; Filter,
Zähler, Export und Drag&Drop folgen als eigene Teilpakete.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: mhoennig <michael@hoennig.de>
Reviewed-on: #6
2026-09-09 07:06:36 +02:00

132 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
> **Hinweis:** Dieses Dokument beschreibt nur die Änderung dieses PR.
> Es kann veraltet sein, sobald der nächste PR gemergt ist.
> Historische PR-Dokumentation wird nicht nachgepflegt — sie ist eine Momentaufnahme, keine aktuelle Doku.
## Das Problem
D98 hat die Kanban-Ansicht geplant; gebaut war nichts.
Das Risiko des Features ist das Kartenmodell — die Regel, nach der ein Baum beliebiger Tiefe zu Lanes, Karten und Aufgabenzeilen wird.
Die Regel muss stehen und am echten Plan stimmen, bevor sich das Zeichnen lohnt; und sie ist erst zu beurteilen, wenn man sie sieht.
## Nicht das Ziel
- Kein Umhängen im Baum durch Ziehen: Der Drop ändert die Statusbox, nie die Lane.
- Faltmarken wirken nicht auf das Board (Nutzer-Entscheidung); der Falt-Durchschalter ruht dort.
- Keine Änderung an den drei Baum-Modi.
## Die Szenarien
### Feature: Kanban-Board als vierter Modus
#### Szenario#6.01: Rollen ohne Schlagworte
Damit ein Plan ohne ein einziges Tag ein vollständiges Board ergibt.
- **Gegeben** `#fe` mit den Blättern `#fe.rel (S)`, `#fe.accounts (L)` und `#infra` mit dem Paket `#infra.db` und dem Blatt `#infra.decision`
- **Wenn** die Rollen abgeleitet werden
- **Dann** ist `#fe` eine Story mit allen Blättern als Tasks, `#infra` ein Epic, `#infra.db` eine Story und `#infra.decision` eine Task ohne Story
##### Nachgewiesen durch
- `tests/board.test.js`, Block „Rollen — abgeleitet aus Schachtelung und Größe“.
#### Szenario#6.02: Schlagworte übersteuern
Damit ein Autor die Ableitung dort korrigiert, wo sie rät.
- **Gegeben** `&story` an einem Knoten mit Enkeln, `&epic` an einem Knoten mit Blättern
- **Wenn** die Rollen abgeleitet werden
- **Dann** sind unter der Story alle Nachkommen Tasks, unter dem Epic alle Blätter Stories ohne Aufgaben
##### Nachgewiesen durch
- `tests/board.test.js`, Block „Rollen — Schlagworte übersteuern“.
#### Szenario#6.03: Spalten aus den Boxen, Lanes aus den obersten Epics
- **Gegeben** der Plan aus Szenario 1
- **Wenn** das Board gebaut wird
- **Dann** gibt es sieben Spalten (acht mit Verworfen-Filter), die Lane der Wurzel mit ihren direkten Stories zuerst, dann eine Lane je oberstem Epic; `[!]` steht in der `[ ]`-Spalte
##### Nachgewiesen durch
- `tests/board.test.js`, Blöcke „Spalten“ und „Lanes und Karten“; im Browser am HSAdmin-Plan: 7 Lanes, 62 Karten, 35 Aufgabenzeilen.
#### Szenario#6.04: Karten sind Knoten
Damit Cursor-Zeile, Knoten-Fenster und Sprünge ohne neue Verdrahtung gelten.
- **Gegeben** das Board mit der Story `#fe` und ihrer Aufgabenzeile `#fe.rel`
- **Wenn** der Cursor im Text auf der Zeile von `#fe.rel` steht bzw. eine Zeile geklickt wird
- **Dann** trägt die Aufgabenzeile die `current`-Hervorhebung bzw. öffnet das Knoten-Fenster mit ihren Fakten
##### Nachgewiesen durch
- `tests/board.test.js`, Block „renderBoardHtml“ (`data-line`/`data-tip` an Karte, Zeile und Lane-Titel).
- Browser: `node brow st-arbeit current pulse` an `#fe.rel`; echter Klick auf `#fe.accounts` öffnet `#fe.accounts · planned`.
#### Szenario#6.05: Linse und Pfad filtern das Board
Damit die beiden vorhandenen Bedienelemente das Board bedienen, ohne eigene Filterleiste.
- **Gegeben** ein Plan mit `@`-Tags und ein günstigster Pfad
- **Wenn** eine Person in der Personen-Leiste gewählt ist bzw. der Pfad-Umschalter an ist
- **Dann** bleiben nur die Karten und Aufgabenzeilen der Person (mit Vererbung vom Paket) bzw. auf dem Pfad stehen; leere Lanes entfallen; die Spaltenköpfe zählen das Gezeigte samt ordinaler Größen-Spanne
##### Nachgewiesen durch
- `tests/board.test.js`, Blöcke „Filter — Personen-Linse“, „Filter — nur der günstigste Pfad“, „Zähler je Spalte“.
- Browser am HSAdmin-Plan: 50 Karten → Linse `@marc` 9 Karten in 3 Lanes; Kopf „no status 40 · S–L“.
#### Szenario#6.06: Status schreiben, nicht über die Aufgaben hinaus
Damit das Board ein Werkzeug ist und nicht nur eine Ansicht — ohne dass eine Story ihren Aufgaben davonläuft.
- **Gegeben** die Story `#fe` in `[~]` mit den Aufgaben `[~]`, `[~]`, `[ ]`
- **Wenn** die Karte in „planned“ gezogen oder in der Auswahl `[ ]` gewählt wird
- **Dann** steht `[ ]` in der Zeile und die Karte in der Spalte; „done“ nimmt die Karte nicht an und `~ / x ^` sind in der Auswahl gesperrt, bis die Aufgaben so weit sind
##### Nachgewiesen durch
- `tests/board.test.js`, Block „Aufgaben-Schranke“.
- Browser am HSAdmin-Plan: `data-ceil="1"`, gesperrte Einträge `~ / x ^`, Drop auf „done“ bernstein ohne Schreiben, Drop auf „idea“ schreibt `[?]`.
#### Szenario#6.07: Export und Druck zeigen das Board
Damit „die Sicht als Bild teilen“ auch für das Board gilt.
- **Gegeben** das Board mit Linse oder Pfad-Filter
- **Wenn** Kopieren, SVG oder PNG ausgelöst wird
- **Dann** enthält das Bild Kopfzeile, Lanes und die gezeigten Karten mit Status-Leiste und Aufgabenzeilen; Abweichungs- und ”-Marke fehlen
##### Nachgewiesen durch
- Browser am HSAdmin-Plan: SVG 1208 × 8248 px, 333 Rechtecke, 501 Texte, als Bild geprüft.
## Die Lösung
- `frontend/src/board.js` (neu, headless): `assignRoles`, `boardModel`, `columnOf`, `taskShares`, `filterBoard`, `columnStats`, `taskCeiling`, `statusAllowed`.
- `frontend/src/render.js`: `nodeDataAttrs` aus `nodeHtml` herausgelöst und mit `renderBoardHtml` geteilt; `gateWarnings`, damit `mixedGate` auch im Board gemeldet wird.
- `frontend/src/app.js`: Modus `kanban` in `applyLayout` (Neubau beim Wechsel, Falt-Knopf ausgegraut) und `render()` (Board-Zweig), Wächter in `drawDepLinks`, `cheap-on` nur im Baum, `LAYOUT_MODES` für den Mobil-Wähler; `boardToSvg()` und die Weiche `exportSvg()` für Kopieren/SVG/PNG.
- `index.html`: viertes Icon; `style.css`: Board-Regeln unter `#out.kanban`; i18n `modeKanban`/`boardNoStatus` × 9.
- SPEC §9 (neue Sektion) und §11 (Ableitung wie gebaut), `llms.md`, D98-Nachtrag, CHANGELOG, Plan-Knoten `#ed.kanban` samt allen sieben Teilpaketen und `#not.tag.roles` auf `[^]`.
Warum die Ableitung beim Bauen korrigiert wurde: Die D98-Fassung „Blatt ab M ist eine Story“ machte `#fe.accounts (L)` zur Story und damit `#fe` zum Epic — die Frontend-Karte zerfiel.
Jetzt zählt die Größe nur bei Blättern neben Paketen; ein Paket aus Blättern bleibt eine Karte.
## Offene Fragen
- Keine für diesen PR. Die Lane-Titel auf dem Telefon und die Breite der Spalten werden mit dem Filter-Teilpaket noch einmal angesehen.
## Weitere Änderungen
- Keine.
## Vorausgesetzte PRs
- PR#5 (Planung, D98).
## Folge-PRs
- Keine geplant; die Kanban-Ansicht ist mit diesem PR vollständig.