test_task_capabilities.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. from __future__ import annotations
  2. from agent.core.presets import AGENT_PRESETS
  3. from script_build_host.agents.presets import register_script_presets
  4. from script_build_host.domain.phase_protocol import allowed_child_kinds
  5. from script_build_host.domain.task_capabilities import task_capabilities, task_capability
  6. from script_build_host.domain.task_contracts import ScriptTaskKind, output_schema_for
  7. def test_capability_catalog_closes_worker_tool_schema_and_topology_contracts() -> None:
  8. register_script_presets()
  9. capabilities = task_capabilities()
  10. assert {item.task_kind for item in capabilities} == set(ScriptTaskKind)
  11. for capability in capabilities:
  12. preset = AGENT_PRESETS[capability.worker_preset]
  13. assert set(preset.allowed_tools) == set(capability.allowed_tools)
  14. assert output_schema_for(capability.task_kind) in capability.output_schemas
  15. assert allowed_child_kinds(
  16. phase=2,
  17. parent_kind=capability.task_kind,
  18. ) == capability.child_kinds
  19. def test_phase_root_topology_is_machine_readable_and_fail_closed() -> None:
  20. assert allowed_child_kinds(phase=1, parent_kind=None) == frozenset(
  21. {ScriptTaskKind.DIRECTION}
  22. )
  23. assert allowed_child_kinds(phase=2, parent_kind=None) == frozenset(
  24. {ScriptTaskKind.CANDIDATE_PORTFOLIO}
  25. )
  26. assert allowed_child_kinds(phase=3, parent_kind=None) == frozenset(
  27. {ScriptTaskKind.ROOT_DELIVERY}
  28. )
  29. assert not allowed_child_kinds(phase=99, parent_kind=None)
  30. def test_catalog_keeps_element_write_ownership_narrow() -> None:
  31. capability = task_capability(ScriptTaskKind.ELEMENT_SET)
  32. assert capability.write_scope == ("script-build://writes/elements",)
  33. assert "save_script_paragraphs" not in capability.allowed_tools