A recipe is one file in ~/.karmax/recipes/. Save it and it runs; there is no
install step and no restart, because a tier with an install step is a tier
nobody uses.
That is a complete, working automation. It has a schedule, it calls a model, it
binds the result, it checks the result was real, and it writes to memory.
Triggers
Cron takes five fields, the syntax everyone writes. Six is also accepted if
you need seconds ("0 0 9 * * *"). Shorthands work too: @every 45m, @daily.
An expression KARMAX cannot run is rejected when the file is saved, not silently
at 9am on a morning it does not fire.
Steps
Exactly one verb per step, so the file reads top to bottom and there is never a
question about what runs first.
Only the verbs that return something can be bound with as.
Binding and using results
Conditions
Waiting for days
sleep parks the run in a durable timer rather than holding a goroutine, so
hours and days are fine and a restart does not lose it.
Headers are flat, one per line:
A nested headers: block is rejected rather than silently ignored — it is the
obvious thing to write and the wrong thing, so the error says so and shows the
flat form.
Checking your work
Errors point at a line and suggest a fix:
When to reach for a workflow instead
A recipe is a schedule and some steps. When you need real control flow, state
across runs, or tools of your own, that is a WASM workflow
— sandboxed code with a capability manifest. Most automations are not that, and
reaching for it first is how you end up maintaining a program where a file would
have done.