# BAT-018: Monthly settlement dashboard shell, KPI, cashflow, and budget - Profile: batch-lite - Status: merged - Included REQ: REQ-023 - Source Discovery: dcy-015 - Root Delivery: dcy-015_monthly-settlement - Queue Item: 0 - Created At (KST): 2026-07-12 10:31 KST ## Objective Deliver the first visible `월정산` dashboard slice by adding the page shell, month selector/header status context, KPI cards, cashflow/spending structure, budget-vs-actual section, and existing-page CTA guidance on top of the implemented REQ-022 read model. ## Included Scope - Add `월정산` to Streamlit navigation/routing in the isolated delivery worktree. - Render header/month selector with selected month, basis date, KST timestamp, and read-only status badge. - Render KPI cards for actual income, actual expense, net cashflow, savings rate, budget overrun count, and unresolved blocker count. - Render cashflow/spending structure and budget-vs-actual sections using the REQ-022 service/gateway seam rather than duplicating formulas in `dashboard/app.py`. - Add AppTest coverage for routing, key headings, month selector, and representative KPI/budget content. ## Excluded Scope - Operational blocker/import/account/asset status sections tracked by REQ-024. - Evidence/next-action/doc hardening tracked by REQ-025. - Any monthly close persistence, export, MCP summary tool, or broader scope outside dcy-015 approved REQs. ## Documents - [planning.md](planning.md) ## Delivery Notes - Discovery root queue adopted exactly as handed off; no re-grouping or cross-REQ scope expansion applied. - REQ-022 remains an implemented dependency and must not be reimplemented by default. - BAT-018 implementation completed, and the third QC verdict (`.stagepilot/delivery/dcy-015_monthly-settlement/bat-018-qc-verdict-03.md`) passed after the bounded read-only badge rework closed the last REQ-023 gap. - The first canonical dev-qc supervised run stalled before producing a verdict artifact; see `.stagepilot/delivery/dcy-015_monthly-settlement/bat-018-qc-stall-escalation.md` for the recovered earlier blocker trail.