generated from coulomb/repo-seed
feat: resolve accountability ownership reviews
This commit is contained in:
@@ -4,6 +4,7 @@ from pathlib import Path
|
||||
from railiance_fabric.accountability_roots import (
|
||||
AccountabilityEvidenceStore,
|
||||
build_identity_projection,
|
||||
build_ownership_review,
|
||||
collect_accountability_root_evidence,
|
||||
load_accountability_root_manifest,
|
||||
)
|
||||
@@ -77,6 +78,40 @@ def test_evidence_store_persists_runs_items_and_identities(tmp_path: Path) -> No
|
||||
assert stored["identity_candidate_count"] == len(store.list_identity_candidates(stored["run_id"]))
|
||||
|
||||
|
||||
def test_ownership_review_flags_ambiguity_and_applies_review_decisions(tmp_path: Path) -> None:
|
||||
manifest_path = _fixture_manifest(tmp_path)
|
||||
manifest = load_accountability_root_manifest(manifest_path)
|
||||
projection = build_identity_projection(collect_accountability_root_evidence(manifest_path), manifest)
|
||||
review = build_ownership_review(projection, manifest)
|
||||
|
||||
validator = draft202012_validator(Path("schemas/accountability-ownership-review.schema.yaml"))
|
||||
assert list(validator.iter_errors(review)) == []
|
||||
|
||||
repo_key = "identity:repository:fixture-repo"
|
||||
repo_item = next(item for item in review["items"] if item["stable_key"] == repo_key)
|
||||
assert repo_item["review_state"] == "needs_review"
|
||||
assert "ambiguous_ownership" in repo_item["blockers"]
|
||||
|
||||
store = AccountabilityEvidenceStore(tmp_path / "evidence.sqlite3")
|
||||
store.add_review_decision(
|
||||
stable_key=repo_key,
|
||||
decision="accept",
|
||||
reviewer="tester",
|
||||
owner_actor_id="actor.fixture.lord",
|
||||
fabric_id="fabric.fixture.primary",
|
||||
note="fixture checkout owner wins over registry root",
|
||||
)
|
||||
accepted_review = build_ownership_review(
|
||||
projection,
|
||||
manifest,
|
||||
review_decisions=store.latest_review_decisions(),
|
||||
)
|
||||
accepted_item = next(item for item in accepted_review["items"] if item["stable_key"] == repo_key)
|
||||
assert accepted_item["review_state"] == "accepted"
|
||||
assert accepted_item["ownership"]["resolution"] == "review_decision"
|
||||
assert accepted_item["ownership"]["owner_actor_id"] == "actor.fixture.lord"
|
||||
|
||||
|
||||
def test_discover_roots_cli_prints_evidence_json(tmp_path: Path, capsys) -> None:
|
||||
manifest = _fixture_manifest(tmp_path)
|
||||
|
||||
@@ -110,6 +145,52 @@ def test_discover_roots_cli_can_print_identities_and_store(tmp_path: Path, capsy
|
||||
assert AccountabilityEvidenceStore(store_path).latest_run() is not None
|
||||
|
||||
|
||||
def test_review_identity_cli_persists_decision_for_ownership_review(tmp_path: Path, capsys) -> None:
|
||||
manifest = _fixture_manifest(tmp_path)
|
||||
store_path = tmp_path / "evidence.sqlite3"
|
||||
repo_key = "identity:repository:fixture-repo"
|
||||
|
||||
assert (
|
||||
cli_main(
|
||||
[
|
||||
"review-identity",
|
||||
repo_key,
|
||||
"--store-db",
|
||||
str(store_path),
|
||||
"--decision",
|
||||
"accept",
|
||||
"--owner-actor-id",
|
||||
"actor.fixture.lord",
|
||||
"--fabric-id",
|
||||
"fabric.fixture.primary",
|
||||
"--reviewer",
|
||||
"tester",
|
||||
]
|
||||
)
|
||||
== 0
|
||||
)
|
||||
decision_payload = json.loads(capsys.readouterr().out)
|
||||
assert decision_payload["stable_key"] == repo_key
|
||||
|
||||
assert (
|
||||
cli_main(
|
||||
[
|
||||
"discover-roots",
|
||||
"--manifest",
|
||||
str(manifest),
|
||||
"--ownership-review",
|
||||
"--store-db",
|
||||
str(store_path),
|
||||
]
|
||||
)
|
||||
== 0
|
||||
)
|
||||
review_payload = json.loads(capsys.readouterr().out)
|
||||
repo_item = next(item for item in review_payload["items"] if item["stable_key"] == repo_key)
|
||||
assert repo_item["review_state"] == "accepted"
|
||||
assert repo_item["decision"]["reviewer"] == "tester"
|
||||
|
||||
|
||||
def _fixture_manifest(tmp_path: Path) -> Path:
|
||||
workspace = tmp_path / "workspace"
|
||||
repo = workspace / "fixture-repo"
|
||||
|
||||
Reference in New Issue
Block a user