From 2fb6c10a5a436b08338021ed14084911568fd60b Mon Sep 17 00:00:00 2001 From: Mikhail Putilovskij Date: Fri, 24 Apr 2026 13:05:26 +0300 Subject: [PATCH] Reject null agent registry fields --- adapter/matrix/agent_registry.py | 16 ++++++++++++---- tests/adapter/matrix/test_agent_registry.py | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/adapter/matrix/agent_registry.py b/adapter/matrix/agent_registry.py index 5bb99d1..1b03d77 100644 --- a/adapter/matrix/agent_registry.py +++ b/adapter/matrix/agent_registry.py @@ -29,6 +29,16 @@ class AgentRegistry: raise AgentRegistryError(f"unknown agent id: {agent_id}") from exc +def _required_text(entry: Mapping[str, object], key: str) -> str: + value = entry.get(key) + if value is None: + raise AgentRegistryError("each agent entry requires id and label") + text = str(value).strip() + if not text: + raise AgentRegistryError("each agent entry requires id and label") + return text + + def _load_registry_data(path: str | Path) -> dict[str, object]: try: raw = yaml.safe_load(Path(path).read_text(encoding="utf-8")) @@ -52,10 +62,8 @@ def load_agent_registry(path: str | Path) -> AgentRegistry: for entry in entries: if not isinstance(entry, Mapping): raise AgentRegistryError("each agent entry requires id and label") - agent_id = str(entry.get("id", "")).strip() - label = str(entry.get("label", "")).strip() - if not agent_id or not label: - raise AgentRegistryError("each agent entry requires id and label") + agent_id = _required_text(entry, "id") + label = _required_text(entry, "label") if agent_id in seen: raise AgentRegistryError(f"duplicate agent id: {agent_id}") seen.add(agent_id) diff --git a/tests/adapter/matrix/test_agent_registry.py b/tests/adapter/matrix/test_agent_registry.py index 29dd4c5..ce467cc 100644 --- a/tests/adapter/matrix/test_agent_registry.py +++ b/tests/adapter/matrix/test_agent_registry.py @@ -117,3 +117,22 @@ def test_load_agent_registry_rejects_malformed_yaml(tmp_path: Path): with pytest.raises(AgentRegistryError, match="invalid agent registry YAML"): load_agent_registry(path) + + +@pytest.mark.parametrize( + "content", + [ + "agents:\n" + " - id: null\n" + " label: Analyst\n", + "agents:\n" + " - id: agent-1\n" + " label: null\n", + ], +) +def test_load_agent_registry_rejects_null_id_or_label(tmp_path: Path, content: str): + path = tmp_path / "agents.yaml" + path.write_text(content, encoding="utf-8") + + with pytest.raises(AgentRegistryError, match="each agent entry requires id and label"): + load_agent_registry(path)