docs: D91-Nachtrag 4 — Bau-Entscheidungen der Taiga-Anlage festgehalten
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
d1de8758b1
commit
3ab931d50e
@@ -7998,3 +7998,69 @@ müssen.
|
|||||||
An `llms.md` ändert sich weiterhin nichts — die Syntax ist reserviert und
|
An `llms.md` ändert sich weiterhin nichts — die Syntax ist reserviert und
|
||||||
ungebaut; nachgezogen wird sie, wenn `&tag` wirklich gebaut wird
|
ungebaut; nachgezogen wird sie, wenn `&tag` wirklich gebaut wird
|
||||||
(SPEC §13).
|
(SPEC §13).
|
||||||
|
|
||||||
|
**Nachtrag 4 — gebaut; die Entscheidungen des Baus (2026-08-27).** D91 ist
|
||||||
|
umgesetzt: die `&tag`-Notation samt `taiga.*`-Vererbung (SPEC §1, Parser,
|
||||||
|
`taigaSlugs()` in model.js, llms.md nachgezogen), der Backend-Proxy
|
||||||
|
(`/api/v1/taiga/*`: auth, projects, userstories, tasks — API First,
|
||||||
|
`de.werkbaum.integration.taiga`) und die beiden Aktionen im Knoten-Fenster
|
||||||
|
samt Login-, Projekt- und Häkchen-Dialog (Regeln headless in
|
||||||
|
`frontend/src/taiga.js`). Was beim Bauen zu entscheiden war:
|
||||||
|
|
||||||
|
- **Das Token reist im Header `X-Taiga-Token`, nicht in `Authorization`.**
|
||||||
|
Einen Header-Parameter namens `Authorization` müssen OpenAPI-Werkzeuge
|
||||||
|
laut Spezifikation ignorieren — die generierte Signatur verlöre ihn —,
|
||||||
|
und der Name kollidierte mit dem Basic-Auth des Master-Passworts. Der
|
||||||
|
Proxy setzt daraus den `Authorization: Bearer …` der Weiterleitung; in
|
||||||
|
CORS ist der Header freigegeben.
|
||||||
|
- **Taiga-Fehler werden durchgereicht, nicht übersetzt.** 4xx samt Taigas
|
||||||
|
`_error_message` (die Instanz meldet falsche Zugangsdaten als **400**),
|
||||||
|
fremde 5xx und Netzfehler als 502, unkonfiguriert als 503 — und
|
||||||
|
`GET /info` meldet `taiga: true/false`, damit der Editor die Aktionen
|
||||||
|
nur zeigt, wo sie funktionieren (Lebendprobe-Muster, D81-Nachtrag; je
|
||||||
|
Basis einmal gefragt und gecacht).
|
||||||
|
- **Stub statt WireMock.** backend/CLAUDE.md nannte WireMock; gebaut sind
|
||||||
|
die Tests gegen aufgezeichnete Antwortformen auf dem JDK-eigenen
|
||||||
|
`HttpServer` — dieselbe Zusicherung (nie gegen Live-Instanzen), keine
|
||||||
|
neue Test-Abhängigkeit. CLAUDE.md ist entsprechend fortgeschrieben.
|
||||||
|
Beim E2E-Stub in Python die passende Falle gefunden: Der JDK-HttpClient
|
||||||
|
sendet Bodies **chunked**, ein Stub, der nur `Content-Length` liest,
|
||||||
|
sieht `{}` — und der Fehler sah aus wie ein kaputter Proxy.
|
||||||
|
- **Das Schlagwort wird auch bei ABWEICHENDER Wahl zurückgeschrieben** —
|
||||||
|
D91-Nachtrag 3 nannte nur den Teilbaum „ohne Zuordnung". Wer im Dialog
|
||||||
|
ein anderes Projekt wählt als das geerbte, trifft eine Aussage, die die
|
||||||
|
spätere Auflösung braucht; nicht geschrieben wird nur, wenn die Zeile
|
||||||
|
selbst schon ein `taiga.*` trägt (das erste Token gewinnt, §1 — ein
|
||||||
|
zweites dahinter wäre wirkungslos) oder die Wahl dem Geerbten entspricht.
|
||||||
|
- **Scheitert eine Task, wiederholt der Dialog nichts Bezahltes.** Story
|
||||||
|
und schon angelegte Tasks sind je Zeile als Ref festgehalten
|
||||||
|
(Idempotenz-Marker) und im Dialog gesperrt; der Fehler steht IM Dialog
|
||||||
|
(kein `window.alert` — in manchen Kontexten unterdrückt, D22-Lehre),
|
||||||
|
und „Anlegen" macht nur mit dem Offenen weiter.
|
||||||
|
- **Geschrieben wird je Zeile in einem Undo-Schritt** über
|
||||||
|
`replaceTextUndoable` (D53); `appendToken` setzt das Token vor einen
|
||||||
|
`%%`-Kommentar und vor die Fortsetzungsmarke ` \` (SPEC §1) und lässt
|
||||||
|
Leer-/Kommentarzeilen stehen.
|
||||||
|
- **Deployment:** `TAIGA_API_URL` in der lokalen `.env` (Nutzerwunsch);
|
||||||
|
`deploy-backend.sh` zieht genau diese eine Zeile als
|
||||||
|
`WERKBAUM_TAIGA_API_URL` in die Server-Umgebung nach — idempotent, der
|
||||||
|
Passwort-Hash bleibt unangetastet, und ohne Wert wird nichts angefasst.
|
||||||
|
|
||||||
|
**Nachgemessen** Ende-zu-Ende im Browser gegen das lokale Backend mit
|
||||||
|
Taiga-Stub: Die Knöpfe erscheinen nur an Knoten ohne Ref; der Login-Dialog
|
||||||
|
speichert nur das Token; der Projekt-Dialog steht auf dem geerbten
|
||||||
|
`&taiga.mi-kunde` vor; „Story + Tasks" legt die Story und genau die
|
||||||
|
vorbelegten Kinder an (`#US-103`, `#T-104`, `#T-105` an den richtigen
|
||||||
|
Zeilen, das erledigte Kind übersprungen, kein redundantes Schlagwort);
|
||||||
|
eine abweichende Projektwahl schreibt `&taiga.mi-intern` zurück; Undo/Redo
|
||||||
|
nimmt je Schreibzug zurück; ein falsches Passwort bleibt als Taigas
|
||||||
|
Fehlertext im Dialog stehen. 565 Frontend-Tests, Backend-`check` grün
|
||||||
|
(93 % Coverage); Gegenproben per Mutation: ohne Alleinstehend-Anker der
|
||||||
|
`&tag`-Extraktion fallen genau die zwei Zitier-Tests, ohne den
|
||||||
|
`type`-Durchreich des Logins genau der benannte Client-Test.
|
||||||
|
|
||||||
|
**Benannte Grenze:** Gegen die echte Instanz (`plan.hostsharing.net`, ldap)
|
||||||
|
ist der Weg nicht gemessen — dafür braucht es echte Zugangsdaten, und die
|
||||||
|
gibt niemand einem Werkzeug. Der Plan-Knoten `#trk.create` steht deshalb
|
||||||
|
auf `[/]` (funktionsbereit, Feinarbeiten offen) statt `[x]`: Der erste
|
||||||
|
echte Login ist der Handtest, der noch aussteht.
|
||||||
|
|||||||
Reference in New Issue
Block a user