sherlock.
INTEGRATION GUIDE

One Graph. One System.

Compose a system visually, configure its module operations and publish it. Each publication gets an immutable system ID, a dedicated execution URL, and a key scoped strictly to that graph.

Design → Configure → Publish

Choose a supported runtime operation in each node’s settings. Add fixed JSON input, or bind inputs from connected predecessor nodes. Publish from the builder or API access, then test your published system with test run inputs. The server validates node uniqueness, supported operations, input sources, and acyclic dependency order before saving the snapshot and issuing its key.

Local Save keeps an editable draft in this browser. Publish creates an immutable snapshot on the server. Later draft edits never mutate that published system. Republish to create a new version and rotate credentials when retiring older snapshots.

Call a Published System

POST /api/v1/graphs/{systemId}/run
Authorization: Bearer $GRAPH_API_KEY
Content-Type: application/json

{
  "inputs": {
    "policy": {
      "authenticity": "PASS",
      "identity": "MATCH",
      "action": "balance",
      "budget": 100,
      "stickyFail": false,
      "shortAudio": false
    }
  }
}

Input Mapping & Component Field Bindings

Per-run inputs are keyed by node ID. Fixed node configuration overrides per-run fields. When inputFrom is selected, that predecessor’s output overrides both. For individual fields, configure field bindings such as:

{
  "authenticity": {
    "node": "voiceprint",
    "path": [
      "status"
    ]
  }
}

Each binding source must be a connected predecessor. Bound fields override runtime inputs. Missing output paths halt execution safely. There is no arbitrary code execution or expression eval in the runner.

Execution, Branching & Outcomes

Without explicit routing, the runner executes every node in topological dependency order. Each response contains execution duration, status (completed, failed, or skipped), and outputs.

Explicit Routing: Entries, Conditions & Joins

Enable explicit routing in System API → Entry points, conditions and outputs:

  • flow.entries: List all entry node IDs. Requests specify which entry points to activate.
  • Edge conditions: Configure when: { path: ["decision"], equals: "ALLOW" } to branch conditionally based on exact output values.
  • Joins: Set runtime.join: "all" (default: all predecessors must run) or runtime.join: "any" (runs once any predecessor completes).
  • Named outputs: Map terminal node outputs into a clean JSON dictionary using flow.outputs: { result: { node: "policy", path: ["decision"] } }.
{
  "entries": [
    "batch-a"
  ],
  "inputs": {
    "batch-a": {
      "samples": [
        75
      ]
    }
  }
}

Durable Agent Tasks (Relay & Bridge)

Relay delegates to another published component owned by the same workspace. Bridge executes sandbox bank transfers with parameter-bound permits and interactive signed-in customer confirmation:

POST /api/v1/graphs/{systemId}/tasks
Authorization: Bearer $GRAPH_API_KEY
Idempotency-Key: your-stable-request-id
Content-Type: application/json

{"inputs":{"delegate":{"accountId":"source-id","payeeId":"destination-id","amount":1000,"currency":"INR"}}}

GET /api/v1/tasks/{taskId}
POST /api/v1/tasks/{taskId}/resume
POST /api/v1/tasks/{taskId}/cancel

Runtime Limits

Publications support up to 30 nodes and 100 edges. Utility runs timeout after 45 seconds. Durable tasks expire after 15 minutes, support up to 3 delegation hops and 32 tasks per tree. Task inputs are limited to 64 KiB.