neutron product · PD003 · ux feedback addendum · 2026-08-05

Workflows UX: touch the graph, trust the list

The v0.6.0 backend is right; the surface isn't. This page draws the intended experience — edit by touching nodes on the canvas, one list that tells the truth everywhere, runs you can watch — so we can measure the shipped UI against it.

addendum actioning baseline v0.6.0 live (PD003 implemented) verdict engine sound · surface confusing estimate ~12–19 sessions, 3 phases
01 · What you hit

Three confusions, three causes

You sawWhy it happensThe fix, drawn below
Sidebar says no workflows; the panel lists 3 The sidebar kept phase-1 semantics (schedules you own); it was never taught about governed workflows. Two lists, two definitions of “workflow.” One data source feeds both — same rows, same counts, same states (§03) bug
Palette click adds a box… then nothing responds Selection lives in a side list (“Pick a node below”), not on the canvas; nodes aren't clickable, draggable, or deletable in place. Direct manipulation: click to select, drag to move, drag ports to wire, ⌫ to delete (§02) gap
No way to modify or remove what you added Config edits exist but only through that side list; delete is buried; edges are a from/to form. Selected node opens its config in the inspector; a mini-toolbar on the node carries delete/duplicate (§02) gap
02 · The editor

Edit by touching the graph

The canvas is the editor. Everything you can do happens where you're looking: the four numbered callouts are the whole interaction model. The palette drags in; the inspector always shows the selected node's config; Publish stays put.

interaction being performed approval semantics idle node
Workflows /weekly-outreach-digest draft · v3 unpublished Cancel Publish v3

Palette · drag onto canvas

Triggerstart
Capabilitytool
Agent turnllm
Approvalgate
Notifypost
Branchif

Click still works (adds at a free spot). Drag gives placement. Same six kinds as NEP-0006 — the palette never grows nodes the server would refuse.

trigger · cron
Mon 09:00 Europe/London0 0 9 * * 1
⧉ duplicate⌫ delete
agent turn
Scout drafts the digesteffort low · persona growth
approval
Owner reviewrole: admin · 1h timeout requester ≠ approver
notify
#Marketing“digest ready — {{node.draft.title}}”
capability
mcp__gitlab__list_issuesdragging…
1 click selects — config opens right 2 drag port → port to wire 3 drag moves · layout is a starting point 4 ⌫ deletes node + its edges

Inspector · agent turn “draft”

Scout (growth)
Draft the weekly digest from {{node.issues.output}}
low
publish gateserver validates
owner may use✓ Scout

The inspector is the same form the side list opens today — it just follows canvas selection instead of a separate list. Errors from Publish land on the offending node.

03 · The list

One list, one truth

Sidebar and panel read the same rows: governed workflows and legacy schedules together, each with its state, its shape, its owner, and its last run. The sidebar is the compact projection of exactly this — never a different query.

Workflows engine healthy Import from n8n New workflow

Sidebar · same rows 4

weekly-outreach-digest
agent-authored-acceptance
human-editor-acceptance
nightly-backup-checkschedule

Count matches the panel. A legacy schedule appears here too, tagged — one definition of “workflow” everywhere.

Governed workflows · 3
weekly-outreach-digestv2 live · draft v3 TriggerAgentApprovalNotify operatorsmn7818@… parked 2hwaiting on owner OpenEdit
agent-authored-acceptancev1 live TriggerNotify growth-leadagent seat completed08:31 · 10s OpenRun now
human-editor-acceptancev1 · paused Trigger operatorsmn7818@… never ran OpenEnable
Legacy schedules · 1
nightly-backup-checkschedule · renders as workflow TriggerAgentNotify yousmn7818@… completed03:00 · 41s Open
04 · A run

Watching it happen — and acting from where you stand

A run lights the same graph up node by node. When it parks, the gate node carries the approval — and the inspector is where you decide, without leaving the page.

weekly-outreach-digest /run 39ef0960 waiting on approval · 2h 14m Runs Cancel run

Steps

trigger09:00:00
issues1.2s
draft11s
gateparked
announcequeued

Step outputs are one click away — what the branch saw, what the agent wrote, why a step failed.

trigger · cron
Mon 09:00fired on time
agent turn
Scout drafts the digestoutput: 14 items, 2 flagged 11s · $0.03
approval · parked
Owner reviewsurvives restarts — engine-parked approver: admin role
notify
#Marketingruns after approval

Inspector · approval

requested byagent: scout
waiting2h 14m / 24h
draft preview14 items ↗
Approve Deny

Same durable approval row as the inbox and WhatsApp card — this is a third door to the identical decision, not a new mechanism.

05 · First contact

Creating, and the empty canvas that teaches

Creation stays inline — name and seat live in the editor header, not a separate form screen. The empty canvas says what to do next, so the first minute teaches the whole model.

Workflows /new Cancel Publish

Details

lead-enrichment
operator — smn7818@…

Non-admins see seats they occupy; admins see every human seat. An agent-owned workflow is authored by the agent itself through workflow_upsert (§06).

