# Sichtprüfungs-Session 2026-09-16 Build: Debug 2.15.0 (App 08:05, Worker 09:40 — enthält den uncommitteten `WorktreeUpdated`-Fix). Sandkasten: Liste **ClaudeDoTests** → `C:\TestRepos\ClaudeDoTests` (sauber, alle Alt-Tasks Done). Vorgeseedet: **#334** (README.md) und **#335** (docs/notes.md) — laufen, landen in `WaitingForReview`. Abgedeckt wird alles seit dem letzten Sichtprüfungs-Pass (06.08.), also v2.13.x–v2.15. **Bewusst draußen:** Installer/SystemCheckPage (braucht echte Installation) und die Ticketsystem-Anbindung (braucht ein zugewiesenes Ticket) — beide aus `docs/open.md`. Notation: `[ ]` offen · `[x]` ok · `[!]` Fehler (Text dahinter = Fix-Kandidat) --- ## Pass 1 — Sidebar: Listen & Ordner (~8 min) · **ERLEDIGT** — 1.1–1.8 ok bis auf 1.2 (→ F1) > 1.7 verhält sich gut: Ordner löschen schiebt die enthaltene Liste raus statt sie mitzunehmen. - [ ] **1.1** Rechtsklick in die Listen-Sidebar → „Neue Liste": im Modal den Ordner-Toggle einschalten → es entsteht ein **Ordner**, nicht eine Liste. - [ ] **1.2** Ordner anklicken → klappt auf/zu, Pfeil dreht sich, Zustand bleibt nach Listenwechsel erhalten. - [ ] **1.3** Eine bestehende Liste per Drag in den Ordner ziehen → landet drin, Ordner zeigt sie. - [ ] **1.4** Liste wieder aus dem Ordner heraus auf die oberste Ebene ziehen → geht zurück. - [ ] **1.5** **Gemischte Reihenfolge** (das ist der Kern von 2.14): eine Liste **über** einen Ordner ziehen → Reihenfolge hält. Ordner per Drag zwischen zwei Listen schieben → hält auch. - [ ] **1.6** App neu starten (oder Worker-Menü → Reconnect) → die gemischte Reihenfolge ist noch dieselbe. *Das ist der Test, der `ReorderSidebarAsync` wirklich prüft.* - [ ] **1.7** Ordner löschen, während eine Liste drin liegt → was passiert mit der Liste? (Erwartung unklar — notieren, was es tut.) - [ ] **1.8** Rechtsklick auf einen Task → „In Liste verschieben" → Ziel wählen → Task ist weg aus der Quelle, da in der Zielliste. ## Pass 2 — Review, Merge, Stash (~15 min) · der wichtigste Pass Braucht #334/#335 in `WaitingForReview`. Sag mir Bescheid, falls sie noch laufen. - [ ] **2.1** ⚠️ **Der uncommittete Fix.** Auf einem Task „Open ConPTY session" → im Terminal irgendeine Kleinigkeit ändern → in der Mission-Control-Kachel „Submit for review". **Erwartung:** Der Task landet in `WaitingForReview` und die REVIEW-Karte im Detail-Pane zeigt **sofort** „Open diff" + Änderungs-Zusammenfassung — **ohne** dass du den Task neu anklicken musst. (Vorher fehlte der ganze Block bis zur Neuauswahl.) - [ ] **2.2** #334 anklicken → „Open diff" → Side-by-side-Diff zeigt die README-Änderung, Zeilen/Farben stimmen, kein Abschneiden unten. - [ ] **2.3** Approve-Gate: **ohne** geöffneten Diff ist Approve gesperrt, nach dem Diff aktiv. - [ ] **2.4** Approve auf #334 → merged, Task geht auf **Done**, Chip wechselt, Worker-Log-Zeile im Footer erscheint (mit `#334` im Text — deckt gleich Pass 5.1 mit ab). - [ ] **2.5** 🔥 **Stash-Option (neuester Commit, komplett ungetestet).** Ich mache dir das Ziel-Verzeichnis absichtlich dirty (sag „mach dirty"), dann auf #335 **Approve & Merge**: Erwartung = **Bestätigungsdialog** „Änderungen stashen und mergen?" statt der alten `blocked`-Sackgasse. Bestätigen → Merge läuft, und deine uncommitteten Änderungen in `C:\TestRepos\ClaudeDoTests` sind danach **wieder da**. - [ ] **2.6** Derselbe Fall über das **Merge-Modal** (statt Approve): Button „Änderungen stashen und mergen" ist da und tut dasselbe. - [ ] **2.7** Abbrechen im Stash-Dialog → nichts passiert, Task bleibt `WaitingForReview`, Arbeitsverzeichnis unverändert. - [ ] **2.8** Worktrees-Übersicht öffnen → die gemergten Worktrees stehen als `Merged` drin, Cleanup funktioniert, keine WARN-Flut im Footer. ## Pass 3 — Interaktive Sessions & Mission Control (~12 min) - [ ] **3.1** ConPTY-Session läuft → auf das **X** klicken → **Rückfrage** erscheint („Session läuft wirklich schließen?"), Abbrechen lässt sie laufen. - [ ] **3.2** Im interaktiven Terminal **Text einfügen** (Ctrl+V) → landet im Prompt. - [ ] **3.3** Eine **Datei ins Terminal droppen** → Pfad wird eingefügt. Und: ein Drop, der scheitern muss (z.B. Ordner statt Datei) → Fehler wird **sichtbar** gemeldet, nicht still geschluckt. - [ ] **3.4** **Session stirbt nach dem Start** (im Terminal `exit` tippen) → Banner erscheint in der Kachel, nicht einfach eine tote schwarze Fläche. - [ ] **3.5** Mission Control: **Home-Ordner als Sitzungsziel** — neue Session ohne Liste/Task starten → läuft im User-Verzeichnis, nicht irgendwo. - [ ] **3.6** Mission Control ist **minimiert** → Handler-Run/Session startet → Fenster wird aus dem Minimiert-Zustand geholt, nicht nur in der Taskleiste blinkend. - [ ] **3.7** Handler-Run per Knopf **abbrechen** → Run endet sauber, Kachel verschwindet/ wechselt, kein Geister-Pane. ## Pass 4 — Menüs, Settings, Fenster-Layout (~12 min) - [ ] **4.1** Hilfe-Menü → **Cheat-Sheets** → Fenster öffnet, sechs Sheets (git, Conventional Commits, Claude CLI, Claude-Config, dotnet CLI, PowerShell). - [ ] **4.2** Im Cheat-Sheet: Sektionen sind Expander, Befehle sind Mono-Chips mit **Copy-Button** → Klick kopiert wirklich (irgendwo einfügen und prüfen). - [ ] **4.3** Cheat-Sheet-Fenster **anpinnen** (Topmost) → bleibt über der App, App bleibt bedienbar (modelos). - [ ] **4.4** Hilfe-Menü → „Nach Updates suchen" und „Über" → Version zeigt **2.15.0** (aus der FileVersion, nicht hartkodiert). - [ ] **4.5** Worker-Menü → **„Update Claude CLI"** → führt sichtbar `claude update` aus, Ausgabe landet irgendwo lesbar. *(Achtung: ändert wirklich deine CLI — überspring das, wenn du gerade keine CLI-Version riskieren willst.)* - [ ] **4.6** Worker-Menü → **Shutdown** → Rückfrage → beendet Worker **und** App. *Ganz am Ende machen, sonst ist die Session vorbei.* - [ ] **4.7** Settings → **Ausführung**: die PowerUse-Einstellungen sind hier (nicht mehr im Usage-Monitor), Erklärtexte zu Effort und „Prime Claude" sind da und verständlich. Ungültiges PowerUse-Zeitfenster eingeben → wird abgelehnt/erklärt, nicht still gespeichert. - [ ] **4.8** **Modal-Layout** (Fix vom 02.09., Sichtprüfung offen): Über-Dialog, Merge-Modal, Repo-Import, Worktrees-Übersicht, Merge-Helper-Auswahl **einmal öffnen** und prüfen, dass unten **nichts abgeschnitten** ist (letzte Zeile/Button voll sichtbar). - [ ] **4.9** Listeneinstellungen einer Liste öffnen → Modal erscheint **sofort** (lädt sichtbar nach), und: Arbeitsverzeichnis auf einen Nicht-Git-Ordner setzen → **Warnung + Speichern blockiert**, nicht stillschweigend akzeptiert. - [ ] **4.10** Merge-Helper starten → Start-Modal hat den **Triage-Modell-Picker (opus/fable)**. *(Nur das Modal ansehen, Lauf nicht starten — kostet sonst die halbe Stunde.)* ## Pass 5 — Reste & bekannte Nits (~8 min) - [ ] **5.1** **Task-Nummern:** `#334` steht dimmed vor dem Titel in der Zeile, der Detail-Chip zeigt `#334` (nicht mehr GUID), Footer-Worker-Log schreibt `#334 …`. - [ ] **5.2** **depends_on sichtbar:** zwei Tasks verketten → der blockierte zeigt einen Blocking-Chip, ein Ketten-Label („wartet auf …") und im Detail-Pane den Grund. In der Queue-Zeile hat auch der **blockierte** Task ein Dequeue-**X**. - [ ] **5.3** **Usage-Monitor-Modal → Models-Tab:** die bekannten Nits — kollidierende Spaltenköpfe (`OTHER CACHISHARE`), Zahlen linksbündig ohne Tausendertrenner, Task-Titel hart abgeschnitten. Nur bestätigen, dass sie noch da sind → geht auf die Fix-Liste. - [ ] **5.4** **Deutsch:** einmal die Sprache auf DE stellen und durch Sidebar, Detail-Pane, WorkConsole, ROADBLOCK-Karte und die Merge-Dialoge gehen → keine englischen Reste. *(Der de.json-Konsistenz-Pass vom 10.09. ist nie angeschaut worden.)* - [ ] **5.5** **Worker-Verbindung:** Worker-Menü → Reconnect bei laufendem Worker → Erfolg sichtbar. Und einmal Worker beenden, dann Reconnect → **Fehlschlag wird gemeldet** (Footer-Strip), nicht still no-op. --- ## Ergebnis Alle fünf Pässe durchlaufen. **11 Befunde** aus ~45 Checks; Pass 4 (Menüs/Settings/Modal-Layout) war komplett sauber. Die drei schweren (F9/F10/F11) sind alle erst ganz am Ende aufgetaucht — Lebenszyklus der App, nicht Features. Nicht getestet: Installer/SystemCheckPage, Ticketsystem-Anbindung (beide brauchen echtes Setup), 3.7 Handler-Abbruch nur oberflächlich. ## Delegiert als Tasks (Liste „Claude do", alle Idle) | Task | Deckt ab | |---|---| | **#339** Shutdown beendet den Prozess nicht, Worker-Neustart tut nichts | F9 + F11 | | **#340** App-Speicherverbrauch messen — nur Diagnose | F10 | | **#341** duplizierter Confirm-Dialog mit „Delete"-Knopf | F4 + F5 | | **#342** Ordner-Toggle schluckt schnelle Klicks | F1 | | **#343** Diff-Viewer horizontal nicht synchron | F3 | | **#344** dirty Ziel früh melden statt nach dem Fehlschlag | F6 | | **#345** Bilder aus der Zwischenablage ins Terminal | F8 | | **#346** Worktrees-Übersicht: Nummern + Truncation | F7 | Nicht delegiert: **F2** (Modell für interaktive Sessions erzwingen) — Entscheidung Mika offen. ## Fix-Liste | # | Pass | Befund | Schwere | |---|------|--------|---------| | F9 | 4.6 | **„Shutdown" beendet die App nicht — der Prozess überlebt.** `IslandsShellViewModel.cs:705` `ShutdownWorkerAndCloseApp` killt den Worker und ruft dann nur `CloseWindow` für das Hauptfenster. Mission Control, Cheat-Sheets und der Diff-Viewer sind eigene `Window`-Instanzen, bleiben offen und halten den Avalonia-Prozess am Leben (bestätigt: alle Nebenfenster standen nach dem „Shutdown" noch offen, `ClaudeDo.App` weiterhin im Task-Manager). Fix: alle Fenster schließen bzw. `IClassicDesktopStyleApplicationLifetime.Shutdown()` statt `CloseWindow`. | **hoch** | | F10 | — | **App-Speicherverbrauch ~1,2 GB.** Gemessen 2026-09-16 am laufenden Debug-Build: `ClaudeDo.App` 1227 MB, `ClaudeDo.Worker` 209 MB. Der Worker wurde 2026-09-02 (`c347e4fc`) bewusst auf Workstation-GC umgestellt, die App offenbar nicht — erster Verdacht, aber ungeprüft. Braucht eine echte Messung (Server-GC? gehaltene Log-/Diff-Puffer? ConPTY-Scrollback?), keinen Blindfix. | **hoch** | | F11 | 5.5 | **Worker-Neustart über den Button funktioniert nicht.** `IslandsShellViewModel.cs:656` `RestartWorkerService` beginnt mit `_workerLocator.Find()` und wirft „Worker executable not found", wenn nichts passt. **Hypothese, nicht verifiziert:** der Locator findet den *installierten* Worker (`C:\Program Files\ClaudeDo`), während der Debug-Build aus dem Repo läuft — dann wird der falsche oder gar kein Prozess gekillt/gestartet. Erst reproduzieren und die Footer-Meldung lesen, dann fixen. | **hoch** | | F8 | 3.2 | **Bilder aus der Zwischenablage lassen sich nicht ins interaktive Terminal einfügen** (Text geht). `InteractiveTerminalViewModel.PasteAsync` → `PtyTerminalSession.PasteAsync` liest nur Text. Lazy Fix: Bild-Clipboard in eine temporäre PNG schreiben und deren Pfad über den bereits funktionierenden Drop-Pfad (`SendTextAsync`) einfügen — Claude liest die Datei dann selbst. Kein neuer Mechanismus nötig. | mittel | | F6 | 2.6 | **Dirty-Target wird zu spät gemeldet.** `dirty_target` kommt erst als Fehlerergebnis *nachdem* der Merge gedrückt und abgelehnt wurde — der Zustand des Ziel-Trees ist aber schon beim Öffnen des Merge-Modals bekannt. Wunsch (Mika): beim Laden des Modals prüfen, Hinweis + „Änderungen stashen und mergen" direkt anbieten; ggf. schon im Diff-Viewer signalisieren. Betrifft beide Pfade (Approve + Merge-Modal). | mittel | | F7 | 2.8 | **Worktrees-Übersicht zeigt keine Task-Nummern.** TASK-Spalte listet nur den Titel; die Task-Numbers-Feature hat Zeile, Detail-Chip und Worker-Log abgedeckt, diese Tabelle nicht. Zusätzlich ist die DIFF-Spalte hart abgeschnitten ohne Ellipse (`docs/notes.m`, `1 file chan`) — gleiches Truncation-Muster wie im Usage-Monitor (F-Nit 5.3). | niedrig | | F4 | 2.5 | **Stash-Bestätigung trägt „Delete" als Bestätigungsknopf.** `DetailsIslandView.axaml.cs:262-263` ist eine zweite, kopierte Confirm-Dialog-Implementierung mit hartkodiertem `Content = "Delete"` (+ `Classes = { "danger" }`); `DetailsIslandViewModel.ConfirmAsync` hängt daran statt am gemeinsamen `WindowDialogService.ConfirmAsync:209` (dort korrekt „Confirm"). Der Stash-Dialog erbt damit die Beschriftung eines Lösch-Dialogs — irreführend bis gefährlich. Fix: Duplikat löschen, VM an den Service-Dialog hängen. | **hoch** | | F5 | 2.5 | **Confirm-/Error-Dialoge sind nicht lokalisiert.** Beide Implementierungen setzen `"Cancel"`/`"Confirm"`/`"Delete"`/`"OK"` und den Fenstertitel `"Confirm"`/`"Error"` als String-Literal, kein `Loc.T`. Fällt mit F4 zusammen erledigen. | mittel | | F3 | 2.2 | **Diff-Viewer scrollt nur vertikal synchron.** `DiffEditorSetup.cs` — die Sync-Klasse heißt `VerticalScrollSync`, Zeile 147 schreibt `new Vector(viewer.Offset.X, y)` und behält das X der Zielspalte bei; horizontal wurde nie verdrahtet, beide Seiten scrollen seitwärts unabhängig. Fix: X 1:1 mitspiegeln (gleiche Schrift/Breite in beiden Panes), Klasse entsprechend umbenennen. | mittel | | F2 | 2.1 | **Feature-Wunsch (kein Bug):** interaktive ConPTY-Sessions starten unter dem Modell aus Mikas Claude-Config, nicht unter dem im Task gewählten. Bewusste Entscheidung, siehe `docs/open.md:35` (`--effort` ja, `--model` nein) — dort schon als möglicher Folge-Task vermerkt. Entscheidung Mika offen. | Wunsch | | F1 | 1.2 | **Ordner-Toggle schluckt schnelle Klicks.** `ListsIslandViewModel.cs:626` `ToggleFolderAsync` ist ein async `[RelayCommand]` → `AsyncRelayCommand` setzt `CanExecute=false` für die Dauer des DB-Writes (`SetFolderCollapsedAsync`); jeder Klick in diesem Fenster wird verworfen. Fix: Toggle synchron (UI-State sofort), Persistierung fire-and-forget. Gleiches Muster in der Sidebar auf andere async RelayCommands gegenprüfen. | mittel |