diff --git a/docs/verification/issue-12-review-65/contract-preservation-inventory.json b/docs/verification/issue-12-review-65/contract-preservation-inventory.json new file mode 100644 index 0000000..150d1af --- /dev/null +++ b/docs/verification/issue-12-review-65/contract-preservation-inventory.json @@ -0,0 +1,58 @@ +{ + "schema": "contract-preservation-inventory/v1", + "issue": 12, + "pull_request": 13, + "review_id": 65, + "reviewed_head": "fc2d2a6faeac3c64c0ed604f2aa1ad7c37c65570", + "source_revision": "8caf1f8379171a128a2c12971a2eadc9a324309a", + "contracts": [ + { + "contract": "current cache balance is an exact integer or unknown NULL; zero remains a valid known balance", + "status": "preserved", + "preserved_by": [ + "test_create_rejects_whitespace_or_non_integer_dated_balance_without_mutation", + "test_zero_dated_balance_and_valid_import_recovery" + ] + }, + { + "contract": "invalid dated account creation fails with validation_error before account or valuation mutation", + "status": "preserved", + "preserved_by": [ + "test_create_rejects_whitespace_or_non_integer_dated_balance_without_mutation" + ] + }, + { + "contract": "a valid dated import can establish current cache and append a valuation after invalid create attempts are rejected", + "status": "preserved", + "preserved_by": [ + "test_zero_dated_balance_and_valid_import_recovery", + "test_late_import_current_balance_is_authoritative_by_evidence_basis_date" + ] + }, + { + "contract": "unknown basis remains distinct from last_synced_at and historical imports cannot roll back a newer usable cache", + "status": "preserved", + "preserved_by": [ + "test_account_write_sync_timestamp_does_not_infer_balance_basis_or_candidate", + "test_unknown_legacy_balance_basis_is_not_reported_as_valuation_date", + "review65-focused-regressions" + ] + }, + { + "contract": "all prior Issue 12 and Review 64 public envelopes, valuation selection, snapshot replay, read-only, migration, privacy, authentication, and menu semantics remain intact", + "status": "preserved", + "preserved_by": [ + "review65-focused-regressions", + "review65-full-suite", + "review65-ruff", + "review65-compileall", + "review65-diff-check" + ] + } + ], + "missing": 0, + "ambiguous": 0, + "limitations": [ + "Four fixture-dependent PDF tests remain skipped because private KB Bank and Toss Securities fixtures are unavailable." + ] +} diff --git a/docs/verification/issue-12-review-65/evidence-plan.json b/docs/verification/issue-12-review-65/evidence-plan.json new file mode 100644 index 0000000..763953a --- /dev/null +++ b/docs/verification/issue-12-review-65/evidence-plan.json @@ -0,0 +1,62 @@ +{ + "environment": ["os", "kernel", "architecture", "python", "uv"], + "command_env_allowlist": ["PATH", "HOME", "TMPDIR", "LANG", "VIRTUAL_ENV", "UV_CACHE_DIR"], + "secret_env_names": ["GITEA_TOKEN"], + "forbidden_regexes": [], + "hash_paths": [ + "jarca_ledger_mcp/application/accounts_write_services.py", + "tests/test_import_current_balance_authority.py", + "tests/test_account_basis_public_consumers.py", + "tests/test_account_valuation_edge_contracts.py", + "tests/test_account_valuations.py", + "tests/test_issue_12_regressions.py", + "tests/test_issue_12_review63_accounts.py", + "docs/data-model.md", + "docs/requirements/req-003_account-valuation-history.md" + ], + "commands": [ + { + "id": "review65-focused-regressions", + "purpose": "Run Review 65 and preserved account authority regression coverage", + "argv": ["uv", "run", "--frozen", "--extra", "dev", "--extra", "dashboard", "pytest", "-o", "addopts=", "-q", "tests/test_import_current_balance_authority.py", "tests/test_account_basis_public_consumers.py", "tests/test_account_valuation_edge_contracts.py", "tests/test_account_valuations.py", "tests/test_issue_12_regressions.py", "tests/test_issue_12_review63_accounts.py"], + "expected_exit_code": 0, + "max_output_bytes": 65536, + "claims": ["review65-findings-green"] + }, + { + "id": "review65-full-suite", + "purpose": "Run the canonical full repository suite at the functional source revision", + "argv": ["uv", "run", "--frozen", "--extra", "dev", "--extra", "dashboard", "pytest", "-o", "addopts=", "-q"], + "expected_exit_code": 0, + "max_output_bytes": 65536, + "claims": ["review65-full-suite"] + }, + { + "id": "review65-ruff", + "purpose": "Run repository lint checks", + "argv": ["uv", "run", "--frozen", "--extra", "dev", "--extra", "dashboard", "ruff", "check", "."], + "expected_exit_code": 0, + "max_output_bytes": 65536, + "claims": ["review65-ruff"] + }, + { + "id": "review65-compileall", + "purpose": "Compile package, dashboard, tests, and scripts", + "argv": ["uv", "run", "--frozen", "--extra", "dev", "--extra", "dashboard", "python", "-m", "compileall", "-q", "jarca_ledger_mcp", "dashboard", "tests", "scripts"], + "expected_exit_code": 0, + "max_output_bytes": 65536, + "claims": ["review65-compileall"] + }, + { + "id": "review65-diff-check", + "purpose": "Check the complete pull-request diff for whitespace errors", + "argv": ["git", "diff", "--check", "main...HEAD"], + "expected_exit_code": 0, + "max_output_bytes": 65536, + "claims": ["review65-diff-check"] + } + ], + "limitations": [ + "Four PDF fixture tests are skipped because private KB Bank and Toss Securities PDF fixtures are unavailable." + ] +} diff --git a/docs/verification/issue-12-review-65/finding-matrix.json b/docs/verification/issue-12-review-65/finding-matrix.json new file mode 100644 index 0000000..d9c908a --- /dev/null +++ b/docs/verification/issue-12-review-65/finding-matrix.json @@ -0,0 +1,31 @@ +{ + "schema": "review-finding-matrix/v1", + "issue": 12, + "pull_request": 13, + "review_id": 65, + "reviewed_head": "fc2d2a6faeac3c64c0ed604f2aa1ad7c37c65570", + "source_revision": "8caf1f8379171a128a2c12971a2eadc9a324309a", + "contract_sha256": "6d86b591b022fcc722611bfec6d24e54a64216ab6f7c4098f357e25420218818", + "findings": [ + { + "id": "C05-current-import-create", + "classification": "valid_fix", + "status": "resolved", + "production": "jarca_ledger_mcp/application/accounts_write_services.py", + "regressions": [ + "test_create_rejects_whitespace_or_non_integer_dated_balance_without_mutation", + "test_zero_dated_balance_and_valid_import_recovery" + ], + "claim": "account creation rejects unusable dated balances before mutation while preserving zero and later valid dated import authority" + }, + { + "id": "IR-001-strict-integer-create", + "classification": "valid_fix", + "status": "resolved", + "production": "jarca_ledger_mcp/application/accounts_write_services.py", + "regression": "test_create_rejects_whitespace_or_non_integer_dated_balance_without_mutation", + "claim": "boolean and floating-point balances are rejected instead of coercing or truncating; canonical signed integer text remains compatible" + } + ], + "green_evidence": "evidence-manifest.json" +} diff --git a/docs/verification/issue-12-review-65/red-evidence.json b/docs/verification/issue-12-review-65/red-evidence.json new file mode 100644 index 0000000..dbea24e --- /dev/null +++ b/docs/verification/issue-12-review-65/red-evidence.json @@ -0,0 +1,23 @@ +{ + "schema": "review-red-evidence/v1", + "issue": 12, + "pull_request": 13, + "review_id": 65, + "reviewed_head": "fc2d2a6faeac3c64c0ed604f2aa1ad7c37c65570", + "contract_sha256": "6d86b591b022fcc722611bfec6d24e54a64216ab6f7c4098f357e25420218818", + "reproductions": [ + { + "id": "C05-current-import-create", + "command": "uv run pytest -q tests/test_import_current_balance_authority.py::test_create_rejects_whitespace_or_non_integer_dated_balance_without_mutation tests/test_import_current_balance_authority.py::test_zero_dated_balance_and_valid_import_recovery", + "exit_code": 1, + "observed": "invalid whitespace or non-integer dated balance creation returned success, persisted unusable cache authority, omitted its valuation candidate, and exposed ValueError to a public liquidity consumer" + }, + { + "id": "IR-001-strict-integer-create", + "command": "uv run pytest -o addopts= -q tests/test_import_current_balance_authority.py::test_create_rejects_whitespace_or_non_integer_dated_balance_without_mutation", + "exit_code": 1, + "observed": "boolean and floating-point balances were accepted through int coercion and persisted values different from caller input" + } + ], + "sensitive_data": "synthetic fixtures only; no credentials or real financial data" +}