coder-eval 0.8.9__tar.gz → 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. coder_eval-0.9.0/.claude/harness-candidates.md +109 -0
  2. coder_eval-0.9.0/.github/pages-stub/index.html +293 -0
  3. coder_eval-0.9.0/.github/scripts/release_notes.py +74 -0
  4. coder_eval-0.9.0/.github/workflows/docs.yml +75 -0
  5. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/pr-checks.yml +58 -0
  6. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/publish-testpypi.yml +12 -4
  7. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/release.yml +143 -13
  8. {coder_eval-0.8.9 → coder_eval-0.9.0}/.pre-commit-config.yaml +11 -0
  9. {coder_eval-0.8.9 → coder_eval-0.9.0}/CHANGELOG.md +122 -0
  10. {coder_eval-0.8.9 → coder_eval-0.9.0}/CLAUDE.md +14 -6
  11. {coder_eval-0.8.9 → coder_eval-0.9.0}/Makefile +14 -5
  12. {coder_eval-0.8.9 → coder_eval-0.9.0}/PKG-INFO +93 -13
  13. {coder_eval-0.8.9 → coder_eval-0.9.0}/README.md +90 -11
  14. coder_eval-0.9.0/action.yml +209 -0
  15. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/AB_EXPERIMENTS.md +50 -12
  16. coder_eval-0.9.0/docs/CI_GATE.md +147 -0
  17. coder_eval-0.9.0/docs/DATASETS.md +276 -0
  18. coder_eval-0.9.0/docs/DIALOG_MODE.md +237 -0
  19. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/DOCKER_ISOLATION.md +58 -1
  20. coder_eval-0.9.0/docs/EXTENDING.md +266 -0
  21. coder_eval-0.9.0/docs/REPORT_SCHEMA.md +256 -0
  22. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/TASK_DEFINITION_GUIDE.md +240 -46
  23. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/USER_GUIDE.md +86 -7
  24. coder_eval-0.9.0/docs/agents/ANTIGRAVITY.md +203 -0
  25. coder_eval-0.9.0/docs/agents/CLAUDE_CODE.md +194 -0
  26. coder_eval-0.8.9/docs/CODEX_AGENT_GUIDE.md → coder_eval-0.9.0/docs/agents/CODEX.md +6 -6
  27. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/comparison.md +3 -3
  28. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/index.md +13 -5
  29. coder_eval-0.9.0/docs/llms.txt +56 -0
  30. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/02-ci-pipeline.md +75 -3
  31. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/03-evalboard-local.md +3 -3
  32. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/04-writing-a-task.md +2 -2
  33. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/05-comparing-models.md +1 -1
  34. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/06-use-docker-isolation.md +1 -1
  35. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/README.md +2 -2
  36. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/package.json +3 -3
  37. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/pnpm-lock.yaml +325 -234
  38. {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/early-stop-ab.yaml +5 -3
  39. coder_eval-0.9.0/litellm/README.md +193 -0
  40. coder_eval-0.9.0/litellm/litellm-config.yaml +81 -0
  41. coder_eval-0.9.0/litellm/start-litellm.sh +88 -0
  42. {coder_eval-0.8.9 → coder_eval-0.9.0}/mkdocs.yml +36 -10
  43. {coder_eval-0.8.9 → coder_eval-0.9.0}/pyproject.toml +3 -2
  44. coder_eval-0.9.0/scripts/check_commit_msg.sh +21 -0
  45. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/__init__.py +1 -1
  46. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/claude_code_agent.py +108 -17
  47. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/report_command.py +21 -3
  48. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/run_command.py +71 -2
  49. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/config.py +45 -0
  50. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/agent_judge.py +19 -11
  51. coder_eval-0.9.0/src/coder_eval/criteria/base.py +519 -0
  52. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/llm_judge.py +36 -20
  53. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/__init__.py +2 -0
  54. coder_eval-0.9.0/src/coder_eval/errors/checker_misuse.py +13 -0
  55. coder_eval-0.9.0/src/coder_eval/evaluation/checker.py +404 -0
  56. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_anthropic.py +12 -5
  57. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_bedrock.py +36 -30
  58. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_usage.py +2 -2
  59. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/sub_agent.py +70 -18
  60. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/verdict_tool.py +2 -2
  61. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/isolation/docker_runner.py +41 -0
  62. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/__init__.py +4 -0
  63. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/criteria.py +7 -2
  64. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/enums.py +1 -0
  65. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/limits.py +9 -6
  66. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/routing.py +69 -4
  67. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/sandbox.py +9 -0
  68. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/tasks.py +5 -8
  69. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/early_stop.py +115 -22
  70. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestrator.py +45 -16
  71. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/pricing.py +21 -0
  72. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/reports.py +1 -1
  73. coder_eval-0.9.0/src/coder_eval/reports_junit.py +431 -0
  74. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/simulation/user_simulator.py +10 -2
  75. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -1
  76. coder_eval-0.9.0/tests/conftest.py +108 -0
  77. coder_eval-0.9.0/tests/lint/dead_config_fields.py +83 -0
  78. coder_eval-0.9.0/tests/lint/doc_env_parity.py +125 -0
  79. coder_eval-0.9.0/tests/lint/doc_examples.py +211 -0
  80. coder_eval-0.9.0/tests/lint/doc_indexes.py +283 -0
  81. coder_eval-0.9.0/tests/lint/doc_schema_parity.py +85 -0
  82. coder_eval-0.9.0/tests/test_action_version_pin.py +59 -0
  83. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_judge_criterion.py +37 -18
  84. coder_eval-0.9.0/tests/test_check_all_async.py +635 -0
  85. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_backend_flag.py +1 -1
  86. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_config_precedence.py +3 -2
  87. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_custom_lint.py +535 -0
  88. coder_eval-0.9.0/tests/test_docker_litellm_env.py +119 -0
  89. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_early_stop.py +168 -6
  90. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_anthropic.py +21 -19
  91. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_bedrock.py +61 -38
  92. coder_eval-0.9.0/tests/test_litellm_route.py +454 -0
  93. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_llm_judge_criterion.py +142 -68
  94. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_orchestrator.py +42 -7
  95. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_evaluator.py +24 -0
  96. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_registry.py +13 -2
  97. coder_eval-0.9.0/tests/test_release_notes.py +145 -0
  98. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_report_command.py +52 -0
  99. coder_eval-0.9.0/tests/test_reports_junit.py +863 -0
  100. coder_eval-0.9.0/tests/test_route_seam_exhaustiveness.py +94 -0
  101. coder_eval-0.9.0/tests/test_run_command_junit.py +77 -0
  102. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_run_limits_orchestrator.py +5 -5
  103. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_simulation_config.py +0 -1
  104. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sub_agent_runner.py +125 -30
  105. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_orchestrator.py +2 -2
  106. {coder_eval-0.8.9 → coder_eval-0.9.0}/uv.lock +3 -1
  107. coder_eval-0.8.9/.claude/harness-candidates.md +0 -39
  108. coder_eval-0.8.9/.github/workflows/docs.yml +0 -48
  109. coder_eval-0.8.9/docs/BYOD.md +0 -210
  110. coder_eval-0.8.9/docs/IDEAS.md +0 -459
  111. coder_eval-0.8.9/docs/llms.txt +0 -46
  112. coder_eval-0.8.9/src/coder_eval/criteria/base.py +0 -306
  113. coder_eval-0.8.9/src/coder_eval/evaluation/checker.py +0 -267
  114. coder_eval-0.8.9/tests/conftest.py +0 -56
  115. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-code-review-full.md +0 -0
  116. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-code-review-wf.md +0 -0
  117. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-code-review.md +0 -0
  118. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-create-plan.md +0 -0
  119. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-implement-plan.md +0 -0
  120. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-review.md +0 -0
  121. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-run-analysis.md +0 -0
  122. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-task-create.md +0 -0
  123. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/shared/axes.md +0 -0
  124. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/shared/multi-model-review.md +0 -0
  125. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/shared/review-rubric.md +0 -0
  126. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/shared/run-layout.md +0 -0
  127. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/workflows/cr-axis.js +0 -0
  128. {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/workflows/cr-parent.js +0 -0
  129. {coder_eval-0.8.9 → coder_eval-0.9.0}/.env.example +0 -0
  130. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/CODEOWNERS +0 -0
  131. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
  132. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  133. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  134. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/code_review.md +0 -0
  135. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/dependabot.yml +0 -0
  136. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/claude-pr-review.yml +0 -0
  137. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/codeql.yml +0 -0
  138. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/conventional-commits.yml +0 -0
  139. {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/docker-publish.yml +0 -0
  140. {coder_eval-0.8.9 → coder_eval-0.9.0}/.gitignore +0 -0
  141. {coder_eval-0.8.9 → coder_eval-0.9.0}/.python-version +0 -0
  142. {coder_eval-0.8.9 → coder_eval-0.9.0}/ADOPTERS.md +0 -0
  143. {coder_eval-0.8.9 → coder_eval-0.9.0}/CODE_OF_CONDUCT.md +0 -0
  144. {coder_eval-0.8.9 → coder_eval-0.9.0}/CONTRIBUTING.md +0 -0
  145. {coder_eval-0.8.9 → coder_eval-0.9.0}/LICENSE +0 -0
  146. {coder_eval-0.8.9 → coder_eval-0.9.0}/NOTICE +0 -0
  147. {coder_eval-0.8.9 → coder_eval-0.9.0}/SECURITY.md +0 -0
  148. {coder_eval-0.8.9 → coder_eval-0.9.0}/docker/Dockerfile +0 -0
  149. {coder_eval-0.8.9 → coder_eval-0.9.0}/docker/Dockerfile.runtime +0 -0
  150. {coder_eval-0.8.9 → coder_eval-0.9.0}/docker/coder_eval_entrypoint.sh +0 -0
  151. {coder_eval-0.8.9 → coder_eval-0.9.0}/docker/coder_eval_runtime_entrypoint.sh +0 -0
  152. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/assets/hero.gif +0 -0
  153. {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/01-first-evaluation.md +0 -0
  154. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/.gitignore +0 -0
  155. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/README.md +0 -0
  156. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
  157. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/col-help.tsx +0 -0
  158. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/collapsible-rail.tsx +0 -0
  159. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/harness-badge.tsx +0 -0
  160. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/harness-selector.tsx +0 -0
  161. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/scroll-table.tsx +0 -0
  162. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/search-box.tsx +0 -0
  163. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/unit-toggle.tsx +0 -0
  164. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/version-list.tsx +0 -0
  165. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/window-selector.tsx +0 -0
  166. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_overview/daily-chart.tsx +0 -0
  167. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_overview/tag-rail.tsx +0 -0
  168. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
  169. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_overview/window-summary.tsx +0 -0
  170. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/api/download/route.ts +0 -0
  171. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/api/file/route.ts +0 -0
  172. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
  173. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/api/refresh/route.ts +0 -0
  174. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/error.tsx +0 -0
  175. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/globals.css +0 -0
  176. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/icon.png +0 -0
  177. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/layout.tsx +0 -0
  178. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/page.tsx +0 -0
  179. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/path-to-ga/page.tsx +0 -0
  180. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
  181. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/trends/actions.ts +0 -0
  182. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/trends/page.tsx +0 -0
  183. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/trends/trends-view.tsx +0 -0
  184. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
  185. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/watchlist/page.tsx +0 -0
  186. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
  187. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/next-env.d.ts +0 -0
  188. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/next.config.mjs +0 -0
  189. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/postcss.config.mjs +0 -0
  190. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/public/harness/antigravity.png +0 -0
  191. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/public/harness/claude-code.png +0 -0
  192. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/public/harness/codex.png +0 -0
  193. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/public/uipath.png +0 -0
  194. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/tailwind.config.ts +0 -0
  195. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/tsconfig.json +0 -0
  196. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/vitest.config.ts +0 -0
  197. {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/vitest.setup.ts +0 -0
  198. {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/default.yaml +0 -0
  199. {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/model-comparison.yaml +0 -0
  200. {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/permissions-smoke.yaml +0 -0
  201. {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/plugin-comparison.yaml +0 -0
  202. {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/prompt-mutations-example.yaml +0 -0
  203. {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/smoke_variants.yaml +0 -0
  204. {coder_eval-0.8.9 → coder_eval-0.9.0}/osv-scanner.toml +0 -0
  205. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/.gitattributes +0 -0
  206. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agent.py +0 -0
  207. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/__init__.py +0 -0
  208. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/_logging.py +0 -0
  209. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/antigravity_agent.py +0 -0
  210. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/codex_agent.py +0 -0
  211. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/noop_agent.py +0 -0
  212. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/registry.py +0 -0
  213. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/watchdog.py +0 -0
  214. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/analysis.py +0 -0
  215. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/__init__.py +0 -0
  216. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/aggregate_command.py +0 -0
  217. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/console.py +0 -0
  218. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/evaluate_command.py +0 -0
  219. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/plan_command.py +0 -0
  220. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/run_helpers.py +0 -0
  221. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/run_task_internal_command.py +0 -0
  222. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/utils.py +0 -0
  223. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/__init__.py +0 -0
  224. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
  225. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/classification_match.py +0 -0
  226. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/command_executed.py +0 -0
  227. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/commands_efficiency.py +0 -0
  228. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/file_check.py +0 -0
  229. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/file_contains.py +0 -0
  230. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/file_exists.py +0 -0
  231. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/file_matches_regex.py +0 -0
  232. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/json_check.py +0 -0
  233. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/reference_comparison.py +0 -0
  234. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/run_command.py +0 -0
  235. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/skill_triggered.py +0 -0
  236. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/uipath_eval.py +0 -0
  237. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/agent.py +0 -0
  238. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/budget.py +0 -0
  239. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/categories.py +0 -0
  240. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/categorization.py +0 -0
  241. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/executor.py +0 -0
  242. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/judge.py +0 -0
  243. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/retry.py +0 -0
  244. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/timeout.py +0 -0
  245. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/__init__.py +0 -0
  246. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_context.py +0 -0
  247. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_models.py +0 -0
  248. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_persistence.py +0 -0
  249. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/summaries.py +0 -0
  250. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/formatting.py +0 -0
  251. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/isolation/__init__.py +0 -0
  252. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/logging_config.py +0 -0
  253. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/agent_config.py +0 -0
  254. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/container_paths.py +0 -0
  255. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/experiment.py +0 -0
  256. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/judge.py +0 -0
  257. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/judge_defaults.py +0 -0
  258. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/merge_strategy.py +0 -0
  259. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/mutations.py +0 -0
  260. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/results.py +0 -0
  261. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/telemetry.py +0 -0
  262. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/templates.py +0 -0
  263. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/__init__.py +0 -0
  264. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/batch.py +0 -0
  265. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/config.py +0 -0
  266. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/config_merge.py +0 -0
  267. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/evaluation.py +0 -0
  268. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/experiment.py +0 -0
  269. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/overrides.py +0 -0
  270. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/task_loader.py +0 -0
  271. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/path_utils.py +0 -0
  272. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/plugins.py +0 -0
  273. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/py.typed +0 -0
  274. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/reports_experiment.py +0 -0
  275. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/reports_html.py +0 -0
  276. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/reports_stats.py +0 -0
  277. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/resources/__init__.py +0 -0
  278. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
  279. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/resources/tags.yaml +0 -0
  280. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/sandbox.py +0 -0
  281. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/__init__.py +0 -0
  282. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/ast_similarity.py +0 -0
  283. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/complexity.py +0 -0
  284. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/quality.py +0 -0
  285. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/signature_similarity.py +0 -0
  286. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/similarity.py +0 -0
  287. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/token_similarity.py +0 -0
  288. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/simulation/__init__.py +0 -0
  289. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/simulation/termination.py +0 -0
  290. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/__init__.py +0 -0
  291. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/callbacks.py +0 -0
  292. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/collector.py +0 -0
  293. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/events.py +0 -0
  294. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/renderers.py +0 -0
  295. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/wire.py +0 -0
  296. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/telemetry.py +0 -0
  297. {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/utils.py +0 -0
  298. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/README.md +0 -0
  299. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agentless_smoke_test.yaml +0 -0
  300. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/antigravity_hello_world.yaml +0 -0
  301. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
  302. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/claude_hello_world.yaml +0 -0
  303. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/claude_hello_world_docker.yaml +0 -0
  304. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
  305. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/claude_subagent_test.yaml +0 -0
  306. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
  307. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_hello_world.yaml +0 -0
  308. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_parallel_commands.yaml +0 -0
  309. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
  310. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_skills_test.yaml +0 -0
  311. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_string_utils.yaml +0 -0
  312. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_subagent_test.yaml +0 -0
  313. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/subagent_bash_long_input.yaml +0 -0
  314. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/subagent_merge_sort.yaml +0 -0
  315. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/byod_smoke_test.yaml +0 -0
  316. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dataset_example.yaml +0 -0
  317. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/datasets/sentiment.jsonl +0 -0
  318. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
  319. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
  320. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
  321. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/environment/input.txt +0 -0
  322. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
  323. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
  324. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/fibonacci_with_template.yaml +0 -0
  325. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/hello_date.yaml +0 -0
  326. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/inline_starter_example.yaml +0 -0
  327. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/internal/session_resumption.yaml +0 -0
  328. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_smoke.yaml +0 -0
  329. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
  330. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
  331. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
  332. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
  333. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
  334. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
  335. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
  336. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
  337. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
  338. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
  339. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
  340. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/README.md +0 -0
  341. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
  342. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
  343. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
  344. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
  345. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
  346. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
  347. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
  348. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
  349. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
  350. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
  351. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/sentiment_classification.yaml +0 -0
  352. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_agent_judge.yaml +0 -0
  353. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_budget_exceeded.yaml +0 -0
  354. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
  355. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_llm_judge.yaml +0 -0
  356. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_negative_path.yaml +0 -0
  357. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_task_timeout.yaml +0 -0
  358. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_variants.yaml +0 -0
  359. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/test_sandbox.yaml +0 -0
  360. {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/token_check.yaml +0 -0
  361. {coder_eval-0.8.9 → coder_eval-0.9.0}/templates/byod_smoke_test/Dockerfile +0 -0
  362. {coder_eval-0.8.9 → coder_eval-0.9.0}/templates/fibonacci-starter/README.md +0 -0
  363. {coder_eval-0.8.9 → coder_eval-0.9.0}/templates/fibonacci-starter/src/main.py +0 -0
  364. {coder_eval-0.8.9 → coder_eval-0.9.0}/templates/fibonacci-starter/tests/test_main.py +0 -0
  365. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/__init__.py +0 -0
  366. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/__init__.py +0 -0
  367. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/__init__.py +0 -0
  368. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/_scrub.py +0 -0
  369. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
  370. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
  371. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
  372. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
  373. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
  374. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
  375. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
  376. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
  377. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
  378. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
  379. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
  380. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
  381. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
  382. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
  383. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
  384. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
  385. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
  386. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
  387. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
  388. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
  389. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/__init__.py +0 -0
  390. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
  391. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
  392. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
  393. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
  394. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/run_full.md +0 -0
  395. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
  396. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_path_helpers.py +0 -0
  397. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/__init__.py +0 -0
  398. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
  399. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
  400. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/mock_agent.py +0 -0
  401. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
  402. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
  403. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
  404. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/text_stub_agent.py +0 -0
  405. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/__init__.py +0 -0
  406. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/__init__.py +0 -0
  407. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/base.py +0 -0
  408. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
  409. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
  410. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
  411. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
  412. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
  413. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
  414. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
  415. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
  416. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
  417. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
  418. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
  419. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
  420. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_agent_timing_access.py +0 -0
  421. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
  422. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
  423. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_silent_except.py +0 -0
  424. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_submodule_model_imports.py +0 -0
  425. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
  426. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
  427. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
  428. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/open_explicit_encoding.py +0 -0
  429. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
  430. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/register_criterion_required.py +0 -0
  431. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
  432. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
  433. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/runner.py +0 -0
  434. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/violation.py +0 -0
  435. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent.py +0 -0
  436. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_config_no_timing_fields.py +0 -0
  437. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_config_optional_type.py +0 -0
  438. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_config_registry_dispatch.py +0 -0
  439. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_config_sdk_decoupling.py +0 -0
  440. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_golden_master.py +0 -0
  441. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_telemetry.py +0 -0
  442. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_telemetry_advanced.py +0 -0
  443. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_timeout.py +0 -0
  444. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agentless.py +0 -0
  445. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_aggregate.py +0 -0
  446. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_antigravity_agent.py +0 -0
  447. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_byoa_plugin.py +0 -0
  448. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_byoa_plugin_live.py +0 -0
  449. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_byod_feature.py +0 -0
  450. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_checker_logging.py +0 -0
  451. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_classification_match.py +0 -0
  452. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_claude_settings_enforcement_live.py +0 -0
  453. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cleanup_preservation_guard.py +0 -0
  454. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_empty_glob.py +0 -0
  455. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_sdk_options.py +0 -0
  456. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_set_overrides.py +0 -0
  457. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_telemetry.py +0 -0
  458. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_type_flag.py +0 -0
  459. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_code_review_bugs.py +0 -0
  460. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_codex_agent.py +0 -0
  461. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_codex_agent_live.py +0 -0
  462. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_codex_agent_unit.py +0 -0
  463. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_codex_token_mapping.py +0 -0
  464. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_command_executed.py +0 -0
  465. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_command_statistics.py +0 -0
  466. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_command_telemetry_result_data.py +0 -0
  467. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_commands_efficiency.py +0 -0
  468. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_config_lineage.py +0 -0
  469. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_config_merge_engine.py +0 -0
  470. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_continuous_scoring.py +0 -0
  471. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_criterion_result_round_trip.py +0 -0
  472. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_dataset_expansion.py +0 -0
  473. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_debug_logging.py +0 -0
  474. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_build_failure.py +0 -0
  475. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_runner_container_death.py +0 -0
  476. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_runner_mounts.py +0 -0
  477. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_runner_stream_limit.py +0 -0
  478. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_wildcard_env.py +0 -0
  479. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_workdir_live.py +0 -0
  480. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_driver_resolver.py +0 -0
  481. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_error_handling.py +0 -0
  482. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_evaluate_command.py +0 -0
  483. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_evaluator.py +0 -0
  484. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_event_collector.py +0 -0
  485. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_cli.py +0 -0
  486. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_loader.py +0 -0
  487. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_models.py +0 -0
  488. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_reports.py +0 -0
  489. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_resolver.py +0 -0
  490. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_runner.py +0 -0
  491. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_file_check.py +0 -0
  492. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_file_contains_scoring.py +0 -0
  493. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_formatting.py +0 -0
  494. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_git_clone_failure.py +0 -0
  495. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_heartbeat_watchdog.py +0 -0
  496. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_ignore_patterns_negation.py +0 -0
  497. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_image_from_dockerfiles.py +0 -0
  498. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_integration.py +0 -0
  499. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_json_check.py +0 -0
  500. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_burn_in_live.py +0 -0
  501. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_context_builder.py +0 -0
  502. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_models.py +0 -0
  503. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_persistence.py +0 -0
  504. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_lint_no_top_level_run_limits.py +0 -0
  505. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_lint_runner.py +0 -0
  506. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_log_tail_buffer.py +0 -0
  507. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_logging.py +0 -0
  508. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_logging_isolation.py +0 -0
  509. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_merge_characterization.py +0 -0
  510. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_merge_strategy_annotations.py +0 -0
  511. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_merge_unification.py +0 -0
  512. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_models.py +0 -0
  513. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_mutations.py +0 -0
  514. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_new_criteria.py +0 -0
  515. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_node_env_config.py +0 -0
  516. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_optional_dependencies.py +0 -0
  517. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_orchestrator_error_log_tail.py +0 -0
  518. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_orchestrator_telemetry.py +0 -0
  519. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_overrides_engine.py +0 -0
  520. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_parallel.py +0 -0
  521. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_path_utils.py +0 -0
  522. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_plan_command.py +0 -0
  523. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_plugin_processing.py +0 -0
  524. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_plugins.py +0 -0
  525. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_post_run.py +0 -0
  526. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_pr_review_workflow.py +0 -0
  527. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_pre_run.py +0 -0
  528. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_preservation_mode.py +0 -0
  529. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_pricing_registry.py +0 -0
  530. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_comparison_scoring.py +0 -0
  531. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_missing_file.py +0 -0
  532. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_models.py +0 -0
  533. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_orchestrator.py +0 -0
  534. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_replicate_stats.py +0 -0
  535. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports.py +0 -0
  536. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports_experiment.py +0 -0
  537. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports_html.py +0 -0
  538. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports_stats.py +0 -0
  539. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports_stats_nonfinite.py +0 -0
  540. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_resolve_task_files.py +0 -0
  541. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_resume.py +0 -0
  542. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_retry_logic_comprehensive.py +0 -0
  543. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_routing.py +0 -0
  544. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_run_command_stdout.py +0 -0
  545. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_run_limits_models.py +0 -0
  546. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_run_limits_resolver.py +0 -0
  547. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_runtime_tool_versions.py +0 -0
  548. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox.py +0 -0
  549. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_layer_builder.py +0 -0
  550. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_optional.py +0 -0
  551. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_security.py +0 -0
  552. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_symlink_preservation.py +0 -0
  553. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_templates.py +0 -0
  554. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_scorers.py +0 -0
  555. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_scoring_quality.py +0 -0
  556. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sdk_option_classification.py +0 -0
  557. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_simulation_integration.py +0 -0
  558. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_simulation_termination.py +0 -0
  559. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_simulation_trials.py +0 -0
  560. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_skill_triggered.py +0 -0
  561. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_agent_integration.py +0 -0
  562. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_batch.py +0 -0
  563. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_callbacks.py +0 -0
  564. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_cli.py +0 -0
  565. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_events.py +0 -0
  566. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_orchestrator.py +0 -0
  567. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_renderers.py +0 -0
  568. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_wire.py +0 -0
  569. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_success_criterion_union.py +0 -0
  570. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_suite_rollup.py +0 -0
  571. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_summaries.py +0 -0
  572. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_tags.py +0 -0
  573. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_task_definition_unknown_fields.py +0 -0
  574. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_teardown_interrupt.py +0 -0
  575. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_telemetry.py +0 -0
  576. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_template_env_expansion.py +0 -0
  577. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_threshold_enforcement.py +0 -0
  578. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_batch.py +0 -0
  579. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_categorization.py +0 -0
  580. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_exceptions.py +0 -0
  581. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_models.py +0 -0
  582. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_token_usage.py +0 -0
  583. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_uipath_eval.py +0 -0
  584. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_user_simulator.py +0 -0
  585. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_utils.py +0 -0
  586. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_utterance_extraction.py +0 -0
  587. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_variant_prompt_file.py +0 -0
  588. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_verdict_tool.py +0 -0
  589. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_watchdog.py +0 -0
  590. {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_yaml_migration.py +0 -0
@@ -0,0 +1,109 @@
1
+ # Harness Candidates
2
+
3
+ Deferred lint/test guardrails surfaced during reviews. Promote to a `CExxx` rule
4
+ (or a test) when picked up.
5
+
6
+ ## From code review 260701-1954 (fix-review-top5 run) — deferred to a dedicated guardrail plan
7
+
8
+ > Numbering note: these are *proposed* ids. `CE024` (discriminated-unions) and
9
+ > `CE025` (live-verdict consistency) have since been **implemented** for other
10
+ > rules, so the candidates below were renumbered to the next free ids. Always
11
+ > claim the next unused number in `tests/lint/rules/` — the id-uniqueness assert
12
+ > in `tests/lint/runner.py` is the source of truth.
13
+
14
+ - **CE026** — workflow-YAML rule: forbid any `uses:` step pinned to a floating ref
15
+ (`@v3`, `@main`) rather than a 40-hex commit SHA. Would have caught
16
+ `mxschmitt/action-tmate@v3` (fixed manually in this run). >30 min: needs a
17
+ non-Python file-walk branch in `tests/lint/runner.py`.
18
+ - **CE027** — retired-token grep gate: fail when a removed-subsystem token
19
+ (`LLMGW_`, `API_BACKEND=proxy`, `uipath_llmgw_client`) reappears outside an
20
+ allowlist across docs/config/src. Would have caught the LLM-Gateway residue
21
+ swept in this run. >30 min: needs an allowlist + repo-wide text scan.
22
+ - **CE028** — assert the Makefile `lint:` help does not hardcode a stale `CE0NN`
23
+ upper bound (use `CE001+`). Would have caught the `CE001–CE005` drift fixed here.
24
+ - **docs-vs-harness smoke test** — execute the CI tutorial's `coder-eval run`
25
+ command against a NoOp task and assert the produced tree matches the documented
26
+ globs. Would have caught the `--run-dir runs` layout bug. Not statically
27
+ reachable (needs a live run).
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
+
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
+
46
+ ## From 2026-07-24 publish-github-releases review
47
+
48
+ - [ ] **sdist-contents assertion** — build the sdist and assert it contains only
49
+ intended paths. `pyproject.toml` declares no `[tool.hatch.build.targets.sdist]`
50
+ section, so hatchling's default selection honors only the **root** `.gitignore`
51
+ and sweeps in everything else sitting in the tree at build time. Two distinct
52
+ consequences, worth keeping apart:
53
+ - **What actually reaches PyPI today: nothing unintended.** A local `uv build`
54
+ in a developed worktree produces a 135 MB sdist carrying
55
+ `evalboard/node_modules/**` (8520 files) and `evalboard/.next/**` (190),
56
+ because `evalboard/.gitignore` is nested and therefore not honored. CI is
57
+ spared only incidentally — `release.yml` never runs `npm`/`pnpm install`, so
58
+ those paths do not exist on the runner at `uv build` time. Verified against
59
+ the published artifacts: the 0.8.9 and 0.8.2 sdists on PyPI are ~7.5 MB /
60
+ ~550 files with **zero** `node_modules` entries. (A dirty-tree release would
61
+ not silently ship JS either — 135 MB exceeds PyPI's 100 MB per-file limit, so
62
+ it fails at upload. The real exposure is a broken release, not a stealth one.)
63
+ - **The live hazard is untracked files a workflow leaves in the tree**, which
64
+ hatchling *does* package: a `release-notes.md` written at the repo root by a
65
+ CI step landed in `coder_eval-X.Y.Z/release-notes.md` (verified by building
66
+ it). This is why the "Publish GitHub Release" step writes to
67
+ `${RUNNER_TEMP}` — a convention no check enforces.
68
+
69
+ Not cheap: needs a real `uv build` inside the test suite (slow) plus a decision
70
+ on whether to add an explicit sdist include/exclude allowlist, which changes
71
+ published artifacts. Worth pairing with the allowlist so the contract is
72
+ declared rather than inferred from hatchling's defaults — caught in the
73
+ 2026-07-24 ci/publish-github-releases review.
74
+ - [ ] **CE032 — run the existing AST lint rules over Python embedded in
75
+ `.github/workflows/*.yml`.** CE008/CE009/CE010 already forbid unencoded
76
+ `read_text`/`open`/`subprocess.run`, but `tests/lint/runner.py::check_paths`
77
+ walks only `*.py` under `src/`, so Python inside a `run:` heredoc is invisible
78
+ to ruff, pyright, pytest, coverage *and* the CE runner. Would have caught the
79
+ four unencoded `read_text`/`write_text` calls fixed by hand in this review
80
+ (`release.yml` ×2, `publish-testpypi.yml` ×2). Needs a heredoc extractor
81
+ (`python3 - <<'PY' … PY` → dedent → `ast.parse`) with line-number mapping back
82
+ to the YAML; wire as a `tests/test_custom_lint.py` class like CE027–CE031
83
+ rather than a `BaseRule`. Also consider extending CE008 to `write_text` (it
84
+ matches only `read_text` today, though `src/` happens to be clean).
85
+ - [ ] **CE033 — interpreter heredocs in `.github/workflows/**` must use a quoted
86
+ delimiter** (`<<'PY'`, not `<<PY`). With a bare tag the shell expands `$VAR`
87
+ into the *program text* before the interpreter parses it, so a value containing
88
+ a quote or newline breaks out of the string literal it lands in. Fixed by hand
89
+ in `publish-testpypi.yml` in this review (it interpolated `${DEV_VERSION}` into
90
+ Python source); regex-detectable in ~10 lines, and CE032's `ast.parse` is only
91
+ sound on quoted bodies, so the two ship together.
92
+ - [ ] **`actionlint` + `zizmor` over `.github/workflows/**`.** No static analysis
93
+ whatsoever runs over workflow YAML today (`make verify` never looks at it), so
94
+ every workflow finding in the 2026-07-24 review was caught by a human reading
95
+ it. `actionlint` runs shellcheck over `run:` bodies; `zizmor`'s
96
+ `excessive-permissions` / `artipacked` / `template-injection` rules cover the
97
+ credential-scoping and `${{ }}`-into-`run:` classes reviewed by hand. Subsumes
98
+ the CE026 SHA-pinning candidate above. Start as a non-blocking annotation job.
99
+
100
+ ## From 2026-07-03 open-source docs cleanup
101
+
102
+ - [ ] **Dead-relative-link checker for `docs/**/*.md`** — resolve every relative
103
+ `](target.md)` link against the tree and fail on a missing target. During the
104
+ docs/features purge, the literal `git grep "docs/features"` gate missed 3
105
+ dangling links written in relative form (`](features/...)` in
106
+ TASK_DEFINITION_GUIDE.md ×2 and DOCKER_ISOLATION.md ×1); only a reviewer sweep
107
+ caught them. The cleanup plan explicitly deferred this as YAGNI for the
108
+ one-time purge, but any future doc rename/deletion re-opens the same blind
109
+ spot — caught in the 2026-07-03 open-source-docs-cleanup implementation run.
@@ -0,0 +1,293 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Coder Eval — evaluate AI coding agents and Claude Code skills</title>
7
+ <!--
8
+ The description is here for link previews and for anyone reading source,
9
+ not for ranking: this page is noindex (see below), so search engines will
10
+ not surface it. It mirrors the wording used on coder-eval.com and in the
11
+ package metadata so the product is described the same way everywhere.
12
+ -->
13
+ <meta
14
+ name="description"
15
+ content="Coder Eval is an open-source framework for evaluating and benchmarking AI coding agents and Claude Code skills — sandboxed runs of Claude Code, Codex, and Gemini against declarative YAML tasks, with weighted scoring and CI gates. Documentation: coder-eval.com/docs"
16
+ />
17
+
18
+ <!--
19
+ This page replaces the MkDocs build that used to be published here.
20
+
21
+ Two copies of the same docs were live — this GitHub Pages mirror and
22
+ coder-eval.com/docs — each declaring itself canonical, which splits search
23
+ signals and lets the wrong host rank. The docs are now published only at
24
+ coder-eval.com/docs; this stub exists so anything still pointing here
25
+ (a crawl queue entry, an internal link) lands somewhere useful instead of
26
+ on a 404.
27
+
28
+ `noindex, follow` rather than a canonical pointing at /docs: this page's
29
+ content differs from the target, and Google both discourages combining
30
+ noindex with rel=canonical and ignores canonicals across substantially
31
+ different pages. noindex keeps the stub out of the index while its links
32
+ are still followed.
33
+
34
+ Self-contained by design: the logo is inlined from the website's
35
+ src/assets/logo-light.svg with its navy fills swapped to `currentColor`
36
+ (the "Eval" wordmark and the icon arc stay brand orange), so one copy
37
+ serves both colour schemes. No external stylesheets, fonts, or images.
38
+ -->
39
+ <meta name="robots" content="noindex, follow" />
40
+
41
+ <style>
42
+ :root {
43
+ color-scheme: light dark;
44
+ /* Brand palette, matching the website's src/assets logos. */
45
+ --orange: #fa4616;
46
+ --navy: #10233a;
47
+ --offwhite: #f5f7fa;
48
+
49
+ --fg: var(--navy);
50
+ --muted: #5b6b7c;
51
+ --bg: #ffffff;
52
+ --border: #e3e8ee;
53
+ --on-orange: #ffffff;
54
+ }
55
+ @media (prefers-color-scheme: dark) {
56
+ :root {
57
+ --fg: var(--offwhite);
58
+ --muted: #9aabbc;
59
+ --bg: #0b1826;
60
+ --border: #21354a;
61
+ }
62
+ }
63
+ * {
64
+ box-sizing: border-box;
65
+ }
66
+ body {
67
+ margin: 0;
68
+ min-height: 100vh;
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ padding: 2rem 1.25rem;
73
+ background: var(--bg);
74
+ color: var(--fg);
75
+ font: 16px/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
76
+ }
77
+ main {
78
+ width: 100%;
79
+ max-width: 34rem;
80
+ }
81
+ /* The inlined wordmark inherits `color` for its navy parts. */
82
+ .logo {
83
+ display: block;
84
+ width: 11rem;
85
+ max-width: 60%;
86
+ height: auto;
87
+ margin-bottom: 1.75rem;
88
+ color: var(--fg);
89
+ }
90
+ h1 {
91
+ margin: 0 0 0.5rem;
92
+ font-size: 1.5rem;
93
+ line-height: 1.3;
94
+ }
95
+ p {
96
+ margin: 0 0 1rem;
97
+ color: var(--muted);
98
+ }
99
+ /* What the product is — the reason a visitor who lands here should care.
100
+ With the h1 visually hidden this is the first thing read, so it carries
101
+ the visual weight a heading otherwise would. */
102
+ .lead {
103
+ color: var(--fg);
104
+ font-size: 1.0625rem;
105
+ }
106
+ /* Why this page exists; secondary to the description above it. */
107
+ .notice {
108
+ margin-bottom: 1.5rem;
109
+ font-size: 0.9375rem;
110
+ }
111
+ .notice a {
112
+ color: var(--orange);
113
+ font-weight: 600;
114
+ }
115
+ ul {
116
+ margin: 0 0 1.75rem;
117
+ padding: 0;
118
+ list-style: none;
119
+ border-top: 1px solid var(--border);
120
+ }
121
+ li {
122
+ border-bottom: 1px solid var(--border);
123
+ }
124
+ ul a {
125
+ display: flex;
126
+ flex-wrap: wrap;
127
+ gap: 0.25rem 0.75rem;
128
+ align-items: baseline;
129
+ padding: 0.9rem 0.25rem;
130
+ color: var(--orange);
131
+ font-weight: 600;
132
+ text-decoration: none;
133
+ }
134
+ ul a:hover,
135
+ ul a:focus-visible {
136
+ text-decoration: underline;
137
+ }
138
+ ul a span {
139
+ color: var(--muted);
140
+ font-weight: 400;
141
+ font-size: 0.9375rem;
142
+ }
143
+ /* Repo bar: brand-orange pill with the repo name and live star/fork counts. */
144
+ .repo {
145
+ display: flex;
146
+ flex-wrap: wrap;
147
+ align-items: center;
148
+ gap: 0.5rem 0.9rem;
149
+ padding: 0.7rem 1rem;
150
+ border-radius: 0.5rem;
151
+ background: var(--orange);
152
+ color: var(--on-orange);
153
+ text-decoration: none;
154
+ font-weight: 600;
155
+ }
156
+ .repo:hover,
157
+ .repo:focus-visible {
158
+ filter: brightness(1.07);
159
+ }
160
+ .repo svg {
161
+ flex: none;
162
+ fill: currentColor;
163
+ }
164
+ .repo-name {
165
+ margin-right: auto;
166
+ }
167
+ .stat {
168
+ display: inline-flex;
169
+ align-items: center;
170
+ gap: 0.3rem;
171
+ font-variant-numeric: tabular-nums;
172
+ }
173
+ /* Reserve a few digits of width so replacing the spinner with the fetched
174
+ number doesn't shift the rest of the bar. */
175
+ .count {
176
+ display: inline-flex;
177
+ align-items: center;
178
+ justify-content: flex-end;
179
+ min-width: 2.25ch;
180
+ }
181
+ /* The counts' initial state; the script swaps each one for a real number. */
182
+ .spinner {
183
+ display: inline-block;
184
+ width: 0.8em;
185
+ height: 0.8em;
186
+ border: 2px solid currentColor;
187
+ border-right-color: transparent;
188
+ border-radius: 50%;
189
+ opacity: 0.75;
190
+ animation: spin 0.6s linear infinite;
191
+ }
192
+ @keyframes spin {
193
+ to {
194
+ transform: rotate(360deg);
195
+ }
196
+ }
197
+ @media (prefers-reduced-motion: reduce) {
198
+ .spinner {
199
+ animation-duration: 2.4s;
200
+ }
201
+ }
202
+ /* Visually hidden, still announced — the counts are bare numbers otherwise. */
203
+ .sr-only {
204
+ position: absolute;
205
+ width: 1px;
206
+ height: 1px;
207
+ padding: 0;
208
+ margin: -1px;
209
+ overflow: hidden;
210
+ clip: rect(0, 0, 0, 0);
211
+ white-space: nowrap;
212
+ border: 0;
213
+ }
214
+ </style>
215
+ </head>
216
+ <body>
217
+ <main>
218
+ <svg class="logo" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1400 440" fill="none"><g transform="translate(-75,-36)"><path d="M224 176 L216 176 A56 56 0 0 0 160 232 L160 280 A56 56 0 0 0 216 336 L224 336" fill="none" stroke="#FA4616" stroke-width="28" stroke-linecap="round" stroke-linejoin="round"/><rect x="200" y="210" width="78" height="18" rx="9" fill="currentColor"/><rect x="200" y="247" width="52" height="18" rx="9" fill="currentColor"/><rect x="200" y="284" width="104" height="18" rx="9" fill="currentColor"/></g><g fill="currentColor"><g transform="translate(270.00,278.00) scale(0.19000,-0.19000)"><path d="M308 -10Q237 -10 185.0 16.5Q133 43 104.5 91.5Q76 140 76 206V524Q76 590 104.5 638.5Q133 687 185.0 713.5Q237 740 308 740Q378 740 430.0 713.5Q482 687 511.0 638.5Q540 590 540 524H414Q414 575 386.5 602.5Q359 630 308 630Q257 630 229.0 602.5Q201 575 201 524V206Q201 155 229.0 127.5Q257 100 308 100Q359 100 386.5 127.5Q414 155 414 206H540Q540 140 511.0 91.5Q482 43 430.0 16.5Q378 -10 308 -10Z"/></g><g transform="translate(380.00,278.00) scale(0.19000,-0.19000)"><path d="M300 -9Q194 -9 132.0 50.5Q70 110 70 211V339Q70 441 132.0 500.0Q194 559 300 559Q406 559 468.0 500.0Q530 441 530 339V211Q530 110 468.0 50.5Q406 -9 300 -9ZM300 100Q350 100 377.5 127.5Q405 155 405 207V343Q405 395 377.5 422.5Q350 450 300 450Q250 450 222.5 422.5Q195 395 195 343V207Q195 155 222.5 127.5Q250 100 300 100Z"/></g><g transform="translate(490.00,278.00) scale(0.19000,-0.19000)"><path d="M250 -10Q170 -10 120.5 47.0Q71 104 71 200V349Q71 446 120.0 503.0Q169 560 250 560Q307 560 346.5 531.0Q386 502 402 450L398 576V730H523V0H401V100Q386 48 347.0 19.0Q308 -10 250 -10ZM297 98Q345 98 371.5 127.0Q398 156 398 209V341Q398 394 371.5 423.0Q345 452 297 452Q249 452 222.5 426.0Q196 400 196 346V204Q196 150 222.5 124.0Q249 98 297 98Z"/></g><g transform="translate(600.00,278.00) scale(0.19000,-0.19000)"><path d="M301 -10Q231 -10 179.0 17.0Q127 44 98.5 93.5Q70 143 70 210V340Q70 407 98.5 456.5Q127 506 179.0 533.0Q231 560 301 560Q370 560 421.5 533.0Q473 506 501.5 457.5Q530 409 530 344V244H190V206Q190 150 219.0 121.5Q248 93 301 93Q340 93 367.5 106.5Q395 120 400 146H524Q511 75 450.0 32.5Q389 -10 301 -10ZM190 344V325L410 326V345Q410 402 382.0 433.0Q354 464 301 464Q246 464 218.0 432.5Q190 401 190 344Z"/></g><g transform="translate(710.00,278.00) scale(0.19000,-0.19000)"><path d="M97 0V550H219V443Q229 497 268.5 528.5Q308 560 371 560Q455 560 502.0 506.0Q549 452 549 355V303H424V349Q424 399 398.0 425.5Q372 452 324 452Q274 452 248.0 422.0Q222 392 222 337V0Z"/></g></g><g fill="#FA4616"><g transform="translate(890.00,278.00) scale(0.19000,-0.19000)"><path d="M88 0V730H526V620H211V430H491V324H211V110H526V0Z"/></g><g transform="translate(1000.00,278.00) scale(0.19000,-0.19000)"><path d="M221 0 36 550H167L273 216Q283 186 290.5 155.5Q298 125 301 103Q305 125 311.5 155.5Q318 186 327 215L432 550H564L380 0Z"/></g><g transform="translate(1110.00,278.00) scale(0.19000,-0.19000)"><path d="M239 -10Q155 -10 106.5 37.5Q58 85 58 162Q58 242 113.0 289.5Q168 337 264 337H398V376Q398 459 301 459Q257 459 231.0 442.0Q205 425 202 394H82Q86 468 144.5 514.0Q203 560 302 560Q407 560 465.0 511.0Q523 462 523 373V0H401V103Q394 50 351.0 20.0Q308 -10 239 -10ZM279 92Q334 92 366.0 119.0Q398 146 398 191V256H270Q229 256 205.0 233.0Q181 210 181 174Q181 137 206.5 114.5Q232 92 279 92Z"/></g><g transform="translate(1220.00,278.00) scale(0.19000,-0.19000)"><path d="M389 0Q307 0 257.5 49.0Q208 98 208 178V617H27V730H333V181Q333 150 350.5 131.5Q368 113 398 113H559V0Z"/></g></g></svg>
219
+
220
+ <!--
221
+ Visually hidden on purpose: the wordmark above already renders "Coder
222
+ Eval", so showing this too was the same two words twice. The heading
223
+ still exists for document structure, and it is the accessible name for
224
+ the page now that the logo is aria-hidden.
225
+ -->
226
+ <h1 class="sr-only">Coder Eval</h1>
227
+ <p class="lead">
228
+ An open-source framework for evaluating and benchmarking AI coding agents and their Claude
229
+ Code skills: it runs a real agent — Claude Code, Codex, or Gemini — in a sandbox against
230
+ declarative YAML tasks, then scores the files and commands the agent actually produced.
231
+ </p>
232
+ <p class="notice">
233
+ The documentation has moved to
234
+ <a href="https://coder-eval.com/docs">coder-eval.com/docs</a>.
235
+ </p>
236
+
237
+ <!--
238
+ Only the project site here: the docs link lives in the notice above and
239
+ the repo in the bar below, so each destination appears exactly once.
240
+ -->
241
+ <ul>
242
+ <li>
243
+ <a href="https://coder-eval.com">Project website <span>coder-eval.com</span></a>
244
+ </li>
245
+ </ul>
246
+
247
+ <a class="repo" href="https://github.com/UiPath/coder_eval">
248
+ <svg width="20" height="20" viewBox="0 0 16 16" aria-hidden="true">
249
+ <path
250
+ d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.07-.2-.36-1.02.07-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.43 1.1.14 1.92.07 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0016 8c0-4.42-3.58-8-8-8z"
251
+ />
252
+ </svg>
253
+ <span class="repo-name">UiPath/coder_eval</span>
254
+ <span class="stat" title="Stars">
255
+ <svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true">
256
+ <path
257
+ d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z"
258
+ />
259
+ </svg>
260
+ <span class="count" data-stat="stars"><span class="spinner" aria-hidden="true"></span></span>
261
+ <span class="sr-only">stars</span>
262
+ </span>
263
+ <span class="stat" title="Forks">
264
+ <svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true">
265
+ <path
266
+ d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-.878a2.25 2.25 0 111.5 0v.878a2.25 2.25 0 01-2.25 2.25h-1.5v2.128a2.251 2.251 0 11-1.5 0V8.5h-1.5A2.25 2.25 0 013.5 6.25v-.878a2.25 2.25 0 111.5 0zM5 3.25a.75.75 0 10-1.5 0 .75.75 0 001.5 0zm6.75.75a.75.75 0 100-1.5.75.75 0 000 1.5zm-3 8.75a.75.75 0 100-1.5.75.75 0 000 1.5z"
267
+ />
268
+ </svg>
269
+ <span class="count" data-stat="forks"><span class="spinner" aria-hidden="true"></span></span>
270
+ <span class="sr-only">forks</span>
271
+ </span>
272
+ </a>
273
+ </main>
274
+
275
+ <script>
276
+ // Fill the star/fork counts from api.github.com, replacing the spinners the
277
+ // markup ships. Nothing is hardcoded: a committed count would be wrong
278
+ // within days. Any failure — offline, rate limit (unauthenticated is 60
279
+ // requests/hour/IP), unexpected payload, scripting disabled — simply leaves
280
+ // the spinner in place rather than showing a stale or invented number.
281
+ fetch("https://api.github.com/repos/UiPath/coder_eval")
282
+ .then((r) => r.json())
283
+ .then((d) => {
284
+ const values = { stars: d.stargazers_count, forks: d.forks_count };
285
+ document.querySelectorAll("[data-stat]").forEach((el) => {
286
+ const n = values[el.dataset.stat];
287
+ if (Number.isFinite(n)) el.textContent = n.toLocaleString();
288
+ });
289
+ })
290
+ .catch(() => {});
291
+ </script>
292
+ </body>
293
+ </html>
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env python3
2
+ """Slice one version's section out of ``CHANGELOG.md`` for a GitHub Release body.
3
+
4
+ Used by ``.github/workflows/release.yml``'s "Publish GitHub Release" step.
5
+
6
+ This lives in a real module rather than inline in a ``run:`` heredoc because
7
+ code inside a heredoc is structurally invisible to ruff, pyright, pytest and
8
+ coverage — and this particular code has three distinct failure modes (version
9
+ absent, section is the file's last, version string carrying regex
10
+ metacharacters) on a path that executes exactly once per release, against
11
+ production ``main``, after the tag is already pushed. The prerelease dispatch
12
+ skips the step, so there is no rehearsal; ``tests/test_release_notes.py`` is
13
+ what exercises it before it matters.
14
+
15
+ Usage::
16
+
17
+ release_notes.py <version> <output-path>
18
+
19
+ Writes the section body (heading line excluded, stripped) to ``<output-path>``,
20
+ or an empty file when no matching section exists — the caller treats an empty
21
+ file as "fall back to GitHub's generated notes".
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import re
27
+ import sys
28
+ from pathlib import Path
29
+
30
+
31
+ _REPO_ROOT = Path(__file__).resolve().parents[2]
32
+
33
+ # semantic-release's default changelog template renders headings as
34
+ # "## v0.8.9 (2026-07-23)". Capture everything after that heading line up to the
35
+ # next "## v" heading, or EOF for the newest entry (the common case on a release
36
+ # run, since the just-generated section is at the top of the file).
37
+ #
38
+ # The trailing \b on the version is load-bearing: without it "0.8.1" would match
39
+ # the "## v0.8.10" heading and publish the wrong section.
40
+ _SECTION_TEMPLATE = r"(?m)^## v{version}\b.*?$(.*?)(?=^## v|\Z)"
41
+
42
+
43
+ def extract_section(changelog_text: str, version: str) -> str:
44
+ """Return the changelog body for ``version``, or ``""`` when absent.
45
+
46
+ ``version`` is regex-escaped, so a PEP 440 local/prerelease version
47
+ containing metacharacters (``+``, ``!``) is matched literally.
48
+ """
49
+ pattern = _SECTION_TEMPLATE.format(version=re.escape(version))
50
+ match = re.search(pattern, changelog_text, re.S)
51
+ return match.group(1).strip() if match else ""
52
+
53
+
54
+ def main(argv: list[str]) -> int:
55
+ if len(argv) != 3:
56
+ print("usage: release_notes.py <version> <output-path>", file=sys.stderr)
57
+ return 2
58
+ version, out_path = argv[1], argv[2]
59
+ # Encoding is pinned rather than left to the ambient locale: CHANGELOG.md
60
+ # verifiably carries non-ASCII (arrows, em dashes, check marks), so a
61
+ # non-UTF-8 locale would raise UnicodeDecodeError here and — under the
62
+ # caller's `continue-on-error: true` — silently publish no Release at all.
63
+ text = (_REPO_ROOT / "CHANGELOG.md").read_text(encoding="utf-8")
64
+ body = extract_section(text, version)
65
+ Path(out_path).write_text(body, encoding="utf-8")
66
+ if not body:
67
+ # Surfaced as a workflow annotation; the caller falls back to
68
+ # --generate-notes when the file is empty.
69
+ print(f"::warning::no CHANGELOG section found for v{version}; using GitHub's generated notes")
70
+ return 0
71
+
72
+
73
+ if __name__ == "__main__":
74
+ raise SystemExit(main(sys.argv))
@@ -0,0 +1,75 @@
1
+ name: Pages stub
2
+
3
+ # Publishes `.github/pages-stub/` to the `gh-pages` branch, which GitHub Pages
4
+ # serves at https://uipath.github.io/coder_eval/.
5
+ #
6
+ # This workflow used to run `mkdocs gh-deploy`, publishing a full second copy of
7
+ # docs/ here. That was a duplicate of coder-eval.com/docs: both copies declared
8
+ # themselves canonical, which splits search signals and lets the wrong host rank —
9
+ # and the mirror drifted, serving pages (BYOD, CODEX_AGENT_GUIDE) that had been
10
+ # renamed upstream. The docs are now published only at coder-eval.com/docs, synced
11
+ # from docs/ by the website's scripts/sync-docs.mjs.
12
+ #
13
+ # The mkdocs deploy is REMOVED rather than commented out: leaving it one
14
+ # uncomment away meant a future run would silently restore the duplicate. mkdocs
15
+ # itself is still used — `mkdocs.yml` remains the docs IA source of truth (CE028
16
+ # generates the index surfaces from its `nav:`, and the website derives its
17
+ # sidebar from it), and `mkdocs build` is still the way to verify anchors locally.
18
+ # What's gone is only the *publishing* of a second site.
19
+ #
20
+ # The gh-pages branch is force-replaced with the stub on each run, so the stale
21
+ # MkDocs output — including its sitemap.xml, which was still advertising the old
22
+ # URLs for indexing — is cleared rather than left alongside.
23
+ #
24
+ # Manual-only by design: the stub changes about once a year. Run it from the
25
+ # Actions tab when the stub itself changes.
26
+ on:
27
+ workflow_dispatch:
28
+
29
+ permissions:
30
+ contents: write
31
+
32
+ concurrency:
33
+ group: docs-gh-pages
34
+ cancel-in-progress: true
35
+
36
+ jobs:
37
+ publish:
38
+ runs-on: ubuntu-latest
39
+ steps:
40
+ - uses: actions/checkout@v4
41
+
42
+ - name: Assemble the published tree
43
+ run: |
44
+ set -euo pipefail
45
+ out="$(mktemp -d)"
46
+ cp .github/pages-stub/index.html "$out/index.html"
47
+ # Pages serves 404.html for any unknown path, so the same stub catches
48
+ # every old deep URL (/USER_GUIDE/, /tutorials/01-.../, …) without
49
+ # needing a file per route.
50
+ cp .github/pages-stub/index.html "$out/404.html"
51
+ # Without .nojekyll, Pages runs the tree through Jekyll, which strips
52
+ # files and directories whose names begin with an underscore.
53
+ touch "$out/.nojekyll"
54
+ # The old MkDocs llms.txt lived here and is referenced from the site's
55
+ # /llms.txt history; a .txt cannot meta-refresh, so point it in prose.
56
+ printf '# Coder Eval\n\nThe documentation moved to https://coder-eval.com/docs\n\nllms.txt: https://coder-eval.com/llms.txt\nFull docs in one file: https://coder-eval.com/llms-full.txt\n' \
57
+ > "$out/llms.txt"
58
+ echo "OUT_DIR=$out" >> "$GITHUB_ENV"
59
+
60
+ - name: Force-replace gh-pages with the stub
61
+ env:
62
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
63
+ run: |
64
+ set -euo pipefail
65
+ cd "$OUT_DIR"
66
+ git init -q -b gh-pages
67
+ git config user.name "coder-eval"
68
+ git config user.email "coder-eval@uipath.com"
69
+ git add -A
70
+ git commit -qm "Publish Pages stub redirecting to coder-eval.com/docs"
71
+ # A fresh single-commit history, force-pushed: gh-pages is a build
72
+ # artifact, so there is no history worth preserving, and this guarantees
73
+ # none of the old MkDocs output survives.
74
+ git push --force \
75
+ "https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" gh-pages
@@ -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
@@ -64,8 +64,14 @@ jobs:
64
64
  CURRENT_VERSION=$(python3 -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
65
65
  # PEP 440 dev release: sorts before the base release, unique per run.
66
66
  DEV_VERSION="${CURRENT_VERSION}.dev${RUN_NUMBER}"
67
- python3 - <<PY
68
- import re, pathlib
67
+ # Exported so the heredoc below can read it from os.environ. The delimiter
68
+ # is QUOTED (<<'PY'): with a bare <<PY the shell expands $DEV_VERSION into
69
+ # the Python source text, so a value containing a quote or newline would
70
+ # break out of the string literal it lands in.
71
+ export DEV_VERSION
72
+ python3 - <<'PY'
73
+ import os, re, pathlib
74
+ version = os.environ["DEV_VERSION"]
69
75
  # pyproject.toml is the canonical source; __init__ is kept in sync.
70
76
  for path, pat in (
71
77
  ("pyproject.toml", r'(?m)^version\s*=\s*".+?"$'),
@@ -76,10 +82,12 @@ jobs:
76
82
  # re.subn (not re.sub) so a version-line format drift aborts loudly
77
83
  # instead of silently no-op'ing (rc=0) and publishing a stale/base
78
84
  # version that then collides on TestPyPI (masked by skip-existing).
79
- new, n = re.subn(pat, f'{key} = "${DEV_VERSION}"', p.read_text(), count=1)
85
+ # encoding pinned rather than left to the ambient locale, which would
86
+ # otherwise raise UnicodeDecodeError mid-publish on a non-ASCII source.
87
+ new, n = re.subn(pat, f'{key} = "{version}"', p.read_text(encoding="utf-8"), count=1)
80
88
  if n != 1:
81
89
  raise SystemExit(f"version pattern did not match {path} (matched {n}); refusing to publish a stale/colliding artifact")
82
- p.write_text(new)
90
+ p.write_text(new, encoding="utf-8")
83
91
  PY
84
92
  echo "Stamped dev version: ${DEV_VERSION}"
85
93