Parent contract: #140
Program: #130
Depends on: #144 acceptance gate
Dependency
Start only after slice C (#144) provides immutable Data Brief storage and manifests.
Owned paths
backend/agent_control/handlers/artifacts.py
backend/mcp_server.py
tests/unit/test_agent_data_p0_mcp.py
tests/integration/test_agent_data_artifact_api.py
Required behavior
Implement hash-verifying artifact.read and derive all seven P0 MCP commands from the authoritative registry. Preserve current MCP names as compatibility adapters; do not add provider-specific tools. Use the shared result/error contract and propagate caller identity.
Acceptance gate
MCP discovery schemas and availability match the registry. Hash mismatch, wrong Project/RBAC and secret-shaped data fail redacted. All seven command paths pass targeted tests and the generic AIHOT live canary completes list → readiness → start → ordered polling → query → brief → artifact before slice E starts.
Parent contract: #140
Program: #130
Depends on: #144 acceptance gate
Dependency
Start only after slice C (#144) provides immutable Data Brief storage and manifests.
Owned paths
backend/agent_control/handlers/artifacts.pybackend/mcp_server.pytests/unit/test_agent_data_p0_mcp.pytests/integration/test_agent_data_artifact_api.pyRequired behavior
Implement hash-verifying
artifact.readand derive all seven P0 MCP commands from the authoritative registry. Preserve current MCP names as compatibility adapters; do not add provider-specific tools. Use the shared result/error contract and propagate caller identity.Acceptance gate
MCP discovery schemas and availability match the registry. Hash mismatch, wrong Project/RBAC and secret-shaped data fail redacted. All seven command paths pass targeted tests and the generic AIHOT live canary completes list → readiness → start → ordered polling → query → brief → artifact before slice E starts.