trading-system-docs/red-queen-architecture/control-plane/cp2a2_2b/test_worker_tool_capability.py

97 lines
2.9 KiB
Python

# CP2A2.2B — L1 Red Queen Worker: Tool-Capability-Test
# STRICTLY NON-AUTONOMOUS / NON-PRODUCTIVE.
#
# Verifiziert, dass der Worker KEINE verbotenen Tools/Faehigkeiten besitzt.
# Verboten: terminal, generic shell, execute_code, write_file auf externe/
# shared Ziele, patch, git push, SSH, Docker, cronjob, send_message,
# delegation, arbitrary command execution. MAX_SUBAGENTS=0.
#
# Ground-Truth-Check: prueft die tatsaechlich geladenen Toolsets, nicht nur
# die Config. Der Worker nutzt ein minimales read-only Toolset.
import os
import sys
# Verbotene Tool-Namen (Ground-Truth-Check gegen geladene Toolsets)
FORBIDDEN_TOOLS = [
"terminal",
"process",
"execute_code",
"write_file",
"patch",
"git_push",
"ssh",
"docker",
"cronjob",
"send_message",
"delegate_task",
"browser_navigate",
"browser_click",
"browser_type",
"computer_use",
]
# Erlaubte (read-only) Tools
ALLOWED_TOOLS = [
"web_extract",
"web_search",
"vision_analyze",
"read_file",
"search_files",
"session_search",
"memory",
"todo",
"clarify",
"skills_list",
"skill_view",
]
def get_loaded_toolsets() -> list[str]:
"""Ermittelt die tatsaechlich geladenen Toolsets (Ground Truth)."""
# Aus ENV: HERMES_TUI_TOOLSETS oder via hermes CLI
env_toolsets = os.environ.get("HERMES_TUI_TOOLSETS", "")
if env_toolsets:
return [t.strip() for t in env_toolsets.split(",") if t.strip()]
return []
def check_forbidden_tools(toolsets: list[str]) -> list[str]:
"""Prueft, ob verbotene Tools in den geladenen Toolsets enthalten sind."""
found = []
# Mapping Toolset -> Tools (statisch, aus toolsets.py Ground Truth)
toolset_tools = {
"web": ["web_search", "web_extract"],
"vision": ["vision_analyze"],
"file": ["read_file", "write_file", "patch", "search_files"],
"terminal": ["terminal", "process"],
"code_execution": ["execute_code"],
"delegation": ["delegate_task"],
"cronjob": ["cronjob"],
"browser": ["browser_navigate", "browser_snapshot", "browser_click",
"browser_type", "browser_scroll", "browser_back",
"browser_press", "browser_get_images", "browser_console",
"web_search"],
"computer_use": ["computer_use"],
}
for ts in toolsets:
for tool in toolset_tools.get(ts, []):
if tool in FORBIDDEN_TOOLS:
found.append(f"{ts}:{tool}")
return found
def main() -> int:
toolsets = get_loaded_toolsets()
forbidden = check_forbidden_tools(toolsets)
print("=== CP2A2.2B TOOL-CAPABILITY TEST ===")
print(f"Loaded toolsets: {toolsets if toolsets else 'NONE (default)'}")
print(f"Forbidden tools found: {forbidden if forbidden else 'ABSENT'}")
print(f"RESULT: {'PASS' if not forbidden else 'FAIL'}")
return 0 if not forbidden else 1
if __name__ == "__main__":
sys.exit(main())