coder-eval 0.9.3__tar.gz → 0.9.5__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 (602) hide show
  1. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/harness-candidates.md +20 -0
  2. {coder_eval-0.9.3 → coder_eval-0.9.5}/CHANGELOG.md +123 -0
  3. {coder_eval-0.9.3 → coder_eval-0.9.5}/CLAUDE.md +7 -6
  4. {coder_eval-0.9.3 → coder_eval-0.9.5}/PKG-INFO +18 -10
  5. {coder_eval-0.9.3 → coder_eval-0.9.5}/README.md +17 -9
  6. {coder_eval-0.9.3 → coder_eval-0.9.5}/action.yml +10 -2
  7. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/AB_EXPERIMENTS.md +7 -7
  8. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/CI_GATE.md +23 -13
  9. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/DIALOG_MODE.md +4 -3
  10. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/EXTENDING.md +2 -2
  11. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/REPORT_SCHEMA.md +3 -2
  12. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/TASK_DEFINITION_GUIDE.md +259 -102
  13. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/agents/CLAUDE_CODE.md +4 -3
  14. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/index.md +1 -1
  15. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/llms.txt +1 -1
  16. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/tutorials/02-ci-pipeline.md +4 -2
  17. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/tutorials/04-writing-a-task.md +1 -1
  18. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/package.json +1 -1
  19. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/pnpm-lock.yaml +42 -75
  20. {coder_eval-0.9.3 → coder_eval-0.9.5}/experiments/early-stop-ab.yaml +8 -8
  21. {coder_eval-0.9.3 → coder_eval-0.9.5}/litellm/README.md +4 -1
  22. {coder_eval-0.9.3 → coder_eval-0.9.5}/litellm/cost_logger.py +1 -1
  23. {coder_eval-0.9.3 → coder_eval-0.9.5}/litellm/litellm-config.yaml +4 -2
  24. {coder_eval-0.9.3 → coder_eval-0.9.5}/litellm/start-litellm.sh +25 -2
  25. {coder_eval-0.9.3 → coder_eval-0.9.5}/mkdocs.yml +1 -1
  26. {coder_eval-0.9.3 → coder_eval-0.9.5}/pyproject.toml +1 -1
  27. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/__init__.py +1 -1
  28. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/plan_command.py +1 -1
  29. coder_eval-0.9.5/src/coder_eval/criteria/cli_called.py +291 -0
  30. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/command_executed.py +144 -13
  31. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/__init__.py +8 -1
  32. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/criteria.py +404 -78
  33. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/limits.py +49 -32
  34. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/results.py +20 -17
  35. coder_eval-0.9.5/src/coder_eval/orchestration/early_stop.py +713 -0
  36. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/orchestration/experiment.py +1 -1
  37. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/orchestrator.py +49 -64
  38. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/reports.py +37 -9
  39. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/reports_experiment.py +1 -1
  40. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/reports_html.py +5 -8
  41. coder_eval-0.9.5/tasks/early_stop_decision_budget_exceeded.yaml +43 -0
  42. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/early_stop_weighted_high_weight_kills_run.yaml +14 -14
  43. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/early_stop_weighted_low_weight_absorbed.yaml +17 -16
  44. coder_eval-0.9.5/tests/lint/action_docs.py +232 -0
  45. coder_eval-0.9.5/tests/test_cli_called_criterion.py +698 -0
  46. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_command_executed.py +354 -0
  47. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_custom_lint.py +163 -0
  48. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_early_stop.py +911 -342
  49. coder_eval-0.9.5/tests/test_litellm_config.py +113 -0
  50. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_success_criterion_union.py +1 -0
  51. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_threshold_enforcement.py +3 -2
  52. {coder_eval-0.9.3 → coder_eval-0.9.5}/uv.lock +1 -1
  53. coder_eval-0.9.3/src/coder_eval/orchestration/early_stop.py +0 -614
  54. coder_eval-0.9.3/tasks/early_stop_decision_budget_exceeded.yaml +0 -40
  55. coder_eval-0.9.3/tests/test_litellm_config.py +0 -57
  56. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/commands/coder-eval-code-review-full.md +0 -0
  57. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/commands/coder-eval-code-review-wf.md +0 -0
  58. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/commands/coder-eval-code-review.md +0 -0
  59. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/commands/coder-eval-create-plan.md +0 -0
  60. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/commands/coder-eval-implement-plan.md +0 -0
  61. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/commands/coder-eval-review.md +0 -0
  62. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/commands/coder-eval-run-analysis.md +0 -0
  63. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/commands/coder-eval-task-create.md +0 -0
  64. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/shared/axes.md +0 -0
  65. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/shared/multi-model-review.md +0 -0
  66. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/shared/review-rubric.md +0 -0
  67. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/shared/run-layout.md +0 -0
  68. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/workflows/cr-axis.js +0 -0
  69. {coder_eval-0.9.3 → coder_eval-0.9.5}/.claude/workflows/cr-parent.js +0 -0
  70. {coder_eval-0.9.3 → coder_eval-0.9.5}/.env.example +0 -0
  71. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/CODEOWNERS +0 -0
  72. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
  73. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  74. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  75. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/code_review.md +0 -0
  76. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/dependabot.yml +0 -0
  77. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/pages-stub/index.html +0 -0
  78. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/scripts/release_notes.py +0 -0
  79. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/workflows/claude-pr-review.yml +0 -0
  80. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/workflows/codeql.yml +0 -0
  81. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/workflows/conventional-commits.yml +0 -0
  82. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/workflows/docker-publish.yml +0 -0
  83. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/workflows/docs.yml +0 -0
  84. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/workflows/pr-checks.yml +0 -0
  85. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/workflows/publish-testpypi.yml +0 -0
  86. {coder_eval-0.9.3 → coder_eval-0.9.5}/.github/workflows/release.yml +0 -0
  87. {coder_eval-0.9.3 → coder_eval-0.9.5}/.gitignore +0 -0
  88. {coder_eval-0.9.3 → coder_eval-0.9.5}/.pre-commit-config.yaml +0 -0
  89. {coder_eval-0.9.3 → coder_eval-0.9.5}/.python-version +0 -0
  90. {coder_eval-0.9.3 → coder_eval-0.9.5}/ADOPTERS.md +0 -0
  91. {coder_eval-0.9.3 → coder_eval-0.9.5}/CODE_OF_CONDUCT.md +0 -0
  92. {coder_eval-0.9.3 → coder_eval-0.9.5}/CONTRIBUTING.md +0 -0
  93. {coder_eval-0.9.3 → coder_eval-0.9.5}/LICENSE +0 -0
  94. {coder_eval-0.9.3 → coder_eval-0.9.5}/Makefile +0 -0
  95. {coder_eval-0.9.3 → coder_eval-0.9.5}/NOTICE +0 -0
  96. {coder_eval-0.9.3 → coder_eval-0.9.5}/SECURITY.md +0 -0
  97. {coder_eval-0.9.3 → coder_eval-0.9.5}/docker/Dockerfile +0 -0
  98. {coder_eval-0.9.3 → coder_eval-0.9.5}/docker/Dockerfile.runtime +0 -0
  99. {coder_eval-0.9.3 → coder_eval-0.9.5}/docker/coder_eval_entrypoint.sh +0 -0
  100. {coder_eval-0.9.3 → coder_eval-0.9.5}/docker/coder_eval_runtime_entrypoint.sh +0 -0
  101. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/DATASETS.md +0 -0
  102. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/DOCKER_ISOLATION.md +0 -0
  103. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/USER_GUIDE.md +0 -0
  104. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/agents/ANTIGRAVITY.md +0 -0
  105. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/agents/CODEX.md +0 -0
  106. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/assets/hero.gif +0 -0
  107. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/comparison.md +0 -0
  108. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/tutorials/01-first-evaluation.md +0 -0
  109. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/tutorials/03-evalboard-local.md +0 -0
  110. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/tutorials/05-comparing-models.md +0 -0
  111. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/tutorials/06-use-docker-isolation.md +0 -0
  112. {coder_eval-0.9.3 → coder_eval-0.9.5}/docs/tutorials/README.md +0 -0
  113. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/.gitignore +0 -0
  114. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/README.md +0 -0
  115. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/__tests__/harness-badge.test.tsx +0 -0
  116. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/__tests__/harness-selector.test.tsx +0 -0
  117. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
  118. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/col-help.tsx +0 -0
  119. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/collapsible-rail.tsx +0 -0
  120. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/harness-badge.tsx +0 -0
  121. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/harness-selector.tsx +0 -0
  122. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/scroll-table.tsx +0 -0
  123. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/search-box.tsx +0 -0
  124. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/unit-toggle.tsx +0 -0
  125. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_components/version-list.tsx +0 -0
  126. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_overview/__tests__/harness-legend.test.tsx +0 -0
  127. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_overview/__tests__/harness-series.test.ts +0 -0
  128. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_overview/daily-chart.tsx +0 -0
  129. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_overview/harness-legend.tsx +0 -0
  130. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_overview/harness-series.ts +0 -0
  131. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_overview/tag-rail.tsx +0 -0
  132. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
  133. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/_overview/window-summary.tsx +0 -0
  134. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/api/download/route.ts +0 -0
  135. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/api/file/route.ts +0 -0
  136. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
  137. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/api/refresh/route.ts +0 -0
  138. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/error.tsx +0 -0
  139. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/globals.css +0 -0
  140. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/icon.png +0 -0
  141. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/layout.tsx +0 -0
  142. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/page.tsx +0 -0
  143. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/path-to-ga/page.tsx +0 -0
  144. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
  145. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/trends/actions.ts +0 -0
  146. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/trends/page.tsx +0 -0
  147. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/trends/trends-view.tsx +0 -0
  148. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
  149. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/watchlist/page.tsx +0 -0
  150. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
  151. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/next-env.d.ts +0 -0
  152. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/next.config.mjs +0 -0
  153. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/postcss.config.mjs +0 -0
  154. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/public/harness/antigravity.png +0 -0
  155. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/public/harness/claude-code.png +0 -0
  156. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/public/harness/codex.png +0 -0
  157. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/public/uipath.png +0 -0
  158. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/tailwind.config.ts +0 -0
  159. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/tsconfig.json +0 -0
  160. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/vitest.config.ts +0 -0
  161. {coder_eval-0.9.3 → coder_eval-0.9.5}/evalboard/vitest.setup.ts +0 -0
  162. {coder_eval-0.9.3 → coder_eval-0.9.5}/experiments/default.yaml +0 -0
  163. {coder_eval-0.9.3 → coder_eval-0.9.5}/experiments/model-comparison.yaml +0 -0
  164. {coder_eval-0.9.3 → coder_eval-0.9.5}/experiments/permissions-smoke.yaml +0 -0
  165. {coder_eval-0.9.3 → coder_eval-0.9.5}/experiments/plugin-comparison.yaml +0 -0
  166. {coder_eval-0.9.3 → coder_eval-0.9.5}/experiments/prompt-mutations-example.yaml +0 -0
  167. {coder_eval-0.9.3 → coder_eval-0.9.5}/experiments/smoke_variants.yaml +0 -0
  168. {coder_eval-0.9.3 → coder_eval-0.9.5}/osv-scanner.toml +0 -0
  169. {coder_eval-0.9.3 → coder_eval-0.9.5}/scripts/check_commit_msg.sh +0 -0
  170. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/.gitattributes +0 -0
  171. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/agent.py +0 -0
  172. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/agents/__init__.py +0 -0
  173. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/agents/_logging.py +0 -0
  174. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/agents/antigravity_agent.py +0 -0
  175. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/agents/claude_code_agent.py +0 -0
  176. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/agents/codex_agent.py +0 -0
  177. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/agents/noop_agent.py +0 -0
  178. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/agents/registry.py +0 -0
  179. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/agents/watchdog.py +0 -0
  180. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/analysis.py +0 -0
  181. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/__init__.py +0 -0
  182. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/aggregate_command.py +0 -0
  183. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/console.py +0 -0
  184. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/evaluate_command.py +0 -0
  185. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/report_command.py +0 -0
  186. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/run_command.py +0 -0
  187. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/run_helpers.py +0 -0
  188. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/run_task_internal_command.py +0 -0
  189. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/cli/utils.py +0 -0
  190. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/config.py +0 -0
  191. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/__init__.py +0 -0
  192. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
  193. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/agent_judge.py +0 -0
  194. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/base.py +0 -0
  195. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/classification_match.py +0 -0
  196. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/commands_efficiency.py +0 -0
  197. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/file_check.py +0 -0
  198. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/file_contains.py +0 -0
  199. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/file_exists.py +0 -0
  200. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/file_matches_regex.py +0 -0
  201. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/json_check.py +0 -0
  202. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/llm_judge.py +0 -0
  203. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/reference_comparison.py +0 -0
  204. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/run_command.py +0 -0
  205. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/skill_triggered.py +0 -0
  206. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/criteria/uipath_eval.py +0 -0
  207. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/__init__.py +0 -0
  208. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/agent.py +0 -0
  209. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/budget.py +0 -0
  210. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/categories.py +0 -0
  211. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/categorization.py +0 -0
  212. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/checker_misuse.py +0 -0
  213. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/executor.py +0 -0
  214. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/judge.py +0 -0
  215. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/retry.py +0 -0
  216. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/errors/timeout.py +0 -0
  217. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/__init__.py +0 -0
  218. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/checker.py +0 -0
  219. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
  220. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
  221. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/judge_context.py +0 -0
  222. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/judge_models.py +0 -0
  223. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/judge_persistence.py +0 -0
  224. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/judge_usage.py +0 -0
  225. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/sub_agent.py +0 -0
  226. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/summaries.py +0 -0
  227. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/evaluation/verdict_tool.py +0 -0
  228. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/formatting.py +0 -0
  229. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/isolation/__init__.py +0 -0
  230. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/isolation/docker_runner.py +0 -0
  231. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/litellm_cost.py +0 -0
  232. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/logging_config.py +0 -0
  233. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/agent_config.py +0 -0
  234. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/container_paths.py +0 -0
  235. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/enums.py +0 -0
  236. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/experiment.py +0 -0
  237. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/judge.py +0 -0
  238. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/judge_defaults.py +0 -0
  239. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/merge_strategy.py +0 -0
  240. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/mutations.py +0 -0
  241. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/routing.py +0 -0
  242. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/sandbox.py +0 -0
  243. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/tasks.py +0 -0
  244. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/telemetry.py +0 -0
  245. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/models/templates.py +0 -0
  246. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/orchestration/__init__.py +0 -0
  247. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/orchestration/batch.py +0 -0
  248. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/orchestration/config.py +0 -0
  249. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/orchestration/config_merge.py +0 -0
  250. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/orchestration/evaluation.py +0 -0
  251. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/orchestration/overrides.py +0 -0
  252. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/orchestration/task_loader.py +0 -0
  253. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/path_utils.py +0 -0
  254. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/plugins.py +0 -0
  255. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/pricing.py +0 -0
  256. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/py.typed +0 -0
  257. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/reports_junit.py +0 -0
  258. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/reports_stats.py +0 -0
  259. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/resources/__init__.py +0 -0
  260. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
  261. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/resources/tags.yaml +0 -0
  262. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/sandbox.py +0 -0
  263. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/scoring/__init__.py +0 -0
  264. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/scoring/ast_similarity.py +0 -0
  265. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/scoring/complexity.py +0 -0
  266. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/scoring/quality.py +0 -0
  267. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/scoring/signature_similarity.py +0 -0
  268. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/scoring/similarity.py +0 -0
  269. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/scoring/token_similarity.py +0 -0
  270. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/simulation/__init__.py +0 -0
  271. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/simulation/termination.py +0 -0
  272. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/simulation/user_simulator.py +0 -0
  273. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/streaming/__init__.py +0 -0
  274. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/streaming/callbacks.py +0 -0
  275. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/streaming/collector.py +0 -0
  276. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/streaming/events.py +0 -0
  277. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/streaming/renderers.py +0 -0
  278. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/streaming/wire.py +0 -0
  279. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/telemetry.py +0 -0
  280. {coder_eval-0.9.3 → coder_eval-0.9.5}/src/coder_eval/utils.py +0 -0
  281. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/README.md +0 -0
  282. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agentless_smoke_test.yaml +0 -0
  283. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/antigravity_hello_world.yaml +0 -0
  284. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
  285. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/claude_hello_world.yaml +0 -0
  286. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/claude_hello_world_docker.yaml +0 -0
  287. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
  288. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/claude_subagent_test.yaml +0 -0
  289. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
  290. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/codex_hello_world.yaml +0 -0
  291. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/codex_parallel_commands.yaml +0 -0
  292. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
  293. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/codex_skills_test.yaml +0 -0
  294. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/codex_string_utils.yaml +0 -0
  295. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/codex_subagent_test.yaml +0 -0
  296. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/subagent_bash_long_input.yaml +0 -0
  297. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/agents/subagent_merge_sort.yaml +0 -0
  298. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/byod_smoke_test.yaml +0 -0
  299. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/dataset_example.yaml +0 -0
  300. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/datasets/sentiment.jsonl +0 -0
  301. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
  302. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
  303. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
  304. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/dockerfile_build_example/environment/input.txt +0 -0
  305. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
  306. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
  307. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/fibonacci_with_template.yaml +0 -0
  308. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/hello_date.yaml +0 -0
  309. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/inline_starter_example.yaml +0 -0
  310. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/internal/session_resumption.yaml +0 -0
  311. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/mock_path_dirs_smoke.yaml +0 -0
  312. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
  313. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
  314. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
  315. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
  316. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
  317. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
  318. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
  319. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
  320. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
  321. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
  322. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
  323. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
  324. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/README.md +0 -0
  325. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
  326. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
  327. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
  328. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
  329. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
  330. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
  331. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
  332. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
  333. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
  334. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
  335. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/sentiment_classification.yaml +0 -0
  336. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/smoke_agent_judge.yaml +0 -0
  337. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/smoke_budget_exceeded.yaml +0 -0
  338. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
  339. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/smoke_llm_judge.yaml +0 -0
  340. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/smoke_negative_path.yaml +0 -0
  341. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/smoke_task_timeout.yaml +0 -0
  342. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/smoke_variants.yaml +0 -0
  343. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/test_sandbox.yaml +0 -0
  344. {coder_eval-0.9.3 → coder_eval-0.9.5}/tasks/token_check.yaml +0 -0
  345. {coder_eval-0.9.3 → coder_eval-0.9.5}/templates/byod_smoke_test/Dockerfile +0 -0
  346. {coder_eval-0.9.3 → coder_eval-0.9.5}/templates/fibonacci-starter/README.md +0 -0
  347. {coder_eval-0.9.3 → coder_eval-0.9.5}/templates/fibonacci-starter/src/main.py +0 -0
  348. {coder_eval-0.9.3 → coder_eval-0.9.5}/templates/fibonacci-starter/tests/test_main.py +0 -0
  349. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/__init__.py +0 -0
  350. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/__init__.py +0 -0
  351. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/__init__.py +0 -0
  352. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/_scrub.py +0 -0
  353. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
  354. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
  355. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
  356. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
  357. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
  358. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
  359. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
  360. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
  361. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
  362. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
  363. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
  364. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
  365. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
  366. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
  367. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
  368. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
  369. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
  370. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
  371. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
  372. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
  373. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/report_snapshots/__init__.py +0 -0
  374. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
  375. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
  376. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
  377. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
  378. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/report_snapshots/run_full.md +0 -0
  379. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
  380. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/_path_helpers.py +0 -0
  381. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/conftest.py +0 -0
  382. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/fixtures/__init__.py +0 -0
  383. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
  384. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
  385. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/fixtures/mock_agent.py +0 -0
  386. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
  387. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
  388. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
  389. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/fixtures/text_stub_agent.py +0 -0
  390. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/__init__.py +0 -0
  391. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/dead_config_fields.py +0 -0
  392. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/doc_env_parity.py +0 -0
  393. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/doc_examples.py +0 -0
  394. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/doc_indexes.py +0 -0
  395. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/doc_schema_parity.py +0 -0
  396. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/__init__.py +0 -0
  397. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/base.py +0 -0
  398. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
  399. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
  400. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
  401. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
  402. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
  403. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
  404. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
  405. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
  406. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
  407. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
  408. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
  409. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/no_agent_timing_access.py +0 -0
  410. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
  411. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
  412. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/no_silent_except.py +0 -0
  413. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/no_submodule_model_imports.py +0 -0
  414. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
  415. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
  416. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
  417. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/open_explicit_encoding.py +0 -0
  418. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
  419. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/register_criterion_required.py +0 -0
  420. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
  421. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
  422. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/runner.py +0 -0
  423. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/lint/violation.py +0 -0
  424. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_action_version_pin.py +0 -0
  425. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent.py +0 -0
  426. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent_config_no_timing_fields.py +0 -0
  427. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent_config_optional_type.py +0 -0
  428. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent_config_registry_dispatch.py +0 -0
  429. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent_config_sdk_decoupling.py +0 -0
  430. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent_golden_master.py +0 -0
  431. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent_judge_criterion.py +0 -0
  432. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent_telemetry.py +0 -0
  433. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent_telemetry_advanced.py +0 -0
  434. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agent_timeout.py +0 -0
  435. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_agentless.py +0 -0
  436. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_aggregate.py +0 -0
  437. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_antigravity_agent.py +0 -0
  438. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_byoa_plugin.py +0 -0
  439. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_byoa_plugin_live.py +0 -0
  440. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_byod_feature.py +0 -0
  441. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_check_all_async.py +0 -0
  442. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_checker_logging.py +0 -0
  443. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_classification_match.py +0 -0
  444. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_claude_settings_enforcement_live.py +0 -0
  445. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_cleanup_preservation_guard.py +0 -0
  446. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_cli_backend_flag.py +0 -0
  447. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_cli_empty_glob.py +0 -0
  448. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_cli_sdk_options.py +0 -0
  449. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_cli_set_overrides.py +0 -0
  450. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_cli_telemetry.py +0 -0
  451. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_cli_type_flag.py +0 -0
  452. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_code_review_bugs.py +0 -0
  453. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_codex_agent.py +0 -0
  454. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_codex_agent_live.py +0 -0
  455. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_codex_agent_unit.py +0 -0
  456. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_codex_token_mapping.py +0 -0
  457. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_command_statistics.py +0 -0
  458. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_command_telemetry_result_data.py +0 -0
  459. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_commands_efficiency.py +0 -0
  460. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_config_lineage.py +0 -0
  461. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_config_merge_engine.py +0 -0
  462. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_config_precedence.py +0 -0
  463. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_continuous_scoring.py +0 -0
  464. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_cost_accounting_paths.py +0 -0
  465. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_criterion_result_round_trip.py +0 -0
  466. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_dataset_expansion.py +0 -0
  467. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_debug_logging.py +0 -0
  468. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_docker_build_failure.py +0 -0
  469. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_docker_litellm_env.py +0 -0
  470. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_docker_runner_container_death.py +0 -0
  471. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_docker_runner_mounts.py +0 -0
  472. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_docker_runner_stream_limit.py +0 -0
  473. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_docker_wildcard_env.py +0 -0
  474. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_docker_workdir_live.py +0 -0
  475. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_driver_resolver.py +0 -0
  476. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_error_handling.py +0 -0
  477. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_evaluate_command.py +0 -0
  478. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_evaluator.py +0 -0
  479. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_event_collector.py +0 -0
  480. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_experiment_cli.py +0 -0
  481. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_experiment_loader.py +0 -0
  482. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_experiment_models.py +0 -0
  483. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_experiment_reports.py +0 -0
  484. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_experiment_resolver.py +0 -0
  485. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_experiment_runner.py +0 -0
  486. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_file_check.py +0 -0
  487. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_file_contains_scoring.py +0 -0
  488. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_formatting.py +0 -0
  489. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_git_clone_failure.py +0 -0
  490. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_heartbeat_watchdog.py +0 -0
  491. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_ignore_patterns_negation.py +0 -0
  492. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_image_from_dockerfiles.py +0 -0
  493. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_integration.py +0 -0
  494. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_json_check.py +0 -0
  495. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_judge_anthropic.py +0 -0
  496. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_judge_bedrock.py +0 -0
  497. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_judge_burn_in_live.py +0 -0
  498. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_judge_context_builder.py +0 -0
  499. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_judge_models.py +0 -0
  500. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_judge_persistence.py +0 -0
  501. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_lint_no_top_level_run_limits.py +0 -0
  502. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_lint_runner.py +0 -0
  503. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_litellm_cost.py +0 -0
  504. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_litellm_cost_logger.py +0 -0
  505. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_litellm_route.py +0 -0
  506. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_llm_judge_criterion.py +0 -0
  507. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_log_tail_buffer.py +0 -0
  508. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_logging.py +0 -0
  509. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_logging_isolation.py +0 -0
  510. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_merge_characterization.py +0 -0
  511. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_merge_strategy_annotations.py +0 -0
  512. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_merge_unification.py +0 -0
  513. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_models.py +0 -0
  514. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_mutations.py +0 -0
  515. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_new_criteria.py +0 -0
  516. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_node_env_config.py +0 -0
  517. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_optional_dependencies.py +0 -0
  518. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_orchestrator.py +0 -0
  519. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_orchestrator_error_log_tail.py +0 -0
  520. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_orchestrator_telemetry.py +0 -0
  521. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_overrides_engine.py +0 -0
  522. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_parallel.py +0 -0
  523. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_path_utils.py +0 -0
  524. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_plan_command.py +0 -0
  525. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_plugin_processing.py +0 -0
  526. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_plugins.py +0 -0
  527. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_post_run.py +0 -0
  528. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_pr_review_workflow.py +0 -0
  529. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_pre_run.py +0 -0
  530. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_preservation_mode.py +0 -0
  531. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_pricing_registry.py +0 -0
  532. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reference_comparison_scoring.py +0 -0
  533. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reference_evaluator.py +0 -0
  534. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reference_missing_file.py +0 -0
  535. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reference_models.py +0 -0
  536. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reference_orchestrator.py +0 -0
  537. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_registry.py +0 -0
  538. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_release_notes.py +0 -0
  539. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_replicate_stats.py +0 -0
  540. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_report_command.py +0 -0
  541. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reports.py +0 -0
  542. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reports_experiment.py +0 -0
  543. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reports_html.py +0 -0
  544. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reports_junit.py +0 -0
  545. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reports_stats.py +0 -0
  546. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_reports_stats_nonfinite.py +0 -0
  547. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_resolve_task_files.py +0 -0
  548. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_resume.py +0 -0
  549. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_retry_logic_comprehensive.py +0 -0
  550. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_route_seam_exhaustiveness.py +0 -0
  551. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_routing.py +0 -0
  552. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_run_command_junit.py +0 -0
  553. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_run_command_stdout.py +0 -0
  554. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_run_limits_models.py +0 -0
  555. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_run_limits_orchestrator.py +0 -0
  556. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_run_limits_resolver.py +0 -0
  557. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_run_metrics.py +0 -0
  558. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_runtime_tool_versions.py +0 -0
  559. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_sandbox.py +0 -0
  560. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_sandbox_layer_builder.py +0 -0
  561. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_sandbox_optional.py +0 -0
  562. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_sandbox_security.py +0 -0
  563. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_sandbox_symlink_preservation.py +0 -0
  564. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_sandbox_templates.py +0 -0
  565. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_scorers.py +0 -0
  566. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_scoring_quality.py +0 -0
  567. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_sdk_option_classification.py +0 -0
  568. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_simulation_config.py +0 -0
  569. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_simulation_integration.py +0 -0
  570. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_simulation_termination.py +0 -0
  571. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_simulation_trials.py +0 -0
  572. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_skill_triggered.py +0 -0
  573. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_streaming_agent_integration.py +0 -0
  574. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_streaming_batch.py +0 -0
  575. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_streaming_callbacks.py +0 -0
  576. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_streaming_cli.py +0 -0
  577. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_streaming_events.py +0 -0
  578. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_streaming_orchestrator.py +0 -0
  579. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_streaming_renderers.py +0 -0
  580. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_streaming_wire.py +0 -0
  581. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_sub_agent_runner.py +0 -0
  582. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_suite_rollup.py +0 -0
  583. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_summaries.py +0 -0
  584. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_tags.py +0 -0
  585. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_task_definition_unknown_fields.py +0 -0
  586. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_teardown_interrupt.py +0 -0
  587. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_telemetry.py +0 -0
  588. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_template_env_expansion.py +0 -0
  589. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_timeout_batch.py +0 -0
  590. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_timeout_categorization.py +0 -0
  591. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_timeout_exceptions.py +0 -0
  592. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_timeout_models.py +0 -0
  593. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_timeout_orchestrator.py +0 -0
  594. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_token_usage.py +0 -0
  595. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_uipath_eval.py +0 -0
  596. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_user_simulator.py +0 -0
  597. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_utils.py +0 -0
  598. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_utterance_extraction.py +0 -0
  599. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_variant_prompt_file.py +0 -0
  600. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_verdict_tool.py +0 -0
  601. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_watchdog.py +0 -0
  602. {coder_eval-0.9.3 → coder_eval-0.9.5}/tests/test_yaml_migration.py +0 -0
