Local vs Temporal
Ops run in one of two modes. They execute the same *.op.ts definitions and the
same activities — they differ only in what they offer on top of phase
sequencing.
chant run <name> runs local by default. Pass --temporal to run against a
Temporal cluster. There is no config to inspect and no implicit switch — one
flag selects the runtime.
Temporal-native when you want durability, zero-dependency when you don’t. The local executor is the on-ramp; the synthesis primitives need no executor at all. Reach for Temporal only when an Op must survive a crash, hold a multi-hour approval, or roll back a partial failure — never as a baseline requirement.
Capability comparison
Section titled “Capability comparison”| Local mode | Temporal mode | |
|---|---|---|
| Phase sequencing + retry | ✓ | ✓ |
onFailure compensation | ✓ | ✓ |
| Activity profiles (timeout / retry) | ✓ | ✓ |
Structured stdout, exit code, --json | ✓ | ✓ |
| Gates (human approval) | ✗ (errors) | ✓ |
| Schedules | ✗ (errors) | ✓ |
| Durable resume after a crash | ✗ | ✓ |
chant run history / status / log | ✗ | ✓ |
| Search-attribute persistence | ✗ (outcomes go to stdout) | ✓ |
The graduation story
Section titled “The graduation story”- Dev loops, CI, drift / observation Ops → local. No server, no Docker, no
cloud.
chant run helloworks in under a minute on a laptop with nothing running. Retries andonFailurerollback still apply. - Long-running deploys, gated rollouts, scheduled jobs → Temporal. When you
need a workflow to survive a process crash, pause for human approval, or run
on a schedule, configure a Temporal profile and pass
--temporal.
Start local. Move an Op to Temporal the day it needs durability — the Op definition does not change.
What local mode does on a gate or schedule
Section titled “What local mode does on a gate or schedule”If an Op contains a gate() (or a schedule) and you do not pass --temporal,
chant run fails fast — before any phase executes — naming the offending step
and pointing you at --temporal:
error: gate "approve-prod" is not supported in local mode — gates andschedules need a durable runtime. Re-run with --temporal.This is intentional: gates and schedules require cross-process persistence that
an in-process executor cannot provide. See Ops for the full
Op model and chant run for the flags.