From 05deda83431ca164e5e3a07bf460002e3de95b45 Mon Sep 17 00:00:00 2001 From: mika kuns Date: Wed, 30 Sep 2026 08:14:26 +0200 Subject: [PATCH] docs: add visual verification session notes 2026-09-16 --- docs/test-session-2026-09-16.md | 161 ++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 docs/test-session-2026-09-16.md diff --git a/docs/test-session-2026-09-16.md b/docs/test-session-2026-09-16.md new file mode 100644 index 00000000..e930e72e --- /dev/null +++ b/docs/test-session-2026-09-16.md @@ -0,0 +1,161 @@ +# 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 |