From f9a8ed761a6faee292c1fe16f694a923084db51f Mon Sep 17 00:00:00 2001 From: mika kuns Date: Mon, 17 Aug 2026 11:45:03 +0200 Subject: [PATCH] docs: record the operation-feedback state before the v2.10.0 cut Plan checkboxes stood at zero although P0, A, B, C1 and D are all merged -- anyone reading it would have assumed nothing was built. Ticks the merged packages, records A5's cancellation and the visual pass, and names the two leftovers (the three unused ops.* keys from A3/A4, C2-C5 as the only open group). Also corrects the batch_* tool count from eight to seven and puts the OperationTiming kill-switch note in the Ui CLAUDE.md back into English. --- .../plans/2026-08-11-operation-feedback.md | 62 ++++++++++++------- src/ClaudeDo.Ui/CLAUDE.md | 2 +- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/docs/superpowers/plans/2026-08-11-operation-feedback.md b/docs/superpowers/plans/2026-08-11-operation-feedback.md index e083aa6e..78275a4a 100644 --- a/docs/superpowers/plans/2026-08-11-operation-feedback.md +++ b/docs/superpowers/plans/2026-08-11-operation-feedback.md @@ -89,9 +89,14 @@ Gilt für alle vier Gruppen: ## P0 — Fundament -- [ ] **P0-1 — `OperationStatus` + `OperationIndicator` + Locale-Keys** -- [ ] **P0-2 — Timing-Hook für die Messung** -- [ ] **P0-3 — Regel in den CLAUDE.md-Dateien** +- [x] **P0-1 — `OperationStatus` + `OperationIndicator` + Locale-Keys** +- [x] **P0-2 — Timing-Hook für die Messung** +- [x] **P0-3 — Regel in den CLAUDE.md-Dateien** + +> **Stand 2026-08-17.** P0, A (außer A5), B, C1 und D sind gemergt; der visuelle Pass über A und B +> ist durch, ohne Fund. Nachtrag zu P0-2: der Timing-Sink liegt seit dem Release-Vorlauf hinter +> `CLAUDEDO_OP_TIMING=1` und ist **standardmäßig aus** — die 63 `InvokeTimedAsync`-Call-Sites +> bleiben bewusst stehen. Offen: C2–C5. **Vorbedingung:** keine. Muss allein landen, bevor A/B/C starten. @@ -189,11 +194,18 @@ MCP-Tool, das über ~5 s laufen kann, reportet Progress. ## Gruppe A — Bild 1: UI-Stille -- [ ] **A1 — Detail-Pane** ⚠️ *der gemeldete Fall* -- [ ] **A2 — WorktreesOverview** -- [ ] **A3 — Settings-Tabs** -- [ ] **A4 — Reports und Planning-UI** -- [ ] **A5 — Island-DB-Pfade nach Messdaten** +- [x] **A1 — Detail-Pane** ⚠️ *der gemeldete Fall* +- [x] **A2 — WorktreesOverview** +- [x] **A3 — Settings-Tabs** — ohne OnlineInbox-SignIn, siehe Nachzügler unten +- [x] **A4 — Reports und Planning-UI** — ohne die beiden Planning-Calls im `DiffViewerViewModel` +- [x] ~~**A5 — Island-DB-Pfade nach Messdaten**~~ — **abgesagt** (2026-08-13): kein DB-Pfad über + 500 ms (höchster p95 372 ms), die Ausreißer saßen alle auf der Hub-Seite. Wie vorgesehen + geschlossen, ohne Code. + +**Nachzügler (kein Task):** drei Locale-Keys aus P0 sind ungenutzt geblieben — +`ops.onlineInbox.signingIn` (A3), `ops.planning.buildingIntegrationBranch` und +`ops.planning.loadingAggregate` (A4). Die beiden Planning-Calls liegen in +`DiffViewerViewModel.cs`, einer Datei aus Gruppe B, die A4 nicht anfassen durfte. **Vorbedingung:** P0 gemergt. @@ -274,9 +286,9 @@ bleibt unangetastet. ## Gruppe B — Bild 2: UI-Freeze -- [ ] **B1 — `UnifiedDiffParser.Parse` auslagern** -- [ ] **B2 — `DiffAlignment.Build` Grenze** -- [ ] **B3 — Guard-Test gegen Dispatcher-Blockade** +- [x] **B1 — `UnifiedDiffParser.Parse` auslagern** +- [x] **B2 — `DiffAlignment.Build` Grenze** +- [x] **B3 — Guard-Test gegen Dispatcher-Blockade** **Vorbedingung:** P0 gemergt (für den Indikator in B1). @@ -333,12 +345,16 @@ zukünftige Regressionen fangen. ## Gruppe C — Bild 3: Worker-Stille -- [ ] **C1 — generischer `OperationProgress`-Kanal** +- [x] **C1 — generischer `OperationProgress`-Kanal** - [ ] **C2 — Startup-Recovery sichtbar** - [ ] **C3 — Worktree-Anlage sichtbar** - [ ] **C4 — Rebase-after-Merge und WorktreeMaintenance** - [ ] **C5 — periodische Dienste** +> **Einzige offene Gruppe.** C2–C5 sind unblockiert (C1 ist gemergt). Woran man den Reststand +> erkennt: die vier Keys `ops.worker.startupRecovery`, `.creatingWorktree`, `.rebasingAfterMerge` +> und `.maintainingWorktrees` liegen ungenutzt in beiden Sprachdateien. + **Vorbedingung:** P0 gemergt. Die Abhängigkeit zur Parallelsession ist mit `cad0582` aufgelöst. @@ -418,10 +434,14 @@ Anzeige-Rauschen erzeugt, **weglassen und begründen** statt durchziehen. ## Gruppe D — Bild 4: MCP-Stille -- [ ] **D1 — `ProgressReporter` extrahieren** -- [ ] **D2 — die 8 `batch_*`-Tools** -- [ ] **D3 — Worktree- und Diff-Tools** -- [ ] **D4 — Rest und Doku-Regel** +- [x] **D1 — `ProgressReporter` extrahieren** +- [x] **D2 — die `batch_*`-Tools** — es sind **sieben**, nicht acht (die Achterzahl unten war ein + Zählfehler beim Schreiben des Plans) +- [x] **D3 — Worktree- und Diff-Tools** — drei davon; `batch_cleanup_task_worktrees` lief über D2 +- [x] **D4 — Rest und Doku-Regel** — fand zwei echte Lücken, die D1–D3 offen gelassen hatten: + `continue_merge` reichte sein Progress-Token nicht ins Post-Merge-Verify-Gate, und der + Unit-Merge-Drain im `PlanningMergeOrchestrator` verlor es nach dem ersten Tick. Dazu + `list_worktrees`. **Vorbedingung:** keine. Kann sofort starten, parallel zu P0. @@ -438,7 +458,7 @@ Anzeige-Rauschen erzeugt, **weglassen und begründen** statt durchziehen. die Progress-Schleife an. Wenn beide Gruppen gleichzeitig laufen, ist das die Stelle, die der Merge-Helper im Auge behalten muss. - **Keine Locale-Keys** (Nachbesserung 3). Englische Klartext-Strings. -- **Zielumfang:** die 8 `batch_*`-Tools mit `i/n`, dann `cleanup_task_worktree`, +- **Zielumfang:** die 7 `batch_*`-Tools mit `i/n`, dann `cleanup_task_worktree`, `batch_cleanup_task_worktrees`, `get_task_diff`, `preview_merge_set`. Bereits versorgt und nicht anzufassen: die 5 Tools in `ExternalMcpService` mit `IProgress`, `TaskWaitMcpTools`, `merge_task`/`review_task`. @@ -461,7 +481,7 @@ anfassen. *Dateien:* `Worker/Lifecycle/TaskMergeService.cs`, neue Klasse im Worker-Projekt *Fertig wenn:* Der Merge-Pfad nutzt die extrahierte Klasse, Verhalten unverändert, bestehende Merge-Tests grün. -**D2 · Die acht `batch_*`-Tools mit Element-Fortschritt** +**D2 · Die sieben `batch_*`-Tools mit Element-Fortschritt** Jedes `batch_*`-Tool reportet pro verarbeitetem Element. Grund: ohne Meldung bricht der MCP-Client nach 300 s Stille ab, während der Worker weiterläuft — genau der Mechanismus, der einen Merge durchlaufen lässt, den Task aber nie auf `Done` bringt. @@ -486,9 +506,9 @@ Tool. ## Was nach allen vier Gruppen offen bleibt -- **Visuelle Prüfung** für alle Pakete in A und B — der Nutzer, nicht ein Agent. -- **Auswertung von P0-2** steuert A5 und die Feinheiten in C. Vorher ist A5 absichtlich - unbestimmt. +- ~~**Visuelle Prüfung** für alle Pakete in A und B~~ — **am 2026-08-17 durch**, ohne Fund + (Worktrees-Übersicht, Settings/Skill-Install, WeeklyReport, großer Diff, Detail-Pane-Approve). +- ~~**Auswertung von P0-2**~~ — am 2026-08-13 ausgewertet, siehe A5. - **`MergeProgressEvent`-Forwarder entfernen**, sobald A und C beide gemergt sind. Ein Aufräum-Task, kein Paket. - **Bewusst nicht gebaut:** Cancel, Footer-Anzeige für laufende Operationen, Prozentbalken, diff --git a/src/ClaudeDo.Ui/CLAUDE.md b/src/ClaudeDo.Ui/CLAUDE.md index b5bfb265..3513d04c 100644 --- a/src/ClaudeDo.Ui/CLAUDE.md +++ b/src/ClaudeDo.Ui/CLAUDE.md @@ -89,7 +89,7 @@ new editor boilerplate there rather than copying it a third time. - **IPrimeScheduleApi** — prime-schedule CRUD. - **UpdateCheckService** — polls releases; `LastCheckStatus`/`LatestVersion`/`CheckNowAsync` feed the shell's update banner. - **InheritanceResolver** — resolves the task → list → global override chain to `(value, source)` for the inherited badges. -- **OperationTiming** — NDJSON sink (`~/.todo-app/logs/operation-timing.ndjson`, one rolled `.1` at 4 MB) behind every hub invoke and bulk DB path; each line carries `pid` because app restarts interleave in one file. Standardmäßig aus — `Shared` schreibt nur, wenn die Umgebungsvariable `CLAUDEDO_OP_TIMING=1` beim Prozessstart gesetzt ist (einmal statisch gelesen, kein Overhead pro Call). Successful calls under 25 ms are dropped, **failed/cancelled ones always land** — a 1 ms cancelled `BindAsync` is churn signal, not noise. `DetailsIsland.BindAsync:` carries the selection trigger (`TasksIslandViewModel.SelectionSource`, set via `SelectFrom` — never assign `SelectedTask` directly). `Shared` is a settable static singleton **on purpose** — `Ui.Tests`/`Worker.Tests` each carry a `TestSetup` module initializer that redirects it to a temp file before any test runs (still writing — the kill switch only gates `Shared`'s default, not the constructor), because both projects construct real ViewModels (`DetailsIslandViewModel`, `TasksIslandViewModel`) that call `Shared.Record` directly; without the redirect a single test run appends 50-100 lines straight into the live app's log (a day of ~1900 `BindAsync` lines, 91-96% cancelled, turned out to be 13 such test runs plus pre-fix-binary artifacts — real user-driven binds that day: 4). +- **OperationTiming** — NDJSON sink (`~/.todo-app/logs/operation-timing.ndjson`, one rolled `.1` at 4 MB) behind every hub invoke and bulk DB path; each line carries `pid` because app restarts interleave in one file. Off by default — `Shared` only writes when the environment variable `CLAUDEDO_OP_TIMING=1` is set at process start (read once statically, no per-call overhead). Successful calls under 25 ms are dropped, **failed/cancelled ones always land** — a 1 ms cancelled `BindAsync` is churn signal, not noise. `DetailsIsland.BindAsync:` carries the selection trigger (`TasksIslandViewModel.SelectionSource`, set via `SelectFrom` — never assign `SelectedTask` directly). `Shared` is a settable static singleton **on purpose** — `Ui.Tests`/`Worker.Tests` each carry a `TestSetup` module initializer that redirects it to a temp file before any test runs (still writing — the kill switch only gates `Shared`'s default, not the constructor), because both projects construct real ViewModels (`DetailsIslandViewModel`, `TasksIslandViewModel`) that call `Shared.Record` directly; without the redirect a single test run appends 50-100 lines straight into the live app's log (a day of ~1900 `BindAsync` lines, 91-96% cancelled, turned out to be 13 such test runs plus pre-fix-binary artifacts — real user-driven binds that day: 4). - **RepoScanner**, **InstallArtifactLocator**/**InstallerLocator**/**WorkerLocator**, **ForegroundHelper** (Win32 foreground before launching a terminal), **FocusClearing**. ## Converters