sots-re/verify/config/test_agent_config.py

62 lines
2.6 KiB
Python

"""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()