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.
Files changed (173) hide show
  1. {rote_cli-0.14.0 → rote_cli-0.16.0}/LICENSE +12 -11
  2. rote_cli-0.14.0/README.md → rote_cli-0.16.0/PKG-INFO +217 -26
  3. rote_cli-0.14.0/PKG-INFO → rote_cli-0.16.0/README.md +154 -82
  4. rote_cli-0.16.0/examples/expense-audit/README.md +157 -0
  5. rote_cli-0.16.0/examples/expense-audit/eval-input.json +199 -0
  6. rote_cli-0.16.0/examples/expense-audit/expected/eval.yaml +60 -0
  7. rote_cli-0.16.0/examples/expense-audit/expected/extracted/audit.py +171 -0
  8. rote_cli-0.16.0/examples/expense-audit/expected/extracted/checks.py +71 -0
  9. rote_cli-0.16.0/examples/expense-audit/expected/extracted/fx.py +62 -0
  10. rote_cli-0.16.0/examples/expense-audit/expected/extracted/report.py +186 -0
  11. rote_cli-0.16.0/examples/expense-audit/expected/pipeline-draft.yaml +242 -0
  12. rote_cli-0.16.0/examples/expense-audit/expected/pipeline.yaml +269 -0
  13. rote_cli-0.16.0/examples/expense-audit/fidelity/cases.yaml +68 -0
  14. rote_cli-0.16.0/examples/expense-audit/fidelity/reference.json +793 -0
  15. rote_cli-0.16.0/examples/expense-audit/input.json +21 -0
  16. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/compile-metrics.json +17 -0
  17. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/compile-report.md +220 -0
  18. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/eval.yaml +84 -0
  19. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/checks.py +94 -0
  20. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/fx.py +100 -0
  21. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/policy.py +92 -0
  22. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/report.py +145 -0
  23. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/save.py +51 -0
  24. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/pipeline.yaml +382 -0
  25. rote_cli-0.16.0/examples/expense-audit/runs/2026-10-18-first-agent-run/provenance.json +49 -0
  26. rote_cli-0.16.0/examples/expense-audit/scorecard.md +82 -0
  27. rote_cli-0.16.0/examples/expense-audit/skill/SKILL.md +94 -0
  28. rote_cli-0.16.0/examples/expense-audit/skill/references/expense-policy.md +48 -0
  29. rote_cli-0.16.0/examples/expense-audit/skill/references/fx-rates.md +30 -0
  30. rote_cli-0.16.0/examples/expense-audit/skill/references/report-format.md +43 -0
  31. rote_cli-0.16.0/examples/expense-audit/skill/sample-input.json +25 -0
  32. {rote_cli-0.14.0 → rote_cli-0.16.0}/pyproject.toml +39 -8
  33. rote_cli-0.16.0/skills/rote-compile/GENERATE.md +168 -0
  34. {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/SKILL.md +121 -35
  35. rote_cli-0.16.0/skills/rote-compile/SYSTEM1.md +105 -0
  36. {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/crystallization-heuristics.md +28 -10
  37. rote_cli-0.16.0/skills/rote-compile/references/implementation.md +428 -0
  38. {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/ir-schema.md +131 -7
  39. {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/llm-judge-extraction.md +72 -9
  40. {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/node-kinds.md +11 -1
  41. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/__init__.py +1 -1
  42. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/_dbos.py +16 -15
  43. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/__init__.py +2 -2
  44. rote_cli-0.16.0/src/rote/adapters/_common.py +1140 -0
  45. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/_py_common.py +648 -37
  46. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/_ts_common.py +1351 -234
  47. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/cloudflare.py +95 -56
  48. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/dbos.py +203 -86
  49. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/dbos_ts.py +139 -74
  50. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/inngest.py +104 -49
  51. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/python.py +88 -114
  52. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/adapters/temporal.py +93 -18
  53. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/app_registry.py +3 -2
  54. rote_cli-0.16.0/src/rote/bench/__init__.py +13 -0
  55. rote_cli-0.16.0/src/rote/bench/collect.py +375 -0
  56. rote_cli-0.16.0/src/rote/bench/fidelity.py +828 -0
  57. rote_cli-0.16.0/src/rote/bench/fidelity_score.py +632 -0
  58. rote_cli-0.16.0/src/rote/bench/fixture_mcp.py +138 -0
  59. rote_cli-0.16.0/src/rote/bench/http_fixtures.py +186 -0
  60. rote_cli-0.16.0/src/rote/bench/report.py +279 -0
  61. rote_cli-0.16.0/src/rote/bench/runner.py +776 -0
  62. rote_cli-0.16.0/src/rote/bench/score.py +776 -0
  63. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/cli.py +1591 -197
  64. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/cloud_auth.py +2 -3
  65. rote_cli-0.16.0/src/rote/compiler/__init__.py +1509 -0
  66. rote_cli-0.16.0/src/rote/compiler/_prefix_runner.py +329 -0
  67. rote_cli-0.16.0/src/rote/compiler/api_docs.py +432 -0
  68. rote_cli-0.16.0/src/rote/compiler/backend.py +59 -0
  69. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/__init__.py +71 -2
  70. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/_fs_tools.py +77 -31
  71. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/anthropic_api.py +394 -33
  72. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/claude.py +452 -64
  73. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/codex.py +105 -3
  74. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/openai_api.py +128 -40
  75. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/events.py +4 -0
  76. rote_cli-0.16.0/src/rote/compiler/grounding.py +740 -0
  77. rote_cli-0.16.0/src/rote/compiler/prefix.py +467 -0
  78. rote_cli-0.16.0/src/rote/compiler/provenance.py +721 -0
  79. rote_cli-0.16.0/src/rote/compiler/report.py +282 -0
  80. rote_cli-0.16.0/src/rote/compiler/sandbox.py +325 -0
  81. rote_cli-0.16.0/src/rote/compiler/system1/__init__.py +411 -0
  82. rote_cli-0.16.0/src/rote/compiler/system1/checker.py +110 -0
  83. rote_cli-0.16.0/src/rote/compiler/system1/decide.py +1127 -0
  84. rote_cli-0.16.0/src/rote/compiler/system1/decision_model.py +500 -0
  85. rote_cli-0.16.0/src/rote/compiler/system1/enforce.py +329 -0
  86. rote_cli-0.16.0/src/rote/compiler/system1/evidence.py +117 -0
  87. rote_cli-0.16.0/src/rote/compiler/system1/generate.py +1786 -0
  88. rote_cli-0.16.0/src/rote/compiler/system1/lane_call.py +238 -0
  89. rote_cli-0.16.0/src/rote/compiler/system1/parse.py +632 -0
  90. rote_cli-0.16.0/src/rote/compiler/system1/skeleton.py +437 -0
  91. rote_cli-0.16.0/src/rote/compiler/system1/structure.py +1886 -0
  92. rote_cli-0.16.0/src/rote/compiler/system1/tiebreak.py +430 -0
  93. rote_cli-0.16.0/src/rote/compiler/tool_grounding.py +792 -0
  94. rote_cli-0.16.0/src/rote/compiler/verify.py +1126 -0
  95. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/config.py +72 -4
  96. rote_cli-0.16.0/src/rote/contracts.py +667 -0
  97. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/baseline.py +11 -3
  98. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/empirical.py +200 -23
  99. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/estimate.py +59 -3
  100. rote_cli-0.16.0/src/rote/eval/infra_pricing.py +298 -0
  101. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/pricing.py +98 -4
  102. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/priors.py +23 -0
  103. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/scorecard.py +148 -7
  104. rote_cli-0.16.0/src/rote/examples.py +184 -0
  105. rote_cli-0.16.0/src/rote/extras.py +138 -0
  106. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/inference/__init__.py +10 -0
  107. rote_cli-0.16.0/src/rote/inference/_runtime_helper.py +1892 -0
  108. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/init_wizard.py +46 -3
  109. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/ir.py +533 -15
  110. rote_cli-0.16.0/src/rote/isolation.py +75 -0
  111. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/__init__.py +1 -3
  112. rote_cli-0.16.0/src/rote/mcp/_runtime_helper.py +881 -0
  113. rote_cli-0.16.0/src/rote/mcp/auth.py +864 -0
  114. rote_cli-0.16.0/src/rote/mcp/client_metadata.json +20 -0
  115. rote_cli-0.16.0/src/rote/mcp/learned.py +168 -0
  116. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/live_tools.py +27 -26
  117. rote_cli-0.16.0/src/rote/mcp/parked.py +626 -0
  118. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/registry.py +66 -26
  119. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/release.py +69 -37
  120. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/mcp/tokens.py +61 -16
  121. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/probe.py +29 -6
  122. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/__init__.py +169 -10
  123. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/_node.py +2 -2
  124. rote_cli-0.16.0/src/rote/runners/cloudflare.py +326 -0
  125. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/dbos_ts.py +60 -10
  126. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/inngest.py +60 -6
  127. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/runners/temporal.py +21 -11
  128. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/serve/backends.py +8 -12
  129. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/serve/registry.py +51 -2
  130. rote_cli-0.16.0/src/rote/serve/server.py +690 -0
  131. rote_cli-0.16.0/src/rote/tool_schema.py +199 -0
  132. rote_cli-0.16.0/src/rote/vendor_specs/__init__.py +23 -0
  133. rote_cli-0.16.0/src/rote/vendor_specs/check.py +995 -0
  134. rote_cli-0.16.0/src/rote/vendor_specs/deps.py +210 -0
  135. rote_cli-0.16.0/src/rote/vendor_specs/docs.py +223 -0
  136. rote_cli-0.16.0/src/rote/vendor_specs/extract.py +1012 -0
  137. rote_cli-0.16.0/src/rote/vendor_specs/fake.py +208 -0
  138. rote_cli-0.16.0/src/rote/vendor_specs/fixture_store.py +91 -0
  139. rote_cli-0.16.0/src/rote/vendor_specs/fixtures.py +127 -0
  140. rote_cli-0.16.0/src/rote/vendor_specs/google.py +249 -0
  141. rote_cli-0.16.0/src/rote/vendor_specs/graphql.py +385 -0
  142. rote_cli-0.16.0/src/rote/vendor_specs/intercept/sitecustomize.py +219 -0
  143. rote_cli-0.16.0/src/rote/vendor_specs/live.py +880 -0
  144. rote_cli-0.16.0/src/rote/vendor_specs/model.py +203 -0
  145. rote_cli-0.16.0/src/rote/vendor_specs/openapi.py +380 -0
  146. rote_cli-0.16.0/src/rote/vendor_specs/psl.py +90 -0
  147. rote_cli-0.16.0/src/rote/vendor_specs/public_suffix_list.dat +16559 -0
  148. rote_cli-0.16.0/src/rote/vendor_specs/schema.py +80 -0
  149. rote_cli-0.16.0/src/rote/vendor_specs/store.py +274 -0
  150. rote_cli-0.16.0/src/rote/xdg.py +39 -0
  151. rote_cli-0.14.0/skills/rote-compile/references/implementation.md +0 -109
  152. rote_cli-0.14.0/src/rote/adapters/_common.py +0 -541
  153. rote_cli-0.14.0/src/rote/compiler/__init__.py +0 -778
  154. rote_cli-0.14.0/src/rote/contracts.py +0 -330
  155. rote_cli-0.14.0/src/rote/inference/_runtime_helper.py +0 -914
  156. rote_cli-0.14.0/src/rote/mcp/_runtime_helper.py +0 -378
  157. rote_cli-0.14.0/src/rote/mcp/auth.py +0 -166
  158. rote_cli-0.14.0/src/rote/runners/cloudflare.py +0 -172
  159. rote_cli-0.14.0/src/rote/serve/server.py +0 -339
  160. {rote_cli-0.14.0 → rote_cli-0.16.0}/.gitignore +0 -0
  161. {rote_cli-0.14.0 → rote_cli-0.16.0}/skills/rote-compile/references/eval-estimates.md +0 -0
  162. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/__main__.py +0 -0
  163. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/cloud_compile.py +0 -0
  164. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/drivers/_heartbeat.py +0 -0
  165. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/compiler/update.py +0 -0
  166. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/deploy.py +0 -0
  167. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/deploy_rote_cloud.py +0 -0
  168. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/__init__.py +0 -0
  169. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/sidecar.py +0 -0
  170. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/eval/tokens.py +0 -0
  171. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/py.typed +0 -0
  172. {rote_cli-0.14.0 → rote_cli-0.16.0}/src/rote/serve/__init__.py +0 -0
  173. {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 describing the origin of the Work and
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 accept and charge a
167
- fee for acceptance of support, warranty, indemnity, or other liability
168
- obligations and/or rights consistent with this License. However, in
169
- accepting such obligations, You may act only on Your own behalf and on
170
- Your sole responsibility, not on behalf of any other Contributor, and
171
- only if You agree to indemnify, defend, and hold each Contributor
172
- harmless for any liability incurred by, or claims asserted against,
173
- such Contributor by reason of your accepting any such warranty or
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. An LLM agent (itself
100
- defined as a skill) reads the source skill, applies a structured
101
- compilation rubric, and emits a runtime-agnostic intermediate
102
- representation (`pipeline.yaml`), extracted Python modules for the
103
- deterministic parts, typed signature stubs for the LLM-judge parts, and
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` + four reference files). This is the
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. A second skill, `/rote:serve`, wires compiled
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` while
178
- > the CLI command and import name stay `rote`, hence
179
- > `uvx --from rote-cli rote ...`. See [docs/releasing.md](docs/releasing.md).
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 4 mandatory nodes and 3 HITL gates,
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 and is what CI runs
391
- on every push, alongside a Python e2e (DBOS over SQLite + the MCP server
392
- over real stdio). Each adapter also has a `slow`-marked e2e that runs its
393
- emitted code against the real runtime (Temporal's time-skipping server,
394
- the TypeScript targets via `tsc --noEmit` and live dev servers, the
395
- plain-Python subprocess); those need a Node toolchain / Docker, so they
396
- run locally with `pytest tests/ -m slow`, not in CI.
397
-
398
- Known gaps: the extracted modules are `NotImplementedError` stubs
399
- you fill in with real API-client code, and a Restate adapter is planned.
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 + 4 reference files)
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 3.x)
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 four rubric files (node kinds, crystallization
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