coder-eval 0.11.2__tar.gz → 0.11.3__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 (657) hide show
  1. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/pr-checks.yml +11 -8
  2. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/release.yml +9 -2
  3. {coder_eval-0.11.2 → coder_eval-0.11.3}/.gitignore +3 -0
  4. {coder_eval-0.11.2 → coder_eval-0.11.3}/CHANGELOG.md +81 -0
  5. {coder_eval-0.11.2 → coder_eval-0.11.3}/PKG-INFO +3 -1
  6. {coder_eval-0.11.2 → coder_eval-0.11.3}/action.yml +1 -1
  7. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/AB_EXPERIMENTS.md +1 -0
  8. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/DIALOG_MODE.md +5 -3
  9. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/TASK_DEFINITION_GUIDE.md +37 -1
  10. coder_eval-0.11.3/evalboard/app/_components/col-help.tsx +10 -0
  11. coder_eval-0.11.3/evalboard/app/_overview/__tests__/efficiency-charts.test.tsx +80 -0
  12. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/__tests__/harness-legend.test.tsx +38 -0
  13. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/__tests__/harness-series.test.ts +6 -4
  14. coder_eval-0.11.3/evalboard/app/_overview/efficiency-charts.tsx +104 -0
  15. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/harness-legend.tsx +28 -15
  16. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/harness-series.ts +7 -3
  17. coder_eval-0.11.3/evalboard/app/_overview/wall-clock-chart.tsx +138 -0
  18. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/page.tsx +8 -19
  19. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/trends/trends-view.tsx +75 -36
  20. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +1 -0
  21. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/watchlist/watchlist-view.tsx +39 -0
  22. coder_eval-0.11.3/evalboard/vitest.setup.ts +22 -0
  23. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/.claude-plugin/plugin.json +1 -1
  24. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/criteria.md +1 -1
  25. {coder_eval-0.11.2 → coder_eval-0.11.3}/pyproject.toml +14 -1
  26. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/__init__.py +1 -1
  27. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/claude_code_agent.py +26 -5
  28. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/base.py +6 -0
  29. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/llm_judge.py +38 -9
  30. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/checker.py +2 -0
  31. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_bedrock.py +12 -3
  32. coder_eval-0.11.3/src/coder_eval/evaluation/judge_litellm.py +148 -0
  33. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_usage.py +42 -0
  34. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/verdict_tool.py +45 -0
  35. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/__init__.py +4 -0
  36. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/criteria.py +6 -3
  37. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/experiment.py +16 -0
  38. coder_eval-0.11.3/src/coder_eval/models/routing.py +385 -0
  39. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/tasks.py +71 -1
  40. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/experiment.py +47 -0
  41. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestrator.py +100 -12
  42. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_config_precedence.py +0 -1
  43. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_bedrock.py +8 -1
  44. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_burn_in_live.py +1 -1
  45. coder_eval-0.11.3/tests/test_judge_litellm.py +209 -0
  46. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_litellm_cost.py +3 -3
  47. coder_eval-0.11.3/tests/test_litellm_judge_live.py +69 -0
  48. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_litellm_route.py +261 -31
  49. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_llm_judge_criterion.py +89 -10
  50. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_models.py +6 -2
  51. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_orchestrator.py +81 -6
  52. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_route_seam_exhaustiveness.py +7 -3
  53. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_routing.py +32 -15
  54. {coder_eval-0.11.2 → coder_eval-0.11.3}/uv.lock +401 -2
  55. coder_eval-0.11.2/evalboard/app/_components/col-help.tsx +0 -131
  56. coder_eval-0.11.2/evalboard/vitest.setup.ts +0 -1
  57. coder_eval-0.11.2/src/coder_eval/models/routing.py +0 -225
  58. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-code-review-full.md +0 -0
  59. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-code-review-wf.md +0 -0
  60. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-code-review.md +0 -0
  61. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-create-plan.md +0 -0
  62. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-implement-plan.md +0 -0
  63. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-review.md +0 -0
  64. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/harness-candidates.md +0 -0
  65. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/shared/axes.md +0 -0
  66. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/shared/multi-model-review.md +0 -0
  67. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/shared/review-rubric.md +0 -0
  68. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/shared/run-layout.md +0 -0
  69. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/workflows/cr-axis.js +0 -0
  70. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/workflows/cr-parent.js +0 -0
  71. {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude-plugin/marketplace.json +0 -0
  72. {coder_eval-0.11.2 → coder_eval-0.11.3}/.env.example +0 -0
  73. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/CODEOWNERS +0 -0
  74. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
  75. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  76. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  77. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/actionlint.yaml +0 -0
  78. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/code_review.md +0 -0
  79. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/dependabot.yml +0 -0
  80. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/pages-stub/index.html +0 -0
  81. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/scripts/release_notes.py +0 -0
  82. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/claude-pr-review.yml +0 -0
  83. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/codeql.yml +0 -0
  84. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/conventional-commits.yml +0 -0
  85. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/docker-publish.yml +0 -0
  86. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/docs.yml +0 -0
  87. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/publish-testpypi.yml +0 -0
  88. {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/verify-published-action.yml +0 -0
  89. {coder_eval-0.11.2 → coder_eval-0.11.3}/.pre-commit-config.yaml +0 -0
  90. {coder_eval-0.11.2 → coder_eval-0.11.3}/.python-version +0 -0
  91. {coder_eval-0.11.2 → coder_eval-0.11.3}/ADOPTERS.md +0 -0
  92. {coder_eval-0.11.2 → coder_eval-0.11.3}/CLAUDE.md +0 -0
  93. {coder_eval-0.11.2 → coder_eval-0.11.3}/CODE_OF_CONDUCT.md +0 -0
  94. {coder_eval-0.11.2 → coder_eval-0.11.3}/CONTRIBUTING.md +0 -0
  95. {coder_eval-0.11.2 → coder_eval-0.11.3}/LICENSE +0 -0
  96. {coder_eval-0.11.2 → coder_eval-0.11.3}/Makefile +0 -0
  97. {coder_eval-0.11.2 → coder_eval-0.11.3}/NOTICE +0 -0
  98. {coder_eval-0.11.2 → coder_eval-0.11.3}/README.md +0 -0
  99. {coder_eval-0.11.2 → coder_eval-0.11.3}/SECURITY.md +0 -0
  100. {coder_eval-0.11.2 → coder_eval-0.11.3}/comparison.md +0 -0
  101. {coder_eval-0.11.2 → coder_eval-0.11.3}/docker/Dockerfile +0 -0
  102. {coder_eval-0.11.2 → coder_eval-0.11.3}/docker/Dockerfile.runtime +0 -0
  103. {coder_eval-0.11.2 → coder_eval-0.11.3}/docker/coder_eval_entrypoint.sh +0 -0
  104. {coder_eval-0.11.2 → coder_eval-0.11.3}/docker/coder_eval_runtime_entrypoint.sh +0 -0
  105. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/CI_GATE.md +0 -0
  106. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/DATASETS.md +0 -0
  107. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/DOCKER_ISOLATION.md +0 -0
  108. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/EXTENDING.md +0 -0
  109. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/PLUGIN.md +0 -0
  110. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/REPORT_SCHEMA.md +0 -0
  111. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/USER_GUIDE.md +0 -0
  112. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/agents/ANTIGRAVITY.md +0 -0
  113. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/agents/CLAUDE_CODE.md +0 -0
  114. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/agents/CODEX.md +0 -0
  115. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/agents/HARNESS_PARITY.md +0 -0
  116. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/assets/hero.gif +0 -0
  117. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/comparison.md +0 -0
  118. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/index.md +0 -0
  119. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/llms.txt +0 -0
  120. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/01-first-evaluation.md +0 -0
  121. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/02-ci-pipeline.md +0 -0
  122. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/03-evalboard-local.md +0 -0
  123. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/04-writing-a-task.md +0 -0
  124. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/05-comparing-models.md +0 -0
  125. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/06-use-docker-isolation.md +0 -0
  126. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/07-plugin-in-claude-code.md +0 -0
  127. {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/README.md +0 -0
  128. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/.gitignore +0 -0
  129. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/README.md +0 -0
  130. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/__tests__/harness-badge.test.tsx +0 -0
  131. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/__tests__/harness-selector.test.tsx +0 -0
  132. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
  133. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/collapsible-rail.tsx +0 -0
  134. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/harness-badge.tsx +0 -0
  135. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/harness-selector.tsx +0 -0
  136. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/scroll-table.tsx +0 -0
  137. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/search-box.tsx +0 -0
  138. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/unit-toggle.tsx +0 -0
  139. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/version-list.tsx +0 -0
  140. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_lib/__tests__/source-param.test.ts +0 -0
  141. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_lib/source-param.ts +0 -0
  142. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/daily-chart.tsx +0 -0
  143. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/tag-rail.tsx +0 -0
  144. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
  145. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/window-summary.tsx +0 -0
  146. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/api/download/route.ts +0 -0
  147. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/api/file/route.ts +0 -0
  148. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
  149. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/api/refresh/route.ts +0 -0
  150. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/error.tsx +0 -0
  151. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/globals.css +0 -0
  152. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/icon.png +0 -0
  153. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/layout.tsx +0 -0
  154. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/path-to-ga/__tests__/task-table.test.tsx +0 -0
  155. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/path-to-ga/page.tsx +0 -0
  156. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/path-to-ga/task-table.tsx +0 -0
  157. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/scribe/page.tsx +0 -0
  158. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/scribe/run-table.tsx +0 -0
  159. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
  160. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/trends/actions.ts +0 -0
  161. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/trends/page.tsx +0 -0
  162. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/watchlist/page.tsx +0 -0
  163. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/next-env.d.ts +0 -0
  164. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/next.config.mjs +0 -0
  165. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/package.json +0 -0
  166. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/pnpm-lock.yaml +0 -0
  167. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/postcss.config.mjs +0 -0
  168. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/public/harness/antigravity.png +0 -0
  169. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/public/harness/claude-code.png +0 -0
  170. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/public/harness/codex.png +0 -0
  171. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/public/uipath.png +0 -0
  172. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/tailwind.config.ts +0 -0
  173. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/tsconfig.json +0 -0
  174. {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/vitest.config.ts +0 -0
  175. {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/default.yaml +0 -0
  176. {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/early-stop-ab.yaml +0 -0
  177. {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/model-comparison.yaml +0 -0
  178. {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/permissions-smoke.yaml +0 -0
  179. {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/plugin-comparison.yaml +0 -0
  180. {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/prompt-mutations-example.yaml +0 -0
  181. {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/smoke_variants.yaml +0 -0
  182. {coder_eval-0.11.2 → coder_eval-0.11.3}/litellm/README.md +0 -0
  183. {coder_eval-0.11.2 → coder_eval-0.11.3}/litellm/cost_logger.py +0 -0
  184. {coder_eval-0.11.2 → coder_eval-0.11.3}/litellm/litellm-config.yaml +0 -0
  185. {coder_eval-0.11.2 → coder_eval-0.11.3}/litellm/start-litellm.sh +0 -0
  186. {coder_eval-0.11.2 → coder_eval-0.11.3}/mkdocs.yml +0 -0
  187. {coder_eval-0.11.2 → coder_eval-0.11.3}/osv-scanner.toml +0 -0
  188. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/README.md +0 -0
  189. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/cli-setup.md +0 -0
  190. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/repo-layout.md +0 -0
  191. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/run-layout.md +0 -0
  192. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/task-rubric.md +0 -0
  193. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/templates/activation-rows.jsonl +0 -0
  194. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/templates/activation.yaml +0 -0
  195. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/analyze/SKILL.md +0 -0
  196. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/check-skill/SKILL.md +0 -0
  197. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/ci/SKILL.md +0 -0
  198. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/init/SKILL.md +0 -0
  199. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/lint-tasks/SKILL.md +0 -0
  200. {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/task/SKILL.md +0 -0
  201. {coder_eval-0.11.2 → coder_eval-0.11.3}/scripts/check_commit_msg.sh +0 -0
  202. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/.gitattributes +0 -0
  203. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agent.py +0 -0
  204. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/__init__.py +0 -0
  205. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/_logging.py +0 -0
  206. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/antigravity_agent.py +0 -0
  207. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/codex_agent.py +0 -0
  208. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/noop_agent.py +0 -0
  209. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/registry.py +0 -0
  210. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/watchdog.py +0 -0
  211. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/analysis.py +0 -0
  212. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/__init__.py +0 -0
  213. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/aggregate_command.py +0 -0
  214. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/console.py +0 -0
  215. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/evaluate_command.py +0 -0
  216. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/plan_command.py +0 -0
  217. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/report_command.py +0 -0
  218. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/run_command.py +0 -0
  219. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/run_helpers.py +0 -0
  220. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/run_task_internal_command.py +0 -0
  221. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/utils.py +0 -0
  222. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/config.py +0 -0
  223. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/__init__.py +0 -0
  224. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
  225. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/agent_judge.py +0 -0
  226. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/classification_match.py +0 -0
  227. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/cli_called.py +0 -0
  228. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/command_executed.py +0 -0
  229. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/commands_efficiency.py +0 -0
  230. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/file_check.py +0 -0
  231. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/file_contains.py +0 -0
  232. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/file_exists.py +0 -0
  233. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/file_matches_regex.py +0 -0
  234. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/json_check.py +0 -0
  235. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/reference_comparison.py +0 -0
  236. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/run_command.py +0 -0
  237. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/skill_triggered.py +0 -0
  238. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/uipath_eval.py +0 -0
  239. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/__init__.py +0 -0
  240. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/agent.py +0 -0
  241. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/budget.py +0 -0
  242. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/categories.py +0 -0
  243. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/categorization.py +0 -0
  244. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/checker_misuse.py +0 -0
  245. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/executor.py +0 -0
  246. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/judge.py +0 -0
  247. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/reference.py +0 -0
  248. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/retry.py +0 -0
  249. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/timeout.py +0 -0
  250. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/__init__.py +0 -0
  251. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
  252. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_context.py +0 -0
  253. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_models.py +0 -0
  254. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_persistence.py +0 -0
  255. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/sub_agent.py +0 -0
  256. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/summaries.py +0 -0
  257. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/formatting.py +0 -0
  258. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/fs_permissions.py +0 -0
  259. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/invocation_log.py +0 -0
  260. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/isolation/__init__.py +0 -0
  261. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/isolation/docker_runner.py +0 -0
  262. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/litellm_cost.py +0 -0
  263. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/logging_config.py +0 -0
  264. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/agent_config.py +0 -0
  265. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/container_paths.py +0 -0
  266. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/enums.py +0 -0
  267. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/judge.py +0 -0
  268. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/judge_defaults.py +0 -0
  269. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/limits.py +0 -0
  270. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/merge_strategy.py +0 -0
  271. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/mutations.py +0 -0
  272. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/results.py +0 -0
  273. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/sandbox.py +0 -0
  274. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/telemetry.py +0 -0
  275. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/templates.py +0 -0
  276. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/__init__.py +0 -0
  277. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/batch.py +0 -0
  278. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/config.py +0 -0
  279. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/config_merge.py +0 -0
  280. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/early_stop.py +0 -0
  281. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/evaluation.py +0 -0
  282. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/overrides.py +0 -0
  283. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/run_limits.py +0 -0
  284. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/task_loader.py +0 -0
  285. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/path_utils.py +0 -0
  286. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/plugins.py +0 -0
  287. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/pricing.py +0 -0
  288. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/py.typed +0 -0
  289. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports.py +0 -0
  290. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports_experiment.py +0 -0
  291. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports_html.py +0 -0
  292. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports_junit.py +0 -0
  293. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports_stats.py +0 -0
  294. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/resources/__init__.py +0 -0
  295. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
  296. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/resources/tags.yaml +0 -0
  297. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/sandbox.py +0 -0
  298. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/__init__.py +0 -0
  299. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/ast_similarity.py +0 -0
  300. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/complexity.py +0 -0
  301. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/quality.py +0 -0
  302. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/signature_similarity.py +0 -0
  303. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/similarity.py +0 -0
  304. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/token_similarity.py +0 -0
  305. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/simulation/__init__.py +0 -0
  306. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/simulation/termination.py +0 -0
  307. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/simulation/user_simulator.py +0 -0
  308. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/__init__.py +0 -0
  309. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/callbacks.py +0 -0
  310. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/collector.py +0 -0
  311. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/events.py +0 -0
  312. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/renderers.py +0 -0
  313. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/wire.py +0 -0
  314. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/telemetry.py +0 -0
  315. {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/utils.py +0 -0
  316. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/README.md +0 -0
  317. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agentless_smoke_test.yaml +0 -0
  318. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/antigravity_hello_world.yaml +0 -0
  319. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
  320. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/claude_hello_world.yaml +0 -0
  321. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/claude_hello_world_docker.yaml +0 -0
  322. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
  323. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/claude_subagent_test.yaml +0 -0
  324. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
  325. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_hello_world.yaml +0 -0
  326. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_parallel_commands.yaml +0 -0
  327. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
  328. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_skills_test.yaml +0 -0
  329. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_string_utils.yaml +0 -0
  330. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_subagent_test.yaml +0 -0
  331. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/subagent_bash_long_input.yaml +0 -0
  332. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/subagent_merge_sort.yaml +0 -0
  333. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/anti_cheat_reference/anti_cheat_reference.yaml +0 -0
  334. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/anti_cheat_reference/reference/solution.py +0 -0
  335. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/byod_smoke_test.yaml +0 -0
  336. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dataset_example.yaml +0 -0
  337. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/datasets/sentiment.jsonl +0 -0
  338. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
  339. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
  340. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
  341. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/environment/input.txt +0 -0
  342. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
  343. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
  344. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/early_stop_decision_budget_exceeded.yaml +0 -0
  345. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/early_stop_weighted_high_weight_kills_run.yaml +0 -0
  346. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/early_stop_weighted_low_weight_absorbed.yaml +0 -0
  347. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/fibonacci_with_template.yaml +0 -0
  348. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/hello_date.yaml +0 -0
  349. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/inline_starter_example.yaml +0 -0
  350. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/internal/session_resumption.yaml +0 -0
  351. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_smoke.yaml +0 -0
  352. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
  353. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
  354. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
  355. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
  356. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
  357. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
  358. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/run_limits/max_turns_cap.yaml +0 -0
  359. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/run_limits/turn_timeout.yaml +0 -0
  360. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
  361. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
  362. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
  363. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
  364. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
  365. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
  366. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/README.md +0 -0
  367. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
  368. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
  369. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
  370. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
  371. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
  372. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
  373. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
  374. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
  375. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
  376. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
  377. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/sentiment_classification.yaml +0 -0
  378. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_agent_judge.yaml +0 -0
  379. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_budget_exceeded.yaml +0 -0
  380. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
  381. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_llm_judge.yaml +0 -0
  382. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_negative_path.yaml +0 -0
  383. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_task_timeout.yaml +0 -0
  384. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_variants.yaml +0 -0
  385. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/test_sandbox.yaml +0 -0
  386. {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/token_check.yaml +0 -0
  387. {coder_eval-0.11.2 → coder_eval-0.11.3}/templates/byod_smoke_test/Dockerfile +0 -0
  388. {coder_eval-0.11.2 → coder_eval-0.11.3}/templates/fibonacci-starter/README.md +0 -0
  389. {coder_eval-0.11.2 → coder_eval-0.11.3}/templates/fibonacci-starter/src/main.py +0 -0
  390. {coder_eval-0.11.2 → coder_eval-0.11.3}/templates/fibonacci-starter/tests/test_main.py +0 -0
  391. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/__init__.py +0 -0
  392. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/__init__.py +0 -0
  393. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/__init__.py +0 -0
  394. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/_scrub.py +0 -0
  395. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
  396. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
  397. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
  398. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
  399. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
  400. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
  401. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
  402. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
  403. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
  404. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
  405. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
  406. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
  407. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
  408. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
  409. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
  410. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
  411. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
  412. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
  413. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
  414. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
  415. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/live_criteria.py +0 -0
  416. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/__init__.py +0 -0
  417. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
  418. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
  419. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
  420. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
  421. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/run_full.md +0 -0
  422. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
  423. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_path_helpers.py +0 -0
  424. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/conftest.py +0 -0
  425. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/__init__.py +0 -0
  426. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
  427. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
  428. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/mock_agent.py +0 -0
  429. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
  430. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
  431. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
  432. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/text_stub_agent.py +0 -0
  433. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/__init__.py +0 -0
  434. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/action_docs.py +0 -0
  435. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/dead_config_fields.py +0 -0
  436. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/doc_env_parity.py +0 -0
  437. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/doc_examples.py +0 -0
  438. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/doc_indexes.py +0 -0
  439. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/doc_schema_parity.py +0 -0
  440. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/generated.py +0 -0
  441. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/live_verdict_contract.py +0 -0
  442. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/plugin_reference.py +0 -0
  443. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/pyright_config.py +0 -0
  444. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/__init__.py +0 -0
  445. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/base.py +0 -0
  446. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
  447. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
  448. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
  449. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
  450. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
  451. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
  452. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
  453. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
  454. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
  455. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
  456. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
  457. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce032_criteria_path_seam.py +0 -0
  458. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce037_no_dead_private_helper.py +0 -0
  459. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce038_acquire_inside_try.py +0 -0
  460. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce039_config_error_escalates.py +0 -0
  461. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce043_no_command_output_truncation.py +0 -0
  462. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_agent_timing_access.py +0 -0
  463. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
  464. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
  465. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_silent_except.py +0 -0
  466. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_submodule_model_imports.py +0 -0
  467. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
  468. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
  469. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
  470. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/open_explicit_encoding.py +0 -0
  471. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
  472. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/register_criterion_required.py +0 -0
  473. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
  474. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
  475. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/runner.py +0 -0
  476. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/violation.py +0 -0
  477. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/workflow_outputs.py +0 -0
  478. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_action_version_pin.py +0 -0
  479. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent.py +0 -0
  480. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_config_no_timing_fields.py +0 -0
  481. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_config_optional_type.py +0 -0
  482. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_config_registry_dispatch.py +0 -0
  483. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_config_sdk_decoupling.py +0 -0
  484. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_golden_master.py +0 -0
  485. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_judge_criterion.py +0 -0
  486. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_telemetry.py +0 -0
  487. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_telemetry_advanced.py +0 -0
  488. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_timeout.py +0 -0
  489. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agentless.py +0 -0
  490. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_aggregate.py +0 -0
  491. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_antigravity_agent.py +0 -0
  492. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_byoa_plugin.py +0 -0
  493. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_byoa_plugin_live.py +0 -0
  494. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_byod_feature.py +0 -0
  495. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_check_all_async.py +0 -0
  496. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_checker_logging.py +0 -0
  497. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_classification_match.py +0 -0
  498. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_claude_settings_enforcement_live.py +0 -0
  499. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cleanup_preservation_guard.py +0 -0
  500. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_backend_flag.py +0 -0
  501. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_called_criterion.py +0 -0
  502. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_empty_glob.py +0 -0
  503. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_sdk_options.py +0 -0
  504. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_set_overrides.py +0 -0
  505. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_telemetry.py +0 -0
  506. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_type_flag.py +0 -0
  507. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_code_review_bugs.py +0 -0
  508. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_codex_agent.py +0 -0
  509. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_codex_agent_live.py +0 -0
  510. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_codex_agent_unit.py +0 -0
  511. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_codex_token_mapping.py +0 -0
  512. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_command_executed.py +0 -0
  513. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_command_statistics.py +0 -0
  514. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_command_telemetry_result_data.py +0 -0
  515. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_commands_efficiency.py +0 -0
  516. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_config_lineage.py +0 -0
  517. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_config_merge_engine.py +0 -0
  518. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_continuous_scoring.py +0 -0
  519. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cost_accounting_paths.py +0 -0
  520. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_criterion_result_round_trip.py +0 -0
  521. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_custom_lint.py +0 -0
  522. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_dataset_expansion.py +0 -0
  523. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_debug_logging.py +0 -0
  524. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_build_failure.py +0 -0
  525. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_litellm_env.py +0 -0
  526. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_runner_container_death.py +0 -0
  527. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_runner_mounts.py +0 -0
  528. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_runner_stream_limit.py +0 -0
  529. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_wildcard_env.py +0 -0
  530. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_workdir_live.py +0 -0
  531. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_driver_resolver.py +0 -0
  532. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_early_stop.py +0 -0
  533. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_error_handling.py +0 -0
  534. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_evaluate_command.py +0 -0
  535. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_evaluator.py +0 -0
  536. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_event_collector.py +0 -0
  537. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_cli.py +0 -0
  538. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_loader.py +0 -0
  539. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_models.py +0 -0
  540. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_reports.py +0 -0
  541. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_resolver.py +0 -0
  542. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_runner.py +0 -0
  543. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_file_check.py +0 -0
  544. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_file_contains_scoring.py +0 -0
  545. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_formatting.py +0 -0
  546. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_git_clone_failure.py +0 -0
  547. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_glob_paths_in_file_criteria.py +0 -0
  548. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_heartbeat_watchdog.py +0 -0
  549. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_ignore_patterns_negation.py +0 -0
  550. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_image_from_dockerfiles.py +0 -0
  551. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_integration.py +0 -0
  552. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_json_check.py +0 -0
  553. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_anthropic.py +0 -0
  554. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_context_builder.py +0 -0
  555. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_models.py +0 -0
  556. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_persistence.py +0 -0
  557. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_lint_no_top_level_run_limits.py +0 -0
  558. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_lint_runner.py +0 -0
  559. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_litellm_config.py +0 -0
  560. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_litellm_cost_logger.py +0 -0
  561. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_log_tail_buffer.py +0 -0
  562. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_logging.py +0 -0
  563. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_logging_isolation.py +0 -0
  564. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_merge_characterization.py +0 -0
  565. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_merge_strategy_annotations.py +0 -0
  566. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_merge_unification.py +0 -0
  567. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_mutations.py +0 -0
  568. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_new_criteria.py +0 -0
  569. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_node_env_config.py +0 -0
  570. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_optional_dependencies.py +0 -0
  571. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_orchestrator_error_log_tail.py +0 -0
  572. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_orchestrator_telemetry.py +0 -0
  573. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_overrides_engine.py +0 -0
  574. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_parallel.py +0 -0
  575. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_path_utils.py +0 -0
  576. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_plan_command.py +0 -0
  577. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_plugin_processing.py +0 -0
  578. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_plugins.py +0 -0
  579. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_post_run.py +0 -0
  580. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_pr_review_workflow.py +0 -0
  581. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_pre_run.py +0 -0
  582. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_preservation_mode.py +0 -0
  583. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_pricing_registry.py +0 -0
  584. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_comparison_scoring.py +0 -0
  585. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_evaluator.py +0 -0
  586. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_missing_file.py +0 -0
  587. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_models.py +0 -0
  588. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_permissions.py +0 -0
  589. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_registry.py +0 -0
  590. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_release_notes.py +0 -0
  591. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_replicate_stats.py +0 -0
  592. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_report_command.py +0 -0
  593. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports.py +0 -0
  594. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_experiment.py +0 -0
  595. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_html.py +0 -0
  596. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_junit.py +0 -0
  597. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_stats.py +0 -0
  598. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_stats_nonfinite.py +0 -0
  599. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_resolve_task_files.py +0 -0
  600. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_resume.py +0 -0
  601. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_retry_logic_comprehensive.py +0 -0
  602. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_command_junit.py +0 -0
  603. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_command_stdout.py +0 -0
  604. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_limits_models.py +0 -0
  605. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_limits_orchestrator.py +0 -0
  606. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_limits_resolver.py +0 -0
  607. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_metrics.py +0 -0
  608. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_runtime_tool_versions.py +0 -0
  609. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox.py +0 -0
  610. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_layer_builder.py +0 -0
  611. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_optional.py +0 -0
  612. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_record_cli.py +0 -0
  613. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_security.py +0 -0
  614. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_symlink_preservation.py +0 -0
  615. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_templates.py +0 -0
  616. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_scorers.py +0 -0
  617. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_scoring_quality.py +0 -0
  618. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sdk_option_classification.py +0 -0
  619. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_simulation_config.py +0 -0
  620. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_simulation_integration.py +0 -0
  621. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_simulation_termination.py +0 -0
  622. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_simulation_trials.py +0 -0
  623. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_skill_triggered.py +0 -0
  624. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_agent_integration.py +0 -0
  625. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_batch.py +0 -0
  626. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_callbacks.py +0 -0
  627. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_cli.py +0 -0
  628. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_events.py +0 -0
  629. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_orchestrator.py +0 -0
  630. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_renderers.py +0 -0
  631. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_wire.py +0 -0
  632. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sub_agent_runner.py +0 -0
  633. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_success_criterion_union.py +0 -0
  634. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_suite_rollup.py +0 -0
  635. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_summaries.py +0 -0
  636. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_tags.py +0 -0
  637. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_task_definition_unknown_fields.py +0 -0
  638. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_teardown_interrupt.py +0 -0
  639. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_telemetry.py +0 -0
  640. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_template_env_expansion.py +0 -0
  641. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_threshold_enforcement.py +0 -0
  642. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_batch.py +0 -0
  643. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_categorization.py +0 -0
  644. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_exceptions.py +0 -0
  645. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_models.py +0 -0
  646. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_orchestrator.py +0 -0
  647. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_token_usage.py +0 -0
  648. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_uipath_eval.py +0 -0
  649. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_user_simulator.py +0 -0
  650. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_utils.py +0 -0
  651. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_utterance_extraction.py +0 -0
  652. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_variant_prompt_file.py +0 -0
  653. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_verdict_tool.py +0 -0
  654. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_verify_published_workflow.py +0 -0
  655. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_visible_turn_cap.py +0 -0
  656. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_watchdog.py +0 -0
  657. {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_yaml_migration.py +0 -0
@@ -80,7 +80,7 @@ jobs:
80
80
  pip install uv
81
81
 
82
82
  - name: Install project dependencies (hash-verified from uv.lock)
83
- run: uv sync --frozen --extra dev --extra uipath --extra codex
83
+ run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm
84
84
 
85
85
  # PHASE 1: Fast checks (fail early)
86
86
  - name: Check code formatting (ruff format)
@@ -385,7 +385,7 @@ jobs:
385
385
  pip install uv
386
386
 
387
387
  - name: Install project dependencies (hash-verified from uv.lock)
388
- run: uv sync --frozen --extra dev --extra uipath --extra codex
388
+ run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm
389
389
 
390
390
  - name: Check code formatting (ruff format)
391
391
  run: .venv/Scripts/ruff format --check src/ tests/
@@ -843,8 +843,8 @@ jobs:
843
843
  python -m pip install --upgrade "pip>=26.2" # PYSEC-2026-3721 fix floor
844
844
  pip install uv
845
845
 
846
- - name: Install project dependencies (with codex extra)
847
- run: uv sync --frozen --extra dev --extra uipath --extra codex
846
+ - name: Install project dependencies (with codex + litellm extras)
847
+ run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm
848
848
 
849
849
  - name: Verify required secrets are present
850
850
  run: |
@@ -854,14 +854,17 @@ jobs:
854
854
  fi
855
855
  echo "CODEX_API_KEY present."
856
856
 
857
- - name: Run Codex live tests
857
+ - name: Run Codex + litellm-judge live tests
858
858
  run: |
859
859
  mkdir -p tmp
860
860
  # Run serially: `-n0` overrides the global `-n auto` (addopts).
861
861
  # Parallel xdist workers share ~/.codex and race the Codex SQLite
862
862
  # state migration (`duplicate column name: thread_id`); serial init
863
- # migrates the fresh DB exactly once.
864
- .venv/bin/pytest tests/test_codex_agent_live.py \
863
+ # migrates the fresh DB exactly once. test_litellm_judge_live.py
864
+ # reuses these same CODEX_* secrets to exercise
865
+ # checker_context.api_route.route: litellm end-to-end (PR #137
866
+ # review: "nothing in the repo exercises the feature").
867
+ .venv/bin/pytest tests/test_codex_agent_live.py tests/test_litellm_judge_live.py \
865
868
  -m live -n0 -v --tb=short --strict-markers -ra \
866
869
  --junit-xml=tmp/junit-codex-live.xml
867
870
 
@@ -878,7 +881,7 @@ jobs:
878
881
  passed = total - skipped - errors - failures
879
882
  print(f"codex-live passed={passed} skipped={skipped} errors={errors} failures={failures}")
880
883
  if passed < 1:
881
- sys.exit("test_codex_agent_live.py reported zero PASSED tests (missing API key / silent skip?)")
884
+ sys.exit("Live Codex/litellm-judge tests reported zero PASSED tests (missing API key / silent skip?)")
882
885
  PY
883
886
 
884
887
  - name: Upload Codex live-test artifacts on failure
@@ -140,7 +140,14 @@ jobs:
140
140
  fi
141
141
 
142
142
  - name: Install build + release tools
143
- run: uv tool install python-semantic-release && uv tool install twine
143
+ # Pinned: python-semantic-release declares gitpython~=3.0, so an
144
+ # unpinned install can resolve GitPython 3.1.60+, which removed
145
+ # git.Actor.name_email_regex and breaks semantic-release's `version`
146
+ # command outright ("type object 'Actor' has no attribute
147
+ # 'name_email_regex'"). Pin both explicitly until upstream adapts.
148
+ run: |
149
+ uv tool install python-semantic-release==10.6.1 --with gitpython==3.1.59
150
+ uv tool install twine
144
151
 
145
152
  - name: Run semantic-release (bump + tag, no push yet)
146
153
  id: release
@@ -157,7 +164,7 @@ jobs:
157
164
  # version to pyproject.toml + __init__.py, tags it, and regenerates the
158
165
  # changelog, but does not push yet (--no-push) so we can regenerate
159
166
  # uv.lock and amend before sending.
160
- PSR="uv tool run --from python-semantic-release semantic-release"
167
+ PSR="uv tool run --from python-semantic-release==10.6.1 --with gitpython==3.1.59 semantic-release"
161
168
  $PSR version "--$BUMP" --no-vcs-release --no-push --changelog
162
169
  # A dispatch always cuts a release; report the just-published version.
163
170
  echo "version=$($PSR version --print)" >> "$GITHUB_OUTPUT"
@@ -72,3 +72,6 @@ refs/
72
72
 
73
73
  # Derived pyright config for the CE036 contract engine (tests/lint/pyright_config.py)
74
74
  .pyright-tests.json
75
+
76
+ # Local evalboard dataset for `next dev` (EVALBOARD_LOCAL_RUNS_DIR)
77
+ evalboard/.local-runs/
@@ -2,6 +2,87 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.11.3 (2026-08-27)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **checker-context**: Typed model, reject litellm+agent_judge/sim, live test
10
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
11
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
12
+
13
+ - **eval-routing**: Restore DEFAULT_JUDGE_MODEL floor + add litellm judge transport
14
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
15
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
16
+
17
+ - **evalboard**: Exclude carried-forward passes from the wall-clock aggregates
18
+ ([#125](https://github.com/UiPath/coder_eval/pull/125),
19
+ [`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
20
+
21
+ - **release**: Pin python-semantic-release + GitPython to unbreak version bump
22
+ ([#139](https://github.com/UiPath/coder_eval/pull/139),
23
+ [`ef74014`](https://github.com/UiPath/coder_eval/commit/ef74014d3dd4b389f794e0cba743fc67ed430df8))
24
+
25
+ - **routing**: Make _resolve_backend_route's match exhaustive
26
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
27
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
28
+
29
+ ### Continuous Integration
30
+
31
+ - Retrigger checks (GH Actions appeared stalled repo-wide)
32
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
33
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
34
+
35
+ - Retrigger checks (previous push did not trigger CI)
36
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
37
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
38
+
39
+ - **fix**: Install litellm extra for pyright, address CodeQL findings
40
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
41
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
42
+
43
+ ### Documentation
44
+
45
+ - **timing**: Trim justification prose from the wall-clock comments
46
+ ([#125](https://github.com/UiPath/coder_eval/pull/125),
47
+ [`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
48
+
49
+ ### Features
50
+
51
+ - **eval-routing**: Decouple judge/agent_judge backend+model from the agent's own route
52
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
53
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
54
+
55
+ - **eval-routing**: Decouple judge/agent_judge backend+model from the agent's route
56
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
57
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
58
+
59
+ - **evalboard**: Chart seconds per passed task on the overview
60
+ ([#125](https://github.com/UiPath/coder_eval/pull/125),
61
+ [`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
62
+
63
+ - **evalboard**: Read the time ratio without hovering
64
+ ([#125](https://github.com/UiPath/coder_eval/pull/125),
65
+ [`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
66
+
67
+ - **evalboard**: Replace the turn-budget signal with time per passed task
68
+ ([#125](https://github.com/UiPath/coder_eval/pull/125),
69
+ [`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
70
+
71
+ - **evalboard**: Run the wall-clock signal beside the turn budget, behind tabs
72
+ ([#125](https://github.com/UiPath/coder_eval/pull/125),
73
+ [`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
74
+
75
+ - **litellm-judge**: Support arbitrary litellm kwargs via params/auth
76
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
77
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
78
+
79
+ ### Refactoring
80
+
81
+ - **litellm-judge**: Drop settings coupling, rename auth to env_params
82
+ ([#137](https://github.com/UiPath/coder_eval/pull/137),
83
+ [`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
84
+
85
+
5
86
  ## v0.11.2 (2026-08-24)
6
87
 
7
88
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: coder-eval
3
- Version: 0.11.2
3
+ Version: 0.11.3
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
@@ -58,6 +58,8 @@ Requires-Dist: pytest-mock>=3.15.1; extra == 'dev'
58
58
  Requires-Dist: pytest-xdist[psutil]>=3.0.0; extra == 'dev'
59
59
  Requires-Dist: pytest>=9.0.2; extra == 'dev'
60
60
  Requires-Dist: ruff>=0.15.7; extra == 'dev'
61
+ Provides-Extra: litellm
62
+ Requires-Dist: litellm<2.0.0,>=1.95.0; extra == 'litellm'
61
63
  Provides-Extra: uipath
62
64
  Requires-Dist: uipath>=2.10.31; extra == 'uipath'
63
65
  Description-Content-Type: text/markdown
@@ -41,7 +41,7 @@ inputs:
41
41
  version:
42
42
  description: coder-eval version to install from PyPI, or "local" to install from the action checkout
43
43
  required: false
44
- default: "0.11.2" # <-- kept in sync with releases by release.yml
44
+ default: "0.11.3" # <-- kept in sync with releases by release.yml
45
45
  run-dir:
46
46
  description: Run directory (--run-dir)
47
47
  required: false
@@ -130,6 +130,7 @@ From `ExperimentVariant` (`coder_eval/models/experiment.py`):
130
130
  | `initial_prompt_file` | str | Prompt replacement loaded from a file |
131
131
  | `run_limits` | block | Per-key cap overrides (`max_turns`, `task_timeout`, token/USD budgets) |
132
132
  | `driver` | `tempdir`/`docker` | Sandbox driver — enables tempdir-vs-docker arms |
133
+ | `checker_context` | dict | Backend/model override for the evaluation side (judge, simulator) — see [Checker Context](TASK_DEFINITION_GUIDE.md#checker-context); **not** currently `-D`-reachable |
133
134
 
134
135
  The `agent` dict is the lever for most A/B tests. Anything on `AgentConfig` is
135
136
  fair game: `model`, `permission_mode`, `allowed_tools`, `disallowed_tools`,
@@ -60,9 +60,11 @@ The mechanics:
60
60
  - The simulator is a **tools-disabled Claude Code agent** with `allowed_tools: []`, an explicit
61
61
  deny-list, and no plugins or settings sources. It is pure text-in / text-out, and it **cannot see
62
62
  the sandbox** — no files, no terminal, no agent reasoning. Only what the agent writes in the chat.
63
- - The simulator shares the coding agent's resolved `ApiRoute`, so backend and model come from the
64
- run's routing (`--backend direct` / `--backend bedrock`) rather than from the `simulation:` block.
65
- There is no model field here to set.
63
+ - The simulator runs on the run's resolved *evaluation* `ApiRoute` the coding agent's own route
64
+ (`--backend direct` / `--backend bedrock`) unless `checker_context.api_route.route` overrides it
65
+ (see [Checker Context](TASK_DEFINITION_GUIDE.md#checker-context)). The **model** is separately
66
+ pinned by `simulation.model` (see [Simulation](TASK_DEFINITION_GUIDE.md#simulation)), not inherited
67
+ from the route — so an A/B varying the subject model doesn't silently vary the simulated user too.
66
68
 
67
69
  **Agent-kind constraint.** The *subject* agent can be any registered kind — the dialog driver only
68
70
  calls the agent's `communicate()`, so Codex and plugin agents work. The *simulator*, however, is
@@ -35,6 +35,7 @@ Complete reference for defining evaluation tasks in Coder Eval.
35
35
  - [llm_judge](#llm_judge)
36
36
  - [agent_judge](#agent_judge)
37
37
  - [skill_triggered](#skill_triggered)
38
+ - [Checker Context](#checker-context)
38
39
  - [Reference Solutions](#reference-solutions)
39
40
  - [Pre-Run Commands](#pre-run-commands)
40
41
  - [Post-Run Commands](#post-run-commands)
@@ -63,6 +64,7 @@ reference: { ... } # Optional reference solution (a directory
63
64
  pre_run: [ ... ] # Optional pre-run commands (before agent starts)
64
65
  post_run: [ ... ] # Optional post-run commands
65
66
  dataset: { ... } # Optional dataset fan-out (one task -> N row-tasks)
67
+ checker_context: { ... } # Optional: backend/model for the evaluation side (judge, simulator)
66
68
  ```
67
69
 
68
70
  ### `dataset`
@@ -1295,6 +1297,40 @@ Observed label is `"yes"` when either signal is found, else `"no"`. Expected lab
1295
1297
 
1296
1298
  **Typical pattern.** Label each dataset row with its true skill (`expected_skill`, `""` for negatives) and stack one `skill_triggered` criterion per skill against the same dataset — each gets its own confusion matrix from the same agent traces. This is the natural companion to a skill A/B experiment (skill plugin on vs. off); see the [A/B Experiment Guide](AB_EXPERIMENTS.md#recipe-ab-a-skill).
1297
1299
 
1300
+ ## Checker Context
1301
+
1302
+ `checker_context` carries task-authored config for the success-checking side, namespaced by reserved key. Currently the only recognized namespace is **`api_route`**:
1303
+
1304
+ ```yaml
1305
+ success_criteria:
1306
+ - type: llm_judge
1307
+ prompt: "Grade the fix for correctness."
1308
+
1309
+ checker_context:
1310
+ api_route:
1311
+ route: bedrock # which backend the whole eval side (llm_judge/agent_judge/simulator) uses
1312
+ model: claude-haiku-4-5 # model override for that route
1313
+ ```
1314
+
1315
+ - `route` selects which backend the WHOLE evaluation side calls (`llm_judge`, `agent_judge`, and the simulator all share one resolved eval route per run — this isn't per-criterion), **decoupled from the agent's own route** (a Claude agent can be graded by a differently-backed judge, or vice versa). This is a backend *name* (`direct` / `bedrock` / `litellm`), not a route object. For `direct`/`bedrock` credentials are never read from the task, always from the matching environment variables (`ANTHROPIC_API_KEY` for `direct`, `AWS_BEARER_TOKEN_BEDROCK`/`AWS_REGION` for `bedrock`). An unconfigured or unknown backend name raises at dispatch rather than silently falling back. **`route: litellm` dispatches `llm_judge` through the `litellm` library** (the `coder-eval[litellm]` extra, `litellm.acompletion`) rather than assuming one wire protocol — a gateway-routed judge model (e.g. an Azure AI `/openai/v1` deployment) rarely speaks Anthropic Messages, so this lets `model` carry its own provider hint (e.g. `azure/gpt-5.6-luna`) and get that provider's actual request/response shape handled by the library. Unlike the other two backends, `route: litellm` has NO implicit env-var fallback — see `params`/`env_params` below, which is how it's configured. `model` is required for `route: litellm` (there is no default open-weight/gateway model).
1316
+ - `model` overrides the model that resolved route uses for **`llm_judge` only** — when the criterion itself leaves `model:` unset (precedence: an explicit per-criterion `model:` always wins; below that, `checker_context.api_route.model`; below that, the built-in `DEFAULT_JUDGE_MODEL`). This floor is deliberate and never the agent's own model — an unpinned judge must grade identically regardless of which model the agent under test is using, so `resolve_evaluation_route` never lets the agent's env-configured model (e.g. `BEDROCK_MODEL`) leak into `route.model` on its own; `route.model` is set only when this override was actually given. This works because every `ApiRoute` (`DirectRoute`/`BedrockRoute`/`LiteLLMRoute`) carries its own `model` field; the orchestrator bakes the override into the resolved route's `model` before any criterion runs, so `llm_judge` just reads `context.route.model` — it never reads `checker_context` directly. **`agent_judge` and the simulator do not honor this override** — `agent_judge`'s sub-agent model comes from the criterion's own `agent:` block (defaulted to a fixed judge model), and the simulator's model is pinned by `SimulationConfig.model` (see [Simulation](#simulation) below) — both independent of `checker_context.api_route.model` by design, for the same "measuring instrument stays fixed" reason.
1317
+ - `params`/`env_params` (**`route: litellm` only**) are how the call is actually configured — there is no fallback to the agent's own `LITELLM_BASE_URL`/`LITELLM_AUTH_TOKEN` env vars, since a gateway-routed judge model rarely reuses the agent's own LiteLLM proxy/credential. They also cover any of the dozens of other provider-specific kwargs `litellm.acompletion` accepts (`aws_access_key_id`, `vertex_project`, `api_version`, ...), which have no dedicated field on `LiteLLMRoute`:
1318
+ ```yaml
1319
+ checker_context:
1320
+ api_route:
1321
+ route: litellm
1322
+ model: azure/gpt-5.6-luna
1323
+ params: # arbitrary literal passthrough kwargs to litellm.acompletion
1324
+ api_version: "2024-05-01"
1325
+ env_params: # param name -> ENV VAR NAME (never the secret itself)
1326
+ api_base: LITELLM_BASE_URL
1327
+ api_key: LITELLM_AUTH_TOKEN
1328
+ ```
1329
+ `params` is merged straight into the `litellm.acompletion(**kwargs)` call — litellm validates the param names itself, so there's no allowlist to keep in sync here. `env_params` maps a kwarg name to the *name* of an environment variable; the value is resolved right before the call, so no secret is ever written into task/experiment YAML — this is how an arbitrary provider's config, including secrets (IAM keys, an Azure AD token, a service-account path, ...), is representable without a dedicated field per provider. `env_params` is resolved after `params`, so it always wins for the same key. Rejected at task-load time if given without `route: litellm`. For an Azure deployment, pin `api_version` via `params` to whatever API version the agent side is actually configured for (e.g. Codex's `CODEX_API_VERSION`) — the judge has no way to inherit it, and a mismatched version can hit a different shape of the same endpoint.
1330
+ **`route: litellm` is `llm_judge`-only** — `agent_judge` and the simulator run as real Claude Code CLI subprocesses that speak the Anthropic Messages protocol, so pointing them at an arbitrary litellm-fronted gateway (which may speak an entirely different wire protocol) isn't representable. The orchestrator rejects the combination at resolution time (a clear error, not a silent misroute) if the task has an enabled `agent_judge` criterion or `simulation.enabled: true` alongside `route: litellm` — use `route: bedrock`/`direct` for those instead.
1331
+
1332
+ `checker_context` merges shallow-per-namespace across `default_experiment.defaults.checker_context` → `experiment.defaults.checker_context` → `task.checker_context` → `variant.checker_context` (same 4-layer precedence as `agent`/`simulation`). So a judge-model A/B, or a judge-backend A/B, is a variant-level config change, not an edit to every task YAML.
1333
+
1298
1334
  ## Reference Solutions
1299
1335
 
1300
1336
  A reference solution is always a **directory**, given relative to the task YAML's own directory:
@@ -1577,7 +1613,7 @@ simulation:
1577
1613
  | `check_criteria` | `end_of_dialog` | `end_of_dialog`, `every_turn`, or `both`. |
1578
1614
  | `model` | `anthropic.claude-sonnet-4-6` | Model that plays the simulated user. Auto-translated to the run's backend (Bedrock inference profile / bare Anthropic alias), the same way [`llm_judge`](#llm_judge)'s `model` is. |
1579
1615
 
1580
- The simulator runs as a tools-disabled Claude Code agent sharing the coding agent's `ApiRoute`, so temperature and sampling are resolved at the route level (same `-b` flag as the coding agent) and are not configured on this block. The **model is not**: it is pinned by `model` above. Inheriting it from the route meant `BEDROCK_MODEL` decided who the simulated user was, so an A/B varying the subject model silently varied its interlocutor too. Hold `model` fixed across variants for the same reason you hold a judge model fixed — the simulator is part of the measuring instrument, not the thing being measured.
1616
+ The simulator runs as a tools-disabled Claude Code agent on the run's resolved *evaluation* `ApiRoute` (the coding agent's own route unless [`checker_context.api_route.route`](#checker-context) overrides it), so temperature and sampling are resolved at the route level (same `-b` flag as the coding agent by default) and are not configured on this block. The **model is not**: it is pinned by `model` above. Inheriting it from the route meant `BEDROCK_MODEL` decided who the simulated user was, so an A/B varying the subject model silently varied its interlocutor too. Hold `model` fixed across variants for the same reason you hold a judge model fixed — the simulator is part of the measuring instrument, not the thing being measured.
1581
1617
 
1582
1618
  **Semantics:**
1583
1619
 
@@ -0,0 +1,10 @@
1
+ // Column definitions, surfaced as native `title` tooltips on table headers.
2
+ // Shared by the run-page task grid and the task-page message timeline so the two
3
+ // describe the same number the same way. Wording is page-neutral (no "this task"
4
+ // / "this call") because both surfaces read the same string.
5
+ export const TOKEN_COLUMN_HELP = {
6
+ input: "Input tokens (uncached): fresh prompt input billed at the full input rate — the slice that was neither written to nor read from the prompt cache.",
7
+ output: "Output tokens: text, code, tool arguments and reasoning the model generated.",
8
+ cw: "Cache-write tokens: context newly written into the prompt cache (cache_creation_input_tokens).",
9
+ cr: "Cache-read tokens: cached input re-billed on every later call (cache_read_input_tokens). Usually the dominant cost line.",
10
+ } satisfies Record<string, string>;
@@ -0,0 +1,80 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { fireEvent, render, screen } from "@testing-library/react";
3
+ import type { RunPoint } from "@/lib/overview";
4
+ import { EfficiencyCharts } from "../efficiency-charts";
5
+
6
+ function point(overrides: Partial<RunPoint> = {}): RunPoint {
7
+ return {
8
+ runId: "2026-08-18_04-51-58",
9
+ timestamp: Date.UTC(2026, 7, 18),
10
+ harness: "codex",
11
+ successRate: 96,
12
+ turnBudgetRate: 87,
13
+ withinExpectedTimeRate: 78,
14
+ timePerPassedTask: 192,
15
+ ...overrides,
16
+ };
17
+ }
18
+
19
+ function renderCharts(scoped = false) {
20
+ return render(
21
+ <EfficiencyCharts
22
+ data={[point()]}
23
+ harnesses={["codex"]}
24
+ windowStart={Date.UTC(2026, 7, 1)}
25
+ windowEnd={Date.UTC(2026, 7, 31)}
26
+ scoped={scoped}
27
+ />,
28
+ );
29
+ }
30
+
31
+ describe("EfficiencyCharts", () => {
32
+ test("opens on the wall-clock metric", () => {
33
+ renderCharts();
34
+ expect(screen.getByRole("heading")).toHaveTextContent(
35
+ "Time per Passed Task",
36
+ );
37
+ expect(
38
+ screen.getByRole("tab", { name: "Time" }),
39
+ ).toHaveAttribute("aria-selected", "true");
40
+ });
41
+
42
+ test("the Turns tab still reaches the retired turn-budget chart", () => {
43
+ // The turn budget is kept visible while the derived expected-time line
44
+ // is being watched; retiring it is deleting this tab.
45
+ renderCharts();
46
+ fireEvent.click(screen.getByRole("tab", { name: "Turns" }));
47
+ expect(screen.getByRole("heading")).toHaveTextContent(
48
+ "Within Expected Turns (%)",
49
+ );
50
+ expect(screen.getByText(/1.5× their expected turns/)).toBeInTheDocument();
51
+ expect(
52
+ screen.getByRole("tab", { name: "Turns" }),
53
+ ).toHaveAttribute("aria-selected", "true");
54
+ expect(screen.getByRole("tab", { name: "Time" })).toHaveAttribute(
55
+ "aria-selected",
56
+ "false",
57
+ );
58
+ });
59
+
60
+ test("switching back restores the wall-clock blurb", () => {
61
+ renderCharts();
62
+ fireEvent.click(screen.getByRole("tab", { name: "Turns" }));
63
+ fireEvent.click(screen.getByRole("tab", { name: "Time" }));
64
+ expect(
65
+ screen.getByText(/the number that passed/),
66
+ ).toBeInTheDocument();
67
+ });
68
+
69
+ test("says so when the numbers are filter-scoped", () => {
70
+ renderCharts(true);
71
+ expect(
72
+ screen.getByText(/scoped to the active filter/),
73
+ ).toBeInTheDocument();
74
+ });
75
+
76
+ test("no filter note when the window is unscoped", () => {
77
+ renderCharts();
78
+ expect(screen.queryByText(/scoped to the active filter/)).toBeNull();
79
+ });
80
+ });
@@ -37,6 +37,44 @@ describe("HarnessLegend", () => {
37
37
  describe("HarnessTooltip", () => {
38
38
  const s = series("claude-code", "codex");
39
39
 
40
+ test("formats the value with the chart's own formatter", () => {
41
+ render(
42
+ <HarnessTooltip
43
+ active
44
+ label={1_700_000_000_000}
45
+ series={s}
46
+ suffix="per passed task"
47
+ emptyText="no passing tasks"
48
+ format={(v) => `${Math.round(v)}s`}
49
+ payload={[{ dataKey: s[1].dataKey, value: 192.3 }]}
50
+ />,
51
+ );
52
+ expect(screen.getByText("192s per passed task")).toBeInTheDocument();
53
+ });
54
+
55
+ test("adds the secondary line for the hovered point only", () => {
56
+ // The within-expected rate belongs to one run, so it rides the hover on
57
+ // that run's point instead of being summarized over the whole chart.
58
+ render(
59
+ <HarnessTooltip
60
+ active
61
+ label={1_700_000_000_000}
62
+ series={s}
63
+ suffix="per passed task"
64
+ emptyText="no passing tasks"
65
+ secondary={(harness) =>
66
+ harness === "codex" ? "78% within 2× expected" : null
67
+ }
68
+ payload={[
69
+ { dataKey: s[0].dataKey, value: 300 },
70
+ { dataKey: s[1].dataKey, value: 192 },
71
+ ]}
72
+ />,
73
+ );
74
+ expect(screen.getByText("78% within 2× expected")).toBeInTheDocument();
75
+ expect(screen.queryAllByText(/within/)).toHaveLength(1);
76
+ });
77
+
40
78
  test("shows only the harnesses that actually ran at the hovered x", () => {
41
79
  // Recharts hands over every series, including the ones with no value
42
80
  // here. Listing those would invent runs that never happened.
@@ -12,14 +12,16 @@ function point(
12
12
  harness: string,
13
13
  timestamp: number,
14
14
  successRate: number | null,
15
- turnBudgetRate: number | null = null,
15
+ withinExpectedTimeRate: number | null = null,
16
16
  ): RunPoint {
17
17
  return {
18
18
  runId: `run-${timestamp}`,
19
19
  timestamp,
20
20
  harness,
21
21
  successRate,
22
- turnBudgetRate,
22
+ turnBudgetRate: null,
23
+ withinExpectedTimeRate,
24
+ timePerPassedTask: null,
23
25
  };
24
26
  }
25
27
 
@@ -99,7 +101,7 @@ describe("pivotByHarness", () => {
99
101
  timestamp: 100,
100
102
  [key]: 90,
101
103
  });
102
- expect(pivotByHarness(pts, ["codex"], "turnBudgetRate").rows[0]).toEqual(
104
+ expect(pivotByHarness(pts, ["codex"], "withinExpectedTimeRate").rows[0]).toEqual(
103
105
  { timestamp: 100, [key]: 40 },
104
106
  );
105
107
  });
@@ -111,7 +113,7 @@ describe("pivotByHarness", () => {
111
113
  const { rows } = pivotByHarness(
112
114
  [point("codex", 100, 90, null)],
113
115
  ["codex"],
114
- "turnBudgetRate",
116
+ "withinExpectedTimeRate",
115
117
  );
116
118
  expect(rows).toEqual([]);
117
119
  });
@@ -0,0 +1,104 @@
1
+ "use client";
2
+
3
+ // The overview's efficiency section, tabbed.
4
+ //
5
+ // Two signals run side by side for now. "Time" is the derived wall-clock line
6
+ // (lib/timing.ts): expected seconds per task per harness, computed from that
7
+ // task's own passing history by the eval runner and stamped into run.json.
8
+ // "Turns" is the hand-written predecessor it is meant to replace, kept visible
9
+ // while the new number is being watched rather than trusted.
10
+ //
11
+ // The tab strip is the seam: retiring the turn budget is deleting the "turns"
12
+ // entry from TABS and the TurnBudgetChart import, with no other edit to this
13
+ // page. Tab state is local — deliberately not a search param, so switching
14
+ // charts never re-renders the server page or perturbs a shared link.
15
+
16
+ import { useState } from "react";
17
+ import type { RunPoint } from "@/lib/overview";
18
+ import { TimePerPassedTaskChart } from "./wall-clock-chart";
19
+ import { TurnBudgetChart } from "./turn-budget-chart";
20
+
21
+ type TabKey = "time" | "turns";
22
+
23
+ interface ChartProps {
24
+ data: RunPoint[];
25
+ harnesses: string[];
26
+ windowStart: number;
27
+ windowEnd: number;
28
+ }
29
+
30
+ const TABS: Array<{
31
+ key: TabKey;
32
+ label: string;
33
+ heading: string;
34
+ // Hover text on the heading: what the number actually is.
35
+ title: string;
36
+ // Shown under the heading. `scoped` appends the active-filter note.
37
+ blurb: (scoped: boolean) => string;
38
+ render: (props: ChartProps) => React.ReactNode;
39
+ }> = [
40
+ {
41
+ key: "time",
42
+ label: "Time",
43
+ heading: "Time per Passed Task",
44
+ title: "Total wall clock ÷ tasks passed. Every task's seconds count, failures included; only passes count in the denominator, so a run that fails more reads slower.",
45
+ blurb: (scoped) =>
46
+ "Seconds of every task that ran ÷ the number that passed · hover a point for the share within 2× expected" +
47
+ (scoped ? " · scoped to the active filter" : ""),
48
+ render: (props) => <TimePerPassedTaskChart {...props} />,
49
+ },
50
+ {
51
+ key: "turns",
52
+ label: "Turns",
53
+ heading: "Within Expected Turns (%)",
54
+ title: "Share of tasks carrying an expected_turns budget whose visible turns stayed within 1.5× it. A budgeted task that failed counts as over budget.",
55
+ blurb: (scoped) =>
56
+ "% of budgeted tasks that stayed within 1.5× their expected turns (a budgeted task that failed counts as over budget) · runs with no budgeted task are omitted rather than plotted at 0" +
57
+ (scoped ? " · scoped to the active filter" : ""),
58
+ render: (props) => <TurnBudgetChart {...props} />,
59
+ },
60
+ ];
61
+
62
+ export function EfficiencyCharts({
63
+ scoped = false,
64
+ ...props
65
+ }: ChartProps & { scoped?: boolean }) {
66
+ const [active, setActive] = useState<TabKey>(TABS[0].key);
67
+ const tab = TABS.find((t) => t.key === active) ?? TABS[0];
68
+ return (
69
+ <div className="pt-4 mt-2 border-t border-dashed border-gray-200 space-y-1">
70
+ <div className="flex items-start justify-between gap-3">
71
+ <h2
72
+ className="text-sm font-semibold text-gray-900"
73
+ title={tab.title}
74
+ >
75
+ {tab.heading}
76
+ </h2>
77
+ <span
78
+ className="inline-flex shrink-0 overflow-hidden rounded-md border border-gray-200 text-xs"
79
+ role="tablist"
80
+ aria-label="Efficiency metric"
81
+ >
82
+ {TABS.map((t) => (
83
+ <button
84
+ key={t.key}
85
+ type="button"
86
+ role="tab"
87
+ aria-selected={t.key === active}
88
+ onClick={() => setActive(t.key)}
89
+ className={`px-2 py-0.5 transition-colors ${
90
+ t.key === active
91
+ ? "bg-studio-blue text-white"
92
+ : "bg-white text-gray-600 hover:bg-gray-50"
93
+ }`}
94
+ >
95
+ {t.label}
96
+ </button>
97
+ ))}
98
+ </span>
99
+ </div>
100
+ <p className="text-xs text-gray-500">{tab.blurb(scoped)}</p>
101
+ {tab.render(props)}
102
+ </div>
103
+ );
104
+ }
@@ -57,6 +57,8 @@ export function HarnessTooltip({
57
57
  series,
58
58
  suffix,
59
59
  emptyText,
60
+ format = (v) => `${v.toFixed(1)}%`,
61
+ secondary,
60
62
  }: {
61
63
  active?: boolean;
62
64
  payload?: TooltipEntry[];
@@ -67,6 +69,12 @@ export function HarnessTooltip({
67
69
  suffix: string;
68
70
  // Shown when the hovered run produced no value for this metric at all.
69
71
  emptyText: string;
72
+ // How to render the value. Defaults to a percentage; a seconds chart passes
73
+ // its own duration formatter.
74
+ format?: (value: number) => string;
75
+ // Optional second line for a row, e.g. a companion rate the chart doesn't
76
+ // plot. Returning null omits it for that point.
77
+ secondary?: (harness: string, timestamp: number) => string | null;
70
78
  }) {
71
79
  if (!active || !payload?.length) return null;
72
80
  const byKey = new Map(series.map((s) => [s.dataKey, s]));
@@ -86,22 +94,27 @@ export function HarnessTooltip({
86
94
  ) : (
87
95
  rows.map((e) => {
88
96
  const s = byKey.get(String(e.dataKey))!;
97
+ const sub = secondary?.(s.harness, ms) ?? null;
89
98
  return (
90
- <div
91
- key={s.harness}
92
- className="flex items-center gap-1.5 text-gray-600 tabular-nums"
93
- >
94
- <span
95
- aria-hidden
96
- className="inline-block h-0.5 w-3 rounded-full shrink-0"
97
- style={{ backgroundColor: s.color }}
98
- />
99
- <span className="text-gray-700">
100
- {harnessShortLabel(s.harness)}
101
- </span>
102
- <span>
103
- {(e.value as number).toFixed(1)}% {suffix}
104
- </span>
99
+ <div key={s.harness} className="tabular-nums">
100
+ <div className="flex items-center gap-1.5 text-gray-600">
101
+ <span
102
+ aria-hidden
103
+ className="inline-block h-0.5 w-3 rounded-full shrink-0"
104
+ style={{ backgroundColor: s.color }}
105
+ />
106
+ <span className="text-gray-700">
107
+ {harnessShortLabel(s.harness)}
108
+ </span>
109
+ <span>
110
+ {format(e.value as number)} {suffix}
111
+ </span>
112
+ </div>
113
+ {sub && (
114
+ <div className="pl-[1.125rem] text-gray-500">
115
+ {sub}
116
+ </div>
117
+ )}
105
118
  </div>
106
119
  );
107
120
  })