test_governance_freshness_integrity.py file-level

at sha256:a · View file ↗ · Intel ↗

History
1 files
1 commits
0 hotspots
0 🧊 dead
0 💥 blast risk
sha256:6 fix(ISR): default require_independent_second_reviewer to require Opera… · aaronrene · Sep 2, 2026
1 """Data-integrity: dry-run marker stamp rules (§GFG.9 data-integrity)."""
2
3 from __future__ import annotations
4
5 from pathlib import Path
6
7 from cli.kit_root import kit_root
8 from tests.support import make_runner, ok, run_cli, write_config
9
10
11 def _seed(tmp_path: Path, *, claim: str) -> None:
12 write_config(tmp_path, "config-git-only.yaml")
13 (tmp_path / ".overseer" / "version.lock").write_text(
14 "lock_version: 1\nkit_version: 0.1.0\nconfig_version: 1\n"
15 "footprint_digest: sha256:" + ("0" * 64) + "\n"
16 "installed_at: \"2026-01-01T00:00:00Z\"\nsynced_at: \"2026-01-01T00:00:00Z\"\n"
17 "footprint: []\n",
18 encoding="utf-8",
19 )
20 docs = tmp_path / "docs"
21 docs.mkdir(parents=True, exist_ok=True)
22 (docs / "OVERSEER-HANDOVER.md").write_text(
23 f"| GitHub `main` | `{claim}` |\n", encoding="utf-8"
24 )
25 (docs / "ROADMAP.md").write_text("## Build queue\n\n", encoding="utf-8")
26
27
28 def _runner(tip: str = "cafebabe"):
29 return make_runner(
30 {
31 "git rev-parse --abbrev-ref HEAD": ok("main"),
32 "git status --porcelain": ok(""),
33 "git rev-parse origin/main": ok(tip),
34 "gh pr list": ok("[]"),
35 "git remote get-url origin": ok("[email protected]:owner/repo.git"),
36 }
37 )
38
39
40 def test_dry_run_aligned_writes_marker_docs_unchanged(tmp_path: Path) -> None:
41 _seed(tmp_path, claim="cafebabe")
42 handover = tmp_path / "docs" / "OVERSEER-HANDOVER.md"
43 roadmap = tmp_path / "docs" / "ROADMAP.md"
44 before_h = handover.read_bytes()
45 before_r = roadmap.read_bytes()
46 code = run_cli(
47 ["governance-sync"],
48 cwd=tmp_path,
49 runner=_runner(),
50 kit=kit_root(),
51 )
52 assert code == 0
53 assert handover.read_bytes() == before_h
54 assert roadmap.read_bytes() == before_r
55 marker = tmp_path / ".overseer" / "last_governance_sync"
56 assert marker.is_file()
57 assert b"r1=cafebabe" in marker.read_bytes()
58
59
60 def test_dry_run_d1_drifted_no_marker(tmp_path: Path) -> None:
61 _seed(tmp_path, claim="deadbeef")
62 code = run_cli(
63 ["governance-sync"],
64 cwd=tmp_path,
65 runner=_runner(),
66 kit=kit_root(),
67 )
68 assert code == 0
69 assert not (tmp_path / ".overseer" / "last_governance_sync").exists()
70 assert (tmp_path / "docs" / "OVERSEER-HANDOVER.md").read_text(encoding="utf-8").count(
71 "deadbeef"
72 ) == 1
73
74
75 def test_idempotent_double_dry_run_aligned(tmp_path: Path) -> None:
76 _seed(tmp_path, claim="cafebabe")
77 runner = _runner()
78 assert run_cli(["governance-sync"], cwd=tmp_path, runner=runner, kit=kit_root()) == 0
79 first = (tmp_path / ".overseer" / "last_governance_sync").read_text(encoding="utf-8")
80 assert run_cli(["governance-sync"], cwd=tmp_path, runner=runner, kit=kit_root()) == 0
81 second = (tmp_path / ".overseer" / "last_governance_sync").read_text(encoding="utf-8")
82 assert "r1=cafebabe" in first
83 assert "r1=cafebabe" in second