CHANGES_REQUIRED - **P1 — Review cursor digest is still mutation-incomplete.** `_household_review_data_version()` hashes only open candidates and categories, while `_human_review_items()` reclassifies rows using live confirmed-history, merchant, alias, review-rule, and recurring-payment lookups. A synthetic `budget_review_rules` mutation left `data_version` unchanged, accepted the old page-2 cursor, and changed that page’s rendered category from `None` to an expense category plus a different explanation. This permits mixed-snapshot pagination and changes apparent confirmability. Include every classifier/rendering dependency in the digest or render solely from snapshot-covered state. `src/jarvis_finance/services/household_import.py:2186-2200,2383-2423,2708` `src/jarvis_finance/services/household_classification.py:371-451` - **P2 — Review filtering and stale-cursor recovery remain page-local.** The “Zu prüfen” tab filters already-fetched rows after the server paginates all states; the request sends no corresponding state scope. A first page containing only proposals can therefore show “Keine Treffer” while decision rows exist on later pages. Additionally, unlike the transaction page, a review load-more `409` only leaves an error over stale accumulated rows instead of restarting from page one. Use a server-side union/state scope for this tab and reload on snapshot conflict. `frontend/src/pages/HouseholdReviewPage.vue:162-165,218-261` - **P2 — Review UI advertises confirmations the server deterministically rejects.** Category choices are not filtered by income/expense type, and the confirmation button ignores the item’s `can_confirm`. Selecting any category enables normal confirmation even for special cases, although `_review_batch_selection()` rejects special cases and wrong-type categories with `409`. Honor `can_confirm`, expose dedicated actions for special cases, and constrain categories to the row’s immutable financial type. `frontend/src/pages/HouseholdReviewPage.vue:69-78,159-168` `src/jarvis_finance/services/household_import.py:2767-2782` **Prior-finding verification** - PASS: arbitrary-origin and cumulative over-refund handling, including deterministic ordering. - PASS: public preview/confirm both return `422`; two-connection race produced one confirmed refund and one `422`. - PASS: canonical summary/category/detail/list arithmetic remained aligned. - PASS: missing-FX transfer volume is `null` with partial status in summary/month/charts; unlinked-refund chart month is partial. - PASS for the specifically requested cursor probes: non-max candidate mutation without `updated_at` and category mutation both return `409`. - PASS: `status='needs_review'` is authoritative despite stale `requires_review`; non-open statuses remain excluded, with helper/review/overview/cockpit counts equal. - FAIL for the broader cursor invariant because classifier lookup mutations remain uncovered as described above. **Verification** - Exact HEAD before/after: `71183cab243ba8341d59316d55e9248b41c5d8f5` - Base: `039d005696e4ef097427d15b74a26a3c09e86a30` - Focused regressions: **7 passed** - `git diff --check`: clean - Worktree: clean before and after - No repository files modified; temporary probe scripts were removed.