Publishing & versions
The draft is yours; production runs the published snapshot. Publish is the gate, and every publish is a version.
The canvas always holds the draft. Production — webhooks, schedules, API-triggered runs — always executes the latest published version's snapshot. Saving an edit to a live workflow changes nothing in production until you publish it.
What publish does
- Validates — the same
flows.ValidateDefinitionthe API's/validateendpoint runs: structure, piece and action references against the piece catalog, required config present (withdisplayConditionsevaluated, so a field that doesn't apply is never demanded), condition operators, step references, trigger config (cron syntax, timezones, watched workflows). Refusals name the fault and the admissible set. - Snapshots the draft as an immutable version (skipped when byte-identical to the last one — republishing without changes mints nothing).
- Arms the trigger — mints the webhook URL, registers the schedule, subscribes the watcher.
Two green lights that then fail in production is the failure class this gate exists to prevent: what /validate accepts and what publish accepts are one function, so they cannot disagree.
Version history
Every version records who published it and a server-computed change summary ("Added Log it · Edited Fetch customers"). The panel states plainly which version is live and whether the canvas has unpublished changes.
- Restore copies an old version into the draft — nothing goes live until you publish again.
- Runs record which version they executed, so the run view always renders the graph that actually ran.
Unpublish
Takes the workflow offline: the webhook 404s, schedules stop. The draft and the version history are untouched.
Concurrent editing
Saves are guarded by an optimistic revision — two people (or a person and Keel) can't silently clobber each other; the loser gets an honest conflict. An advisory editing lock with a hand-over handshake keeps two builders from working the same canvas blind, and all writes to one flow serialize across the fleet.