docs: Mehrprojekt-Pläne — &taiga.slug erbt je Teilbaum, erster &tag-Konsument (D91-Nachtrag 3, SPEC §11)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-27 14:48:03 +02:00
co-authored by Claude Fable 5
parent 4c98ec6603
commit c712e81970
4 changed files with 77 additions and 10 deletions
+1
View File
@@ -19,6 +19,7 @@ reverse.
## 2026-08-27
- 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
- `pull-doc --open` opens the fetched document in IntelliJ IDEA afterwards — also when nothing changed
+42
View File
@@ -7956,3 +7956,45 @@ ein Dokument theoretisch Refs aus **mehreren** Projekten mischen — und
`#US-123` ist nur je Projekt eindeutig. Der spätere Resolver braucht darum
eine Projekt-Zuordnung; praktisch gehört ein Plan zu einem Projekt, und die
Frage stellt sich erst bei `#trk.resolve`.
**Nachtrag 3 — Pläne über mehrere Taiga-Projekte: `&taiga.<slug>` erbt im
Teilbaum (2026-08-27).** Die in Nachtrag 2 benannte Grenze ist real
(Nutzer: „wir haben einige Werkbäume, die sich über mehrere Taiga-Projekte
erstrecken") und braucht eine Notationsantwort — außerhalb des Textes
gemerkt (localStorage, Server-Metadatum) bräche D14: In einem geteilten
Dokument müsste jeder dieselbe Zuordnung kennen. Entschieden
(Multiple-Choice):
**Das Schlagwort `&taiga.<projekt-slug>` am Wurzelknoten des jeweiligen
Teilbaums**, vererbt auf die Nachkommen wie die `@`-Tags beim
Zuständigen-Engpass (D71) — der nächste Vorfahr mit `taiga.*`-Tag gewinnt.
Refs bleiben damit überall kurz (`#US-123`), ein Ein-Projekt-Plan braucht
genau ein Tag, und es ist der **erste Konsument des reservierten `&tag`**
— SPEC §11 nennt „Taiga-Label-Sync" seit D34 wörtlich als möglichen
Anlass; die Schlagwort-Syntax wird also zusammen mit der Ticket-Anlage
gebaut (`#not.tag.project` im Plan, Abhängigkeit von
`#trk.create.project`). Alle übrigen `&`-Schlagworte bleiben frei — das
Werkzeug wertet nur das `taiga.`-Präfix aus.
**Verworfen:**
- **Slug im Ref-Token** (`#<slug>.US-123`) — keine neue Syntax und jede
Zeile für sich eindeutig, aber lange Tokens an jeder Ticket-Zeile, auch
in Plänen mit nur einem Projekt.
- **Slug nur bei Bedarf** — zwei Formen nebeneinander und eine stille
Umschreib-Frage, sobald das zweite Projekt später dazukommt.
- **Resolver probiert alle Projekte** (`by_ref` über die Mitgliedschaften)
— bei Nummern-Kollisionen zwischen Projekten schlicht mehrdeutig, und
ein Leser ohne Login rät.
**Der Anlege-Dialog wird vorbelegt und schreibt zurück** (revidiert das
„blind fragen" aus dem Haupttext): Gefragt wird weiterhin bei jeder
Anlage, aber mit dem geerbten Projekt vorausgewählt; die **erste** Anlage
in einem Teilbaum ohne Zuordnung schreibt `&taiga.<slug>` an den Knoten
zurück — undo-fähig wie die Ref, über dieselbe Maschinerie. Die
Zuordnung entsteht so beim Arbeiten von selbst, statt gepflegt werden zu
müssen.
An `llms.md` ändert sich weiterhin nichts — die Syntax ist reserviert und
ungebaut; nachgezogen wird sie, wenn `&tag` wirklich gebaut wird
(SPEC §13).
+12 -1
View File
@@ -1311,7 +1311,10 @@ laufen **je Projekt** fortlaufend über alle Typen, das Präfix trägt den Typ,
den die Auflösung braucht). Die Ref wird **zusätzlich zur Knoten-ID** als
eigenes Token an die Zeile geschrieben: Mit vorhandener ID bleibt sie
Ticket-Referenz im Label (§1: nur das erste `#`-Token ist die ID), ohne ID
wird sie von selbst die ID. Siehe D91-Nachtrag 2.
wird sie von selbst die ID. Erstreckt sich ein Plan über **mehrere**
Taiga-Projekte, benennt das Schlagwort `&taiga.<slug>` (unten) das Projekt
je Teilbaum — eine Ref wird gegen das Projekt des nächsten Vorfahren mit so
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).
@@ -1327,6 +1330,14 @@ ist die frühere Dreifach-Rolle von `#` aufgelöst (D34).
(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).
### Nutzen je Knoten (`(M/9)`) — festgelegt, noch nicht gebaut
+22 -9
View File
@@ -12,8 +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) %% only together with a consumer, see D34
+ [ ] #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)
@@ -25,7 +26,7 @@
- [^] #not.desc.long: A long block at the end, addressed by its id (S) %% behind a --- separator
- [^] #not.sizes: Size conflict — sub-packages must fit the given size (S) %% ranges, XXL open-ended, see D62
- [-] #not.store: A separate storage format for the structure (L) %% the text is the format
- [ ] #not.ticket: Ticket references (#123,#US-123) (S) %% Taiga writes #US-123 for a user story
- [ ] #not.ticket: Ticket references (#US-123,#T-1234) (S) %% Werkbaum writes the US-/T- prefixes itself
- [^] #not.llms: llms.md, the notation explained to AI agents (S)
- [^] #not.llms.index: llms.txt, the signpost that points at it (XS) %% the convention wants an index, not the content
- [ ] #not.benefit: Benefit per node: a 0-9 digit in the size token (M) %% (M/9), benefit alone as (/7) — see SPEC §11
@@ -204,9 +205,10 @@
- [ ] #trk.resolve.read: Read title, link and status (S)
- [ ] #trk.resolve.map: Map the workflow onto the states (S)
- [?] #trk.write: Write the status back (M) :#trk.resolve
- [ ] #trk.create: Create tickets from nodes (L)
- [ ] #trk.create: Create tickets from nodes (XL)
- [ ] #trk.create.proxy: Backend proxy with named endpoints (M)
- [ ] #trk.create.login: Log in to Taiga, token stays in the browser (S) :#trk.create.proxy
- [ ] #trk.create.project: The project comes from the inherited tag (S) :#not.tag.project
- [ ] #trk.create.story: A "create story" action in the node window (S) :#trk.create.login
- [ ] #trk.create.tasks: Sub-packages become tasks, picked in a dialog (M) :#trk.create.story
- [ ] #trk.create.ref: The ref lands in the line beside the id (S) :#trk.create.story
@@ -273,14 +275,20 @@
#not.tag
A tag names a set of nodes across the tree, whereas the tree itself is
exactly one decomposition. Reserved but deliberately unbuilt: with nothing
to evaluate them, tags are only comments with extra syntax.
exactly one decomposition. Long reserved but unbuilt — tags without a
consumer are only comments with extra syntax; the first consumer is now
the Taiga project tag below, so the syntax gets built with it (D91).
#not.tag.lens
The consumer that would justify tags: pick one and let everything else
recede. The mechanics already exist — the cheapest path dims unneeded nodes
in exactly that way.
#not.tag.project
A tag of the form (&taiga.slug) names the Taiga project a subtree belongs
to, inherited downwards like people tags in the bottleneck rule — plans
that span several projects tag each subtree once, refs stay short.
#not.dep
A node may need nodes outside its own subtree. That is the one thing a pure
tree cannot express, and everything below this node follows from it.
@@ -336,8 +344,8 @@
#not.ticket
A reference into a tracker. Which token counts as a ticket comes from the
connected tracker's own pattern rather than from guessing at its shape,
which is why this waits for the tracker work.
connected tracker's pattern — for Taiga fixed as US-/T- plus number,
prefixes written by Werkbaum itself since Taiga only counts per project.
#not.llms
An English short form of the specification, served at the site root, so an
@@ -1169,8 +1177,8 @@
proxy once at login and is never logged.
#trk.create.story
"Create story" in the node window: pick the project from your list — asked
on every creation, so nothing stale is remembered — and the story is
"Create story" in the node window: confirm the project — asked on every
creation, prefilled from the inherited project tag — and the story is
created. A node that already carries a ticket ref is left alone.
#trk.create.tasks
@@ -1179,6 +1187,11 @@
children plus the realized alternatives of a |/= group; discarded ones
never appear, finished ones start unchecked.
#trk.create.project
The dialog's project choice is prefilled from the nearest (&taiga.slug)
tag up the tree, and the first creation in a subtree without one writes
the tag back, undoable — the assignment grows out of the work itself.
#trk.create.ref
The returned ref is appended to the line as an extra token — #US-123 for
stories, #T-1234 for tasks, prefixes written by Werkbaum since Taiga's own