65 lines
3.7 KiB
Markdown
65 lines
3.7 KiB
Markdown
# 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.
|