## P0 — 0 Keine verbleibenden P0-Findings. ## P1 — 3 1. **Provider-Quote-Identität wird nicht vollständig validiert** `src/jarvis_finance/services/crypto_market_recovery.py:153-193` Die Auswertung vertraut dem Dictionary-Key, prüft aber `quote.coingecko_id`, `quote.currency` und `quote.provider` nicht gegen Instrument, Zielwährung und Allowlist. Reproduziert: Eine unter `bitcoin` zurückgegebene Quote mit interner ID `ethereum`, Währung `USD` und Provider `Attacker` wurde als `complete` akzeptiert und als CHF 999 bewertet. **Fix:** Vor Bewertung/Persistierung alle Identitätsdimensionen fail-closed prüfen und Gegenbeispiele testen. 2. **Source-Aktivierung wird durch einen bestehenden manuellen Lauf umgangen** `src/jarvis_finance/services/crypto_market_recovery.py:403-417` `_existing_complete()` läuft vor `require_activation`. Nach einem manuellen One-shot liefert ein nicht aktivierter Scheduler-Aufruf deshalb `complete/idempotent`, statt `not_activated`. Reproduziert ohne weiteren Provider-Aufruf. **Fix:** Aktivierung vor jedem Existing-run-Return prüfen; Regression „nicht aktiviert + vorhandener manueller Complete-Run“ ergänzen. 3. **Same-day Replay meldet trotz geänderter Inputs fälschlich Idempotenz** `src/jarvis_finance/services/crypto_market_recovery.py:403-405,432-435` Ein bestehender Complete-Run wird zurückgegeben, bevor der aktuelle Input-Fingerprint ermittelt wird. Nach Änderung der Holding-Menge von 1 auf 2 blieb die Bewertung bei CHF 100, wurde als idempotent gemeldet und der Provider nicht erneut abgefragt. **Fix:** Aktuelle konsumierte Inputs gegen den gespeicherten Fingerprint binden; bei Abweichung fail-closed oder korrigierte Version mit expliziter Supersession erzeugen und testen. ## P2 — 0 Keine zusätzlichen P2-Findings. ## Verdict — **BLOCK** **Nicht commit-reif wegen 3 P1-Codeblockern.** Separat autorisierungspflichtige Produktionsschritte wie Source-/Timer-Aktivierung sind nicht Ursache dieses Verdicts. Review war read-only; keine Dateien erstellt oder verändert.