Five node types. One flow.
Workflows are directed graphs. A trigger fires, tasks do work, a waiting block holds until an external event returns. Each node wears a distinct border treatment so the flow reads structurally — left rail on triggers, top rail on tasks, dashed border on waiting, green cap on the end. The run-time surface — how you fire it, how you see what happened — lives in the frames below the graph.
A real workflow from the app — a Gmail event fires, an agent classifies, a confidence branch routes to either auto-reply or hold-for-approval. The graph is the authoring surface: this is what the Studio canvas draws when you open a workflow draft.
Entry point. Fires the run. Three variants share the rail but swap the sub-label.
Unit of work. Calls an integration action, runs code, or invokes an agent. Synchronous within the run.
Decision point. Evaluates a condition and routes the run down one of several paths. Dashed rail signals "not doing, deciding." Edge labels name the paths.
Suspended. The run is paused on an async boundary — user input, a webhook, a schedule. Dashed border signals "not running, but not done."
Terminal. Green cap on success, red on failure, amber on cancellation. The only place signal colors enter the flow.
Manual triggers open a form whose fields are generated from the workflow's input schema — strings become text inputs, bools become toggles, objects and arrays become JSON textareas. Validation runs per-field on blur. Run now fires the workflow and lands you on the new run in the history below.
Each row is a run: status dot, trigger (kind · name), current block (the position in the graph), relative time. The amber dot on Running and Waiting pulses to 5-second polling. Clicking a row opens the run detail below.
A run opens as the graph itself — not a list. Each block is rendered in its node style (border treatment, kind sub-label, elapsed time). Completed blocks are filled; the current block pulses; pending blocks outline quietly. On the live edge — the one between classify_threads and compose_digest — signal-flow particles trace in the direction of work. A metadata strip sits below: version, trigger, runtime id, current position, input shape. Cancel is the only verb mid-run.
Weekly digest
The "open a workflow" surface anchors every interaction with a single shape: title on top, tabs below, content stacked. Status lives as a small mono pill inside the meta line — not a hero badge. Tabs are sentence-case, underlined only when active. Section titles are tiny mono eyebrows, never full shouty headers — the content (graph, form, list) carries the weight. Publishing is the only head-level action; everything else lives inside its section.
A concrete example of a workflow in production: the figment generation pipeline itself. The shape of the section above scales from a seven-step linear run down to a one-step “trigger → end” and everything between.