# BAT-008 Verification ## Verification summary Status: PASS Evidence collected against synthetic/temp data only. No production ledger DB mutation or real financial files were used. ## Acceptance criteria mapping ### REQ-009 - AC-1: **PASS** - Evidence: `tests/test_asset_snapshots.py::test_asset_snapshot_schema_is_additive_and_idempotent` - `db.py` adds `manual_assets` and `asset_snapshots` via additive/idempotent schema + migration path. - AC-2: **PASS** - Evidence: `create_manual_asset`/`list_manual_assets` service path + synthetic probe output includes `name`, `valuation_amount`, `valuation_date`, `liquidity_bucket`, `source_note`. - AC-3: **PASS** - Evidence: `create_asset_snapshot` stores basis date/source target/amount/bucket/source note; `test_snapshot_rows_are_append_only_and_timeseries_uses_same_formula` proves append-only readback. - AC-4: **PASS** - Evidence: `valuation_policy` and `authority_source` fields distinguish `accounts.last_balance`, `manual_assets`, and `asset_snapshots`; docs updated in `docs/data-model.md` and `docs/runtime-flows.md`. - AC-5: **PASS** - Evidence: valuation helper formula is `asset_buckets - loan`; synthetic probe returned `303000000 - 120000000 = 183000000`; unvalued items are excluded rather than inferred. - AC-6: **PASS** - Evidence: `tests/test_asset_snapshots.py::test_asset_liquidity_report_empty_new_tables_preserves_req005_fallback` confirms empty new tables preserve REQ-005 path with `source='accounts.last_balance'`. - AC-7: **PASS** - Evidence: `docs/data-model.md`, `docs/runtime-flows.md`, and `docs/project-structure.md` now document the new tables, authority-source rule, and month-end snapshot flow. ### REQ-010 - AC-1: **PASS** - Evidence: `server.py` exposes `get_asset_snapshot_report`; synthetic probe returned `basis_date`, per-bucket totals, liabilities, net worth, included/excluded items. - AC-2: **PASS** - Evidence: `server.py` exposes `get_net_worth_timeseries`; service/test coverage proves identical formula per basis date. - AC-3: **PASS** - Evidence: `server.py` exposes `list_manual_assets`; synthetic probe returned name/value/date/bucket/source note payloads. - AC-4: **PASS** - Evidence: `dashboard/app.py` caption explicitly states shared valuation helper; `service.py` centralizes calculation for dashboard + MCP. - AC-5: **PASS** - Evidence: same fallback regression test as REQ-009 AC-6 plus `get_asset_liquidity_report` preserves existing keys while adding optional explanatory fields. - AC-6: **PASS** - Evidence: `docs/interface-contract.md`, `docs/runtime-flows.md`, and `docs/project-structure.md` updated for read MCP contract and dashboard/MCP alignment. ## Requirement state decision - REQ-009: Implemented promotion confirmed. - REQ-010: Implemented promotion confirmed. ## Validation evidence 1. `python -m py_compile jarca_ledger_mcp/*.py dashboard/app.py` → pass 2. `pytest tests/test_asset_snapshots.py tests/test_service.py tests/test_contract_regression.py -q` → pass (`................. [100%]`) 3. `hermes mcp test jarca-ledger` → pass; stdio connected, 51 tools discovered, including the three new BAT-008 read tools 4. synthetic service probe → pass; confirmed live-authority fallback, stored-snapshot read path, and net-worth timeseries output ## Remaining issues ### Hard blockers - None identified from the collected implementation evidence. ### Non-blocking follow-up - jarcaledgerqc final re-check returned: `PASS, REQ-009/REQ-010은 이제 Implemented로 전환해도 됩니다.` - fresh Streamlit browser smoke on `http://127.0.0.1:8511` rendered `schema v9`, `자산 유동성 현황`, and produced no browser console JS errors. - Snapshot creation/manual-asset CRUD MCP mutations remain intentionally out of scope for BAT-008.