## Schlussverdikt: **BLOCK** **P0: 0 · P1: 2 · P2: 3** ### P0 Keine P0-Funde. ### P1 – release-blockierend 1. **`link_existing` löst eine wirtschaftliche Kollision nicht dauerhaft auf** - `src/jarvis_finance/services/truewealth_productization.py:306-328` - `src/jarvis_finance/services/truewealth_productization.py:550-591` - Die explizite Entscheidung wird nur während des aktuellen Previews angewandt. Beim Confirm wird weder eine dauerhafte Bank→Cashflow-Lineage noch die konkrete Kollisionsentscheidung gespeichert. - Reproduziert: `link_existing` wurde erfolgreich bestätigt, `written_cashflows=0`; ein anschließender identischer Preview ohne erneute Entscheidung war wieder `can_confirm=false` mit `economic_collision_without_exact_lineage`. Auch das Audit enthielt `link_existing` nicht. - **Fix:** bestätigte Link-Entscheidung atomar als eigene immutable Zuordnung/Auditdimension persistieren und bei späteren Previews als exakte Lineage berücksichtigen. 2. **Widersprüchliche CHF-/FX-Werte können weiterhin als sicher bestätigt werden** - `src/jarvis_finance/services/truewealth_productization.py:235-248` - `src/jarvis_finance/services/truewealth_productization.py:434-450` - Geprüft werden nur `currency_original='CHF'`, ein nicht-null `amount_chf` und `fx_status='not_needed'`. Konsistenz von `amount_chf`, Originalbetrag und `fx_rate_to_chf=1` wird nicht geprüft. - Reproduziert: Zahlung `amount_original=-600 CHF`, aber `amount_chf=-1` und `fx_rate_to_chf=2`, blieb `secure` und `can_confirm=true`. - **Fix:** für CHF Identitätskurs 1 und betrags-/vorzeichenkonsistente CHF-Felder verlangen; jede Abweichung als `uncertain` einstufen und den gesamten Confirm blockieren. ### P2 1. **Read-only-Aktivierungstest verwendet weiterhin eine nicht existierende Route** - `tests/unit/test_sprint20d_truewealth_productization.py:650-654` - Getestet wird `.../truewealth-bank-payments/recipient-rule/activate`; registriert ist `.../truewealth-recipient-rule/activate`. - Beide liefern wegen der globalen Middleware `403`; der Test validiert daher den echten Endpoint nicht. 2. **Rollback-Test enthält zwei wirkungslose Negativassertionen** - `tests/unit/test_sprint20d_truewealth_productization.py:335-341` - Geprüft werden die nicht verwendete Source `truewealth_bank_payment_v1` und die nicht verwendete Audit-Action `truewealth_bank_cashflows_confirmed`. - Tatsächlich verwendet werden `truewealth_raiffeisen_cashflow_v1` und `recipient_rule_and_history_confirmed`. 3. **Modellbewertungs-Idempotenzprüfung liegt vor dem Write-Lock** - `src/jarvis_finance/services/truewealth_valuation.py:301-328` - Existing-Check, Vorgängersnapshot und nächste Version werden vor `BEGIN IMMEDIATE` ermittelt und unter Lock nicht neu geprüft. Parallele identische Läufe können deshalb statt idempotentem Erfolg mit einem Unique-Konflikt/`failed` enden. - **Fix:** Existing-Check sowie Vorgänger/Version innerhalb des Write-Locks erneut bestimmen. ### Verifikation - Fokus-Backendtests: **51 bestanden** - Ruff 0.15.13: **erfolgreich** - `git diff --check`: **erfolgreich** - Ausschließlich In-Memory-/synthetische Gegenproben; keine Produktions-DB geöffnet - Keine Dateien erstellt oder verändert.