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“.

Spaltesluggelesen ausKollision
Backlogbacklogdem Label col/backlog—
Todotododem Label col/todo—
Doingdoingdem Label col/doing—
Donedonedem Label col/done—
Qaqadem Label col/qa—
Closedcloseddem 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/closed behält das Label als gewöhnliches Label und steht im Backlog. Das ist keine neue Regel: dieselbe gilt schon für ein plan/-Label, das die Grammatik nicht kennt, für cycle/2026-14 und für plan/approved ohne Plan im Baum — eine Behauptung zu schlucken, die das Board nicht belegen kann, macht aus einem Tippfehler stillschweigend einen Zustand.
  • col/done wird 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, als done zu reservieren und die Karte ins Backlog fallen zu lassen, wo sie wie „nicht begonnen“ läse.
KarteZustandLabelsteht in
Board zeigt eine Seiteoffencol/doneDone
Kontoblockgeschlossen—Closed
Leser prüfen Signaturenoffencol/todoTodo
SED-PROBEoffencol/qaQa

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“.