coder-eval 0.8.9__tar.gz → 0.8.10__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 (573) hide show
  1. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/harness-candidates.md +16 -0
  2. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/docs.yml +11 -6
  3. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/pr-checks.yml +58 -0
  4. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/release.yml +33 -6
  5. {coder_eval-0.8.9 → coder_eval-0.8.10}/CHANGELOG.md +115 -0
  6. {coder_eval-0.8.9 → coder_eval-0.8.10}/CLAUDE.md +12 -4
  7. {coder_eval-0.8.9 → coder_eval-0.8.10}/Makefile +4 -1
  8. {coder_eval-0.8.9 → coder_eval-0.8.10}/PKG-INFO +93 -13
  9. {coder_eval-0.8.9 → coder_eval-0.8.10}/README.md +90 -11
  10. coder_eval-0.8.10/action.yml +209 -0
  11. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/AB_EXPERIMENTS.md +50 -12
  12. coder_eval-0.8.10/docs/CI_GATE.md +147 -0
  13. coder_eval-0.8.10/docs/DATASETS.md +276 -0
  14. coder_eval-0.8.10/docs/DIALOG_MODE.md +237 -0
  15. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/DOCKER_ISOLATION.md +58 -1
  16. coder_eval-0.8.10/docs/EXTENDING.md +239 -0
  17. coder_eval-0.8.10/docs/REPORT_SCHEMA.md +256 -0
  18. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/TASK_DEFINITION_GUIDE.md +240 -46
  19. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/USER_GUIDE.md +86 -7
  20. coder_eval-0.8.10/docs/agents/ANTIGRAVITY.md +203 -0
  21. coder_eval-0.8.10/docs/agents/CLAUDE_CODE.md +194 -0
  22. coder_eval-0.8.9/docs/CODEX_AGENT_GUIDE.md → coder_eval-0.8.10/docs/agents/CODEX.md +6 -6
  23. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/comparison.md +3 -3
  24. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/index.md +13 -5
  25. coder_eval-0.8.10/docs/llms.txt +56 -0
  26. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/02-ci-pipeline.md +75 -3
  27. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/03-evalboard-local.md +3 -3
  28. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/04-writing-a-task.md +2 -2
  29. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/05-comparing-models.md +1 -1
  30. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/06-use-docker-isolation.md +1 -1
  31. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/README.md +2 -2
  32. {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/early-stop-ab.yaml +5 -3
  33. {coder_eval-0.8.9 → coder_eval-0.8.10}/mkdocs.yml +36 -10
  34. {coder_eval-0.8.9 → coder_eval-0.8.10}/pyproject.toml +3 -2
  35. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/__init__.py +1 -1
  36. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/report_command.py +21 -3
  37. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/run_command.py +19 -0
  38. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/criteria.py +7 -2
  39. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/limits.py +9 -6
  40. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/tasks.py +5 -8
  41. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/early_stop.py +114 -21
  42. coder_eval-0.8.10/src/coder_eval/reports_junit.py +431 -0
  43. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -1
  44. coder_eval-0.8.10/tests/conftest.py +108 -0
  45. coder_eval-0.8.10/tests/lint/dead_config_fields.py +83 -0
  46. coder_eval-0.8.10/tests/lint/doc_env_parity.py +125 -0
  47. coder_eval-0.8.10/tests/lint/doc_examples.py +211 -0
  48. coder_eval-0.8.10/tests/lint/doc_indexes.py +283 -0
  49. coder_eval-0.8.10/tests/lint/doc_schema_parity.py +85 -0
  50. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_custom_lint.py +535 -0
  51. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_early_stop.py +164 -4
  52. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_report_command.py +52 -0
  53. coder_eval-0.8.10/tests/test_reports_junit.py +863 -0
  54. coder_eval-0.8.10/tests/test_run_command_junit.py +77 -0
  55. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_simulation_config.py +0 -1
  56. {coder_eval-0.8.9 → coder_eval-0.8.10}/uv.lock +3 -1
  57. coder_eval-0.8.9/docs/BYOD.md +0 -210
  58. coder_eval-0.8.9/docs/IDEAS.md +0 -459
  59. coder_eval-0.8.9/docs/llms.txt +0 -46
  60. coder_eval-0.8.9/tests/conftest.py +0 -56
  61. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-code-review-full.md +0 -0
  62. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-code-review-wf.md +0 -0
  63. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-code-review.md +0 -0
  64. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-create-plan.md +0 -0
  65. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-implement-plan.md +0 -0
  66. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-review.md +0 -0
  67. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-run-analysis.md +0 -0
  68. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-task-create.md +0 -0
  69. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/shared/axes.md +0 -0
  70. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/shared/multi-model-review.md +0 -0
  71. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/shared/review-rubric.md +0 -0
  72. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/shared/run-layout.md +0 -0
  73. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/workflows/cr-axis.js +0 -0
  74. {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/workflows/cr-parent.js +0 -0
  75. {coder_eval-0.8.9 → coder_eval-0.8.10}/.env.example +0 -0
  76. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/CODEOWNERS +0 -0
  77. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
  78. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  79. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  80. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/code_review.md +0 -0
  81. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/dependabot.yml +0 -0
  82. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/claude-pr-review.yml +0 -0
  83. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/codeql.yml +0 -0
  84. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/conventional-commits.yml +0 -0
  85. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/docker-publish.yml +0 -0
  86. {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/publish-testpypi.yml +0 -0
  87. {coder_eval-0.8.9 → coder_eval-0.8.10}/.gitignore +0 -0
  88. {coder_eval-0.8.9 → coder_eval-0.8.10}/.pre-commit-config.yaml +0 -0
  89. {coder_eval-0.8.9 → coder_eval-0.8.10}/.python-version +0 -0
  90. {coder_eval-0.8.9 → coder_eval-0.8.10}/ADOPTERS.md +0 -0
  91. {coder_eval-0.8.9 → coder_eval-0.8.10}/CODE_OF_CONDUCT.md +0 -0
  92. {coder_eval-0.8.9 → coder_eval-0.8.10}/CONTRIBUTING.md +0 -0
  93. {coder_eval-0.8.9 → coder_eval-0.8.10}/LICENSE +0 -0
  94. {coder_eval-0.8.9 → coder_eval-0.8.10}/NOTICE +0 -0
  95. {coder_eval-0.8.9 → coder_eval-0.8.10}/SECURITY.md +0 -0
  96. {coder_eval-0.8.9 → coder_eval-0.8.10}/docker/Dockerfile +0 -0
  97. {coder_eval-0.8.9 → coder_eval-0.8.10}/docker/Dockerfile.runtime +0 -0
  98. {coder_eval-0.8.9 → coder_eval-0.8.10}/docker/coder_eval_entrypoint.sh +0 -0
  99. {coder_eval-0.8.9 → coder_eval-0.8.10}/docker/coder_eval_runtime_entrypoint.sh +0 -0
  100. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/assets/hero.gif +0 -0
  101. {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/01-first-evaluation.md +0 -0
  102. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/.gitignore +0 -0
  103. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/README.md +0 -0
  104. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
  105. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/col-help.tsx +0 -0
  106. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/collapsible-rail.tsx +0 -0
  107. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/harness-badge.tsx +0 -0
  108. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/harness-selector.tsx +0 -0
  109. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/scroll-table.tsx +0 -0
  110. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/search-box.tsx +0 -0
  111. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/unit-toggle.tsx +0 -0
  112. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/version-list.tsx +0 -0
  113. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/window-selector.tsx +0 -0
  114. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_overview/daily-chart.tsx +0 -0
  115. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_overview/tag-rail.tsx +0 -0
  116. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
  117. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_overview/window-summary.tsx +0 -0
  118. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/api/download/route.ts +0 -0
  119. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/api/file/route.ts +0 -0
  120. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
  121. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/api/refresh/route.ts +0 -0
  122. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/error.tsx +0 -0
  123. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/globals.css +0 -0
  124. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/icon.png +0 -0
  125. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/layout.tsx +0 -0
  126. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/page.tsx +0 -0
  127. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/path-to-ga/page.tsx +0 -0
  128. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
  129. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/trends/actions.ts +0 -0
  130. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/trends/page.tsx +0 -0
  131. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/trends/trends-view.tsx +0 -0
  132. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
  133. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/watchlist/page.tsx +0 -0
  134. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
  135. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/next-env.d.ts +0 -0
  136. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/next.config.mjs +0 -0
  137. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/package.json +0 -0
  138. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/pnpm-lock.yaml +0 -0
  139. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/postcss.config.mjs +0 -0
  140. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/public/harness/antigravity.png +0 -0
  141. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/public/harness/claude-code.png +0 -0
  142. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/public/harness/codex.png +0 -0
  143. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/public/uipath.png +0 -0
  144. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/tailwind.config.ts +0 -0
  145. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/tsconfig.json +0 -0
  146. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/vitest.config.ts +0 -0
  147. {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/vitest.setup.ts +0 -0
  148. {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/default.yaml +0 -0
  149. {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/model-comparison.yaml +0 -0
  150. {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/permissions-smoke.yaml +0 -0
  151. {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/plugin-comparison.yaml +0 -0
  152. {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/prompt-mutations-example.yaml +0 -0
  153. {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/smoke_variants.yaml +0 -0
  154. {coder_eval-0.8.9 → coder_eval-0.8.10}/osv-scanner.toml +0 -0
  155. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/.gitattributes +0 -0
  156. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agent.py +0 -0
  157. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/__init__.py +0 -0
  158. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/_logging.py +0 -0
  159. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/antigravity_agent.py +0 -0
  160. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/claude_code_agent.py +0 -0
  161. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/codex_agent.py +0 -0
  162. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/noop_agent.py +0 -0
  163. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/registry.py +0 -0
  164. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/watchdog.py +0 -0
  165. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/analysis.py +0 -0
  166. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/__init__.py +0 -0
  167. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/aggregate_command.py +0 -0
  168. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/console.py +0 -0
  169. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/evaluate_command.py +0 -0
  170. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/plan_command.py +0 -0
  171. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/run_helpers.py +0 -0
  172. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/run_task_internal_command.py +0 -0
  173. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/utils.py +0 -0
  174. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/config.py +0 -0
  175. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/__init__.py +0 -0
  176. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
  177. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/agent_judge.py +0 -0
  178. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/base.py +0 -0
  179. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/classification_match.py +0 -0
  180. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/command_executed.py +0 -0
  181. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/commands_efficiency.py +0 -0
  182. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/file_check.py +0 -0
  183. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/file_contains.py +0 -0
  184. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/file_exists.py +0 -0
  185. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/file_matches_regex.py +0 -0
  186. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/json_check.py +0 -0
  187. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/llm_judge.py +0 -0
  188. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/reference_comparison.py +0 -0
  189. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/run_command.py +0 -0
  190. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/skill_triggered.py +0 -0
  191. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/uipath_eval.py +0 -0
  192. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/__init__.py +0 -0
  193. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/agent.py +0 -0
  194. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/budget.py +0 -0
  195. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/categories.py +0 -0
  196. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/categorization.py +0 -0
  197. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/executor.py +0 -0
  198. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/judge.py +0 -0
  199. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/retry.py +0 -0
  200. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/timeout.py +0 -0
  201. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/__init__.py +0 -0
  202. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/checker.py +0 -0
  203. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
  204. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
  205. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_context.py +0 -0
  206. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_models.py +0 -0
  207. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_persistence.py +0 -0
  208. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_usage.py +0 -0
  209. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/sub_agent.py +0 -0
  210. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/summaries.py +0 -0
  211. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/verdict_tool.py +0 -0
  212. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/formatting.py +0 -0
  213. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/isolation/__init__.py +0 -0
  214. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/isolation/docker_runner.py +0 -0
  215. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/logging_config.py +0 -0
  216. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/__init__.py +0 -0
  217. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/agent_config.py +0 -0
  218. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/container_paths.py +0 -0
  219. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/enums.py +0 -0
  220. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/experiment.py +0 -0
  221. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/judge.py +0 -0
  222. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/judge_defaults.py +0 -0
  223. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/merge_strategy.py +0 -0
  224. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/mutations.py +0 -0
  225. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/results.py +0 -0
  226. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/routing.py +0 -0
  227. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/sandbox.py +0 -0
  228. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/telemetry.py +0 -0
  229. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/templates.py +0 -0
  230. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/__init__.py +0 -0
  231. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/batch.py +0 -0
  232. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/config.py +0 -0
  233. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/config_merge.py +0 -0
  234. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/evaluation.py +0 -0
  235. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/experiment.py +0 -0
  236. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/overrides.py +0 -0
  237. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/task_loader.py +0 -0
  238. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestrator.py +0 -0
  239. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/path_utils.py +0 -0
  240. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/plugins.py +0 -0
  241. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/pricing.py +0 -0
  242. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/py.typed +0 -0
  243. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/reports.py +0 -0
  244. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/reports_experiment.py +0 -0
  245. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/reports_html.py +0 -0
  246. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/reports_stats.py +0 -0
  247. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/resources/__init__.py +0 -0
  248. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
  249. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/resources/tags.yaml +0 -0
  250. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/sandbox.py +0 -0
  251. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/__init__.py +0 -0
  252. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/ast_similarity.py +0 -0
  253. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/complexity.py +0 -0
  254. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/quality.py +0 -0
  255. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/signature_similarity.py +0 -0
  256. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/similarity.py +0 -0
  257. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/token_similarity.py +0 -0
  258. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/simulation/__init__.py +0 -0
  259. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/simulation/termination.py +0 -0
  260. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/simulation/user_simulator.py +0 -0
  261. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/__init__.py +0 -0
  262. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/callbacks.py +0 -0
  263. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/collector.py +0 -0
  264. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/events.py +0 -0
  265. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/renderers.py +0 -0
  266. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/wire.py +0 -0
  267. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/telemetry.py +0 -0
  268. {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/utils.py +0 -0
  269. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/README.md +0 -0
  270. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agentless_smoke_test.yaml +0 -0
  271. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/antigravity_hello_world.yaml +0 -0
  272. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
  273. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/claude_hello_world.yaml +0 -0
  274. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/claude_hello_world_docker.yaml +0 -0
  275. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
  276. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/claude_subagent_test.yaml +0 -0
  277. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
  278. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_hello_world.yaml +0 -0
  279. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_parallel_commands.yaml +0 -0
  280. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
  281. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_skills_test.yaml +0 -0
  282. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_string_utils.yaml +0 -0
  283. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_subagent_test.yaml +0 -0
  284. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/subagent_bash_long_input.yaml +0 -0
  285. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/subagent_merge_sort.yaml +0 -0
  286. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/byod_smoke_test.yaml +0 -0
  287. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dataset_example.yaml +0 -0
  288. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/datasets/sentiment.jsonl +0 -0
  289. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
  290. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
  291. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
  292. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/environment/input.txt +0 -0
  293. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
  294. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
  295. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/fibonacci_with_template.yaml +0 -0
  296. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/hello_date.yaml +0 -0
  297. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/inline_starter_example.yaml +0 -0
  298. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/internal/session_resumption.yaml +0 -0
  299. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_smoke.yaml +0 -0
  300. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
  301. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
  302. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
  303. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
  304. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
  305. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
  306. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
  307. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
  308. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
  309. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
  310. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
  311. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/README.md +0 -0
  312. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
  313. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
  314. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
  315. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
  316. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
  317. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
  318. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
  319. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
  320. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
  321. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
  322. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/sentiment_classification.yaml +0 -0
  323. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_agent_judge.yaml +0 -0
  324. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_budget_exceeded.yaml +0 -0
  325. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
  326. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_llm_judge.yaml +0 -0
  327. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_negative_path.yaml +0 -0
  328. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_task_timeout.yaml +0 -0
  329. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_variants.yaml +0 -0
  330. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/test_sandbox.yaml +0 -0
  331. {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/token_check.yaml +0 -0
  332. {coder_eval-0.8.9 → coder_eval-0.8.10}/templates/byod_smoke_test/Dockerfile +0 -0
  333. {coder_eval-0.8.9 → coder_eval-0.8.10}/templates/fibonacci-starter/README.md +0 -0
  334. {coder_eval-0.8.9 → coder_eval-0.8.10}/templates/fibonacci-starter/src/main.py +0 -0
  335. {coder_eval-0.8.9 → coder_eval-0.8.10}/templates/fibonacci-starter/tests/test_main.py +0 -0
  336. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/__init__.py +0 -0
  337. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/__init__.py +0 -0
  338. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/__init__.py +0 -0
  339. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/_scrub.py +0 -0
  340. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
  341. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
  342. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
  343. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
  344. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
  345. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
  346. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
  347. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
  348. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
  349. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
  350. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
  351. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
  352. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
  353. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
  354. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
  355. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
  356. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
  357. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
  358. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
  359. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
  360. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/__init__.py +0 -0
  361. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
  362. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
  363. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
  364. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
  365. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/run_full.md +0 -0
  366. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
  367. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_path_helpers.py +0 -0
  368. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/__init__.py +0 -0
  369. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
  370. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
  371. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/mock_agent.py +0 -0
  372. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
  373. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
  374. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
  375. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/text_stub_agent.py +0 -0
  376. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/__init__.py +0 -0
  377. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/__init__.py +0 -0
  378. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/base.py +0 -0
  379. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
  380. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
  381. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
  382. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
  383. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
  384. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
  385. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
  386. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
  387. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
  388. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
  389. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
  390. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
  391. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_agent_timing_access.py +0 -0
  392. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
  393. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
  394. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_silent_except.py +0 -0
  395. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_submodule_model_imports.py +0 -0
  396. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
  397. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
  398. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
  399. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/open_explicit_encoding.py +0 -0
  400. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
  401. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/register_criterion_required.py +0 -0
  402. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
  403. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
  404. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/runner.py +0 -0
  405. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/violation.py +0 -0
  406. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent.py +0 -0
  407. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_config_no_timing_fields.py +0 -0
  408. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_config_optional_type.py +0 -0
  409. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_config_registry_dispatch.py +0 -0
  410. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_config_sdk_decoupling.py +0 -0
  411. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_golden_master.py +0 -0
  412. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_judge_criterion.py +0 -0
  413. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_telemetry.py +0 -0
  414. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_telemetry_advanced.py +0 -0
  415. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_timeout.py +0 -0
  416. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agentless.py +0 -0
  417. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_aggregate.py +0 -0
  418. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_antigravity_agent.py +0 -0
  419. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_byoa_plugin.py +0 -0
  420. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_byoa_plugin_live.py +0 -0
  421. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_byod_feature.py +0 -0
  422. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_checker_logging.py +0 -0
  423. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_classification_match.py +0 -0
  424. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_claude_settings_enforcement_live.py +0 -0
  425. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cleanup_preservation_guard.py +0 -0
  426. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_backend_flag.py +0 -0
  427. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_empty_glob.py +0 -0
  428. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_sdk_options.py +0 -0
  429. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_set_overrides.py +0 -0
  430. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_telemetry.py +0 -0
  431. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_type_flag.py +0 -0
  432. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_code_review_bugs.py +0 -0
  433. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_codex_agent.py +0 -0
  434. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_codex_agent_live.py +0 -0
  435. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_codex_agent_unit.py +0 -0
  436. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_codex_token_mapping.py +0 -0
  437. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_command_executed.py +0 -0
  438. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_command_statistics.py +0 -0
  439. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_command_telemetry_result_data.py +0 -0
  440. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_commands_efficiency.py +0 -0
  441. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_config_lineage.py +0 -0
  442. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_config_merge_engine.py +0 -0
  443. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_config_precedence.py +0 -0
  444. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_continuous_scoring.py +0 -0
  445. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_criterion_result_round_trip.py +0 -0
  446. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_dataset_expansion.py +0 -0
  447. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_debug_logging.py +0 -0
  448. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_build_failure.py +0 -0
  449. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_runner_container_death.py +0 -0
  450. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_runner_mounts.py +0 -0
  451. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_runner_stream_limit.py +0 -0
  452. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_wildcard_env.py +0 -0
  453. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_workdir_live.py +0 -0
  454. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_driver_resolver.py +0 -0
  455. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_error_handling.py +0 -0
  456. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_evaluate_command.py +0 -0
  457. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_evaluator.py +0 -0
  458. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_event_collector.py +0 -0
  459. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_cli.py +0 -0
  460. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_loader.py +0 -0
  461. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_models.py +0 -0
  462. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_reports.py +0 -0
  463. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_resolver.py +0 -0
  464. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_runner.py +0 -0
  465. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_file_check.py +0 -0
  466. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_file_contains_scoring.py +0 -0
  467. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_formatting.py +0 -0
  468. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_git_clone_failure.py +0 -0
  469. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_heartbeat_watchdog.py +0 -0
  470. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_ignore_patterns_negation.py +0 -0
  471. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_image_from_dockerfiles.py +0 -0
  472. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_integration.py +0 -0
  473. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_json_check.py +0 -0
  474. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_anthropic.py +0 -0
  475. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_bedrock.py +0 -0
  476. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_burn_in_live.py +0 -0
  477. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_context_builder.py +0 -0
  478. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_models.py +0 -0
  479. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_persistence.py +0 -0
  480. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_lint_no_top_level_run_limits.py +0 -0
  481. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_lint_runner.py +0 -0
  482. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_llm_judge_criterion.py +0 -0
  483. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_log_tail_buffer.py +0 -0
  484. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_logging.py +0 -0
  485. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_logging_isolation.py +0 -0
  486. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_merge_characterization.py +0 -0
  487. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_merge_strategy_annotations.py +0 -0
  488. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_merge_unification.py +0 -0
  489. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_models.py +0 -0
  490. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_mutations.py +0 -0
  491. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_new_criteria.py +0 -0
  492. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_node_env_config.py +0 -0
  493. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_optional_dependencies.py +0 -0
  494. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_orchestrator.py +0 -0
  495. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_orchestrator_error_log_tail.py +0 -0
  496. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_orchestrator_telemetry.py +0 -0
  497. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_overrides_engine.py +0 -0
  498. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_parallel.py +0 -0
  499. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_path_utils.py +0 -0
  500. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_plan_command.py +0 -0
  501. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_plugin_processing.py +0 -0
  502. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_plugins.py +0 -0
  503. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_post_run.py +0 -0
  504. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_pr_review_workflow.py +0 -0
  505. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_pre_run.py +0 -0
  506. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_preservation_mode.py +0 -0
  507. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_pricing_registry.py +0 -0
  508. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_comparison_scoring.py +0 -0
  509. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_evaluator.py +0 -0
  510. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_missing_file.py +0 -0
  511. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_models.py +0 -0
  512. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_orchestrator.py +0 -0
  513. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_registry.py +0 -0
  514. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_replicate_stats.py +0 -0
  515. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports.py +0 -0
  516. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports_experiment.py +0 -0
  517. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports_html.py +0 -0
  518. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports_stats.py +0 -0
  519. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports_stats_nonfinite.py +0 -0
  520. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_resolve_task_files.py +0 -0
  521. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_resume.py +0 -0
  522. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_retry_logic_comprehensive.py +0 -0
  523. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_routing.py +0 -0
  524. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_run_command_stdout.py +0 -0
  525. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_run_limits_models.py +0 -0
  526. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_run_limits_orchestrator.py +0 -0
  527. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_run_limits_resolver.py +0 -0
  528. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_runtime_tool_versions.py +0 -0
  529. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox.py +0 -0
  530. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_layer_builder.py +0 -0
  531. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_optional.py +0 -0
  532. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_security.py +0 -0
  533. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_symlink_preservation.py +0 -0
  534. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_templates.py +0 -0
  535. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_scorers.py +0 -0
  536. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_scoring_quality.py +0 -0
  537. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sdk_option_classification.py +0 -0
  538. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_simulation_integration.py +0 -0
  539. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_simulation_termination.py +0 -0
  540. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_simulation_trials.py +0 -0
  541. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_skill_triggered.py +0 -0
  542. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_agent_integration.py +0 -0
  543. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_batch.py +0 -0
  544. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_callbacks.py +0 -0
  545. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_cli.py +0 -0
  546. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_events.py +0 -0
  547. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_orchestrator.py +0 -0
  548. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_renderers.py +0 -0
  549. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_wire.py +0 -0
  550. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sub_agent_runner.py +0 -0
  551. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_success_criterion_union.py +0 -0
  552. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_suite_rollup.py +0 -0
  553. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_summaries.py +0 -0
  554. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_tags.py +0 -0
  555. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_task_definition_unknown_fields.py +0 -0
  556. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_teardown_interrupt.py +0 -0
  557. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_telemetry.py +0 -0
  558. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_template_env_expansion.py +0 -0
  559. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_threshold_enforcement.py +0 -0
  560. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_batch.py +0 -0
  561. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_categorization.py +0 -0
  562. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_exceptions.py +0 -0
  563. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_models.py +0 -0
  564. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_orchestrator.py +0 -0
  565. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_token_usage.py +0 -0
  566. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_uipath_eval.py +0 -0
  567. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_user_simulator.py +0 -0
  568. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_utils.py +0 -0
  569. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_utterance_extraction.py +0 -0
  570. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_variant_prompt_file.py +0 -0
  571. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_verdict_tool.py +0 -0
  572. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_watchdog.py +0 -0
  573. {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_yaml_migration.py +0 -0
@@ -27,6 +27,22 @@ Deferred lint/test guardrails surfaced during reviews. Promote to a `CExxx` rule
27
27
  reachable (needs a live run).
28
28
  - [ ] CE-rule: `type: Literal[...]` fields on models in `coder_eval/models/` must declare their tag default (`type: Literal["x"] = "x"`) — a member without the default degrades `validate_registry` diagnostics (PydanticUndefined in expected_types) and breaks direct construction. Nothing guards it today; needs a rule-design call (second violation class inside CE024 vs. a new CExxx at the next free id), and the failure is already double-caught by the MINIMAL_PAYLOADS parity test + direct-construction tests — caught in the 2026-07-03 top5-review-fixes run (Phase 1 quality review).
29
29
 
30
+ ## From 2026-07-23 stop_when:auto early-stop review
31
+
32
+ - [ ] CE-rule: the early-stop watcher stop rule must decide polarity via the
33
+ resolved `_armed_polarities`, never a raw `criterion.stop_when` comparison —
34
+ forbid `.stop_when` attribute reads inside `EarlyStopWatcher._evaluate` /
35
+ `_resolve_armed_polarities`'s callers in `orchestration/early_stop.py`. This
36
+ diff *was* the fix for exactly that class of bug (the old rule compared
37
+ `stop_when in ("pass","decided")` and so vetoed every mixed `auto` pass-stop).
38
+ Deferred, not cheap: existing CE rules scope by file/module, not by a specific
39
+ method, so a method-scoped attribute-ban needs a new AST-walk shape (and risks
40
+ false positives on the legitimate `is not None` membership reads elsewhere in
41
+ the file). Claim the next free id in `tests/lint/rules/`. Caught in the
42
+ 2026-07-23 stop_when:auto review; the behavior itself is guarded by
43
+ `test_auto_mixed_pass_stops_ignoring_undecided_distractors` +
44
+ `test_mixed_static_arming_pass_stops_ignoring_fail_armed`.
45
+
30
46
  ## From 2026-07-03 open-source docs cleanup
31
47
 
32
48
  - [ ] **Dead-relative-link checker for `docs/**/*.md`** — resolve every relative
@@ -10,12 +10,17 @@ name: Docs
10
10
  # Source: "Deploy from a branch" → branch `gh-pages` / `/ (root)`. That's the same
11
11
  # (legacy, branch-based) configuration uipath-python already runs on.
12
12
  on:
13
- push:
14
- branches: [main]
15
- paths:
16
- - "docs/**"
17
- - "mkdocs.yml"
18
- - ".github/workflows/docs.yml"
13
+ # Auto-publish on push is DISABLED: GitHub Pages is not yet enabled for this
14
+ # repo on uipath.github.io (org owner must switch it on once — Settings → Pages
15
+ # → Deploy from a branch → gh-pages / root). The published docs currently serve
16
+ # from coder-eval.com/docs (synced separately by the website), so the gh-pages
17
+ # deploy is not needed yet. Re-enable by uncommenting the `push:` trigger below.
18
+ # push:
19
+ # branches: [main]
20
+ # paths:
21
+ # - "docs/**"
22
+ # - "mkdocs.yml"
23
+ # - ".github/workflows/docs.yml"
19
24
  workflow_dispatch:
20
25
 
21
26
  permissions:
@@ -831,3 +831,61 @@ jobs:
831
831
  name: byoa-live-output
832
832
  path: tmp/
833
833
  retention-days: 7
834
+
835
+ action-dogfood:
836
+ name: Action Dogfood (composite action, real API)
837
+ runs-on: ubuntu-latest
838
+ timeout-minutes: 15
839
+ # Skip on fork PRs where secrets aren't available (matches e2e-smoke).
840
+ if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
841
+ steps:
842
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
843
+
844
+ # The composite action is agent-agnostic and does NOT install a coding-agent
845
+ # runtime. The dogfood task uses the default claude-code agent, so provide
846
+ # Node + the Claude CLI here (as e2e-smoke does), before invoking the action.
847
+ - name: Set up Node.js 20
848
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
849
+ with:
850
+ node-version: "20"
851
+ - name: Install Claude CLI
852
+ run: npm install -g @anthropic-ai/claude-code
853
+
854
+ - name: Run coder-eval via local action
855
+ id: dogfood
856
+ uses: ./
857
+ with:
858
+ version: local
859
+ tasks: tasks/hello_date.yaml
860
+ model: claude-haiku-4-5-20251001
861
+ run-dir: runs/ci-action-dogfood
862
+ junit-path: runs/ci-action-dogfood/junit.xml
863
+ # Credentials go through the generic env passthrough (the only channel);
864
+ # ANTHROPIC_API_KEY reaching the run is proven by the API-backed task
865
+ # succeeding. A floor of 0.0 passes for any produced score (exercises
866
+ # the gate path green in CI without flakiness); the second line
867
+ # exercises multi-line env parsing.
868
+ minimum-task-score: "0.0"
869
+ env: |
870
+ ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}
871
+ CE_DOGFOOD_MARKER=1
872
+
873
+ - name: Verify outputs and JUnit file
874
+ env:
875
+ JUNIT: ${{ steps.dogfood.outputs.junit-path }}
876
+ RUNDIR: ${{ steps.dogfood.outputs.run-dir }}
877
+ run: |
878
+ set -euo pipefail
879
+ test -n "$JUNIT" && test -f "$JUNIT" || { echo "junit output missing"; exit 1; }
880
+ # Well-formedness check on a file this job just generated (trusted input;
881
+ # our writer emits no DTDs/entities) — stdlib ET is fine here.
882
+ python3 -c "import sys, xml.etree.ElementTree as ET; ET.parse(sys.argv[1])" "$JUNIT"
883
+ test -f "$RUNDIR/run.json" || { echo "run.json missing"; exit 1; }
884
+
885
+ - name: Upload dogfood run on failure
886
+ if: failure()
887
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
888
+ with:
889
+ name: action-dogfood-runs
890
+ path: runs/ci-action-dogfood/
891
+ retention-days: 7
@@ -182,23 +182,50 @@ jobs:
182
182
  echo "version=$V" >> "$GITHUB_OUTPUT"
183
183
  echo "Publishing version: $V"
184
184
 
185
- - name: Regenerate uv.lock and amend release commit
185
+ - name: Regenerate uv.lock, bump action.yml pin, and amend release commit
186
186
  if: steps.mode.outputs.prerelease != 'true' && steps.release.outputs.version != ''
187
+ env:
188
+ # Passed via env (not interpolated into the script) per GitHub's
189
+ # injection guidance.
190
+ VERSION: ${{ steps.release.outputs.version }}
187
191
  run: |
192
+ set -euo pipefail
193
+ git config user.email "github-actions[bot]@users.noreply.github.com"
194
+ git config user.name "github-actions[bot]"
195
+ # Bump the composite action's default `version:` pin to the just-released
196
+ # version so `UiPath/coder_eval@vX.Y.Z` installs `coder-eval==X.Y.Z`. The
197
+ # anchor is indentation-tolerant and keyed on the unique trailing
198
+ # "# <-- kept in sync" comment; the grep guard fails the release loudly
199
+ # if a reformat ever detaches it (rather than shipping a stale pin).
200
+ sed -i -E 's/^([[:space:]]*default: ")[0-9]+\.[0-9]+\.[0-9]+(" # <-- kept in sync)/\1'"${VERSION}"'\2/' action.yml
201
+ grep -q "default: \"${VERSION}\"" action.yml || { echo "action.yml version bump failed"; exit 1; }
202
+ git add action.yml
203
+ # Regenerate the lock too; stage it (a no-op if unchanged).
188
204
  uv lock
189
- if ! git diff --quiet uv.lock; then
190
- git config user.email "github-actions[bot]@users.noreply.github.com"
191
- git config user.name "github-actions[bot]"
192
- git add uv.lock
205
+ git add uv.lock
206
+ # Amend only if action.yml/uv.lock actually changed the tree.
207
+ if ! git diff --cached --quiet; then
193
208
  git commit --amend --no-edit
194
209
  # Amend replaced the commit the tag points at; re-point it before pushing.
195
- git tag -f "v${{ steps.release.outputs.version }}"
210
+ git tag -f "v${VERSION}"
196
211
  fi
197
212
 
198
213
  - name: Push release commit and tags
199
214
  if: steps.mode.outputs.prerelease != 'true' && steps.release.outputs.version != ''
200
215
  run: git push origin main "v${{ steps.release.outputs.version }}"
201
216
 
217
+ - name: Move major action tag (vN -> this release)
218
+ if: steps.release.outputs.version != ''
219
+ env:
220
+ VERSION: ${{ steps.release.outputs.version }}
221
+ run: |
222
+ set -euo pipefail
223
+ # Consumers pin `UiPath/coder_eval@v0` (becomes `@v1` at 1.0.0). Force-move
224
+ # the moving major tag to this release. Force on a missing tag creates it.
225
+ MAJOR="v${VERSION%%.*}"
226
+ git tag -f "$MAJOR" "v${VERSION}"
227
+ git push -f origin "$MAJOR"
228
+
202
229
  - name: Build wheel + sdist
203
230
  if: steps.ver.outputs.version != ''
204
231
  run: uv build
@@ -2,6 +2,121 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.8.10 (2026-07-24)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Remove dead SimulationConfig.parallel_trials; add CE031 to guard the class
10
+ ([`947acd3`](https://github.com/UiPath/coder_eval/commit/947acd34a4f0451c69cb7bf0eb863127b9995f76))
11
+
12
+ - **early-stop**: Add stop_when 'auto' — per-instance arming + pass-armed-subset stop rule
13
+ ([#51](https://github.com/UiPath/coder_eval/pull/51),
14
+ [`08e21e6`](https://github.com/UiPath/coder_eval/commit/08e21e67b67fdab84d26b8a0e5551e04289d92a8))
15
+
16
+ - **early-stop**: Defer fail-stop while a pass-armed criterion is undecided
17
+ ([#51](https://github.com/UiPath/coder_eval/pull/51),
18
+ [`08e21e6`](https://github.com/UiPath/coder_eval/commit/08e21e67b67fdab84d26b8a0e5551e04289d92a8))
19
+
20
+ - **early-stop**: Return assert_never explicitly to satisfy CodeQL
21
+ ([#51](https://github.com/UiPath/coder_eval/pull/51),
22
+ [`08e21e6`](https://github.com/UiPath/coder_eval/commit/08e21e67b67fdab84d26b8a0e5551e04289d92a8))
23
+
24
+ - **reports**: Code review fixes for the JUnit CI gate
25
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
26
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
27
+
28
+ - **reports**: JUnit CI-gate review fixes + CE027 env-var lint
29
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
30
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
31
+
32
+ - **reports**: Make skipped-task JUnit names platform-independent
33
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
34
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
35
+
36
+ ### Chores
37
+
38
+ - Re-trigger CI (GitHub dropped the force-push event)
39
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
40
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
41
+
42
+ - **deps**: Lock defusedxml (dev-only, test-side XML parsing)
43
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
44
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
45
+
46
+ ### Continuous Integration
47
+
48
+ - Disable Docs gh-pages auto-publish on push (Pages not enabled yet)
49
+ ([`c289d46`](https://github.com/UiPath/coder_eval/commit/c289d46c5cec269f205224e4dfce27affab5557e))
50
+
51
+ ### Documentation
52
+
53
+ - 1/8 — add DATASETS.md and a task-schema dataset: section
54
+ ([`e3d37ac`](https://github.com/UiPath/coder_eval/commit/e3d37ac793e6f12c020b71a4ed19df2279b4b2c1))
55
+
56
+ - 2/8 — retire BYOD.md into DOCKER_ISOLATION.md
57
+ ([`1a4a2a5`](https://github.com/UiPath/coder_eval/commit/1a4a2a5893639d14832dbd1614163aa7c18bf70a))
58
+
59
+ - 3/8 — one complete run_limits reference; document skip
60
+ ([`bcb7e24`](https://github.com/UiPath/coder_eval/commit/bcb7e24132c229114efe9a38281a37e736d83312))
61
+
62
+ - 4/8 — add DIALOG_MODE.md and correct four stale simulation claims
63
+ ([`18dcbe9`](https://github.com/UiPath/coder_eval/commit/18dcbe95d156856149538406ededc8c75ec594f8))
64
+
65
+ - 5/8 — fix prompt_mutations example; add CE029
66
+ ([`b524009`](https://github.com/UiPath/coder_eval/commit/b5240099c58f5b50c7b5fe531a12f1f8b98aec29))
67
+
68
+ - 7/8 — generate flat indexes from the mkdocs nav; add CE028
69
+ ([`1514bcb`](https://github.com/UiPath/coder_eval/commit/1514bcb8f075ed48f2857a84269513c60878ea81))
70
+
71
+ - Add CI Gate reference (GitHub Action + JUnit) and wire into indexes
72
+ ([`b8c6301`](https://github.com/UiPath/coder_eval/commit/b8c63018bd93ba91751511d95f4af96a444d9873))
73
+
74
+ - Agent guides, extending & report-schema references, and fixes
75
+ ([`ce74824`](https://github.com/UiPath/coder_eval/commit/ce74824bde2b5322dc745bace045e1806f77324b))
76
+
77
+ - Fold nav long tail into one Advanced group; align index ordering
78
+ ([`e2ff053`](https://github.com/UiPath/coder_eval/commit/e2ff0539af8c9e3e6deb85c0a0124c0232224033))
79
+
80
+ - Point docs links to coder-eval.com/docs; drop Ruff badge
81
+ ([`60430e5`](https://github.com/UiPath/coder_eval/commit/60430e5e857f0af6fbf08cde00f0621de4610562))
82
+
83
+ - Point pyproject Documentation URL to coder-eval.com/docs
84
+ ([`be39df2`](https://github.com/UiPath/coder_eval/commit/be39df23c8ba1a0f6f945dc99e3827eb5d6f2772))
85
+
86
+ - Reword CODER_EVAL_RAW_SDK_LOG to prose form (satisfy CE027)
87
+ ([`d7d5b59`](https://github.com/UiPath/coder_eval/commit/d7d5b59b990127810fcfe33272f3ff733a9498cd))
88
+
89
+ - Use the brand name "Coder Eval" in prose and titles
90
+ ([`821f11b`](https://github.com/UiPath/coder_eval/commit/821f11bf94762f6578913090568f5b092e237596))
91
+
92
+ ### Features
93
+
94
+ - Packaged CI gate — JUnit XML output + composite GitHub Action
95
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
96
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
97
+
98
+ - **action**: Generic env passthrough + minimum-task-score gate
99
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
100
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
101
+
102
+ - **ci**: 3/3 — publish composite action, release automation, PR dogfood
103
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
104
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
105
+
106
+ - **cli**: 2/3 — wire run --junit-xml and report -f junit
107
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
108
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
109
+
110
+ - **reports**: 1/3 — add reports_junit.py disk-driven JUnit XML writer
111
+ ([#37](https://github.com/UiPath/coder_eval/pull/37),
112
+ [`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
113
+
114
+ ### Testing
115
+
116
+ - 6/8 — CE030 documents-or-exempts model fields
117
+ ([`c9a3b16`](https://github.com/UiPath/coder_eval/commit/c9a3b160deeec385386a7009812025bc26021363))
118
+
119
+
5
120
  ## v0.8.9 (2026-07-23)
6
121
 
7
122
  ### Bug Fixes
@@ -20,6 +20,7 @@ coder_eval/
20
20
  ├── orchestrator.py # Main evaluation loop
21
21
  ├── reports.py # Markdown/JSON report generation (run-level + per-suite rollup via write_suite_rollups)
22
22
  ├── reports_experiment.py # Experiment/cross-variant report generation
23
+ ├── reports_junit.py # JUnit XML report from a finalized run dir (run.json spine; for CI test-report ingestion)
23
24
  ├── analysis.py # Command statistics aggregation
24
25
  ├── logging_config.py # Structured logging setup
25
26
  ├── path_utils.py # Run ID generation, path utilities
@@ -120,6 +121,7 @@ tasks/ # Task definition YAML files
120
121
  tests/ # Test suite
121
122
  docs/ # Documentation
122
123
  templates/ # Sandbox template directories
124
+ action.yml # Published composite GitHub Action (coder-eval as a CI gate). release.yml maintains its `version:` default + the moving `v<major>` tag.
123
125
  ```
124
126
 
125
127
  ## Key Architectural Patterns
@@ -139,7 +141,7 @@ templates/ # Sandbox template directories
139
141
  - **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 Python `token_usage`/`total_token_usage` aggregate is unchanged and still authoritative for budget/judges/reports.
140
142
  - **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.
141
143
  - **Run-time caps (non-criterion enforcement)**: `TaskDefinition.run_limits` (`RunLimits` model) is the single namespace for all 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.
142
- - **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`; only criteria that can decide from a partial trajectory may arm (they declare a non-empty `live_stop_polarities` ClassVar and override `live_verdict` on `BaseCriterion` — currently `skill_triggered`, `command_executed`; CE025 enforces the two stay consistent). It uses a cooperative `should_stop` seam on the Claude agent's between-messages guard (tool-call granularity, no SIGKILL) driven by `orchestration/early_stop.py::EarlyStopWatcher` (own `EventCollector` + stop rule). Live verdicts only *trigger* the stop; the standard `check_all` on the frozen trajectory is authoritative. An early-stopped run gates on the **armed subset** (`EvaluationResult.armed_criteria_passed`); a completed run gates on the full set. Every unsupported use (non-observable criterion, non-Claude agent, wrong polarity, no armed criterion, simulation mode) is an error at resolution (plan *and* run), and a runtime verdict bug **fails open** to a full run. Surfaces: `EarlyStopInfo` (reason + deciding criterion + when), report notes/badges, `stopped_early` run.json rows, and `EarlyStopped`/`EarlyStopReason` telemetry dims. Defaults off ⇒ behavior byte-for-behavior unchanged.
144
+ - **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 (non-empty `live_stop_polarities` ClassVar + `live_verdict` override — currently `skill_triggered`, `command_executed`; CE025 keeps the two consistent). `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: the pass-stop fires when every **pass-armed** criterion live-passes (fail-armed distractors are not required to pass; zero pass-armed ⇒ never pass-stops); the fail-stop fires on the first fail-armed live-fail but is **deferred while any pass-armed criterion is undecided** — a distractor misfire must not truncate a positive row's recall signal, so the latched misfire fires once 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. 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` on the frozen trajectory is authoritative. An early-stopped run gates on the **armed subset** (`EvaluationResult.armed_criteria_passed`); a completed run gates on the full set. 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`, 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.
143
145
 
144
146
  ## Success Criteria (14 types)
145
147
 
@@ -160,7 +162,7 @@ templates/ # Sandbox template directories
160
162
  | `llm_judge` | Continuous | LLM grades artifacts + optional trajectory + optional reference; routes through the run's backend (Bedrock / Anthropic) |
161
163
  | `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. |
162
164
 
163
- All criteria support `weight` (default 1.0) and `pass_threshold` (default 0.9), plus `stop_when` (`pass`/`fail`/`decided`, default `null`) which arms the criterion for early stop when `run_limits.stop_early` is set (observable criteria only). 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.
165
+ 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.
164
166
 
165
167
  ## Evaluation Flow
166
168
 
@@ -193,11 +195,17 @@ make format # ruff format
193
195
  make check # ruff check (lint)
194
196
  make typecheck # pyright
195
197
  make test # pytest
196
- make lint # custom architectural lint rules (CE001–CE025)
198
+ make lint # custom architectural lint rules (CE001+)
197
199
  make verify # All of the above + coverage check (CI equivalent)
198
200
  ```
199
201
 
200
- 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–CE025 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.
202
+ 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.)
203
+
204
+ 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.
205
+
206
+ **Docs index SSOT.** `nav:` plus `extra.docs_index` (blurbs) in `mkdocs.yml` are the single source of truth for the flat index surfaces — `README.md`'s Documentation table, `docs/index.md`'s "Where to go next" table, and the `## Docs` / `## Tutorials` sections of `docs/llms.txt`. Regenerate all three with `make docs-indexes`; **CE028** fails the build if any drifts, if a nav page lacks a blurb (or vice-versa), or if a `docs/*.md` page is missing from the nav. The website sidebar derives from the same `nav:`. When adding or renaming a docs page, edit `nav:` + `extra.docs_index` and run `make docs-indexes` — never hand-edit the generated tables (they sit between `<!-- docs-index:start -->` / `<!-- docs-index:end -->` markers).
207
+
208
+ **Anchor slugger convention.** The docs are rendered by three sluggers (GitHub, Starlight/github-slugger on coder-eval.com, and python-markdown/mkdocs), which disagree on headings containing `&` or punctuation (`api-routing--benchmarking` vs `api-routing-benchmarking`). Prefer punctuation-free headings so all three agree; if a heading needs `&`, add a GitHub-form `<a id="…"></a>` shim above it and link that form. Verify a new intra-doc anchor link resolves in the built HTML (`mkdocs build`), not by eye.
201
209
 
202
210
  ## Configuration
203
211
 
@@ -1,4 +1,4 @@
1
- .PHONY: help install format check typecheck test test-live test-smoke verify verify-noextra clean run lint docker-image docker-image-full coder-eval-runtime docker-images
1
+ .PHONY: help install format check typecheck test test-live test-smoke verify verify-noextra clean run lint docs-indexes docker-image docker-image-full coder-eval-runtime docker-images
2
2
 
3
3
  # Single source of the installed coder-eval version (used to tag the docker
4
4
  # images). Referenced lazily inside the docker recipes, so it doesn't run on
@@ -24,6 +24,9 @@ check: ## Run linting checks
24
24
  lint: ## Run custom architectural lint rules (CE001+)
25
25
  uv run pytest tests/test_custom_lint.py -v --tb=short --no-header -p no:warnings
26
26
 
27
+ docs-indexes: ## Regenerate README/docs indexes from the mkdocs nav (SSOT)
28
+ uv run python -m tests.lint.doc_indexes
29
+
27
30
  typecheck: ## Run type checking with pyright
28
31
  uv run pyright
29
32
 
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coder-eval
3
- Version: 0.8.9
3
+ Version: 0.8.10
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
7
- Project-URL: Documentation, https://github.com/UiPath/coder_eval/tree/main/docs
7
+ Project-URL: Documentation, https://coder-eval.com/docs
8
8
  Project-URL: Issues, https://github.com/UiPath/coder_eval/issues
9
9
  Project-URL: Changelog, https://github.com/UiPath/coder_eval/blob/main/CHANGELOG.md
10
10
  Author-email: UiPath <coder-eval@uipath.com>
@@ -46,6 +46,7 @@ Provides-Extra: codex
46
46
  Requires-Dist: openai-codex>=0.144.4; extra == 'codex'
47
47
  Provides-Extra: dev
48
48
  Requires-Dist: bandit[toml]>=1.9.4; extra == 'dev'
49
+ Requires-Dist: defusedxml>=0.7.1; extra == 'dev'
49
50
  Requires-Dist: mcp>=1.28.1; extra == 'dev'
50
51
  Requires-Dist: pip-audit>=2.10.0; extra == 'dev'
51
52
  Requires-Dist: pre-commit>=4.5.1; extra == 'dev'
@@ -64,11 +65,10 @@ Description-Content-Type: text/markdown
64
65
 
65
66
  [![PyPI](https://img.shields.io/pypi/v/coder-eval.svg)](https://pypi.org/project/coder-eval/)
66
67
  [![Website](https://img.shields.io/badge/website-coder--eval.com-1f6feb.svg)](https://coder-eval.com)
67
- [![Docs](https://img.shields.io/badge/docs-uipath.github.io%2Fcoder__eval-1f6feb.svg)](https://uipath.github.io/coder_eval/)
68
+ [![Docs](https://img.shields.io/badge/docs-coder--eval.com%2Fdocs-1f6feb.svg)](https://coder-eval.com/docs)
68
69
  [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
69
70
  [![Python 3.13+](https://img.shields.io/badge/python-3.13%2B-blue.svg)](https://www.python.org/downloads/)
70
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)
71
- [![Code style: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
72
72
 
73
73
  **Coder Eval** (`pip install coder-eval` / `uv tool install coder-eval`) is an open-source framework for
74
74
  **evaluating and benchmarking AI coding agents and their skills** — built for CLI
@@ -84,8 +84,8 @@ prompt), or **gate CI on coding-agent quality**. Unlike fixed datasets (SWE-benc
84
84
  SkillsBench) that rank models on a shared leaderboard, Coder Eval evaluates the
85
85
  tasks, skills, and workflows *you* ship — with weighted 0.0–1.0 criteria, a
86
86
  `skill_triggered` activation check, an A/B experiment layer, and per-tool cost
87
- telemetry. See [How it compares](https://uipath.github.io/coder_eval/comparison/).
88
- 📚 **Full docs:** **[uipath.github.io/coder_eval](https://uipath.github.io/coder_eval/)**.
87
+ telemetry. See [How it compares](https://coder-eval.com/docs/comparison).
88
+ 📚 **Full docs:** **[coder-eval.com/docs](https://coder-eval.com/docs)**.
89
89
 
90
90
  <p align="center">
91
91
  <img src="docs/assets/hero.gif" alt="Coder Eval running the hello_date task: a sandboxed agent writes and runs a script from a YAML task, then the scored result is browsed in evalboard" width="100%">
@@ -111,7 +111,7 @@ telemetry. See [How it compares](https://uipath.github.io/coder_eval/comparison/
111
111
  > **Keeping skills fresh?** Run Coder Eval as a scheduled GitHub Actions job so your
112
112
  > skills are continuously re-evaluated against the latest model — a skill that quietly
113
113
  > stops triggering surfaces as a failing criterion before your users hit it. See
114
- > **[Tutorial 02 — Running coder_eval in CI](docs/tutorials/02-ci-pipeline.md)**.
114
+ > **[Tutorial 02 — Running Coder Eval in CI](docs/tutorials/02-ci-pipeline.md)**.
115
115
 
116
116
  ## Quick Start
117
117
 
@@ -155,9 +155,77 @@ To add it as a project dependency instead: `uv add coder-eval` or
155
155
  `pip install coder-eval`. In a real CI gate, pin to a specific released version
156
156
  so a harness upgrade can't silently move your results. (The example `tasks/`
157
157
  live in this repo — clone it or point the CLI at your own task files.) See
158
- [Tutorial 02 — Running coder_eval in CI](docs/tutorials/02-ci-pipeline.md) for
158
+ [Tutorial 02 — Running Coder Eval in CI](docs/tutorials/02-ci-pipeline.md) for
159
159
  the full setup.
160
160
 
161
+ ## Use as a GitHub Action
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:
166
+
167
+ ```yaml
168
+ - uses: UiPath/coder_eval@v0 # becomes @v1 once 1.0.0 ships; @vX.Y.Z pins exactly
169
+ with:
170
+ tasks: tests/tasks/**/*.yaml
171
+ model: claude-sonnet-5
172
+ env: |
173
+ ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}
174
+ ```
175
+
176
+ | Input | Default | Purpose |
177
+ | --- | --- | --- |
178
+ | `tasks` | *(all `tasks/`)* | Task YAML path(s)/glob |
179
+ | `tags` | — | `--tags` filter |
180
+ | `model` | — | `--model` override |
181
+ | `extra-args` | — | Verbatim extra args (`--experiment`, `-D …`, …) |
182
+ | `version` | pinned release | PyPI version, or `local` to install from the checkout |
183
+ | `run-dir` | `runs/ci` | Run directory |
184
+ | `junit-path` | `coder-eval-junit.xml` | Where to write the JUnit report |
185
+ | `step-summary` | `true` | Append `run.md` to the job summary |
186
+ | `env` | — | Credentials/backend passthrough: newline-separated `NAME=VALUE` pairs, exported for the run step only |
187
+ | `minimum-task-score` | *(off)* | Strict floor (0.0–1.0): fail the step if any task's `weighted_score` is below it |
188
+
189
+ Outputs: `run-dir` and `junit-path`. Feed the JUnit file to your platform's
190
+ test-report renderer — e.g. on GitHub Actions with
191
+ [`mikepenz/action-junit-report`](https://github.com/mikepenz/action-junit-report):
192
+
193
+ ```yaml
194
+ - uses: mikepenz/action-junit-report@v5
195
+ if: always()
196
+ with:
197
+ report_paths: coder-eval-junit.xml
198
+ ```
199
+
200
+ **Credentials and backend config** are the sole responsibility of `env` — a
201
+ passthrough exported for the run step only (never written to `$GITHUB_ENV`, so
202
+ it can't leak into later steps). Set whatever the run needs, Anthropic or not:
203
+
204
+ ```yaml
205
+ - uses: UiPath/coder_eval@v0
206
+ with:
207
+ tasks: tests/tasks/**/*.yaml
208
+ minimum-task-score: "0.8" # fail the build if any task scores below 0.8
209
+ env: |
210
+ API_BACKEND=bedrock
211
+ AWS_BEARER_TOKEN_BEDROCK=${{ secrets.BEDROCK_TOKEN }}
212
+ ```
213
+
214
+ `minimum-task-score` is a strict floor **on top of** coder-eval's own exit
215
+ code: the step fails if *either* coder-eval exits non-zero *or* any task's
216
+ `weighted_score` falls below the floor. Leave it unset to gate on the exit code
217
+ alone.
218
+
219
+ > **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.
223
+
224
+ > **Security.** Evaluated tasks execute agent-generated code. Do **not** run this
225
+ > action under `pull_request_target` with secrets exposed to untrusted fork PRs —
226
+ > use `pull_request` and gate on the same-repo condition, as this repo's own
227
+ > dogfood job does.
228
+
161
229
  ## Telemetry
162
230
 
163
231
  > 📊 **Usage telemetry is on by default.** `coder-eval` sends **anonymous** usage
@@ -170,15 +238,27 @@ the full setup.
170
238
 
171
239
  ## Documentation
172
240
 
241
+ <!-- docs-index:start -->
173
242
  | Guide | What's in it |
174
243
  | --- | --- |
175
244
  | [Tutorials](docs/tutorials/README.md) | Step-by-step walkthroughs — start here |
176
245
  | [User Guide](docs/USER_GUIDE.md) | Full CLI, configuration, output, and environment-variable reference |
177
246
  | [Task Definition Guide](docs/TASK_DEFINITION_GUIDE.md) | The task-file schema — all criterion types, scoring, templates |
247
+ | [Claude Code](docs/agents/CLAUDE_CODE.md) | Configuring and running the default Claude Code agent |
248
+ | [Codex](docs/agents/CODEX.md) | Running the OpenAI Codex agent |
249
+ | [Antigravity (Gemini)](docs/agents/ANTIGRAVITY.md) | Running the Google Antigravity / Gemini agent |
178
250
  | [A/B Experiments](docs/AB_EXPERIMENTS.md) | Compare models / tools / prompts across the same tasks |
179
- | [Bring Your Own Dataset](docs/BYOD.md) | Fan a single task out over a dataset |
180
- | [Codex Agent Guide](docs/CODEX_AGENT_GUIDE.md) | Running the Codex agent |
181
- | [Docker Isolation](docs/DOCKER_ISOLATION.md) | The container sandbox driver |
251
+ | [Bring Your Own Dataset](docs/DATASETS.md) | Fan a single task out over a dataset |
252
+ | [Dialog Mode](docs/DIALOG_MODE.md) | Evaluate agents in multi-turn conversation via a simulated user |
253
+ | [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 |
255
+ | [Extending Coder Eval](docs/EXTENDING.md) | Author a custom agent, criterion, or model pricing via the plugin SPI |
256
+ | [Report Schema](docs/REPORT_SCHEMA.md) | Field-level reference for run.json / variant.json / task.json |
257
+ | [How It Compares](docs/comparison.md) | vs. SWE-bench, SkillsBench, Harbor, OpenAI Evals, hand-rolled scripts |
258
+ <!-- docs-index:end -->
259
+
260
+ | Repo doc | What's in it |
261
+ | --- | --- |
182
262
  | [CLAUDE.md](CLAUDE.md) | Architecture, key patterns, and extension points |
183
263
  | [CONTRIBUTING.md](CONTRIBUTING.md) | Dev setup, quality bar, and how to contribute |
184
264
 
@@ -186,7 +266,7 @@ the full setup.
186
266
 
187
267
  - **vs. fixed benchmarks (SWE-bench, SkillsBench)** — they score a canonical dataset;
188
268
  Coder Eval scores *your* tasks with continuous 0.0–1.0 weighted criteria (and can
189
- still wrap a fixed dataset via [Bring Your Own Dataset](docs/BYOD.md)).
269
+ still wrap a fixed dataset via [Bring Your Own Dataset](docs/DATASETS.md)).
190
270
  - **vs. large-scale / RL harnesses (Harbor)** — Harbor targets scale and RL rollouts;
191
271
  Coder Eval targets weighted, skill-aware suites gated in CI.
192
272
  - **vs. model-output eval tools (OpenAI Evals)** — they grade model text; Coder Eval
@@ -194,7 +274,7 @@ the full setup.
194
274
  - **vs. hand-rolled scripts** — reproducible sandboxes, weighted criteria,
195
275
  cost/token telemetry, A/B experiments, and CI-ready pass/fail gates out of the box.
196
276
 
197
- See the full [comparison — with sources](https://uipath.github.io/coder_eval/comparison/).
277
+ See the full [comparison — with sources](https://coder-eval.com/docs/comparison).
198
278
 
199
279
  ## Task Definition
200
280