rote: compile a skill into a deterministic pipeline
SkillAI & modelsrote is a skill that compiles a proven agent skill, meaning a SKILL.md file plus its references, into a deterministic pipeline that runs without an LLM in the loop. It then serves that pipeline back to Claude as an MCP tool. Use it when a skill has become stable and you want the same steps executed the same way every time.
Use rote: compile a skill into a deterministic pipeline in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add rote: compile a skill into a deterministic pipeline and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the rote: compile a skill into a deterministic pipeline skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; ahel provides instructions and does not run this skill.
No other account needed.
Have a proven skill ready as a SKILL.md file with any reference files it uses.
What your AI can do with it
- Compile a SKILL.md and its references into a fixed pipeline
- Run the compiled pipeline without calling an LLM
- Serve the compiled pipeline back to Claude as an MCP tool
- Turn a proven skill into a repeatable workflow
- Make a skill deterministic and cheaper to run
Getting started
- Have a proven skill ready as a SKILL.md file with any reference files it uses.
- Install rote as a skill in the environment where your agent runs.
- Ask the agent to compile the skill, for example: rote, compile this skill.
- Confirm the compiled pipeline is served back as an MCP tool.
- Run the MCP tool in place of the original skill.
What this skill tells your AI
The instructions your AI receives, as published by davila7/claude-code-templates in cli-tool/components/skills/workflow-automation/rote/SKILL.md and read by ahel’s review.
You orchestrate the rote CLI. It runs an LLM compiler agent over a source
skill once, and emits a pipeline that runs forever after without an agent
loop. Your job is to resolve the inputs, run the CLI, and interpret the
output. You never classify nodes or write pipeline.yaml yourself; the
CLI's compiler agent does that.
When this applies
Use it on a skill the user has already run many times and wants to run many more, unattended. Exploratory or one-off work should stay an agent loop: flexibility is the point there, and there is nothing proven to compile yet. Say so and stop if that is what you are looking at.
1. Identify the source skill
The source is a directory containing a SKILL.md, optionally with a
references/ folder. The user names it, or you infer it from context: a
skill just discussed, a path in the conversation, .claude/skills/* or
skills/* in the project.
Confirm the resolved absolute path with the user before running.
Compilation costs real time and tokens, so never guess and go. If the
directory has no SKILL.md, stop and ask.
2. Pick a runtime target
| Runtime | --runtime | Language | Choose when |
|---|---|---|---|
| DBOS (default) | dbos | Python | No orchestrator to deploy. SQLite for dev, Postgres for prod |
| Temporal | temporal | Python | You already operate a Temporal cluster |
| Plain Python | python | Python | Max legibility, stdlib only. Refuses pipelines with HITL gates |
| Cloudflare Workflows | cloudflare | TypeScript | Serverless, managed, wrangler deploy-ready |
| DBOS (TypeScript) | dbos-ts | TypeScript | Zero orchestrator on the TS side. Postgres only |
| Inngest | inngest | TypeScript | Mounting into an existing Node or Next.js app |
If the user has no opinion and no existing infrastructure, use dbos. It is
the default and the only Python target with zero standing infrastructure, so
you can omit --runtime entirely.
3. Resolve the CLI
The CLI ships on PyPI as rote-cli and its executable is named rote. With
uvx that means every invocation is uvx --from 'rote-cli>=0.12.1' rote <args>. Do
not run uvx rote-cli ...; uvx looks for an executable named after the
package, and the published wheel does not ship one.
uv --version # install uv first if missing
uvx --from 'rote-cli>=0.12.1' rote --version # confirm the CLI resolves
If uv is missing, do not pipe a remote script into a shell. Ask the user to
install it through their package manager (brew install uv, pipx install uv,
or pip install uv) or to follow the official guide at
https://docs.astral.sh/uv/getting-started/installation/ and choose the method
they trust.
pip install rote-cli works too if the user prefers a virtualenv.
rote compile runs an LLM agent, so it needs a driver: Claude Code
(claude) or Codex (codex) installed and authed, or ANTHROPIC_API_KEY
for the in-process api driver. The default claude driver deliberately
scrubs ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN from the child
environment so the run bills against the user's Claude subscription rather
than per-token API charges. Do not "fix" auth by exporting an API key. If
the user explicitly wants API billing, pass --agent api.
4. Run the compilation
uvx --from 'rote-cli>=0.12.1' rote compile <skill-dir> --runtime <runtime> --out <out-dir>
Pick an out-dir the user will find, such as ./compiled/<skill-name> next
to the source skill, and make sure it does not clobber existing work.
Set expectations before launching. This is not a quick command: a realistic skill takes roughly 13 minutes of wall clock and 30 to 40 agent turns on Sonnet. Run it in the background, tell the user you did, and poll rather than blocking the session.
If the run exits nonzero, check whether <out-dir>/compiled/pipeline.yaml
exists anyway. The CLI recovers completed work from transient subprocess
failures and says so in its output. Surface stderr to the user either way.
5. Report the result
Read <out-dir>/compiled/pipeline.yaml and
<out-dir>/compiled/compile-report.md, then summarize:
-
Node-kind table. Count nodes per kind and say what each means here:
Kind Meaning pure_functionDeterministic code. The LLM is gone external_callDirect API call with retry and timeout llm_judgeTyped LLM signature, kept but bounded agent_loopStill agentic, because the input is genuinely unbounded hitl_gateDurable human approval point -
Codified fraction. How many nodes no longer need an LLM, which nodes are mandatory, and what each HITL gate blocks on.
-
Where things landed.
<out-dir>/compiled/holds the IR,extracted/,signatures/, and the report.<out-dir>/runtime/<runtime>/holds the deployable code. -
Next steps. The
extracted/*modules are scaffolds that raiseNotImplementedError. The user fills in real client code, then deploys the runtime output.
Be honest in this summary. A pipeline that came out mostly agent_loop means
the skill was not as deterministic as it looked, and the user should know
that rather than hear a success story.
6. Serve compiled pipelines back to Claude
rote serve is one MCP server exposing every registered pipeline as a
callable tool. It triggers deployed workflows; it does not host them. The
full flow:
rote compile -> deploy the runtime -> rote register -> rote serve -> call from Claude
Register the pipeline once the runtime side is actually running (a DBOS app in worker mode, a Temporal worker, or a deployed Cloudflare Worker):
uvx --from 'rote-cli>=0.12.1' rote register <out-dir>
uvx --from 'rote-cli>=0.12.1' rote register <out-dir> --runtime temporal
uvx --from 'rote-cli>=0.12.1' rote register <out-dir> --runtime cloudflare --url https://<worker>.workers.dev
This upserts ~/.rote/registry.json. Re-registering updates in place. After
recompiling a changed skill, register again: DBOS and Temporal workflow
names derive from the pipeline content hash and must stay in sync with the
emitted code.
Then add the server:
claude mcp add --scope user rote -- uvx --from 'rote-cli[serve,dbos]>=0.12.1' rote serve
Each registry entry becomes two tools, or three on DBOS: <name> starts a
run and returns {workflow_id, status: "started"} immediately, since
compiled pipelines run for minutes to days; <name>_status polls a run by
workflow_id; and on DBOS <name>_signal resumes a run parked at a HITL
gate, so Claude can deliver approvals itself.
Two caveats worth stating proactively. A DBOS run stuck in enqueued means
the emitted app process is not running against the registered system
database. And while Claude Code picks up newly registered pipelines
immediately via the server's list_changed notification, Claude Desktop and
claude.ai snapshot tools at connect time, so a pipeline registered mid-session
appears there only after a reconnect.
Reference
- Repository and docs: https://github.com/trevhud/rote (Apache-2.0)
- Package: https://pypi.org/project/rote-cli/
Signals
- GitHub stars
- 32k
- Forks
- 4k
- Last commit
- Oct 2026
ahel review
K1binfo
installs-packages
Automated review, not a security audit. Ruleset v1+k2.
Questions
- What does rote do?
- It compiles a proven agent skill, a SKILL.md plus references, into a deterministic pipeline that runs without an LLM in the loop, then serves it back to Claude as an MCP tool.
- When should I use rote?
- Use it when a skill is proven and you want it to run the same way every time, or when you want the skill to be deterministic and cheaper to run.
- What input does rote need?
- A proven agent skill: a SKILL.md file plus any references it uses.
- Does the compiled pipeline call an AI model?
- No. The compiled pipeline runs without an LLM in the loop.
- How is the compiled pipeline used afterward?
- It is served back to Claude as an MCP tool.
Advanced
- Item type
- skill
- Key
rote- Source
- github.com/davila7/claude-code-templates
github.com/davila7/claude-code-templates
More in AI & models
Skill · anthropics
More in AI & modelswayfinder
Skill · mattpocock
More in AI & modelswizard
Skill · mattpocock
More in AI & modelsalgorithmic-art
Skill · anthropics
More in AI & modelscode-review-and-quality
Skill · addyosmani
More in AI & modelsai-first-engineering
Skill · affaan-m
More in AI & models