CHANGES_REQUIRED Prior linked-refund P1: **CLOSED end-to-end**. Future imports persist `reversal_of_transaction_id` in the typed column, while financial summaries and transaction category filtering/display support guarded legacy JSON links. Focused future/legacy regressions passed. - **P1 — `src/jarvis_finance/services/household_financials.py:59-64,98-100`** — Canonical CHF effects fall back to `amount_original` whenever `amount_chf` is null, regardless of currency/FX status. A confirmed EUR 100 expense with `fx_status='missing'` is therefore reported as CHF 100 in summaries, categories, overview, cockpit, and forecasts; transfer volume has the same defect. Focused probe reproduced `expense_chf='100.00'` from `(EUR 100, amount_chf=NULL)`. Missing-FX non-CHF rows must remain excluded/unknown rather than be relabelled as CHF. - **P1 — `src/jarvis_finance/services/household_import.py:2494-2507,2517-2522`** — Canonical review counts and state filters classify proposals solely by non-null `proposed_category_id`, while `_human_review_items` independently validates/reclassifies the category. Consequently, `proposal_ready`, `decision_needed`, `filtered_total`, and `state=proposal_ready` can contradict returned item state and confirmability. Focused probe produced global counts `(proposal_ready=1, decision_needed=0)` while the sole item—including under `state=proposal_ready`—was `decision_needed` with no category. Counts and filters must use the same effective-state predicate as item construction. - **P2 — `src/jarvis_finance/services/household_import.py:2206-2216,2264-2277`** — Transaction cursors are bound only to filters, not `data_version`. Inserts or updates between pages can cause omissions/duplicates and combine rows/totals from different snapshots despite advertising a versioned pagination contract. Bind the cursor to a stable data version or reject stale continuations. - **P2 — `frontend/src/pages/HouseholdReviewPage.vue:158,217-256`** — Source options are derived only from the currently loaded page. Sources absent from the first 25 rows cannot be selected, so the backend’s canonical source filter is inaccessible for older sources. - **P2 — `frontend/src/pages/HouseholdReviewPage.vue:217-256`** — Filter/reset and load-more requests have no cancellation or request-generation guard. Concurrent responses can overwrite or append data for obsolete filters; failed filter loads also leave prior rows and counts visible beneath the newly selected filter. This can present stale review decisions under the wrong scope. - **P2 — `src/jarvis_finance/services/budget_overview.py:179-195,395-410`** — Year-level status performs 12 monthly summaries, each executing two full effects scans; charts perform another 12 and then repeat all 12 through status—up to 48 scans per request. Aggregate the year once and group by month/category to avoid growth-proportional dashboard latency.