**Verdict: BLOCK** — exact tree `97971e47f40cc85b8d0b2a404d50a97132f1e2c4` ### P0 — 0 ### P1 — 3 1. **No-op refresh can write valuation snapshots** - `src/jarvis_finance/services/market_service.py:418-428` invokes `run_daily_market_valuation()` whenever coverage is complete, even when `updated == 0`. - Deterministic probe with one pre-cached quote returned `updated=0`, `cached=1`, but changed `portfolio_valuation_snapshots` from **0 to 2**. - Additionally, `asset_price_refresh.py:183-189,388` treats provider metadata replays as updates in this tree, allowing an aggregate wealth snapshot despite no new economic observation. - **Fix:** gate valuation and aggregate snapshot creation on newly persisted economic observations, not cache coverage or provider-processing counts. 2. **Canonical source identity is not the required stable tuple** - `src/jarvis_finance/market_data/prices.py:518-525` includes mutable `provider_symbol` and `price_type` in `source_observation_id`. - Counterprobe using the same provider, instrument and exact quote timestamp but a corrected symbol produced two unrelated identities, both `payload_version=1`, with no predecessor. - This violates provider + instrument + precise quote-time identity and loses correction lineage when mappings/symbols change. - **Fix:** derive source identity solely from normalized provider, canonical instrument ID and precise provider timestamp; keep symbol/type in the economic payload. 3. **UI presents the model date as a price date** - `frontend/src/components/wealth/WealthCockpitPanel.vue:38-40` labels `modelled.current.date` as **“Verwendeter Kursstichtag”**. - The backend sets point `date` from the model timeline (`modelled_wealth.py:725-732`), while actual component provenance is separately held in `source_date`. - Carried/stale prices can therefore display today as the supposedly used course date. - **Fix:** expose and render an authoritative quote/source-date aggregate, or relabel this field as “Modellstand” and show actual price provenance separately. ### P2 — 1 1. **Displayed valuation-quality counts count heterogeneous components, not valuations** - `WealthCockpitPanel.vue:111` counts five wealth component categories and then adds `unknown_accounts`; line 40 labels these totals **“Bewertungen”**. - This can materially confuse source categories/accounts with asset valuations. - **Fix:** return valuation counts from the backend at the intended instrument/account granularity, or label these explicitly as component categories. ### Evidence / notes - Focused backend gates passed: **27 tests passed**. - No repository files were modified. - The staged index changed concurrently during review from requested tree `97971e47` to `825cc9b8`; findings above remain explicitly bound to immutable tree `97971e47`.