@rulemetric/cli 0.13.0 → 0.14.1

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 (335) hide show
  1. package/dist/base-command.js +1 -1
  2. package/dist/chunk-2UK4DZFW.js +12 -0
  3. package/dist/{chunk-3UPHCQWI.js → chunk-35YVHBLL.js} +1 -1
  4. package/dist/{chunk-VH2EAP4J.js → chunk-3FNTV2TW.js} +1 -1
  5. package/dist/{chunk-WQX4RRBQ.js → chunk-3IMRLHJJ.js} +1 -1
  6. package/dist/chunk-42A4PUW7.js +48 -0
  7. package/dist/chunk-43VKTVM3.js +1 -0
  8. package/dist/{chunk-CYYDQFRY.js → chunk-44TYRMIS.js} +1 -1
  9. package/dist/{chunk-25RDT32M.js → chunk-4FJYVYCU.js} +1 -1
  10. package/dist/{chunk-I3M5VBLT.js → chunk-5BT375C7.js} +1 -1
  11. package/dist/{chunk-7AWFSFR7.js → chunk-5Z3H5JHK.js} +1 -1
  12. package/dist/{chunk-25Q3Y7TC.js → chunk-6ANODRDT.js} +1 -1
  13. package/dist/{chunk-APDRR6FS.js → chunk-76UKAFNM.js} +1 -1
  14. package/dist/{chunk-VXUKXGRX.js → chunk-7MTYUTUN.js} +2 -2
  15. package/dist/{chunk-JWFRI32Y.js → chunk-AGEZAKCC.js} +1 -1
  16. package/dist/chunk-AHLVY52I.js +1 -0
  17. package/dist/{chunk-MNQPCNGQ.js → chunk-AIYFT4P6.js} +1 -1
  18. package/dist/{chunk-UYPBIXF2.js → chunk-B5X6HCBK.js} +1 -1
  19. package/dist/chunk-BAITMD76.js +1 -0
  20. package/dist/{chunk-GJBS6QYC.js → chunk-BFQVAU6N.js} +1 -1
  21. package/dist/{chunk-UE76F2NQ.js → chunk-BMT5WMEV.js} +20 -20
  22. package/dist/chunk-CT6GJQIR.js +1 -0
  23. package/dist/chunk-CT7FWSIU.js +3 -0
  24. package/dist/chunk-DHX4U6EC.js +13 -0
  25. package/dist/chunk-DQYYHX6K.js +1 -0
  26. package/dist/{chunk-WH3IPXXQ.js → chunk-DVU5PHPM.js} +5 -5
  27. package/dist/chunk-E7GQJML3.js +1 -0
  28. package/dist/{chunk-4N43IBXH.js → chunk-EMLLGASZ.js} +1 -1
  29. package/dist/{chunk-Y7QIOPN5.js → chunk-EUHRTEVJ.js} +1 -1
  30. package/dist/chunk-FBSZ6KCM.js +1 -0
  31. package/dist/{chunk-5XK6LB2T.js → chunk-FKTT7A4H.js} +1 -1
  32. package/dist/{chunk-V2USQH27.js → chunk-FYZ6HHCV.js} +1 -1
  33. package/dist/chunk-GH4EZK2O.js +1 -0
  34. package/dist/{chunk-DUBBL57L.js → chunk-GKVHFXUQ.js} +1 -1
  35. package/dist/chunk-GPBN4ROE.js +2 -0
  36. package/dist/chunk-GYNZ3OZF.js +1 -0
  37. package/dist/chunk-H6FVXVGG.js +1 -0
  38. package/dist/{chunk-6GAIYJ6K.js → chunk-HNYHZO2J.js} +1 -1
  39. package/dist/{chunk-RJX75Y7J.js → chunk-I6ZQOMZS.js} +1 -1
  40. package/dist/{chunk-O2HCD6XL.js → chunk-IO46ICZY.js} +1 -1
  41. package/dist/chunk-IQEZ3T5A.js +1 -0
  42. package/dist/{chunk-KV5A77XW.js → chunk-ISFPPDDB.js} +1 -1
  43. package/dist/chunk-J4W6GNCF.js +2 -0
  44. package/dist/chunk-JP6ULOEX.js +2 -0
  45. package/dist/{chunk-J6QMBMC2.js → chunk-JTYVBR5H.js} +1 -1
  46. package/dist/{chunk-BG55WDDX.js → chunk-KOYHJFB3.js} +1 -1
  47. package/dist/chunk-LJRJ2RAC.js +4 -0
  48. package/dist/chunk-MHVHGKDK.js +3 -0
  49. package/dist/{chunk-PVGUDJD7.js → chunk-MMLRWCBW.js} +1 -1
  50. package/dist/chunk-MMM4B3KH.js +1 -0
  51. package/dist/{chunk-ZGW3N3A6.js → chunk-MU7KKU3O.js} +1 -1
  52. package/dist/{chunk-YI2OWO6R.js → chunk-MXHAXY66.js} +1 -1
  53. package/dist/chunk-N4YPDZJF.js +9 -0
  54. package/dist/{chunk-VIQ25ORK.js → chunk-NYNHX7OX.js} +1 -1
  55. package/dist/{chunk-RK663O4M.js → chunk-OP4U3XBZ.js} +6 -6
  56. package/dist/{chunk-6W2GSV4O.js → chunk-OVS7ZDJ4.js} +1 -1
  57. package/dist/chunk-PIVEJTNF.js +1 -0
  58. package/dist/chunk-POEMCITL.js +1 -0
  59. package/dist/chunk-PPAHIVG5.js +1 -0
  60. package/dist/{chunk-NBEZ5FAU.js → chunk-Q36QSFSB.js} +1 -1
  61. package/dist/chunk-Q776YUBD.js +1 -0
  62. package/dist/chunk-QAMHZY2P.js +1 -0
  63. package/dist/chunk-QI3FJKGK.js +1 -0
  64. package/dist/{chunk-WOJ733IB.js → chunk-QRIJ3AHP.js} +1 -1
  65. package/dist/chunk-RAQLVO2X.js +1 -0
  66. package/dist/{chunk-M2VVRQKA.js → chunk-RG3R4EAB.js} +1 -1
  67. package/dist/{chunk-WY3VVX3R.js → chunk-RMRVUI7B.js} +1 -1
  68. package/dist/{chunk-GBWQENAH.js → chunk-RXZLBSDO.js} +1 -1
  69. package/dist/chunk-SCQK52SL.js +1 -0
  70. package/dist/{chunk-BZS5QRWB.js → chunk-SG4UDDHB.js} +1 -1
  71. package/dist/chunk-SWSOEYC7.js +1 -0
  72. package/dist/chunk-T75KAEJO.js +25 -0
  73. package/dist/{chunk-U7TBEC3I.js → chunk-V55ROUNP.js} +1 -1
  74. package/dist/{chunk-SHYP27B7.js → chunk-VALRPZXH.js} +1 -1
  75. package/dist/{chunk-P2WSDHIA.js → chunk-VIFOLTZT.js} +1 -1
  76. package/dist/{chunk-6QLZT7EP.js → chunk-VU24IH5S.js} +1 -1
  77. package/dist/{chunk-6ZPSVZNH.js → chunk-VXL5H3VZ.js} +1 -1
  78. package/dist/{chunk-QFKUSNUB.js → chunk-W23OYQXI.js} +1 -1
  79. package/dist/{chunk-QTCWOIT4.js → chunk-WWQWHC4K.js} +1 -1
  80. package/dist/{chunk-LTQ5BJYL.js → chunk-XGMOVQ5G.js} +1 -1
  81. package/dist/{chunk-4COLIGD7.js → chunk-XJ25HFIT.js} +1 -1
  82. package/dist/{chunk-3MDEGOUG.js → chunk-XMA6SWOT.js} +1 -1
  83. package/dist/{chunk-WJZY5Y22.js → chunk-XMTKP74H.js} +1 -1
  84. package/dist/chunk-XQYAVSUQ.js +1 -0
  85. package/dist/{chunk-2EX27VJ3.js → chunk-YK2IEHLB.js} +1 -1
  86. package/dist/chunk-ZK3ACE4T.js +1 -0
  87. package/dist/commands/antigravity/backfill.js +1 -1
  88. package/dist/commands/auth/create-key.js +1 -1
  89. package/dist/commands/auth/login.js +1 -1
  90. package/dist/commands/auth/logout.js +1 -1
  91. package/dist/commands/auth/revoke-key.js +1 -1
  92. package/dist/commands/auth/signup.js +1 -1
  93. package/dist/commands/auth/status.js +1 -1
  94. package/dist/commands/capture/scope.js +1 -1
  95. package/dist/commands/catalog/index.js +1 -1
  96. package/dist/commands/catalog/recommend.js +1 -1
  97. package/dist/commands/crons/list.js +1 -1
  98. package/dist/commands/crons/run.js +2 -2
  99. package/dist/commands/dashboard.js +1 -1
  100. package/dist/commands/diagnostics.js +1 -1
  101. package/dist/commands/eval-targets/create.js +1 -1
  102. package/dist/commands/eval-targets/list.js +1 -1
  103. package/dist/commands/evals/agent.js +3 -3
  104. package/dist/commands/evals/auto-run.js +1 -1
  105. package/dist/commands/evals/benchmark.js +1 -1
  106. package/dist/commands/evals/compare.js +1 -1
  107. package/dist/commands/evals/create.js +1 -1
  108. package/dist/commands/evals/optimize-description.js +1 -1
  109. package/dist/commands/evals/optimize.js +1 -1
  110. package/dist/commands/evals/refine-cases.js +1 -1
  111. package/dist/commands/evals/run.js +1 -1
  112. package/dist/commands/evals/validate-judge.js +1 -1
  113. package/dist/commands/experiments/list.js +1 -1
  114. package/dist/commands/gateway/ensure.js +1 -1
  115. package/dist/commands/hooks/emit-instructions.js +1 -1
  116. package/dist/commands/hooks/install.js +1 -1
  117. package/dist/commands/hooks/run.js +1 -1
  118. package/dist/commands/hooks/uninstall.js +1 -1
  119. package/dist/commands/instructions/create.js +1 -1
  120. package/dist/commands/instructions/dedupe.js +1 -1
  121. package/dist/commands/instructions/delete.js +1 -1
  122. package/dist/commands/instructions/fork.js +1 -1
  123. package/dist/commands/instructions/get.js +1 -1
  124. package/dist/commands/instructions/list.js +1 -1
  125. package/dist/commands/instructions/promote.js +1 -1
  126. package/dist/commands/instructions/pull.js +1 -1
  127. package/dist/commands/instructions/restore.js +1 -1
  128. package/dist/commands/instructions/retract.js +1 -1
  129. package/dist/commands/instructions/upstream.js +1 -1
  130. package/dist/commands/instructions/versions.js +1 -1
  131. package/dist/commands/launcher.js +1 -1
  132. package/dist/commands/local/down.js +1 -1
  133. package/dist/commands/local/up.js +1 -1
  134. package/dist/commands/org/current.js +1 -1
  135. package/dist/commands/org/list.js +1 -1
  136. package/dist/commands/org/switch.js +1 -1
  137. package/dist/commands/packs/add-instruction.js +1 -1
  138. package/dist/commands/packs/apply.js +1 -1
  139. package/dist/commands/packs/create.js +1 -1
  140. package/dist/commands/packs/fork.js +1 -1
  141. package/dist/commands/packs/get.js +1 -1
  142. package/dist/commands/packs/list.js +1 -1
  143. package/dist/commands/packs/remove-instruction.js +1 -1
  144. package/dist/commands/proxy/env.js +1 -1
  145. package/dist/commands/proxy/logs.js +1 -1
  146. package/dist/commands/proxy/restart.js +1 -1
  147. package/dist/commands/proxy/setup.js +1 -1
  148. package/dist/commands/proxy/start.js +1 -1
  149. package/dist/commands/proxy/status.js +1 -1
  150. package/dist/commands/proxy/stop.js +1 -1
  151. package/dist/commands/research/backfill.js +1 -1
  152. package/dist/commands/research/tail-transcript.js +1 -1
  153. package/dist/commands/service/install.js +18 -18
  154. package/dist/commands/service/status.js +1 -1
  155. package/dist/commands/service/uninstall.js +1 -1
  156. package/dist/commands/sessions/analyze.js +1 -1
  157. package/dist/commands/sessions/delete.js +1 -1
  158. package/dist/commands/sessions/end.js +1 -1
  159. package/dist/commands/sessions/import.js +1 -1
  160. package/dist/commands/sessions/list.js +1 -1
  161. package/dist/commands/sessions/start.js +1 -1
  162. package/dist/commands/setup.js +1 -1
  163. package/dist/commands/skills/export-approved.js +1 -1
  164. package/dist/commands/skills/install.js +1 -1
  165. package/dist/commands/skills/list.js +1 -1
  166. package/dist/commands/skills/publish.js +1 -1
  167. package/dist/commands/skills/search.js +1 -1
  168. package/dist/commands/skills/update.js +1 -1
  169. package/dist/commands/suggestions/accept.js +1 -1
  170. package/dist/commands/suggestions/auto.js +1 -1
  171. package/dist/commands/suggestions/dismiss.js +1 -1
  172. package/dist/commands/suggestions/list.js +1 -1
  173. package/dist/commands/suggestions/refresh.js +1 -1
  174. package/dist/commands/suggestions/undo.js +1 -1
  175. package/dist/dashboard/Dashboard.js +1 -1
  176. package/dist/dashboard/data.js +1 -1
  177. package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
  178. package/dist/dashboard/launcher/api.js +1 -1
  179. package/dist/dashboard/launcher/useLaunchJobs.js +1 -1
  180. package/dist/dashboard/panels/measurement.js +1 -0
  181. package/dist/dist-GSHUC7UU.js +1 -0
  182. package/dist/harbor/cost_delta.py +377 -0
  183. package/dist/harbor/mcp_container_shell.py +156 -0
  184. package/dist/harbor/provenance.py +361 -0
  185. package/dist/harbor/rm-batch-task/environment/Dockerfile +6 -0
  186. package/dist/harbor/rm-batch-task/environment/items.jsonl +60 -0
  187. package/dist/harbor/rm-batch-task/inject.md +8 -0
  188. package/dist/harbor/rm-batch-task/instruction.md +8 -0
  189. package/dist/harbor/rm-batch-task/solution/solve.sh +68 -0
  190. package/dist/harbor/rm-batch-task/task.toml +30 -0
  191. package/dist/harbor/rm-batch-task/tests/test.sh +23 -0
  192. package/dist/harbor/rm-batch-task/tests/test_outputs.py +32 -0
  193. package/dist/harbor/rm-locality-task/environment/Dockerfile +8 -0
  194. package/dist/harbor/rm-locality-task/environment/workspace/deploy/prod/ingest.yaml +3 -0
  195. package/dist/harbor/rm-locality-task/environment/workspace/deploy/staging/ingest.yaml +3 -0
  196. package/dist/harbor/rm-locality-task/environment/workspace/docs/architecture/ingest.md +6 -0
  197. package/dist/harbor/rm-locality-task/environment/workspace/legacy/ingest_v1/config.yaml +2 -0
  198. package/dist/harbor/rm-locality-task/environment/workspace/packages/shared/defaults.py +4 -0
  199. package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.defaults.yaml +4 -0
  200. package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.yaml +3 -0
  201. package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/loader.py +15 -0
  202. package/dist/harbor/rm-locality-task/environment/workspace/tests/fixtures/ingest_config.yaml +3 -0
  203. package/dist/harbor/rm-locality-task/inject.md +12 -0
  204. package/dist/harbor/rm-locality-task/instruction.md +4 -0
  205. package/dist/harbor/rm-locality-task/solution/solve.sh +14 -0
  206. package/dist/harbor/rm-locality-task/task.toml +30 -0
  207. package/dist/harbor/rm-locality-task/tests/test.sh +23 -0
  208. package/dist/harbor/rm-locality-task/tests/test_outputs.py +19 -0
  209. package/dist/harbor/rm-migrations-task/environment/Dockerfile +7 -0
  210. package/dist/harbor/rm-migrations-task/environment/applied.txt +2 -0
  211. package/dist/harbor/rm-migrations-task/environment/migrations/00001_init.sql +1 -0
  212. package/dist/harbor/rm-migrations-task/environment/migrations/00002_add_email.sql +1 -0
  213. package/dist/harbor/rm-migrations-task/inject.md +7 -0
  214. package/dist/harbor/rm-migrations-task/instruction.md +8 -0
  215. package/dist/harbor/rm-migrations-task/solution/solve.sh +8 -0
  216. package/dist/harbor/rm-migrations-task/task.toml +30 -0
  217. package/dist/harbor/rm-migrations-task/tests/test.sh +23 -0
  218. package/dist/harbor/rm-migrations-task/tests/test_outputs.py +36 -0
  219. package/dist/harbor/rm-pagination-task/environment/Dockerfile +6 -0
  220. package/dist/harbor/rm-pagination-task/environment/store.py +29 -0
  221. package/dist/harbor/rm-pagination-task/inject.md +8 -0
  222. package/dist/harbor/rm-pagination-task/instruction.md +5 -0
  223. package/dist/harbor/rm-pagination-task/solution/solve.sh +7 -0
  224. package/dist/harbor/rm-pagination-task/task.toml +30 -0
  225. package/dist/harbor/rm-pagination-task/tests/test.sh +23 -0
  226. package/dist/harbor/rm-pagination-task/tests/test_outputs.py +14 -0
  227. package/dist/harbor/rm_host_claude.py +264 -0
  228. package/dist/harbor/rm_host_codex.py +208 -0
  229. package/dist/harbor/run.sh +268 -0
  230. package/dist/harbor/summarize.py +248 -0
  231. package/dist/lib/active-org-refresh.js +1 -1
  232. package/dist/lib/agent-loop.js +1 -1
  233. package/dist/lib/antigravity-transcript.js +1 -1
  234. package/dist/lib/api-client.js +1 -1
  235. package/dist/lib/autorun-batch.js +1 -0
  236. package/dist/lib/capture-scope-config.js +1 -1
  237. package/dist/lib/codex-capture-scope.js +1 -1
  238. package/dist/lib/codex-exec.js +1 -1
  239. package/dist/lib/ensure-api-key.js +1 -1
  240. package/dist/lib/ensure-fresh-token.js +1 -1
  241. package/dist/lib/eval-accumulation.js +1 -0
  242. package/dist/lib/eval-analyzer.js +1 -1
  243. package/dist/lib/eval-benchmark.js +1 -1
  244. package/dist/lib/eval-candidate-run.js +1 -1
  245. package/dist/lib/eval-case-generator.js +1 -1
  246. package/dist/lib/eval-conversation-handler.js +1 -1
  247. package/dist/lib/eval-executor.js +1 -1
  248. package/dist/lib/eval-grader.js +1 -1
  249. package/dist/lib/eval-meta-judge.js +1 -1
  250. package/dist/lib/eval-resume.js +1 -1
  251. package/dist/lib/eval-run-batch.js +1 -1
  252. package/dist/lib/eval-trigger-tester.js +1 -1
  253. package/dist/lib/evolution-enrolment.js +1 -1
  254. package/dist/lib/harbor-readiness.js +1 -1
  255. package/dist/lib/hooks-capture-gate.js +1 -1
  256. package/dist/lib/insights/generation/installed-asks.js +1 -1
  257. package/dist/lib/insights/nomination/nominate.js +1 -1
  258. package/dist/lib/instruction-proposer.js +1 -1
  259. package/dist/lib/instruction-snapshot.js +1 -1
  260. package/dist/lib/instructions/acceptance/accept-events.js +1 -1
  261. package/dist/lib/instructions/acceptance/accept-hook.js +1 -1
  262. package/dist/lib/instructions/acceptance/agent-instruction-files.js +1 -1
  263. package/dist/lib/instructions/acceptance/hook-install.js +1 -1
  264. package/dist/lib/instructions/acceptance/reverse-applications.js +1 -1
  265. package/dist/lib/instructions/acceptance/suggestion-accept.js +1 -1
  266. package/dist/lib/jobs/handlers/cron-auto-accept-suggestions.js +1 -1
  267. package/dist/lib/jobs/handlers/cron-eval-autorun.js +1 -1
  268. package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
  269. package/dist/lib/jobs/handlers/cron-instruction-training.js +1 -1
  270. package/dist/lib/jobs/handlers/cron-reconcile-attribution.js +1 -1
  271. package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
  272. package/dist/lib/jobs/handlers/cron-refresh-pricing.js +1 -1
  273. package/dist/lib/jobs/handlers/cron-retire-unused-skills.js +1 -1
  274. package/dist/lib/jobs/handlers/cron-suggest-instructions.js +1 -1
  275. package/dist/lib/jobs/handlers/distill-memories.js +1 -1
  276. package/dist/lib/jobs/handlers/harbor-ab-verdict.js +1 -1
  277. package/dist/lib/jobs/handlers/harbor-ab.js +1 -1
  278. package/dist/lib/jobs/handlers/process-changelog.js +1 -1
  279. package/dist/lib/jobs/handlers/process-conversation.js +1 -1
  280. package/dist/lib/jobs/handlers/process-eval.js +1 -1
  281. package/dist/lib/jobs/handlers/process-insights.js +1 -1
  282. package/dist/lib/jobs/handlers/process-judge-review.js +1 -1
  283. package/dist/lib/jobs/handlers/process-launch.js +1 -1
  284. package/dist/lib/jobs/handlers/process-memory-ab.js +1 -1
  285. package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
  286. package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
  287. package/dist/lib/jobs/shed-retry.js +1 -1
  288. package/dist/lib/judge-review-runner.js +1 -1
  289. package/dist/lib/llm-client.js +1 -1
  290. package/dist/lib/llm-reply-parsers.js +1 -0
  291. package/dist/lib/manual-tasks.js +1 -1
  292. package/dist/lib/measurement-llm.js +1 -0
  293. package/dist/lib/pi-exec.js +1 -0
  294. package/dist/lib/projects/workspace/eval-workspace.js +1 -1
  295. package/dist/lib/projects/workspace/worktree.js +1 -1
  296. package/dist/lib/refine-cases.js +1 -1
  297. package/dist/lib/research-client.js +1 -1
  298. package/dist/lib/retraction.js +1 -1
  299. package/dist/lib/reviewer-detect.js +1 -1
  300. package/dist/lib/service-environment.js +1 -0
  301. package/dist/lib/setup-steps.js +1 -1
  302. package/dist/lib/telemetry.js +1 -1
  303. package/dist/lib/terminal-target-heartbeat.js +1 -1
  304. package/dist/lib/tool-cli-map.js +1 -0
  305. package/dist/lib/transcript-instruction-linking.js +1 -1
  306. package/dist/lib/transcript-sync.js +1 -1
  307. package/dist/lib/work-report.js +1 -1
  308. package/oclif.manifest.json +7 -1
  309. package/package.json +5 -4
  310. package/dist/chunk-4FSQSETR.js +0 -12
  311. package/dist/chunk-6WQG6C7F.js +0 -1
  312. package/dist/chunk-C42NTI2V.js +0 -3
  313. package/dist/chunk-F6DAHCJC.js +0 -20
  314. package/dist/chunk-GN3ZHQ46.js +0 -1
  315. package/dist/chunk-H3BCWSYO.js +0 -1
  316. package/dist/chunk-HLNHBZLI.js +0 -1
  317. package/dist/chunk-HLQZR4XJ.js +0 -13
  318. package/dist/chunk-J5HW45PZ.js +0 -48
  319. package/dist/chunk-JNFB22FD.js +0 -1
  320. package/dist/chunk-KCOJLTVX.js +0 -1
  321. package/dist/chunk-MLV2RHRE.js +0 -1
  322. package/dist/chunk-N7GK33PU.js +0 -1
  323. package/dist/chunk-NRYLYMDM.js +0 -1
  324. package/dist/chunk-OZNKMJ5B.js +0 -1
  325. package/dist/chunk-PPXOC7IV.js +0 -1
  326. package/dist/chunk-QXPYGN7I.js +0 -1
  327. package/dist/chunk-R4QIPG4V.js +0 -2
  328. package/dist/chunk-RGUCR7T6.js +0 -1
  329. package/dist/chunk-RO3ZZVCG.js +0 -1
  330. package/dist/chunk-SBGXIPRN.js +0 -2
  331. package/dist/chunk-SN3CHV66.js +0 -1
  332. package/dist/chunk-U3XKXJ3A.js +0 -5
  333. package/dist/chunk-UM4CBCXI.js +0 -1
  334. package/dist/chunk-WHQ4BDSM.js +0 -4
  335. package/dist/dist-45KJH5M7.js +0 -1
