Files
ClaudeDo/docs/test-session-2026-09-16.md

14 KiB
Raw Permalink Blame History

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