--- status: complete phase: quick-260918-gza plan: 01 subsystem: bug-reports tags: [fehler-melden-knopf, herkunft, desktop-app, betreff-kuerzel] dependency-graph: requires: [quick-260914-m97, quick-260917-h2s] provides: [herkunfts-kuerzel-im-betreff, herkunftszeile-in-der-mail, cookie-tessera_desktop_client] affects: [apps/api/src/bug-reports, apps/desktop/src-tauri, apps/web/src/middleware.ts, apps/web/src/lib, apps/web/src/components/bug-report] tech-stack: added: [] patterns: [reine-helferfunktion-mit-eigener-spec, cookie-huelle-um-bestehenden-marker-mechanismus] key-files: created: - apps/api/src/bug-reports/origin.ts - apps/api/src/bug-reports/origin.spec.ts - apps/web/src/lib/bug-report-api.test.ts modified: - apps/api/src/bug-reports/dto/bug-report.dto.ts - apps/api/src/bug-reports/bug-reports.service.ts - apps/api/src/bug-reports/bug-reports.service.spec.ts - apps/api/src/bug-reports/bug-reports.controller.spec.ts - apps/desktop/src-tauri/src/lib.rs - apps/web/src/middleware.ts - apps/web/src/middleware.test.ts - apps/web/src/lib/desktop-client.ts - apps/web/src/lib/desktop-client.test.ts - apps/web/src/lib/bug-report-api.ts - apps/web/src/components/bug-report/bug-report-dialog.tsx - apps/web/src/components/bug-report/bug-report-button.test.tsx - CHANGELOG.md - docs/anleitung-administration.md - docs/anleitung-betrieb.md decisions: - "Marker-/Cookie-Mechanismus aus quick-260917-h2s erweitert statt WebView-User-Agent zu ueberschreiben (Vorgabe des Orchestrators im Plan, keine Abweichung)." - "Regex statt neuer ua-parser-Bibliothek in origin.ts — fuenf Browser/fuenf Betriebssysteme reichen fuer ein Postfach, kein neues Paket." metrics: duration: ca. 45 min completed: 2026-09-18 actuals: tokens: 68000 tasks: 3 commits: 4 plan_head_before: ab99a9a56e6d0e1e57e07c6feb2a2fa2ab866fc4 --- # Phase quick-260918-gza Plan 01: Herkunft der Fehlermeldung ausweisen — Summary Fehlermeldungen des Fehler-melden-Knopfs tragen jetzt ein Herkunfts-Kuerzel im Betreff (`[Browser]`, `[Desktop/Windows]`, `[Desktop/Linux]`, Rueckfall `[Desktop]`) und eine Zeile `Herkunft: …` im Text, abgeleitet vom reinen Helfer `origin.ts` aus vier neuen optionalen DTO-Feldern (Desktop-App, ueber ein zweites Cookie `tessera_desktop_client`) bzw. dem User-Agent (Browser). ## Ausgefuehrte Tasks 1. **API — `origin.ts`, DTO-Felder, Betreff-Kuerzel, Zeile `Herkunft:`** — Commit `7169472` 2. **Desktop-Marker (`dv`/`dc`/`dos`), Middleware-Cookie, Web-Nutzlast** — zwei Commits: - `b03cb21` — Rust: `with_client_marker` (rein) + `with_desktop_marker` (Huelle) - `f245711` — Web: Middleware-Cookie, `desktop-client.ts`, `bug-report-api.ts`, Dialog 3. **CHANGELOG und Handbuecher** — Commit `e2a7946` ## Commits | Hash | Betreff | |------|---------| | `7169472` | feat(bug-reports): Herkunft der Fehlermeldung im Betreff-Kuerzel und als Zeile Herkunft ausweisen | | `b03cb21` | feat(desktop): Version, Stand und Betriebssystem im Desktop-Marker mitgeben (dv, dc, dos) | | `f245711` | feat(web): Herkunft der Fehlermeldung — Cookie tessera_desktop_client und Client-Felder in der Nutzlast | | `e2a7946` | docs: Fehlermeldungen — Herkunft (Browser/Desktop-App, Betriebssystem, Version) und Betreff-Kürzel (Handbücher, CHANGELOG) | `commits: 4` (gemessen: `git rev-list --count ab99a9a..HEAD` = 4; `plan_head_before` ist der Stand vor Task 1). ## Testzahlen | Suite | Vorher | Nachher | Befehl | |---|---|---|---| | API `src/bug-reports` | 11 | 24 (origin 10, service 10, controller 4) | `pnpm --filter @tessera/api exec vitest run src/bug-reports` | | API vollstaendig | — | 1124/1124 gruen (69 Testdateien) | `pnpm --filter @tessera/api exec vitest run` | | API `type-check` | — | ohne Fehler | `pnpm --filter @tessera/api type-check` | | Web `src/lib`, `middleware.test.ts`, `src/components/bug-report` | 11 (desktop-client) + 5 (middleware) + 11 (button) = 27 | 101/101 gruen (13 Testdateien; middleware 9, desktop-client 13, bug-report-api 3 NEU, bug-report-button 13) | `pnpm --filter @tessera/web exec vitest run src/lib src/middleware.test.ts src/components/bug-report` | | Web vollstaendig | — | 447/447 gruen (65 Testdateien) | `pnpm --filter @tessera/web exec vitest run` | | Web `type-check` | — | ohne Fehler | `pnpm --filter @tessera/web type-check` | | Rust `cargo test --lib` | 33 (STATE-Baseline) | 37/37 gruen, `cargo fmt --check` sauber | `apps/desktop/src-tauri && cargo fmt --check && cargo test --lib` | Alle Zahlen erfuellen bzw. uebertreffen die Vorgaben aus `` (Rust ≥ 5 Marker-Tests — 5 vorhanden: 3 umgestellt + leerer Commit + Huelle; Middleware 9; desktop-client ≥ 11 — 13; bug-report-api 3; Komponententest 13; origin ≥ 8 — 10; Service 10; Controller 4). ## Deviations from Plan Keine — der Plan wurde wie geschrieben ausgefuehrt. Ergaenzend zwei kleine Implementierungsentscheidungen, die im Rahmen des Plans lagen (keine Abweichung von ``/``): - **Test 9 im Service-Spec** (Betreff/Zeile/Protokollzeile fuer Desktop/Windows) nutzt fuer die Pruefung "Logger genau einmal mit Kuerzel gerufen" eine zweite, frische `makeService()`-Instanz, damit der Aufruf-Zaehler nicht durch den vorherigen `submit()` in demselben Test verfaelscht wird. Ergebnis entspricht exakt der im Plan verlangten Erwartung. - In `origin.ts` wurde `clean()` mit Default-Parameter `max = 40` implementiert (im Plan als `clean(value, max = 40)` vorgegeben) — keine Abweichung, nur Bestaetigung der genauen Umsetzung. ## Known Stubs Keine. ## Threat Flags Keine neue, im Plan nicht erfasste Sicherheitsflaeche gefunden — alle vier neuen DTO-Felder, das zweite Cookie und die Bereinigungsregeln entsprechen exakt dem Threat Register des Plans (T-GZA-01 bis T-GZA-04, T-GZA-SC). ## Offene Punkte fuer den Orchestrator (Nachweis, nicht Aufgabe des Executors) Laut `` des Plans, ausdruecklich NICHT Teil dieser Ausfuehrung: 1. **Browser-Fall (Playwright MCP + mailhog):** lokal `docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d mailhog` und `docker compose up -d --build api web`, dann ueber den Fehler-melden-Knopf eine Meldung senden und in `http://localhost:8025` pruefen: Betreff `[Tessera Fehlermeldung] [Browser] dev dev - /…`, Zeile `Herkunft: Browser — Chrome auf Linux`, Zeilen `Browser:`/`Fenster:` weiterhin vorhanden; `docker compose logs api | grep "Bug report"` zeigt das Kuerzel. 2. **Desktop-Fall (Windows-Test-VM nach CI-Bau):** Client auf der VM installieren bzw. per In-App-Update aktualisieren (Zugang laut Memory `reference_windows_test_vm.md`), gegen alpha melden -> Betreff `[Desktop/Windows]`, Zeile `Herkunft: Desktop-App (Windows), Tessera-App · Stand `. 3. **Optional — alter Desktop-Client:** ein bestehender 1.2.0-Client ohne Update erzeugt `[Desktop]` und `Desktop-App (unbekannt)` — dokumentiertes Verhalten (Betriebshandbuch Kap. 10), kein zwingender Nachweis. ## Self-Check: PASSED - `apps/api/src/bug-reports/origin.ts` — FOUND - `apps/api/src/bug-reports/origin.spec.ts` — FOUND - `apps/web/src/lib/bug-report-api.test.ts` — FOUND - Commit `7169472` — FOUND (`git log --oneline --all | grep 7169472`) - Commit `b03cb21` — FOUND - Commit `f245711` — FOUND - Commit `e2a7946` — FOUND