From 272795e6b48b44da87264e6db5a6864ddf633a4e Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 26 Oct 2026 17:38:35 +1100 Subject: [PATCH] docs(vcrm): record ART Milestone 1 evidence for BR-23, BR-28, BR-34, BR-35 All four stay Partial: M1 delivers part of each. Each row now names the PR and test that cover the delivered part, and what is still missing. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019YPoXzBSj89ZHgw7nfTmbB --- docs/VCRM.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/VCRM.md b/docs/VCRM.md index 76d0264..19afa05 100644 --- a/docs/VCRM.md +++ b/docs/VCRM.md @@ -141,19 +141,19 @@ Status as assessed on 2026-10-26 at `main` 032b522. None of these is "Verified" | ID | Status | Reason | Planned verification | Milestone | |----|--------|--------|----------------------|-----------| -| BR-23 | ⚠️ Partial | Registry exists without uploader, tenant or status | Integration + DB constraint tests | M1, M3 | +| BR-23 | ⚠️ Partial | Registry has UNIQUE file hash and name and a migration history (M1: #87); still no uploader, tenant or status | Integration + DB constraint tests | M1, M3 | | BR-24 | ❌ Not started | Original never stored; overwrite drops data | DB negative tests | M3 | | BR-25 | ⚠️ Partial | 10-row preview sample; 200-row cap on table view | API paging + e2e | M4 | | BR-26 | ❌ Not started | No code | API + e2e | M4 | | BR-27 | ❌ Not started | No code | API + DB tests | M4 | -| BR-28 | ⚠️ Partial | Global, not per tenant; race guard missing (#81) | Concurrency + cross-tenant tests | M1, M5 | +| BR-28 | ⚠️ Partial | Race guard now enforced by UNIQUE constraints (M1: #87, `tests/test_migrations.py`); still global, not per tenant | Concurrency + cross-tenant tests | M1, M5 | | BR-29 | ⚠️ Partial | In-file exact match only | Unit + integration | M5 | | BR-30 | ⚠️ Partial | Content-derived names; repeats refused or destructive | Unit + integration | M5 | | BR-31 | ⚠️ Partial | T&E mode only; overwrite drops tables | Integration | M5 | | BR-32 | ❌ Not started | No code | API + e2e | M6 | | BR-33 | ⚠️ Partial | Single-transaction load; no staging or lineage | Integration incl. failure injection | M6 | -| BR-34 | ⚠️ Partial | Counts returned, not persisted; extra cells dropped (#82) | Integration | M1, M6 | -| BR-35 | ⚠️ Partial | Plain audit table, no actor, no filters; export formula injection (#83) | DB negative tests + unit | M1, M3, M7 | +| BR-34 | ⚠️ Partial | Total, inserted, duplicate and failed counts persisted per import (M1: #90, `tests/test_import_counts.py`); over-wide rows reported, not dropped (M1: #88, `tests/test_ragged_rows.py`); excluded and edited rows not yet tracked (M6) | Integration | M1, M6 | +| BR-35 | ⚠️ Partial | Export formula injection neutralised (M1: #86, `export.test.ts`); audit table still plain, no actor, no filters | DB negative tests + unit | M1, M3, M7 | | BR-36 | ❌ Not started | Shared API key only | Cross-tenant negative tests | M2 | | BR-37 | ⚠️ Partial | No external calls found; no automated check; no offline doc (#60) | Egress-blocked run + offline dry run | M7 |