---
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.