"""Routing regressions must not drift from Sol/Astra policy or lose worker bounds.""" import importlib.util import json from pathlib import Path import tempfile import unittest ROOT = Path(__file__).resolve().parents[2] spec = importlib.util.spec_from_file_location("check_agent_config", ROOT / "tools/check_agent_config.py") checker = importlib.util.module_from_spec(spec) spec.loader.exec_module(checker) class RoutingTests(unittest.TestCase): def setUp(self): self.tmp = tempfile.TemporaryDirectory() self.addCleanup(self.tmp.cleanup) self.root = Path(self.tmp.name) (self.root / "campaign/agents").mkdir(parents=True) self.config = json.loads((ROOT / "opencode.json").read_text()) self.models = json.loads((ROOT / "campaign/models.json").read_text()) for file in (ROOT / "campaign/agents").glob("*.md"): (self.root / "campaign/agents" / file.name).write_text(file.read_text()) def check(self): (self.root / "opencode.json").write_text(json.dumps(self.config)) (self.root / "campaign/models.json").write_text(json.dumps(self.models)) return checker.check(self.root) def test_current_config(self): self.assertEqual(self.check(), []) def test_loop_model_drift_in_both_sources_is_rejected(self): self.models["roles"]["lead"] = "openai/gpt-5.5" self.config["agent"]["sots-lead"]["model"] = "openai/gpt-5.5" self.assertTrue(any("normal loop" in e for e in self.check())) def test_resolver_downgrade_in_both_sources_is_rejected(self): self.models["roles"]["resolver"] = "openai/gpt-5.6-sol" self.config["agent"]["sots-resolver"]["model"] = "openai/gpt-5.6-sol" self.assertTrue(any("problem resolution" in e for e in self.check())) def test_worker_drift(self): self.config["agent"]["sots-implementer"]["model"] = "llamacpp/qwen3-8b" self.assertTrue(any("implementer: registry/config" in e for e in self.check())) def test_nested_delegation(self): self.config["agent"]["sots-verifier"]["permission"]["task"] = "allow" self.assertTrue(any("nested delegation" in e for e in self.check())) def test_missing_prompt_and_context_policy(self): (self.root / "campaign/agents/lab.md").unlink() self.config["compaction"]["auto"] = False self.config["agent"]["sots-lab"]["steps"] = 400 errors = self.check() self.assertTrue(any("missing prompt" in e for e in errors)) self.assertTrue(any("automatic compaction" in e for e in errors)) self.assertTrue(any("quantum size" in e for e in errors)) if __name__ == "__main__": unittest.main()