rote-cli 0.9.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 (72) hide show
  1. {rote_cli-0.9.0 → rote_cli-0.11.0}/.gitignore +2 -2
  2. {rote_cli-0.9.0 → rote_cli-0.11.0}/PKG-INFO +113 -49
  3. {rote_cli-0.9.0 → rote_cli-0.11.0}/README.md +110 -46
  4. {rote_cli-0.9.0 → rote_cli-0.11.0}/pyproject.toml +13 -8
  5. {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/SKILL.md +28 -16
  6. {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/crystallization-heuristics.md +43 -9
  7. {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/eval-estimates.md +4 -4
  8. rote_cli-0.11.0/skills/rote-compile/references/implementation.md +109 -0
  9. {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/ir-schema.md +54 -7
  10. {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/llm-judge-extraction.md +12 -8
  11. {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/node-kinds.md +37 -6
  12. rote_cli-0.11.0/src/rote/__init__.py +3 -0
  13. rote_cli-0.11.0/src/rote/_dbos.py +65 -0
  14. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/__init__.py +21 -5
  15. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/_common.py +2 -2
  16. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/_py_common.py +149 -19
  17. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/_ts_common.py +131 -34
  18. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/cloudflare.py +221 -32
  19. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/dbos.py +266 -38
  20. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/dbos_ts.py +216 -23
  21. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/inngest.py +234 -15
  22. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/python.py +15 -5
  23. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/temporal.py +106 -32
  24. rote_cli-0.11.0/src/rote/app_registry.py +85 -0
  25. rote_cli-0.11.0/src/rote/cli.py +3960 -0
  26. rote_cli-0.11.0/src/rote/cloud_auth.py +296 -0
  27. rote_cli-0.11.0/src/rote/cloud_compile.py +638 -0
  28. {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/__init__.py +145 -83
  29. {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/__init__.py +29 -29
  30. {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/_fs_tools.py +15 -15
  31. {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/anthropic_api.py +31 -25
  32. {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/claude.py +116 -53
  33. {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/codex.py +25 -25
  34. {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/openai_api.py +20 -20
  35. {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/events.py +14 -14
  36. {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/update.py +7 -7
  37. rote_cli-0.11.0/src/rote/config.py +222 -0
  38. rote_cli-0.11.0/src/rote/deploy.py +206 -0
  39. rote_cli-0.11.0/src/rote/deploy_rote_cloud.py +182 -0
  40. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/__init__.py +2 -2
  41. rote_cli-0.11.0/src/rote/eval/baseline.py +655 -0
  42. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/empirical.py +26 -36
  43. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/estimate.py +6 -6
  44. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/priors.py +5 -5
  45. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/scorecard.py +3 -3
  46. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/sidecar.py +5 -5
  47. rote_cli-0.11.0/src/rote/init_wizard.py +168 -0
  48. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/ir.py +130 -9
  49. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/mcp/__init__.py +4 -0
  50. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/mcp/_runtime_helper.py +133 -2
  51. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/mcp/registry.py +1 -1
  52. rote_cli-0.11.0/src/rote/mcp/release.py +317 -0
  53. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/mcp/tokens.py +47 -1
  54. rote_cli-0.11.0/src/rote/probe.py +341 -0
  55. rote_cli-0.11.0/src/rote/runners/__init__.py +449 -0
  56. rote_cli-0.11.0/src/rote/runners/_node.py +87 -0
  57. rote_cli-0.11.0/src/rote/runners/cloudflare.py +172 -0
  58. rote_cli-0.11.0/src/rote/runners/dbos_ts.py +257 -0
  59. rote_cli-0.11.0/src/rote/runners/inngest.py +259 -0
  60. rote_cli-0.11.0/src/rote/runners/temporal.py +160 -0
  61. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/serve/__init__.py +3 -3
  62. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/serve/backends.py +3 -3
  63. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/serve/registry.py +9 -9
  64. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/serve/server.py +4 -4
  65. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/skill_source.py +5 -5
  66. rote_cli-0.9.0/src/rote/__init__.py +0 -3
  67. rote_cli-0.9.0/src/rote/cli.py +0 -1665
  68. {rote_cli-0.9.0 → rote_cli-0.11.0}/LICENSE +0 -0
  69. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/__main__.py +0 -0
  70. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/pricing.py +0 -0
  71. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/tokens.py +0 -0
  72. {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/mcp/auth.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.9.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,27 +220,82 @@ 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
229
229
 
230
- - **`rote emit <pipeline.yaml>`** — run just the adapter step on an
231
- existing IR (no LLM, no cost). The cheap inner loop while iterating on
230
+ - **`rote emit <pipeline.yaml> --out <dir>`** — run just the adapter step
231
+ on an existing IR (no LLM, no cost). The cheap inner loop while iterating on
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
239
239
  aren't orphaned) and implemented stubs are kept. No change → no agent run.
240
- - **`rote eval <graduated>`** — render the before/after scorecard (wall
240
+ - **`rote run <path>`** — one-off local execution of either side. A
241
+ skill directory runs as an agent via `claude -p` (your registered MCP
242
+ servers injected, read-only tool gate unless `--allow-writes`); an
243
+ emitted runtime directory — or a `compile --out` directory — runs
244
+ the pipeline itself — all six runtimes (`python`/`dbos`/`temporal`
245
+ in-process or on a managed local dev server, `cloudflare` under
246
+ `wrangler dev`, `inngest` against a managed `inngest-cli dev`,
247
+ `dbos-ts` against your Postgres or a throwaway Docker one). HITL
248
+ gate payloads via `--signal name='{...}'` or an interactive prompt.
249
+ Runtimes that bundle a dev UI surface it: temporal runs print a live
250
+ Temporal Web UI URL and inngest runs print the dev-server dashboard,
251
+ both live for the duration of the run. Output JSON on stdout, status
252
+ on stderr, so it pipes.
253
+ - **`rote deploy <path>`** — push an emitted pipeline where it runs:
254
+ `cloudflare` wraps `npx wrangler deploy` (with `--dry-run`), `dbos` /
255
+ `dbos-ts` wrap `npx dbos-cloud app deploy` — the vendor CLI owns auth
256
+ and output; rote adds detection and preflights (including surfacing
257
+ *which* account your wrangler session belongs to before uploading).
258
+ Runtimes with no push model (temporal, inngest, python) print honest
259
+ hosting guidance with doc links instead of a fake action.
260
+ `--target rote-cloud` bundles a cloudflare-emitted app (esbuild via
261
+ npx) and uploads it to a hosted rote-cloud instance — with a stored
262
+ `rote login`, no flags or env vars needed (`--url`/`--token` and
263
+ `$ROTE_CLOUD_URL`/`$ROTE_CLOUD_TOKEN` still override).
264
+ - **`rote login`** — connect the CLI to a rote-cloud account via the
265
+ OAuth device flow: your browser opens with a one-time code pre-filled
266
+ (over SSH, `--device` prints the code + URL instead), you click
267
+ Approve, and the CLI stores a tenant API key at
268
+ `~/.local/share/rote/cloud.json` (mode 0600). Once logged in,
269
+ `rote compile` runs **on rote cloud by default**: the skill bundle
270
+ syncs up (sha-diffed, so unchanged files don't re-upload), the
271
+ platform runs the compilation server-side, live progress streams back
272
+ through the same renderer as a local run, the result auto-deploys,
273
+ and the artifacts download into your `--out` directory in the exact
274
+ local layout. `--local` keeps the compilation on your machine (then
275
+ the cloudflare-emit + auto-deploy flow applies), `--no-deploy` or a
276
+ config opt-out (`runtime:` pinned to a local target, or
277
+ `deploy: none`) keeps everything local; `--cloud` forces the server
278
+ even where config says otherwise. Logged out, everything works
279
+ locally exactly as before. `rote whoami` shows the account (verified
280
+ live); `rote logout` revokes the key server-side and clears the store.
281
+ - **`rote init`** — one-time interactive onboarding: pick where
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
+ driver does the work (availability probed live), and optionally a
285
+ model. Answers are saved to `~/.config/rote/config.yaml`
286
+ (`--project` writes a `./rote.yaml` that overrides it per-repo) and
287
+ every later command reads them. It's the only interactive command
288
+ besides login — CI never hits a prompt.
289
+ - **`rote config`** — print every configurable default with its
290
+ effective value *and the layer that set it*. Resolution everywhere is
291
+ `flag > ROTE_* env (ROTE_RUNTIME, ROTE_DEPLOY, ROTE_AGENT,
292
+ ROTE_MODEL) > project rote.yaml > user config > built-in`. Config
293
+ files are strict: a typo'd key or value is a loud error, never a
294
+ silent fallback. `--json` for automation.
295
+ - **`rote eval <compiled>`** — render the before/after scorecard (wall
241
296
  clock, cost across the current model lineup at live prices, and how
242
- much of the run is still LLM-decided). `rote graduate` writes this to
243
- `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*
244
299
  instead of estimate: it executes both sides for real and appends
245
300
  measured cost, turns, and output agreement across trials.
246
301
  - **Per-node inference** — emitted judges read `ROTE_MODEL_<ID>` and
@@ -252,9 +307,9 @@ emitted code + a README on how to run, signal gates, and deploy).
252
307
 
253
308
  ## The five node kinds
254
309
 
255
- 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
256
311
  guidance:
257
- [`references/node-kinds.md`](skills/rote-graduate/references/node-kinds.md).
312
+ [`references/node-kinds.md`](skills/rote-compile/references/node-kinds.md).
258
313
 
259
314
  | Kind | What it is | Where the LLM lives |
260
315
  | --- | --- | --- |
@@ -272,9 +327,12 @@ way, prefer the more deterministic kind.
272
327
 
273
328
  ## Runtimes
274
329
 
275
- Pick with `--runtime`; the same IR drives all of them. None of the
276
- emitted code references MCP — the crystallization step replaces tool
277
- calls with direct vendor API calls.
330
+ Pick with `--runtime`; the same IR drives all of them. Under
331
+ `--backend api`, none of the emitted code references MCP — the
332
+ crystallization step replaces tool calls with direct vendor API calls.
333
+ Under the default `--backend mcp`, tool-using nodes emit a working MCP
334
+ client call (with durable park-on-auth on every MCP-capable runtime);
335
+ see [`docs/mcp-client.md`](docs/mcp-client.md).
278
336
 
279
337
  | Runtime | `--runtime` | Language | Shape | Notes |
280
338
  | --- | --- | --- | --- | --- |
@@ -289,7 +347,7 @@ calls with direct vendor API calls.
289
347
 
290
348
  ## Drivers
291
349
 
292
- `rote` ships three interchangeable graduator drivers — pick whichever
350
+ `rote` ships three interchangeable compiler drivers — pick whichever
293
351
  matches your auth. The same `pipeline.yaml` comes out either way.
294
352
 
295
353
  | Driver | Backend | Auth | Install |
@@ -354,12 +412,12 @@ Trusted Publishing ([docs/releasing.md](docs/releasing.md)).
354
412
 
355
413
  ```
356
414
  rote/
357
- ├── docs/ agent-runtime · mcp-trigger · releasing
358
- ├── skills/rote-graduate/ the graduator agent (SKILL.md + 4 reference files)
415
+ ├── docs/ agent-runtime · mcp-client · mcp-trigger · releasing
416
+ ├── skills/rote-compile/ the compiler agent (SKILL.md + 4 reference files)
359
417
  ├── src/rote/
360
- │ ├── cli.py rote graduate / emit / eval / serve
418
+ │ ├── cli.py rote compile / emit / eval / serve
361
419
  │ ├── ir.py Pydantic IR models + load_pipeline
362
- │ ├── graduator/ orchestrator + drivers/ (claude · codex · anthropic_api)
420
+ │ ├── compiler/ orchestrator + drivers/ (claude · codex · anthropic_api)
363
421
  │ └── adapters/ dbos · temporal · python · cloudflare · dbos_ts · inngest
364
422
  │ (+ _common / _py_common / _ts_common emit helpers)
365
423
  ├── examples/
@@ -373,21 +431,27 @@ rote/
373
431
 
374
432
  ## Documentation
375
433
 
434
+ - [`AGENTS.md`](AGENTS.md) — operating manual for a coding agent *driving*
435
+ `rote` as an installed tool (invocation contract, the slow/costs-money
436
+ `compile` flow, auth, failure recovery, the stub-filling job, `--json`)
376
437
  - [`docs/agent-runtime.md`](docs/agent-runtime.md) — design record for the
377
438
  driver abstraction (the `claude -p` env gotcha; the non-use of
378
439
  `claude-agent-sdk`)
440
+ - [`docs/mcp-client.md`](docs/mcp-client.md) — the OAuth MCP client
441
+ emitted code uses under `--backend mcp`: endpoint/credential
442
+ resolution and durable park-on-auth across every MCP-capable runtime
379
443
  - [`docs/mcp-trigger.md`](docs/mcp-trigger.md) — `rote register` +
380
- `rote serve`: graduated pipelines as MCP tools (FastMCP 3.x)
444
+ `rote serve`: compiled pipelines as MCP tools (FastMCP 3.x)
381
445
  - [`docs/releasing.md`](docs/releasing.md) — tag-driven PyPI Trusted
382
446
  Publishing
383
- - [`skills/rote-graduate/`](skills/rote-graduate/) — the graduator's
447
+ - [`skills/rote-compile/`](skills/rote-compile/) — the compiler's
384
448
  `SKILL.md` and its four rubric files (node kinds, crystallization
385
449
  heuristics, IR schema, LLM-judge extraction)
386
450
  - [`examples/bdr-outreach/`](examples/bdr-outreach/) — the canonical
387
- skill, its ground-truth IR, and snapshotted real graduator runs
451
+ skill, its ground-truth IR, and snapshotted real compiler runs
388
452
  - [`examples/ops-report/`](examples/ops-report/) — the 100%-roteness
389
453
  archetype: every step deterministic, one durable HITL gate, zero LLM
390
- nodes after graduation
454
+ nodes after compilation
391
455
  - [`examples/deal-monitor/`](examples/deal-monitor/) — the data-heavy
392
456
  archetype: parallel entry waves, fan-out judges, and a template render
393
457
  replacing per-run LLM-generated HTML
@@ -398,7 +462,7 @@ rote/
398
462
 
399
463
  In rough priority order:
400
464
 
401
- 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
402
466
  was hand-extended with structured schemas; the rubric now teaches the
403
467
  field, but no real run has produced one yet.
404
468
  2. **Pre-filter as a `pure_function` node** — today hard thresholds are
@@ -408,18 +472,18 @@ In rough priority order:
408
472
  retrieval-heavy, and code-review skills stress the IR differently.
409
473
  4. **`fan_out` per-element dispatch** — currently the whole upstream list
410
474
  arrives in one invocation.
411
- 5. **The graduator graduating itself** — `rote-graduate` is a SKILL.md;
412
- 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
413
477
  pieces and leave only the genuinely fuzzy judgments in the loop.
414
478
 
415
479
  ---
416
480
 
417
481
  ## Contributing
418
482
 
419
- 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
420
484
  real skill of your own and report what happens** — the rubric was
421
485
  designed against one skill and needs more. Adding a runtime adapter or a
422
- 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
423
487
  [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup, the test layout, and
424
488
  the adapter/driver how-tos.
425
489