@rulemetric/cli 0.12.8 → 0.14.0
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.
- package/dist/base-command.js +1 -1
- package/dist/{chunk-CZTTW3MZ.js → chunk-2WQUOC6S.js} +20 -20
- package/dist/chunk-4VN5PG2S.js +1 -0
- package/dist/chunk-5MXZJWQS.js +2 -0
- package/dist/{chunk-NKJTNGXR.js → chunk-5XEGRU2R.js} +1 -1
- package/dist/chunk-6XTLP2G7.js +1 -0
- package/dist/chunk-74QIUVWY.js +1 -0
- package/dist/chunk-7ML2UCI7.js +1 -0
- package/dist/chunk-AHLVY52I.js +1 -0
- package/dist/{chunk-BTQQPQRG.js → chunk-AT2MMCOJ.js} +1 -1
- package/dist/{chunk-GOA5Q6TY.js → chunk-AXJAGWZB.js} +1 -1
- package/dist/{chunk-22ZDUL6H.js → chunk-BVOXWAJO.js} +1 -1
- package/dist/chunk-CT7FWSIU.js +3 -0
- package/dist/{chunk-RFISMWRW.js → chunk-DDYGA2DS.js} +1 -1
- package/dist/{chunk-OOFGV7EX.js → chunk-E5YE25QG.js} +1 -1
- package/dist/chunk-E7GQJML3.js +1 -0
- package/dist/{chunk-KJRMGTAO.js → chunk-E7RH43OS.js} +6 -6
- package/dist/{chunk-HQCPGDQE.js → chunk-ET7753IY.js} +1 -1
- package/dist/{chunk-INSKP5ED.js → chunk-EWGE7YTQ.js} +1 -1
- package/dist/chunk-EXVXKJ7Y.js +1 -0
- package/dist/chunk-FCTFHY3X.js +13 -0
- package/dist/chunk-FJX7WDPG.js +1 -0
- package/dist/{chunk-AGK5AUWT.js → chunk-FK55FXKQ.js} +1 -1
- package/dist/chunk-GH4EZK2O.js +1 -0
- package/dist/chunk-GN46S7T4.js +9 -0
- package/dist/{chunk-AFYZYXQ3.js → chunk-GQGGFHX7.js} +1 -1
- package/dist/chunk-GYNZ3OZF.js +1 -0
- package/dist/{chunk-GHWBW2IW.js → chunk-H4LUPIHJ.js} +1 -1
- package/dist/{chunk-YSLKV4XC.js → chunk-HAYO6JYI.js} +1 -1
- package/dist/{chunk-UKOI2Q4J.js → chunk-HFSISGCJ.js} +1 -1
- package/dist/chunk-HRJDKAJ4.js +1 -0
- package/dist/chunk-IC6VZHE6.js +1 -0
- package/dist/chunk-INAZLRY5.js +1 -0
- package/dist/{chunk-XFAFMYIP.js → chunk-IOX4VJPR.js} +2 -2
- package/dist/chunk-J4W6GNCF.js +2 -0
- package/dist/{chunk-PVPYLKB3.js → chunk-J7UZXRTH.js} +1 -1
- package/dist/{chunk-MILLBGCB.js → chunk-JKWB6UXA.js} +1 -1
- package/dist/chunk-JLBQKV4V.js +3 -0
- package/dist/{chunk-UTAETY5Z.js → chunk-JRAXWASH.js} +1 -1
- package/dist/{chunk-5PM4E27L.js → chunk-JRWQJZYQ.js} +1 -1
- package/dist/chunk-KINIFUZQ.js +1 -0
- package/dist/{chunk-E4RGYYBC.js → chunk-LDUJWJ6A.js} +1 -1
- package/dist/chunk-LMCICVE7.js +12 -0
- package/dist/chunk-MHVHGKDK.js +3 -0
- package/dist/chunk-MMM4B3KH.js +1 -0
- package/dist/{chunk-A2LHEUNW.js → chunk-MX34N7Y5.js} +1 -1
- package/dist/{chunk-TBU5SWA4.js → chunk-N26UEHI3.js} +1 -1
- package/dist/{chunk-DSJNZWCZ.js → chunk-N4RJ6CN7.js} +1 -1
- package/dist/{chunk-CPDMJGTC.js → chunk-N7SZWKCU.js} +1 -1
- package/dist/chunk-NRYVMGJN.js +1 -0
- package/dist/{chunk-FE2UWAIP.js → chunk-NSPDDSRR.js} +1 -1
- package/dist/{chunk-WCIX5KWG.js → chunk-O62OLKQL.js} +1 -1
- package/dist/{chunk-ARC4Q3GL.js → chunk-OLJF4K7L.js} +1 -1
- package/dist/{chunk-GRPUY2EZ.js → chunk-OMRH4JXS.js} +1 -1
- package/dist/{chunk-BJSVATVJ.js → chunk-OO2ZRKZY.js} +5 -5
- package/dist/chunk-OUK2AWEI.js +1 -0
- package/dist/chunk-OYAOLJUH.js +1 -0
- package/dist/chunk-PPAHIVG5.js +1 -0
- package/dist/{chunk-MJ5H7RDK.js → chunk-PPIZMPNI.js} +1 -1
- package/dist/chunk-PUX6P5KC.js +2 -0
- package/dist/chunk-QI3FJKGK.js +1 -0
- package/dist/chunk-RRM4HQG4.js +1 -0
- package/dist/{chunk-EZHL527S.js → chunk-S5CQSP35.js} +1 -1
- package/dist/chunk-S5U76YUI.js +1 -0
- package/dist/{chunk-NF2BIEAF.js → chunk-SBGXIPRN.js} +1 -1
- package/dist/chunk-SE3UKA3M.js +25 -0
- package/dist/chunk-SG4UDDHB.js +4 -0
- package/dist/chunk-SPJ73X7A.js +4 -0
- package/dist/chunk-SV73ASP2.js +1 -0
- package/dist/chunk-SWSOEYC7.js +1 -0
- package/dist/{chunk-DCH3QWB7.js → chunk-TTSDPDRH.js} +1 -1
- package/dist/chunk-TWPG3TEQ.js +48 -0
- package/dist/{chunk-AKXGUQ5B.js → chunk-U7BPWFOP.js} +1 -1
- package/dist/{chunk-L54TWWBY.js → chunk-UFQ43KXE.js} +1 -1
- package/dist/chunk-UJ7EPLKC.js +1 -0
- package/dist/{chunk-5N5S3NKS.js → chunk-UQDOOQCM.js} +1 -1
- package/dist/{chunk-G3HODHFN.js → chunk-V4PUYPTU.js} +1 -1
- package/dist/{chunk-SHYP27B7.js → chunk-VALRPZXH.js} +1 -1
- package/dist/{chunk-DPCAPIQB.js → chunk-VLWNSTYW.js} +1 -1
- package/dist/chunk-WSWZPNLG.js +1 -0
- package/dist/{chunk-UA5GEVGW.js → chunk-XAOLOR4Q.js} +1 -1
- package/dist/chunk-XAXEZI6Z.js +1 -0
- package/dist/{chunk-Z4YVOVMM.js → chunk-XFLKW6SJ.js} +1 -1
- package/dist/chunk-YNLHJHUP.js +1 -0
- package/dist/chunk-YP2CBUXH.js +5 -0
- package/dist/{chunk-VYZKKSX4.js → chunk-YUIRDBQQ.js} +1 -1
- package/dist/{chunk-2KJAM2NG.js → chunk-ZA6NXNPR.js} +1 -1
- package/dist/{chunk-UGACB66X.js → chunk-ZZHIBOMT.js} +1 -1
- package/dist/commands/antigravity/backfill.js +1 -1
- package/dist/commands/auth/create-key.js +1 -1
- package/dist/commands/auth/login.js +1 -1
- package/dist/commands/auth/logout.js +1 -1
- package/dist/commands/auth/revoke-key.js +1 -1
- package/dist/commands/auth/signup.js +1 -1
- package/dist/commands/auth/status.js +1 -1
- package/dist/commands/capture/scope.js +1 -1
- package/dist/commands/catalog/index.js +1 -1
- package/dist/commands/catalog/recommend.js +1 -1
- package/dist/commands/crons/list.js +1 -1
- package/dist/commands/crons/run.js +2 -2
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/diagnostics.js +1 -1
- package/dist/commands/eval-targets/create.js +1 -1
- package/dist/commands/eval-targets/list.js +1 -1
- package/dist/commands/evals/agent.js +3 -3
- package/dist/commands/evals/auto-run.js +1 -1
- package/dist/commands/evals/benchmark.js +1 -1
- package/dist/commands/evals/compare.js +1 -1
- package/dist/commands/evals/create.js +1 -1
- package/dist/commands/evals/optimize-description.js +1 -1
- package/dist/commands/evals/optimize.js +1 -1
- package/dist/commands/evals/refine-cases.js +1 -1
- package/dist/commands/evals/run.js +1 -1
- package/dist/commands/evals/validate-judge.js +1 -1
- package/dist/commands/experiments/list.js +1 -1
- package/dist/commands/gateway/ensure.js +1 -1
- package/dist/commands/hooks/emit-instructions.js +1 -1
- package/dist/commands/hooks/install.js +1 -1
- package/dist/commands/hooks/run.js +1 -1
- package/dist/commands/hooks/uninstall.js +1 -1
- package/dist/commands/instructions/create.js +1 -1
- package/dist/commands/instructions/dedupe.js +1 -1
- package/dist/commands/instructions/delete.js +1 -1
- package/dist/commands/instructions/fork.js +1 -1
- package/dist/commands/instructions/get.js +1 -1
- package/dist/commands/instructions/list.js +1 -1
- package/dist/commands/instructions/promote.js +1 -1
- package/dist/commands/instructions/pull.js +1 -1
- package/dist/commands/instructions/restore.js +1 -1
- package/dist/commands/instructions/retract.js +1 -1
- package/dist/commands/instructions/upstream.js +1 -1
- package/dist/commands/instructions/versions.js +1 -1
- package/dist/commands/launcher.js +1 -1
- package/dist/commands/local/down.js +1 -1
- package/dist/commands/local/up.js +1 -1
- package/dist/commands/org/current.js +1 -1
- package/dist/commands/org/list.js +1 -1
- package/dist/commands/org/switch.js +1 -1
- package/dist/commands/packs/add-instruction.js +1 -1
- package/dist/commands/packs/apply.js +1 -1
- package/dist/commands/packs/create.js +1 -1
- package/dist/commands/packs/fork.js +1 -1
- package/dist/commands/packs/get.js +1 -1
- package/dist/commands/packs/list.js +1 -1
- package/dist/commands/packs/remove-instruction.js +1 -1
- package/dist/commands/proxy/env.js +1 -1
- package/dist/commands/proxy/logs.js +1 -1
- package/dist/commands/proxy/restart.js +1 -1
- package/dist/commands/proxy/setup.js +1 -1
- package/dist/commands/proxy/start.js +1 -1
- package/dist/commands/proxy/status.js +1 -1
- package/dist/commands/proxy/stop.js +1 -1
- package/dist/commands/research/backfill.js +1 -1
- package/dist/commands/research/tail-transcript.js +1 -1
- package/dist/commands/service/install.js +18 -18
- package/dist/commands/service/status.js +1 -1
- package/dist/commands/service/uninstall.js +1 -1
- package/dist/commands/sessions/analyze.js +1 -1
- package/dist/commands/sessions/delete.js +1 -1
- package/dist/commands/sessions/end.js +1 -1
- package/dist/commands/sessions/import.js +1 -1
- package/dist/commands/sessions/list.js +1 -1
- package/dist/commands/sessions/start.js +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/skills/export-approved.js +1 -1
- package/dist/commands/skills/install.js +1 -1
- package/dist/commands/skills/list.js +1 -1
- package/dist/commands/skills/publish.js +1 -1
- package/dist/commands/skills/search.js +1 -1
- package/dist/commands/skills/update.js +1 -1
- package/dist/commands/suggestions/accept.js +1 -1
- package/dist/commands/suggestions/auto.js +1 -1
- package/dist/commands/suggestions/dismiss.js +1 -1
- package/dist/commands/suggestions/list.js +1 -1
- package/dist/commands/suggestions/refresh.js +1 -1
- package/dist/commands/suggestions/undo.js +1 -1
- package/dist/dashboard/Dashboard.js +1 -1
- package/dist/dashboard/data.js +1 -1
- package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
- package/dist/dashboard/launcher/api.js +1 -1
- package/dist/dashboard/launcher/useLaunchJobs.js +1 -1
- package/dist/dist-NHS7HY5Q.js +1 -0
- package/dist/harbor/cost_delta.py +377 -0
- package/dist/harbor/mcp_container_shell.py +156 -0
- package/dist/harbor/provenance.py +361 -0
- package/dist/harbor/rm-batch-task/environment/Dockerfile +6 -0
- package/dist/harbor/rm-batch-task/environment/items.jsonl +60 -0
- package/dist/harbor/rm-batch-task/inject.md +8 -0
- package/dist/harbor/rm-batch-task/instruction.md +8 -0
- package/dist/harbor/rm-batch-task/solution/solve.sh +68 -0
- package/dist/harbor/rm-batch-task/task.toml +30 -0
- package/dist/harbor/rm-batch-task/tests/test.sh +23 -0
- package/dist/harbor/rm-batch-task/tests/test_outputs.py +32 -0
- package/dist/harbor/rm-locality-task/environment/Dockerfile +8 -0
- package/dist/harbor/rm-locality-task/environment/workspace/deploy/prod/ingest.yaml +3 -0
- package/dist/harbor/rm-locality-task/environment/workspace/deploy/staging/ingest.yaml +3 -0
- package/dist/harbor/rm-locality-task/environment/workspace/docs/architecture/ingest.md +6 -0
- package/dist/harbor/rm-locality-task/environment/workspace/legacy/ingest_v1/config.yaml +2 -0
- package/dist/harbor/rm-locality-task/environment/workspace/packages/shared/defaults.py +4 -0
- package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.defaults.yaml +4 -0
- package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.yaml +3 -0
- package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/loader.py +15 -0
- package/dist/harbor/rm-locality-task/environment/workspace/tests/fixtures/ingest_config.yaml +3 -0
- package/dist/harbor/rm-locality-task/inject.md +12 -0
- package/dist/harbor/rm-locality-task/instruction.md +4 -0
- package/dist/harbor/rm-locality-task/solution/solve.sh +14 -0
- package/dist/harbor/rm-locality-task/task.toml +30 -0
- package/dist/harbor/rm-locality-task/tests/test.sh +23 -0
- package/dist/harbor/rm-locality-task/tests/test_outputs.py +19 -0
- package/dist/harbor/rm-migrations-task/environment/Dockerfile +7 -0
- package/dist/harbor/rm-migrations-task/environment/applied.txt +2 -0
- package/dist/harbor/rm-migrations-task/environment/migrations/00001_init.sql +1 -0
- package/dist/harbor/rm-migrations-task/environment/migrations/00002_add_email.sql +1 -0
- package/dist/harbor/rm-migrations-task/inject.md +7 -0
- package/dist/harbor/rm-migrations-task/instruction.md +8 -0
- package/dist/harbor/rm-migrations-task/solution/solve.sh +8 -0
- package/dist/harbor/rm-migrations-task/task.toml +30 -0
- package/dist/harbor/rm-migrations-task/tests/test.sh +23 -0
- package/dist/harbor/rm-migrations-task/tests/test_outputs.py +36 -0
- package/dist/harbor/rm-pagination-task/environment/Dockerfile +6 -0
- package/dist/harbor/rm-pagination-task/environment/store.py +29 -0
- package/dist/harbor/rm-pagination-task/inject.md +8 -0
- package/dist/harbor/rm-pagination-task/instruction.md +5 -0
- package/dist/harbor/rm-pagination-task/solution/solve.sh +7 -0
- package/dist/harbor/rm-pagination-task/task.toml +30 -0
- package/dist/harbor/rm-pagination-task/tests/test.sh +23 -0
- package/dist/harbor/rm-pagination-task/tests/test_outputs.py +14 -0
- package/dist/harbor/rm_host_claude.py +264 -0
- package/dist/harbor/rm_host_codex.py +208 -0
- package/dist/harbor/run.sh +268 -0
- package/dist/harbor/summarize.py +248 -0
- package/dist/lib/active-org-refresh.js +1 -1
- package/dist/lib/agent-loop.js +1 -1
- package/dist/lib/antigravity-transcript.js +1 -1
- package/dist/lib/api-client.js +1 -1
- package/dist/lib/capture-scope-config.js +1 -1
- package/dist/lib/codex-capture-scope.js +1 -1
- package/dist/lib/codex-exec.js +1 -1
- package/dist/lib/ensure-api-key.js +1 -1
- package/dist/lib/ensure-fresh-token.js +1 -1
- package/dist/lib/eval-accumulation.js +1 -0
- package/dist/lib/eval-analyzer.js +1 -1
- package/dist/lib/eval-benchmark.js +1 -1
- package/dist/lib/eval-candidate-run.js +1 -1
- package/dist/lib/eval-case-generator.js +1 -1
- package/dist/lib/eval-conversation-handler.js +1 -1
- package/dist/lib/eval-executor.js +1 -1
- package/dist/lib/eval-grader.js +1 -1
- package/dist/lib/eval-meta-judge.js +1 -1
- package/dist/lib/eval-resume.js +1 -1
- package/dist/lib/eval-run-batch.js +1 -1
- package/dist/lib/eval-trigger-tester.js +1 -1
- package/dist/lib/evolution-enrolment.js +1 -1
- package/dist/lib/harbor-readiness.js +1 -0
- package/dist/lib/hooks-capture-gate.js +1 -1
- package/dist/lib/insights/generation/installed-asks.js +1 -1
- package/dist/lib/insights/nomination/nominate.js +1 -1
- package/dist/lib/instruction-proposer.js +1 -1
- package/dist/lib/instruction-snapshot.js +1 -1
- package/dist/lib/instructions/acceptance/accept-events.js +1 -1
- package/dist/lib/instructions/acceptance/accept-hook.js +1 -1
- package/dist/lib/instructions/acceptance/agent-instruction-files.js +1 -0
- package/dist/lib/instructions/acceptance/hook-install.js +1 -1
- package/dist/lib/instructions/acceptance/reverse-applications.js +1 -1
- package/dist/lib/instructions/acceptance/suggestion-accept.js +1 -1
- package/dist/lib/jobs/handlers/cron-auto-accept-suggestions.js +1 -1
- package/dist/lib/jobs/handlers/cron-eval-autorun.js +1 -1
- package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
- package/dist/lib/jobs/handlers/cron-instruction-training.js +1 -1
- package/dist/lib/jobs/handlers/cron-reconcile-attribution.js +1 -1
- package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
- package/dist/lib/jobs/handlers/cron-refresh-pricing.js +1 -1
- package/dist/lib/jobs/handlers/cron-retire-unused-skills.js +1 -1
- package/dist/lib/jobs/handlers/cron-suggest-instructions.js +1 -1
- package/dist/lib/jobs/handlers/distill-memories.js +1 -1
- package/dist/lib/jobs/handlers/harbor-ab-verdict.js +1 -0
- package/dist/lib/jobs/handlers/harbor-ab.js +1 -0
- package/dist/lib/jobs/handlers/process-changelog.js +1 -1
- package/dist/lib/jobs/handlers/process-conversation.js +1 -1
- package/dist/lib/jobs/handlers/process-eval.js +1 -1
- package/dist/lib/jobs/handlers/process-insights.js +1 -1
- package/dist/lib/jobs/handlers/process-judge-review.js +1 -1
- package/dist/lib/jobs/handlers/process-launch.js +1 -1
- package/dist/lib/jobs/handlers/process-memory-ab.js +1 -1
- package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
- package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
- package/dist/lib/jobs/shed-retry.js +1 -0
- package/dist/lib/judge-review-runner.js +1 -1
- package/dist/lib/llm-client.js +1 -1
- package/dist/lib/llm-json.js +1 -0
- package/dist/lib/llm-reply-parsers.js +1 -0
- package/dist/lib/machine-pause-detector.js +1 -1
- package/dist/lib/manual-tasks-meta.js +1 -1
- package/dist/lib/manual-tasks.js +1 -1
- package/dist/lib/measurement-llm.js +1 -0
- package/dist/lib/pi-exec.js +1 -0
- package/dist/lib/projects/workspace/eval-workspace.js +1 -1
- package/dist/lib/projects/workspace/worktree.js +1 -1
- package/dist/lib/refine-cases.js +1 -1
- package/dist/lib/research-client.js +1 -1
- package/dist/lib/retraction.js +1 -1
- package/dist/lib/reviewer-detect.js +1 -1
- package/dist/lib/service-environment.js +1 -0
- package/dist/lib/setup-steps.js +1 -1
- package/dist/lib/telemetry.js +1 -1
- package/dist/lib/terminal-target-heartbeat.js +1 -1
- package/dist/lib/tool-bin.js +1 -0
- package/dist/lib/tool-cli-map.js +1 -0
- package/dist/lib/transcript-instruction-linking.js +1 -0
- package/dist/lib/transcript-sync.js +1 -1
- package/dist/lib/work-report.js +1 -0
- package/oclif.manifest.json +17 -4
- package/package.json +10 -8
- package/dist/chunk-3DZD322E.js +0 -1
- package/dist/chunk-5OX6YKTR.js +0 -5
- package/dist/chunk-APXQLQZY.js +0 -1
- package/dist/chunk-C6GLNE6X.js +0 -1
- package/dist/chunk-CNQ5DTNC.js +0 -1
- package/dist/chunk-E7XOYGL5.js +0 -20
- package/dist/chunk-EVD5A3VI.js +0 -1
- package/dist/chunk-FUYR7CFD.js +0 -1
- package/dist/chunk-GN3ZHQ46.js +0 -1
- package/dist/chunk-GWDZNGUP.js +0 -2
- package/dist/chunk-LUCVMLHV.js +0 -1
- package/dist/chunk-O65AQZYB.js +0 -1
- package/dist/chunk-PWTTCSQA.js +0 -1
- package/dist/chunk-QBNLZJIR.js +0 -6
- package/dist/chunk-QXPYGN7I.js +0 -1
- package/dist/chunk-RIVEBBZC.js +0 -3
- package/dist/chunk-RLEMDKQ4.js +0 -12
- package/dist/chunk-S2SKT5PV.js +0 -1
- package/dist/chunk-TZA4HAVF.js +0 -1
- package/dist/chunk-UUFCTEBT.js +0 -1
- package/dist/chunk-UXB6DRR7.js +0 -3
- package/dist/chunk-W23MESHM.js +0 -1
- package/dist/chunk-W67DO5PT.js +0 -1
- package/dist/chunk-WMIUFMDI.js +0 -48
- package/dist/chunk-WO6MS654.js +0 -13
- package/dist/chunk-WTMJSL7R.js +0 -1
- package/dist/dist-XEWF3R3N.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,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,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,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 @@
|
|
|
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,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,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}"
|