Skip to content
Back to news

Workflows, and a dry run that says what it would have done

A routine can now have steps, each with its own bot, tools and approval. A dry run does the real look-ups and lists every write it would have made.


A routine used to be one instruction to one bot on a schedule. In 0.11.3 it can have steps, and it can be rehearsed before it is trusted.

Steps, each with its own rules

Each step has its own instruction, and can use another bot, fewer tools or a stricter approval than the routine around it, an Only if condition or a For each. A step runs as its own run in the routine's thread, and its prompt carries what the steps before it produced.

A step a bot writes runs as that bot, asks more and never less, and uses only the routine's own tools. A step's approval setting applies to that run alone, so it never leaks into the same bot's next conversation.

If a step fails, the workflow stops and the rest are cancelled. Resume From Here runs again from that step, keeping what came before. If the app quits mid-workflow, the step that was cut off is marked failed, not re-run on restart: it may have done half of its work already, and running it again unasked could do that half twice. Resuming is one click.

The recipe

Open a routine or a trigger in the canvas and it reads top to bottom: When, Who, Does, Asks before, Posts to, If missed. Edit turns each card into its control in place, and saving sends only what you changed, so an edit made elsewhere in the meantime is not undone. History lists every run with its result, time, cost and duration.

A dry run draws the line at the approval gate

Dry Run runs the routine for real, except for anything that would change something. Each step then lists what it would have done: "Would have: Add 5 rows to Leads".

The line is drawn at the permission gate, where every engine already stops every call that can change something. A call that acts, and that the bot's policy would allow or ask about, is not made: the bot is told "Dry run: not done. Would have: …" and nobody is asked. A call the policy would refuse is refused, as in a real run. Reads are real, so look-ups, searches and table queries return what they would on the day. A second line wraps the app's own tools, for an engine that calls them without asking first.

Two consequences are worth stating. The bot's model calls are real, so a dry run's cost is real and counted. And a dry run is not the routine's last run, and one that fails does not set off a "run failed" trigger.

It was tested the way a guard should be: with both lines switched off, the table write added its row and the shell command made its file.

Runs the computer slept through

A routine that was due while the computer was asleep now follows its own choice: Ask, as before; Run Once on waking; Run All, each missed time up to five, a minute apart; or Skip.

Routines, triggers and workflows are in the app. Starting one from any webhook is on its own page.


All posts