Docs · Orchestration

Hybrid orchestration

BPM-class process and LangGraph-class agent teams on one JSON-LD workflow graph. A full agent orchestration is one node inside a governed run.

Architecture: SPIKE-HYBRID-ORCHESTRATION.md (repo) · Demo script: hybrid claims (wf-hybrid-claims).

Gateway (parallel fork / join)

{
  "id": "fork_checks",
  "kind": "gateway",
  "label": "Parallel checks",
  "meta": { "gateway": "parallel", "join": "join_checks" }
}

Join side: "meta": { "gateway": "parallel", "joinOf": "fork_checks" }. Inclusive and event gateways use the same shape with "gateway": "inclusive" | "event".

Wait + boundaries

{
  "id": "await_docs",
  "kind": "wait",
  "meta": {
    "wait": { "kind": "message", "channel": "docs.received", "timeoutMs": 259200000 }
  },
  "boundaries": [
    { "on": "timeout", "interrupting": true, "to": "escalate_missing_docs" }
  ]
}

Boundaries attach to agent, integration, subprocess, wait, or human nodes (timeout | error | signal | escalation).

Foreach (multi-instance)

{
  "kind": "integration",
  "meta": {
    "adapterId": "claims.coverage",
    "foreach": {
      "itemsKey": "lineItems",
      "mode": "parallel",
      "maxConcurrency": 5,
      "resultKey": "coverageResults",
      "reducer": "append"
    }
  }
}

Compensation

{
  "id": "reserve_inventory",
  "kind": "integration",
  "meta": { "adapterId": "erp.reserve" },
  "compensateWith": "release_inventory"
}

On cancel / transaction failure the engine walks completed nodes in reverse and runs each compensateWith target.

Orchestration node (agent team as one step)

{
  "id": "research_team",
  "kind": "agent",
  "meta": {
    "orchestration": {
      "pattern": "supervisor",
      "executorId": "hosted",
      "agents": [
        { "id": "lead", "role": "supervisor", "goal": "Coordinate research", "maxTurns": 12 },
        { "id": "web", "goal": "Web research", "allowedTools": ["research.web"] }
      ],
      "handoffs": [{ "from": "lead", "to": ["web"] }, { "from": "web", "to": ["lead"] }],
      "interrupts": [{ "when": "confidence < 60", "to": "human", "resume": true }],
      "checkpoint": "turn",
      "budget": { "maxTurns": 40 }
    }
  }
}

Patterns: single | pipeline | supervisor | swarm. Executors: hosted (native ReAct + handoffs), langgraph (IR compile closure.langgraph.v1 + same audit shape; webhook for external StateGraph), bedrock / foundry (IR export; muscle via webhook until adapters land).

What a developer needs

  1. Author the graph from your IDE (Platform MCP) or as JSON-LD; review in the Closure console's gateway / wait / orchestration editors.
  2. Run via PlatformRuntime — sequential graphs unchanged; token set activates on parallel forks.
  3. Swap executorId without rewriting the process.

See also: Workflows pillar · Build · Workflows API.