Foundational Nodes
12 config-source nodes: agent, model-provider, kit, issue-tracker-provider, and others.
Foundational nodes are configuration-source nodes: they produce typed reference objects that wire into agent.invoke or agent.dispatch as input ports, but they have no runtime side effects of their own. Every foundational node except wait is a pure configuration emitter - it resolves a reference at publish time and passes it downstream.
Think of them as named, typed configuration slots. Separating configuration from execution lets you:
- Reuse the same agent definition or model profile across multiple dispatch nodes
- Swap a model or credential in one place and have every downstream node pick up the change
- Build platform templates that users customize by replacing foundational nodes without editing action node configs
Composition pattern
Foundational nodes work in two ways:
Fan-in via the agent composer node (recommended for SDLC-style templates):
[agent-definition] ──┐
[model-provider] ─┤
[kit-provider] ─┤→ [agent] ──→ [agent.invoke: composition port]
[credential-provider] ─┤
[capacity-provider] ─┤
[capability.memory] ─┤
[issue-tracker-provider] ─┘Direct slot wiring (for one-off or override patterns):
[agent-definition] ──→ [agent.invoke: definition port]
[model-provider] ──→ [agent.invoke: model port]agent
The Agent Composer node. Fan-ins up to eight foundational ref inputs and emits a single composed AgentDispatchRef on its output port. Wire this to the composition port of agent.invoke or agent.dispatch.
Input ports
| Port | Type | Required | Description |
|---|---|---|---|
trigger | object | no | Trigger envelope - passes trigger data into the dispatch context |
definition | AgentDefinitionRef | yes | From an agent-definition node |
model | ModelRef | yes | From a model-provider node |
kits | KitRef[] | no | From one or more kit-provider nodes (multi-edge fan-in) |
credentials | CredentialRef[] | no | From one or more credential-provider nodes |
capacityPool | CapacityPoolRef | yes | From a capacity-provider node |
capabilities | CapabilityRef[] | no | From capability.* nodes (multi-edge fan-in) |
issueProvider | IssueTrackerRef | no | From an issue-tracker-provider node (omission ⇒ project primary) |
Output port - output (AgentDispatchRef): the fully composed dispatch reference.
agent-definition
Points at an agent_cards row and optionally applies inline overrides. Emits an AgentDefinitionRef for wiring into the agent composer or directly to agent.invoke's definition port. DisplayName: Agent Definition.
Config
| Field | Type | Required | Description |
|---|---|---|---|
cardId | string (UUID) | yes | The agent card to use. Resolved at dispatch time using the x-resource-kind: agent-profile picker. |
overrides.skills | string[] | no | Replacement or additive skill IDs merged with the card baseline |
overrides.partials | string[] | no | Replacement or additive partial refs merged with the card baseline |
Output port - output (AgentDefinitionRef): { cardId, overrides? }
model-provider
DisplayName: Model Provider. Selects a model profile from the org catalog and optionally overrides per-call parameters. Emits a ModelRef.
Legacy alias: the id
llm-modelcontinues to resolve in saved workflows for back-compat. Usemodel-providerfor all new definitions.
Config
| Field | Type | Required | Description |
|---|---|---|---|
provider | string | yes | claude (Anthropic), codex (OpenAI), or gemini (Google) |
model | string | yes | Catalog model ID (e.g. claude-opus-4-8, gpt-5.4, gemini-2.5-pro) |
config.max_tokens | number | no | Override max output tokens (1-200,000) |
config.temperature | number | no | Override sampling temperature (0.0-2.0) |
config.top_p | number | no | Override nucleus sampling probability (0.0-1.0) |
config.stop_sequences | string[] | no | Override stop sequences |
Output port - model (ModelRef)
kit-provider
Selects one or more donmai kits to attach to the agent. Emits a KitRef[]. Multiple kit-provider nodes can fan-in to the kits port of the agent composer - the executor concatenates them.
Config
| Field | Type | Required | Description |
|---|---|---|---|
kits | array | yes | One or more kit selections |
kits[].kitId | string | yes | Kit identifier (e.g. rensei-labs/pm-kit@1.0.0). Uses x-resource-kind: toolkit picker. |
kits[].version | string | yes | Pinned version. Use "latest" to track the installed version. |
Output port - kits (KitRef[])
credential-provider
Points at a credential stored in the org's credential vault. Emits a CredentialRef that the dispatcher resolves to env vars at dispatch time. Multiple credential-provider nodes can fan-in to the credentials port of the agent composer.
Config - credential picker (uses x-resource-kind: credential); select from connected org credentials.
Output port - output (CredentialRef)
capacity-provider
DisplayName: Capacity Provider. Points at an execution provider pool (the configuration that determines which sandbox the agent runs in). Required input for the agent composer and for agent.invoke's capacityPool slot.
Legacy alias: the id
capacity-poolcontinues to resolve in saved workflows for back-compat. Usecapacity-providerfor all new definitions.
Config - pool picker (uses x-resource-kind: capacity-pool); select from configured pools.
Output port - output (CapacityPoolRef)
issue-tracker-provider
DisplayName: Issue Tracker Provider. Points at one of the project's configured issue trackers and emits a typed IssueTrackerRef for wiring into the agent composer's optional issueProvider input port (the 8th port). The node uses a picker over the project's configured trackers - no manual tracker ID entry.
When issueProvider is omitted from the agent composer, the run resolves the project's PRIMARY tracker at dispatch time. Wire an issue-tracker-provider node only when you want to explicitly pin a non-default tracker for a particular dispatch path, or when a workflow serves a project with multiple active trackers and you need deterministic selection.
Emitted type
interface IssueTrackerRef {
provider: string // "linear" | "github_issues" | "jira" | "asana"
trackerId: string // Tracker-specific identifier (Linear workspace ID, GitHub repo full name, etc.)
}Config - tracker picker (uses x-resource-kind: issue-tracker); selects from the project's configured and active trackers. Defaults to the project PRIMARY when no explicit selection is made in the config.
Output port - output (IssueTrackerRef)
Why this matters: before this node, agent composition was implicitly tied to the project's LINEAR tracker. Wiring an issue-tracker-provider node lets an agent read and write the project's chosen tracker (Linear, GitHub Issues, Jira, or others) through the tracker-agnostic issue.* generic action nodes, making the same workflow template portable across organizations using different trackers.
Codex tags: composition, provider
sandbox-provider
Points at a specific sandbox provider (e2b, Vercel Sandbox, Docker, etc.) directly, bypassing the capacity pool routing layer. Use this when you need to pin a workflow to a specific sandbox type rather than letting the pool selector choose.
Config - sandbox provider picker.
Output port - output (SandboxRef)
Capability nodes
Capability nodes configure optional agent intelligence layers. Wire their outputs to the capabilities array port of the agent composer. Multiple capability nodes fan-in to build the full capability set for the agent dispatch.
capability.memory
Enables persistent memory for the agent. The agent can recall prior observations at session start and store durable facts as it works.
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
scope | string | yes | project | Memory scope: project (common case), org (tenant-wide), or session (hermetic) |
namespace | string | no | - | Optional logical namespace (e.g. "engineering") |
usagePartial | string | no | Built-in default | Prompt guidance injected into the agent's system prompt |
Output port - capability (MemoryCapabilityRef)
capability.a2a
Enables agent-to-agent (A2A) communication. The agent can discover and call other registered agents via the A2A registry.
Output port - capability (A2ACapabilityRef)
capability.architecture
Enables architectural intelligence. The agent gets access to the knowledge graph and can query architectural context, code structure, and decision provenance.
Output port - capability (ArchitectureCapabilityRef)
capability.code-intel
Declares code intelligence for the agent. Requires a repo (code-intel is repo-scoped) and accepts an optional ref commit/branch pin. At dispatch the agent's session gains the af_code_* tool set: repository map (import-centrality ranked), symbol search, code search, duplicate detection, and type-usage scans, served over the runner's built-in code-intelligence MCP server against the session checkout.
Code-intel is enabled per project (an org admin opts a project in); until a project is enabled, wiring the node validates but resolves to a disabled stub at dispatch.
Output port - capability (CodeIntelCapabilityRef)
wait
Pauses the workflow until a resume condition is met. Unlike the gate node (which is human-driven), wait supports timer, webhook, and signal-based resumption. The wait node is foundational because it is side-effect-free - it does not call any provider; it only suspends and resumes the execution flow.
Resume modes
| Mode | Config fields | When it resumes |
|---|---|---|
timeInterval | amount, unit | After the specified duration elapses |
specificTime | at (ISO 8601) or cron | At the specified wall-clock time or on next cron match |
webhook | webhookUrl, secret | When a POST is received at the callback URL |
signal | eventType | When a CloudEvent matching eventType is received |
Config
| Field | Type | Required | Description |
|---|---|---|---|
resume | string | yes | Resume mode: timeInterval, specificTime, webhook, or signal |
amount | number | no | For timeInterval: how many units to wait |
unit | string | no | ms, s, m, h, or d |
at | string | no | For specificTime: ISO 8601 timestamp |
cron | string | no | For specificTime: cron expression (used when at is absent) |
webhookUrl | string | no | For webhook: auto-generated if omitted |
secret | string | no | For webhook: HMAC secret for signature verification |
eventType | string | no | For signal: CloudEvent type to listen for |
timeoutMs | number | no | Optional timeout in milliseconds (0 = no timeout) |
Ports: trigger input (optional, passes upstream envelope through) → output (resume payload)
Example: SDLC agent composition
steps:
- id: def
type: action
nodeId: agent-definition
config:
cardId: "{{ org.agentCards.devAgent }}"
- id: model
type: action
nodeId: model-provider
config:
provider: claude
model: claude-opus-4-8
- id: pool
type: action
nodeId: capacity-provider
config: {} # uses x-resource-kind picker in UI
- id: mem
type: action
nodeId: capability.memory
config:
scope: project
- id: composed
type: action
nodeId: agent
inputs:
definition: "{{ nodes.def.output }}"
model: "{{ nodes.model.model }}"
capacityPool: "{{ nodes.pool.output }}"
capabilities: ["{{ nodes.mem.capability }}"]
- id: dispatch
type: action
nodeId: agent.invoke
inputs:
composition: "{{ nodes.composed.output }}"
stageEvent: "{{ $trigger.data }}"Related pages
- Agent Action Nodes -
agent.invoke,agent.dispatch_stage, consuming foundational refs - Model Routing: Catalog and Routing - how
model-providerprofile refs resolve to actual models - Sandbox Providers: Capacity Pools - what
capacity-providernodes point at - Agent Cards: Overview - the
agent_cardsrows thatagent-definitionreferences - Generic Action Nodes - tracker-agnostic
issue.*nodes that use the resolved tracker fromissue-tracker-provider
Parallel Nodes
fanout / fanin parallel execution nodes.
Delivered Nodes
Operator-delivered workflow nodes: a signed plugin whose verbs bind to an in-platform Provider Family, installed from a source, refreshed by the reconciler, and gated by requiredProviders. Covers the shipped integration catalog and the default-off governance rule.