feat(notation): Schlagworte &tag gebaut — taiga.<slug> benennt das Projekt je Teilbaum, vererbt (SPEC §1, D91)

SPEC zuerst: §1 Schritt 5b samt Block und Referenz-Regex, §11 auf
'umgesetzt' umgestellt; llms.md nachgezogen. Parser extrahiert
alleinstehende &-Token als node.marks (Zitier-Konvention gilt),
taigaSlugs() in model.js vererbt das taiga.*-Schlagwort wie die
@-Tags beim Engpass. Sichtbar im Tooltip und aria-label (a11yMarks,
9 Sprachen). Plan-Labels mit &-Erwähnungen eingeklammert; 12 neue
Tests, Gegenprobe: ohne Alleinstehend-Anker fallen genau die zwei
Zitier-Tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-27 16:20:03 +02:00
co-authored by Claude Fable 5
parent c712e81970
commit 5a18505571
9 changed files with 207 additions and 42 deletions
+1
View File
@@ -19,6 +19,7 @@ reverse.
## 2026-08-27
- Free `&tag` keywords are part of the notation now: free-standing only, quoted mentions like `(&taiga.slug)` stay labels — and `&taiga.slug` names the Taiga project of a subtree, inherited downwards
- Plans spanning several Taiga projects: a `&taiga.slug` tag names the project per subtree, inherited downwards — the first consumer of the reserved free tags, recorded as planned
- Creating Taiga tickets from nodes recorded as planned: a story per node from the node window, sub-packages as tasks picked in a dialog, through a backend proxy — the ref lands in the line as `#US-123`/`#T-1234`, beside the node id
- The unassigned pill in the people bar shows each language's short form now — German `N.N.`, English `TBD` — with the long wording in the tooltip
+40 -20
View File
@@ -7,7 +7,7 @@ Syntaxänderungen werden zuerst hier dokumentiert, dann implementiert.
## 1. Zeilenformat
```
[Einrückung][Zeichen] [Statusbox] [Faltmarke] Label (Größe) URL @tag … !!! %% Kommentar
[Einrückung][Zeichen] [Statusbox] [Faltmarke] Label (Größe) URL @tag &tag … !!! %% Kommentar
```
Alle Bestandteile außer dem Label sind optional. Die Extraktion erfolgt in
@@ -24,6 +24,7 @@ dieser Reihenfolge (wichtig für Kollisionsfreiheit):
Groß-/Kleinschreibung egal (siehe unten). Frühere Vorkommen bleiben im
Label stehen.
5. Tags: alle `@name`-Vorkommen.
5b. Schlagworte: alle alleinstehend angesetzten `&name`-Token (siehe unten).
6. Knoten-ID: das **erste** alleinstehend angesetzte `#name`-Token (siehe unten).
7. Abhängigkeiten: alle alleinstehend angesetzten `:#a,#b`-Token (siehe unten).
8. Fokusmarke: `!!!` als **alleinstehendes** Token (siehe unten).
@@ -99,6 +100,30 @@ Referenz-Regex (Schritt 1b, geprüft auf der kommentarfreien Zeile):
(Bis D68 galt das **erste** Token; die Umkehrung trifft nur Zeilen mit
mehreren Kandidaten.)
**Schlagworte `&tag`** — freie Schlagworte quer zur Hierarchie (die ID benennt
genau einen Knoten, ein Schlagwort eine **Menge**); das erste ausgewertete ist
das **Taiga-Projekt-Schlagwort** (§11, D91-Nachtrag 3):
- Zeichenmenge wie bei `@name` (§7): Unicode-Buchstaben, Ziffern, `.`, `_`,
`-`. Mehrere pro Zeile möglich, Position im Text egal.
- Erkannt nur **alleinstehend angesetzt** (`(^|\s)&…`): „R&D“ und
„Drag & Drop“ bleiben damit gewöhnliche Labels, und die Zitier-Konvention
gilt auch hier — `(&taiga.slug)` bleibt Label.
- Schlagworte gehören **nicht** zum Label. Sichtbar sind sie im
Knoten-Tooltip und im `aria-label`; eine eigene Diagramm-Darstellung haben
sie nicht.
- Semantik trägt allein das Präfix **`taiga.`**: `&taiga.<projekt-slug>`
benennt das Taiga-Projekt, zu dem der Teilbaum gehört, und **vererbt sich**
auf die Nachkommen wie die `@`-Tags beim Zuständigen-Engpass (§7/§9) — der
nächste Vorfahr mit einem `taiga.*`-Schlagwort gewinnt, ein eigenes am
Knoten übersteuert; trägt eine Zeile mehrere, gilt das **erste**. Konsument
ist die Ticket-Anlage (§11): Der Projekt-Dialog wird damit vorbelegt, und
die erste Anlage in einem Teilbaum ohne Zuordnung schreibt das Schlagwort
zurück.
- Alle übrigen Schlagworte sind **frei** und haben (noch) keinen Konsumenten.
Sie sagen nichts über Fortschritt (§4) oder Notwendigkeit (§3) und ändern
weder Kosten noch Warnungen.
**Knoten-ID `#name`** — benennt einen Knoten im **ganzen Dokument** eindeutig;
sie ist die Adresse für Abhängigkeiten und Beschreibungsblöcke (§11).
@@ -223,6 +248,12 @@ bleibt stehen):
(^|\s)\((XXL|XS|XL|S|M|L)\)
```
Für die Schlagworte (Schritt 5b, alle Treffer):
```
(^|\s)&([\p{L}\p{N}._-]+)
```
Für die Knoten-ID (Schritt 6, nur der erste Treffer; die letzte Gruppe ist der
optionale Trenn-Doppelpunkt, der mit entfällt):
@@ -1318,26 +1349,15 @@ einem Tag aufgelöst. Siehe D91-Nachträge 2 und 3.
Freie Schlagworte liegen **nicht** mehr auf `#` — siehe `&tag` unten; damit
ist die frühere Dreifach-Rolle von `#` aufgelöst (D34).
### Schlagworte (`&tag`) — reserviert, bewusst ungebaut
### Schlagworte (`&tag`)
- `&tag` — freies Schlagwort: benennt eine **Menge** von Knoten quer zur
Hierarchie (die ID benennt genau einen). Mehrere pro Zeile, Position egal,
gleiche Zeichenmenge wie `@name` (§7: Unicode-Buchstaben, Ziffern, `.`,
`_`, `-`).
- Erkannt nur **alleinstehend** angesetzt (`(^|\s)&\w`, wie `!!!` in §1) —
„R&D“ und „Drag & Drop“ bleiben damit gewöhnliche Labels.
- **Niedrig priorisiert:** Ohne ein Feature, das Schlagworte auswertet
(Filter-/Hervorheben-Linse, Taiga-Label-Sync), sind sie nur Kommentare mit
Extra-Syntax — gebaut werden sie erst **zusammen mit** dem ersten solchen
Konsumenten. Bis dahin gilt allein: `&` nicht anderweitig vergeben.
- **Der erste Konsument ist festgelegt** (D91-Nachtrag 3): das
**Taiga-Projekt-Schlagwort**. `&taiga.<projekt-slug>` benennt das
Taiga-Projekt, zu dem ein Teilbaum gehört, und **vererbt sich** auf die
Nachkommen wie die `@`-Tags beim Zuständigen-Engpass (§7/§9) — der
nächste Vorfahr mit einem `taiga.*`-Tag gewinnt, ein eigener Tag am
Knoten übersteuert. Alle übrigen Schlagworte bleiben frei; die Syntax
wird zusammen mit der Ticket-Anlage gebaut, und die Zitier-Konvention
gilt auch hier (`(&taiga.slug)` bleibt Label).
Die **Schreibweise ist umgesetzt** — Definition jetzt in §1 (Zeichenmenge wie
`@name`, Alleinstehend-Regel, Zitier-Konvention, `taiga.*`-Vererbung); gebaut
zusammen mit der Ticket-Anlage, wie D91-Nachtrag 3 es festlegte. Der erste
Konsument ist das **Taiga-Projekt-Schlagwort** `&taiga.<projekt-slug>` (§1).
Alle **übrigen** Schlagworte bleiben frei und ohne Konsumenten — künftige
Auswerter (Filter-/Hervorheben-Linse, Label-Sync) sind weiterhin offen und
werden hier festgelegt, bevor sie gebaut werden.
### Nutzen je Knoten (`(M/9)`) — festgelegt, noch nicht gebaut
+3 -3
View File
@@ -12,9 +12,9 @@
- [^] #not.gates: And/or decomposition (S)
- [^] #not.opt: Optional nodes — neither required nor an alternative (S)
- [^] #not.id: Node IDs, (#auth:) before the title (S) %% often the ticket number, see SPEC §11
+ [ ] #not.tag: Free tags, &tag (M) %% first consumer found: the Taiga project tag, D91
- [?] #not.tag.lens: A lens: highlight every node tagged &x (S)
- [ ] #not.tag.project: (&taiga.slug) assigns the Taiga project, inherited (S)
+ [~] #not.tag: Free tags, (&tag) (M) %% first consumer found: the Taiga project tag, D91
- [?] #not.tag.lens: A lens: highlight every node tagged (&x) (S)
- [~] #not.tag.project: (&taiga.slug) assigns the Taiga project, inherited (S)
- [^] #not.dep: Dependencies across the tree, (:#auth,#api) (M)
- [^] #not.dep.status: They constrain the status, not when work may start (S)
- [^] #not.dep.eff: Effective status: intrinsic, plus what it depends on (S)