14 KiB
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
ReorderSidebarAsyncwirklich 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
WaitingForReviewund 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
#334im 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 inC:\TestRepos\ClaudeDoTestssind 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
Mergeddrin, 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
exittippen) → 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 updateaus, 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:
#334steht 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 |