rote-cli 0.14.0__tar.gz → 0.16.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.14.0 → rote_cli-0.16.0}/LICENSE +12 -11
- rote_cli-0.14.0/README.md → rote_cli-0.16.0/PKG-INFO +217 -26
- rote_cli-0.14.0/PKG-INFO → rote_cli-0.16.0/README.md +154 -82
- rote_cli-0.16.0/examples/expense-audit/README.md +157 -0
- rote_cli-0.16.0/examples/expense-audit/eval-input.json +199 -0
- rote_cli-0.16.0/examples/expense-audit/expected/eval.yaml +60 -0
- rote_cli-0.16.0/examples/expense-audit/expected/extracted/audit.py +171 -0
- rote_cli-0.16.0/examples/expense-audit/expected/extracted/checks.py +71 -0
- rote_cli-0.16.0/examples/expense-audit/expected/extracted/fx.py +62 -0
- rote_cli-0.16.0/examples/expense-audit/expected/extracted/report.py +186 -0
- rote_cli-0.16.0/examples/expense-audit/expected/pipeline-draft.yaml +242 -0
- rote_cli-0.16.0/examples/expense-audit/expected/pipeline.yaml +269 -0
- rote_cli-0.16.0/examples/expense-audit/fidelity/cases.yaml +68 -0
- rote_cli-0.16.0/examples/expense-audit/fidelity/reference.json +793 -0
- rote_cli-0.16.0/examples/expense-audit/input.json +21 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/compile-metrics.json +17 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/compile-report.md +220 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/eval.yaml +84 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/checks.py +94 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/fx.py +100 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/policy.py +92 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/report.py +145 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/save.py +51 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/pipeline.yaml +382 -0
- rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/provenance.json +49 -0
- rote_cli-0.16.0/examples/expense-audit/scorecard.md +82 -0
- rote_cli-0.16.0/examples/expense-audit/skill/SKILL.md +94 -0
- rote_cli-0.16.0/examples/expense-audit/skill/references/expense-policy.md +48 -0
- rote_cli-0.16.0/examples/expense-audit/skill/references/fx-rates.md +30 -0
- rote_cli-0.16.0/examples/expense-audit/skill/references/report-format.md +43 -0
- rote_cli-0.16.0/examples/expense-audit/skill/sample-input.json +25 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/pyproject.toml +39 -8
- rote_cli-0.16.0/skills/rote-compile/GENERATE.md +168 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/SKILL.md +121 -35
- rote_cli-0.16.0/skills/rote-compile/SYSTEM1.md +105 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/crystallization-heuristics.md +28 -10
- rote_cli-0.16.0/skills/rote-compile/references/implementation.md +428 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/ir-schema.md +131 -7
- {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/llm-judge-extraction.md +72 -9
- {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/node-kinds.md +11 -1
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/__init__.py +1 -1
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/_dbos.py +16 -15
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/__init__.py +2 -2
- rote_cli-0.16.0/src/rote/adapters/_common.py +1140 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/_py_common.py +648 -37
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/_ts_common.py +1351 -234
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/cloudflare.py +95 -56
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/dbos.py +203 -86
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/dbos_ts.py +139 -74
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/inngest.py +104 -49
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/python.py +88 -114
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/temporal.py +93 -18
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/app_registry.py +3 -2
- rote_cli-0.16.0/src/rote/bench/__init__.py +13 -0
- rote_cli-0.16.0/src/rote/bench/collect.py +375 -0
- rote_cli-0.16.0/src/rote/bench/fidelity.py +828 -0
- rote_cli-0.16.0/src/rote/bench/fidelity_score.py +632 -0
- rote_cli-0.16.0/src/rote/bench/fixture_mcp.py +138 -0
- rote_cli-0.16.0/src/rote/bench/http_fixtures.py +186 -0
- rote_cli-0.16.0/src/rote/bench/report.py +279 -0
- rote_cli-0.16.0/src/rote/bench/runner.py +776 -0
- rote_cli-0.16.0/src/rote/bench/score.py +776 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/cli.py +1591 -197
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/cloud_auth.py +2 -3
- rote_cli-0.16.0/src/rote/compiler/__init__.py +1509 -0
- rote_cli-0.16.0/src/rote/compiler/_prefix_runner.py +329 -0
- rote_cli-0.16.0/src/rote/compiler/api_docs.py +432 -0
- rote_cli-0.16.0/src/rote/compiler/backend.py +59 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/__init__.py +71 -2
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/_fs_tools.py +77 -31
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/anthropic_api.py +394 -33
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/claude.py +452 -64
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/codex.py +105 -3
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/openai_api.py +128 -40
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/events.py +4 -0
- rote_cli-0.16.0/src/rote/compiler/grounding.py +740 -0
- rote_cli-0.16.0/src/rote/compiler/prefix.py +467 -0
- rote_cli-0.16.0/src/rote/compiler/provenance.py +721 -0
- rote_cli-0.16.0/src/rote/compiler/report.py +282 -0
- rote_cli-0.16.0/src/rote/compiler/sandbox.py +325 -0
- rote_cli-0.16.0/src/rote/compiler/system1/__init__.py +411 -0
- rote_cli-0.16.0/src/rote/compiler/system1/checker.py +110 -0
- rote_cli-0.16.0/src/rote/compiler/system1/decide.py +1127 -0
- rote_cli-0.16.0/src/rote/compiler/system1/decision_model.py +500 -0
- rote_cli-0.16.0/src/rote/compiler/system1/enforce.py +329 -0
- rote_cli-0.16.0/src/rote/compiler/system1/evidence.py +117 -0
- rote_cli-0.16.0/src/rote/compiler/system1/generate.py +1786 -0
- rote_cli-0.16.0/src/rote/compiler/system1/lane_call.py +238 -0
- rote_cli-0.16.0/src/rote/compiler/system1/parse.py +632 -0
- rote_cli-0.16.0/src/rote/compiler/system1/skeleton.py +437 -0
- rote_cli-0.16.0/src/rote/compiler/system1/structure.py +1886 -0
- rote_cli-0.16.0/src/rote/compiler/system1/tiebreak.py +430 -0
- rote_cli-0.16.0/src/rote/compiler/tool_grounding.py +792 -0
- rote_cli-0.16.0/src/rote/compiler/verify.py +1126 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/config.py +72 -4
- rote_cli-0.16.0/src/rote/contracts.py +667 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/baseline.py +11 -3
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/empirical.py +200 -23
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/estimate.py +59 -3
- rote_cli-0.16.0/src/rote/eval/infra_pricing.py +298 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/pricing.py +98 -4
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/priors.py +23 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/scorecard.py +148 -7
- rote_cli-0.16.0/src/rote/examples.py +184 -0
- rote_cli-0.16.0/src/rote/extras.py +138 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/inference/__init__.py +10 -0
- rote_cli-0.16.0/src/rote/inference/_runtime_helper.py +1892 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/init_wizard.py +46 -3
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/ir.py +533 -15
- rote_cli-0.16.0/src/rote/isolation.py +75 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/__init__.py +1 -3
- rote_cli-0.16.0/src/rote/mcp/_runtime_helper.py +881 -0
- rote_cli-0.16.0/src/rote/mcp/auth.py +864 -0
- rote_cli-0.16.0/src/rote/mcp/client_metadata.json +20 -0
- rote_cli-0.16.0/src/rote/mcp/learned.py +168 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/live_tools.py +27 -26
- rote_cli-0.16.0/src/rote/mcp/parked.py +626 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/registry.py +66 -26
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/release.py +69 -37
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/tokens.py +61 -16
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/probe.py +29 -6
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/__init__.py +169 -10
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/_node.py +2 -2
- rote_cli-0.16.0/src/rote/runners/cloudflare.py +326 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/dbos_ts.py +60 -10
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/inngest.py +60 -6
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/temporal.py +21 -11
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/serve/backends.py +8 -12
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/serve/registry.py +51 -2
- rote_cli-0.16.0/src/rote/serve/server.py +690 -0
- rote_cli-0.16.0/src/rote/tool_schema.py +199 -0
- rote_cli-0.16.0/src/rote/vendor_specs/__init__.py +23 -0
- rote_cli-0.16.0/src/rote/vendor_specs/check.py +995 -0
- rote_cli-0.16.0/src/rote/vendor_specs/deps.py +210 -0
- rote_cli-0.16.0/src/rote/vendor_specs/docs.py +223 -0
- rote_cli-0.16.0/src/rote/vendor_specs/extract.py +1012 -0
- rote_cli-0.16.0/src/rote/vendor_specs/fake.py +208 -0
- rote_cli-0.16.0/src/rote/vendor_specs/fixture_store.py +91 -0
- rote_cli-0.16.0/src/rote/vendor_specs/fixtures.py +127 -0
- rote_cli-0.16.0/src/rote/vendor_specs/google.py +249 -0
- rote_cli-0.16.0/src/rote/vendor_specs/graphql.py +385 -0
- rote_cli-0.16.0/src/rote/vendor_specs/intercept/sitecustomize.py +219 -0
- rote_cli-0.16.0/src/rote/vendor_specs/live.py +880 -0
- rote_cli-0.16.0/src/rote/vendor_specs/model.py +203 -0
- rote_cli-0.16.0/src/rote/vendor_specs/openapi.py +380 -0
- rote_cli-0.16.0/src/rote/vendor_specs/psl.py +90 -0
- rote_cli-0.16.0/src/rote/vendor_specs/public_suffix_list.dat +16559 -0
- rote_cli-0.16.0/src/rote/vendor_specs/schema.py +80 -0
- rote_cli-0.16.0/src/rote/vendor_specs/store.py +274 -0
- rote_cli-0.16.0/src/rote/xdg.py +39 -0
- rote_cli-0.14.0/skills/rote-compile/references/implementation.md +0 -109
- rote_cli-0.14.0/src/rote/adapters/_common.py +0 -541
- rote_cli-0.14.0/src/rote/compiler/__init__.py +0 -778
- rote_cli-0.14.0/src/rote/contracts.py +0 -330
- rote_cli-0.14.0/src/rote/inference/_runtime_helper.py +0 -914
- rote_cli-0.14.0/src/rote/mcp/_runtime_helper.py +0 -378
- rote_cli-0.14.0/src/rote/mcp/auth.py +0 -166
- rote_cli-0.14.0/src/rote/runners/cloudflare.py +0 -172
- rote_cli-0.14.0/src/rote/serve/server.py +0 -339
- {rote_cli-0.14.0 → rote_cli-0.16.0}/.gitignore +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/eval-estimates.md +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/__main__.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/cloud_compile.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/_heartbeat.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/update.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/deploy.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/deploy_rote_cloud.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/__init__.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/sidecar.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/tokens.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/py.typed +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/serve/__init__.py +0 -0
- {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/skill_source.py +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
Apache License
|
|
2
3
|
Version 2.0, January 2004
|
|
3
4
|
http://www.apache.org/licenses/
|
|
@@ -137,8 +138,8 @@
|
|
|
137
138
|
|
|
138
139
|
6. Trademarks. This License does not grant permission to use the trade
|
|
139
140
|
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
-
except as required for
|
|
141
|
-
reproducing the content of the NOTICE file.
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
143
|
|
|
143
144
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
145
|
agreed to in writing, Licensor provides the Work (and each
|
|
@@ -163,15 +164,15 @@
|
|
|
163
164
|
has been advised of the possibility of such damages.
|
|
164
165
|
|
|
165
166
|
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
-
the Work or Derivative Works thereof, You may
|
|
167
|
-
fee for acceptance of support, warranty, indemnity,
|
|
168
|
-
obligations and/or rights consistent with this
|
|
169
|
-
accepting such obligations, You may act only
|
|
170
|
-
Your sole responsibility, not on behalf
|
|
171
|
-
only if You agree to indemnify,
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
additional liability.
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
175
176
|
|
|
176
177
|
END OF TERMS AND CONDITIONS
|
|
177
178
|
|
|
@@ -1,3 +1,66 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: rote-cli
|
|
3
|
+
Version: 0.16.0
|
|
4
|
+
Summary: Compile AI agent skills into cheap, fast, deterministic pipelines that run without an LLM in the loop
|
|
5
|
+
Project-URL: Homepage, https://roteskills.com
|
|
6
|
+
Project-URL: Repository, https://github.com/trevhud/rote
|
|
7
|
+
Project-URL: Documentation, https://github.com/trevhud/rote#readme
|
|
8
|
+
Project-URL: Changelog, https://github.com/trevhud/rote/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: Issues, https://github.com/trevhud/rote/issues
|
|
10
|
+
Author-email: Trevor Hudson <trevhud@gmail.com>
|
|
11
|
+
License-Expression: Apache-2.0
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: agent,agent-skills,agent-workflow,ai,anthropic,claude,claude-code,claude-skills,cloudflare,compilation,compiler,dbos,deterministic,dspy,durable-execution,inngest,llm,mcp,pipeline,skill,temporal,token-cost,workflow
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
24
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
|
+
Classifier: Typing :: Typed
|
|
26
|
+
Requires-Python: >=3.11
|
|
27
|
+
Requires-Dist: graphql-core<4,>=3.3
|
|
28
|
+
Requires-Dist: pydantic>=2.7
|
|
29
|
+
Requires-Dist: pytest<10,>=9.0
|
|
30
|
+
Requires-Dist: pyyaml>=6.0
|
|
31
|
+
Provides-Extra: api
|
|
32
|
+
Requires-Dist: anthropic>=1.15; extra == 'api'
|
|
33
|
+
Provides-Extra: dbos
|
|
34
|
+
Requires-Dist: dbos<4,>=3.3; extra == 'dbos'
|
|
35
|
+
Provides-Extra: dev
|
|
36
|
+
Requires-Dist: anthropic>=1.15; extra == 'dev'
|
|
37
|
+
Requires-Dist: dbos<4,>=3.3; extra == 'dev'
|
|
38
|
+
Requires-Dist: fastmcp<5,>=4.1.1; extra == 'dev'
|
|
39
|
+
Requires-Dist: google-api-python-client>=2.201.0; extra == 'dev'
|
|
40
|
+
Requires-Dist: google-auth-httplib2>=0.4.4; extra == 'dev'
|
|
41
|
+
Requires-Dist: google-auth>=2.62.0; extra == 'dev'
|
|
42
|
+
Requires-Dist: httplib2>=0.32.0; extra == 'dev'
|
|
43
|
+
Requires-Dist: httpx>=0.28; extra == 'dev'
|
|
44
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
45
|
+
Requires-Dist: openai>=2.45; extra == 'dev'
|
|
46
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
47
|
+
Requires-Dist: requests>=2.34.2; extra == 'dev'
|
|
48
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
49
|
+
Requires-Dist: temporalio>=1.7; extra == 'dev'
|
|
50
|
+
Requires-Dist: trustme>=1.2.1; extra == 'dev'
|
|
51
|
+
Requires-Dist: types-pyyaml; extra == 'dev'
|
|
52
|
+
Provides-Extra: mcp
|
|
53
|
+
Requires-Dist: fastmcp<5,>=4.1.1; extra == 'mcp'
|
|
54
|
+
Requires-Dist: httpx>=0.28; extra == 'mcp'
|
|
55
|
+
Provides-Extra: openai-api
|
|
56
|
+
Requires-Dist: openai>=2.45; extra == 'openai-api'
|
|
57
|
+
Provides-Extra: serve
|
|
58
|
+
Requires-Dist: fastmcp<5,>=4.1.1; extra == 'serve'
|
|
59
|
+
Requires-Dist: httpx>=0.28; extra == 'serve'
|
|
60
|
+
Provides-Extra: temporal
|
|
61
|
+
Requires-Dist: temporalio>=1.7; extra == 'temporal'
|
|
62
|
+
Description-Content-Type: text/markdown
|
|
63
|
+
|
|
1
64
|
# rote
|
|
2
65
|
|
|
3
66
|
**Compile AI agent skills into cheap, fast, deterministic pipelines that
|
|
@@ -19,6 +82,91 @@ genuinely need judgment. A 10 to 20 minute agent loop becomes a
|
|
|
19
82
|
background workflow that costs a fraction of the tokens and can be
|
|
20
83
|
regression tested.
|
|
21
84
|
|
|
85
|
+
### Try it free in 60 seconds
|
|
86
|
+
|
|
87
|
+
No API key, no subscription, no tokens, no clone. The
|
|
88
|
+
[`expense-audit`](examples/expense-audit/) example is a month-end expense
|
|
89
|
+
audit skill whose compiled pipeline ships with working code, and it comes
|
|
90
|
+
inside the package, so you can emit it and run it before you compile
|
|
91
|
+
anything of your own:
|
|
92
|
+
|
|
93
|
+
```sh
|
|
94
|
+
uv tool install 'rote-cli[dbos]' # or: python3 -m venv .venv && . .venv/bin/activate && pip install 'rote-cli[dbos]'
|
|
95
|
+
rote example expense-audit # copies the skill, IR, code and sample input to ./expense-audit
|
|
96
|
+
# (zero-install: uvx --from rote-cli rote example expense-audit)
|
|
97
|
+
|
|
98
|
+
# IR -> a plain Python script, then run it on the sample batch
|
|
99
|
+
rote emit expense-audit/expected/pipeline-draft.yaml --runtime python --out expense-audit/app-python
|
|
100
|
+
rote run expense-audit/app-python --input expense-audit/input.json
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`rote example` prints these commands (and the dbos and eval ones) for
|
|
104
|
+
the copy it made. `rote example` alone lists what is bundled. Prefer the
|
|
105
|
+
repo? `git clone https://github.com/trevhud/rote.git && cd rote`, then
|
|
106
|
+
use `examples/expense-audit/` in place of `expense-audit/`.
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
rote run (python): succeeded
|
|
110
|
+
0.1s
|
|
111
|
+
{
|
|
112
|
+
"file_report": {
|
|
113
|
+
"report_path": "/home/you/expense-audit/app-python/reports/2026-09-expense-audit.md",
|
|
114
|
+
"status": "draft",
|
|
115
|
+
"reviewer": null,
|
|
116
|
+
"reimbursable_usd": 2395.59,
|
|
117
|
+
"pending_usd": 844.39,
|
|
118
|
+
"returned_usd": 64.17,
|
|
119
|
+
"batch_total_usd": 3304.15,
|
|
120
|
+
"auto_approved": ["Dev Patel", "Emi Tanaka"],
|
|
121
|
+
"review_items": 4,
|
|
122
|
+
"blocked_items": 2
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Sixteen expense lines in five currencies went through a parallel wave of
|
|
128
|
+
three mandatory checks, a per-employee audit fanned out five ways, and a
|
|
129
|
+
report written to disk, with no model anywhere in the loop. The full
|
|
130
|
+
skill also parks for the controller's approval, which needs a durable
|
|
131
|
+
runtime:
|
|
132
|
+
|
|
133
|
+
```sh
|
|
134
|
+
rote emit expense-audit/expected/pipeline.yaml --runtime dbos --out expense-audit/app-dbos
|
|
135
|
+
rote run expense-audit/app-dbos --input expense-audit/input.json \
|
|
136
|
+
--signal controller_review='{"reviewer": "Priya Shah", "approved_ids": ["EXP-2403", "EXP-2413", "EXP-2420"], "rejected_ids": ["EXP-2410"]}'
|
|
137
|
+
# ... "status": "final", "reimbursable_usd": 2990.98, "returned_usd": 313.17
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
What compiling it bought, measured: we ran the same batch twice each way
|
|
141
|
+
with `rote eval --run` (the skill as an agent via `claude -p` on Sonnet,
|
|
142
|
+
against the dbos app above):
|
|
143
|
+
|
|
144
|
+
| | Skill run as an agent | Compiled pipeline |
|
|
145
|
+
| --- | --- | --- |
|
|
146
|
+
| Wall clock per run | 42.9 s | 9.8 s, mostly DBOS startup |
|
|
147
|
+
| Cost per run | $0.22 | $0 |
|
|
148
|
+
| Identical output across runs | 1 of 2 | 2 of 2 |
|
|
149
|
+
|
|
150
|
+
So it's roughly 4x faster in practice, it drops from $0.22 a run to
|
|
151
|
+
nothing, and it gives the same answer every time. The agent's two runs
|
|
152
|
+
disagreed on where they filed the report. Full results are in
|
|
153
|
+
[`examples/expense-audit/scorecard.md`](examples/expense-audit/scorecard.md).
|
|
154
|
+
|
|
155
|
+
To get a scorecard for any pipeline without running anything, use
|
|
156
|
+
`rote eval`. It fetches the live price list once and runs no inference.
|
|
157
|
+
Its numbers are an estimate from turn counts, not a measurement:
|
|
158
|
+
|
|
159
|
+
```sh
|
|
160
|
+
rote eval examples/expense-audit/expected/pipeline.yaml
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`pip` installs don't include `examples/`, hence the clone. The other
|
|
164
|
+
examples' extracted modules are `NotImplementedError` stubs waiting for
|
|
165
|
+
real vendor API clients, so `expense-audit` is the one that runs end to
|
|
166
|
+
end. Details in [its README](examples/expense-audit/README.md).
|
|
167
|
+
|
|
168
|
+
### Compile your own skill
|
|
169
|
+
|
|
22
170
|
```sh
|
|
23
171
|
pip install rote-cli # or zero-install: uvx --from rote-cli rote ...
|
|
24
172
|
|
|
@@ -96,13 +244,40 @@ and want to run a thousand more, unattended.
|
|
|
96
244
|
|
|
97
245
|
## How it works
|
|
98
246
|
|
|
99
|
-
One `rote compile` run does the whole thing.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
247
|
+
One `rote compile` run does the whole thing. First rote decides the
|
|
248
|
+
pipeline's structure: which nodes exist and of which kind, how they are
|
|
249
|
+
wired, which run once per item, which are mandatory, where a person must
|
|
250
|
+
approve, and which constants they carry (System-1, see
|
|
251
|
+
[`docs/design/system1-compile.md`](docs/design/system1-compile.md)). One
|
|
252
|
+
Claude Haiku call reads the whole skill and proposes that structure, and
|
|
253
|
+
rote checks every node against the skill's text, its tools' schemas and
|
|
254
|
+
the sample input before accepting it. `--structure rules` decides it with
|
|
255
|
+
rules over the skill's text instead, with no model call.
|
|
256
|
+
Then an LLM agent (itself defined as a skill) writes only the text those
|
|
257
|
+
decisions need: the extracted Python modules for the deterministic
|
|
258
|
+
parts, their tests, and the typed signatures and prompts for the
|
|
259
|
+
LLM-judge parts. rote holds the agent to its decisions, and emits a
|
|
260
|
+
runtime-agnostic intermediate representation (`pipeline.yaml`) plus
|
|
104
261
|
runnable code for the durable execution engine of your choice.
|
|
105
262
|
|
|
263
|
+
`--no-system1` runs the original path instead, where the agent applies
|
|
264
|
+
the full compilation rubric and decides the structure too. `--update`
|
|
265
|
+
always uses that path, because System-1 does not support incremental
|
|
266
|
+
re-compilation yet.
|
|
267
|
+
|
|
268
|
+
The agent implements the deterministic `pure_function` steps the skill
|
|
269
|
+
spells out and writes tests for them. Before the compile reports
|
|
270
|
+
success, rote checks what the agent wrote and runs those tests, and any
|
|
271
|
+
failure goes back to the agent to fix. The tests are code an LLM wrote
|
|
272
|
+
from a skill you may not have written, so rote runs them in an OS
|
|
273
|
+
sandbox (`sandbox-exec` on macOS, bubblewrap on Linux): no network, no
|
|
274
|
+
reads outside the compile's work dir and the Python install, no programs
|
|
275
|
+
other than Python, no API keys in the environment, an empty `HOME`. If
|
|
276
|
+
no sandbox works on your machine, the tests are skipped and the compile
|
|
277
|
+
says the deliverable is unverified. `--trust-skill` runs them without a
|
|
278
|
+
sandbox, and `--no-verify-tests` never runs them; either way, review
|
|
279
|
+
`<out>/compiled/tests/` before running them yourself.
|
|
280
|
+
|
|
106
281
|
`rote` is a three-layer system; each layer has one job and contracts on
|
|
107
282
|
a small interface.
|
|
108
283
|
|
|
@@ -124,7 +299,7 @@ a small interface.
|
|
|
124
299
|
```
|
|
125
300
|
|
|
126
301
|
1. **The compiler agent** (`skills/rote-compile/`): a regular
|
|
127
|
-
Anthropic Skill (`SKILL.md` +
|
|
302
|
+
Anthropic Skill (`SKILL.md` + six reference files). This is the
|
|
128
303
|
*brain*; it runs inside any Skills-compatible surface, and you don't
|
|
129
304
|
need `rote` to use it.
|
|
130
305
|
2. **The IR** (`src/rote/ir.py`): Pydantic models for the five node
|
|
@@ -154,7 +329,9 @@ touching Python tooling:
|
|
|
154
329
|
Then say "compile this skill" (or run `/rote:compile`). It confirms the
|
|
155
330
|
source directory, asks which runtime you want, runs the CLI via
|
|
156
331
|
[uv](https://docs.astral.sh/uv/) in the background, and reports the
|
|
157
|
-
emitted pipeline.
|
|
332
|
+
emitted pipeline. `/rote:implement` then fills in the emitted stub
|
|
333
|
+
modules against each node's IR contract and verifies the result with
|
|
334
|
+
`rote run`. A third skill, `/rote:serve`, wires compiled
|
|
158
335
|
pipelines up as MCP tools so Claude can trigger the deployed workflows
|
|
159
336
|
(see [docs/mcp-trigger.md](docs/mcp-trigger.md)).
|
|
160
337
|
|
|
@@ -174,9 +351,10 @@ this README still works logged out.
|
|
|
174
351
|
|
|
175
352
|
> **Naming note:** the `rote` package on PyPI is an unrelated
|
|
176
353
|
> memoization library that also installs `import rote`, so the two can't
|
|
177
|
-
> share an environment. This project's distribution is `rote-cli`
|
|
178
|
-
>
|
|
179
|
-
> `
|
|
354
|
+
> share an environment. This project's distribution is `rote-cli` and the
|
|
355
|
+
> import name stays `rote`. The package installs the same CLI under two
|
|
356
|
+
> commands, `rote` and `rote-cli`, so both `uvx rote-cli ...` and
|
|
357
|
+
> `uvx --from rote-cli rote ...` work. See [docs/releasing.md](docs/releasing.md).
|
|
180
358
|
|
|
181
359
|
### Run on the bundled example
|
|
182
360
|
|
|
@@ -190,7 +368,7 @@ rote compile examples/bdr-outreach/skill --out /tmp/bdr-compiled
|
|
|
190
368
|
|
|
191
369
|
On that skill the compiler produces a 22-node IR that's **78.9%
|
|
192
370
|
codifiable** (15 of 19 non-gate nodes), extracts 5 Python modules and 2
|
|
193
|
-
typed judge signatures, and flags
|
|
371
|
+
typed judge signatures, and flags 3 mandatory nodes and 3 HITL gates,
|
|
194
372
|
all in ~13 minutes for ~$0.70 (Sonnet via Claude Code). Along the way it
|
|
195
373
|
independently lifts the three MANDATORY exclusion checks out of prose,
|
|
196
374
|
pulls four batch-size constants out of prompt text, and models a
|
|
@@ -285,7 +463,7 @@ through your API credentials.
|
|
|
285
463
|
- **`rote config`**: print every configurable default with its
|
|
286
464
|
effective value *and the layer that set it*. Resolution everywhere is
|
|
287
465
|
`flag > ROTE_* env (ROTE_RUNTIME, ROTE_DEPLOY, ROTE_AGENT,
|
|
288
|
-
ROTE_MODEL) > project rote.yaml > user config > built-in`. Config
|
|
466
|
+
ROTE_MODEL, ROTE_EFFORT) > project rote.yaml > user config > built-in`. Config
|
|
289
467
|
files are strict: a typo'd key or value is a loud error, never a
|
|
290
468
|
silent fallback. `--json` for automation.
|
|
291
469
|
- **`rote eval <compiled>`**: render the before/after scorecard (wall
|
|
@@ -326,6 +504,11 @@ way, prefer the more deterministic kind.
|
|
|
326
504
|
Pick with `--runtime`; the same IR drives all of them. Under
|
|
327
505
|
`--backend api`, none of the emitted code references MCP: the
|
|
328
506
|
crystallization step replaces tool calls with direct vendor API calls.
|
|
507
|
+
The compiler agent gets web search and fetch tools for that, writes each
|
|
508
|
+
call from the vendor's current reference page, and cites the page as
|
|
509
|
+
`# docs: <url>`; `compile-report.md` lists every cited page beside
|
|
510
|
+
whether the agent fetched it during the compile. The api backend's calls
|
|
511
|
+
are Python, so it needs a Python runtime (`dbos`, `python`, `temporal`).
|
|
329
512
|
Under the default `--backend mcp`, tool-using nodes emit a working MCP
|
|
330
513
|
client call (with durable park-on-auth on every MCP-capable runtime);
|
|
331
514
|
see [`docs/mcp-client.md`](docs/mcp-client.md).
|
|
@@ -369,6 +552,8 @@ subscription path.
|
|
|
369
552
|
|
|
370
553
|
## How it differs from other tools
|
|
371
554
|
|
|
555
|
+
For a side-by-side with calcifier, skill-to-workflow, Claude Code dynamic workflows, and hand-written workflows, see [docs/comparison.md](docs/comparison.md).
|
|
556
|
+
|
|
372
557
|
- **vs. raw durable engines (Temporal / Cloudflare / Inngest / Restate):**
|
|
373
558
|
they give you the workflow *runtime*; they don't help you decide *what
|
|
374
559
|
should be a workflow*. `rote` is the missing step that turns a working
|
|
@@ -387,16 +572,17 @@ subscription path.
|
|
|
387
572
|
## Status
|
|
388
573
|
|
|
389
574
|
`rote` is **pre-1.0**. The end-to-end flow works on the BDR example. The
|
|
390
|
-
fast suite (`pytest tests/`) makes no real API calls
|
|
391
|
-
on every push
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
Known gaps:
|
|
399
|
-
|
|
575
|
+
fast suite (`pytest tests/`) makes no real API calls, spends no tokens,
|
|
576
|
+
and runs on every push. CI also runs every `slow`-marked e2e suite on
|
|
577
|
+
every push: DBOS over SQLite, the MCP server over real stdio, the
|
|
578
|
+
TypeScript targets via `tsc --noEmit` and live dev servers (Cloudflare
|
|
579
|
+
`wrangler dev`, the Inngest dev server), and DBOS TypeScript against a
|
|
580
|
+
Docker Postgres. Locally, `pytest tests/ -m slow` runs them; they need a
|
|
581
|
+
Node toolchain and Docker.
|
|
582
|
+
|
|
583
|
+
Known gaps: extracted modules that need a vendor API client (HubSpot,
|
|
584
|
+
ZoomInfo, and so on) come out as `NotImplementedError` stubs you fill in,
|
|
585
|
+
and a Restate adapter is planned.
|
|
400
586
|
Published on
|
|
401
587
|
PyPI as [`rote-cli`](https://pypi.org/project/rote-cli/) via tag-driven
|
|
402
588
|
Trusted Publishing ([docs/releasing.md](docs/releasing.md)).
|
|
@@ -416,7 +602,7 @@ measure your own workflow instead of reading someone else's, use
|
|
|
416
602
|
```
|
|
417
603
|
rote/
|
|
418
604
|
├── docs/ agent-runtime · mcp-client · mcp-trigger · releasing
|
|
419
|
-
├── skills/rote-compile/ the compiler agent (SKILL.md +
|
|
605
|
+
├── skills/rote-compile/ the compiler agent (SKILL.md + 6 reference files)
|
|
420
606
|
├── src/rote/
|
|
421
607
|
│ ├── cli.py rote compile / emit / eval / serve
|
|
422
608
|
│ ├── ir.py Pydantic IR models + load_pipeline
|
|
@@ -424,6 +610,7 @@ rote/
|
|
|
424
610
|
│ └── adapters/ dbos · temporal · python · cloudflare · dbos_ts · inngest
|
|
425
611
|
│ (+ _common / _py_common / _ts_common emit helpers)
|
|
426
612
|
├── examples/
|
|
613
|
+
│ ├── expense-audit/ free first run: working extracted code · fan-out · HITL gate
|
|
427
614
|
│ ├── bdr-outreach/ canonical: all 5 node kinds · IR baseline · run snapshots
|
|
428
615
|
│ ├── ops-report/ 100% roteness: zero LLM nodes + a HITL gate
|
|
429
616
|
│ ├── deal-monitor/ data-heavy: parallel waves · fan-out judges · template render
|
|
@@ -445,12 +632,16 @@ rote/
|
|
|
445
632
|
emitted code uses under `--backend mcp`: endpoint/credential
|
|
446
633
|
resolution and durable park-on-auth across every MCP-capable runtime
|
|
447
634
|
- [`docs/mcp-trigger.md`](docs/mcp-trigger.md): `rote register` +
|
|
448
|
-
`rote serve`: compiled pipelines as MCP tools (FastMCP
|
|
635
|
+
`rote serve`: compiled pipelines as MCP tools (FastMCP 4.x)
|
|
449
636
|
- [`docs/releasing.md`](docs/releasing.md): tag-driven PyPI Trusted
|
|
450
637
|
Publishing
|
|
451
638
|
- [`skills/rote-compile/`](skills/rote-compile/): the compiler's
|
|
452
|
-
`SKILL.md` and its
|
|
453
|
-
heuristics, IR schema, LLM-judge extraction
|
|
639
|
+
`SKILL.md` and its six rubric files (node kinds, crystallization
|
|
640
|
+
heuristics, IR schema, LLM-judge extraction, implementation, eval
|
|
641
|
+
estimates)
|
|
642
|
+
- [`examples/expense-audit/`](examples/expense-audit/): the free first
|
|
643
|
+
run: a hand-compiled pipeline with working extracted code that
|
|
644
|
+
`rote run` completes on python, dbos, and temporal with no credentials
|
|
454
645
|
- [`examples/bdr-outreach/`](examples/bdr-outreach/): the canonical
|
|
455
646
|
skill, its ground-truth IR, and snapshotted real compiler runs
|
|
456
647
|
- [`examples/ops-report/`](examples/ops-report/): the 100%-roteness
|