## Verdict: **BLOCK** Snapshot: `9667b08a14a04feccc2d8089b374af7eb4046d2b` plus Dirty-Tree. **P0: 0 · P1: 6 · P2: 1** ### P1 — Release-Blocker 1. **Krypto-Tagesbewertung erreicht die kanonische Performance nicht** - `crypto_market_recovery.py:470-490` schreibt auf den virtuellen Scope `crypto-recorded-holdings` mit `account_id=NULL`. - Der Performance-Reader akzeptiert nur aktivierte Account-IDs (`performance_activation.py:424-443`). - Gegenprobe nach erfolgreichem One-shot: `already_complete_days=0`, `days_to_materialize=1`. - **Fix:** Snapshot auf den kanonischen `crypto_portfolio`-Account schreiben oder einen ausdrücklich getesteten Aggregat-zu-Performance-Vertrag ergänzen. 2. **Same-day Replay ist nicht an aktuelle Inputs gebunden** - `crypto_market_recovery.py:393-395` liefert vor Inventar-/Provider-Prüfung jeden vorhandenen Tageslauf als idempotent zurück. - Gegenprobe: ETH-Bestand von `2` auf `9` geändert; Replay meldete weiterhin `500.0`, `idempotent=True`. - Damit werden Bestands-, Mapping- und Kursänderungen desselben Tages still ignoriert. - **Fix:** Fingerprint unter Lock neu bilden und vergleichen; bei Drift entweder fail-closed oder append-only Korrektur mit Version/Supersession. 3. **Source-Aktivierung kann durch vorhandenen manuellen Lauf umgangen werden** - Die Existing-run-Rückgabe erfolgt vor `require_activation` (`crypto_market_recovery.py:393-406`). - Ein manueller One-shot kann daher den späteren Daily-Pfad ohne aktivierte Quelle als erfolgreich erscheinen lassen. - **Fix:** Aktivierungsprüfung vor jede Existing-run-Rückgabe im scheduler-gesteuerten Pfad setzen. 4. **Live-Dry-run öffnet eine veränderliche Runtime-DB standardmäßig als `immutable=1`** - `database.py:19-24`, CLI-Aufruf ohne Override in `cli/main.py:183-195`. - `immutable=1` setzt voraus, dass DB/WAL sich nicht ändern; das ist für eine laufende Runtime-Datenbank kein belastbarer Live-Snapshot-Vertrag. - **Fix:** Live-Dry-run mit `mode=ro`, `query_only=ON` und normalen SQLite-Locks/Snapshot-Semantik öffnen; `immutable` nur für nachweislich unveränderliche Kopien. 5. **Operational-Status ist für zwei Daily-Quellen hart falsch** - `performance_activation.py:40-43` setzt PostFinance und den historischen Krypto-Pfad immer auf `source_enabled=False`. - Dadurch werden selbst aktivierte/erfolgreiche Quellen als pausiert und „kontrolliert aktivieren“ gemeldet. - **Fix:** Source-Aktivierung aus dem jeweiligen kanonischen Aktivierungsnachweis ableiten und Statusmatrix für alle Quellen testen. 6. **Release-/Acceptance-Evidence nicht vollständig** - `make PYTHON=.venv/bin/python verify` ist nicht grün: 24 Collection-Fehler wegen fehlendem `httpx2`. - Im Sprint-20E-Diff fehlt außerdem ein nachvollziehbarer Sechs-Kandidaten-Nachweis für True Wealth sowie Mapping-Prep-Evidence. - Es fehlen noch der echte read-only Live-Dry-run, installierter Timer-State (`is-active`/`is-enabled`/effektives Environment) und No-write-/Mutation-Sentinel. - **Fix:** Toolchain/Lockfile reproduzierbar schließen, Aggregate-Gate grün ausführen und die genannten read-only Betriebsnachweise vor Release liefern. ### P2 1. **UI verschluckt Fehler des Daily-Status-Endpunkts** - `PortfolioPerformancePanel.vue:216` setzt bei Fehler lediglich `dailyJob=null`; die Statuskarte verschwindet ohne Fehlermeldung. - **Fix:** expliziten unavailable/error state mit nächster Aktion anzeigen. ### Grüne Teilnachweise - Backend fokussiert: **65 passed**. - Frontend fokussiert: **21 passed**. - Frontend-Typecheck: **grün**. - Python-Compile: **grün**. - `git diff --check`: **grün**. - Source-Isolation, fail-closed Timer-Unit und Transaktionsblock sind grundsätzlich vorhanden, schließen die obigen Identitäts-/Replay-Lücken aber nicht. ### Dateien / Eingriffe - **Keine Implementierungs- oder produktiven Dateien von mir geändert.** - Keine Produktionsaktionen, keine produktiven DB-/Provider-Writes. - Testausführung berührte nur ignorierte lokale `.venv`-/`__pycache__`-Artefakte. - `uv.lock` erschien während des Reviews als untracked und gehört deshalb vor Release ausdrücklich in die Scope-/Mutation-Prüfung.