- **Important — v2 rerun rewrites v1 market/FX provenance.** `portfolio_analytics.py:419-427` persists every successful live quote through upsert, while `portfolio_analytics.py:446-450` similarly upserts FX rates. On an algorithm-version rerun, those existing same-date/provider rows have their `run_id` reassigned from the immutable v1 run to the new v2 run. Runtime probe confirmed the v1 run and analysis snapshot remained, but all successful v1 `market_prices` and `fx_rates` rows were repointed to the v2 run. The new test only checks that the one cache-fallback row is unchanged (`test_portfolio_market_analytics_v1.py:206-220`); it does not exercise a pre-existing partial v1 run or verify preservation of its successful quote/FX lineage. - **Important — cached `stale` quotes are silently promoted to fresh/complete coverage.** `_cached_exact_date_quote` explicitly accepts both `fresh` and `stale` rows (`portfolio_analytics.py:148-171`), but the cached row’s `quality_status` is ignored when quality and coverage are calculated solely from its timestamp (`portfolio_analytics.py:415-418, 471, 584-596`). A runtime probe with an exact-date cached row marked `stale` produced `price_coverage_pct=100.00`, a `complete` run and `complete` instrument valuation, with no `stale_price` reason. The added test uses only the default-fresh cache row (`test_portfolio_market_analytics_v1.py:196-205`) and therefore misses this overclaim. - **Moderate — the v2 audit cannot identify the cached quote used.** The fallback query does not retain `market_price_id`, original `run_id`, `fetched_at`, or `created_at` (`portfolio_analytics.py:148-173`). Downstream snapshots record only value/date/quality and point `source_reference` at the new v2 run (`portfolio_analytics.py:466-503`), while the run audit records only the generic `cached_exact_date_price` reason (`portfolio_analytics.py:600-614`). Consequently, the new v2 run cannot be traced to a specific immutable cached input—especially problematic because market-price rows remain mutable upserts. - **Moderate — `price_stored` overstates writes when cache fallback is used.** Cached quotes deliberately skip storage (`portfolio_analytics.py:419-427`), but `price_stored` is still set to `len(quotes)` (`portfolio_analytics.py:580-582`). The new test codifies `price_stored == 3` despite only two prices being written by that run (`test_portfolio_market_analytics_v1.py:214-220`), making the run’s persisted coverage metric materially misleading. No files were created or modified. The containing integration test passed: **18 passed**.