## Final review outcome ### P0 - **None.** ### P1 1. **Internal own-account transfers are advertised but rejected by the HTTP contract.** - `src/jarvis_finance/api/schemas/household.py:8-13` omits `"internal_transfer"` from `HouseholdItemAction`. - `src/jarvis_finance/services/household_import.py:2510-2513` advertises `"internal_transfer"`, and `src/jarvis_finance/services/household_review_corrections.py:470-490` implements it. - Both preview and confirm routes validate through the incomplete schema at `src/jarvis_finance/api/routers/budget.py:339-343` and `383-387`. - Synthetic API probe: the review response advertised `['internal_transfer']`, but POSTing that action to the preview endpoint returned **422 literal_error**. The Sprint 17B own-account-transfer workflow is therefore unusable through the API. 2. **Settlement/transfer confirmation does not revalidate the source account as active and currency-compatible.** - `src/jarvis_finance/services/household_import.py:2464-2477` validates only counterpart accounts; it merely checks that `candidate["account_source"]` is nonempty. - Settlement eligibility repeats that weakness at `src/jarvis_finance/services/household_import.py:2514-2532` and `src/jarvis_finance/services/household_review_corrections.py:491-499`. - `_masked_account()` at `src/jarvis_finance/services/household_review_corrections.py:274-288` also accepts inactive accounts without checking their currency. - Confirm then writes the candidate’s CHF amount directly against that unchecked account at `src/jarvis_finance/services/household_review_corrections.py:812-835`; internal transfer does likewise at `740-779`. - Synthetic probe with the source account changed to inactive/USD still advertised and successfully previewed both workflows, including a CHF settlement whose displayed bank account was USD. Confirmation would persist a CHF transfer against the inactive USD account. This violates fail-closed own-account/settlement integrity. ### P2 1. **Category-change previews invent CHF values when CHF valuation is unavailable.** - `src/jarvis_finance/services/household_review_corrections.py:1127` falls back from missing `amount_chf` to `amount_original`. - Lines `1144-1148` then label that foreign-currency amount as `old_category_chf`, `new_category_chf`, and total CHF effect. - Synthetic USD transaction with `amount_chf=NULL` produced `old_category_chf=-100.00`, `new_category_chf=100.00`, and CHF before/after values of `100.00`. The preview should report CHF as unavailable rather than relabel USD nominal value as CHF. ## Verification - Read-only review of the full current diff against `785e18b20219b4fe734576a8126d23c453050ce9`, including untracked backend/schema/tests. - `git diff --check`: passed. - `tests/unit/test_household_review_corrections_v1.py`: **12 passed**. - Household golden and schema suites: **38 passed**. - No production writes; probes used in-memory synthetic databases only. - **Files created or modified:** none. - **Issue encountered:** the worktree `.venv` lacked pytest and the project has no `dev` uv group; verification succeeded using the available Python environment.