**P0: 0** **P1: 3** 1. **Provider-Quote-Identität und Währung werden weiterhin nicht validiert** `src/jarvis_finance/services/crypto_market_recovery.py:133-176, 183-189` `provider_key == "coingecko"` prüft nur das Provider-Objekt. Die zurückgegebene `PriceQuote` wird weder auf `coingecko_id == requested_id`, `currency == CHF` noch `provider == CoinGecko` geprüft. Ein zugelassener Provider lieferte im Gegenprobe-Test USD-Quotes mit falscher ID und `OtherProvider`; das Ergebnis war trotzdem `complete` und wurde als CHF bewertet. **Fix:** Alle Quote-Dimensionen fail-closed validieren und adversarielle Tests für falsche interne ID, Währung und Providerkennung ergänzen. 2. **Aktivierung kann durch einen vorherigen manuellen Lauf umgangen werden** `src/jarvis_finance/services/crypto_market_recovery.py:402-417` `_existing_complete()` wird vor `require_activation` ausgewertet. Nach einem manuellen erfolgreichen One-shot liefert der nicht aktivierte Schedulerpfad daher `complete/idempotent` statt `not_activated`. Gegenprobe: `complete → complete True` ohne Aktivierung. **Fix:** Aktivierung vor jedem Existing-run-Return prüfen; Regressionstest „manual complete, anschließend scheduled ohne Aktivierung“. 3. **Same-day Input-Drift wird fälschlich als idempotenter Erfolg behandelt** `src/jarvis_finance/services/crypto_market_recovery.py:285-311, 402-405` Der gespeicherte `input_fingerprint` wird beim Existing-run-Return nicht mit aktuellen Holdings, Mappings oder Preisinputs verglichen. Nach Änderung einer Holding blieb die Bewertung in der Gegenprobe bei `500.0`, und der Lauf meldete `idempotent=True`. Damit kann die als aktuell ausgewiesene Bewertung nachweislich veraltet sein. **Fix:** Aktuelle konsumierte Inputs gegen den gespeicherten Fingerprint prüfen und bei Drift fail-closed bzw. mit expliziter Supersession neu versionieren. **P2: 0** ## Verdict: **BLOCK** Keine Dateien verändert. Fokusprüfungen waren grün (`14` Python- und `22` Frontend-Tests); sie decken die drei Gegenbeispiele jedoch nicht ab.