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.
This commit is contained in:
@@ -89,9 +89,14 @@ Gilt für alle vier Gruppen:
|
|||||||
|
|
||||||
## P0 — Fundament
|
## P0 — Fundament
|
||||||
|
|
||||||
- [ ] **P0-1 — `OperationStatus` + `OperationIndicator` + Locale-Keys**
|
- [x] **P0-1 — `OperationStatus` + `OperationIndicator` + Locale-Keys**
|
||||||
- [ ] **P0-2 — Timing-Hook für die Messung**
|
- [x] **P0-2 — Timing-Hook für die Messung**
|
||||||
- [ ] **P0-3 — Regel in den CLAUDE.md-Dateien**
|
- [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.
|
**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
|
## Gruppe A — Bild 1: UI-Stille
|
||||||
|
|
||||||
- [ ] **A1 — Detail-Pane** ⚠️ *der gemeldete Fall*
|
- [x] **A1 — Detail-Pane** ⚠️ *der gemeldete Fall*
|
||||||
- [ ] **A2 — WorktreesOverview**
|
- [x] **A2 — WorktreesOverview**
|
||||||
- [ ] **A3 — Settings-Tabs**
|
- [x] **A3 — Settings-Tabs** — ohne OnlineInbox-SignIn, siehe Nachzügler unten
|
||||||
- [ ] **A4 — Reports und Planning-UI**
|
- [x] **A4 — Reports und Planning-UI** — ohne die beiden Planning-Calls im `DiffViewerViewModel`
|
||||||
- [ ] **A5 — Island-DB-Pfade nach Messdaten**
|
- [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.
|
**Vorbedingung:** P0 gemergt.
|
||||||
|
|
||||||
@@ -274,9 +286,9 @@ bleibt unangetastet.
|
|||||||
|
|
||||||
## Gruppe B — Bild 2: UI-Freeze
|
## Gruppe B — Bild 2: UI-Freeze
|
||||||
|
|
||||||
- [ ] **B1 — `UnifiedDiffParser.Parse` auslagern**
|
- [x] **B1 — `UnifiedDiffParser.Parse` auslagern**
|
||||||
- [ ] **B2 — `DiffAlignment.Build` Grenze**
|
- [x] **B2 — `DiffAlignment.Build` Grenze**
|
||||||
- [ ] **B3 — Guard-Test gegen Dispatcher-Blockade**
|
- [x] **B3 — Guard-Test gegen Dispatcher-Blockade**
|
||||||
|
|
||||||
**Vorbedingung:** P0 gemergt (für den Indikator in B1).
|
**Vorbedingung:** P0 gemergt (für den Indikator in B1).
|
||||||
|
|
||||||
@@ -333,12 +345,16 @@ zukünftige Regressionen fangen.
|
|||||||
|
|
||||||
## Gruppe C — Bild 3: Worker-Stille
|
## Gruppe C — Bild 3: Worker-Stille
|
||||||
|
|
||||||
- [ ] **C1 — generischer `OperationProgress`-Kanal**
|
- [x] **C1 — generischer `OperationProgress`-Kanal**
|
||||||
- [ ] **C2 — Startup-Recovery sichtbar**
|
- [ ] **C2 — Startup-Recovery sichtbar**
|
||||||
- [ ] **C3 — Worktree-Anlage sichtbar**
|
- [ ] **C3 — Worktree-Anlage sichtbar**
|
||||||
- [ ] **C4 — Rebase-after-Merge und WorktreeMaintenance**
|
- [ ] **C4 — Rebase-after-Merge und WorktreeMaintenance**
|
||||||
- [ ] **C5 — periodische Dienste**
|
- [ ] **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`
|
**Vorbedingung:** P0 gemergt. Die Abhängigkeit zur Parallelsession ist mit `cad0582`
|
||||||
aufgelöst.
|
aufgelöst.
|
||||||
|
|
||||||
@@ -418,10 +434,14 @@ Anzeige-Rauschen erzeugt, **weglassen und begründen** statt durchziehen.
|
|||||||
|
|
||||||
## Gruppe D — Bild 4: MCP-Stille
|
## Gruppe D — Bild 4: MCP-Stille
|
||||||
|
|
||||||
- [ ] **D1 — `ProgressReporter` extrahieren**
|
- [x] **D1 — `ProgressReporter` extrahieren**
|
||||||
- [ ] **D2 — die 8 `batch_*`-Tools**
|
- [x] **D2 — die `batch_*`-Tools** — es sind **sieben**, nicht acht (die Achterzahl unten war ein
|
||||||
- [ ] **D3 — Worktree- und Diff-Tools**
|
Zählfehler beim Schreiben des Plans)
|
||||||
- [ ] **D4 — Rest und Doku-Regel**
|
- [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.
|
**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
|
die Progress-Schleife an. Wenn beide Gruppen gleichzeitig laufen, ist das die Stelle, die der
|
||||||
Merge-Helper im Auge behalten muss.
|
Merge-Helper im Auge behalten muss.
|
||||||
- **Keine Locale-Keys** (Nachbesserung 3). Englische Klartext-Strings.
|
- **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
|
`batch_cleanup_task_worktrees`, `get_task_diff`, `preview_merge_set`. Bereits versorgt und
|
||||||
nicht anzufassen: die 5 Tools in `ExternalMcpService` mit `IProgress`, `TaskWaitMcpTools`,
|
nicht anzufassen: die 5 Tools in `ExternalMcpService` mit `IProgress`, `TaskWaitMcpTools`,
|
||||||
`merge_task`/`review_task`.
|
`merge_task`/`review_task`.
|
||||||
@@ -461,7 +481,7 @@ anfassen.
|
|||||||
*Dateien:* `Worker/Lifecycle/TaskMergeService.cs`, neue Klasse im Worker-Projekt
|
*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.
|
*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
|
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
|
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.
|
einen Merge durchlaufen lässt, den Task aber nie auf `Done` bringt.
|
||||||
@@ -486,9 +506,9 @@ Tool.
|
|||||||
|
|
||||||
## Was nach allen vier Gruppen offen bleibt
|
## Was nach allen vier Gruppen offen bleibt
|
||||||
|
|
||||||
- **Visuelle Prüfung** für alle Pakete in A und B — der Nutzer, nicht ein Agent.
|
- ~~**Visuelle Prüfung** für alle Pakete in A und B~~ — **am 2026-08-17 durch**, ohne Fund
|
||||||
- **Auswertung von P0-2** steuert A5 und die Feinheiten in C. Vorher ist A5 absichtlich
|
(Worktrees-Übersicht, Settings/Skill-Install, WeeklyReport, großer Diff, Detail-Pane-Approve).
|
||||||
unbestimmt.
|
- ~~**Auswertung von P0-2**~~ — am 2026-08-13 ausgewertet, siehe A5.
|
||||||
- **`MergeProgressEvent`-Forwarder entfernen**, sobald A und C beide gemergt sind. Ein
|
- **`MergeProgressEvent`-Forwarder entfernen**, sobald A und C beide gemergt sind. Ein
|
||||||
Aufräum-Task, kein Paket.
|
Aufräum-Task, kein Paket.
|
||||||
- **Bewusst nicht gebaut:** Cancel, Footer-Anzeige für laufende Operationen, Prozentbalken,
|
- **Bewusst nicht gebaut:** Cancel, Footer-Anzeige für laufende Operationen, Prozentbalken,
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ new editor boilerplate there rather than copying it a third time.
|
|||||||
- **IPrimeScheduleApi** — prime-schedule CRUD.
|
- **IPrimeScheduleApi** — prime-schedule CRUD.
|
||||||
- **UpdateCheckService** — polls releases; `LastCheckStatus`/`LatestVersion`/`CheckNowAsync` feed the shell's update banner.
|
- **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.
|
- **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:<source>` 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:<source>` 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**.
|
- **RepoScanner**, **InstallArtifactLocator**/**InstallerLocator**/**WorkerLocator**, **ForegroundHelper** (Win32 foreground before launching a terminal), **FocusClearing**.
|
||||||
|
|
||||||
## Converters
|
## Converters
|
||||||
|
|||||||
Reference in New Issue
Block a user