A reserved key comes to life — the card window's sidebar grows a Labels section, and labels stops being somebody else's

`labels` has been a reserved tracker key since the rewrite: preserved verbatim, never
interpreted, drawn only as an anonymous row in the Details section beside `assignees` and
`due`. The owner's cards claim it for first-party use, so it joins the schema — read
leniently (a list of names, a bare scalar coercing to one, a mapping malformed and
preserved), written canonically (a quoted flow list in the order the user arranged, no
auto-sort), and removed outright when the last label goes, the way an expanded lane drops
`collapsed`.

Identity is case-insensitive and display is case-preserving, so a card carries `bug` once
however many ways the board spells it, and entries the reading cannot name ride through the
write untouched at the tail.

The section sits second, above Details — which is the point rather than a layout preference:
Details is where keys the app does *not* own are shown, and this key just stopped being one.
Rows rather than chips, because the sidebar is twenty-six characters wide. The add field
autocompletes against the board's own used-labels universe, derived from every live and
trashed card with no store beside the files, and says out loud when Return would mint a word
the board has never used.

Writes ride a `.relabel` operation of their own, because the commit composer has said
"Relabel card 'X'" since long before there was a control to press — and now the undo row says
it too.

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-09 12:06:01 -04:00
parent fd31ed24f4
commit da37ed61bf
24 changed files with 1928 additions and 29 deletions
+14
View File
@@ -55,6 +55,20 @@ public enum HistoryPhrase {
case reorder = "Reorder"
case rename = "Rename"
case restyle = "Restyle"
/// A card's `labels` list rewritten the sidebar's chips and the context menu's submenu
/// (`FrontmatterKeys.labels`, activated 2026-08-09; `BoardStore.setLabels(_:onCard:on:)`).
///
/// **Its own verb rather than `restyle`**, on `collapse`'s reasoning: the row has to read back
/// the gesture it undoes, and "Undo Restyle Card" after clicking a label would name a control
/// the user never touched. The word is 06-history-undo.md Commit messages' own for a change
/// to this key the composer has said "Relabel card 'X'" since before there was a control to
/// press (`ChangeNarrator`) so the menu row and the change journal now speak the same one.
///
/// **One verb for both directions**, unlike `collapse`/`expand`: adding and removing a label
/// are the same control pressed twice, where collapsing and expanding are two menu rows with
/// two words.
case relabel = "Relabel"
case resize = "Resize"
/// A lane folded to its slim strip (03-board-ui.md § Lane Collapsed lanes).
///