TestDbFactory was redeclared as a private nested class in 40 test files,
NullServiceProvider and StubNotesApi in 14 each, DefaultStub in 5 — 73
declarations, all semantically identical (StubNotesApi differed only in
formatting and type qualification). They now live in TestDoubles.cs next to the
existing StubWorkerClient, which was already the shared-double pattern in this
project.
Drei unabhängige Reactivity-Bugs aus dem Polish-Audit 2026-08-20:
1. Description-Autosave überschrieb den falschen Task, weil SaveDescriptionAsync
Task.Id/EditableDescription erst nach dem 400ms-Debounce las statt Row+Wert an
der Aufrufstelle zu capturen (wie SaveTitleAsync es schon tat). Bind() cancelt
jetzt zusätzlich einen laufenden Title-/Description-Save der vorherigen Row.
2. UsageMonitorModalViewModel abonnierte UsageUpdatedEvent erst nach dem
Erst-Load-Await — schloss man das Modal währenddessen, lief das Unsubscribe in
Close() ins Leere und die VM hing für immer am WorkerClient. Ein _isClosed-Flag
wird jetzt nach dem Await geprüft, bevor abonniert wird.
3. Per MCP erstellte Listen blieben unsichtbar: RefreshRowAsync hatte keinen
Add-Zweig für unbekannte Ids und verglich zudem die falsche Id-Form (der
Worker broadcastet die rohe DB-Id, nie die "user:"-prefixte Row-Id). Ein
Reconnect lud zudem nur Counts statt der vollen Listen neu.