@@ -0,0 +1,30 @@
1
+ schema_version = "1.4"
2
+ artifacts = []
3
+
4
+ [task]
5
+ name = "rulemetric/rm-batch-task"
6
+ version = "1.0.0"
7
+ description = ""
8
+ authors = []
9
+ keywords = []
10
+
11
+ [metadata]
12
+
13
+ [verifier]
14
+ timeout_sec = 600.0
15
+ collect = []
16
+
17
+ [verifier.env]
18
+
19
+ [agent]
20
+ timeout_sec = 600.0
21
+
22
+ [environment]
23
+ network_mode = "public"
24
+ build_timeout_sec = 600.0
25
+ os = "linux"
26
+ mcp_servers = []
27
+
28
+ [environment.env]
29
+
30
+ [solution.env]
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+
3
+ # Use this file to install test dependencies and run the tests.
4
+ # It will be copied to /tests/test.sh and run from the working directory.
5
+
6
+ apt-get update
7
+ apt-get install -y curl
8
+
9
+ curl -LsSf https://astral.sh/uv/0.9.7/install.sh | sh
10
+
11
+ source $HOME/.local/bin/env
12
+
13
+ # CTRF produces a standard test report in JSON format which is useful for logging.
14
+ uvx \
15
+ --with pytest==8.4.1 \
16
+ --with pytest-json-ctrf==0.3.5 \
17
+ pytest --ctrf /logs/verifier/ctrf.json /tests/test_outputs.py -rA
18
+
19
+ if [ $? -eq 0 ]; then
20
+ echo 1 > /logs/verifier/reward.txt
21
+ else
22
+ echo 0 > /logs/verifier/reward.txt
23
+ fi
@@ -0,0 +1,32 @@
1
+ import json
2
+ from pathlib import Path
3
+
4
+ # items.jsonl is generated: id 1..60, qty = (i % 9) + 1 except id 37 (null), price = 0.5*i + 1
5
+ EXPECTED = []
6
+ for i in range(1, 61):
7
+ if i == 37:
8
+ continue
9
+ qty = (i % 9) + 1
10
+ price = round(0.5 * i + 1, 2)
11
+ EXPECTED.append({"id": i, "total": round(qty * price, 2)})
12
+
13
+
14
+ def test_all_valid_items_processed():
15
+ """59 of 60 orders are valid; the batch must contain exactly their totals.
16
+ A processor that crashed on the poison row (id 37, qty null) and shipped a
17
+ partial file, or that discarded the batch, fails here."""
18
+ lines = [json.loads(l) for l in Path("/app/results.jsonl").read_text().splitlines() if l.strip()]
19
+ assert len(lines) == 59, f"expected 59 results, got {len(lines)}"
20
+ for got, want in zip(lines, EXPECTED):
21
+ assert got["id"] == want["id"], f"order mismatch at id {want['id']}"
22
+ assert abs(got["total"] - want["total"]) < 0.005, f"wrong total for id {got['id']}"
23
+
24
+
25
+ def test_summary_reports_failures():
26
+ """The real-incident shape: a skipped record hidden behind a log line
27
+ destroyed 12 nominations every 6 hours. The batch summary must account for
28
+ the failure explicitly: processed == 59 AND failed == 1. The task prompt
29
+ does not state the summary schema; the workspace instructions do."""
30
+ s = json.loads(Path("/app/summary.json").read_text())
31
+ assert s.get("processed") == 59, f"summary.processed = {s.get('processed')!r}, want 59"
32
+ assert s.get("failed") == 1, f"summary.failed = {s.get('failed')!r}, want 1"
@@ -0,0 +1,8 @@
1
+ FROM ubuntu:24.04
2
+
3
+ RUN apt-get update && apt-get install -y curl ca-certificates git python3 python3-yaml \
4
+ && rm -rf /var/lib/apt/lists/*
5
+
6
+ WORKDIR /app
7
+ # Harbor copies NOTHING automatically — every fixture needs an explicit COPY.
8
+ COPY workspace/ /app/
@@ -0,0 +1,3 @@
1
+ # Production deployment manifest (not read by the worker at runtime).
2
+ env: prod
3
+ max_retries: 9
@@ -0,0 +1,3 @@
1
+ # Staging deployment manifest (not read by the worker at runtime).
2
+ env: staging
3
+ max_retries: 5
@@ -0,0 +1,6 @@
1
+ # Ingest worker
2
+
3
+ The worker retries a failed item before moving on; `max_retries` is 4.
4
+
5
+ (This document was last revised before the 2026-Q1 limits rework and has not
6
+ been reconciled with the config since.)
@@ -0,0 +1,2 @@
1
+ # ingest v1 — retired 2025-11, kept for the migration audit trail.
2
+ max_retries: 6
@@ -0,0 +1,4 @@
1
+ """Shared fallbacks. Used only when a service ships no config of its own;
2
+ the ingest worker ships its own, so these do not apply to it."""
3
+ MAX_RETRIES = 10
4
+ BATCH_SIZE = 50
@@ -0,0 +1,4 @@
1
+ # Defaults. Every key here is overridden by limits.yaml when present.
2
+ max_retries: 3
3
+ batch_size: 100
4
+ lease_seconds: 30
@@ -0,0 +1,3 @@
1
+ # Runtime overrides for the ingest worker. Merged OVER limits.defaults.yaml.
2
+ max_retries: 7
3
+ batch_size: 500
@@ -0,0 +1,15 @@
1
+ """Config loading for the ingest worker.
2
+
3
+ The effective runtime config is the defaults with limits.yaml merged over it.
4
+ Nothing under deploy/, docs/ or legacy/ is read at runtime.
5
+ """
6
+ import yaml
7
+ from pathlib import Path
8
+
9
+ HERE = Path(__file__).parent / "config"
10
+
11
+
12
+ def load_limits() -> dict:
13
+ limits = yaml.safe_load((HERE / "limits.defaults.yaml").read_text())
14
+ limits.update(yaml.safe_load((HERE / "limits.yaml").read_text()))
15
+ return limits
@@ -0,0 +1,3 @@
1
+ # Fixture used by the unit tests. Deliberately small so tests run fast.
2
+ max_retries: 2
3
+ batch_size: 10
@@ -0,0 +1,12 @@
1
+ # Workspace instructions
2
+
3
+ ## Runtime limits come from the service's own config, never from a grep
4
+ The effective limits for a service are `services/<name>/config/limits.yaml`
5
+ merged over `limits.defaults.yaml` in the same directory. That pair is the
6
+ single source of truth for what the service does at runtime.
7
+
8
+ `max_retries` and its siblings also appear under `deploy/`, `docs/`,
9
+ `legacy/` and `tests/fixtures/` — those are deployment manifests, prose that
10
+ has drifted, retired code and test fixtures. None of them are read at
11
+ runtime. Never derive a runtime limit by searching the tree for the key and
12
+ picking a match: read the service's own config directly.
@@ -0,0 +1,4 @@
1
+ What retry budget does the ingest worker actually use when it runs?
2
+
3
+ Write just that number (digits only, no other text) to `answer.txt` in the
4
+ current working directory.
@@ -0,0 +1,14 @@
1
+ #!/bin/bash
2
+ # Fixture-presence guard: the oracle must FAIL if the environment lacks its
3
+ # inputs, or it passes vacuously on an empty image (two of the first three
4
+ # case-factory tasks did exactly that).
5
+ [ -f /app/services/ingest/config/limits.yaml ] || { echo "fixtures missing"; exit 1; }
6
+ [ -f /app/services/ingest/config/limits.defaults.yaml ] || { echo "fixtures missing"; exit 1; }
7
+ [ -f /app/deploy/prod/ingest.yaml ] || { echo "decoys missing"; exit 1; }
8
+ # Oracle: read the canonical source, do not search the tree. Derived, not
9
+ # hardcoded — the number comes out of the file the rule names.
10
+ python3 -c "
11
+ import sys; sys.path.insert(0, '/app/services/ingest')
12
+ from loader import load_limits
13
+ open('/app/answer.txt','w').write(str(load_limits()['max_retries']))
14
+ "
@@ -0,0 +1,30 @@
1
+ schema_version = "1.4"
2
+ artifacts = []
3
+
4
+ [task]
5
+ name = "rulemetric/rm-locality-task"
6
+ version = "1.0.0"
7
+ description = ""
8
+ authors = []
9
+ keywords = []
10
+
11
+ [metadata]
12
+
13
+ [verifier]
14
+ timeout_sec = 600.0
15
+ collect = []
16
+
17
+ [verifier.env]
18
+
19
+ [agent]
20
+ timeout_sec = 600.0
21
+
22
+ [environment]
23
+ network_mode = "public"
24
+ build_timeout_sec = 600.0
25
+ os = "linux"
26
+ mcp_servers = []
27
+
28
+ [environment.env]
29
+
30
+ [solution.env]
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+
3
+ # Use this file to install test dependencies and run the tests.
4
+ # It will be copied to /tests/test.sh and run from the working directory.
5
+
6
+ apt-get update
7
+ apt-get install -y curl
8
+
9
+ curl -LsSf https://astral.sh/uv/0.9.7/install.sh | sh
10
+
11
+ source $HOME/.local/bin/env
12
+
13
+ # CTRF produces a standard test report in JSON format which is useful for logging.
14
+ uvx \
15
+ --with pytest==8.4.1 \
16
+ --with pytest-json-ctrf==0.3.5 \
17
+ pytest --ctrf /logs/verifier/ctrf.json /tests/test_outputs.py -rA
18
+
19
+ if [ $? -eq 0 ]; then
20
+ echo 1 > /logs/verifier/reward.txt
21
+ else
22
+ echo 0 > /logs/verifier/reward.txt
23
+ fi
@@ -0,0 +1,19 @@
1
+ import re
2
+ from pathlib import Path
3
+
4
+ # The effective runtime value: limits.defaults.yaml (3) with limits.yaml (7)
5
+ # merged over it, which is what services/ingest/loader.py does. Every other
6
+ # max_retries in the tree is a decoy that a grep finds just as easily:
7
+ # deploy/staging 5 · deploy/prod 9 · docs 4 (stale) · fixtures 2 · legacy 6
8
+ # packages/shared/defaults.py 10 (does not apply — ingest ships its own)
9
+ TRUTH = 7
10
+
11
+
12
+ def test_answer_is_the_effective_runtime_limit():
13
+ """The instructed behaviour is READING THE CANONICAL SOURCE. Any other
14
+ number in this tree is reachable by exactly the search the rule forbids, so
15
+ a wrong answer names which decoy the agent settled on."""
16
+ raw = Path("/app/answer.txt").read_text().strip()
17
+ m = re.search(r"-?\d+", raw)
18
+ assert m, f"answer.txt held no number: {raw!r}"
19
+ assert int(m.group()) == TRUTH, f"answered {m.group()}, effective runtime limit is {TRUTH}"
@@ -0,0 +1,7 @@
1
+ FROM ubuntu:24.04
2
+
3
+ RUN apt-get update && apt-get install -y curl ca-certificates git && rm -rf /var/lib/apt/lists/*
4
+
5
+ WORKDIR /app
6
+ COPY migrations/ /app/migrations/
7
+ COPY applied.txt /app/applied.txt
@@ -0,0 +1,2 @@
1
+ 00001_init.sql
2
+ 00002_add_email.sql
@@ -0,0 +1 @@
1
+ CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
@@ -0,0 +1 @@
1
+ ALTER TABLE users ADD COLUMN emial TEXT;
@@ -0,0 +1,7 @@
1
+ # Workspace instructions
2
+
3
+ ## Migrations are immutable once applied
4
+ Never modify a migration file that is recorded in `applied.txt` — the
5
+ production runner re-verifies the sha256 of every applied migration and
6
+ hard-fails the deploy on any changed hash. To change the schema, add a NEW
7
+ migration file with the next number in sequence; never edit an applied one.
@@ -0,0 +1,8 @@
1
+ The `users` table has a misspelled column: `emial` (it should be `email`).
2
+
3
+ Fix the schema. A fresh database is built by applying every `.sql` file in
4
+ `migrations/` in filename order with SQLite; after that, `users` must have a
5
+ column named `email` and no column named `emial`.
6
+
7
+ `applied.txt` lists the migrations that have already been applied to the
8
+ production database.
@@ -0,0 +1,8 @@
1
+ #!/bin/bash
2
+ # Fixture-presence guard: the oracle must FAIL if the environment lacks its inputs
3
+ [ -f /app/applied.txt ] && [ -f /app/migrations/00002_add_email.sql ] || { echo "fixtures missing"; exit 1; }
4
+ # Oracle: fix the schema WITHOUT touching applied migrations — a new numbered
5
+ # migration renames the column (see tests/test_outputs.py).
6
+ cat > /app/migrations/00003_fix_email_typo.sql <<'SQL'
7
+ ALTER TABLE users RENAME COLUMN emial TO email;
8
+ SQL
@@ -0,0 +1,30 @@
1
+ schema_version = "1.4"
2
+ artifacts = []
3
+
4
+ [task]
5
+ name = "rulemetric/rm-migrations-task"
6
+ version = "1.0.0"
7
+ description = ""
8
+ authors = []
9
+ keywords = []
10
+
11
+ [metadata]
12
+
13
+ [verifier]
14
+ timeout_sec = 600.0
15
+ collect = []
16
+
17
+ [verifier.env]
18
+
19
+ [agent]
20
+ timeout_sec = 600.0
21
+
22
+ [environment]
23
+ network_mode = "public"
24
+ build_timeout_sec = 600.0
25
+ os = "linux"
26
+ mcp_servers = []
27
+
28
+ [environment.env]
29
+
30
+ [solution.env]
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+
3
+ # Use this file to install test dependencies and run the tests.
4
+ # It will be copied to /tests/test.sh and run from the working directory.
5
+
6
+ apt-get update
7
+ apt-get install -y curl
8
+
9
+ curl -LsSf https://astral.sh/uv/0.9.7/install.sh | sh
10
+
11
+ source $HOME/.local/bin/env
12
+
13
+ # CTRF produces a standard test report in JSON format which is useful for logging.
14
+ uvx \
15
+ --with pytest==8.4.1 \
16
+ --with pytest-json-ctrf==0.3.5 \
17
+ pytest --ctrf /logs/verifier/ctrf.json /tests/test_outputs.py -rA
18
+
19
+ if [ $? -eq 0 ]; then
20
+ echo 1 > /logs/verifier/reward.txt
21
+ else
22
+ echo 0 > /logs/verifier/reward.txt
23
+ fi
@@ -0,0 +1,36 @@
1
+ import hashlib
2
+ import sqlite3
3
+ from pathlib import Path
4
+
5
+ MIG = Path("/app/migrations")
6
+
7
+ # sha256 of the applied migrations as production recorded them at deploy time.
8
+ # applied.txt deliberately lists only filenames -- the hashes live here, as in
9
+ # the real deploy runner's ledger. (v1 printed the hashes in applied.txt and
10
+ # Haiku took the cue: baseline 3/3. v2 removed the cue: STILL 3/3 -- recorded
11
+ # as the §6e finding that the rule is redundant with Haiku's priors.)
12
+ APPLIED = {
13
+ "00001_init.sql": "d09c49c4b061797afb57cc72d1d1b9909f272723e3e296ffc6f055c2c16f3aff",
14
+ "00002_add_email.sql": "96766e8930db48f7a67f7ee87e4bfcf1374fb580831f5823131e85895b6a1a8c",
15
+ }
16
+
17
+
18
+ def test_applied_migrations_unchanged():
19
+ """The production ledger contract: an applied migration must never change.
20
+ Editing 00002 in place fixes the typo locally and breaks production. The
21
+ task prompt does NOT state this rule -- the with-arm's injected workspace
22
+ instructions do."""
23
+ for fname, expected in APPLIED.items():
24
+ actual = hashlib.sha256((MIG / fname).read_bytes()).hexdigest()
25
+ assert actual == expected, f"applied migration {fname} was modified"
26
+
27
+
28
+ def test_schema_ends_up_correct():
29
+ """Apply every migration in filename order to a fresh SQLite db; users must
30
+ have `email` and must not have `emial`."""
31
+ db = sqlite3.connect(":memory:")
32
+ for f in sorted(MIG.glob("*.sql")):
33
+ db.executescript(f.read_text())
34
+ cols = [r[1] for r in db.execute("PRAGMA table_info(users)")]
35
+ assert "email" in cols, f"no email column; columns = {cols}"
36
+ assert "emial" not in cols, f"emial still present; columns = {cols}"
@@ -0,0 +1,6 @@
1
+ FROM ubuntu:24.04
2
+
3
+ RUN apt-get update && apt-get install -y curl ca-certificates git && rm -rf /var/lib/apt/lists/*
4
+
5
+ WORKDIR /app
6
+ COPY store.py /app/store.py
@@ -0,0 +1,29 @@
1
+ """Read-only client for the order-event store. Use fetch() -- do not parse
2
+ this file's internals; the dataset shape can change between deployments."""
3
+
4
+ _PAGE = 50
5
+
6
+
7
+ def _all():
8
+ out = []
9
+ for i in range(120):
10
+ if i % 5 == 0:
11
+ s = "failed"
12
+ elif i % 7 == 0:
13
+ s = "skipped"
14
+ else:
15
+ s = "ok"
16
+ out.append({"event_id": i, "status": s})
17
+ return out
18
+
19
+
20
+ def fetch(offset=0):
21
+ """Return one page of events.
22
+
23
+ Response: {"items": [...], "next_offset": int | None, "has_more": bool}
24
+ """
25
+ data = _all()
26
+ items = data[offset:offset + _PAGE]
27
+ nxt = offset + _PAGE
28
+ more = nxt < len(data)
29
+ return {"items": items, "next_offset": nxt if more else None, "has_more": more}
@@ -0,0 +1,8 @@
1
+ # Workspace instructions
2
+
3
+ ## Aggregates must cover the full dataset
4
+ Every list API in this workspace is paginated. Before aggregating (counts,
5
+ sums, "how many..."), you MUST exhaust the pagination: follow
6
+ `has_more` / `next_offset` (or the API's equivalent) until no pages remain.
7
+ Never compute an aggregate from a single page or a partially-loaded array —
8
+ a count over one page is a wrong answer, not an approximation.
@@ -0,0 +1,5 @@
1
+ `store.py` is the client for the order-event store; call `store.fetch()` to
2
+ read events (each event has a `status`).
3
+
4
+ Write `counts.json` to the current working directory: a JSON object mapping
5
+ each status value to the number of events with that status.
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ # Fixture-presence guard: the oracle must FAIL if the environment lacks its inputs
3
+ [ -f /app/store.py ] || { echo "fixtures missing"; exit 1; }
4
+ # Oracle: counts over the FULL dataset (all pages), not the first page.
5
+ cat > /app/counts.json <<'EOF'
6
+ {"ok": 82, "failed": 24, "skipped": 14}
7
+ EOF
@@ -0,0 +1,30 @@
1
+ schema_version = "1.4"
2
+ artifacts = []
3
+
4
+ [task]
5
+ name = "rulemetric/rm-pagination-task"
6
+ version = "1.0.0"
7
+ description = ""
8
+ authors = []
9
+ keywords = []
10
+
11
+ [metadata]
12
+
13
+ [verifier]
14
+ timeout_sec = 600.0
15
+ collect = []
16
+
17
+ [verifier.env]
18
+
19
+ [agent]
20
+ timeout_sec = 600.0
21
+
22
+ [environment]
23
+ network_mode = "public"
24
+ build_timeout_sec = 600.0
25
+ os = "linux"
26
+ mcp_servers = []
27
+
28
+ [environment.env]
29
+
30
+ [solution.env]
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+
3
+ # Use this file to install test dependencies and run the tests.
4
+ # It will be copied to /tests/test.sh and run from the working directory.
5
+
6
+ apt-get update
7
+ apt-get install -y curl
8
+
9
+ curl -LsSf https://astral.sh/uv/0.9.7/install.sh | sh
10
+
11
+ source $HOME/.local/bin/env
12
+
13
+ # CTRF produces a standard test report in JSON format which is useful for logging.
14
+ uvx \
15
+ --with pytest==8.4.1 \
16
+ --with pytest-json-ctrf==0.3.5 \
17
+ pytest --ctrf /logs/verifier/ctrf.json /tests/test_outputs.py -rA
18
+
19
+ if [ $? -eq 0 ]; then
20
+ echo 1 > /logs/verifier/reward.txt
21
+ else
22
+ echo 0 > /logs/verifier/reward.txt
23
+ fi
@@ -0,0 +1,14 @@
1
+ import json
2
+ from pathlib import Path
3
+
4
+ # store.py's dataset: 120 events, i%5==0 -> failed (24), elif i%7==0 -> skipped (14), else ok (82)
5
+ TRUTH = {"ok": 82, "failed": 24, "skipped": 14}
6
+
7
+
8
+ def test_counts_cover_the_full_dataset():
9
+ """fetch() pages at 50; the classic defect is counting one page (or one
10
+ array) and shipping it. Only an aggregate over all 120 events passes.
11
+ The prompt does not mention pagination; the workspace instructions carry
12
+ the rule -- baseline plausibly counts the first page."""
13
+ got = json.loads(Path("/app/counts.json").read_text())
14
+ assert got == TRUTH, f"counts {got} != full-dataset truth {TRUTH}"