trigger · cron
every day 08:00 UTCclick to change source
drag from the port, or drag a node in
06 · The card

When an agent proposes, the card is the decision

Agent authoring already works end to end. What the vision adds: the card links to a rendered graph preview — the same canvas, read-only — so the approver judges the picture, not a text summary alone.

And the door to this flow lives in the section itself: a Build with agent button beside "Import from n8n" opens an in-section assistant panel — a slide-over hosting the same chat surface used everywhere else, with the instance's designated builder agent (a setting, never a hardcoded agent) pre-framed with the workflow you're looking at. The canvas stays visible while the agent works; its proposals still arrive as approval cards.

#general · Scout → you · 08:29
approval · workflow_upsert
Create workflow “agent-authored-acceptance”
graph · 2 nodes · preview on canvas ↗
capability tools named · none
agent turns · none
why · yearly cron posts an acceptance note to #Marketing
Approving publishes it disabled. Arming it is a separate, human-only action on the workflow page — the two-man rule.
Approve Deny
07 · Gap analysis

Where the live surface stands against this page

SurfaceLive today (v0.6.0)This page's visionDistance
List coherence Sidebar = schedules only; panel = governed + legacy; counts disagree One query feeds both; unified rows with state, shape chip, owner, last run bug — fix first
Canvas selection Select via side list; canvas nodes inert Click node → selection ring + inspector; Esc deselects small
Delete / duplicate Buried; not on the node Mini-toolbar on selection; ⌫ key; edges cleaned up with the node small
Move nodes Auto-layout only Drag to move; positions persist as editor metadata (additive ui block in the graph doc — NEP v1.4, semantics untouched) medium
Connect edges from/to/label form Drag port → port; branch wires auto-take the next free label (true, then false), click a label to flip it; form stays as fallback medium
Run detail Live overlay + step list ship; approval decided elsewhere Approve/Deny in the run inspector; step outputs one click away small
Creation Inline name+seat ship; empty canvas is silent Guided empty state; port-first hint small
Branch edge tones true/false edge colors illegible / inconsistent (owner-reported on live) Distinct, theme-legible tones per label; label text readable on the canvas ground fix in C
Drag affordance Read-only canvas ignores drag attempts silently; edit-mode drag feel unpolished (owner-reported) Smooth edit-mode drag; read-only canvas answers a drag attempt with an "Edit to rearrange" hint fix in C
Build with agent Agent authoring exists (workflow_upsert, gated) but has no entry point from the Workflows section beyond n8n import "Build with agent" opens an in-section assistant slide-over (reusing the app's chat surface) with the configurable builder agent, workflow context pre-framed; sidebar "+" opens the create flow like every other section small · C
Approval card Forgery-proofed text card ships + read-only canvas preview link small
08 · Phases

Shippable slices

A · Truth & touch

~4–6 sessions
  • One list — sidebar reads the same rows as the panel (kills the bug)
  • Canvas selection + node mini-toolbar (delete, duplicate)
  • Guided empty canvas on create
ship: the confusion you hit is gone

B · Direct manipulation

~6–9 sessions
  • Drag to move, positions persisted (NEP v1.4 additive ui block)
  • Drag-a-wire port-to-port connect; branch label on drop
  • Palette drag-in with placement
ship: the editor feels like a canvas

C · Decide in place

~2–4 sessions
  • Approve/Deny in the run inspector (same durable row)
  • Step-output drawer; card → canvas preview link
  • Build with agent in-section assistant slide-over (configurable builder agent)
  • Sidebar "+" wired to the create flow (section-aware header add)
  • Branch edge tones fixed; drag polish + read-only drag hint
ship: watching a run is operating it
09 · Non-goals

What this deliberately is not

Not an infinite-canvas world. No minimap, no zoom-to-fit gymnastics, no sticky notes — graphs cap at 64 nodes and auto-layout remains the default; manual positions are a nudge, not a document format.
Not client-side authority. Every editor affordance stays advisory; validate.ts and the gate remain the only truth about what publishes and runs.
Not a second mechanism anywhere. Inspector approval = the same approval row; canvas preview = the same read-only canvas; sidebar = the same query. New doors, never new locks.
10 · Acceptance

What has to be true to call it done

Sidebar and panel show the same count and the same rows for every identity, verified live on both instances.
Click a canvas node → ring + inspector; ⌫ removes it and its edges; publish round-trips the result.
A node dragged 200px publishes, reloads, and renders where it was dropped (positions survive the round-trip).
A branch wire auto-takes the next free label (true, then false) and clicking the label flips the CLICKED edge; the server accepts the published result unchanged.
A parked run is approved from the run inspector and completes — same approval row the inbox shows.
"Build with agent" opens the in-section assistant with the configured builder agent carrying workflow context (canvas stays visible); the sidebar "+" opens the create flow; true/false edges render distinct and legible in both themes; a drag on the read-only canvas surfaces the edit hint.