from repo_scoping.core.service import RegistryService from repo_scoping.repo_ingestion.git import GitIngestionService from repo_scoping.self_scoping.assessment import export_assessment_artifact from repo_scoping.storage.sqlite import RegistryStore def make_service(tmp_path): store = RegistryStore(tmp_path / "registry.sqlite3") store.initialize() return RegistryService(store, ingestion=GitIngestionService(tmp_path / "checkouts")) def write_repo(tmp_path): source = tmp_path / "repo" source.mkdir() (source / "README.md").write_text( "# Exportable Repo\n\nReports service health.\n", encoding="utf-8", ) (source / "app.py").write_text( '@app.get("/health")\n' "def health():\n" " return {}\n", encoding="utf-8", ) return source def test_export_assessment_artifact_binds_analysis_to_engine_identity(tmp_path): service = make_service(tmp_path) source = write_repo(tmp_path) repository = service.register_repository( name="Exportable Repo", url=str(source), ) summary = service.analyze_repository( repository.id, use_llm_assistance=False, ) artifact = export_assessment_artifact( service, repository.id, summary.analysis_run.id, role="challenger", outcome="challenger", reviewer="test", ) assert artifact["schema_version"] == "self-scoping-assessment/v1" assert artifact["artifact_id"] == "exportable-repo-challenger-run-1" assert artifact["target_repository"]["repo_slug"] == "exportable-repo" assert artifact["target_repository"]["target_commit"] assert artifact["engine_identity"]["engine_commit"] assert ( artifact["engine_identity"]["quality_criteria_version"] == "repo-scoping-quality-criteria/v1" ) assert artifact["engine_identity"]["release_binding_status"] == "complete" assert artifact["assessment"]["comparison_eligibility"] == "eligible" assert artifact["execution"]["mode"] == "deterministic-only" assert artifact["content_chunk_summary"]["total"] > 0 assert artifact["generated_tree"]["abilities"] assert artifact["approved_map"]["abilities"] == [] assert artifact["review_decisions"] == [] assert artifact["quality_gate_outcomes"] == [] def test_export_assessment_artifact_flags_known_provider_regression(tmp_path): service = make_service(tmp_path) source = tmp_path / "repo" source.mkdir() (source / "README.md").write_text("# Provider Vocabulary\n", encoding="utf-8") (source / "providers.py").write_text( "provider_registry = {'openrouter': OpenRouterAdapter}\n", encoding="utf-8", ) repository = service.register_repository( name="Provider Vocabulary", url=str(source), ) summary = service.analyze_repository( repository.id, use_llm_assistance=False, ) artifact = export_assessment_artifact( service, repository.id, summary.analysis_run.id, role="challenger", outcome="challenger", reviewer="test", ) regression_ids = {item["id"] for item in artifact["known_regression_patterns"]} gate_ids = {item["criterion_id"] for item in artifact["quality_gate_outcomes"]} assert "RREG-SELF-REG-001" in regression_ids assert "RREG-QC-002" in gate_ids assert any( item["path"] == "providers.py" for item in artifact["fact_summary"]["contamination_sources"] ) is False def test_export_assessment_review_decisions_include_quality_criteria_version(tmp_path): service = make_service(tmp_path) source = write_repo(tmp_path) repository = service.register_repository( name="Review Criteria Repo", url=str(source), ) summary = service.analyze_repository( repository.id, use_llm_assistance=False, ) service.approve_candidate_graph(repository.id, summary.analysis_run.id) artifact = export_assessment_artifact( service, repository.id, summary.analysis_run.id, role="challenger", outcome="challenger", reviewer="test", ) assert artifact["review_decisions"] assert artifact["review_decisions"][0]["quality_criteria_version"] == ( "repo-scoping-quality-criteria/v1" ) assert artifact["review_decisions"][0]["reviewer_type"] == "human" assert artifact["review_decisions"][0]["decision_kind"] == "accepted_as_is"