## Verdict: **BLOCK — P0 findings** Reviewed exact HEAD `bd18300878c3ce13a7e819c640b50d38519f135e` against base `a5e8dd0e5b1330b588e5c6e501cd2af03f23818f`. ### P0 - **Business-readiness stop gate is UI-only.** `confirm_household_import()` checks `reconstructed["confirmable"]` at `household_import.py:1413`, not `business_ready_for_confirm`. A direct API request can therefore confirm and write a preview whose coverage/review targets are unmet. This contradicts the UI’s “Bestätigung bleibt gesperrt” claim and the fail-closed write contract. - **Cluster decisions modify undisclosed rows.** `household_import.py:431-439` exposes only the first three examples, while `:474-492` applies the selected category to every cluster member. Synthetic read-only probe: ```text cluster_count=5, displayed_examples=3, categorized_rows=5 business_ready_before=False, business_ready_after=True ``` Thus one decision can make the preview business-ready by categorizing rows the user could not inspect or exclude. - **Required source-scoped history isolation was removed.** `_confirmed_history()` receives `source_type` but never uses it (`household_classification.py:261-285`). The previous regression test preventing cross-source leakage was replaced with one requiring cross-source reuse. Synthetic probe showed two AKB confirmations automatically categorized a Raiffeisen row. This contradicts the documented “gleicher Quelle/Kontorolle” contract and can silently misclassify transactions. - **Private/real-counterparty-like data is embedded in tracked classification logic.** The new hard-coded rule maps exact employer text `"erne ag holzbau"` to the person-specific category `"Lohn Marcel"` (`household_classification.py:133-134`). This is not synthetic taxonomy and links a named person/category to a specific counterparty in Git. ### P1 - **Migros acceptance behavior was weakened rather than updated consistently.** The test requiring only receipts at or above CHF 50 to be linked was replaced with a test requiring every unique receipt to link. The version-bound inventory still states the CHF 50 threshold. Release contract and tests now contradict each other. ### Passing evidence / release state - Focused read-only tests: **3 passed**. - Preview non-persistence: synthetic DB dump unchanged. - Business-readiness calculation honestly returned `false` when thresholds were missed and `true` after coverage was raised. - No private files or binary artifacts were added among the eight changed paths; worktree is clean and `git diff --check` passes. - Supplied broad gates noted: 793 backend, 177 frontend, `make verify`, typecheck/build, and production audit 0. - Actual private real-preview metrics were **not accessed**, as required; no sanitized real-preview report exists in the reviewed commit to independently reproduce them. - No confirm/import operation was executed; all additional probes were synthetic and preview-only. - **Files created or modified:** none.