docs: record the operation-feedback state before the v2.10.0 cut
Changelog / changelog (push) Successful in 2s
Release / release (push) Successful in 43s

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:
mika kuns
2026-08-17 11:45:03 +02:00
parent 0e314e44dd
commit f9a8ed761a
2 changed files with 42 additions and 22 deletions
@@ -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: C2C5.
**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.** C2C5 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)
- [ ] **D4Rest und Doku-Regel** - [x] **D3Worktree- und Diff-Tools** — drei davon; `batch_cleanup_task_worktrees` lief über D2
- [x] **D4 — Rest und Doku-Regel** — fand zwei echte Lücken, die D1D3 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,
+1 -1
View File
@@ -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