import pytest from repo_registry.acceptance import ( AgenticReviewDecision, validate_agentic_review_decision, ) from repo_registry.core.service import RegistryService from repo_registry.repo_ingestion.git import GitIngestionService from repo_registry.storage.sqlite import RegistryStore class RecordingAgenticReviewer: reviewer_id = "test-agent" policy_version = "agentic-review-policy/test" def __init__(self): self.requests = [] def review(self, request): self.requests.append(request) return [] class ApprovingAgenticReviewer: reviewer_id = "approving-agent" policy_version = "agentic-review-policy/test" def __init__(self): self.requests = [] def review(self, request): self.requests.append(request) graph = request.candidate_graph return [ AgenticReviewDecision( action="approve", target_type="candidate_graph", target_id=graph.analysis_run.id, rationale="API source and README support the generated repository interface claim.", criterion_ids=["RREG-QC-004"], evidence_refs=["README.md", "app.py"], ) ] def test_configured_agentic_reviewer_receives_graph_gates_and_criteria(tmp_path): source = tmp_path / "repo" source.mkdir() (source / "README.md").write_text("# Agentic Review\nReports health.\n", encoding="utf-8") (source / "app.py").write_text('@app.get("/health")\ndef health():\n return {}\n', encoding="utf-8") store = RegistryStore(tmp_path / "registry.sqlite3") store.initialize() reviewer = RecordingAgenticReviewer() service = RegistryService( store, ingestion=GitIngestionService(tmp_path / "checkouts"), agentic_reviewer=reviewer, ) repository = service.register_repository(name="Agentic Review", url=str(source)) summary = service.analyze_repository( repository.id, use_llm_assistance=False, agentic_review=True, ) graph = service.candidate_graph(repository.id, summary.analysis_run.id) decisions = service.list_review_decisions(repository.id, summary.analysis_run.id) assert len(reviewer.requests) == 1 request = reviewer.requests[0] assert request.repository.id == repository.id assert request.candidate_graph.analysis_run.id == summary.analysis_run.id assert request.criteria_version == "repo-scoping-quality-criteria/v1" assert request.quality_gate_outcomes == [] assert graph.abilities[0].capabilities[0].status == "candidate" assert decisions[0].action == "agentic_review_completed" assert "reviewer=test-agent" in decisions[0].notes assert "decisions=0" in decisions[0].notes def test_agentic_approval_requires_rationale_criteria_and_evidence(): with pytest.raises(ValueError, match="evidence refs"): validate_agentic_review_decision( AgenticReviewDecision( action="approve", target_type="candidate_graph", target_id=1, rationale="Looks supported.", criterion_ids=["RREG-QC-004"], evidence_refs=[], ) ) def test_agentic_reviewer_can_approve_candidate_graph_with_rationale(tmp_path): source = tmp_path / "repo" source.mkdir() (source / "README.md").write_text( "# Agentic Approval\nReports health.\n", encoding="utf-8", ) (source / "app.py").write_text( '@app.get("/health")\ndef health():\n return {}\n', encoding="utf-8", ) store = RegistryStore(tmp_path / "registry.sqlite3") store.initialize() reviewer = ApprovingAgenticReviewer() service = RegistryService( store, ingestion=GitIngestionService(tmp_path / "checkouts"), agentic_reviewer=reviewer, ) repository = service.register_repository(name="Agentic Approval", url=str(source)) summary = service.analyze_repository( repository.id, use_llm_assistance=False, agentic_review=True, ) ability_map = service.ability_map(repository.id) graph = service.candidate_graph(repository.id, summary.analysis_run.id) decisions = service.list_review_decisions(repository.id, summary.analysis_run.id) assert ability_map.abilities assert graph.abilities[0].status == "approved" assert decisions[1].action == "agentic_approve_candidate_graph" assert decisions[1].reviewer_type == "agent" assert decisions[1].reviewer_id == "approving-agent" assert decisions[1].policy_version == "agentic-review-policy/test" assert decisions[1].criteria_version == "repo-scoping-quality-criteria/v1" assert decisions[1].criterion_ids == ["RREG-QC-004"] assert decisions[1].evidence_refs == ["README.md", "app.py"] assert decisions[1].decision_kind == "accepted_as_is" assert "rationale=API source and README support" in decisions[1].notes assert "criteria=RREG-QC-004" in decisions[1].notes assert "evidence=README.md, app.py" in decisions[1].notes assert decisions[0].action == "agentic_review_completed" assert "decisions=1" in decisions[0].notes