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.
- {rote_cli-0.10.0 → rote_cli-0.11.0}/.gitignore +2 -2
- {rote_cli-0.10.0 → rote_cli-0.11.0}/PKG-INFO +50 -50
- {rote_cli-0.10.0 → rote_cli-0.11.0}/README.md +47 -47
- {rote_cli-0.10.0 → rote_cli-0.11.0}/pyproject.toml +13 -8
- {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/SKILL.md +16 -16
- {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/crystallization-heuristics.md +10 -10
- {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/eval-estimates.md +4 -4
- {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/implementation.md +2 -2
- {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/ir-schema.md +14 -10
- {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/llm-judge-extraction.md +12 -8
- {rote_cli-0.10.0/skills/rote-graduate → rote_cli-0.11.0/skills/rote-compile}/references/node-kinds.md +27 -4
- rote_cli-0.11.0/src/rote/__init__.py +3 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/__init__.py +21 -5
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/_common.py +2 -2
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/_py_common.py +70 -3
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/cloudflare.py +3 -3
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/dbos.py +49 -3
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/dbos_ts.py +4 -4
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/inngest.py +3 -3
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/python.py +10 -3
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/temporal.py +4 -4
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/app_registry.py +1 -1
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/cli.py +321 -260
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/cloud_auth.py +1 -1
- rote_cli-0.10.0/src/rote/cloud_graduate.py → rote_cli-0.11.0/src/rote/cloud_compile.py +106 -96
- {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/__init__.py +85 -85
- {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/__init__.py +29 -29
- {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/_fs_tools.py +15 -15
- {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/anthropic_api.py +25 -25
- {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/claude.py +32 -32
- {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/codex.py +25 -25
- {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/drivers/openai_api.py +20 -20
- {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/events.py +14 -14
- {rote_cli-0.10.0/src/rote/graduator → rote_cli-0.11.0/src/rote/compiler}/update.py +7 -7
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/config.py +7 -7
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/deploy_rote_cloud.py +2 -2
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/__init__.py +2 -2
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/baseline.py +9 -9
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/empirical.py +6 -6
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/estimate.py +6 -6
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/priors.py +5 -5
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/scorecard.py +3 -3
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/sidecar.py +5 -5
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/init_wizard.py +13 -13
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/ir.py +11 -11
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/_runtime_helper.py +34 -2
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/registry.py +1 -1
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/probe.py +42 -2
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/__init__.py +9 -9
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/serve/__init__.py +3 -3
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/serve/backends.py +3 -3
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/serve/registry.py +9 -9
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/serve/server.py +4 -4
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/skill_source.py +5 -5
- rote_cli-0.10.0/src/rote/__init__.py +0 -3
- {rote_cli-0.10.0 → rote_cli-0.11.0}/LICENSE +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/__main__.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/_dbos.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/adapters/_ts_common.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/deploy.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/pricing.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/eval/tokens.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/__init__.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/auth.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/release.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/mcp/tokens.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/_node.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/cloudflare.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/dbos_ts.py +0 -0
- {rote_cli-0.10.0 → rote_cli-0.11.0}/src/rote/runners/inngest.py +0 -0
- {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
|
|
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,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 `
|
|
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
|
|
@@ -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
|
|
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 `
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
283
|
-
a local runtime, with a one-line pitch for each), which
|
|
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 <
|
|
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
|
|
298
|
-
`
|
|
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
|
|
310
|
+
Every step in a compiled pipeline is exactly one of five kinds. Full
|
|
311
311
|
guidance:
|
|
312
|
-
[`references/node-kinds.md`](skills/rote-
|
|
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
|
|
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-
|
|
416
|
+
├── skills/rote-compile/ the compiler agent (SKILL.md + 4 reference files)
|
|
417
417
|
├── src/rote/
|
|
418
|
-
│ ├── cli.py rote
|
|
418
|
+
│ ├── cli.py rote compile / emit / eval / serve
|
|
419
419
|
│ ├── ir.py Pydantic IR models + load_pipeline
|
|
420
|
-
│ ├──
|
|
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
|
-
`
|
|
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`:
|
|
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-
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
476
|
-
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
|
|
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
|
|
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
|
-
|
|
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
|
-
**
|
|
3
|
+
**Compile fuzzy AI skills into deterministic, reliable workflows.**
|
|
4
4
|
|
|
5
5
|
[](https://github.com/trevhud/rote/actions/workflows/ci.yml)
|
|
6
6
|
[](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
|
|
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
|
|
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
|
|
29
|
+
rote compile ./examples/bdr-outreach/skill --out ./compiled/
|
|
30
30
|
|
|
31
31
|
# Or pick another runtime (see the table below):
|
|
32
|
-
rote
|
|
33
|
-
rote
|
|
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
|
|
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
|
|
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
|
|
90
|
+
│ rote compile
|
|
91
91
|
▼
|
|
92
|
-
|
|
93
|
-
(pluggable driver) Anthropic SDK) runs the rote-
|
|
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
|
|
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
|
|
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
|
|
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 "
|
|
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
|
|
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
|
|
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
|
|
159
|
+
rote compile examples/bdr-outreach/skill --out /tmp/bdr-compiled
|
|
160
160
|
```
|
|
161
161
|
|
|
162
|
-
On that skill the
|
|
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 `
|
|
171
|
+
override with `--agent`. The output directory splits into `compiled/`
|
|
172
172
|
(the agent's `pipeline.yaml`, `extracted/`, `signatures/`, eval seeds,
|
|
173
|
-
and a `
|
|
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
|
|
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 `
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
231
|
-
a local runtime, with a one-line pitch for each), which
|
|
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 <
|
|
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
|
|
246
|
-
`
|
|
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
|
|
258
|
+
Every step in a compiled pipeline is exactly one of five kinds. Full
|
|
259
259
|
guidance:
|
|
260
|
-
[`references/node-kinds.md`](skills/rote-
|
|
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
|
|
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-
|
|
364
|
+
├── skills/rote-compile/ the compiler agent (SKILL.md + 4 reference files)
|
|
365
365
|
├── src/rote/
|
|
366
|
-
│ ├── cli.py rote
|
|
366
|
+
│ ├── cli.py rote compile / emit / eval / serve
|
|
367
367
|
│ ├── ir.py Pydantic IR models + load_pipeline
|
|
368
|
-
│ ├──
|
|
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
|
-
`
|
|
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`:
|
|
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-
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
424
|
-
pointing `rote
|
|
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
|
|
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
|
-
|
|
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
|
|