Entwurf · Issue ea06505
Eine Spalte, ein Name
Entwurf zu Issue ea06505, zu docs/plans/ea06505-one-name-one-column.md. Die Tabellen unten rufen boardColumns beim Rendern auf. Die rechte Spalte markiert jede doppelte Überschrift und jeden doppelten slug — solange dort etwas steht, ist die Regel dieses Kapitels verletzt. Damit ist die Tabelle eine Prüfung und kein Bild.
Das Board zeigt zwei Spalten mit der Überschrift Done nebeneinander, und sie bedeuten Verschiedenes. Die eine sagt „jemand hat diese Karte als fertig etikettiert“, die andere „dieses Issue ist geschlossen“. Beide heißen gleich, und beide tragen denselben slug — den React-Key, unter dem das Kanban jedes Panel rendert.
Die Frage ist nicht, welche der beiden umbenannt gehört, sondern woraus eine Spalte gelesen wird.
01Zwei Spalten, ein Name
boardColumns baut drei Dinge hintereinander: die vier bekannten Spalten, dann für jeden col/-slug, den eine offene Karte erfindet, eine eigene, und zuletzt eine Spalte mit allen geschlossenen Issues. done steht nicht in der bekannten Liste. Eine offene Karte mit col/done erfindet sich also ihre eigene Spalte, und der Titel, den sie bekommt, ist slug.charAt(0).toUpperCase() + slug.slice(1) — genau „Done“.
| Spalte | slug | gelesen aus | Kollision |
|---|---|---|---|
| Backlog | backlog | dem Label col/backlog | — |
| Todo | todo | dem Label col/todo | — |
| Doing | doing | dem Label col/doing | — |
| Done | done | dem Label col/done | — |
| Qa | qa | dem Label col/qa | — |
| Closed | closed | dem Zustand des Issues | — |
Nichts davon ist neu. Sichtbar geworden ist es, als die Sprint-Regel die echte Done-Spalte auf dem laufenden Board geleert hat und die erfundene als einzige mit Karten darin übrigblieb.
02Die letzte Spalte war nie eine col/-Spalte
Das ist der ganze Fehler, und die Umbenennung folgt daraus. Jede andere Spalte ist der Ort, an den ein Label eine Karte stellt; die letzte ist der Ort, an dem der Zustand des COB sie zurücklässt. Ein Board, das eine abgeleitete Spalte nach der Label-Grammatik benennt, lädt ein Label dazu ein, sie zu beanspruchen — und genau das ist passiert.
- Die letzte Spalte heißt
closed/ „Closed“. Das ist das Wort, wie der Zustand wirklich heißt, und es lässt sich nicht mit der Behauptung eines Menschen verwechseln. - Ein Label darf keine abgeleitete Spalte beanspruchen. Eine offene Karte mit
col/closedbehält das Label als gewöhnliches Label und steht im Backlog. Das ist keine neue Regel: dieselbe gilt schon für einplan/-Label, das die Grammatik nicht kennt, fürcycle/2026-14und fürplan/approvedohne Plan im Baum — eine Behauptung zu schlucken, die das Board nicht belegen kann, macht aus einem Tippfehler stillschweigend einen Zustand. col/donewird wieder ein gewöhnliches Label. Eine offene Karte damit steht in einer erfundenen Spalte „Done“ neben „Closed“ und sagt das einzig Wahre, das zu haben ist: jemand hat das als fertig markiert, das Issue ist offen. Nichts geht verloren und nichts wird geraten — der Grund, warum das besser ist, alsdonezu reservieren und die Karte ins Backlog fallen zu lassen, wo sie wie „nicht begonnen“ läse.
| Karte | Zustand | Label | steht in |
|---|---|---|---|
| Board zeigt eine Seite | offen | col/done | Done |
| Kontoblock | geschlossen | — | Closed |
| Leser prüfen Signaturen | offen | col/todo | Todo |
| SED-PROBE | offen | col/qa | Qa |
03Eindeutigkeit als Eigenschaft der Funktion
Zwei Spalten mit demselben Namen sind nicht deshalb weg, weil die eine Karte, die das heute auslöst, verschwunden ist. col/Done und col/done wären morgen wieder zwei Panels mit derselben Überschrift. Die col/-slugs werden deshalb klein gelesen, und der Test behauptet die Invariante über die ganze Spaltenmenge — keine zwei teilen sich Titel oder slug — statt die eine Kollision zu prüfen, die es gerade gibt.
Das Kanban hängt an derselben Unterscheidung: der Schnellzugang im Fuß jeder Spalte fehlt dort, wo geschlossene Issues stehen, denn ein Issue wird offen geboren. Diese Ausnahme folgt dem slug der abgeleiteten Spalte, nicht dem Wort „done“.