Status drift warnings

This commit is contained in:
2026-05-02 11:54:07 +02:00
parent 06ed12b2c7
commit 010d23bc38
10 changed files with 538 additions and 8 deletions

View File

@@ -746,10 +746,92 @@ def test_analyze_repository_can_trusted_auto_approve_candidates(tmp_path):
decisions = service.list_review_decisions(repository.id, summary.analysis_run.id)
assert service.get_repository(repository.id).status == "indexed"
assert graph.abilities[0].status == "approved"
statuses_by_capability = {
capability.name: capability.status
for capability in graph.abilities[0].capabilities
}
assert statuses_by_capability["Expose Repository Interface"] == "approved"
assert statuses_by_capability["Describe Repository Structure"] == "candidate"
assert ability_map.abilities[0].name == "Report Health Over HTTP"
assert decisions[0].action == "trusted_auto_approve_candidate_graph"
assert "deterministic candidate generation" in decisions[0].notes
assert "Auto-approved 1 safe candidate capability(s); left 1 for review." in decisions[0].notes
def test_rebuild_characteristics_dry_run_preserves_approved_map(tmp_path):
source = tmp_path / "repo"
source.mkdir()
(source / "README.md").write_text("# Rebuild\nReports health over HTTP.\n", encoding="utf-8")
(source / "app.py").write_text('@app.get("/health")\ndef health():\n return {}\n', encoding="utf-8")
service = make_service(tmp_path)
repository = service.register_repository(name="Rebuild", url=str(source))
summary = service.analyze_repository(repository.id, use_llm_assistance=False)
service.approve_candidate_graph(repository.id, summary.analysis_run.id)
result = service.rebuild_characteristics_from_scratch(
repository.id,
dry_run=True,
source_path=str(source),
use_llm_assistance=False,
)
assert result.dry_run is True
assert result.cleared_approved is False
assert result.previous_counts["abilities"] == 1
assert result.previous_ids["abilities"]
assert result.candidate_counts["abilities"] == 1
assert service.ability_map(repository.id).abilities
decisions = service.list_review_decisions(repository.id, result.analysis_run.id)
assert decisions[-1].action == "dry_run_rebuild_characteristics_from_scratch"
def test_rebuild_characteristics_requires_confirmation_before_clearing(tmp_path):
service = make_service(tmp_path)
source = tmp_path / "repo"
source.mkdir()
(source / "README.md").write_text("# Rebuild\n", encoding="utf-8")
repository = service.register_repository(name="Rebuild", url=str(source))
try:
service.rebuild_characteristics_from_scratch(
repository.id,
dry_run=False,
confirm=False,
source_path=str(source),
use_llm_assistance=False,
)
except ValueError as exc:
assert "confirm=True" in str(exc)
else:
raise AssertionError("expected confirmed rebuild to require confirm=True")
def test_rebuild_characteristics_confirmed_clears_approved_map(tmp_path):
source = tmp_path / "repo"
source.mkdir()
(source / "README.md").write_text("# Rebuild\nReports health over HTTP.\n", encoding="utf-8")
(source / "app.py").write_text('@app.get("/health")\ndef health():\n return {}\n', encoding="utf-8")
service = make_service(tmp_path)
repository = service.register_repository(name="Rebuild", url=str(source))
summary = service.analyze_repository(repository.id, use_llm_assistance=False)
service.approve_candidate_graph(repository.id, summary.analysis_run.id)
result = service.rebuild_characteristics_from_scratch(
repository.id,
dry_run=False,
confirm=True,
source_path=str(source),
use_llm_assistance=False,
)
assert result.cleared_approved is True
assert result.previous_counts["abilities"] == 1
assert result.previous_ids["abilities"]
assert service.ability_map(repository.id).abilities == []
assert service.get_repository(repository.id).status == "analyzed"
decisions = service.list_review_decisions(repository.id, result.analysis_run.id)
assert decisions[-1].action == "rebuild_characteristics_from_scratch"
assert "Previous approved IDs" in decisions[-1].notes
def test_analyze_repository_records_llm_failure_and_falls_back(tmp_path):