From ce9c9f732608f6861fcee4951201b8b14d572ea0 Mon Sep 17 00:00:00 2001 From: gitea-impl-agent Date: Wed, 7 Oct 2026 08:19:43 +0000 Subject: [PATCH] Add Review 63 verification evidence --- .../contract-preservation-inventory.json | 36 +++++++++++ .../issue-12-review-63/evidence-manifest.json | 1 + .../issue-12-review-63/finding-matrix.json | 52 ++++++++++++++++ .../issue-12-review-63/red-evidence.json | 59 +++++++++++++++++++ 4 files changed, 148 insertions(+) create mode 100644 docs/verification/issue-12-review-63/contract-preservation-inventory.json create mode 100644 docs/verification/issue-12-review-63/evidence-manifest.json create mode 100644 docs/verification/issue-12-review-63/finding-matrix.json create mode 100644 docs/verification/issue-12-review-63/red-evidence.json diff --git a/docs/verification/issue-12-review-63/contract-preservation-inventory.json b/docs/verification/issue-12-review-63/contract-preservation-inventory.json new file mode 100644 index 0000000..4e7e833 --- /dev/null +++ b/docs/verification/issue-12-review-63/contract-preservation-inventory.json @@ -0,0 +1,36 @@ +{ + "schema": "contract-preservation-inventory/v1", + "issue": 12, + "pull_request": 13, + "review_id": 63, + "source_revision": "15dd9f92a73232c22b3ef23c17a3652ec762967a", + "contracts": [ + { + "contract": "append-only immutable snapshot runs and corrections", + "preserved_by": ["test_f002_correction_replay_preserves_full_initial_response", "tests/test_asset_snapshot_idempotency.py"] + }, + { + "contract": "preview-to-close authority drift protection", + "preserved_by": ["test_f001_preview_fingerprint_uses_same_unredacted_authority_and_rejects_drift"] + }, + { + "contract": "conditional zero-row closes remain visible historical authority", + "preserved_by": ["test_f003_zero_row_conditional_runs_are_timeseries_authority_with_aliases"] + }, + { + "contract": "closed consumers use frozen valuation identity rather than live valuation state", + "preserved_by": ["test_f004_closed_report_restores_frozen_valuation_identity_without_legacy_invention"] + }, + { + "contract": "NULL and zero remain distinct and balance basis dates require an actual balance", + "preserved_by": ["test_create_rejects_basis_only_without_mutation", "test_basis_only_create_cannot_block_later_dated_import"] + }, + { + "contract": "existing Issue 12 behavior outside Review 63 remains intact", + "preserved_by": ["review63-full-suite", "review63-ruff", "review63-compileall", "review63-diff-check"] + } + ], + "limitations": [ + "Private KB Bank and Toss Securities PDF fixtures were unavailable; four fixture-dependent tests are reported as skips." + ] +} diff --git a/docs/verification/issue-12-review-63/evidence-manifest.json b/docs/verification/issue-12-review-63/evidence-manifest.json new file mode 100644 index 0000000..8b89a3e --- /dev/null +++ b/docs/verification/issue-12-review-63/evidence-manifest.json @@ -0,0 +1 @@ +{"claims":{"review63-compileall":["/commands/3/argv","/commands/3/exit_code","/commands/3/expected_exit_code","/commands/3/output","/commands/3/started_at_utc","/commands/3/finished_at_utc"],"review63-diff-check":["/commands/4/argv","/commands/4/exit_code","/commands/4/expected_exit_code","/commands/4/output","/commands/4/started_at_utc","/commands/4/finished_at_utc"],"review63-findings-green":["/commands/0/argv","/commands/0/exit_code","/commands/0/expected_exit_code","/commands/0/output","/commands/0/started_at_utc","/commands/0/finished_at_utc"],"review63-full-suite":["/commands/1/argv","/commands/1/exit_code","/commands/1/expected_exit_code","/commands/1/output","/commands/1/started_at_utc","/commands/1/finished_at_utc"],"review63-ruff":["/commands/2/argv","/commands/2/exit_code","/commands/2/expected_exit_code","/commands/2/output","/commands/2/started_at_utc","/commands/2/finished_at_utc"]},"commands":[{"argv":["uv","run","--frozen","--extra","dev","--extra","dashboard","pytest","-o","addopts=","-q","tests/test_issue_12_review63_accounts.py","tests/test_issue_12_review63_assets.py"],"claim_ids":["review63-findings-green"],"duration_seconds":4.28891730774194,"exit_code":0,"expected_exit_code":0,"finished_at_utc":"2026-10-07T08:17:33.948161Z","id":"review63-regressions","max_output_bytes":65536,"output":"....... [100%]\n7 passed in 2.01s\n","purpose":"Verify all named Review 63 RED to GREEN regressions","started_at_utc":"2026-10-07T08:17:29.659210Z"},{"argv":["uv","run","--frozen","--extra","dev","--extra","dashboard","pytest","-o","addopts=","-ra"],"claim_ids":["review63-full-suite"],"duration_seconds":66.72507910244167,"exit_code":0,"expected_exit_code":0,"finished_at_utc":"2026-10-07T08:18:40.671145Z","id":"full-suite","max_output_bytes":65536,"output":"============================= test session starts ==============================\nplatform linux -- Python 3.13.5, pytest-9.1.1, pluggy-1.6.0\nrootdir: /opt/data/gitea-agent/repositories/jsfamily/jarca-ledger-mcp/worktrees/issue-12/checkout\nconfigfile: pyproject.toml\ntestpaths: tests\nplugins: anyio-4.14.0\ncollected 284 items\n\ntests/test_account_basis_public_consumers.py .. [ 0%]\ntests/test_account_valuation_edge_contracts.py .......... [ 4%]\ntests/test_account_valuations.py ........ [ 7%]\ntests/test_asset_snapshot_idempotency.py .. [ 7%]\ntests/test_asset_snapshots.py ..... [ 9%]\ntests/test_backup_workflow.py ... [ 10%]\ntests/test_categorization.py ... [ 11%]\ntests/test_category_rule_filters.py ... [ 12%]\ntests/test_contract_regression.py ... [ 13%]\ntests/test_cross_account_transfer_matching.py ... [ 14%]\ntests/test_dashboard_app.py ....... [ 17%]\ntests/test_dashboard_auth_server.py .................. [ 23%]\ntests/test_dashboard_authentication.py .............. [ 28%]\ntests/test_dashboard_authentication_app.py ......... [ 31%]\ntests/test_dashboard_menu_transition.py ......... [ 34%]\ntests/test_dashboard_persistent_authentication.py ............... [ 40%]\ntests/test_import_current_balance_authority.py ... [ 41%]\ntests/test_import_provenance_policy.py ........... [ 45%]\ntests/test_issue_12_regressions.py ..................................... [ 58%]\n [ 58%]\ntests/test_issue_12_review59_account.py ........... [ 61%]\ntests/test_issue_12_review59_readonly.py ............ [ 66%]\ntests/test_issue_12_review59_reports.py ................... [ 72%]\ntests/test_issue_12_review63_accounts.py .. [ 73%]\ntests/test_issue_12_review63_assets.py ..... [ 75%]\ntests/test_kb_bank_pdf.py ss [ 76%]\ntests/test_ledger_categories.py ... [ 77%]\ntests/test_mcp_http_runtime.py ... [ 78%]\ntests/test_requirement_docs.py .............. [ 83%]\ntests/test_review_decision_workbench.py .... [ 84%]\ntests/test_seoulpay_xlsx.py .. [ 85%]\ntests/test_service.py ............ [ 89%]\ntests/test_streamlit_browser_evidence.py ...................... [ 97%]\ntests/test_toss_securities_pdf.py ss [ 97%]\ntests/test_uncategorized_workbench.py ... [ 98%]\ntests/test_valuation_contract_docs.py ... [100%]\n\n=============================== warnings summary ===============================\ntests/test_dashboard_auth_server.py:11\n /opt/data/gitea-agent/repositories/jsfamily/jarca-ledger-mcp/worktrees/issue-12/checkout/tests/test_dashboard_auth_server.py:11: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n from starlette.testclient import TestClient\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n=========================== short test summary info ============================\nSKIPPED [1] tests/test_kb_bank_pdf.py:26: sample KB Bank PDF/password is not available\nSKIPPED [1] tests/test_kb_bank_pdf.py:42: sample KB Bank PDF/password is not available\nSKIPPED [1] tests/test_toss_securities_pdf.py:20: sample Toss Securities PDF is not available\nSKIPPED [1] tests/test_toss_securities_pdf.py:32: sample Toss Securities PDF is not available\n============= 280 passed, 4 skipped, 1 warning in 63.51s (0:01:03) =============\n","purpose":"Run the canonical full repository suite at the functional source revision","started_at_utc":"2026-10-07T08:17:33.948453Z"},{"argv":["uv","run","--frozen","--extra","dev","--extra","dashboard","ruff","check","."],"claim_ids":["review63-ruff"],"duration_seconds":0.19704884197562933,"exit_code":0,"expected_exit_code":0,"finished_at_utc":"2026-10-07T08:18:40.870722Z","id":"ruff","max_output_bytes":65536,"output":"All checks passed!\n","purpose":"Run repository lint checks","started_at_utc":"2026-10-07T08:18:40.673668Z"},{"argv":["uv","run","--frozen","--extra","dev","--extra","dashboard","python","-m","compileall","-q","jarca_ledger_mcp","dashboard","tests","scripts"],"claim_ids":["review63-compileall"],"duration_seconds":0.31042383052408695,"exit_code":0,"expected_exit_code":0,"finished_at_utc":"2026-10-07T08:18:41.181158Z","id":"compileall","max_output_bytes":65536,"output":"","purpose":"Compile package, dashboard, tests, and scripts","started_at_utc":"2026-10-07T08:18:40.870877Z"},{"argv":["git","diff","--check","main...HEAD"],"claim_ids":["review63-diff-check"],"duration_seconds":0.13438758440315723,"exit_code":0,"expected_exit_code":0,"finished_at_utc":"2026-10-07T08:18:41.315620Z","id":"diff-check","max_output_bytes":65536,"output":"","purpose":"Check the complete pull-request diff for whitespace errors","started_at_utc":"2026-10-07T08:18:41.181333Z"}],"environment":{"architecture":"aarch64","kernel":"6.18.34+rpt-rpi-v8","os":"Linux","python":"3.13.5","uv":"uv 0.11.6 (aarch64-unknown-linux-musl)"},"excluded_paths":["docs/verification/issue-12-review-63/evidence-plan.json","docs/verification/issue-12-review-63/evidence-manifest.json"],"files":[{"blob_oid":"4cb38a511c9a348aa5039378c3f59c1aced1889d","path":"jarca_ledger_mcp/application/accounts_write_services.py","sha256":"45dbbf367b9857cfe899574526f0a7120e28b0bf3d6d2814e795e9701a1a14b7"},{"blob_oid":"4728f0dc350b3785e98c51ba5869c57c3a51754d","path":"jarca_ledger_mcp/application/assets_service.py","sha256":"b10e1656cd5b9d2f25f77ff5d60f89a0c3b0c8e87b22cbfa8fe781725e157a70"},{"blob_oid":"690b2fbee633eecbfdb2d7ed8fda78cea1b14b96","path":"tests/test_issue_12_review63_accounts.py","sha256":"9004db79795ef4963b87646e9b5c486c073febd3ae6c2ba313633574e03582a9"},{"blob_oid":"ffd531aad89679791430cf91dd1693e28a57bb71","path":"tests/test_issue_12_review63_assets.py","sha256":"91b22ac7f402a9a702e4a83f2e8eed7f039cb146ee0bccf1ae3f1325abf9dae6"},{"blob_oid":"17be3e1e9b62e1ec63767dfa7920c78546d43e38","path":"tests/test_asset_snapshot_idempotency.py","sha256":"9a66f7d56b56cf3a9a85950813a56bdd06eafc07f592a1cb77133ad5f36ff09c"},{"blob_oid":"83c76f65ad122e8409abd3420c97b4c375e144d5","path":"tests/test_issue_12_regressions.py","sha256":"7dc8fbd7a7b0cb718de115f4d1f69b2e024cf1af641573e4cb04c00196017f29"},{"blob_oid":"4304427a604949b8295b4f93cb6054357805fe92","path":"docs/interface-contract.md","sha256":"01a3f37e23ee17b2b928b44e3e07d4d6982faead1ab6f0298889225b0c5ce916"},{"blob_oid":"70f26ce1522b8609a93471655c9506040a4078f1","path":"docs/data-model.md","sha256":"f9932a04f3c74907da1c21d754a16e1401f64fd948945017d410de7d91494dca"},{"blob_oid":"2a7be4d780999fce47402f15f0b05d0b92990715","path":"docs/requirements/req-003_account-valuation-history.md","sha256":"f5a3bf9f69d622451a1a08854062218382f03355a3464538a35b1e270ca5b70f"}],"generated_at":"2026-10-07T08:18:41.372175Z","limitations":["Four PDF fixture tests are skipped because private KB Bank and Toss Securities PDF fixtures are unavailable."],"plan":{"path":"docs/verification/issue-12-review-63/evidence-plan.json","sha256":"d7cb66cba7ec082e4637d38d534ac75e6509b900e77689c74a484ce9c6a37e87"},"redaction":{"checked":true,"violations":[]},"result":"success","schema":"evidence-manifest/v1","source_revision":"15dd9f92a73232c22b3ef23c17a3652ec762967a","source_tree_clean":true} diff --git a/docs/verification/issue-12-review-63/finding-matrix.json b/docs/verification/issue-12-review-63/finding-matrix.json new file mode 100644 index 0000000..7cf1a35 --- /dev/null +++ b/docs/verification/issue-12-review-63/finding-matrix.json @@ -0,0 +1,52 @@ +{ + "schema": "review-finding-matrix/v1", + "issue": 12, + "pull_request": 13, + "review_id": 63, + "reviewed_head": "3b5101128d5a2cf038b8fb84facfd9d176928c26", + "source_revision": "15dd9f92a73232c22b3ef23c17a3652ec762967a", + "findings": [ + { + "id": "F-001", + "status": "resolved", + "production": "jarca_ledger_mcp/application/assets_service.py", + "regression": "test_f001_preview_fingerprint_uses_same_unredacted_authority_and_rejects_drift", + "claim": "preview and close hash the same private authority representation; real drift is rejected without a run write" + }, + { + "id": "F-002", + "status": "resolved", + "production": "jarca_ledger_mcp/application/assets_service.py", + "regressions": [ + "test_f002_close_replay_is_byte_for_byte_equal_for_mixed_account_manual_as_of", + "test_f002_correction_replay_preserves_full_initial_response" + ], + "claim": "initial and correction replays reconstruct the original immutable response, warning set, provenance, item ordering, and IDs" + }, + { + "id": "F-003", + "status": "resolved", + "production": "jarca_ledger_mcp/application/assets_service.py", + "regression": "test_f003_zero_row_conditional_runs_are_timeseries_authority_with_aliases", + "claim": "timeseries enumerates both legacy snapshot and run-only basis dates and exposes the latest zero-row conditional run" + }, + { + "id": "F-004", + "status": "resolved", + "production": "jarca_ledger_mcp/application/assets_service.py", + "regression": "test_f004_closed_report_restores_frozen_valuation_identity_without_legacy_invention", + "claim": "closed reports restore persisted valuation identity and currency without consulting live authority or inventing legacy IDs" + }, + { + "id": "F-005", + "status": "resolved", + "production": "jarca_ledger_mcp/application/accounts_write_services.py", + "regressions": [ + "test_create_rejects_basis_only_without_mutation", + "test_basis_only_create_cannot_block_later_dated_import" + ], + "claim": "basis-only creates fail before mutation while zero-with-basis and unknown pairs remain valid" + } + ], + "green_evidence": "evidence-manifest.json" +} diff --git a/docs/verification/issue-12-review-63/red-evidence.json b/docs/verification/issue-12-review-63/red-evidence.json new file mode 100644 index 0000000..33940e0 --- /dev/null +++ b/docs/verification/issue-12-review-63/red-evidence.json @@ -0,0 +1,59 @@ +{ + "schema": "review-red-evidence/v1", + "issue": 12, + "pull_request": 13, + "review_id": 63, + "reviewed_head": "3b5101128d5a2cf038b8fb84facfd9d176928c26", + "review_state": "REQUEST_CHANGES", + "findings": [ + { + "id": "F-001", + "test": "test_f001_preview_fingerprint_uses_same_unredacted_authority_and_rejects_drift", + "red_observation": "unchanged preview fingerprint was rejected with authority_drift" + }, + { + "id": "F-002", + "tests": [ + "test_f002_close_replay_is_byte_for_byte_equal_for_mixed_account_manual_as_of", + "test_f002_correction_replay_preserves_full_initial_response" + ], + "red_observation": "replay responses differed in warnings/provenance/items or conflicted" + }, + { + "id": "F-003", + "test": "test_f003_zero_row_conditional_runs_are_timeseries_authority_with_aliases", + "red_observation": "zero-row closed run produced no timeseries point" + }, + { + "id": "F-004", + "test": "test_f004_closed_report_restores_frozen_valuation_identity_without_legacy_invention", + "red_observation": "closed report omitted persisted valuation_id and currency" + }, + { + "id": "F-005", + "tests": [ + "test_create_rejects_basis_only_without_mutation", + "test_basis_only_create_cannot_block_later_dated_import" + ], + "red_observation": "basis-only account creation succeeded and could suppress a real dated import balance" + } + ], + "red_runs": [ + { + "argv": ["pytest", "-q", "tests/test_issue_12_review63_assets.py"], + "exit_code": 1, + "result": "5 failed before production changes", + "limitation": "isolated development environment used by the delegated TDD worker" + }, + { + "argv": ["uv", "run", "pytest", "-q", "tests/test_issue_12_review63_accounts.py"], + "exit_code": 1, + "result": "2 failed before production changes" + }, + { + "argv": ["uv", "run", "--frozen", "--extra", "dev", "--extra", "dashboard", "pytest", "-o", "addopts=", "-q", "tests/test_issue_12_review63_assets.py::test_f002_correction_replay_preserves_full_initial_response"], + "exit_code": 1, + "result": "correction replay omitted existing_snapshot_rows and differed from the original response" + } + ] +}