93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
from scripts.fleet_progression import evaluate_progression, load_spec
|
|
|
|
|
|
def test_load_spec_contains_epic_and_all_six_phases():
|
|
spec = load_spec()
|
|
|
|
assert spec["epic_issue"] == 547
|
|
assert [phase["number"] for phase in spec["phases"]] == [1, 2, 3, 4, 5, 6]
|
|
assert [phase["issue_number"] for phase in spec["phases"]] == [548, 549, 550, 551, 552, 553]
|
|
|
|
|
|
def test_phase_two_unlocks_when_uptime_and_capacity_thresholds_are_met():
|
|
spec = load_spec()
|
|
result = evaluate_progression(
|
|
spec,
|
|
issue_states={548: "open", 549: "open", 550: "open", 551: "open", 552: "open", 553: "open"},
|
|
resources={
|
|
"uptime_percent_30d": 95.0,
|
|
"capacity_utilization": 61.0,
|
|
"innovation": 0,
|
|
"all_models_local": False,
|
|
"sovereign_stable_days": 0,
|
|
"human_free_days": 0,
|
|
},
|
|
)
|
|
|
|
phase2 = result["phases"][1]
|
|
assert phase2["unlocked"] is True
|
|
assert result["current_phase"]["number"] == 2
|
|
assert result["next_locked_phase"]["number"] == 3
|
|
|
|
|
|
def test_phase_three_stays_locked_until_phase_two_issue_is_closed():
|
|
spec = load_spec()
|
|
result = evaluate_progression(
|
|
spec,
|
|
issue_states={548: "open", 549: "open", 550: "open", 551: "open", 552: "open", 553: "open"},
|
|
resources={
|
|
"uptime_percent_30d": 99.0,
|
|
"capacity_utilization": 90.0,
|
|
"innovation": 250,
|
|
"all_models_local": False,
|
|
"sovereign_stable_days": 0,
|
|
"human_free_days": 0,
|
|
},
|
|
)
|
|
|
|
phase3 = result["phases"][2]
|
|
assert phase3["unlocked"] is False
|
|
blockers = {item["rule"] for item in phase3["blocking_requirements"]}
|
|
assert blockers == {"phase_2_issue_closed"}
|
|
|
|
|
|
def test_phase_five_requires_sovereign_stability_and_innovation():
|
|
spec = load_spec()
|
|
result = evaluate_progression(
|
|
spec,
|
|
issue_states={548: "closed", 549: "closed", 550: "closed", 551: "closed", 552: "open", 553: "open"},
|
|
resources={
|
|
"uptime_percent_30d": 99.0,
|
|
"capacity_utilization": 85.0,
|
|
"innovation": 400,
|
|
"all_models_local": True,
|
|
"sovereign_stable_days": 12,
|
|
"human_free_days": 0,
|
|
},
|
|
)
|
|
|
|
phase5 = result["phases"][4]
|
|
assert phase5["unlocked"] is False
|
|
blockers = {item["rule"] for item in phase5["blocking_requirements"]}
|
|
assert blockers == {"innovation_gt_500", "sovereign_stable_days_gte_30"}
|
|
|
|
|
|
def test_epic_complete_only_when_all_phase_issues_are_closed_and_phase_six_unlocked():
|
|
spec = load_spec()
|
|
result = evaluate_progression(
|
|
spec,
|
|
issue_states={548: "closed", 549: "closed", 550: "closed", 551: "closed", 552: "closed", 553: "closed"},
|
|
resources={
|
|
"uptime_percent_30d": 99.5,
|
|
"capacity_utilization": 85.0,
|
|
"innovation": 900,
|
|
"all_models_local": True,
|
|
"sovereign_stable_days": 45,
|
|
"human_free_days": 9,
|
|
},
|
|
)
|
|
|
|
assert result["epic_complete"] is True
|
|
assert result["current_phase"]["number"] == 6
|
|
assert result["next_locked_phase"] is None
|