feat(kpi): add autonomous worker auto-spawn engine and watchdog reconciliation

This commit is contained in:
operator
2026-10-06 23:03:52 +00:00
parent 02a2189773
commit 0c6d2235ab
5 changed files with 244 additions and 13 deletions
+41
View File
@@ -12,8 +12,10 @@ sys.path.insert(0, str(REPO_ROOT / "bin"))
import kpi
from kpi import (
auto_spawn_workers,
calculate_efficiency,
check_node_routes,
find_pending_work_for_node,
generate_preservation_advisory,
get_agent_dm_metrics,
get_agent_kpi,
@@ -159,6 +161,45 @@ class TestKPIMetrics(unittest.TestCase):
self.assertEqual(call_kwargs["parent"], "dev")
self.assertIn("dev-audit-sub", call_kwargs["session_id"])
def test_find_pending_work_for_node(self):
work = find_pending_work_for_node("dev")
self.assertIsNotNone(work)
self.assertIn(work["type"], ("job", "swarm"))
if work["type"] == "job":
self.assertIn("dev", work["name"])
self.assertIn("job-dispatch.py", work["cmd"])
@patch("kpi.get_agent_tmux_workers")
def test_auto_spawn_workers_skip_active(self, mock_tmux):
mock_tmux.return_value = ["active-worker-1"]
res = auto_spawn_workers(nodes=["dev"], dry_run=True)
self.assertEqual(len(res), 1)
self.assertEqual(res[0]["action"], "skip")
self.assertIn("Active tmux worker already running", res[0]["reason"])
@patch("kpi.get_agent_tmux_workers")
def test_auto_spawn_workers_dry_run(self, mock_tmux):
mock_tmux.return_value = []
res = auto_spawn_workers(nodes=["dev"], dry_run=True)
self.assertEqual(len(res), 1)
self.assertEqual(res[0]["action"], "would_spawn")
self.assertIn("session", res[0])
self.assertIn("command", res[0])
@patch("kpi.spawn_tmux_worker")
@patch("invite_handler.send_loopback_notice")
@patch("kpi.get_agent_tmux_workers")
def test_auto_spawn_workers_live(self, mock_tmux, mock_notice, mock_spawn):
mock_tmux.return_value = []
mock_spawn.return_value = {"ok": True, "session": "worker-1", "node": "dev"}
mock_notice.return_value = True
res = auto_spawn_workers(nodes=["dev"], dry_run=False)
self.assertEqual(len(res), 1)
self.assertEqual(res[0]["action"], "spawned")
mock_spawn.assert_called_once()
mock_notice.assert_called_once()
if __name__ == "__main__":
unittest.main()