**REJECT — reviewed exact staged tree `9013c922e37649305fc86c2fb5b89ccadc6c6da8`.** ### P0 — 0 ### P1 — 1 - **Existing transactions bypass concurrency serialization** — `src/jarvis_finance/market_data/prices.py:603-604` - Both lock attempts are conditional on `not conn.in_transaction`. Two connections that have already entered ordinary deferred transactions therefore read the same predecessor without first acquiring the write lock. - Adversarial probe: two connections each executed `BEGIN`, synchronized, then submitted corrections for the same observation. Result: one `OperationalError: database is locked`; only versions `[1, 2]` persisted instead of `[1, 2, 3]`. - This contradicts the no-error parallel-correction contract for valid caller-owned transactions. - **Fix:** establish transaction ownership explicitly. Acquire `BEGIN IMMEDIATE` before any caller transaction begins, serialize at an outer transaction boundary, or reject pre-existing transactions and provide a transaction-aware locked API. Add the deferred-transaction concurrency case to the regression. ### P2 — 1 - **Provider-case normalization does not extend to the current-price projection** — `src/jarvis_finance/market_data/prices.py:607-610,629-654` - Observation identity normalizes `provider.lower()`, but `market_prices` lookup/upsert uses the original case-sensitive provider. - Probe with `Mock` followed by `mock` at the same instrument/timestamp produced one observation lineage with versions `[1, 2]`, but **two** `market_prices` rows and different returned current-row IDs. - **Fix:** normalize provider before both observation and `market_prices` lookup/upsert, with a regression asserting one current row and one stable returned ID across equivalent provider casing. ### Evidence - New focused observation suite: **4 passed**. - Final `git write-tree`: still exactly `9013c922e37649305fc86c2fb5b89ccadc6c6da8`. - `git diff --cached --check`: passed. - Files modified by reviewer: **none**. - A broader focused test command exceeded its 240-second bound after 41 progress dots; no full suite was run, as requested. **Counts: P0=0, P1=1, P2=1, total=2.**