From c712e819709cde7b3cf7f9c85872fbab8589ed8f Mon Sep 17 00:00:00 2001 From: mhoennig Date: Thu, 27 Aug 2026 14:48:03 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20Mehrprojekt-Pl=C3=A4ne=20=E2=80=94=20&t?= =?UTF-8?q?aiga.slug=20erbt=20je=20Teilbaum,=20erster=20&tag-Konsument=20(?= =?UTF-8?q?D91-Nachtrag=203,=20SPEC=20=C2=A711)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- docs/CHANGELOG.md | 1 + docs/DECISIONS.md | 42 +++++++++++++++++++++++++++++++++ docs/SPEC.md | 13 +++++++++- docs/examples/werkbaum.werkbaum | 31 +++++++++++++++++------- 4 files changed, 77 insertions(+), 10 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 850b87d..a6fdb3d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -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 diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index cd5d3eb..fd568fa 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -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.` 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.` 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** (`#.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.` 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). diff --git a/docs/SPEC.md b/docs/SPEC.md index 55f06c7..e5310b6 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -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.` (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.` 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 diff --git a/docs/examples/werkbaum.werkbaum b/docs/examples/werkbaum.werkbaum index a8d8a5e..8d898b2 100644 --- a/docs/examples/werkbaum.werkbaum +++ b/docs/examples/werkbaum.werkbaum @@ -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