Guides · how-to

How to replay an agent workflow at 0 LLM tokens

▸ What you'll do

A recorded agent workflow does not need a model to run again. Its value was in the tool calls it made — the API pulls, the MCP calls, the HTTP requests — and those can be re-executed directly. Level-0 replay does exactly that: it re-runs the recorded tool-call spine with no LLM in the loop, so the deterministic core of the workflow costs 0 tokens.

This guide walks the whole thing with the reelier CLI: preview what will replay, run it at Level 0, and then prove the 0 tokens by reading it off the run record instead of taking it on faith. Every command below is real and every output is verbatim from an actual run against the live npm registry.

Before you start

  • Reelier installed — npm i -g reelier (or use npx -y reelier@latest in place of reelier in every command below).
  • A SKILL.md compiled from a run that actually happened. Reelier builds replay steps only from a recorded run, never from instruction text — so if you don't have one yet, record and compile first. Reelier replays tool calls (mcp__server__tool, http.get/http.post), not Bash/Read/Edit/Write, so the value must live in the API calls.
  • No account, no API key, no model. Level 0 is the whole reason this replay costs 0 tokens — the moment you need a key is the moment you opt into escalation, which you don't here.

Preview what will replay — no execution, no model

Before replaying for real, --dry-run prints the exact steps reelier will execute and their effect classification, and touches nothing — no network call, no model, no receipt written. It is the fastest confirmation that a skill loads and a look at which steps are read versus write.

The [read] tag is the safety signal: read steps re-fire freely on every replay. Reelier will replay the recorded tool call shown here — a single http.get — and nothing else the agent may have done around it.

terminal
reelier run registry-latest.skill.md --dry-run
Reelier · output
Dry run: registry-latest (1 steps)
  Step 1 — Latest dist-tag from the registry [read]
    http.get {"url":"https://registry.npmjs.org/reelier/latest"}
verbatim output

Replay at Level 0 — the default, 0 tokens by construction

reelier run re-executes the recorded tool calls against the live systems and checks each recorded assertion. --max-level 0 is the default, so this is exactly what a bare reelier run does — passing it explicitly just documents the intent. At Level 0 the LLM client is never even constructed: there is no model in the loop to spend tokens, and what you get back is the deterministic core of the workflow, nothing re-reasoned.

Replay is read-only by default. A recorded write step does not re-fire unless you pass --allow-writes (which unlocks idempotent writes only; a destructive step additionally needs --yes). That is what makes a Level-0 replay safe to put on a schedule and run on repeat.

Why a recorded tool-call trace can re-run with no model at all is defined in the glossary; this guide stays on the commands.

terminal
reelier run registry-latest.skill.md --max-level 0
Reelier · output
✓ Step 1 — Latest dist-tag from the registry [passed] 393ms

PASSED: 1/1 steps ok, 0 failed, 393ms total
verbatim output

Prove the 0 tokens — read it off the record, don't assume it

0 tokens is a claim you can verify, not one to take on faith. reelier bench rolls up every run in .reelier/runs/<skill>.jsonl and reports the token totals straight from the receipts. Here, across two replays: LLM tokens: 0 in / 0 out, and step levels: L0=2 — every step stayed at Level 0, so no run ever reached for a model.

Note passed=2 unchecked=0. The assertions here are minimal: the compiler emits status == 200 for this skill's clean recorded result, and the hand-authored example adds a shape check on the version — so its one step carries real assertions and reports passed. A step that recorded no result would carry no assertion and replay unchecked — never a false passed.

terminal
reelier bench registry-latest.skill.md
Reelier · output
Bench: registry-latest
  runs:        2
  pass rate:   100.0% (2/2)
  first run:   393ms (2026-07-22T10:39:51.844Z)
  latest run:  144ms (2026-07-22T10:40:08.180Z)
  steps:       passed=2 unchecked=0 skipped=0 failed=0 (across all runs)
  step levels: L0=2 L1=0 L2=0 (across all runs)
  escalation:  L1 attempted=0 healed=0  L2 attempted=0 healed=0 (a step that burned tokens and still failed shows here)
  LLM tokens:  0 in / 0 out (no cost math — tokens only)
  per-step failure counts: none
verbatim output

When a step needs judgment — escalation is opt-in

Level 0 covers the deterministic core, and only the deterministic core. When a step genuinely needs a model — reconciling a response the recorded assertion can't express, a judgment call — you opt into it with --max-level 1 or --max-level 2, and only then does reelier construct an LLM client through one BYOK surface. Escalation is off unless you ask for it, and a destructive step is never auto-escalated.

That is the whole trade, and the reason there is never a universal 0-token claim: the tool-call spine replays free and deterministic at Level 0, and you spend tokens only on the exact steps that need a brain — never the whole run.

The receipt

Reelier · replay receipt
$ reelier run registry-latest.skill.md --max-level 0
✓ Step 1 — Latest dist-tag from the registry [passed] 393ms

PASSED: 1/1 steps ok, 0 failed, 393ms total

$ reelier bench registry-latest.skill.md
Bench: registry-latest
  runs:        2
  pass rate:   100.0% (2/2)
  first run:   393ms (2026-07-22T10:39:51.844Z)
  latest run:  144ms (2026-07-22T10:40:08.180Z)
  steps:       passed=2 unchecked=0 skipped=0 failed=0 (across all runs)
  step levels: L0=2 L1=0 L2=0 (across all runs)
  escalation:  L1 attempted=0 healed=0  L2 attempted=0 healed=0 (a step that burned tokens and still failed shows here)
  LLM tokens:  0 in / 0 out (no cost math — tokens only)
  per-step failure counts: none
verbatim output

Level-0 replay of the read-only registry-latest skill (from reelier/examples/portfolio), replayed against the live npm registry and rolled up with reelier bench. Produced 2026-07-22 with reelier v0.14.0 in a scratch directory. --max-level 0 is the default; the LLM client was never constructed, and LLM tokens: 0 in / 0 out is read straight from .reelier/runs/registry-latest.jsonl, not assumed.

FAQ

Does 0 tokens mean the whole agent runs free forever?

No. Level 0 is 0 tokens for the deterministic tool-call core only. A step that needs a model's judgment does not run at Level 0 — you escalate it explicitly with --max-level 1 or --max-level 2 and pay for only that step. Reelier never claims a universal 0-token run.

Is a bare `reelier run <skill>` the same as Level 0?

Yes. --max-level defaults to 0, so reelier run <skill> and reelier run <skill> --max-level 0 do the same thing: no model constructed, 0 tokens. Passing the flag explicitly only documents the intent.

My recorded run wrote data. What happens at Level 0?

Replay is read-only by default — recorded write steps do not re-fire unless you pass --allow-writes (idempotent writes only; a destructive step still needs --yes). Read-only Level-0 replay is exactly what makes a scheduled agent safe to run on repeat.

Reading as an agent? This page has a markdown twin: /guides/replay-agent-workflow-zero-tokens/md