{ "schema": "gitea-agent.finding-matrix/v1", "owner": "jsfamily", "repository": "jarca-ledger-mcp", "issue": 12, "pull_request": 13, "review_id": 61, "reviewed_head": "5e721b0ddd648f3e80f341a3c304d1cc3ca47ee8", "implementation_parent": "b8b8811a2a50371795a02e4fa65f097c9d9508ac", "findings": [ { "id": "N01-loan-balance-definition", "classification": "implementation_defect", "status": "resolved_at_implementation_parent", "root_cause": "Internal candidate writers could persist loan balance evidence without an explicit representative liability definition, and unsupported loan purposes could bypass the definition rule.", "tests": [ "test_direct_loan_candidate_requires_liability_definition_and_writes_nothing", "test_import_loan_candidate_requires_liability_definition_and_writes_nothing", "test_dated_loan_create_and_historical_update_preserve_current_cache_without_valuations", "test_loan_cash_balance_and_total_value_are_rejected_without_writes", "test_loan_import_preserves_transactions_and_current_cache_without_valuation_candidate" ], "changed_paths": [ "jarca_ledger_mcp/application/account_valuation_service.py", "tests/test_account_valuation_edge_contracts.py", "tests/test_issue_12_review59_account.py", "docs/data-model.md", "docs/interface-contract.md", "docs/requirements/req-003_account-valuation-history.md" ] }, { "id": "N01-account-type-conversion-bypass", "classification": "implementation_defect", "status": "resolved", "root_cause": "update_ledger_account allowed a non-loan account with definition-less historical valuations to become a loan account without validating the persisted history.", "named_regression": "test_bank_to_loan_conversion_rejects_existing_undefined_valuation_without_mutation", "positive_regression": "test_bank_to_loan_conversion_without_valuations_remains_allowed", "red_evidence": "docs/verification/issue-12-review-61/red-evidence.json", "minimal_fix": "Reject non-loan to loan conversion before mutation when any attached valuation lacks one of the two explicit valid representative liability definitions.", "changed_paths": [ "jarca_ledger_mcp/application/accounts_write_services.py", "tests/test_account_valuation_edge_contracts.py", "docs/data-model.md", "docs/interface-contract.md", "docs/requirements/req-003_account-valuation-history.md" ], "risks": [ "Do not infer or backfill a liability definition.", "Do not reject conversion when no valuation history exists.", "Do not partially mutate account or valuation history on rejection." ] } ] }