@@ -107,3 +107,23 @@ Deferred lint/test guardrails surfaced during reviews. Promote to a `CExxx` rule
107
107
  caught them. The cleanup plan explicitly deferred this as YAGNI for the
108
108
  one-time purge, but any future doc rename/deletion re-opens the same blind
109
109
  spot — caught in the 2026-07-03 open-source-docs-cleanup implementation run.
110
+
111
+ ## From PR #77 (command-executed shell-normalize) — CE030-to-criteria deferred
112
+
113
+ - [ ] **Extend CE030 doc/schema-parity to the `SuccessCriterion` union** so a new
114
+ criterion (or field) can't ship undocumented. Attempted in PR #77 and reverted:
115
+ CI installs `--extra uipath`, and in that environment `coder_eval.models.criteria`
116
+ gains a `CliCalledCriterion` (fields `log`/`positional`) that is NOT present in a
117
+ plain checkout (it did not reproduce on macOS, whose lockfile resolution omits the
118
+ contributing linux-only component). It defeated every discriminator tried — union
119
+ membership, a `__module__` string filter (it is spoofed to `coder_eval.models.criteria`),
120
+ a genuine-module-attribute scan (it is `setattr` onto the module), and even an AST
121
+ parse of the `SuccessCriterion` union literal in `criteria.py` source (CI's imported
122
+ criteria module resolves to a file whose union literal already contains it). No
123
+ runtime OR source signal available in the lint could separate the injected criterion
124
+ from an in-tree one. Revisit only with a way to identify the in-tree criterion set that
125
+ is provably immune to the uipath integration — e.g. a hardcoded name allowlist of the
126
+ in-tree criteria (losing auto-coverage of new ones), or first understanding exactly how
127
+ that environment injects the criterion. Until then CE030 stays scoped to the four
128
+ top-level models; the `command_pattern`/`exclude_pattern` contract this PR changed is
129
+ documented in the Field descriptions and TASK_DEFINITION_GUIDE regardless.
@@ -2,6 +2,129 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.9.5 (2026-08-05)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **command-executed**: Keep whole argv-joined payload in shell unwrap
10
+ ([#77](https://github.com/UiPath/coder_eval/pull/77),
11
+ [`7abd080`](https://github.com/UiPath/coder_eval/commit/7abd08098146067890e16740c37239c2e0009a24))
12
+
13
+ - **command-executed**: Match patterns against shell-normalized commands
14
+ ([#77](https://github.com/UiPath/coder_eval/pull/77),
15
+ [`7abd080`](https://github.com/UiPath/coder_eval/commit/7abd08098146067890e16740c37239c2e0009a24))
16
+
17
+ - **command-executed**: Narrow command param to str before shell-normalizing
18
+ ([#77](https://github.com/UiPath/coder_eval/pull/77),
19
+ [`7abd080`](https://github.com/UiPath/coder_eval/commit/7abd08098146067890e16740c37239c2e0009a24))
20
+
21
+ - **command-executed**: Recognize shell wrappers by predicate, not allowlist
22
+ ([#77](https://github.com/UiPath/coder_eval/pull/77),
23
+ [`7abd080`](https://github.com/UiPath/coder_eval/commit/7abd08098146067890e16740c37239c2e0009a24))
24
+
25
+ - **criteria**: Add present predicate so asserting a switch cannot weaken a guard
26
+ ([#72](https://github.com/UiPath/coder_eval/pull/72),
27
+ [`8574ded`](https://github.com/UiPath/coder_eval/commit/8574dedb02d6e9ab883b042934f89297591e8abd))
28
+
29
+ - **criteria**: Make cli_called guards fail loud instead of vacuously passing
30
+ ([#72](https://github.com/UiPath/coder_eval/pull/72),
31
+ [`8574ded`](https://github.com/UiPath/coder_eval/commit/8574dedb02d6e9ab883b042934f89297591e8abd))
32
+
33
+ - **criteria**: Stop ignore_flags re-opening the guard false-PASS
34
+ ([#72](https://github.com/UiPath/coder_eval/pull/72),
35
+ [`8574ded`](https://github.com/UiPath/coder_eval/commit/8574dedb02d6e9ab883b042934f89297591e8abd))
36
+
37
+ - **early-stop**: Address PR review — trajectory parity, reason determinism, doc restore
38
+ ([#78](https://github.com/UiPath/coder_eval/pull/78),
39
+ [`4cf8092`](https://github.com/UiPath/coder_eval/commit/4cf80920422e25fec663ef93e483902bdeffad24))
40
+
41
+ - **lint**: Derive CE030 criteria from the source union literal, not runtime
42
+ ([#77](https://github.com/UiPath/coder_eval/pull/77),
43
+ [`7abd080`](https://github.com/UiPath/coder_eval/commit/7abd08098146067890e16740c37239c2e0009a24))
44
+
45
+ - **lint**: Enumerate in-tree criteria by module attribute, not the union
46
+ ([#77](https://github.com/UiPath/coder_eval/pull/77),
47
+ [`7abd080`](https://github.com/UiPath/coder_eval/commit/7abd08098146067890e16740c37239c2e0009a24))
48
+
49
+ - **lint**: Scope CE030 criterion parity to in-tree criteria only
50
+ ([#77](https://github.com/UiPath/coder_eval/pull/77),
51
+ [`7abd080`](https://github.com/UiPath/coder_eval/commit/7abd08098146067890e16740c37239c2e0009a24))
52
+
53
+ - **reports**: Explicit return on every early_stop_gate_note path (CodeQL py/mixed-returns)
54
+ ([#78](https://github.com/UiPath/coder_eval/pull/78),
55
+ [`4cf8092`](https://github.com/UiPath/coder_eval/commit/4cf80920422e25fec663ef93e483902bdeffad24))
56
+
57
+ - **reports**: Pre-initialize the gate note so CodeQL sees it bound on every path
58
+ ([#78](https://github.com/UiPath/coder_eval/pull/78),
59
+ [`4cf8092`](https://github.com/UiPath/coder_eval/commit/4cf80920422e25fec663ef93e483902bdeffad24))
60
+
61
+ ### Chores
62
+
63
+ - **deps-dev**: Bump postcss from 8.5.18 to 8.5.23 in /evalboard
64
+ ([#75](https://github.com/UiPath/coder_eval/pull/75),
65
+ [`cdced15`](https://github.com/UiPath/coder_eval/commit/cdced152dea732096dcff939c45e7d7c927c2a5a))
66
+
67
+ ### Documentation
68
+
69
+ - Surface the Marketplace listing and make the Action quickstarts self-sufficient
70
+ ([#80](https://github.com/UiPath/coder_eval/pull/80),
71
+ [`401245a`](https://github.com/UiPath/coder_eval/commit/401245ad14055c1da5d7b594e506686c59cedce7))
72
+
73
+ - **command-executed**: Document shell-normalization contract + gate it (CE030)
74
+ ([#77](https://github.com/UiPath/coder_eval/pull/77),
75
+ [`7abd080`](https://github.com/UiPath/coder_eval/commit/7abd08098146067890e16740c37239c2e0009a24))
76
+
77
+ ### Features
78
+
79
+ - **criteria**: Add cli_called for structured invocation matching
80
+ ([#72](https://github.com/UiPath/coder_eval/pull/72),
81
+ [`8574ded`](https://github.com/UiPath/coder_eval/commit/8574dedb02d6e9ab883b042934f89297591e8abd))
82
+
83
+ - **criteria**: Match a flag across spellings with FlagMatch.aliases
84
+ ([#72](https://github.com/UiPath/coder_eval/pull/72),
85
+ [`8574ded`](https://github.com/UiPath/coder_eval/commit/8574dedb02d6e9ab883b042934f89297591e8abd))
86
+
87
+ - **early-stop**: Per-criterion arming via stop_early blocks on live criteria
88
+ ([#78](https://github.com/UiPath/coder_eval/pull/78),
89
+ [`4cf8092`](https://github.com/UiPath/coder_eval/commit/4cf80920422e25fec663ef93e483902bdeffad24))
90
+
91
+ ### Refactoring
92
+
93
+ - **command-executed**: Total _match_haystacks, shared window, memoized
94
+ ([#77](https://github.com/UiPath/coder_eval/pull/77),
95
+ [`7abd080`](https://github.com/UiPath/coder_eval/commit/7abd08098146067890e16740c37239c2e0009a24))
96
+
97
+
98
+ ## v0.9.4 (2026-08-04)
99
+
100
+ ### Bug Fixes
101
+
102
+ - **litellm**: Pin litellm[proxy]==1.95.0 + fastapi==0.140.0 for proxy startup
103
+ ([#76](https://github.com/UiPath/coder_eval/pull/76),
104
+ [`f2f8580`](https://github.com/UiPath/coder_eval/commit/f2f85807cff3376b7201d5d5b2f9e1c4874220d9))
105
+
106
+ - **litellm**: Pin proxy deps (litellm 1.95.0 + fastapi 0.140.0) to fix startup crash
107
+ ([#76](https://github.com/UiPath/coder_eval/pull/76),
108
+ [`f2f8580`](https://github.com/UiPath/coder_eval/commit/f2f85807cff3376b7201d5d5b2f9e1c4874220d9))
109
+
110
+ ### Chores
111
+
112
+ - **action**: Rename Marketplace listing to coder_eval, add author
113
+ ([`a9c274d`](https://github.com/UiPath/coder_eval/commit/a9c274d918114df5229b20e9c65a4ce620b9f9ed))
114
+
115
+ ### Documentation
116
+
117
+ - **litellm**: Surface the proxy dep-pin override vars in start script
118
+ ([#76](https://github.com/UiPath/coder_eval/pull/76),
119
+ [`f2f8580`](https://github.com/UiPath/coder_eval/commit/f2f85807cff3376b7201d5d5b2f9e1c4874220d9))
120
+
121
+ ### Refactoring
122
+
123
+ - **litellm**: Address PR review — pin SSOT guard, rename, doc ripple
124
+ ([#76](https://github.com/UiPath/coder_eval/pull/76),
125
+ [`f2f8580`](https://github.com/UiPath/coder_eval/commit/f2f85807cff3376b7201d5d5b2f9e1c4874220d9))
126
+
127
+
5
128
  ## v0.9.3 (2026-08-04)
6
129
 
7
130
  ### Bug Fixes
@@ -34,7 +34,7 @@ coder_eval/
34
34
  ├── models/ # Pydantic data models (subpackage)
35
35
  │ ├── __init__.py # Unified exports for all models
36
36
  │ ├── enums.py # AgentKind, AgentState, FinalStatus, ApiBackend
37
- │ ├── criteria.py # 14 success criterion types + base + union
37
+ │ ├── criteria.py # 15 success criterion types + base + union
38
38
  │ ├── experiment.py # ExperimentDefinition, ExperimentVariant, ResolvedTask, result models
39
39
  │ ├── judge_defaults.py # DEFAULT_JUDGE_MODEL constant (cycle-free leaf)
40
40
  │ ├── mutations.py # PromptMutation variants (prefix/suffix/replace/template)
@@ -141,10 +141,10 @@ action.yml # Published composite GitHub Action (coder-ev
141
141
  - **Sub-agent token accounting**: There is NO separate per-sub-agent field. Every sub-agent generation is captured as a `parent_tool_use_id`-tagged `AssistantMessage` in the turn transcript, so per-sub-agent usage is derived by grouping those messages on that id (the evalboard's `aggregateSubAgentUsage` does exactly this). Claude bubbles its sub-agent's intermediate generations into the parent stream natively, and the **terminal** generation (delivered as the Agent tool result, never streamed) is synthesized into one via `_synthesize_subagent_terminal_message` from `tool_use_result.usage`. Codex reconstructs all child generations from the child rollout (`_recover_subagent_tool_calls`). The turn total already includes sub-agent cost — Claude via the SDK's cumulative `model_usage`; Codex via `_fold_subagent_tokens`, which folds the child messages (their real per-generation tokens) into the parent total. `CommandTelemetry.result_summary` is stored **untruncated** (no 200-char cap) so sub-agent returns are preserved whole. Set `CODER_EVAL_RAW_SDK_LOG=1` to dump every raw SDK event to the task log for inspection.
142
142
  - **Reconciliation message (stream self-reconciles to the turn total)**: The per-message stream consistently under-reports the authoritative turn total — a fixed prompt slice (~512 input tokens on Claude) is billed on no SDK-emitted message, and sub-agent input/cache only partially bubbles up. So `EventCollector.build_turn_record` appends one synthetic `ReconciliationMessage` (`role="reconciliation"`, in the `TranscriptMessage` union) per turn, carrying the per-bucket residual = `token_usage` − Σ(assistant message buckets). The invariant: **summing the four token buckets across `TurnRecord.messages` (assistant + reconciliation) equals `token_usage` exactly**, for both Claude and Codex (Codex's stream is already complete after `_recover_subagent_tool_calls`, so its residual is usually 0 and no entry is emitted). This is what lets the evalboard SUM the message stream as the source of truth instead of reading a separate aggregate ("agent tokens"): `selectTokenTotals` returns the stream sum whenever a reconciliation entry is present, and the timeline renders it as its own row. It is agent-agnostic (booked at the single `EventCollector` seam), carries no cost (cost stays on `token_usage`), and is excluded from generation/turn counts and the cost simulator. The LiteLLM open-weight actual-cost join (`litellm_cost.apply_actual_cost`) deliberately writes cost at the TURN level only (`token_usage.total_cost_usd` = the real OpenRouter bill) plus the per-call `TurnRecord.provider_call_costs` audit record; it does NOT touch the message token buckets, so `EventCollector` stays the single writer and this invariant holds on every backend. The Python `token_usage`/`total_token_usage` aggregate is unchanged and still authoritative for budget/judges/reports.
143
143
  - **sandbox isolation**: Tasks that don't need MCP servers should set `setting_sources: []` in their `agent:` block to isolate the sandbox from the host project's CLAUDE.md and settings. Without this, the host project's CLAUDE.md (often 20 KB+) is injected into every API call, inflating cache-creation tokens and cost significantly.
144
- - **Run-time caps (non-criterion enforcement)**: `TaskDefinition.run_limits` (`RunLimits` model) is the single namespace for all *task-level* run-time caps — `max_turns` / `task_timeout` / `turn_timeout` (structural) and `max_input_tokens` / `max_output_tokens` / `max_total_tokens` / `max_usd` (cumulative budget). Token/USD breaches abort with `FinalStatus.TOKEN_BUDGET_EXCEEDED` or `COST_BUDGET_EXCEEDED` (both `category == "failed"`). Structural caps are set from the CLI via `-D run_limits.max_turns=…` / `-D run_limits.task_timeout=…` / `-D run_limits.turn_timeout=…` (field-merged into `run_limits`); budget caps via `-D run_limits.max_usd=…` etc. or YAML. Layered config uses field-merge — a variant block overrides individual keys without replacing the task's block. The one *per-criterion* cap, `max_steps_to_decide`, deliberately lives on `LiveSuccessCriterion` instead (see below) — the watcher must attribute a decision-step-budget breach to a specific criterion, which `RunLimits` (task-scoped, criterion-agnostic) cannot express.
145
- - **Early stop on criterion (opt-in)**: `run_limits.stop_early` (default off) ends a single-shot Claude run early once the run's **armed** criteria are decided, so a raised `max_turns` isn't wasted on the smoke flavor. A criterion is armed by `stop_when: pass|fail|decided|auto`; only criteria that can decide from a partial trajectory may arm "is this criterion type live-observable" is `models.LiveSuccessCriterion` subclassing (currently `skill_triggered`, `command_executed`), the single source of truth `validate_early_stop`/`EarlyStopWatcher` check directly via `isinstance`; each subclass implements the abstract, checker-independent `live_decidable_polarities()` (a pure function of its own fields) alongside the checker's `live_verdict` override, and lint rule CE025 (`tests/test_custom_lint.py::TestCE025LiveVerdictConsistency`, a registry-based whole-tree check, not a per-file AST rule) keeps the two paired. `decided` arms **both** polarities; `auto` arms whichever polarities **this instance** can decide the value for dataset-fanned criteria whose positive/distractor role flips per row. Stop rule is weighted, not strict-boolean: `run_limits.stop_early_gate_threshold` (default `1.0`, reproducing pre-weighting behavior byte-for-byte) is the minimum weighted score (`Σ weight·score / Σ weight` over the armed subset) required to pass; a fail-stop fires once the armed subset's **ceiling** (best case for everything still undecided) can no longer reach the threshold, a pass-stop once the pass-armed subset's **floor** (worst case) already meets itboth **deferred while any pass-armed criterion is undecided**, so a distractor misfire never truncates a positive row's recall signal before the positives resolve (or the run continues to the cap). A fail-stop is therefore verdict-preserving; a pass-stop can miss a *later* distractor misfire, so authoritative P/R/F1 comes from a `stop_early: false` run. A per-criterion `max_steps_to_decide` (on `LiveSuccessCriterion` only, requires `stop_when`) caps tool-call steps spent still undecided — cumulative across retry attempts of the same turn — before `EarlyStopReason.DECISION_BUDGET_EXCEEDED` force-fails the run outright, bypassing the weighted gate (nothing to weigh a criterion that never decided against). Driven by `orchestration/early_stop.py::EarlyStopWatcher` through the Claude agent's cooperative `should_stop` seam (tool-call granularity, no SIGKILL); live verdicts only *trigger* the stop — the standard `check_all_async` on the frozen trajectory is authoritative. An early-stopped run gates on the **armed subset** via the weighted `EvaluationResult.armed_criteria_passed`; a run that completes naturally (even with `stop_early: true`) gates on the full set via the strict-AND `all_criteria_passed` weight magnitude only forgives under the former, so the weighted gate is contingent on the watcher itself firing, not solely on the configured threshold. Every unsupported use is a hard error at resolution (plan *and* run), and a runtime verdict bug **fails open** to a full run. Surfaces: `EarlyStopInfo` (incl. `gate_threshold` at stop time), report notes/badges, `stopped_early` run.json rows, `EarlyStopped`/`EarlyStopReason` telemetry dims. Worked rationale: docs/TASK_DEFINITION_GUIDE.md § `stop_early`. Defaults off ⇒ behavior byte-for-behavior unchanged.
144
+ - **Run-time caps (non-criterion enforcement)**: `TaskDefinition.run_limits` (`RunLimits` model) is the single namespace for all *task-level* run-time caps — `max_turns` / `task_timeout` / `turn_timeout` (structural) and `max_input_tokens` / `max_output_tokens` / `max_total_tokens` / `max_usd` (cumulative budget). Token/USD breaches abort with `FinalStatus.TOKEN_BUDGET_EXCEEDED` or `COST_BUDGET_EXCEEDED` (both `category == "failed"`). Structural caps are set from the CLI via `-D run_limits.max_turns=…` / `-D run_limits.task_timeout=…` / `-D run_limits.turn_timeout=…` (field-merged into `run_limits`); budget caps via `-D run_limits.max_usd=…` etc. or YAML. Layered config uses field-merge — a variant block overrides individual keys without replacing the task's block. The one *per-criterion* cap, `stop_early.decide_within`, deliberately lives on `LiveSuccessCriterion` instead (see below) — the watcher must attribute a decision-step timeout to a specific criterion, which `RunLimits` (task-scoped, criterion-agnostic) cannot express.
145
+ - **Early stop on criterion (opt-in, per-criterion arming)**: a `stop_early:` block (`StopEarlyPolicy`) on a criterion ends a single-shot run early once the run's **armed** criteria decide the outcome, so a raised `max_turns` isn't wasted on the smoke flavor. The block's PRESENCE is the arming and alone activates the watcher — there is **no run-level master switch**: `run_limits.stop_early: false` is the run-level KILL SWITCH that force-disarms every block (the one-line experiment-variant/`-D` override for an authoritative full run), and `run_limits.stop_early: true` (the removed master arm) is a hard `EarlyStopConfigError` at resolution. The block exists on `LiveSuccessCriterion` only (currently `skill_triggered`, `command_executed` — so arming an unobservable criterion is unrepresentable, a pydantic extra-forbid error). Arming carries one implicit trigger (a native live-fail may fail-stop the run); its keys refine it: `on_pass: stop` (pass-stop the moment the criterion live-passes; default `continue` just latches) and `decide_within: N` (still undecided after N tool-call steps latches an **effective fail**, fed through the same fail-stop rule, reported as `decision_budget_exceeded` — an ordinary weighted fail, NOT a gate-bypassing force-fail; cumulative across retry attempts of the same turn). A trigger whose polarity the instance can't decide (per the abstract, checker-independent `live_decidable_polarities()`, a pure function of the criterion's own fields, paired with the checker's `live_verdict` override by lint rule CE025, a registry-based whole-tree check) is **inert by design** one dataset-fanned YAML line serves both positive rows (pass/timeout live) and distractor rows (fail live). Verdicts **latch**: once a criterion decides, its `live_verdict` is never polled again. Stop rule is weighted, not strict-boolean: `run_limits.stop_early_gate_threshold` (default `1.0`, reproducing strict-AND behavior exactly) is the minimum weighted score (`Σ weight·score / Σ weight` over the armed subset) required to pass; a fail-stop fires once the armed set's **ceiling** (best case for everything still undecided) can no longer reach the threshold — so a low-weight fail or timeout that can't doom the gate is absorbed and the run continues and is **deferred while any pass-capable armed criterion is undecided** (a distractor misfire never truncates a positive row's recall signal); a pass-stop fires once the `on_pass: stop` subset's **floor** (worst case) already meets the threshold, and is symmetrically **deferred while any pass-capable armed criterion outside the `on_pass: stop` subset is undecided** (so an early pass never freezes a sibling `on_pass: continue` criterion's signal out of the trajectory). A fail-stop is therefore verdict-preserving; a pass-stop can miss a *later* distractor misfire, so authoritative P/R/F1 comes from a kill-switched (`stop_early: false`) run. Driven by `orchestration/early_stop.py::EarlyStopWatcher` (built when `early_stop_active(task)`: ≥1 armed criterion, kill switch not thrown) through the agent's cooperative `should_stop` seam (tool-call granularity, no SIGKILL); live verdicts only *trigger* the stop — the standard `check_all_async` on the frozen trajectory is authoritative. Gating is **FIRED-ONLY**: a run the watcher actually cut gates on the **armed subset** via the weighted `EvaluationResult.armed_criteria_passed`; a run that completes naturally armed or not gates strict-AND via `all_criteria_passed`, so adding a block never changes the verdict of a run it didn't cut. Note the gate keys on the watcher having FIRED (`result.early_stop is not None`), not on confirmed truncation — an agent that ignores `should_stop`, or a stop firing on the final message, still gates armed-only. Every resolution-time guardrail violation is a hard error at resolution (plan *and* run); the one load-time case — a `stop_early:` block on a non-live criterion — is a pydantic schema error at task load, which the run surface reports as a skipped task like any other malformed task. A runtime verdict bug **fails open** to a full run. Surfaces: `EarlyStopInfo` (incl. `gate_threshold` at stop time), report notes/badges, `stopped_early` run.json rows, `EarlyStopped`/`EarlyStopReason` telemetry dims. Worked rationale: docs/TASK_DEFINITION_GUIDE.md § `stop_early`. No blocks anywhere ⇒ behavior byte-for-byte unchanged.
146
146
 
147
- ## Success Criteria (14 types)
147
+ ## Success Criteria (15 types)
148
148
 
149
149
  | Type | Scoring | Description |
150
150
  |------|---------|-------------|
@@ -156,6 +156,7 @@ action.yml # Published composite GitHub Action (coder-ev
156
156
  | `file_matches_regex` | Binary | Regex match on file |
157
157
  | `reference_comparison` | Continuous | AST/token/complexity similarity |
158
158
  | `command_executed` | Fractional | Agent tool usage verification |
159
+ | `cli_called` | Binary | Structured match over a JSON Lines invocation log: verb / positional / per-flag predicates, with min_count/max_count bounds |
159
160
  | `commands_efficiency` | Continuous | Agent tool-call efficiency relative to expected budget |
160
161
  | `uipath_eval` | Fractional | UiPath agent evaluation results |
161
162
  | `classification_match` | Binary | File-based label match (observed vs expected) with `(none)`/`(other)` sentinels; emits `ClassificationCriterionResult` for suite-level P/R/F1 |
@@ -163,7 +164,7 @@ action.yml # Published composite GitHub Action (coder-ev
163
164
  | `llm_judge` | Continuous | LLM grades artifacts + optional trajectory + optional reference; routes through the run's backend (Bedrock / Anthropic) |
164
165
  | `agent_judge` | Continuous | Spawns a Claude Code SDK agent in an isolated sandbox copy; judge uses tools (Bash/Read/Grep/…) to investigate and returns a JSON verdict. Expensive; runs with evaluator credentials — see SECURITY note in the criterion docstring. |
165
166
 
166
- All criteria support `weight` (default 1.0) and `pass_threshold` (default 0.9), plus `stop_when` (`pass`/`fail`/`decided`/`auto`, default `null`) which arms the criterion for early stop when `run_limits.stop_early` is set (observable criteria only; `auto` arms the instance's own decidable polarities). On dataset-backed tasks, criteria may also set `suite_thresholds: {metric: min_value}` — the suite gate passes iff every listed metric (from the criterion's `aggregate()` output) meets its minimum.
167
+ All criteria support `weight` (default 1.0) and `pass_threshold` (default 0.9), plus (on live criteria only) a `stop_early:` block (`on_pass`, `decide_within`) that arms the criterion for early stop by its presence. On dataset-backed tasks, criteria may also set `suite_thresholds: {metric: min_value}` — the suite gate passes iff every listed metric (from the criterion's `aggregate()` output) meets its minimum.
167
168
 
168
169
  ## Evaluation Flow
169
170
 
@@ -200,7 +201,7 @@ make lint # custom architectural lint rules (CE001+)
200
201
  make verify # All of the above + coverage check (CI equivalent)
201
202
  ```
202
203
 
203
- When fixing a bug, ask: *could a custom lint rule have prevented this?* If the root cause is a mechanically detectable pattern (e.g., "always import from `coder_eval.models`", "never call blocking IO in async"), add a rule to `tests/lint/rules/` following the CE001+ pattern and wire it up in `tests/lint/runner.py`. This turns a one-time fix into permanent enforcement. See `tests/test_custom_lint.py` for how rules are tested. (Doc-surface / whole-tree rules that reason over Markdown/YAML or the entire `src/` tree rather than one `.py` AST at a time — CE027–CE031 — are not `BaseRule`s in the runner; they are wired as dedicated `@pytest.mark.lint` test classes. CE031 guards against dead config: a behavior-driving field on `SimulationConfig`/`RunLimits`/`Dataset` that no code reads by name.)
204
+ When fixing a bug, ask: *could a custom lint rule have prevented this?* If the root cause is a mechanically detectable pattern (e.g., "always import from `coder_eval.models`", "never call blocking IO in async"), add a rule to `tests/lint/rules/` following the CE001+ pattern and wire it up in `tests/lint/runner.py`. This turns a one-time fix into permanent enforcement. See `tests/test_custom_lint.py` for how rules are tested. (Doc-surface / whole-tree rules that reason over Markdown/YAML or the entire `src/` tree rather than one `.py` AST at a time — CE026–CE031 — are not `BaseRule`s in the runner; they are wired as dedicated `@pytest.mark.lint` test classes. CE031 guards against dead config: a behavior-driving field on `SimulationConfig`/`RunLimits`/`Dataset` that no code reads by name. CE026 keeps the GitHub Action's three onboarding surfaces honest: a page's *first* Action snippet must show the agent-runtime prerequisite steps (pinned to the `action-dogfood` job that proves them in CI), a zero-install absolute next to such a snippet must name the channel it means, and every `github.com/marketplace/actions/<slug>` link plus the shields badge label must match `action.yml`'s `name:`.)
204
205
 
205
206
  Adding a user-facing field to one of the models CE030 tracks (`TaskDefinition`, `RunLimits`, `Dataset`, `SimulationConfig` — see `tests/lint/doc_schema_parity.py`) means documenting it in its guide (mention the field name as inline code) or adding an `EXEMPT` entry with a reason it is not user-authored. `make lint` fails otherwise.
206
207
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coder-eval
3
- Version: 0.9.3
3
+ Version: 0.9.5
4
4
  Summary: Evaluate, benchmark, and A/B-test AI coding agents (Claude Code, Codex, Gemini/Antigravity) with sandboxed, reproducible YAML task suites.
5
5
  Project-URL: Homepage, https://coder-eval.com
6
6
  Project-URL: Repository, https://github.com/UiPath/coder_eval
@@ -64,8 +64,8 @@ Description-Content-Type: text/markdown
64
64
  # Coder Eval — evaluate & benchmark AI coding agents and Claude Code skills
65
65
 
66
66
  [![PyPI](https://img.shields.io/pypi/v/coder-eval.svg)](https://pypi.org/project/coder-eval/)
67
+ [![GitHub Marketplace](https://img.shields.io/badge/marketplace-coder__eval-2ea44f.svg)](https://github.com/marketplace/actions/coder_eval)
67
68
  [![Website](https://img.shields.io/badge/website-coder--eval.com-1f6feb.svg)](https://coder-eval.com)
68
- [![Docs](https://img.shields.io/badge/docs-coder--eval.com%2Fdocs-1f6feb.svg)](https://coder-eval.com/docs)
69
69
  [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
70
70
  [![Python 3.13+](https://img.shields.io/badge/python-3.13%2B-blue.svg)](https://www.python.org/downloads/)
71
71
  [![CI](https://github.com/UiPath/coder_eval/actions/workflows/pr-checks.yml/badge.svg)](https://github.com/UiPath/coder_eval/actions/workflows/pr-checks.yml)
@@ -160,12 +160,18 @@ the full setup.
160
160
 
161
161
  ## Use as a GitHub Action
162
162
 
163
- A composite action at the repo root runs `coder-eval` as a CI gate — it installs
164
- the pinned CLI, runs your tasks, writes a JUnit XML report, appends `run.md` to
165
- the job summary, and fails the step on any task/gate failure:
163
+ A composite action on the Marketplace as
164
+ [**coder_eval**](https://github.com/marketplace/actions/coder_eval) runs
165
+ `coder-eval` as a CI gate. It installs the pinned CLI, runs your tasks, writes a
166
+ JUnit XML report, appends `run.md` to the job summary, and fails the step on any
167
+ task/gate failure:
166
168
 
167
169
  ```yaml
168
- - uses: UiPath/coder_eval@v0 # becomes @v1 once 1.0.0 ships; @vX.Y.Z pins exactly
170
+ - uses: actions/setup-node@v4 # the claude-code agent needs the Claude CLI…
171
+ with: { node-version: '20' }
172
+ - run: npm install -g @anthropic-ai/claude-code
173
+
174
+ - uses: UiPath/coder_eval@v0 # …then run the gate (@v1 once 1.0.0 ships; @vX.Y.Z pins exactly)
169
175
  with:
170
176
  tasks: tests/tasks/**/*.yaml
171
177
  model: claude-sonnet-5
@@ -217,9 +223,11 @@ code: the step fails if *either* coder-eval exits non-zero *or* any task's
217
223
  alone.
218
224
 
219
225
  > **Agent runtime is the caller's responsibility.** The action is agent-agnostic —
220
- > it installs `coder-eval` but no coding-agent runtime. Tasks using the default
221
- > `claude-code` agent need the `claude` CLI on `PATH` (`actions/setup-node` +
222
- > `npm install -g @anthropic-ai/claude-code`) in the job before the action runs.
226
+ > it installs `coder-eval` but no coding-agent runtime, which is why the example
227
+ > above starts with `actions/setup-node` +
228
+ > `npm install -g @anthropic-ai/claude-code`: the default `claude-code` agent
229
+ > needs the `claude` CLI on `PATH` before the action runs. Swap those steps for
230
+ > your own agent's runtime as needed.
223
231
 
224
232
  > **Security.** Evaluated tasks execute agent-generated code. Do **not** run this
225
233
  > action under `pull_request_target` with secrets exposed to untrusted fork PRs —
@@ -251,7 +259,7 @@ alone.
251
259
  | [Bring Your Own Dataset](docs/DATASETS.md) | Fan a single task out over a dataset |
252
260
  | [Dialog Mode](docs/DIALOG_MODE.md) | Evaluate agents in multi-turn conversation via a simulated user |
253
261
  | [Docker Isolation](docs/DOCKER_ISOLATION.md) | The container sandbox driver, with custom images |
254
- | [CI Gate & GitHub Action](docs/CI_GATE.md) | Run Coder Eval as a CI gate — the packaged Action, JUnit output, score floor |
262
+ | [CI Gate & GitHub Action](docs/CI_GATE.md) | Run Coder Eval as a CI gate — the Marketplace Action, JUnit output, score floor |
255
263
  | [Extending Coder Eval](docs/EXTENDING.md) | Author a custom agent, criterion, or model pricing via the plugin SPI |
256
264
  | [Report Schema](docs/REPORT_SCHEMA.md) | Field-level reference for run.json / variant.json / task.json |
257
265
  | [How It Compares](docs/comparison.md) | vs. SWE-bench, SkillsBench, Harbor, OpenAI Evals, hand-rolled scripts |
@@ -1,8 +1,8 @@
1
1
  # Coder Eval — evaluate & benchmark AI coding agents and Claude Code skills
2
2
 
3
3
  [![PyPI](https://img.shields.io/pypi/v/coder-eval.svg)](https://pypi.org/project/coder-eval/)
4
+ [![GitHub Marketplace](https://img.shields.io/badge/marketplace-coder__eval-2ea44f.svg)](https://github.com/marketplace/actions/coder_eval)
4
5
  [![Website](https://img.shields.io/badge/website-coder--eval.com-1f6feb.svg)](https://coder-eval.com)
5
- [![Docs](https://img.shields.io/badge/docs-coder--eval.com%2Fdocs-1f6feb.svg)](https://coder-eval.com/docs)
6
6
  [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
7
7
  [![Python 3.13+](https://img.shields.io/badge/python-3.13%2B-blue.svg)](https://www.python.org/downloads/)
8
8
  [![CI](https://github.com/UiPath/coder_eval/actions/workflows/pr-checks.yml/badge.svg)](https://github.com/UiPath/coder_eval/actions/workflows/pr-checks.yml)
@@ -97,12 +97,18 @@ the full setup.
97
97
 
98
98
  ## Use as a GitHub Action
99
99
 
100
- A composite action at the repo root runs `coder-eval` as a CI gate — it installs
101
- the pinned CLI, runs your tasks, writes a JUnit XML report, appends `run.md` to
102
- the job summary, and fails the step on any task/gate failure:
100
+ A composite action on the Marketplace as
101
+ [**coder_eval**](https://github.com/marketplace/actions/coder_eval) runs
102
+ `coder-eval` as a CI gate. It installs the pinned CLI, runs your tasks, writes a
103
+ JUnit XML report, appends `run.md` to the job summary, and fails the step on any
104
+ task/gate failure:
103
105
 
104
106
  ```yaml
105
- - uses: UiPath/coder_eval@v0 # becomes @v1 once 1.0.0 ships; @vX.Y.Z pins exactly
107
+ - uses: actions/setup-node@v4 # the claude-code agent needs the Claude CLI…
108
+ with: { node-version: '20' }
109
+ - run: npm install -g @anthropic-ai/claude-code
110
+
111
+ - uses: UiPath/coder_eval@v0 # …then run the gate (@v1 once 1.0.0 ships; @vX.Y.Z pins exactly)
106
112
  with:
107
113
  tasks: tests/tasks/**/*.yaml
108
114
  model: claude-sonnet-5
@@ -154,9 +160,11 @@ code: the step fails if *either* coder-eval exits non-zero *or* any task's
154
160
  alone.
155
161
 
156
162
  > **Agent runtime is the caller's responsibility.** The action is agent-agnostic —
157
- > it installs `coder-eval` but no coding-agent runtime. Tasks using the default
158
- > `claude-code` agent need the `claude` CLI on `PATH` (`actions/setup-node` +
159
- > `npm install -g @anthropic-ai/claude-code`) in the job before the action runs.
163
+ > it installs `coder-eval` but no coding-agent runtime, which is why the example
164
+ > above starts with `actions/setup-node` +
165
+ > `npm install -g @anthropic-ai/claude-code`: the default `claude-code` agent
166
+ > needs the `claude` CLI on `PATH` before the action runs. Swap those steps for
167
+ > your own agent's runtime as needed.
160
168
 
161
169
  > **Security.** Evaluated tasks execute agent-generated code. Do **not** run this
162
170
  > action under `pull_request_target` with secrets exposed to untrusted fork PRs —
@@ -188,7 +196,7 @@ alone.
188
196
  | [Bring Your Own Dataset](docs/DATASETS.md) | Fan a single task out over a dataset |
189
197
  | [Dialog Mode](docs/DIALOG_MODE.md) | Evaluate agents in multi-turn conversation via a simulated user |
190
198
  | [Docker Isolation](docs/DOCKER_ISOLATION.md) | The container sandbox driver, with custom images |
191
- | [CI Gate & GitHub Action](docs/CI_GATE.md) | Run Coder Eval as a CI gate — the packaged Action, JUnit output, score floor |
199
+ | [CI Gate & GitHub Action](docs/CI_GATE.md) | Run Coder Eval as a CI gate — the Marketplace Action, JUnit output, score floor |
192
200
  | [Extending Coder Eval](docs/EXTENDING.md) | Author a custom agent, criterion, or model pricing via the plugin SPI |
193
201
  | [Report Schema](docs/REPORT_SCHEMA.md) | Field-level reference for run.json / variant.json / task.json |
194
202
  | [How It Compares](docs/comparison.md) | vs. SWE-bench, SkillsBench, Harbor, OpenAI Evals, hand-rolled scripts |
@@ -1,4 +1,12 @@
1
- name: coder-eval
1
+ # `name` is the GitHub Marketplace listing title and must be globally unique
2
+ # across Marketplace actions, users, AND organizations. `coder-eval` is taken by
3
+ # an unrelated squatted org (github.com/coder-eval), so the listing uses the
4
+ # underscored repo name instead. This value is display-only: consumers reference
5
+ # the action by repo path (`uses: UiPath/coder_eval@v0`), never by this name.
6
+ name: coder_eval
7
+ # Matches the authorship the project already declares in pyproject.toml
8
+ # (`authors = [{ name = "UiPath", ... }]`) and NOTICE (`© 2026 UiPath`).
9
+ author: UiPath
2
10
  description: Run coder-eval evaluation tasks as a CI gate, with JUnit XML output and a job-summary report.
3
11
  branding:
4
12
  icon: check-circle
@@ -33,7 +41,7 @@ inputs:
33
41
  version:
34
42
  description: coder-eval version to install from PyPI, or "local" to install from the action checkout
35
43
  required: false
36
- default: "0.9.3" # <-- kept in sync with releases by release.yml
44
+ default: "0.9.5" # <-- kept in sync with releases by release.yml
37
45
  run-dir:
38
46
  description: Run directory (--run-dir)
39
47
  required: false
@@ -268,11 +268,12 @@ variant's, on the already-mutated prompt.
268
268
  ## Recipe: Smoke vs. e2e Flavors (Early Stop)
269
269
 
270
270
  Run the **same** task file as both a fast `smoke` flavor and a full `e2e` flavor
271
- by flipping one boolean per variant `run_limits.stop_early`. Arm the criteria
272
- that define "the interesting thing happened" with `stop_when` in the task file;
271
+ with a one-line kill switch on the reference variant. Arm the criteria
272
+ that define "the interesting thing happened" with `stop_early:` blocks in the
273
+ task file;
273
274
  the `smoke` variant cuts off as soon as they're decided, while `e2e` runs to
274
275
  completion. Because the field merge is per-key, the variant sets only
275
- `stop_early` without disturbing the task's `max_turns`.
276
+ `stop_early` (the run-level kill switch) without disturbing the task's `max_turns`.
276
277
 
277
278
  ```yaml
278
279
  experiment_id: early-stop-ab
@@ -281,13 +282,12 @@ description: "Smoke vs. e2e from one file via opt-in early stop"
281
282
  variants:
282
283
  - variant_id: e2e
283
284
  run_limits:
284
- stop_early: false # full run to completion (the reference flavor)
285
+ stop_early: false # kill switch: force-disarm the blocks (the reference flavor)
285
286
  - variant_id: smoke
286
- run_limits:
287
- stop_early: true # cut off once the armed criteria are decided
287
+ # no override needed: the task's stop_early: blocks arm the watcher
288
288
  ```
289
289
 
290
- The task file supplies the arming (`stop_when` on the criteria that gate the
290
+ The task file supplies the arming (`stop_early:` blocks on the criteria that gate the
291
291
  flavor) and a `max_turns` generous enough for `e2e`; see
292
292
  [`stop_early`](TASK_DEFINITION_GUIDE.md#stop_early-opt-in-early-stop). This recipe
293
293
  ships as `experiments/early-stop-ab.yaml`.
@@ -1,25 +1,34 @@
1
1
  ---
2
2
  description: >-
3
- Run Coder Eval as a CI gate — the packaged composite GitHub Action, JUnit XML
4
- output for test-report ingestion, and an optional per-task score floor.
3
+ Run Coder Eval as a CI gate — the coder_eval GitHub Action from the Actions
4
+ Marketplace, JUnit XML output for test-report ingestion, and an optional
5
+ per-task score floor.
5
6
  ---
6
7
 
7
8
  # CI Gate: GitHub Action & JUnit reports
8
9
 
9
- Coder Eval ships a **packaged CI gate**: a composite GitHub Action that installs
10
- the CLI, runs your tasks, emits a JUnit XML report, appends the run summary to the
11
- job summary, and fails the build on any task/gate failure. This page is the
12
- reference for the Action and the JUnit output. For a step-by-step walkthrough
10
+ Coder Eval ships a **packaged CI gate**: a composite GitHub Action on the
11
+ Actions Marketplace as
12
+ [**coder_eval**](https://github.com/marketplace/actions/coder_eval) that
13
+ installs the CLI, runs your tasks, emits a JUnit XML report, appends the run
14
+ summary to the job summary, and fails the build on any task/gate failure. This
15
+ page is the reference for the Action and the JUnit output. For a walkthrough
13
16
  (including a hand-rolled workflow), see
14
17
  [Tutorial 02 — Running Coder Eval in CI](tutorials/02-ci-pipeline.md).
15
18
 
16
19
  ## The GitHub Action
17
20
 
18
- A composite action lives at the repo root (`action.yml`), so you can reference it
19
- directly:
21
+ The action is published on the GitHub Actions Marketplace as
22
+ [**coder_eval**](https://github.com/marketplace/actions/coder_eval). It is a
23
+ composite action living at the repo root (`action.yml`), so you reference it by
24
+ repo path — there is no Marketplace install step:
20
25
 
21
26
  ```yaml
22
- - uses: UiPath/coder_eval@v0 # becomes @v1 once 1.0.0 ships; @vX.Y.Z pins exactly
27
+ - uses: actions/setup-node@v4 # the claude-code agent needs the Claude CLI…
28
+ with: { node-version: '20' }
29
+ - run: npm install -g @anthropic-ai/claude-code
30
+
31
+ - uses: UiPath/coder_eval@v0 # …then run the gate (@v1 once 1.0.0 ships; @vX.Y.Z pins exactly)
23
32
  with:
24
33
  tasks: tests/tasks/**/*.yaml
25
34
  model: claude-sonnet-5
@@ -27,10 +36,11 @@ directly:
27
36
  ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}
28
37
  ```
29
38
 
30
- The action is **agent-agnostic** — it installs `coder-eval` but *not* any
31
- coding-agent runtime. Tasks using the default `claude-code` agent need the
32
- `claude` CLI on `PATH` (Node + `@anthropic-ai/claude-code`), provided by your job
33
- *before* this step runs.
39
+ The first two steps are there because the action is **agent-agnostic** — it
40
+ installs `coder-eval` but *not* any coding-agent runtime. Tasks using the default
41
+ `claude-code` agent need the `claude` CLI on `PATH` (Node +
42
+ `@anthropic-ai/claude-code`), provided by your job *before* the action runs; swap
43
+ those steps for your own agent's runtime as needed.
34
44
 
35
45
  ### Inputs
36
46
 
@@ -69,9 +69,10 @@ calls the agent's `communicate()`, so Codex and plugin agents work. The *simulat
69
69
  always a Claude Code agent. A dialog run therefore needs the `claude` CLI on `PATH` and working
70
70
  Anthropic or Bedrock credentials **even when the agent under test is not Claude**.
71
71
 
72
- **Early stop is not available here.** [`run_limits.stop_early`](TASK_DEFINITION_GUIDE.md#stop_early-opt-in-early-stop)
73
- is single-shot-only; arming it alongside `simulation.enabled` is a hard error at resolution time, not
74
- a silent no-op. Use `stop_on_criteria_pass` (below) for the dialog equivalent.
72
+ **Early stop is not available here.** [Criterion-level `stop_early:` arming](TASK_DEFINITION_GUIDE.md#stop_early-opt-in-early-stop)
73
+ is single-shot-only; an armed criterion alongside `simulation.enabled` is a hard error at resolution
74
+ time, not a silent no-op (disarm with the `run_limits.stop_early: false` kill switch to run anyway).
75
+ Use `stop_on_criteria_pass` (below) for the dialog equivalent.
75
76
 
76
77
  Every field's default and constraint lives in one place — the
77
78
  [Task Definition Guide's simulation section](TASK_DEFINITION_GUIDE.md#simulation-multi-turn-user-dialog).
@@ -109,7 +109,7 @@ turn, and `ToolStart`/`ToolEnd` per tool call (close orphaned tools with
109
109
  returned `TurnRecord`, the single agent-agnostic capture path.
110
110
 
111
111
  Set `supports_cooperative_stop: ClassVar[bool] = True` only if your `communicate()`
112
- actually honors `should_stop` (needed for `run_limits.stop_early`). Leaving it
112
+ actually honors `should_stop` (needed for criterion-level `stop_early:` arming). Leaving it
113
113
  `False` means early stop is rejected at resolution for your agent — which is correct
114
114
  if you can't stop cooperatively.
115
115
 
@@ -146,7 +146,7 @@ class MyCriterion(BaseSuccessCriterion):
146
146
  Union membership is required — a run validates that every union member's `type` has a
147
147
  registered checker, and rejects unknown `type` tags in YAML. `BaseSuccessCriterion`
148
148
  gives you `description`, `weight` (default 1.0; `0` = informational/non-gating),
149
- `pass_threshold` (default 0.9), `stop_when`, and `suite_thresholds` for free, with
149
+ `pass_threshold` (default 0.9) and `suite_thresholds` for free, with
150
150
  `extra="forbid"` so YAML typos are caught.
151
151
 
152
152
  ### Step 2 — the checker
@@ -189,8 +189,9 @@ backend), `num_turns`, `max_turns_exhausted`,
189
189
 
190
190
  Present (non-`null`) iff the run stopped early — there is no separate boolean.
191
191
  Fields: `reason` (`criterion_passed` / `criterion_failed` /
192
- `decision_budget_exceeded` — the last forces `FinalStatus.FAILURE` outright,
193
- bypassing the weighted gate),
192
+ `decision_budget_exceeded` — the last marks a fail-stop whose deciding
193
+ criterion timed out undecided past its `stop_early.decide_within`; it gates through
194
+ the same weighted armed gate as a native fail),
194
195
  `deciding_criterion_type`, `deciding_criterion_description`, `armed_criteria`,
195
196
  `sdk_turn_index`, `tool_call_index` (1-based, includes the in-flight call),
196
197
  `elapsed_seconds`, `turns_remaining_at_stop`, `gate_threshold` (the