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.
- {rote_cli-0.9.0 → rote_cli-0.11.0}/.gitignore +2 -2
- {rote_cli-0.9.0 → rote_cli-0.11.0}/PKG-INFO +113 -49
- {rote_cli-0.9.0 → rote_cli-0.11.0}/README.md +110 -46
- {rote_cli-0.9.0 → rote_cli-0.11.0}/pyproject.toml +13 -8
- {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/SKILL.md +28 -16
- {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/crystallization-heuristics.md +43 -9
- {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/eval-estimates.md +4 -4
- rote_cli-0.11.0/skills/rote-compile/references/implementation.md +109 -0
- {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/ir-schema.md +54 -7
- {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/llm-judge-extraction.md +12 -8
- {rote_cli-0.9.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/node-kinds.md +37 -6
- rote_cli-0.11.0/src/rote/__init__.py +3 -0
- rote_cli-0.11.0/src/rote/_dbos.py +65 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/__init__.py +21 -5
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/_common.py +2 -2
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/_py_common.py +149 -19
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/_ts_common.py +131 -34
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/cloudflare.py +221 -32
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/dbos.py +266 -38
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/dbos_ts.py +216 -23
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/inngest.py +234 -15
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/python.py +15 -5
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/adapters/temporal.py +106 -32
- rote_cli-0.11.0/src/rote/app_registry.py +85 -0
- rote_cli-0.11.0/src/rote/cli.py +3960 -0
- rote_cli-0.11.0/src/rote/cloud_auth.py +296 -0
- rote_cli-0.11.0/src/rote/cloud_compile.py +638 -0
- {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/__init__.py +145 -83
- {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/__init__.py +29 -29
- {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/_fs_tools.py +15 -15
- {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/anthropic_api.py +31 -25
- {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/claude.py +116 -53
- {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/codex.py +25 -25
- {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/openai_api.py +20 -20
- {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/events.py +14 -14
- {rote_cli-0.9.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/update.py +7 -7
- rote_cli-0.11.0/src/rote/config.py +222 -0
- rote_cli-0.11.0/src/rote/deploy.py +206 -0
- rote_cli-0.11.0/src/rote/deploy_rote_cloud.py +182 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/__init__.py +2 -2
- rote_cli-0.11.0/src/rote/eval/baseline.py +655 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/empirical.py +26 -36
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/estimate.py +6 -6
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/priors.py +5 -5
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/scorecard.py +3 -3
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/sidecar.py +5 -5
- rote_cli-0.11.0/src/rote/init_wizard.py +168 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/ir.py +130 -9
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/mcp/__init__.py +4 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/mcp/_runtime_helper.py +133 -2
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/mcp/registry.py +1 -1
- rote_cli-0.11.0/src/rote/mcp/release.py +317 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/mcp/tokens.py +47 -1
- rote_cli-0.11.0/src/rote/probe.py +341 -0
- rote_cli-0.11.0/src/rote/runners/__init__.py +449 -0
- rote_cli-0.11.0/src/rote/runners/_node.py +87 -0
- rote_cli-0.11.0/src/rote/runners/cloudflare.py +172 -0
- rote_cli-0.11.0/src/rote/runners/dbos_ts.py +257 -0
- rote_cli-0.11.0/src/rote/runners/inngest.py +259 -0
- rote_cli-0.11.0/src/rote/runners/temporal.py +160 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/serve/__init__.py +3 -3
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/serve/backends.py +3 -3
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/serve/registry.py +9 -9
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/serve/server.py +4 -4
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/skill_source.py +5 -5
- rote_cli-0.9.0/src/rote/__init__.py +0 -3
- rote_cli-0.9.0/src/rote/cli.py +0 -1665
- {rote_cli-0.9.0 → rote_cli-0.11.0}/LICENSE +0 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/__main__.py +0 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/pricing.py +0 -0
- {rote_cli-0.9.0 → rote_cli-0.11.0}/src/rote/eval/tokens.py +0 -0
- {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
|
|
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
|
-
/
|
|
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.
|
|
4
|
-
Summary:
|
|
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,
|
|
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
|
-
**
|
|
55
|
+
**Compile fuzzy AI skills into deterministic, reliable workflows.**
|
|
56
56
|
|
|
57
57
|
[](https://github.com/trevhud/rote/actions/workflows/ci.yml)
|
|
58
58
|
[](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
|
|
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
|
|
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
|
|
81
|
+
rote compile ./examples/bdr-outreach/skill --out ./compiled/
|
|
82
82
|
|
|
83
83
|
# Or pick another runtime (see the table below):
|
|
84
|
-
rote
|
|
85
|
-
rote
|
|
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
|
|
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
|
|
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
|
|
142
|
+
│ rote compile
|
|
143
143
|
▼
|
|
144
|
-
|
|
145
|
-
(pluggable driver) Anthropic SDK) runs the rote-
|
|
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
|
|
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
|
|
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
|
|
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 "
|
|
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
|
|
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
|
|
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
|
|
211
|
+
rote compile examples/bdr-outreach/skill --out /tmp/bdr-compiled
|
|
212
212
|
```
|
|
213
213
|
|
|
214
|
-
On that skill the
|
|
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 `
|
|
223
|
+
override with `--agent`. The output directory splits into `compiled/`
|
|
224
224
|
(the agent's `pipeline.yaml`, `extracted/`, `signatures/`, eval seeds,
|
|
225
|
-
and a `
|
|
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
|
|
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
|
|
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
|
|
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
|
|
243
|
-
`
|
|
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
|
|
310
|
+
Every step in a compiled pipeline is exactly one of five kinds. Full
|
|
256
311
|
guidance:
|
|
257
|
-
[`references/node-kinds.md`](skills/rote-
|
|
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.
|
|
276
|
-
emitted code references MCP — the
|
|
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
|
|
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-
|
|
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
|
|
418
|
+
│ ├── cli.py rote compile / emit / eval / serve
|
|
361
419
|
│ ├── ir.py Pydantic IR models + load_pipeline
|
|
362
|
-
│ ├──
|
|
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`:
|
|
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-
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
412
|
-
pointing `rote
|
|
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
|
|
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
|
-
|
|
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
|
|