129 lines
4.1 KiB
Python
129 lines
4.1 KiB
Python
"""Tests for Phase 1b identity-based agent routing."""
|
|
|
|
from lib.agent_routing import AGENT_ORDER, classify_pr_route
|
|
|
|
|
|
def _diff_for(*paths_and_lines: tuple[str, str] | str) -> str:
|
|
chunks = []
|
|
for item in paths_and_lines:
|
|
if isinstance(item, tuple):
|
|
path, line = item
|
|
else:
|
|
path, line = item, "+content"
|
|
chunks.append(f"diff --git a/{path} b/{path}\n{line}")
|
|
return "\n".join(chunks)
|
|
|
|
|
|
def test_six_primary_domains_route_to_expected_agents():
|
|
expected = {
|
|
"grand-strategy": "Leo",
|
|
"ai-alignment": "Theseus",
|
|
"internet-finance": "Rio",
|
|
"health": "Vida",
|
|
"entertainment": "Clay",
|
|
"space-development": "Astra",
|
|
}
|
|
|
|
for domain, agent in expected.items():
|
|
route = classify_pr_route(_diff_for(f"domains/{domain}/claim.md"))
|
|
assert route.primary_agent == agent
|
|
assert route.required_agents == (agent,)
|
|
assert route.route_kind == "single"
|
|
assert route.fallback is False
|
|
|
|
|
|
def test_broadened_identity_domains_route_to_owners():
|
|
expected = {
|
|
"ai-systems": "Theseus",
|
|
"living-agents": "Theseus",
|
|
"living-capital": "Rio",
|
|
"collective-intelligence": "Leo",
|
|
"cultural-dynamics": "Clay",
|
|
"energy": "Astra",
|
|
"robotics": "Astra",
|
|
"manufacturing": "Astra",
|
|
"advanced-manufacturing": "Astra",
|
|
}
|
|
|
|
for domain, agent in expected.items():
|
|
route = classify_pr_route(_diff_for(f"foundations/{domain}/claim.md"))
|
|
assert route.primary_agent == agent
|
|
assert route.required_agents == (agent,)
|
|
|
|
|
|
def test_cross_domain_ai_and_x402_requires_theseus_and_rio():
|
|
route = classify_pr_route(
|
|
_diff_for(
|
|
("domains/ai-alignment/agent-wallets.md", "+AI systems route agents around x402 payments"),
|
|
("domains/internet-finance/x402.md", "+x402 payment rail for onchain agent transactions"),
|
|
)
|
|
)
|
|
|
|
assert route.primary_agent == "Rio"
|
|
assert set(route.required_agents) == {"Theseus", "Rio"}
|
|
assert len(route.required_agents) == 2
|
|
assert route.route_kind == "multi"
|
|
|
|
|
|
def test_collective_ai_goals_routes_to_leo_and_theseus():
|
|
route = classify_pr_route(
|
|
_diff_for(
|
|
(
|
|
"foundations/collective-intelligence/collective-ai-goals.md",
|
|
"+Collective AI goals and AI systems self-understanding need review.",
|
|
)
|
|
)
|
|
)
|
|
|
|
assert route.primary_agent == "Leo"
|
|
assert route.required_agents == ("Leo", "Theseus")
|
|
assert route.route_kind == "multi"
|
|
|
|
|
|
def test_too_many_touched_domains_caps_at_two_and_marks_escalated():
|
|
route = classify_pr_route(
|
|
_diff_for(
|
|
"domains/internet-finance/a.md",
|
|
"domains/internet-finance/b.md",
|
|
"domains/health/c.md",
|
|
"domains/entertainment/d.md",
|
|
"domains/space-development/e.md",
|
|
)
|
|
)
|
|
|
|
assert route.primary_agent == "Rio"
|
|
assert route.required_agents == ("Rio", "Vida")
|
|
assert route.route_kind == "escalated"
|
|
assert len(route.required_agents) == 2
|
|
|
|
|
|
def test_branch_prefix_used_when_diff_has_no_route_path():
|
|
route = classify_pr_route(_diff_for("inbox/archive/source.md"), branch="vida/research-glp1")
|
|
|
|
assert route.primary_agent == "Vida"
|
|
assert route.required_agents == ("Vida",)
|
|
assert route.route_kind == "single"
|
|
|
|
|
|
def test_unknown_route_falls_back_to_leo():
|
|
route = classify_pr_route(_diff_for("docs/readme.md"), branch="misc/update")
|
|
|
|
assert route.primary_agent == "Leo"
|
|
assert route.required_agents == ("Leo",)
|
|
assert route.route_kind == "fallback"
|
|
assert route.fallback is True
|
|
|
|
|
|
def test_routing_is_deterministic_for_repeated_inputs():
|
|
diff = _diff_for(
|
|
("domains/health/agent-care.md", "+AI systems and health medicine review"),
|
|
("domains/ai-systems/care-agent.md", "+clinical model behavior"),
|
|
)
|
|
first = classify_pr_route(diff)
|
|
|
|
for _ in range(100):
|
|
assert classify_pr_route(diff) == first
|
|
|
|
|
|
def test_agent_order_is_stable():
|
|
assert AGENT_ORDER == ("Leo", "Theseus", "Rio", "Vida", "Clay", "Astra")
|