--- phase: 18-desktop-client-fertigstellen plan: 06 type: execute wave: 4 depends_on: ["18-01", "18-02", "18-03", "18-04", "18-05"] files_modified: - docs/anleitung-anwender.md - docs/anleitung-betrieb.md - docs/anleitung-entwicklung.md - docs/ci-cd-setup.md - CHANGELOG.md - .planning/REQUIREMENTS.md autonomous: true requirements: [DESK-01, DESK-02, DESK-03, DESK-04, DESK-05] user_setup: [] estimate: tokens: 60000 raw_tokens: 60000 tasks: 3 confidence: low must_haves: truths: - "Das Anwenderhandbuch hat ein Kapitel 'Desktop-App' mit Download in Tessera, Installation (Windows mit SmartScreen-Hinweis, Linux AppImage), Erststart mit Server-Adresse, Infobereich/Schliessen/Beenden, Autostart und Update-Hinweis (D-15)." - "Das Betriebshandbuch beschreibt den Pipeline-Job, den Cross-Bau, den Ablageort der Pakete im Abbild, die Release-Dateien, die Umgebungsvariable und die Fehlerbilder (D-15)." - "Das Entwicklungshandbuch fuehrt apps/desktop nicht mehr als Grundgeruest und beschreibt den lokalen Bau samt Voraussetzungen (D-15)." - "CHANGELOG 'Unveröffentlicht' -> '### Neu' traegt den Stichpunkt zur Desktop-App (D-17); REQUIREMENTS.md fuehrt DESK-01..05 mit Nachverfolgung." - "Alle Test-Suiten (API, Web) und Typpruefungen sind gruen; der Nutzer hat den Windows-Installer auf seinem PC durchgespielt (Erfolgskriterium 3)." artifacts: - path: "docs/anleitung-anwender.md" provides: "Kapitel '## Desktop-App' mit sieben Unterabschnitten" contains: "## Desktop-App" - path: "docs/anleitung-betrieb.md" provides: "Kapitel '## 10. Desktop-App: Pakete und Release-Dateien'" contains: "## 10. Desktop-App" - path: "docs/anleitung-entwicklung.md" provides: "Abschnitt '### Desktop-App lokal bauen'" contains: "Desktop-App lokal bauen" - path: "docs/ci-cd-setup.md" provides: "Job desktop im Pipeline-Ueberblick, Fehlerbehebung fuer Cross-Bau und Cache" contains: "desktop" - path: "CHANGELOG.md" provides: "Stichpunkt Desktop-App unter Unveröffentlicht/Neu" contains: "Desktop-App für Windows und Linux" - path: ".planning/REQUIREMENTS.md" provides: "Kategorie DESK mit DESK-01..05 und Traceability-Zeilen" contains: "DESK-05" key_links: - from: "docs/anleitung-anwender.md" to: "apps/web/src/messages/de.json" via: "Die im Handbuch genannten Beschriftungen entsprechen den de.json-Texten (Link- und Knopftexte, Tray-Eintraege)" pattern: "Desktop-App herunterladen" - from: "docs/anleitung-betrieb.md" to: "apps/api/src/desktop/desktop.service.ts" via: "Ablageort /app/desktop-dist und Variable DESKTOP_DIST_DIR" pattern: "DESKTOP_DIST_DIR" --- Die Phase wird abgeschlossen: Handbuecher fuer Anwender, Betrieb und Entwicklung beschreiben die Desktop-App, die Pipeline und die Release-Dateien; CHANGELOG und REQUIREMENTS werden nachgezogen; alle Suiten laufen; und der Nutzer prueft den Windows-Installer auf seinem PC nach einer genauen Schrittfolge (Erfolgskriterien 3 und 4). Purpose: D-15 und D-17 aus 18-CONTEXT.md; Nachverfolgung DESK-03/04/05. Output: Vier Dokumente, CHANGELOG-Stichpunkt, REQUIREMENTS-Abschnitt, gruene Gesamtlaeufe, Bedienprobe des Nutzers. Alle Handbuchtexte in Sie-Form, mit echten Umlauten, ohne firmenspezifische Adressen (Platzhalter `https://tessera.example.com`; die Testserver-Adresse steht nur in der Bedienprobe fuer den Nutzer, nicht im Handbuch). ## Artifacts this phase produces Dieser Plan: `docs/anleitung-anwender.md` (Kapitel "Desktop-App"), `docs/anleitung-betrieb.md` (Kapitel 10), `docs/anleitung-entwicklung.md` (Abschnitt "Desktop-App lokal bauen", Aktualisierung Monorepo-Aufbau und Tests), `docs/ci-cd-setup.md` (Job `desktop`, Fehlerbehebung), `CHANGELOG.md` (Stichpunkt), `.planning/REQUIREMENTS.md` (Kategorie DESK). Gesamtliste der Phase: siehe 18-01-PLAN.md. @$HOME/.claude/gsd-core/workflows/execute-plan.md @$HOME/.claude/gsd-core/templates/summary.md @.planning/PROJECT.md @.planning/ROADMAP.md @.planning/STATE.md @.planning/phases/18-desktop-client-fertigstellen/18-CONTEXT.md @.planning/phases/18-desktop-client-fertigstellen/18-01-SUMMARY.md @.planning/phases/18-desktop-client-fertigstellen/18-02-SUMMARY.md @.planning/phases/18-desktop-client-fertigstellen/18-03-SUMMARY.md @.planning/phases/18-desktop-client-fertigstellen/18-04-SUMMARY.md @.planning/phases/18-desktop-client-fertigstellen/18-05-SUMMARY.md @docs/anleitung-anwender.md @docs/anleitung-betrieb.md @docs/anleitung-entwicklung.md @docs/ci-cd-setup.md @CHANGELOG.md @.planning/REQUIREMENTS.md Task 1: Anwenderhandbuch — Kapitel "Desktop-App"; CHANGELOG-Stichpunkt docs/anleitung-anwender.md, CHANGELOG.md docs/anleitung-anwender.md (Inhaltsverzeichnis Zeilen 6-22, Kapitel "Persönliche Einstellungen" ab Zeile 143 und "Einen Fehler melden" ab Zeile 160 als Stilvorlage), CHANGELOG.md (Zeilen 1-14), apps/web/src/messages/de.json (Bloecke `auth.desktopDownload` und `settings.desktop` aus 18-03 — Beschriftungen woertlich uebernehmen), apps/desktop/src-tauri/src/lib.rs (Tray-Texte und Benachrichtigungstext aus 18-04), apps/desktop/src/setup.html (Texte der Erststart-Seite aus 18-04) **Kapitel einfuegen** zwischen `## Persönliche Einstellungen` und `## Einen Fehler melden`: `## Desktop-App`, im Inhaltsverzeichnis als neuer Punkt 8 (`[Desktop-App](#desktop-app)`), die folgenden Punkte auf 9-11 umnummerieren. Unterabschnitte (`###`) in dieser Reihenfolge, Sie-Form, kurze Absaetze, Beschriftungen exakt wie in der Oberflaeche: 1. **Was die Desktop-App ist** — eigenes Fenster statt Browser-Tab, Symbol im Infobereich der Taskleiste, dieselben Funktionen wie im Browser. 2. **Herunterladen** — auf der Anmeldeseite unter dem Formular „Desktop-App herunterladen (Windows)" und „Linux-Version"; oder angemeldet unter Einstellungen → Allgemein → Desktop-App mit Version, Dateiname und Dateigroesse. Kein Zugang zu Gitea noetig. 3. **Installation unter Windows** — Datei `Tessera-Setup-X.Y.Z.exe` ausfuehren; Windows-SmartScreen zeigt „Der Computer wurde durch Windows geschützt": auf „Weitere Informationen" und dann „Trotzdem ausführen" klicken; Grund in einem Satz (die App ist fuer den internen Gebrauch nicht signiert, das Paket stammt aus Ihrem Tessera-Server). Danach Startmenue-Eintrag „Tessera". Eine neuere Version wird einfach darueber installiert; die Server-Adresse bleibt erhalten. 4. **Installation unter Linux** — `Tessera-X.Y.Z.AppImage` ausfuehrbar machen (Dateieigenschaften oder `chmod +x`) und starten; keine Installation noetig. 5. **Erster Start: Server-Adresse** — die Adresse, unter der Sie Tessera im Browser oeffnen (Beispiel `https://tessera.example.com`); die App prueft die Adresse und meldet „Tessera X.Y.Z gefunden"; bei `http` erscheint ein Hinweis, die Verbindung ist trotzdem moeglich; danach die gewohnte Anmeldung. 6. **Fenster, Infobereich und Beenden** — Schliessen (X) legt Tessera in den Infobereich; Linksklick auf das Symbol oeffnet das Fenster; Rechtsklick zeigt „Öffnen", „Update herunterladen", „Mit Windows starten" (Haken; unter Linux „Beim Anmelden starten") und „Beenden"; nur „Beenden" beendet die App; Fenstergroesse und -position werden gemerkt. 7. **Automatischer Start** — Haken im Menue setzen/entfernen; ab Werk aus. 8. **Neue Version** — Benachrichtigung „Neue Version X.Y.Z verfügbar" beim Start, Menueeintrag „Version X.Y.Z herunterladen" oeffnet die Seite Einstellungen → Desktop-App im Browser; dort herunterladen und wie oben installieren. Kein automatisches Update. 9. **Wenn etwas nicht klappt** — drei Faelle: „Unter dieser Adresse antwortet kein Tessera-Server" (Adresse pruefen, es ist die Browser-Adresse, nicht eine interne API-Adresse); der Download-Link fehlt auf der Anmeldeseite (der Server traegt noch keine Pakete — Betrieb fragen); SmartScreen blockiert (siehe Installation). **CHANGELOG** (`## Unveröffentlicht` → `### Neu`): als neuen Stichpunkt in der bestehenden Liste `- Desktop-App für Windows und Linux: Download auf der Anmeldeseite und unter Einstellungen → Desktop-App` (D-17, Wortlaut exakt). - `grep -c '^## Desktop-App$' docs/anleitung-anwender.md` ergibt 1; `grep -c '(#desktop-app)' docs/anleitung-anwender.md` ergibt 1. - `grep -c '^### ' docs/anleitung-anwender.md` ist um 9 groesser als vorher (neun Unterabschnitte); die Ueberschriften enthalten `Herunterladen`, `Installation unter Windows`, `Installation unter Linux`, `Erster Start`, `Infobereich`, `Automatischer Start`, `Neue Version`. - `grep -c 'Trotzdem ausführen' docs/anleitung-anwender.md` ergibt mindestens 1; `grep -c 'Desktop-App herunterladen (Windows)' docs/anleitung-anwender.md` ergibt mindestens 1; `grep -c 'Mit Windows starten' docs/anleitung-anwender.md` ergibt mindestens 1. - `grep -c 'ctl.de\|vicolab' docs/anleitung-anwender.md` ergibt 0 im neuen Kapitel (keine firmenspezifische Adresse). - `grep -c '^- Desktop-App für Windows und Linux: Download auf der Anmeldeseite und unter Einstellungen → Desktop-App$' CHANGELOG.md` ergibt 1, und die Zeile steht oberhalb der ersten `## 1.` Versionsueberschrift. cd /home/vicolab/projects/tessera-ctl && grep -q '^## Desktop-App$' docs/anleitung-anwender.md && grep -q '(#desktop-app)' docs/anleitung-anwender.md && grep -q 'Trotzdem ausführen' docs/anleitung-anwender.md && grep -q 'Desktop-App herunterladen (Windows)' docs/anleitung-anwender.md && grep -q 'Mit Windows starten' docs/anleitung-anwender.md && test "$(awk '/^## Desktop-App$/{f=1;next} /^## /{f=0} f' docs/anleitung-anwender.md | grep -c '^### ')" -ge 9 && test "$(awk '/^## Desktop-App$/{f=1;next} /^## /{f=0} f' docs/anleitung-anwender.md | grep -ci 'ctl\.de\|vicolab')" = "0" && node -e "const c=require('fs').readFileSync('CHANGELOG.md','utf8');const u=c.indexOf('## Unveröffentlicht'),v=c.search(/\n## [0-9]/);const b=c.indexOf('- Desktop-App für Windows und Linux: Download auf der Anmeldeseite und unter Einstellungen → Desktop-App');if(u===-1||b===-1||b>v||b Kapitel, Inhaltsverzeichnis-Eintrag, eine Pflichtbeschriftung oder ein Unterabschnitt fehlt, das Kapitel nennt eine Firmenadresse, oder der CHANGELOG-Stichpunkt steht nicht unter „Unveröffentlicht" — `DOCS1-OK` fehlt. Kapitel „Desktop-App" mit neun Unterabschnitten im Anwenderhandbuch samt Inhaltsverzeichnis; CHANGELOG-Stichpunkt im Wortlaut von D-17. Task 2: Betriebshandbuch Kapitel 10, CI/CD-Runbook, Entwicklungshandbuch docs/anleitung-betrieb.md, docs/ci-cd-setup.md, docs/anleitung-entwicklung.md docs/anleitung-betrieb.md (Inhaltsverzeichnis Zeilen 12-22, Kapitel 8 ab Zeile 343, Kapitel 9 "Eine Version freigeben" ab Zeile 430), docs/ci-cd-setup.md (Abschnitt 4 "Pipeline-Ueberblick" ab Zeile 108, Abschnitt 6 "Fehlerbehebung" ab Zeile 211), docs/anleitung-entwicklung.md (Zeilen 23-58 Monorepo-Aufbau, "Lokale Entwicklungsumgebung" ab Zeile 58, "Tests" ab Zeile 403), .gitea/workflows/ci.yml (Endstand nach 18-05), .gitea/scripts/desktop-version.sh, .gitea/scripts/desktop-collect.sh, .gitea/scripts/publish-release.sh (Kopfkommentare), apps/api/src/desktop/desktop.service.ts (Variable DESKTOP_DIST_DIR, Vorgabepfad), .planning/phases/18-desktop-client-fertigstellen/18-05-SUMMARY.md (Rundentabelle — reale Fehlerbilder in die Fehlerbehebung uebernehmen) **`docs/anleitung-betrieb.md`** — neues `## 10. Desktop-App: Pakete und Release-Dateien` am Ende, Inhaltsverzeichnis um Punkt 10 ergaenzen. Der Sprachstil des Dokuments (Sie-Form, nummerierte Kapitel, `###`-Abschnitte). Abschnitte: `### Woher die Pakete kommen` (Job `desktop` nach `test`, auf `main` und bei Tags `v*`; Linux-AppImage und Windows-Installer per Cross-Bau auf dem Linux-Runner in einem Job; Einzelheiten der Werkzeugkette in `docs/ci-cd-setup.md`, Abschnitt 4); `### Wo die Pakete im Abbild liegen` (`/app/desktop-dist/` im API-Abbild mit `manifest.json`, Dateien `Tessera-Setup-X.Y.Z.exe` und `Tessera-X.Y.Z.AppImage`, auf Beta mit Suffix `-beta.{commit}`; Kontrolle: `docker compose exec api ls -l /app/desktop-dist` und `curl -s https://{ihre-adresse}/api-proxy/desktop/latest`; Ausgabe erklaeren); `### Release-Dateien in Gitea` (bei Tags haengt die Pipeline beide Dateien an den Release; die Datei am Release ist dieselbe wie im Abbild — Pruefsumme `sha256` aus dem Manifest); `### Umgebungsvariablen` (keine neue Pflichtvariable; optional `DESKTOP_DIST_DIR`, Vorgabe `/app/desktop-dist`; Tabelle im Stil von Kapitel 3); `### Fehlerbilder` als Tabelle Symptom → Ursache → Massnahme: Download-Link fehlt auf der Anmeldeseite bzw. `/api-proxy/desktop/latest` liefert 404 → Abbild ohne Pakete (Job `publish` haette abbrechen muessen; Lauf pruefen, erneut ausrollen); Download bricht bei grossen Dateien ab → Groessengrenze des vorgeschalteten Proxys (Nginx Proxy Manager, `client_max_body_size` bzw. Zeitlimits); Client meldet „Unter dieser Adresse antwortet kein Tessera-Server" → Anwender hat die API- statt der Web-Adresse eingetragen oder `/api-proxy` ist vom Client-Rechner nicht erreichbar; Windows warnt (SmartScreen) → erwartet, keine Signatur (Anwenderhandbuch). In Kapitel 9, Abschnitt „Eine Version freigeben", einen Satz ergaenzen: der Tag baut auch die Desktop-Pakete und haengt sie an den Release (Kapitel 10). **`docs/ci-cd-setup.md`** — Abschnitt 4: aus „drei" werden „vier" Jobs; Job `desktop` zwischen `test` und `publish` beschreiben: Bedingung (`main` und Tags `v*`), Schritte (Rust per rustup, apt-Pakete, `cargo-xwin`, `rustup target add x86_64-pc-windows-msvc`, Version aus dem Tag per `desktop-version.sh` — immer rein numerisch, Grund Windows-Ressourcen; AppImage, dann NSIS-Cross-Bau; `desktop-collect.sh` mit Manifest; Uebergabe an `publish` per `actions/cache` mit Schluessel `desktop-dist-{sha}` und **warum nicht** upload-artifact (auf Gitea unzuverlaessig); Cache-Pfade und Schluessel `desktop-cargo-`); `publish`: Restore mit hartem Abbruch, Pruefung des Manifests, Release-Upload der Manifest-Dateien (idempotent: vorhandene Datei gleichen Namens wird ersetzt). Abschnitt 6 Fehlerbehebung: neue Unterabschnitte „Job desktop schlaegt fehl" (apt-Paketname, pkg-config, openssl-sys beim Windows-Ziel → `rustls-tls`, NSIS-Plugin-Download, Speicher → `CARGO_BUILD_JOBS`), „publish: cache miss" (Schluessel/Cache-Server, Abschnitt 2 Runner-Config `[cache] enabled`), „Release-Upload 413" (`GITEA_API` auf die Host-Adresse `http://172.18.0.1:3002/api/v1` — nur, wenn der Proxy die Groesse abweist). Reale Fehlerbilder aus 18-05-SUMMARY (Rundentabelle) hier eintragen. **`docs/anleitung-entwicklung.md`** — (1) Im Monorepo-Aufbau die Zeile zu `desktop/` und den Absatz bei Zeile 39, der `apps/desktop` als blosses Grundgeruest mit einer einzelnen `setup.html` beschreibt, ersetzen (das Wort „Grundgerüst" darf im Dokument danach nicht mehr im Zusammenhang mit Tauri stehen — Negativ-Tor in ``): `apps/desktop` ist der fertige Desktop-Client (Tauri 2): `src-tauri/src/lib.rs` (Tray, Erststart-Kommandos, Versionspruefung), `src/setup.html` (Erststart-Seite), Pakete entstehen im CI; `packages/shared` enthaelt jetzt auch die Manifest-Typen der Desktop-Pakete. (2) Unter „Lokale Entwicklungsumgebung" neuer Abschnitt `### Desktop-App lokal bauen`: Voraussetzungen (Rust stable per rustup, Ubuntu/Debian-Pakete `libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev libgtk-3-dev libssl-dev patchelf`), Befehle `sh .gitea/scripts/desktop-version.sh` (schreibt die Version des letzten Tags — die eingecheckten Versionsdateien sind nur eine Basislinie), `pnpm --filter @tessera/desktop exec tauri build --bundles appimage`, Ausgabe unter `apps/desktop/src-tauri/target/release/bundle/appimage/`, `sh .gitea/scripts/desktop-collect.sh --require linux` fuer `desktop-dist/` (vom Git ausgeschlossen bis auf den Platzhalter), Hinweis: der Windows-Installer wird nur im CI gebaut (`cargo-xwin`, NSIS), lokal genuegt `cargo check`/`cargo clippy`; lokaler Docker-Stack: nach `docker compose build api` liefert die API die Pakete unter `/desktop/latest`. (3) Unter „Tests": `pnpm --filter @tessera/api exec vitest run src/desktop` (HTTP-Durchstich ueber `NestFactory`, echtes Temp-Verzeichnis) und die Rust-Pruefungen ergaenzen. - `grep -c '^## 10. Desktop-App' docs/anleitung-betrieb.md` ergibt 1; das Inhaltsverzeichnis enthaelt einen Eintrag `10.`; `grep -c 'DESKTOP_DIST_DIR' docs/anleitung-betrieb.md` ergibt mindestens 1; `grep -c '/app/desktop-dist' docs/anleitung-betrieb.md` ergibt mindestens 1; `grep -c '### Fehlerbilder' docs/anleitung-betrieb.md` ergibt 1. - `grep -c 'vier aufeinander aufbauenden Jobs\|vier Jobs' docs/ci-cd-setup.md` ergibt mindestens 1; `grep -c 'cargo-xwin' docs/ci-cd-setup.md` ergibt mindestens 2; `grep -c 'upload-artifact' docs/ci-cd-setup.md` ergibt mindestens 1 (Begruendung, warum nicht); `grep -c 'desktop-dist-' docs/ci-cd-setup.md` ergibt mindestens 1. - `grep -c 'Tauri-Grundgerüst' docs/anleitung-entwicklung.md` ergibt 0; `grep -c '### Desktop-App lokal bauen' docs/anleitung-entwicklung.md` ergibt 1; `grep -c 'desktop-version.sh' docs/anleitung-entwicklung.md` ergibt mindestens 1; `grep -c 'vitest run src/desktop' docs/anleitung-entwicklung.md` ergibt mindestens 1. - Keine firmenspezifische Adresse in den neuen Abschnitten (die bestehenden Nennungen von `git.vicolab.de` im CI/CD-Runbook sind Infrastruktur und bleiben). cd /home/vicolab/projects/tessera-ctl && grep -q '^## 10. Desktop-App' docs/anleitung-betrieb.md && grep -q 'DESKTOP_DIST_DIR' docs/anleitung-betrieb.md && grep -q '/app/desktop-dist' docs/anleitung-betrieb.md && grep -q '### Fehlerbilder' docs/anleitung-betrieb.md && grep -Eq '^10\. \[' docs/anleitung-betrieb.md && test "$(grep -c 'cargo-xwin' docs/ci-cd-setup.md)" -ge 2 && grep -q 'desktop-dist-' docs/ci-cd-setup.md && grep -q 'upload-artifact' docs/ci-cd-setup.md && test "$(grep -c 'Tauri-Grundgerüst' docs/anleitung-entwicklung.md)" = "0" && grep -q '### Desktop-App lokal bauen' docs/anleitung-entwicklung.md && grep -q 'desktop-version.sh' docs/anleitung-entwicklung.md && grep -q 'vitest run src/desktop' docs/anleitung-entwicklung.md && echo DOCS2-OK Kapitel 10, Inhaltsverzeichnis-Eintrag, Variable, Ablageort, Fehlerbilder, Cross-Bau-Beschreibung, Cache-Schluessel oder der neue Entwicklungsabschnitt fehlen, oder das Entwicklungshandbuch nennt `apps/desktop` noch als Grundgeruest — `DOCS2-OK` fehlt. Betriebshandbuch mit Kapitel 10 (Pipeline, Ablageort, Release-Dateien, Variable, Fehlerbilder), CI/CD-Runbook mit Job `desktop` und Fehlerbehebung, Entwicklungshandbuch mit lokalem Bau und aktualisiertem Monorepo-Aufbau. Task 3: REQUIREMENTS nachziehen, Gesamtlaeufe, Bedienprobe des Nutzers .planning/REQUIREMENTS.md .planning/REQUIREMENTS.md (Abschnitte "SRC" ab Zeile 58 als Formvorlage, "Traceability" ab Zeile 101), .planning/ROADMAP.md (Phase 18: Requirements-Zeile und Erfolgskriterien), .planning/phases/06-desktop-client-ci-cd/06-CONTEXT.md (Ursprung DESK-01/02) **REQUIREMENTS.md.** Vor `## Future Requirements (deferred)` einen Abschnitt `## Phase 18 — Desktop-Client fertigstellen` mit `### DESK — Desktop-Client` und einem Einleitungssatz („Hinzugefügt 2026-09-16 — DESK-01/02 stammen aus v1.0 (Phase 6) und werden fortgeführt; DESK-03..05 aus `18-CONTEXT.md` abgeleitet") einfuegen. Eintraege im Stil der SRC-Zeilen: `- [x] **DESK-01**: Tauri-basierter Desktop-Wrapper für Windows und Linux (Phase 6, fortgeführt).`; `- [x] **DESK-02**: Die Desktop-App verbindet sich mit dem Web-Backend; die Server-Adresse wird beim ersten Start abgefragt (Phase 6, fortgeführt; D-02).`; `- [ ] **DESK-03**: Der Installer ist in Tessera herunterladbar — Link auf der Anmeldeseite und Seite Einstellungen → Desktop-App, Auslieferung über die Tessera-API ohne Gitea-Zugang (D-01, D-10, D-12).`; `- [ ] **DESK-04**: Ein Freigabe-Tag baut Windows-Installer und Linux-AppImage in der Pipeline und hängt beide als Dateien an den Gitea-Release (D-04..D-08).`; `- [ ] **DESK-05**: Der Client trägt die Freigabe-Version, vergleicht sie mit `/desktop/latest` und weist mit Download-Link auf eine neuere Version hin (D-07, D-11, D-13).` In der Traceability-Tabelle fuenf Zeilen ergaenzen: `DESK-01 | Phase 6 / 18 | Complete`, `DESK-02 | Phase 6 / 18 | Complete`, `DESK-03 | Phase 18 | Pending`, `DESK-04 | Phase 18 | Pending`, `DESK-05 | Phase 18 | Pending` (auf Complete setzt sie die Verifikation der Phase). Die Coverage-Zeile um einen Satz ergaenzen (5/5 DESK auf Phase 18 abgebildet). **Gesamtlaeufe** (Endstand der Phase): `pnpm --filter @tessera/api exec vitest run`, `pnpm --filter @tessera/web exec vitest run`, `pnpm --filter @tessera/api type-check`, `pnpm --filter @tessera/web type-check`, `cargo check` in `apps/desktop/src-tauri`. Ergebnisse (Anzahl Dateien/Tests) im SUMMARY festhalten. `biome check` ist kein Tor (bekannter Fehler in der Wurzel-`biome.json`, nicht anfassen). **Bedienprobe vorbereiten:** Den Text der `` unten als Schrittfolge in das SUMMARY uebernehmen, damit der Nutzer sie zur Hand hat; die Testserver-Adresse dort einsetzen (`alpha.tessera.ctl.de`, nur im SUMMARY/Gespraech, nie im Handbuch). - `grep -c '\*\*DESK-0[1-5]\*\*' .planning/REQUIREMENTS.md` ergibt 5; `grep -c '^| DESK-0[1-5] |' .planning/REQUIREMENTS.md` ergibt 5. - `pnpm --filter @tessera/api exec vitest run` und `pnpm --filter @tessera/web exec vitest run` melden 0 fehlgeschlagene Tests; beide Typpruefungen fehlerfrei; `cargo check` gruen. - Der Nutzer hat die Bedienprobe (human-check) durchgefuehrt und das Ergebnis liegt vor. cd /home/vicolab/projects/tessera-ctl && test "$(grep -c '\*\*DESK-0[1-5]\*\*' .planning/REQUIREMENTS.md)" = "5" && test "$(grep -c '^| DESK-0[1-5] |' .planning/REQUIREMENTS.md)" = "5" && echo REQ-OK Weniger oder mehr als fuenf DESK-Eintraege bzw. Traceability-Zeilen — `REQ-OK` fehlt. cd /home/vicolab/projects/tessera-ctl && pnpm --filter @tessera/api exec vitest run && pnpm --filter @tessera/web exec vitest run && pnpm --filter @tessera/api type-check && pnpm --filter @tessera/web type-check && (cd apps/desktop/src-tauri && cargo check 2>&1 | tail -1 | grep -q Finished) && echo ALL-GREEN Eine Suite meldet "failed", tsc gibt Fehler aus, oder `cargo check` endet ohne `Finished` — `ALL-GREEN` fehlt. Bedienprobe des Nutzers (Du-Form im Gespraech; Voraussetzung: der Testserver laeuft auf dem Beta-Stand mit den Paketen — `docker compose pull` und `docker compose up -d --force-recreate` machst du dort selbst; Windows-PC mit Browser): 1. Anmeldeseite des Testservers im Browser oeffnen: Unter dem Formular steht „Desktop-App herunterladen (Windows)", daneben „Linux-Version", darunter „Version 1.1.0". 2. Auf den Windows-Link klicken: Es laedt `Tessera-Setup-1.1.0-beta.{kennung}.exe` (wenige MB). 3. Datei ausfuehren. Windows zeigt die SmartScreen-Warnung: „Weitere Informationen" → „Trotzdem ausführen". Die Installation laeuft ohne weitere Fragen durch; Tessera startet (sonst ueber das Startmenue). 4. Erststart-Seite: dunkle Karte mit Tessera-Zeichen und gelbem Schriftzug, Feld „Adresse Ihres Tessera-Servers". Adresse des Testservers eintragen (`https://…`), „Verbinden": kurz „Tessera 1.1.0 gefunden – Verbindung wird hergestellt …", dann erscheint die Tessera-Anmeldung **im App-Fenster**. 5. Anmelden. Fenster mit X schliessen: Die App bleibt im Infobereich (Symbol mit Tessera-Zeichen). Linksklick auf das Symbol: Fenster ist wieder da. 6. Rechtsklick auf das Symbol: Menue „Öffnen", „Update herunterladen" (ausgegraut, weil du die aktuelle Version hast), „Mit Windows starten" (ohne Haken), „Beenden" — mit Umlauten. 7. „Mit Windows starten" anklicken: Haken erscheint; erneut anklicken: Haken verschwindet. 8. „Beenden": App ist weg (auch aus dem Infobereich). 9. App erneut starten: Sie geht **direkt** zu Tessera (Adresse gemerkt), Fenstergroesse und -position wie beim Beenden. 10. In der App: Einstellungen → Allgemein → „Desktop-App": Seite mit „Aktuelle Version: 1.1.0", „Beta-Ausgabe, Stand {kennung}", zwei gelbe Knoepfe „Für Windows herunterladen" / „Für Linux herunterladen", darunter Dateiname und Groesse (z. B. „… · 101,5 MB" fuer Linux), und vier Saetze Erklaerung. 11. Falls ein Linux-Rechner greifbar ist: AppImage herunterladen, ausfuehrbar machen, starten — Erststart-Seite wie unter 4. Zwei Punkte lassen sich erst beim **naechsten Freigabe-Tag** pruefen und gehoeren in die Abnahme dieser Version, nicht in diese Phase: (a) Nach dem Tag `v1.2.0` zeigt der installierte 1.1.0-Client beim Start die Benachrichtigung „Neue Version 1.2.0 verfügbar …", und der Menueeintrag heisst „Version 1.2.0 herunterladen" und oeffnet die Seite Desktop-App im Browser. (b) Der Gitea-Release `v1.2.0` traegt `Tessera-Setup-1.2.0.exe` und `Tessera-1.2.0.AppImage` als Dateien. REQUIREMENTS.md fuehrt DESK-01..05 mit Nachverfolgung; alle Suiten und Typpruefungen gruen; die Bedienprobe des Nutzers ist durchgefuehrt und im SUMMARY dokumentiert (inklusive der zwei auf den naechsten Tag vertagten Punkte). ## Trust Boundaries | Boundary | Description | |----------|-------------| | Handbuecher -> Anwender | Anleitungen praegen das Verhalten der Anwender bei Sicherheitswarnungen (SmartScreen). | | Testserver -> Nutzer-PC | Der Nutzer installiert ein unsigniertes Paket vom Beta-Kanal. | ## STRIDE Threat Register | Threat ID | Category | Component | Severity | Disposition | Mitigation Plan | |-----------|----------|-----------|----------|-------------|-----------------| | T-18-19 | Spoofing | SmartScreen-Anleitung („Trotzdem ausführen") | low | mitigate | Das Handbuch koppelt die Anweisung an die Herkunft (Download nur aus dem eigenen Tessera-Server, Dateiname `Tessera-Setup-…`) und nennt keine allgemeine Empfehlung, Warnungen zu ignorieren. | | T-18-20 | Information Disclosure | Handbuecher mit Server-Adressen | low | mitigate | Nur Platzhalter (`https://tessera.example.com`); die Testserver-Adresse steht ausschliesslich im SUMMARY/Gespraech. | | T-18-SC | Tampering | Paketinstallationen | low | accept | Dieser Plan installiert kein Paket. | 1. Dokument-Kennzeichen (Kapitel, Inhaltsverzeichnis, Pflichtbegriffe) in allen vier Dokumenten erfuellt. 2. CHANGELOG-Stichpunkt unter „Unveröffentlicht". 3. REQUIREMENTS.md mit DESK-01..05 und Traceability. 4. Gesamtlaeufe API/Web/Typpruefung/Cargo gruen. 5. Bedienprobe des Nutzers auf Windows (Schritte 1-10) bestanden; Punkte (a) und (b) auf den naechsten Freigabe-Tag vertagt und so dokumentiert. - Anwender-, Betriebs- und Entwicklungshandbuch beschreiben Installation, Erststart, Tray-Verhalten, Pipeline, Release-Dateien und Umgebungsvariablen (Erfolgskriterium 4). - Der installierte Client zeigt nach Eingabe der Server-Adresse die Anmeldung und verhaelt sich im Infobereich wie beschrieben (Erfolgskriterium 3, Bedienprobe). - Alle Suiten gruen; CHANGELOG und REQUIREMENTS nachgezogen. Create `.planning/phases/18-desktop-client-fertigstellen/18-06-SUMMARY.md` when done. Im SUMMARY festhalten: Ergebnis der Bedienprobe je Schritt, die zwei vertagten Punkte, und die Zahlen der Gesamtlaeufe.