Flows
Flows are directed graphs of agent steps, conditional branches, and human approval gates. In the app they are accessed via Automations → Flows (G W).
The Flows UI
Cendriix provides two editors for creating and managing flows:
DAG Editor
The visual DAG editor (/workflows/dag) renders your flow as a directed acyclic graph. Drag to add nodes, connect edges, and configure per-step settings (agent, action, inputs, budget). Each node shows live status during execution.
Linear Composer
The linear composer (/workflows/linear) generates a flow from free-form intent using AI. Describe what you want (“deploy to staging after tests pass”) and the composer proposes a DAG you can accept, edit, or reject.
POST /workflows/compose
{ "intent": "Deploy to staging after tests pass" }
→ { "proposal": { "steps": [...], "estimatedCostUsd": 0.45 } }Once accepted, call POST /workflows/compose/approve to persist it as a real flow.
Anatomy
- Metadata — slug, display name, description
- Inputs — typed parameters (ticket key, target env, etc.)
- Steps — ordered graph of tasks and gates
- Outputs — values emitted on completion (PR URL, deploy status, cost)
YAML definition
slug: ship-from-ticket
name: Ship from ticket
description: Ticket → code → PR → CI → preview → approval → merge.
inputs:
ticket:
type: string
required: true
steps:
- id: plan
agent: orchestrator
action: plan-from-ticket
inputs: { ticket: "{{ inputs.ticket }}" }
- id: implement
agent: dev
action: implement-plan
inputs: { plan: "{{ steps.plan.output }}" }
- id: ci
agent: dev
action: run-ci
inputs: { branch: "{{ steps.implement.output.branch }}" }
- id: approve
type: approval-gate
roles: [maintainer, admin]
timeout: 24h
- id: merge
agent: dev
action: merge-pr
inputs: { pr: "{{ steps.implement.output.pr }}" }
dependsOn: [approve]
outputs:
pr_url: "{{ steps.implement.output.pr.url }}"
status: "{{ steps.merge.output.status }}"Step types
| Type | Description |
|---|---|
agent | Execute an agent action |
approval-gate | Pause until a human approves |
conditional | Branch on a JSONPath expression |
parallel | Execute steps concurrently |
webhook | Wait for an external HTTP callback |
Templates
The Flow Library ships pre-built templates for common patterns:
GET /workflows/templates
POST /workflows/from-template/:idOrSlugInstantiate a template with { "name": "My Flow", "costCapUsd": 5.00 } to create a new editable flow from a proven pattern.
Live execution stream
Once a flow starts, subscribe to real-time events via SSE:
GET /workflow-runs/:runId/streamEvents: NODE_RUN_STARTED, NODE_RUN_COMPLETED, NODE_RUN_FAILED, RUN_COMPLETED.
Blast-radius overlay
Each node in the DAG can resolve its infrastructure blast radius via the Cortex API. This shows which downstream services would be affected if that step fails — enabling informed approval decisions.
Versioning
Flows use semver. New runs pick the latest published version; in-flight runs keep their pinned version.
cendriix workflow publish --file flow.yaml
cendriix workflow versions ship-from-ticketSee also: Agents, Skills, Runs & Orchestration, Policies