Skip to main content

Capability

You are in the deep end

Authoring contract. The story: how it hangs together. Publishing: operating model.

The Capability Plane publishes two kinds. That is the catalog contract. A kind is how Runtime calls after PEP, not a taxonomy of “things an agent can do.”

kindInvokeWhat it is
domainHTTP to a governed business API (local: agent-fabric-mocks)OCR, fee lookup, freeze, notify.
agentFront Door POST /v1/jobs with a fixed route_id in invoke.bodyStart another catalogue agent. New freeze, new entitle, callee agent_client_id. Not a POST to the callee Runtime.

Same id + version UX for both. Control Plane lists them together. Manifests only store {capability_id, capability_version}; kind lives on the capability row (acr.registry.capabilities.kind).

Seed agent rows: start_contract_review → contract_review, start_kyc_onboarding → kyc_onboarding. Parents: fraud_investigate, ops_start_kyc. Runtime skips that HTTP today; see autonomy modes.

Do not add a kind for​

These already have a home. A new kind would split the catalog and confuse hydrate.

TemptationHome
Retrieve / RAG / named corpusRoute retrieval + retrieve. Not a capability kind.
Prompt pack / llm_roleprompts. Not a capability.
JSON Schema in/outschemas. output_schema binds on LLM stages; input_schema is catalogue today.
Workflow stage, branch, human_gateADP workflow JSON. Linear graph today; see patterns and autonomy modes.
Memory policymemory.
MCP list_toolsNot the catalog. Exam and pin need a frozen id@version.
“Any agent” / model-chosen route_idAn agent capability is a named product. The invoke body already has route_id. The model proposes the capability id, not a free route.

When a third kind would earn keep​

Only if invoke is a different gate: not domain HTTP and not AFD jobs. Example: a human work-item API, or a non-HTTP bus. Until then, two kinds.

Register with PUT on the Capability Plane, not Control Plane. After add-seed-data.sh, seed rows reload from agent-fabric-scripts/stack/route/.