rote-cli 0.10.0__tar.gz → 0.11.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. {rote_cli-0.10.0 → rote_cli-0.11.0}/.gitignore +2 -2
  2. {rote_cli-0.10.0 → rote_cli-0.11.0}/PKG-INFO +50 -50
  3. {rote_cli-0.10.0 → rote_cli-0.11.0}/README.md +47 -47
  4. {rote_cli-0.10.0 → rote_cli-0.11.0}/pyproject.toml +13 -8
  5. {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/SKILL.md +16 -16
  6. {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/crystallization-heuristics.md +10 -10
  7. {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/eval-estimates.md +4 -4
  8. {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/implementation.md +2 -2
  9. {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/ir-schema.md +14 -10
  10. {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/llm-judge-extraction.md +12 -8
  11. {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/node-kinds.md +27 -4
  12. rote_cli-0.11.0/src/rote/__init__.py +3 -0
  13. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/__init__.py +21 -5
  14. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/_common.py +2 -2
  15. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/_py_common.py +70 -3
  16. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/cloudflare.py +3 -3
  17. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/dbos.py +49 -3
  18. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/dbos_ts.py +4 -4
  19. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/inngest.py +3 -3
  20. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/python.py +10 -3
  21. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/temporal.py +4 -4
  22. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/app_registry.py +1 -1
  23. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/cli.py +321 -260
  24. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/cloud_auth.py +1 -1
  25. rote_cli-0.10.0/src/rote/cloud_graduate.py → rote_cli-0.11.0/src/rote/cloud_compile.py +106 -96
  26. {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/__init__.py +85 -85
  27. {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/__init__.py +29 -29
  28. {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/_fs_tools.py +15 -15
  29. {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/anthropic_api.py +25 -25
  30. {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/claude.py +32 -32
  31. {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/codex.py +25 -25
  32. {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/openai_api.py +20 -20
  33. {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/events.py +14 -14
  34. {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/update.py +7 -7
  35. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/config.py +7 -7
  36. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/deploy_rote_cloud.py +2 -2
  37. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/__init__.py +2 -2
  38. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/baseline.py +9 -9
  39. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/empirical.py +6 -6
  40. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/estimate.py +6 -6
  41. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/priors.py +5 -5
  42. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/scorecard.py +3 -3
  43. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/sidecar.py +5 -5
  44. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/init_wizard.py +13 -13
  45. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/ir.py +11 -11
  46. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/_runtime_helper.py +34 -2
  47. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/registry.py +1 -1
  48. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/probe.py +42 -2
  49. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/__init__.py +9 -9
  50. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/serve/__init__.py +3 -3
  51. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/serve/backends.py +3 -3
  52. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/serve/registry.py +9 -9
  53. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/serve/server.py +4 -4
  54. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/skill_source.py +5 -5
  55. rote_cli-0.10.0/src/rote/__init__.py +0 -3
  56. {rote_cli-0.10.0 → rote_cli-0.11.0}/LICENSE +0 -0
  57. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/__main__.py +0 -0
  58. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/_dbos.py +0 -0
  59. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/_ts_common.py +0 -0
  60. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/deploy.py +0 -0
  61. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/pricing.py +0 -0
  62. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/tokens.py +0 -0
  63. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/__init__.py +0 -0
  64. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/auth.py +0 -0
  65. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/release.py +0 -0
  66. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/tokens.py +0 -0
  67. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/_node.py +0 -0
  68. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/cloudflare.py +0 -0
  69. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/dbos_ts.py +0 -0
  70. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/inngest.py +0 -0
  71. {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/temporal.py +0 -0
@@ -84,11 +84,11 @@ pip-log.txt
84
84
  pip-delete-this-directory.txt
85
85
 
86
86
  # ── rote-specific artifacts ──
87
- # The graduator writes scratch work dirs via tempfile.TemporaryDirectory
87
+ # The compiler writes scratch work dirs via tempfile.TemporaryDirectory
88
88
  # (they land in /tmp by default so they don't affect the repo), but in
89
89
  # case a user points --out or a test fixture at the repo root, ignore
90
90
  # the standard output dir name here too.
91
- /graduated/
91
+ /compiled/
92
92
  /runtimes/generated/
93
93
  /examples/**/generated/
94
94
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rote-cli
3
- Version: 0.10.0
4
- Summary: Graduate fuzzy AI skills into deterministic, reliable workflows
3
+ Version: 0.11.0
4
+ Summary: Compile fuzzy AI skills into deterministic, reliable workflows
5
5
  Project-URL: Homepage, https://github.com/trevhud/rote
6
6
  Project-URL: Repository, https://github.com/trevhud/rote
7
7
  Project-URL: Issues, https://github.com/trevhud/rote/issues
@@ -9,7 +9,7 @@ Project-URL: Documentation, https://github.com/trevhud/rote#readme
9
9
  Author: Trevor Hudson
10
10
  License-Expression: Apache-2.0
11
11
  License-File: LICENSE
12
- Keywords: agent,ai,anthropic,claude,cloudflare,dspy,graduation,llm,skill,temporal,workflow
12
+ Keywords: agent,agent-skills,ai,anthropic,claude,cloudflare,compilation,compiler,deterministic,dspy,durable-execution,llm,mcp,skill,temporal,workflow
13
13
  Classifier: Development Status :: 3 - Alpha
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: Operating System :: OS Independent
@@ -52,7 +52,7 @@ Description-Content-Type: text/markdown
52
52
 
53
53
  # rote
54
54
 
55
- **Graduate fuzzy AI skills into deterministic, reliable workflows.**
55
+ **Compile fuzzy AI skills into deterministic, reliable workflows.**
56
56
 
57
57
  [![CI](https://github.com/trevhud/rote/actions/workflows/ci.yml/badge.svg)](https://github.com/trevhud/rote/actions/workflows/ci.yml)
58
58
  [![PyPI](https://img.shields.io/pypi/v/rote-cli.svg)](https://pypi.org/project/rote-cli/)
@@ -62,7 +62,7 @@ Description-Content-Type: text/markdown
62
62
  `rote` is a CLI that takes an Anthropic-style Skill (a `SKILL.md` plus
63
63
  `references/`) and turns it into a runnable background pipeline in one
64
64
  shot. An LLM agent (itself defined as a skill) reads the source skill,
65
- applies a structured graduation rubric, and emits a runtime-agnostic
65
+ applies a structured compilation rubric, and emits a runtime-agnostic
66
66
  intermediate representation (`pipeline.yaml`), extracted Python modules
67
67
  for the deterministic parts, typed signature stubs for the LLM-judge
68
68
  parts, and runnable code for the durable execution engine of your
@@ -71,22 +71,22 @@ choice.
71
71
  ```sh
72
72
  pip install rote-cli # or zero-install: uvx --from rote-cli rote ...
73
73
 
74
- # `rote graduate` runs an LLM agent, so it needs a driver: Claude Code
74
+ # `rote compile` runs an LLM agent, so it needs a driver: Claude Code
75
75
  # (`claude`) or Codex (`codex`) installed and authed, or ANTHROPIC_API_KEY
76
76
  # for the in-process `api` driver. The BDR run below takes ~13 min and
77
77
  # ~$0.70 with Sonnet. (`rote emit` needs no LLM — see below.)
78
78
 
79
79
  # Default target is DBOS — durable execution as a plain Python library,
80
80
  # no orchestrator to run, SQLite for dev / Postgres for prod:
81
- rote graduate ./examples/bdr-outreach/skill --out ./graduated/
81
+ rote compile ./examples/bdr-outreach/skill --out ./compiled/
82
82
 
83
83
  # Or pick another runtime (see the table below):
84
- rote graduate ./examples/bdr-outreach/skill --runtime temporal --out ./graduated/
85
- rote graduate ./examples/bdr-outreach/skill --runtime cloudflare --out ./graduated/
84
+ rote compile ./examples/bdr-outreach/skill --runtime temporal --out ./compiled/
85
+ rote compile ./examples/bdr-outreach/skill --runtime cloudflare --out ./compiled/
86
86
  ```
87
87
 
88
88
  The name comes from *rote learning* — doing something so many times, so
89
- reliably, that it becomes mechanical. That's what graduation does to a
89
+ reliably, that it becomes mechanical. That's what compilation does to a
90
90
  skill: a fuzzy 10–20 minute agent loop becomes a deterministic pipeline
91
91
  that runs in the background, costs a fraction of the tokens, and can be
92
92
  regression-tested.
@@ -107,7 +107,7 @@ from the deterministic procedures wearing fuzzy clothing. Move the
107
107
  deterministic parts into code, keep the LLM only where the input is
108
108
  genuinely unbounded (parsing, classifying, drafting), and wrap the whole
109
109
  thing in a durable execution engine with explicit human-in-the-loop
110
- gates. That graduation step is what `rote` automates.
110
+ gates. That compilation step is what `rote` automates.
111
111
 
112
112
  There's third-party data for what this buys. ["Compiled AI: Deterministic
113
113
  Code Generation for LLM-Based Workflow Automation"](https://arxiv.org/abs/2604.05150)
@@ -139,10 +139,10 @@ a small interface.
139
139
 
140
140
  ```
141
141
  SKILL.md + references/ Source skill bundle (untouched)
142
- │ rote graduate
142
+ │ rote compile
143
143
  ▼
144
- graduator agent An LLM agent (Claude / Codex /
145
- (pluggable driver) Anthropic SDK) runs the rote-graduate
144
+ compiler agent An LLM agent (Claude / Codex /
145
+ (pluggable driver) Anthropic SDK) runs the rote-compile
146
146
  │ skill against the source bundle.
147
147
  │ filesystem contract: work_dir/pipeline.yaml
148
148
  ▼ + extracted/ + signatures/
@@ -154,7 +154,7 @@ a small interface.
154
154
  execution engine.
155
155
  ```
156
156
 
157
- 1. **The graduator agent** (`skills/rote-graduate/`) — a regular
157
+ 1. **The compiler agent** (`skills/rote-compile/`) — a regular
158
158
  Anthropic Skill (`SKILL.md` + four reference files). This is the
159
159
  *brain*; it runs inside any Skills-compatible surface, and you don't
160
160
  need `rote` to use it.
@@ -164,7 +164,7 @@ a small interface.
164
164
  3. **Runtime adapters** (`src/rote/adapters/`) — pluggable modules that
165
165
  consume an IR and emit runnable code for one engine.
166
166
 
167
- The graduator's job ends when it has produced a valid `pipeline.yaml`.
167
+ The compiler's job ends when it has produced a valid `pipeline.yaml`.
168
168
  Code emission is *deterministic Python* — never agent-driven — so the
169
169
  same IR always produces byte-identical output.
170
170
 
@@ -174,7 +174,7 @@ same IR always produces byte-identical output.
174
174
 
175
175
  ### From Claude Code (recommended)
176
176
 
177
- `rote` ships as a Claude Code plugin, so you can graduate a skill without
177
+ `rote` ships as a Claude Code plugin, so you can compile a skill without
178
178
  touching Python tooling:
179
179
 
180
180
  ```
@@ -182,17 +182,17 @@ touching Python tooling:
182
182
  /plugin install rote@rote
183
183
  ```
184
184
 
185
- Then say "graduate this skill" (or run `/rote:graduate`). It confirms the
185
+ Then say "compile this skill" (or run `/rote:compile`). It confirms the
186
186
  source directory, asks which runtime you want, runs the CLI via
187
187
  [uv](https://docs.astral.sh/uv/) in the background, and reports the
188
- emitted pipeline. A second skill, `/rote:serve`, wires graduated
188
+ emitted pipeline. A second skill, `/rote:serve`, wires compiled
189
189
  pipelines up as MCP tools so Claude can trigger the deployed workflows
190
190
  (see [docs/mcp-trigger.md](docs/mcp-trigger.md)).
191
191
 
192
192
  Prefer a terminal? The same thing is one `uvx` command:
193
193
 
194
194
  ```sh
195
- uvx --from rote-cli rote graduate ./my-skill --runtime dbos --out ./graduated
195
+ uvx --from rote-cli rote compile ./my-skill --runtime dbos --out ./compiled
196
196
  ```
197
197
 
198
198
  > **Naming note:** the `rote` package on PyPI is an unrelated
@@ -208,10 +208,10 @@ vetting, CRM upload, mandatory exclusion checks, email personalization,
208
208
  manual enrollment handoff) in `examples/bdr-outreach/skill/`:
209
209
 
210
210
  ```sh
211
- rote graduate examples/bdr-outreach/skill --out /tmp/bdr-graduated
211
+ rote compile examples/bdr-outreach/skill --out /tmp/bdr-compiled
212
212
  ```
213
213
 
214
- On that skill the graduator produces a 22-node IR that's **78.9%
214
+ On that skill the compiler produces a 22-node IR that's **78.9%
215
215
  codifiable** (15 of 19 non-gate nodes), extracts 5 Python modules and 2
216
216
  typed judge signatures, and flags 4 mandatory nodes and 3 HITL gates —
217
217
  in ~13 minutes for ~$0.70 (Sonnet via Claude Code). Along the way it
@@ -220,9 +220,9 @@ pulls four batch-size constants out of prompt text, and models a
220
220
  parallel entry path the hand-written baseline missed.
221
221
 
222
222
  `rote` auto-detects a driver in the order `claude` → `codex` → `api`;
223
- override with `--agent`. The output directory splits into `graduated/`
223
+ override with `--agent`. The output directory splits into `compiled/`
224
224
  (the agent's `pipeline.yaml`, `extracted/`, `signatures/`, eval seeds,
225
- and a `graduation-report.md`) and `runtime/<runtime>/` (the adapter's
225
+ and a `compile-report.md`) and `runtime/<runtime>/` (the adapter's
226
226
  emitted code + a README on how to run, signal gates, and deploy).
227
227
 
228
228
  ### Other commands
@@ -232,7 +232,7 @@ emitted code + a README on how to run, signal gates, and deploy).
232
232
  adapters or IR shapes. Re-emitting is safe: a `.rote-manifest.json`
233
233
  tracks what `rote` wrote, and files you've edited are left untouched
234
234
  (the fresh version lands as `<name>.new`).
235
- - **`rote graduate --update`** — re-graduate incrementally when the skill
235
+ - **`rote compile --update`** — re-compile incrementally when the skill
236
236
  changes. `rote` diffs the skill against the previous run's
237
237
  `provenance.json` and re-derives only the nodes whose source sections
238
238
  changed; unchanged nodes keep their ids (so in-flight durable workflows
@@ -240,7 +240,7 @@ emitted code + a README on how to run, signal gates, and deploy).
240
240
  - **`rote run <path>`** — one-off local execution of either side. A
241
241
  skill directory runs as an agent via `claude -p` (your registered MCP
242
242
  servers injected, read-only tool gate unless `--allow-writes`); an
243
- emitted runtime directory — or a `graduate --out` directory — runs
243
+ emitted runtime directory — or a `compile --out` directory — runs
244
244
  the pipeline itself — all six runtimes (`python`/`dbos`/`temporal`
245
245
  in-process or on a managed local dev server, `cloudflare` under
246
246
  `wrangler dev`, `inngest` against a managed `inngest-cli dev`,
@@ -266,12 +266,12 @@ emitted code + a README on how to run, signal gates, and deploy).
266
266
  (over SSH, `--device` prints the code + URL instead), you click
267
267
  Approve, and the CLI stores a tenant API key at
268
268
  `~/.local/share/rote/cloud.json` (mode 0600). Once logged in,
269
- `rote graduate` runs **on rote cloud by default**: the skill bundle
269
+ `rote compile` runs **on rote cloud by default**: the skill bundle
270
270
  syncs up (sha-diffed, so unchanged files don't re-upload), the
271
- platform runs the graduation server-side, live progress streams back
271
+ platform runs the compilation server-side, live progress streams back
272
272
  through the same renderer as a local run, the result auto-deploys,
273
273
  and the artifacts download into your `--out` directory in the exact
274
- local layout. `--local` keeps the graduation on your machine (then
274
+ local layout. `--local` keeps the compilation on your machine (then
275
275
  the cloudflare-emit + auto-deploy flow applies), `--no-deploy` or a
276
276
  config opt-out (`runtime:` pinned to a local target, or
277
277
  `deploy: none`) keeps everything local; `--cloud` forces the server
@@ -279,8 +279,8 @@ emitted code + a README on how to run, signal gates, and deploy).
279
279
  locally exactly as before. `rote whoami` shows the account (verified
280
280
  live); `rote logout` revokes the key server-side and clears the store.
281
281
  - **`rote init`** — one-time interactive onboarding: pick where
282
- graduated pipelines run (rote cloud — with login offered inline — or
283
- a local runtime, with a one-line pitch for each), which graduator
282
+ compiled pipelines run (rote cloud — with login offered inline — or
283
+ a local runtime, with a one-line pitch for each), which compiler
284
284
  driver does the work (availability probed live), and optionally a
285
285
  model. Answers are saved to `~/.config/rote/config.yaml`
286
286
  (`--project` writes a `./rote.yaml` that overrides it per-repo) and
@@ -292,10 +292,10 @@ emitted code + a README on how to run, signal gates, and deploy).
292
292
  ROTE_MODEL) > project rote.yaml > user config > built-in`. Config
293
293
  files are strict: a typo'd key or value is a loud error, never a
294
294
  silent fallback. `--json` for automation.
295
- - **`rote eval <graduated>`** — render the before/after scorecard (wall
295
+ - **`rote eval <compiled>`** — render the before/after scorecard (wall
296
296
  clock, cost across the current model lineup at live prices, and how
297
- much of the run is still LLM-decided). `rote graduate` writes this to
298
- `graduated/scorecard.md` automatically. Add `--run` to *measure*
297
+ much of the run is still LLM-decided). `rote compile` writes this to
298
+ `compiled/scorecard.md` automatically. Add `--run` to *measure*
299
299
  instead of estimate: it executes both sides for real and appends
300
300
  measured cost, turns, and output agreement across trials.
301
301
  - **Per-node inference** — emitted judges read `ROTE_MODEL_<ID>` and
@@ -307,9 +307,9 @@ emitted code + a README on how to run, signal gates, and deploy).
307
307
 
308
308
  ## The five node kinds
309
309
 
310
- Every step in a graduated pipeline is exactly one of five kinds. Full
310
+ Every step in a compiled pipeline is exactly one of five kinds. Full
311
311
  guidance:
312
- [`references/node-kinds.md`](skills/rote-graduate/references/node-kinds.md).
312
+ [`references/node-kinds.md`](skills/rote-compile/references/node-kinds.md).
313
313
 
314
314
  | Kind | What it is | Where the LLM lives |
315
315
  | --- | --- | --- |
@@ -347,7 +347,7 @@ see [`docs/mcp-client.md`](docs/mcp-client.md).
347
347
 
348
348
  ## Drivers
349
349
 
350
- `rote` ships three interchangeable graduator drivers — pick whichever
350
+ `rote` ships three interchangeable compiler drivers — pick whichever
351
351
  matches your auth. The same `pipeline.yaml` comes out either way.
352
352
 
353
353
  | Driver | Backend | Auth | Install |
@@ -413,11 +413,11 @@ Trusted Publishing ([docs/releasing.md](docs/releasing.md)).
413
413
  ```
414
414
  rote/
415
415
  ├── docs/ agent-runtime · mcp-client · mcp-trigger · releasing
416
- ├── skills/rote-graduate/ the graduator agent (SKILL.md + 4 reference files)
416
+ ├── skills/rote-compile/ the compiler agent (SKILL.md + 4 reference files)
417
417
  ├── src/rote/
418
- │ ├── cli.py rote graduate / emit / eval / serve
418
+ │ ├── cli.py rote compile / emit / eval / serve
419
419
  │ ├── ir.py Pydantic IR models + load_pipeline
420
- │ ├── graduator/ orchestrator + drivers/ (claude · codex · anthropic_api)
420
+ │ ├── compiler/ orchestrator + drivers/ (claude · codex · anthropic_api)
421
421
  │ └── adapters/ dbos · temporal · python · cloudflare · dbos_ts · inngest
422
422
  │ (+ _common / _py_common / _ts_common emit helpers)
423
423
  ├── examples/
@@ -433,7 +433,7 @@ rote/
433
433
 
434
434
  - [`AGENTS.md`](AGENTS.md) — operating manual for a coding agent *driving*
435
435
  `rote` as an installed tool (invocation contract, the slow/costs-money
436
- `graduate` flow, auth, failure recovery, the stub-filling job, `--json`)
436
+ `compile` flow, auth, failure recovery, the stub-filling job, `--json`)
437
437
  - [`docs/agent-runtime.md`](docs/agent-runtime.md) — design record for the
438
438
  driver abstraction (the `claude -p` env gotcha; the non-use of
439
439
  `claude-agent-sdk`)
@@ -441,17 +441,17 @@ rote/
441
441
  emitted code uses under `--backend mcp`: endpoint/credential
442
442
  resolution and durable park-on-auth across every MCP-capable runtime
443
443
  - [`docs/mcp-trigger.md`](docs/mcp-trigger.md) — `rote register` +
444
- `rote serve`: graduated pipelines as MCP tools (FastMCP 3.x)
444
+ `rote serve`: compiled pipelines as MCP tools (FastMCP 3.x)
445
445
  - [`docs/releasing.md`](docs/releasing.md) — tag-driven PyPI Trusted
446
446
  Publishing
447
- - [`skills/rote-graduate/`](skills/rote-graduate/) — the graduator's
447
+ - [`skills/rote-compile/`](skills/rote-compile/) — the compiler's
448
448
  `SKILL.md` and its four rubric files (node kinds, crystallization
449
449
  heuristics, IR schema, LLM-judge extraction)
450
450
  - [`examples/bdr-outreach/`](examples/bdr-outreach/) — the canonical
451
- skill, its ground-truth IR, and snapshotted real graduator runs
451
+ skill, its ground-truth IR, and snapshotted real compiler runs
452
452
  - [`examples/ops-report/`](examples/ops-report/) — the 100%-roteness
453
453
  archetype: every step deterministic, one durable HITL gate, zero LLM
454
- nodes after graduation
454
+ nodes after compilation
455
455
  - [`examples/deal-monitor/`](examples/deal-monitor/) — the data-heavy
456
456
  archetype: parallel entry waves, fan-out judges, and a template render
457
457
  replacing per-run LLM-generated HTML
@@ -462,7 +462,7 @@ rote/
462
462
 
463
463
  In rough priority order:
464
464
 
465
- 1. **Re-graduate BDR end-to-end with `signature_spec`** — the bundled IR
465
+ 1. **Re-compile BDR end-to-end with `signature_spec`** — the bundled IR
466
466
  was hand-extended with structured schemas; the rubric now teaches the
467
467
  field, but no real run has produced one yet.
468
468
  2. **Pre-filter as a `pure_function` node** — today hard thresholds are
@@ -472,18 +472,18 @@ In rough priority order:
472
472
  retrieval-heavy, and code-review skills stress the IR differently.
473
473
  4. **`fan_out` per-element dispatch** — currently the whole upstream list
474
474
  arrives in one invocation.
475
- 5. **The graduator graduating itself** — `rote-graduate` is a SKILL.md;
476
- pointing `rote graduate` at it should crystallize its rubric-grade
475
+ 5. **The compiler compiling itself** — `rote-compile` is a SKILL.md;
476
+ pointing `rote compile` at it should crystallize its rubric-grade
477
477
  pieces and leave only the genuinely fuzzy judgments in the loop.
478
478
 
479
479
  ---
480
480
 
481
481
  ## Contributing
482
482
 
483
- The most useful contribution right now is to **run `rote graduate` on a
483
+ The most useful contribution right now is to **run `rote compile` on a
484
484
  real skill of your own and report what happens** — the rubric was
485
485
  designed against one skill and needs more. Adding a runtime adapter or a
486
- graduator driver, or improving the rubric, are all good next steps. See
486
+ compiler driver, or improving the rubric, are all good next steps. See
487
487
  [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup, the test layout, and
488
488
  the adapter/driver how-tos.
489
489
 
@@ -1,6 +1,6 @@
1
1
  # rote
2
2
 
3
- **Graduate fuzzy AI skills into deterministic, reliable workflows.**
3
+ **Compile fuzzy AI skills into deterministic, reliable workflows.**
4
4
 
5
5
  [![CI](https://github.com/trevhud/rote/actions/workflows/ci.yml/badge.svg)](https://github.com/trevhud/rote/actions/workflows/ci.yml)
6
6
  [![PyPI](https://img.shields.io/pypi/v/rote-cli.svg)](https://pypi.org/project/rote-cli/)
@@ -10,7 +10,7 @@
10
10
  `rote` is a CLI that takes an Anthropic-style Skill (a `SKILL.md` plus
11
11
  `references/`) and turns it into a runnable background pipeline in one
12
12
  shot. An LLM agent (itself defined as a skill) reads the source skill,
13
- applies a structured graduation rubric, and emits a runtime-agnostic
13
+ applies a structured compilation rubric, and emits a runtime-agnostic
14
14
  intermediate representation (`pipeline.yaml`), extracted Python modules
15
15
  for the deterministic parts, typed signature stubs for the LLM-judge
16
16
  parts, and runnable code for the durable execution engine of your
@@ -19,22 +19,22 @@ choice.
19
19
  ```sh
20
20
  pip install rote-cli # or zero-install: uvx --from rote-cli rote ...
21
21
 
22
- # `rote graduate` runs an LLM agent, so it needs a driver: Claude Code
22
+ # `rote compile` runs an LLM agent, so it needs a driver: Claude Code
23
23
  # (`claude`) or Codex (`codex`) installed and authed, or ANTHROPIC_API_KEY
24
24
  # for the in-process `api` driver. The BDR run below takes ~13 min and
25
25
  # ~$0.70 with Sonnet. (`rote emit` needs no LLM — see below.)
26
26
 
27
27
  # Default target is DBOS — durable execution as a plain Python library,
28
28
  # no orchestrator to run, SQLite for dev / Postgres for prod:
29
- rote graduate ./examples/bdr-outreach/skill --out ./graduated/
29
+ rote compile ./examples/bdr-outreach/skill --out ./compiled/
30
30
 
31
31
  # Or pick another runtime (see the table below):
32
- rote graduate ./examples/bdr-outreach/skill --runtime temporal --out ./graduated/
33
- rote graduate ./examples/bdr-outreach/skill --runtime cloudflare --out ./graduated/
32
+ rote compile ./examples/bdr-outreach/skill --runtime temporal --out ./compiled/
33
+ rote compile ./examples/bdr-outreach/skill --runtime cloudflare --out ./compiled/
34
34
  ```
35
35
 
36
36
  The name comes from *rote learning* — doing something so many times, so
37
- reliably, that it becomes mechanical. That's what graduation does to a
37
+ reliably, that it becomes mechanical. That's what compilation does to a
38
38
  skill: a fuzzy 10–20 minute agent loop becomes a deterministic pipeline
39
39
  that runs in the background, costs a fraction of the tokens, and can be
40
40
  regression-tested.
@@ -55,7 +55,7 @@ from the deterministic procedures wearing fuzzy clothing. Move the
55
55
  deterministic parts into code, keep the LLM only where the input is
56
56
  genuinely unbounded (parsing, classifying, drafting), and wrap the whole
57
57
  thing in a durable execution engine with explicit human-in-the-loop
58
- gates. That graduation step is what `rote` automates.
58
+ gates. That compilation step is what `rote` automates.
59
59
 
60
60
  There's third-party data for what this buys. ["Compiled AI: Deterministic
61
61
  Code Generation for LLM-Based Workflow Automation"](https://arxiv.org/abs/2604.05150)
@@ -87,10 +87,10 @@ a small interface.
87
87
 
88
88
  ```
89
89
  SKILL.md + references/ Source skill bundle (untouched)
90
- │ rote graduate
90
+ │ rote compile
91
91
  ▼
92
- graduator agent An LLM agent (Claude / Codex /
93
- (pluggable driver) Anthropic SDK) runs the rote-graduate
92
+ compiler agent An LLM agent (Claude / Codex /
93
+ (pluggable driver) Anthropic SDK) runs the rote-compile
94
94
  │ skill against the source bundle.
95
95
  │ filesystem contract: work_dir/pipeline.yaml
96
96
  ▼ + extracted/ + signatures/
@@ -102,7 +102,7 @@ a small interface.
102
102
  execution engine.
103
103
  ```
104
104
 
105
- 1. **The graduator agent** (`skills/rote-graduate/`) — a regular
105
+ 1. **The compiler agent** (`skills/rote-compile/`) — a regular
106
106
  Anthropic Skill (`SKILL.md` + four reference files). This is the
107
107
  *brain*; it runs inside any Skills-compatible surface, and you don't
108
108
  need `rote` to use it.
@@ -112,7 +112,7 @@ a small interface.
112
112
  3. **Runtime adapters** (`src/rote/adapters/`) — pluggable modules that
113
113
  consume an IR and emit runnable code for one engine.
114
114
 
115
- The graduator's job ends when it has produced a valid `pipeline.yaml`.
115
+ The compiler's job ends when it has produced a valid `pipeline.yaml`.
116
116
  Code emission is *deterministic Python* — never agent-driven — so the
117
117
  same IR always produces byte-identical output.
118
118
 
@@ -122,7 +122,7 @@ same IR always produces byte-identical output.
122
122
 
123
123
  ### From Claude Code (recommended)
124
124
 
125
- `rote` ships as a Claude Code plugin, so you can graduate a skill without
125
+ `rote` ships as a Claude Code plugin, so you can compile a skill without
126
126
  touching Python tooling:
127
127
 
128
128
  ```
@@ -130,17 +130,17 @@ touching Python tooling:
130
130
  /plugin install rote@rote
131
131
  ```
132
132
 
133
- Then say "graduate this skill" (or run `/rote:graduate`). It confirms the
133
+ Then say "compile this skill" (or run `/rote:compile`). It confirms the
134
134
  source directory, asks which runtime you want, runs the CLI via
135
135
  [uv](https://docs.astral.sh/uv/) in the background, and reports the
136
- emitted pipeline. A second skill, `/rote:serve`, wires graduated
136
+ emitted pipeline. A second skill, `/rote:serve`, wires compiled
137
137
  pipelines up as MCP tools so Claude can trigger the deployed workflows
138
138
  (see [docs/mcp-trigger.md](docs/mcp-trigger.md)).
139
139
 
140
140
  Prefer a terminal? The same thing is one `uvx` command:
141
141
 
142
142
  ```sh
143
- uvx --from rote-cli rote graduate ./my-skill --runtime dbos --out ./graduated
143
+ uvx --from rote-cli rote compile ./my-skill --runtime dbos --out ./compiled
144
144
  ```
145
145
 
146
146
  > **Naming note:** the `rote` package on PyPI is an unrelated
@@ -156,10 +156,10 @@ vetting, CRM upload, mandatory exclusion checks, email personalization,
156
156
  manual enrollment handoff) in `examples/bdr-outreach/skill/`:
157
157
 
158
158
  ```sh
159
- rote graduate examples/bdr-outreach/skill --out /tmp/bdr-graduated
159
+ rote compile examples/bdr-outreach/skill --out /tmp/bdr-compiled
160
160
  ```
161
161
 
162
- On that skill the graduator produces a 22-node IR that's **78.9%
162
+ On that skill the compiler produces a 22-node IR that's **78.9%
163
163
  codifiable** (15 of 19 non-gate nodes), extracts 5 Python modules and 2
164
164
  typed judge signatures, and flags 4 mandatory nodes and 3 HITL gates —
165
165
  in ~13 minutes for ~$0.70 (Sonnet via Claude Code). Along the way it
@@ -168,9 +168,9 @@ pulls four batch-size constants out of prompt text, and models a
168
168
  parallel entry path the hand-written baseline missed.
169
169
 
170
170
  `rote` auto-detects a driver in the order `claude` → `codex` → `api`;
171
- override with `--agent`. The output directory splits into `graduated/`
171
+ override with `--agent`. The output directory splits into `compiled/`
172
172
  (the agent's `pipeline.yaml`, `extracted/`, `signatures/`, eval seeds,
173
- and a `graduation-report.md`) and `runtime/<runtime>/` (the adapter's
173
+ and a `compile-report.md`) and `runtime/<runtime>/` (the adapter's
174
174
  emitted code + a README on how to run, signal gates, and deploy).
175
175
 
176
176
  ### Other commands
@@ -180,7 +180,7 @@ emitted code + a README on how to run, signal gates, and deploy).
180
180
  adapters or IR shapes. Re-emitting is safe: a `.rote-manifest.json`
181
181
  tracks what `rote` wrote, and files you've edited are left untouched
182
182
  (the fresh version lands as `<name>.new`).
183
- - **`rote graduate --update`** — re-graduate incrementally when the skill
183
+ - **`rote compile --update`** — re-compile incrementally when the skill
184
184
  changes. `rote` diffs the skill against the previous run's
185
185
  `provenance.json` and re-derives only the nodes whose source sections
186
186
  changed; unchanged nodes keep their ids (so in-flight durable workflows
@@ -188,7 +188,7 @@ emitted code + a README on how to run, signal gates, and deploy).
188
188
  - **`rote run <path>`** — one-off local execution of either side. A
189
189
  skill directory runs as an agent via `claude -p` (your registered MCP
190
190
  servers injected, read-only tool gate unless `--allow-writes`); an
191
- emitted runtime directory — or a `graduate --out` directory — runs
191
+ emitted runtime directory — or a `compile --out` directory — runs
192
192
  the pipeline itself — all six runtimes (`python`/`dbos`/`temporal`
193
193
  in-process or on a managed local dev server, `cloudflare` under
194
194
  `wrangler dev`, `inngest` against a managed `inngest-cli dev`,
@@ -214,12 +214,12 @@ emitted code + a README on how to run, signal gates, and deploy).
214
214
  (over SSH, `--device` prints the code + URL instead), you click
215
215
  Approve, and the CLI stores a tenant API key at
216
216
  `~/.local/share/rote/cloud.json` (mode 0600). Once logged in,
217
- `rote graduate` runs **on rote cloud by default**: the skill bundle
217
+ `rote compile` runs **on rote cloud by default**: the skill bundle
218
218
  syncs up (sha-diffed, so unchanged files don't re-upload), the
219
- platform runs the graduation server-side, live progress streams back
219
+ platform runs the compilation server-side, live progress streams back
220
220
  through the same renderer as a local run, the result auto-deploys,
221
221
  and the artifacts download into your `--out` directory in the exact
222
- local layout. `--local` keeps the graduation on your machine (then
222
+ local layout. `--local` keeps the compilation on your machine (then
223
223
  the cloudflare-emit + auto-deploy flow applies), `--no-deploy` or a
224
224
  config opt-out (`runtime:` pinned to a local target, or
225
225
  `deploy: none`) keeps everything local; `--cloud` forces the server
@@ -227,8 +227,8 @@ emitted code + a README on how to run, signal gates, and deploy).
227
227
  locally exactly as before. `rote whoami` shows the account (verified
228
228
  live); `rote logout` revokes the key server-side and clears the store.
229
229
  - **`rote init`** — one-time interactive onboarding: pick where
230
- graduated pipelines run (rote cloud — with login offered inline — or
231
- a local runtime, with a one-line pitch for each), which graduator
230
+ compiled pipelines run (rote cloud — with login offered inline — or
231
+ a local runtime, with a one-line pitch for each), which compiler
232
232
  driver does the work (availability probed live), and optionally a
233
233
  model. Answers are saved to `~/.config/rote/config.yaml`
234
234
  (`--project` writes a `./rote.yaml` that overrides it per-repo) and
@@ -240,10 +240,10 @@ emitted code + a README on how to run, signal gates, and deploy).
240
240
  ROTE_MODEL) > project rote.yaml > user config > built-in`. Config
241
241
  files are strict: a typo'd key or value is a loud error, never a
242
242
  silent fallback. `--json` for automation.
243
- - **`rote eval <graduated>`** — render the before/after scorecard (wall
243
+ - **`rote eval <compiled>`** — render the before/after scorecard (wall
244
244
  clock, cost across the current model lineup at live prices, and how
245
- much of the run is still LLM-decided). `rote graduate` writes this to
246
- `graduated/scorecard.md` automatically. Add `--run` to *measure*
245
+ much of the run is still LLM-decided). `rote compile` writes this to
246
+ `compiled/scorecard.md` automatically. Add `--run` to *measure*
247
247
  instead of estimate: it executes both sides for real and appends
248
248
  measured cost, turns, and output agreement across trials.
249
249
  - **Per-node inference** — emitted judges read `ROTE_MODEL_<ID>` and
@@ -255,9 +255,9 @@ emitted code + a README on how to run, signal gates, and deploy).
255
255
 
256
256
  ## The five node kinds
257
257
 
258
- Every step in a graduated pipeline is exactly one of five kinds. Full
258
+ Every step in a compiled pipeline is exactly one of five kinds. Full
259
259
  guidance:
260
- [`references/node-kinds.md`](skills/rote-graduate/references/node-kinds.md).
260
+ [`references/node-kinds.md`](skills/rote-compile/references/node-kinds.md).
261
261
 
262
262
  | Kind | What it is | Where the LLM lives |
263
263
  | --- | --- | --- |
@@ -295,7 +295,7 @@ see [`docs/mcp-client.md`](docs/mcp-client.md).
295
295
 
296
296
  ## Drivers
297
297
 
298
- `rote` ships three interchangeable graduator drivers — pick whichever
298
+ `rote` ships three interchangeable compiler drivers — pick whichever
299
299
  matches your auth. The same `pipeline.yaml` comes out either way.
300
300
 
301
301
  | Driver | Backend | Auth | Install |
@@ -361,11 +361,11 @@ Trusted Publishing ([docs/releasing.md](docs/releasing.md)).
361
361
  ```
362
362
  rote/
363
363
  ├── docs/ agent-runtime · mcp-client · mcp-trigger · releasing
364
- ├── skills/rote-graduate/ the graduator agent (SKILL.md + 4 reference files)
364
+ ├── skills/rote-compile/ the compiler agent (SKILL.md + 4 reference files)
365
365
  ├── src/rote/
366
- │ ├── cli.py rote graduate / emit / eval / serve
366
+ │ ├── cli.py rote compile / emit / eval / serve
367
367
  │ ├── ir.py Pydantic IR models + load_pipeline
368
- │ ├── graduator/ orchestrator + drivers/ (claude · codex · anthropic_api)
368
+ │ ├── compiler/ orchestrator + drivers/ (claude · codex · anthropic_api)
369
369
  │ └── adapters/ dbos · temporal · python · cloudflare · dbos_ts · inngest
370
370
  │ (+ _common / _py_common / _ts_common emit helpers)
371
371
  ├── examples/
@@ -381,7 +381,7 @@ rote/
381
381
 
382
382
  - [`AGENTS.md`](AGENTS.md) — operating manual for a coding agent *driving*
383
383
  `rote` as an installed tool (invocation contract, the slow/costs-money
384
- `graduate` flow, auth, failure recovery, the stub-filling job, `--json`)
384
+ `compile` flow, auth, failure recovery, the stub-filling job, `--json`)
385
385
  - [`docs/agent-runtime.md`](docs/agent-runtime.md) — design record for the
386
386
  driver abstraction (the `claude -p` env gotcha; the non-use of
387
387
  `claude-agent-sdk`)
@@ -389,17 +389,17 @@ rote/
389
389
  emitted code uses under `--backend mcp`: endpoint/credential
390
390
  resolution and durable park-on-auth across every MCP-capable runtime
391
391
  - [`docs/mcp-trigger.md`](docs/mcp-trigger.md) — `rote register` +
392
- `rote serve`: graduated pipelines as MCP tools (FastMCP 3.x)
392
+ `rote serve`: compiled pipelines as MCP tools (FastMCP 3.x)
393
393
  - [`docs/releasing.md`](docs/releasing.md) — tag-driven PyPI Trusted
394
394
  Publishing
395
- - [`skills/rote-graduate/`](skills/rote-graduate/) — the graduator's
395
+ - [`skills/rote-compile/`](skills/rote-compile/) — the compiler's
396
396
  `SKILL.md` and its four rubric files (node kinds, crystallization
397
397
  heuristics, IR schema, LLM-judge extraction)
398
398
  - [`examples/bdr-outreach/`](examples/bdr-outreach/) — the canonical
399
- skill, its ground-truth IR, and snapshotted real graduator runs
399
+ skill, its ground-truth IR, and snapshotted real compiler runs
400
400
  - [`examples/ops-report/`](examples/ops-report/) — the 100%-roteness
401
401
  archetype: every step deterministic, one durable HITL gate, zero LLM
402
- nodes after graduation
402
+ nodes after compilation
403
403
  - [`examples/deal-monitor/`](examples/deal-monitor/) — the data-heavy
404
404
  archetype: parallel entry waves, fan-out judges, and a template render
405
405
  replacing per-run LLM-generated HTML
@@ -410,7 +410,7 @@ rote/
410
410
 
411
411
  In rough priority order:
412
412
 
413
- 1. **Re-graduate BDR end-to-end with `signature_spec`** — the bundled IR
413
+ 1. **Re-compile BDR end-to-end with `signature_spec`** — the bundled IR
414
414
  was hand-extended with structured schemas; the rubric now teaches the
415
415
  field, but no real run has produced one yet.
416
416
  2. **Pre-filter as a `pure_function` node** — today hard thresholds are
@@ -420,18 +420,18 @@ In rough priority order:
420
420
  retrieval-heavy, and code-review skills stress the IR differently.
421
421
  4. **`fan_out` per-element dispatch** — currently the whole upstream list
422
422
  arrives in one invocation.
423
- 5. **The graduator graduating itself** — `rote-graduate` is a SKILL.md;
424
- pointing `rote graduate` at it should crystallize its rubric-grade
423
+ 5. **The compiler compiling itself** — `rote-compile` is a SKILL.md;
424
+ pointing `rote compile` at it should crystallize its rubric-grade
425
425
  pieces and leave only the genuinely fuzzy judgments in the loop.
426
426
 
427
427
  ---
428
428
 
429
429
  ## Contributing
430
430
 
431
- The most useful contribution right now is to **run `rote graduate` on a
431
+ The most useful contribution right now is to **run `rote compile` on a
432
432
  real skill of your own and report what happens** — the rubric was
433
433
  designed against one skill and needs more. Adding a runtime adapter or a
434
- graduator driver, or improving the rubric, are all good next steps. See
434
+ compiler driver, or improving the rubric, are all good next steps. See
435
435
  [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup, the test layout, and
436
436
  the adapter/driver how-tos.
437
437