"""Registration semantics for draft unregistered-liability status.""" from jarca_ledger_mcp import service as s from jarca_ledger_mcp.db import init_db def ok(result): assert result["success"], result return result def test_unregistered_liabilities_tracks_registered_targets_not_evidence_completeness(tmp_path): path = str(tmp_path / "synthetic-liability-registration.sqlite3") init_db(path) empty = ok(s.create_settlement_draft("2026-09", "synthetic", "empty", db_path=path))["draft"] empty_review = ok(s.review_settlement_draft(empty["id"], db_path=path)) assert empty_review["unregistered_liabilities"] is True loan = ok(s.create_ledger_account("Synthetic loan", type="loan", liquidity_bucket="loan", db_path=path))["account"]["id"] loan_draft = ok(s.create_settlement_draft("2026-10", "synthetic", "loan", db_path=path))["draft"] loan_review = ok(s.review_settlement_draft(loan_draft["id"], db_path=path)) loan_item = next(item for item in loan_review["items"] if item["source_id"] == loan) assert loan_item["amount"] is None assert loan_review["unregistered_liabilities"] is False manual = ok(s.create_manual_asset("Synthetic manual liability", 50, "2026-10-31", "loan", db_path=path))["manual_asset"]["id"] refreshed = ok(s.refresh_settlement_draft_targets(loan_draft["id"], loan_draft["version"], "synthetic", db_path=path))["draft"] manual_item = next(item for item in ok(s.get_settlement_draft(refreshed["id"], db_path=path))["items"] if item["source_id"] == manual) excluded = ok(s.set_settlement_draft_item(refreshed["id"], "manual_asset", manual, refreshed["version"], "synthetic", included=False, exclusion_reason="synthetic excluded", db_path=path))["draft"] excluded_review = ok(s.review_settlement_draft(excluded["id"], db_path=path)) assert manual_item["amount"] == 50 assert next(item for item in excluded_review["excluded_items"] if item["source_id"] == manual) assert excluded_review["unregistered_liabilities"] is False assert excluded_review["missing_items"] def test_manual_only_frozen_liability_registration_and_missing_exclusion_are_independent(tmp_path): path = str(tmp_path / "manual-only-frozen-liability.sqlite3") init_db(path) manual = ok(s.create_manual_asset("Manual-only debt", 75, "2026-10-31", "loan", db_path=path))["manual_asset"]["id"] draft = ok(s.create_settlement_draft("2026-10", "synthetic", "manual-only", db_path=path))["draft"] # Freeze the target list without any registered loan account. frozen = ok(s.refresh_settlement_draft_targets(draft["id"], draft["version"], "synthetic", db_path=path))["draft"] frozen_items = ok(s.get_settlement_draft(frozen["id"], db_path=path))["items"] item = next(item for item in frozen_items if item["source_id"] == manual) assert item["amount"] == 75 assert not any(item.get("source_type") == "account" for item in frozen_items) review = ok(s.review_settlement_draft(frozen["id"], db_path=path)) assert review["unregistered_liabilities"] is False assert isinstance(review["missing_items"], list) excluded = ok(s.set_settlement_draft_item(frozen["id"], "manual_asset", manual, frozen["version"], "synthetic", included=False, exclusion_reason="not registered", db_path=path))["draft"] excluded_review = ok(s.review_settlement_draft(excluded["id"], db_path=path)) assert any(item["source_id"] == manual for item in excluded_review["excluded_items"]) assert excluded_review["unregistered_liabilities"] is False assert isinstance(excluded_review["missing_items"], list)