Task DAG
Follow an agent task graph in a tab or workspace popup. Both views use the same canvas to show progress. These views are for inspection; create and edit tasks through the CLI.
This page uses a saved copy of the design system, last changed on . It may differ from the current design source.
Graph canvas
Task DAG canvas — read-only observation
The one canvas both surfaces embed. Nodes are laid out top-down by dependency layer, edges are orthogonal with 4px elbows. This is not a node editor: there are no ports, no sockets, no drag-to-move — the only gestures are pan (drag empty canvas or middle-drag), zoom (Ctrl + wheel; bare wheel pans, because a terminal app reads bare wheel as scroll), select (click a node), and Esc to clear.
Position stability is the contract that makes a 0.5s poll survivable: layout is computed from ids + dependency edges only — never from status, duration or counts — so a task turning running → succeeded repaints one card and moves nothing. Layering is longest-path and capped by node count, so a cyclic graph still terminates and still draws.
Never add a connect handle, a port dot, or a drag-to-move affordance. Anything that looks editable promises an edit the host cannot honour — DAGs are built by agents over CLI/IPC.
Node card · 8 states
Task node — every execution state
One card = one task. Three channels carry state so colour is never alone: the leading 3px bar (position), a mono glyph (◦ ❯ ◑ ✓ ✗ − ⊘ ?), and the spelled label. running is the loudest — accent border + accent wash — and it is static: the 0ms terminal-motion policy holds, so there is no spinner and no pulse on the card.
Colour vs. text: the state colour is the recede channel — bar, border, glyph on a chip. The spelled label reads from its own --tasty-dag-status-<state>-label role: waiting takes --tasty-text-muted, and the two dimmed states take --tasty-text-secondary, which still measures 4.74:1 after the 0.75 card dim.
Truncation rule (i18n): the task name is a single line with ellipsis at the card edge — never wraps, never shrinks the font; the full name lives in the tooltip and the detail panel. On the meta row the status label yields first: it ellipses before the duration is dropped, so a long German or Japanese state string can't push the timing out of the card.
Task kinds
Five task kinds, told apart by the leading glyph: run (shell), custom (IPC call), reduce (result fan-in), wait_barrier (gate), agent (one Claude / Codex turn, 2026-10-07). Claude and Codex share the agent glyph; the provider is a detail-panel field, not a second shape.
New glyph: icons/agent.svg — a speech bubble carrying the prompt chevron (an agent turn is a conversation that runs commands). terminal, plug, layers and lock carry the other four. A dedicated barrier glyph would read better than lock if one is ever drawn.
Level of detail · selection · overflow
Zooming out never changes the box, only its content: full (≥70%) name + status + duration · compact (≥40%) glyph + name · block (<40%) status fill only. At 200 nodes the block tier keeps every state readable as colour while the graph shape stays legible.
55 nodes, auto-fitted on open — the canvas lands in the compact or block tier and says so in the bottom-left hint chip, so a user who sees colour blocks knows why and knows the way back.
Running phase · unknown reason (2026-10-07)
Running phase — only awaiting_input gets its own look
Typed (v2) tasks report a step while running. executing is the plain running card. awaiting_input stops the graph on a person, so it swaps the whole state look to the needs-input yellow — bar, border, wash, glyph ! and label — and stays readable at the compact tier (glyph + name). postprocessing and retry_wait keep the running tone and only swap the label, with the run number.