repo-manager/tests/test_record_identity.py
tegwick 885575802c fix(identity): enforce qualified ad-hoc identifiers
Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a02b22-9638-76d2-bbff-b7ea1770b118
2026-08-23 14:45:26 +02:00

97 lines
3.5 KiB
Python

from pathlib import Path
import pytest
from repo_manager.observe import RecordIdentityCollisionError, observe_repository
from repo_manager.record_identity import classify_record_id, scan_record_identities
from repo_manager.standards import check_repository
def _write_mason_workplan(repo: Path, second_uuid: str) -> None:
path = repo / "workplans" / "MASON-0001-statehub-bootstrap.md"
path.parent.mkdir(parents=True)
path.write_text(
f"""---
id: MASON-0001
type: workplan
title: Bootstrap
status: finished
state_hub_workstream_id: "11111111-1111-4111-8111-111111111111"
---
## First occurrence
```task
id: MASON-0001-T01
status: done
priority: high
state_hub_task_id: "ede1aa62-fc42-494a-9984-3190a52481af"
```
## Second occurrence
```task
id: MASON-0001-T01
status: done
priority: high
state_hub_task_id: "{second_uuid}"
```
""",
encoding="utf-8",
)
def test_grandfathered_mason_identity_is_loaded_from_canon_registry() -> None:
assert classify_record_id("workplan", "MASON-0001") == "grandfathered"
assert classify_record_id("task", "MASON-0001-T01") == "grandfathered"
def test_current_canon_accepts_repository_and_ad_hoc_workplan_forms() -> None:
assert classify_record_id("workplan", "RAPP-OPENBAO-WP-0002") == "canonical"
assert classify_record_id("task", "RAPP-OPENBAO-WP-0002-T01") == "canonical"
assert classify_record_id("workplan", "ACTIVITY-WP-ADHOC-2026-08-23") == "canonical"
assert classify_record_id("task", "ACTIVITY-WP-ADHOC-2026-08-23-T01") == "canonical"
assert classify_record_id("workplan", "ADHOC-2026-08-23") == "grandfathered"
assert classify_record_id("task", "ADHOC-2026-08-23-T01") == "grandfathered"
assert classify_record_id("workplan", "RAPP--OPENBAO-WP-0002") is None
def test_same_id_and_uuid_indexes_once_with_cleanup_diagnostic(tmp_path: Path) -> None:
_write_mason_workplan(tmp_path, "ede1aa62-fc42-494a-9984-3190a52481af")
report = scan_record_identities(tmp_path)
assert report["identity_collisions"] == []
assert report["duplicate_source_occurrences"][0]["sources"] == [
"workplans/MASON-0001-statehub-bootstrap.md#task-block-1",
"workplans/MASON-0001-statehub-bootstrap.md#task-block-2",
]
snapshot, index = observe_repository(tmp_path, slug="ops-mason")
tasks = [record for record in index.work_records if record.kind == "task"]
assert snapshot["index"]["task_count"] == 1
assert len(tasks) == 1
assert (
tasks[0].extra["source_occurrences"] == report["duplicate_source_occurrences"][0]["sources"]
)
assert index.events[0]["type"] == "repo.work_record.duplicate_source_occurrence"
conformance = check_repository(tmp_path, slug="ops-mason")
codes = [finding.code for finding in conformance.findings]
assert "work-record-duplicate-source-occurrence" in codes
assert not any(
finding.code == "work-record-id-invalid" and finding.path.startswith("workplans/")
for finding in conformance.findings
)
def test_same_id_with_different_uuids_fails_closed(tmp_path: Path) -> None:
_write_mason_workplan(tmp_path, "22222222-2222-4222-8222-222222222222")
report = scan_record_identities(tmp_path)
assert report["duplicate_source_occurrences"] == []
assert report["identity_collisions"][0]["id"] == "MASON-0001-T01"
with pytest.raises(RecordIdentityCollisionError):
observe_repository(tmp_path, slug="ops-mason")
conformance = check_repository(tmp_path, slug="ops-mason")
assert any(finding.code == "work-record-identity-collision" for finding in conformance.findings)