Skip to content

Thin waist — one registry per job

Agent-selectable behaviour is resolved by name → implementation in PluginRegistry (manifest spec.* keys). Embedder-chosen infra (runtime, placement, framework) is resolved from component-registry.yaml. A third table that maps the same names is a duplicate.

PluginRegistry

Manifest plugin types (design_pattern, governance, llm_provider, skill_impl, …) load through PluginRegistry.resolve_by_type. Skills use skill_impl rows in library.yaml; there is no parallel SkillPluginRegistry implementation table.

Boundary slots are a closed set. register_type(..., layer="boundary") rejects unknown envelope types. Library types (related_state, execute_sandbox, circuit_breaker, skill_*, lab steps) are not envelope slots.

Component catalog

Framework adapters and placement backends start empty and are filled from the catalog. Unknown ids fail through validate_component_id / get_framework_adapter. Docker and Kubernetes placement remain status: planned until an availability plugin is declared.

Control and snapshots

Pause, navigate, spec revision, and snapshot storage are ControlContract / SnapshotTree APIs, not extra plugin-type enums. The JSON-lines control wire is a library control_protocol plugin. A2A session attach is agent_expose: contextId is the session id. User turns on that session are ControlContract.send_message (A2A message/send). AgentCommContract is outbound peer send after delegation, not inbound user input.