## Findings ### P1 - **Stale requests can overwrite the active filter state.** `frontend/src/pages/HouseholdOverviewPage.vue:140-143` Every preset/account/filter action starts an unguarded request. If an older request resolves after a newer one, it replaces `data` while `syncUrl()` writes the newest reactive filters, leaving charts/KPIs inconsistent with the displayed URL and controls. **Fix:** snapshot filters per request and add a generation/abort guard; only commit `data`, loading state, and URL when the response belongs to the latest request. - **“Kein Vergleich” still displays fabricated comparison deltas.** `frontend/src/pages/HouseholdOverviewPage.vue:53-55,145-162` With `comparison=none`, KPI hints still show changes “vs. ohne Vergleich,” and category rows show their full current amount as a change “ggü. Vergleich,” because the contract returns zero-valued comparison fields. This materially misrepresents the financial analysis. **Fix:** suppress all delta/category-comparison copy and the comparison dataset when comparison is `none`; show neutral text such as “Kein Vergleich gewählt.” - **Account-filtered actuals are presented against an all-account budget without disclosing the mixed scope.** `frontend/src/pages/HouseholdOverviewPage.vue:61-71` The budget card labels the result “Budget gegen Ist” and derives “Im Budget/Überschritten,” while the cockpit backend computes actuals from selected accounts but budget totals for all accounts. Only the separate forecast panel discloses “alle Konten.” An account-filtered view can therefore produce a misleading budget status. **Fix:** make budget calculations honor selected accounts, or explicitly expose/render budget scope and disable the status/progress comparison when scopes differ. ### P2 - **A URL with explicit dates can activate the wrong preset.** `frontend/src/pages/HouseholdOverviewPage.vue:121-124,176` If a drill-down/bookmark supplies `date_from` and `date_to` without `preset=custom`, the dates are retained but “Monat” remains visually active; `syncUrl()` then persists that contradictory state. **Fix:** infer `custom` whenever explicit dates do not exactly match the named preset, or derive dates exclusively from the preset. - **Preset selection is not exposed to assistive technology.** `frontend/src/pages/HouseholdOverviewPage.vue:17-18` The current preset is conveyed only through the `.active` class. Screen-reader users receive a group of ordinary buttons with no selected state. **Fix:** add `:aria-pressed="preset === option.value"` or use an accessible single-select radio pattern. - **Long imported merchant/category labels can overflow the 390px layout.** `frontend/src/pages/HouseholdOverviewPage.vue:84,88,92,192-194` Flex/grid children retain their automatic minimum width, and no `overflow-wrap` rule exists. Long unbroken merchant/category strings can force transaction, ranking, or merchant rows wider than the viewport. **Fix:** apply `min-width:0` to textual children and `overflow-wrap:anywhere`; keep amount columns non-shrinking. - **New cockpit panels have no truthful empty states.** `frontend/src/pages/HouseholdOverviewPage.vue:44-59,81-93` Empty categories, latest/largest transactions, or merchants render titled but blank panels/charts, making “no data” indistinguishable from a rendering failure. **Fix:** render explicit per-surface empty messages and avoid mounting empty charts. - **The required responsive/accessibility acceptance matrix is not exercised.** `frontend/src/pages/HouseholdUx.test.ts:98-150` Added tests mount DOM stubs only; they do not render at 1440/820/390, measure overflow or 44px targets, operate the UI by keyboard, verify `aria-pressed`, or exercise real Chart.js alternatives. **Fix:** add browser-level tests at all three required viewports covering horizontal overflow, target dimensions, keyboard filter/preset/drill-down flows, dialog focus, and chart/table alternatives. ## Verification - Frontend typecheck: passed. - Production build: passed. - Focused frontend suite: **47/47 tests passed**. - `git diff --check`: passed. - **P0:** none found. - Files modified by review: none.