fix(governance): harden ADR audit boundaries

This commit is contained in:
Seekers2001 committed 2026-09-12 17:49:13 +08:00
1 parent 4da6ae22ec
commit a47327d998
3 files changed
+35 -6

No files matched your search

@@ -344,8 +344,9 @@ def check_status_resurrection(
resurrected: list[str] = []
if match:
for value in CODE_PATH_RE.findall(match.group("body")):
if plausible_deletion_path(value):
resolved = resolve_within_root(root, root, value)
normalized = value.replace("\\", "/")
if plausible_deletion_path(normalized):
resolved = resolve_within_root(root, root, normalized)
if resolved is not None and resolved.exists():
resurrected.append(value)
if resurrected:
@@ -435,7 +436,7 @@ def check_log(
def parse_adr_status(text: str) -> str | None:
patterns = (
r"(?im)^(?:[-*]\s+)?(?:\*\*(?:status|\u72b6\u6001)\*\*|(?:status|\u72b6\u6001))\s*[:\uFF1A]\s*`?([a-z]+)`?(?:\s+by\s+ADR-\d+)?\s*$",
r"(?im)^(?:[-*]\s+)?(?:\*\*(?:status|\u72b6\u6001)\*\*|(?:status|\u72b6\u6001))\s*[:\uFF1A]\s*`?([a-z]+)`?(?:\s+by\s+ADR-\d{3,4})?\s*$",
r"(?im)^##\s+(?:status|\u72b6\u6001)\s*\n+\s*`?([a-z]+)`?\s*$",
)
for pattern in patterns:
+4 -3
View File
@@ -344,8 +344,9 @@ def check_status_resurrection(
resurrected: list[str] = []
if match:
for value in CODE_PATH_RE.findall(match.group("body")):
if plausible_deletion_path(value):
resolved = resolve_within_root(root, root, value)
normalized = value.replace("\\", "/")
if plausible_deletion_path(normalized):
resolved = resolve_within_root(root, root, normalized)
if resolved is not None and resolved.exists():
resurrected.append(value)
if resurrected:
@@ -435,7 +436,7 @@ def check_log(
def parse_adr_status(text: str) -> str | None:
patterns = (
r"(?im)^(?:[-*]\s+)?(?:\*\*(?:status|\u72b6\u6001)\*\*|(?:status|\u72b6\u6001))\s*[:\uFF1A]\s*`?([a-z]+)`?(?:\s+by\s+ADR-\d+)?\s*$",
r"(?im)^(?:[-*]\s+)?(?:\*\*(?:status|\u72b6\u6001)\*\*|(?:status|\u72b6\u6001))\s*[:\uFF1A]\s*`?([a-z]+)`?(?:\s+by\s+ADR-\d{3,4})?\s*$",
r"(?im)^##\s+(?:status|\u72b6\u6001)\s*\n+\s*`?([a-z]+)`?\s*$",
)
for pattern in patterns:
+27
View File
@@ -400,6 +400,20 @@ def test_adr_scope_rejects_missing_inline_superseded_successor(project: Path) ->
assert "ADR inline successor does not exist" in result.stdout
def test_adr_scope_rejects_short_inline_superseded_successor(project: Path) -> None:
adr_dir = project / "docs" / "adr"
adr_dir.mkdir(parents=True)
(adr_dir / "README.md").write_text(
"[decision](0001-storage.md)\n", encoding="utf-8"
)
(adr_dir / "0001-storage.md").write_text(
"# ADR-0001\n\n**Status**: superseded by ADR-42\n", encoding="utf-8"
)
result = run_audit(project, "adr")
assert result.returncode == 1
assert "ADR has no parseable status" in result.stdout
def test_adr_scope_audits_common_adr_prefixed_filenames(project: Path) -> None:
adr_dir = project / "docs" / "adr"
adr_dir.mkdir(parents=True)
@@ -567,6 +581,19 @@ def test_spine_scope_detects_recreated_root_level_deletion_zone_file(
assert "Deletion-zone target has been recreated" in result.stdout
def test_spine_scope_detects_windows_path_deletion_zone_file(project: Path) -> None:
target = project / "subdir" / "legacy.py"
target.parent.mkdir()
target.write_text("# recreated\n", encoding="utf-8")
(project / "PROJECT_STATUS.md").write_text(
"# Status\n\n## Deletion Zone\n\n- `subdir\\\\legacy.py`\n",
encoding="utf-8",
)
result = run_audit(project, "spine")
assert result.returncode == 1
assert "Deletion-zone target has been recreated" in result.stdout
@pytest.mark.parametrize(
"value",
(