from __future__ import annotations from agent.core.presets import AGENT_PRESETS from script_build_host.agents.presets import register_script_presets from script_build_host.domain.phase_protocol import allowed_child_kinds from script_build_host.domain.task_capabilities import task_capabilities, task_capability from script_build_host.domain.task_contracts import ScriptTaskKind def test_capability_catalog_closes_worker_tool_schema_and_topology_contracts() -> None: register_script_presets() capabilities = task_capabilities() assert {item.task_kind for item in capabilities} == { kind for kind in ScriptTaskKind if kind not in { ScriptTaskKind.PATTERN_RETRIEVAL, ScriptTaskKind.DECODE_RETRIEVAL, ScriptTaskKind.EXTERNAL_RETRIEVAL, ScriptTaskKind.KNOWLEDGE_RETRIEVAL, } } for capability in capabilities: preset = AGENT_PRESETS[capability.worker_preset] assert set(preset.allowed_tools) == set(capability.allowed_tools) assert capability.output_schema() in capability.output_schemas assert allowed_child_kinds( phase=capability.phase, parent_kind=capability.task_kind, ) == capability.child_kinds def test_phase_root_topology_is_machine_readable_and_fail_closed() -> None: assert allowed_child_kinds(phase=1, parent_kind=None) == frozenset( {ScriptTaskKind.DIRECTION} ) assert allowed_child_kinds(phase=2, parent_kind=None) == frozenset( {ScriptTaskKind.CANDIDATE_PORTFOLIO} ) assert allowed_child_kinds(phase=3, parent_kind=None) == frozenset( {ScriptTaskKind.ROOT_DELIVERY} ) assert not allowed_child_kinds(phase=99, parent_kind=None) assert not allowed_child_kinds( phase=1, parent_kind=ScriptTaskKind.PATTERN_RETRIEVAL ) def test_catalog_keeps_element_write_ownership_narrow() -> None: capability = task_capability(ScriptTaskKind.ELEMENT_SET) assert capability.write_scope == ("script-build://writes/elements",) assert "save_script_paragraphs" not in capability.allowed_tools