docs: D91-Nachtrag 5 — Ref-Umbruch und Strg+Klick-Öffnen festgehalten; #trk.create bestanden, #trk.open im Plan

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-27 17:28:36 +02:00
co-authored by Claude Fable 5
parent a22c320909
commit eae2ff1ef0
2 changed files with 67 additions and 1 deletions
+59
View File
@@ -8064,3 +8064,62 @@ ist der Weg nicht gemessen — dafür braucht es echte Zugangsdaten, und die
gibt niemand einem Werkzeug. Der Plan-Knoten `#trk.create` steht deshalb gibt niemand einem Werkzeug. Der Plan-Knoten `#trk.create` steht deshalb
auf `[/]` (funktionsbereit, Feinarbeiten offen) statt `[x]`: Der erste auf `[/]` (funktionsbereit, Feinarbeiten offen) statt `[x]`: Der erste
echte Login ist der Handtest, der noch aussteht. echte Login ist der Handtest, der noch aussteht.
**Nachtrag 5 — Ticket-Refs brechen nicht um und öffnen sich per Strg+Klick
(2026-08-27).** Zwei Nutzerwünsche nach dem bestandenen Handtest („anlegen
hat funktioniert" — `#trk.create` steht damit auf `[x]`, die
Nachtrag-4-Grenze ist gefallen):
**1. Eine Ref wie `#US-123` bricht im Knoten nie mehr mitten im Token um.**
Die Ursache lag nicht in `wrapLabel()` (das bricht nur an Leerzeichen, D64),
sondern im Browser: `max-width:32ch` misst die Ziffer „0", Buchstaben sind
breiter — eine zu breit geratene Zeile bricht er dann an jedem
**Bindestrich**, und aus der Ref wurde `#US-`/`123`. Der Renderer umspannt
freistehende Ref-Token im escapten Label deshalb mit einer `tref`-Spanne
(`white-space:nowrap`); die Zitier-Konvention bleibt gewahrt (`(#US-123)`
ist kein freistehendes Token), und `labelLines()` (Grafikexport) misst die
Textknoten der Spanne unverändert mit — nachgemessen: beide Refs stehen im
exportierten SVG als ganze Token. Gegenprobe per Mutation: ohne die Spanne
fallen genau die zwei danach benannten Zusicherungen.
**2. Strg+Klick öffnet die Ref im Taiga-Frontend** — im Text (freistehendes
Token, dieselben Ausschlüsse wie der Abhängigkeits-Sprung D67: Kommentar,
Beschreibungsteil, URL) und auf dem Knoten; Tastatur Strg+Enter. Die
Entscheidungen:
- **Die Web-Basis ist eine zweite Server-Konfiguration**
(`WERKBAUM_TAIGA_WEB_URL`, per `GET /info` als `taigaWeb` gemeldet, ohne
Schrägstrich am Ende): Sie ist aus der API-URL **nicht ableitbar** — bei
der Zielinstanz liegen Frontend und API auf verschiedenen Hosts
(Nachtrag 1). Kein Raten per Namenskonvention; fehlt sie, entfällt nur das
Öffnen, die Anlage funktioniert weiter. `deploy-backend.sh` zieht die
Zeile idempotent nach wie die API-URL.
- **Die URL trägt der Typ-Präfix aus**: `US-123``/project/<slug>/us/123`,
`T-…``/task/…` — genau die Auflösung, für die Werkbaum die Präfixe
schreibt (Nachtrag 2). Der Slug kommt vom nächsten Vorfahren mit
`&taiga.*`-Tag (§1); ohne Slug oder Web-Basis geschieht **still nichts**,
das D67-Idiom (eine unbekannte Dep-ID tut auch nichts).
- **Die Abhängigkeits-Lesart gewinnt:** In einem `:#…`-Token ist die Ref
nicht freistehend — dort bleibt Strg+Klick der Sprung zur Zeile (D67).
Erst wenn der nichts findet, wird die Ref versucht.
- **Das Knoten-Fenster trägt an Refs einen Öffnen-Knopf** statt der
Anlage-Knöpfe (die Ref ist der Idempotenz-Marker, es gibt dort nichts
anzulegen): der Weg auf Touch (kein Strg) und zugleich die
Auffindbarkeit der Geste (D25-Lehre). Ein i18n-Schlüssel
(`taigaOpenBtn`) in neun Sprachen; keine Erweiterung von `hint_jump`
der sichtbare Knopf sagt mehr als eine weitere Legendenzeile.
- **Auf einem Link-Knoten ohne Taiga-Adresse bleibt der Browser-Default**
(Strg+Klick öffnet die Knoten-URL im Hintergrund-Tab): `preventDefault`
nur, wenn wirklich ein Ticket geöffnet wird.
**Nachgemessen** im Browser gegen ein lokales Backend
(`taigaWeb: https://plan.example.test`): tref-Spannen `nowrap`, je genau
eine Zeile; der Fenster-Knopf öffnet `/project/mi-kunde/us/123`, Strg+Klick
auf den Task-Knoten `/task/4567`; im Text öffnen Klick und Strg+Enter, die
Abhängigkeit springt weiter (kein Öffnen), Kommentar/neutral bleiben still;
Knoten ohne Ref zeigen unverändert die Anlage-Knöpfe. 576 Frontend-Tests
(12 neue), Backend-`check` grün. Werkzeug-Lehre am Rande: In einem
gestapelten Prüfskript setzte der Sprung aus dem Vor-Schritt die Auswahl
asynchron neu und ließ den Tastaturweg scheinbar die falsche URL öffnen —
isoliert wiederholt stimmt sie; dieselbe Zustandsvermischung wie beim
Nachtrag-4-Bau.
+8 -1
View File
@@ -205,13 +205,14 @@
- [ ] #trk.resolve.read: Read title, link and status (S) - [ ] #trk.resolve.read: Read title, link and status (S)
- [ ] #trk.resolve.map: Map the workflow onto the states (S) - [ ] #trk.resolve.map: Map the workflow onto the states (S)
- [?] #trk.write: Write the status back (M) :#trk.resolve - [?] #trk.write: Write the status back (M) :#trk.resolve
- [/] #trk.create: Create tickets from nodes (XL) - [x] #trk.create: Create tickets from nodes (XL)
- [^] #trk.create.proxy: Backend proxy with named endpoints (M) - [^] #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.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.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.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.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 - [^] #trk.create.ref: The ref lands in the line beside the id (S) :#trk.create.story
- [x] #trk.open: Open a ticket ref in Taiga (S) :#trk.create.ref,#not.tag.project
- [-] #trk.plugin: A plugin inside Taiga itself (L) %% legacy frontend, self-hosted only - [-] #trk.plugin: A plugin inside Taiga itself (L) %% legacy frontend, self-hosted only
= [?] #trk.tenzu: Tenzu, the successor (XXL) https://tenzu.net = [?] #trk.tenzu: Tenzu, the successor (XXL) https://tenzu.net
= [ ] #trk.none: No tracker, plain text is enough (XS) = [ ] #trk.none: No tracker, plain text is enough (XS)
@@ -1164,6 +1165,12 @@
live inside them — so a story per node, and tasks only under a node that live inside them — so a story per node, and tasks only under a node that
already carries a story. Decisions in D91. already carries a story. Decisions in D91.
#trk.open
Ctrl+click on a ticket ref — in the text or on its node — opens the
ticket in Taiga's web UI; the node window carries an open button, the way
on touch. Needs the instance's web address (server configuration,
reported by /info) and the inherited &taiga.slug project (D91-Nachtrag 5).
#trk.create.proxy #trk.create.proxy
A few named endpoints in the Werkbaum backend (auth, projects, user A few named endpoints in the Werkbaum backend (auth, projects, user
stories, tasks) relay to the Taiga instance configured server-side. No stories, tasks) relay to the Taiga instance configured server-side. No