coder-eval 0.11.4__tar.gz → 0.11.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. coder_eval-0.11.5/.claude-plugin/marketplace.json +35 -0
  2. {coder_eval-0.11.4 → coder_eval-0.11.5}/CHANGELOG.md +115 -0
  3. {coder_eval-0.11.4 → coder_eval-0.11.5}/CLAUDE.md +1 -1
  4. {coder_eval-0.11.4 → coder_eval-0.11.5}/PKG-INFO +9 -7
  5. {coder_eval-0.11.4 → coder_eval-0.11.5}/README.md +7 -6
  6. {coder_eval-0.11.4 → coder_eval-0.11.5}/action.yml +1 -1
  7. {coder_eval-0.11.4 → coder_eval-0.11.5}/docker/Dockerfile +15 -9
  8. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/AB_EXPERIMENTS.md +9 -3
  9. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/DIALOG_MODE.md +5 -3
  10. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/EXTENDING.md +2 -2
  11. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/PLUGIN.md +4 -2
  12. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/TASK_DEFINITION_GUIDE.md +5 -5
  13. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/USER_GUIDE.md +1 -1
  14. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/agents/CLAUDE_CODE.md +11 -1
  15. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/agents/HARNESS_PARITY.md +74 -10
  16. coder_eval-0.11.5/docs/agents/OPENCODE.md +373 -0
  17. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/index.md +6 -5
  18. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/llms.txt +3 -1
  19. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/tutorials/07-plugin-in-claude-code.md +6 -3
  20. {coder_eval-0.11.4 → coder_eval-0.11.5}/experiments/default.yaml +3 -1
  21. {coder_eval-0.11.4 → coder_eval-0.11.5}/experiments/plugin-comparison.yaml +3 -0
  22. {coder_eval-0.11.4 → coder_eval-0.11.5}/mkdocs.yml +2 -0
  23. coder_eval-0.11.5/plugins/coder-eval/.claude-plugin/plugin.json +23 -0
  24. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/reference/templates/activation.yaml +17 -4
  25. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/skills/analyze/SKILL.md +1 -1
  26. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/skills/check-skill/SKILL.md +37 -5
  27. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/skills/ci/SKILL.md +21 -2
  28. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/skills/init/SKILL.md +1 -1
  29. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/skills/lint-tasks/SKILL.md +1 -1
  30. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/skills/task/SKILL.md +1 -1
  31. {coder_eval-0.11.4 → coder_eval-0.11.5}/pyproject.toml +20 -1
  32. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/__init__.py +1 -1
  33. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/agents/__init__.py +11 -3
  34. coder_eval-0.11.5/src/coder_eval/agents/opencode_agent.py +1515 -0
  35. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/skill_triggered.py +5 -1
  36. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/__init__.py +2 -0
  37. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/agent_config.py +45 -1
  38. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/enums.py +1 -0
  39. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/tasks.py +7 -3
  40. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestrator.py +62 -37
  41. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/pricing.py +7 -2
  42. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/utils.py +18 -1
  43. coder_eval-0.11.5/tasks/opencode_smoke_test.yaml +37 -0
  44. coder_eval-0.11.5/tests/lint/plugin_manifest_parity.py +101 -0
  45. coder_eval-0.11.5/tests/lint/rules/ce046_env_info_spreads_super.py +83 -0
  46. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/runner.py +2 -0
  47. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_custom_lint.py +356 -0
  48. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_litellm_route.py +13 -7
  49. coder_eval-0.11.5/tests/test_opencode_agent.py +1897 -0
  50. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_orchestrator.py +127 -43
  51. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_plugin_processing.py +54 -0
  52. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_pricing_registry.py +13 -1
  53. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reference_permissions.py +31 -5
  54. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_route_seam_exhaustiveness.py +6 -2
  55. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_skill_triggered.py +13 -0
  56. {coder_eval-0.11.4 → coder_eval-0.11.5}/uv.lock +2 -2
  57. coder_eval-0.11.4/.claude-plugin/marketplace.json +0 -17
  58. coder_eval-0.11.4/plugins/coder-eval/.claude-plugin/plugin.json +0 -10
  59. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/commands/coder-eval-code-review-full.md +0 -0
  60. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/commands/coder-eval-code-review-wf.md +0 -0
  61. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/commands/coder-eval-code-review.md +0 -0
  62. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/commands/coder-eval-create-plan.md +0 -0
  63. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/commands/coder-eval-implement-plan.md +0 -0
  64. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/commands/coder-eval-review.md +0 -0
  65. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/harness-candidates.md +0 -0
  66. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/shared/axes.md +0 -0
  67. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/shared/multi-model-review.md +0 -0
  68. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/shared/review-rubric.md +0 -0
  69. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/shared/run-layout.md +0 -0
  70. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/workflows/cr-axis.js +0 -0
  71. {coder_eval-0.11.4 → coder_eval-0.11.5}/.claude/workflows/cr-parent.js +0 -0
  72. {coder_eval-0.11.4 → coder_eval-0.11.5}/.env.example +0 -0
  73. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/CODEOWNERS +0 -0
  74. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
  75. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  76. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  77. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/actionlint.yaml +0 -0
  78. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/code_review.md +0 -0
  79. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/dependabot.yml +0 -0
  80. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/pages-stub/index.html +0 -0
  81. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/scripts/release_notes.py +0 -0
  82. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/workflows/claude-pr-review.yml +0 -0
  83. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/workflows/codeql.yml +0 -0
  84. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/workflows/conventional-commits.yml +0 -0
  85. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/workflows/docker-publish.yml +0 -0
  86. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/workflows/docs.yml +0 -0
  87. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/workflows/pr-checks.yml +0 -0
  88. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/workflows/publish-testpypi.yml +0 -0
  89. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/workflows/release.yml +0 -0
  90. {coder_eval-0.11.4 → coder_eval-0.11.5}/.github/workflows/verify-published-action.yml +0 -0
  91. {coder_eval-0.11.4 → coder_eval-0.11.5}/.gitignore +0 -0
  92. {coder_eval-0.11.4 → coder_eval-0.11.5}/.pre-commit-config.yaml +0 -0
  93. {coder_eval-0.11.4 → coder_eval-0.11.5}/.python-version +0 -0
  94. {coder_eval-0.11.4 → coder_eval-0.11.5}/ADOPTERS.md +0 -0
  95. {coder_eval-0.11.4 → coder_eval-0.11.5}/CODE_OF_CONDUCT.md +0 -0
  96. {coder_eval-0.11.4 → coder_eval-0.11.5}/CONTRIBUTING.md +0 -0
  97. {coder_eval-0.11.4 → coder_eval-0.11.5}/LICENSE +0 -0
  98. {coder_eval-0.11.4 → coder_eval-0.11.5}/Makefile +0 -0
  99. {coder_eval-0.11.4 → coder_eval-0.11.5}/NOTICE +0 -0
  100. {coder_eval-0.11.4 → coder_eval-0.11.5}/SECURITY.md +0 -0
  101. {coder_eval-0.11.4 → coder_eval-0.11.5}/comparison.md +0 -0
  102. {coder_eval-0.11.4 → coder_eval-0.11.5}/docker/Dockerfile.runtime +0 -0
  103. {coder_eval-0.11.4 → coder_eval-0.11.5}/docker/coder_eval_entrypoint.sh +0 -0
  104. {coder_eval-0.11.4 → coder_eval-0.11.5}/docker/coder_eval_runtime_entrypoint.sh +0 -0
  105. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/CI_GATE.md +0 -0
  106. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/DATASETS.md +0 -0
  107. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/DOCKER_ISOLATION.md +0 -0
  108. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/REPORT_SCHEMA.md +0 -0
  109. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/agents/ANTIGRAVITY.md +0 -0
  110. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/agents/CODEX.md +0 -0
  111. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/assets/hero.gif +0 -0
  112. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/comparison.md +0 -0
  113. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/tutorials/01-first-evaluation.md +0 -0
  114. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/tutorials/02-ci-pipeline.md +0 -0
  115. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/tutorials/03-evalboard-local.md +0 -0
  116. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/tutorials/04-writing-a-task.md +0 -0
  117. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/tutorials/05-comparing-models.md +0 -0
  118. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/tutorials/06-use-docker-isolation.md +0 -0
  119. {coder_eval-0.11.4 → coder_eval-0.11.5}/docs/tutorials/README.md +0 -0
  120. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/.gitignore +0 -0
  121. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/README.md +0 -0
  122. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/__tests__/harness-badge.test.tsx +0 -0
  123. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/__tests__/harness-selector.test.tsx +0 -0
  124. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
  125. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/col-help.tsx +0 -0
  126. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/collapsible-rail.tsx +0 -0
  127. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/harness-badge.tsx +0 -0
  128. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/harness-selector.tsx +0 -0
  129. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/scroll-table.tsx +0 -0
  130. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/search-box.tsx +0 -0
  131. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/unit-toggle.tsx +0 -0
  132. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_components/version-list.tsx +0 -0
  133. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_lib/__tests__/source-param.test.ts +0 -0
  134. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_lib/source-param.ts +0 -0
  135. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/__tests__/efficiency-charts.test.tsx +0 -0
  136. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/__tests__/harness-legend.test.tsx +0 -0
  137. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/__tests__/harness-series.test.ts +0 -0
  138. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/daily-chart.tsx +0 -0
  139. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/efficiency-charts.tsx +0 -0
  140. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/harness-legend.tsx +0 -0
  141. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/harness-series.ts +0 -0
  142. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/tag-rail.tsx +0 -0
  143. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
  144. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/wall-clock-chart.tsx +0 -0
  145. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/_overview/window-summary.tsx +0 -0
  146. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/api/download/route.ts +0 -0
  147. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/api/file/route.ts +0 -0
  148. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
  149. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/api/refresh/route.ts +0 -0
  150. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/error.tsx +0 -0
  151. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/globals.css +0 -0
  152. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/icon.png +0 -0
  153. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/layout.tsx +0 -0
  154. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/page.tsx +0 -0
  155. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/path-to-ga/__tests__/task-table.test.tsx +0 -0
  156. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/path-to-ga/page.tsx +0 -0
  157. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/path-to-ga/task-table.tsx +0 -0
  158. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/scribe/page.tsx +0 -0
  159. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/scribe/run-table.tsx +0 -0
  160. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
  161. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/trends/actions.ts +0 -0
  162. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/trends/page.tsx +0 -0
  163. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/trends/trends-view.tsx +0 -0
  164. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
  165. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/watchlist/page.tsx +0 -0
  166. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
  167. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/next-env.d.ts +0 -0
  168. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/next.config.mjs +0 -0
  169. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/package.json +0 -0
  170. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/pnpm-lock.yaml +0 -0
  171. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/postcss.config.mjs +0 -0
  172. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/public/harness/antigravity.png +0 -0
  173. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/public/harness/claude-code.png +0 -0
  174. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/public/harness/codex.png +0 -0
  175. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/public/uipath.png +0 -0
  176. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/tailwind.config.ts +0 -0
  177. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/tsconfig.json +0 -0
  178. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/vitest.config.ts +0 -0
  179. {coder_eval-0.11.4 → coder_eval-0.11.5}/evalboard/vitest.setup.ts +0 -0
  180. {coder_eval-0.11.4 → coder_eval-0.11.5}/experiments/early-stop-ab.yaml +0 -0
  181. {coder_eval-0.11.4 → coder_eval-0.11.5}/experiments/model-comparison.yaml +0 -0
  182. {coder_eval-0.11.4 → coder_eval-0.11.5}/experiments/permissions-smoke.yaml +0 -0
  183. {coder_eval-0.11.4 → coder_eval-0.11.5}/experiments/prompt-mutations-example.yaml +0 -0
  184. {coder_eval-0.11.4 → coder_eval-0.11.5}/experiments/smoke_variants.yaml +0 -0
  185. {coder_eval-0.11.4 → coder_eval-0.11.5}/litellm/README.md +0 -0
  186. {coder_eval-0.11.4 → coder_eval-0.11.5}/litellm/cost_logger.py +0 -0
  187. {coder_eval-0.11.4 → coder_eval-0.11.5}/litellm/litellm-config.yaml +0 -0
  188. {coder_eval-0.11.4 → coder_eval-0.11.5}/litellm/start-litellm.sh +0 -0
  189. {coder_eval-0.11.4 → coder_eval-0.11.5}/osv-scanner.toml +0 -0
  190. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/README.md +0 -0
  191. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/reference/cli-setup.md +0 -0
  192. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/reference/criteria.md +0 -0
  193. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/reference/repo-layout.md +0 -0
  194. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/reference/run-layout.md +0 -0
  195. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/reference/task-rubric.md +0 -0
  196. {coder_eval-0.11.4 → coder_eval-0.11.5}/plugins/coder-eval/reference/templates/activation-rows.jsonl +0 -0
  197. {coder_eval-0.11.4 → coder_eval-0.11.5}/scripts/check_commit_msg.sh +0 -0
  198. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/.gitattributes +0 -0
  199. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/agent.py +0 -0
  200. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/agents/_logging.py +0 -0
  201. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/agents/antigravity_agent.py +0 -0
  202. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/agents/claude_code_agent.py +0 -0
  203. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/agents/codex_agent.py +0 -0
  204. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/agents/noop_agent.py +0 -0
  205. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/agents/registry.py +0 -0
  206. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/agents/watchdog.py +0 -0
  207. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/analysis.py +0 -0
  208. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/__init__.py +0 -0
  209. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/aggregate_command.py +0 -0
  210. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/console.py +0 -0
  211. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/evaluate_command.py +0 -0
  212. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/plan_command.py +0 -0
  213. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/report_command.py +0 -0
  214. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/run_command.py +0 -0
  215. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/run_helpers.py +0 -0
  216. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/run_task_internal_command.py +0 -0
  217. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/cli/utils.py +0 -0
  218. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/config.py +0 -0
  219. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/__init__.py +0 -0
  220. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
  221. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/agent_judge.py +0 -0
  222. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/base.py +0 -0
  223. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/classification_match.py +0 -0
  224. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/cli_called.py +0 -0
  225. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/command_executed.py +0 -0
  226. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/commands_efficiency.py +0 -0
  227. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/file_check.py +0 -0
  228. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/file_contains.py +0 -0
  229. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/file_exists.py +0 -0
  230. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/file_matches_regex.py +0 -0
  231. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/json_check.py +0 -0
  232. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/llm_judge.py +0 -0
  233. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/reference_comparison.py +0 -0
  234. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/run_command.py +0 -0
  235. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/criteria/uipath_eval.py +0 -0
  236. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/__init__.py +0 -0
  237. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/agent.py +0 -0
  238. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/budget.py +0 -0
  239. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/categories.py +0 -0
  240. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/categorization.py +0 -0
  241. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/checker_misuse.py +0 -0
  242. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/executor.py +0 -0
  243. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/judge.py +0 -0
  244. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/reference.py +0 -0
  245. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/retry.py +0 -0
  246. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/errors/timeout.py +0 -0
  247. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/__init__.py +0 -0
  248. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/checker.py +0 -0
  249. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
  250. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
  251. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/judge_context.py +0 -0
  252. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/judge_litellm.py +0 -0
  253. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/judge_models.py +0 -0
  254. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/judge_persistence.py +0 -0
  255. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/judge_usage.py +0 -0
  256. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/sub_agent.py +0 -0
  257. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/summaries.py +0 -0
  258. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/evaluation/verdict_tool.py +0 -0
  259. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/formatting.py +0 -0
  260. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/fs_permissions.py +0 -0
  261. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/invocation_log.py +0 -0
  262. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/isolation/__init__.py +0 -0
  263. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/isolation/docker_runner.py +0 -0
  264. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/litellm_cost.py +0 -0
  265. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/logging_config.py +0 -0
  266. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/container_paths.py +0 -0
  267. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/criteria.py +0 -0
  268. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/experiment.py +0 -0
  269. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/judge.py +0 -0
  270. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/judge_defaults.py +0 -0
  271. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/limits.py +0 -0
  272. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/merge_strategy.py +0 -0
  273. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/mutations.py +0 -0
  274. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/results.py +0 -0
  275. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/routing.py +0 -0
  276. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/sandbox.py +0 -0
  277. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/telemetry.py +0 -0
  278. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/models/templates.py +0 -0
  279. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/__init__.py +0 -0
  280. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/batch.py +0 -0
  281. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/config.py +0 -0
  282. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/config_merge.py +0 -0
  283. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/early_stop.py +0 -0
  284. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/evaluation.py +0 -0
  285. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/experiment.py +0 -0
  286. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/overrides.py +0 -0
  287. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/run_limits.py +0 -0
  288. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/orchestration/task_loader.py +0 -0
  289. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/path_utils.py +0 -0
  290. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/plugins.py +0 -0
  291. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/py.typed +0 -0
  292. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/reports.py +0 -0
  293. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/reports_experiment.py +0 -0
  294. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/reports_html.py +0 -0
  295. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/reports_junit.py +0 -0
  296. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/reports_stats.py +0 -0
  297. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/resources/__init__.py +0 -0
  298. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
  299. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/resources/tags.yaml +0 -0
  300. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/sandbox.py +0 -0
  301. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/scoring/__init__.py +0 -0
  302. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/scoring/ast_similarity.py +0 -0
  303. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/scoring/complexity.py +0 -0
  304. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/scoring/quality.py +0 -0
  305. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/scoring/signature_similarity.py +0 -0
  306. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/scoring/similarity.py +0 -0
  307. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/scoring/token_similarity.py +0 -0
  308. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/simulation/__init__.py +0 -0
  309. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/simulation/termination.py +0 -0
  310. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/simulation/user_simulator.py +0 -0
  311. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/streaming/__init__.py +0 -0
  312. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/streaming/callbacks.py +0 -0
  313. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/streaming/collector.py +0 -0
  314. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/streaming/events.py +0 -0
  315. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/streaming/renderers.py +0 -0
  316. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/streaming/wire.py +0 -0
  317. {coder_eval-0.11.4 → coder_eval-0.11.5}/src/coder_eval/telemetry.py +0 -0
  318. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/README.md +0 -0
  319. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agentless_smoke_test.yaml +0 -0
  320. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/antigravity_hello_world.yaml +0 -0
  321. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
  322. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/claude_hello_world.yaml +0 -0
  323. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/claude_hello_world_docker.yaml +0 -0
  324. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
  325. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/claude_subagent_test.yaml +0 -0
  326. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
  327. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/codex_hello_world.yaml +0 -0
  328. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/codex_parallel_commands.yaml +0 -0
  329. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
  330. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/codex_skills_test.yaml +0 -0
  331. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/codex_string_utils.yaml +0 -0
  332. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/codex_subagent_test.yaml +0 -0
  333. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/subagent_bash_long_input.yaml +0 -0
  334. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/agents/subagent_merge_sort.yaml +0 -0
  335. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/anti_cheat_reference/anti_cheat_reference.yaml +0 -0
  336. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/anti_cheat_reference/reference/solution.py +0 -0
  337. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/byod_smoke_test.yaml +0 -0
  338. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/dataset_example.yaml +0 -0
  339. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/datasets/sentiment.jsonl +0 -0
  340. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
  341. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
  342. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
  343. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/dockerfile_build_example/environment/input.txt +0 -0
  344. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
  345. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
  346. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/early_stop_decision_budget_exceeded.yaml +0 -0
  347. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/early_stop_weighted_high_weight_kills_run.yaml +0 -0
  348. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/early_stop_weighted_low_weight_absorbed.yaml +0 -0
  349. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/fibonacci_with_template.yaml +0 -0
  350. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/hello_date.yaml +0 -0
  351. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/inline_starter_example.yaml +0 -0
  352. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/internal/session_resumption.yaml +0 -0
  353. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/mock_path_dirs_smoke.yaml +0 -0
  354. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
  355. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
  356. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
  357. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
  358. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
  359. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
  360. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/run_limits/max_turns_cap.yaml +0 -0
  361. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/run_limits/turn_timeout.yaml +0 -0
  362. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
  363. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
  364. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
  365. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
  366. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
  367. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
  368. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/README.md +0 -0
  369. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
  370. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
  371. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
  372. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
  373. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
  374. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
  375. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
  376. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
  377. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
  378. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
  379. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/sentiment_classification.yaml +0 -0
  380. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/smoke_agent_judge.yaml +0 -0
  381. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/smoke_budget_exceeded.yaml +0 -0
  382. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
  383. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/smoke_llm_judge.yaml +0 -0
  384. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/smoke_negative_path.yaml +0 -0
  385. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/smoke_task_timeout.yaml +0 -0
  386. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/smoke_variants.yaml +0 -0
  387. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/test_sandbox.yaml +0 -0
  388. {coder_eval-0.11.4 → coder_eval-0.11.5}/tasks/token_check.yaml +0 -0
  389. {coder_eval-0.11.4 → coder_eval-0.11.5}/templates/byod_smoke_test/Dockerfile +0 -0
  390. {coder_eval-0.11.4 → coder_eval-0.11.5}/templates/fibonacci-starter/README.md +0 -0
  391. {coder_eval-0.11.4 → coder_eval-0.11.5}/templates/fibonacci-starter/src/main.py +0 -0
  392. {coder_eval-0.11.4 → coder_eval-0.11.5}/templates/fibonacci-starter/tests/test_main.py +0 -0
  393. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/__init__.py +0 -0
  394. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/__init__.py +0 -0
  395. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/__init__.py +0 -0
  396. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/_scrub.py +0 -0
  397. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
  398. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
  399. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
  400. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
  401. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
  402. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
  403. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
  404. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
  405. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
  406. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
  407. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
  408. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
  409. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
  410. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
  411. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
  412. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
  413. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
  414. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
  415. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
  416. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
  417. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/live_criteria.py +0 -0
  418. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/report_snapshots/__init__.py +0 -0
  419. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
  420. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
  421. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
  422. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
  423. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/report_snapshots/run_full.md +0 -0
  424. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
  425. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/_path_helpers.py +0 -0
  426. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/conftest.py +0 -0
  427. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/fixtures/__init__.py +0 -0
  428. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
  429. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
  430. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/fixtures/mock_agent.py +0 -0
  431. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
  432. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
  433. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
  434. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/fixtures/text_stub_agent.py +0 -0
  435. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/__init__.py +0 -0
  436. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/action_docs.py +0 -0
  437. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/dead_config_fields.py +0 -0
  438. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/doc_env_parity.py +0 -0
  439. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/doc_examples.py +0 -0
  440. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/doc_indexes.py +0 -0
  441. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/doc_schema_parity.py +0 -0
  442. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/generated.py +0 -0
  443. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/live_verdict_contract.py +0 -0
  444. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/plugin_reference.py +0 -0
  445. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/pyright_config.py +0 -0
  446. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/__init__.py +0 -0
  447. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/base.py +0 -0
  448. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
  449. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
  450. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
  451. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
  452. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
  453. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
  454. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
  455. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
  456. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
  457. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
  458. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
  459. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce032_criteria_path_seam.py +0 -0
  460. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce037_no_dead_private_helper.py +0 -0
  461. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce038_acquire_inside_try.py +0 -0
  462. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce039_config_error_escalates.py +0 -0
  463. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/ce043_no_command_output_truncation.py +0 -0
  464. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/no_agent_timing_access.py +0 -0
  465. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
  466. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
  467. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/no_silent_except.py +0 -0
  468. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/no_submodule_model_imports.py +0 -0
  469. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
  470. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
  471. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
  472. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/open_explicit_encoding.py +0 -0
  473. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
  474. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/register_criterion_required.py +0 -0
  475. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
  476. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
  477. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/violation.py +0 -0
  478. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/lint/workflow_outputs.py +0 -0
  479. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_action_version_pin.py +0 -0
  480. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent.py +0 -0
  481. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent_config_no_timing_fields.py +0 -0
  482. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent_config_optional_type.py +0 -0
  483. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent_config_registry_dispatch.py +0 -0
  484. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent_config_sdk_decoupling.py +0 -0
  485. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent_golden_master.py +0 -0
  486. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent_judge_criterion.py +0 -0
  487. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent_telemetry.py +0 -0
  488. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent_telemetry_advanced.py +0 -0
  489. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agent_timeout.py +0 -0
  490. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_agentless.py +0 -0
  491. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_aggregate.py +0 -0
  492. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_antigravity_agent.py +0 -0
  493. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_byoa_plugin.py +0 -0
  494. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_byoa_plugin_live.py +0 -0
  495. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_byod_feature.py +0 -0
  496. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_check_all_async.py +0 -0
  497. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_checker_logging.py +0 -0
  498. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_classification_match.py +0 -0
  499. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_claude_settings_enforcement_live.py +0 -0
  500. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_cleanup_preservation_guard.py +0 -0
  501. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_cli_backend_flag.py +0 -0
  502. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_cli_called_criterion.py +0 -0
  503. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_cli_empty_glob.py +0 -0
  504. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_cli_sdk_options.py +0 -0
  505. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_cli_set_overrides.py +0 -0
  506. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_cli_telemetry.py +0 -0
  507. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_cli_type_flag.py +0 -0
  508. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_code_review_bugs.py +0 -0
  509. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_codex_agent.py +0 -0
  510. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_codex_agent_live.py +0 -0
  511. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_codex_agent_unit.py +0 -0
  512. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_codex_token_mapping.py +0 -0
  513. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_command_executed.py +0 -0
  514. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_command_statistics.py +0 -0
  515. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_command_telemetry_result_data.py +0 -0
  516. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_commands_efficiency.py +0 -0
  517. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_config_lineage.py +0 -0
  518. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_config_merge_engine.py +0 -0
  519. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_config_precedence.py +0 -0
  520. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_continuous_scoring.py +0 -0
  521. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_cost_accounting_paths.py +0 -0
  522. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_criterion_result_round_trip.py +0 -0
  523. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_dataset_expansion.py +0 -0
  524. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_debug_logging.py +0 -0
  525. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_docker_build_failure.py +0 -0
  526. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_docker_litellm_env.py +0 -0
  527. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_docker_runner_container_death.py +0 -0
  528. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_docker_runner_mounts.py +0 -0
  529. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_docker_runner_stream_limit.py +0 -0
  530. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_docker_wildcard_env.py +0 -0
  531. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_docker_workdir_live.py +0 -0
  532. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_driver_resolver.py +0 -0
  533. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_early_stop.py +0 -0
  534. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_error_handling.py +0 -0
  535. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_evaluate_command.py +0 -0
  536. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_evaluator.py +0 -0
  537. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_event_collector.py +0 -0
  538. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_experiment_cli.py +0 -0
  539. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_experiment_loader.py +0 -0
  540. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_experiment_models.py +0 -0
  541. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_experiment_reports.py +0 -0
  542. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_experiment_resolver.py +0 -0
  543. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_experiment_runner.py +0 -0
  544. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_file_check.py +0 -0
  545. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_file_contains_scoring.py +0 -0
  546. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_formatting.py +0 -0
  547. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_git_clone_failure.py +0 -0
  548. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_glob_paths_in_file_criteria.py +0 -0
  549. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_heartbeat_watchdog.py +0 -0
  550. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_ignore_patterns_negation.py +0 -0
  551. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_image_from_dockerfiles.py +0 -0
  552. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_integration.py +0 -0
  553. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_json_check.py +0 -0
  554. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_judge_anthropic.py +0 -0
  555. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_judge_bedrock.py +0 -0
  556. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_judge_burn_in_live.py +0 -0
  557. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_judge_context_builder.py +0 -0
  558. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_judge_litellm.py +0 -0
  559. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_judge_models.py +0 -0
  560. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_judge_persistence.py +0 -0
  561. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_lint_no_top_level_run_limits.py +0 -0
  562. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_lint_runner.py +0 -0
  563. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_litellm_config.py +0 -0
  564. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_litellm_cost.py +0 -0
  565. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_litellm_cost_logger.py +0 -0
  566. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_litellm_judge_live.py +0 -0
  567. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_llm_judge_criterion.py +0 -0
  568. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_log_tail_buffer.py +0 -0
  569. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_logging.py +0 -0
  570. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_logging_isolation.py +0 -0
  571. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_merge_characterization.py +0 -0
  572. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_merge_strategy_annotations.py +0 -0
  573. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_merge_unification.py +0 -0
  574. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_models.py +0 -0
  575. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_mutations.py +0 -0
  576. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_new_criteria.py +0 -0
  577. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_node_env_config.py +0 -0
  578. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_optional_dependencies.py +0 -0
  579. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_orchestrator_error_log_tail.py +0 -0
  580. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_orchestrator_telemetry.py +0 -0
  581. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_overrides_engine.py +0 -0
  582. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_parallel.py +0 -0
  583. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_path_utils.py +0 -0
  584. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_plan_command.py +0 -0
  585. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_plugins.py +0 -0
  586. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_post_run.py +0 -0
  587. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_pr_review_workflow.py +0 -0
  588. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_pre_run.py +0 -0
  589. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_preservation_mode.py +0 -0
  590. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reference_comparison_scoring.py +0 -0
  591. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reference_evaluator.py +0 -0
  592. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reference_missing_file.py +0 -0
  593. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reference_models.py +0 -0
  594. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_registry.py +0 -0
  595. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_release_notes.py +0 -0
  596. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_replicate_stats.py +0 -0
  597. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_report_command.py +0 -0
  598. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reports.py +0 -0
  599. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reports_experiment.py +0 -0
  600. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reports_html.py +0 -0
  601. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reports_junit.py +0 -0
  602. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reports_stats.py +0 -0
  603. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_reports_stats_nonfinite.py +0 -0
  604. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_resolve_task_files.py +0 -0
  605. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_resume.py +0 -0
  606. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_retry_logic_comprehensive.py +0 -0
  607. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_routing.py +0 -0
  608. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_run_command_junit.py +0 -0
  609. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_run_command_stdout.py +0 -0
  610. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_run_limits_models.py +0 -0
  611. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_run_limits_orchestrator.py +0 -0
  612. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_run_limits_resolver.py +0 -0
  613. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_run_metrics.py +0 -0
  614. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_runtime_tool_versions.py +0 -0
  615. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_sandbox.py +0 -0
  616. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_sandbox_layer_builder.py +0 -0
  617. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_sandbox_optional.py +0 -0
  618. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_sandbox_record_cli.py +0 -0
  619. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_sandbox_security.py +0 -0
  620. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_sandbox_symlink_preservation.py +0 -0
  621. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_sandbox_templates.py +0 -0
  622. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_scorers.py +0 -0
  623. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_scoring_quality.py +0 -0
  624. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_sdk_option_classification.py +0 -0
  625. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_simulation_config.py +0 -0
  626. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_simulation_integration.py +0 -0
  627. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_simulation_termination.py +0 -0
  628. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_simulation_trials.py +0 -0
  629. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_streaming_agent_integration.py +0 -0
  630. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_streaming_batch.py +0 -0
  631. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_streaming_callbacks.py +0 -0
  632. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_streaming_cli.py +0 -0
  633. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_streaming_events.py +0 -0
  634. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_streaming_orchestrator.py +0 -0
  635. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_streaming_renderers.py +0 -0
  636. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_streaming_wire.py +0 -0
  637. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_sub_agent_runner.py +0 -0
  638. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_success_criterion_union.py +0 -0
  639. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_suite_rollup.py +0 -0
  640. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_summaries.py +0 -0
  641. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_tags.py +0 -0
  642. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_task_definition_unknown_fields.py +0 -0
  643. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_teardown_interrupt.py +0 -0
  644. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_telemetry.py +0 -0
  645. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_template_env_expansion.py +0 -0
  646. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_threshold_enforcement.py +0 -0
  647. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_timeout_batch.py +0 -0
  648. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_timeout_categorization.py +0 -0
  649. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_timeout_exceptions.py +0 -0
  650. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_timeout_models.py +0 -0
  651. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_timeout_orchestrator.py +0 -0
  652. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_token_usage.py +0 -0
  653. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_uipath_eval.py +0 -0
  654. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_user_simulator.py +0 -0
  655. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_utils.py +0 -0
  656. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_utterance_extraction.py +0 -0
  657. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_variant_prompt_file.py +0 -0
  658. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_verdict_tool.py +0 -0
  659. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_verify_published_workflow.py +0 -0
  660. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_visible_turn_cap.py +0 -0
  661. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_watchdog.py +0 -0
  662. {coder_eval-0.11.4 → coder_eval-0.11.5}/tests/test_yaml_migration.py +0 -0
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-marketplace.json",
3
+ "name": "coder-eval",
4
+ "owner": {
5
+ "name": "UiPath",
6
+ "email": "coder-eval@uipath.com",
7
+ "url": "https://github.com/UiPath/coder_eval"
8
+ },
9
+ "description": "Test whether your Claude Code skills actually trigger, and benchmark AI coding agents against your own tasks.",
10
+ "plugins": [
11
+ {
12
+ "name": "coder-eval",
13
+ "displayName": "Coder Eval",
14
+ "source": "./plugins/coder-eval",
15
+ "description": "Test whether your Claude Code skills actually trigger, and benchmark any coding agent — author, run, and analyze the eval suite that proves it, locally or as a CI gate.",
16
+ "author": { "name": "UiPath", "email": "coder-eval@uipath.com", "url": "https://github.com/UiPath/coder_eval" },
17
+ "homepage": "https://coder-eval.com",
18
+ "repository": "https://github.com/UiPath/coder_eval",
19
+ "license": "Apache-2.0",
20
+ "category": "testing",
21
+ "keywords": [
22
+ "claude-code-skills",
23
+ "skill-testing",
24
+ "skill-activation",
25
+ "evaluation",
26
+ "benchmark",
27
+ "agent-testing",
28
+ "github-actions",
29
+ "sandbox",
30
+ "llm-judge",
31
+ "ci"
32
+ ]
33
+ }
34
+ ]
35
+ }
@@ -2,6 +2,121 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.11.5 (2026-08-28)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **opencode**: Bound the post-EOF reap, reap the whole process group, test every failure path
10
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
11
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
12
+
13
+ - **opencode**: Close the remaining review findings on the harness
14
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
15
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
16
+
17
+ - **opencode**: Gate on captured tokens, canonicalize tool args, pin max_turns
18
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
19
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
20
+
21
+ - **opencode**: Inject plugin skills so skill suites measure the skills
22
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
23
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
24
+
25
+ - **opencode**: Keep the smoke task out of the CI smoke-pass bucket
26
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
27
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
28
+
29
+ - **opencode**: Map apply_patch to Write so GPT-family edits are seen by criteria
30
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
31
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
32
+
33
+ - **opencode**: Reap the CLI on every turn exit, test the sandbox env contract
34
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
35
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
36
+
37
+ - **opencode**: Spread super() in get_environment_info; guard with CE046
38
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
39
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
40
+
41
+ - **opencode**: Typecheck on Windows, satisfy both CodeQL findings
42
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
43
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
44
+
45
+ - **plugin**: Close the review's verified gaps — regex blind spot, parallel surfaces, runtime guard
46
+ ([#143](https://github.com/UiPath/coder_eval/pull/143),
47
+ [`c565ebb`](https://github.com/UiPath/coder_eval/commit/c565ebb8c8c7d895489d2ae6e244959ba12470af))
48
+
49
+ - **plugin**: Correct the skill-reachability path — every generated activation suite reports recall
50
+ 0.0 ([#143](https://github.com/UiPath/coder_eval/pull/143),
51
+ [`c565ebb`](https://github.com/UiPath/coder_eval/commit/c565ebb8c8c7d895489d2ae6e244959ba12470af))
52
+
53
+ - **plugin**: Correct the skill-reachability path, and reuse PR #109's measured descriptions
54
+ ([#143](https://github.com/UiPath/coder_eval/pull/143),
55
+ [`c565ebb`](https://github.com/UiPath/coder_eval/commit/c565ebb8c8c7d895489d2ae6e244959ba12470af))
56
+
57
+ - **routing**: Decouple simulator route from checker_context.api_route
58
+ ([#144](https://github.com/UiPath/coder_eval/pull/144),
59
+ [`88ff0f0`](https://github.com/UiPath/coder_eval/commit/88ff0f0ff910f4c3d9c6b81c5b2b88356240a3c4))
60
+
61
+ - **routing**: Reinstate litellm+agent_judge rejection guard
62
+ ([#144](https://github.com/UiPath/coder_eval/pull/144),
63
+ [`88ff0f0`](https://github.com/UiPath/coder_eval/commit/88ff0f0ff910f4c3d9c6b81c5b2b88356240a3c4))
64
+
65
+ - **routing**: Restore LiteLLM->Claude pin on simulator_route
66
+ ([#144](https://github.com/UiPath/coder_eval/pull/144),
67
+ [`88ff0f0`](https://github.com/UiPath/coder_eval/commit/88ff0f0ff910f4c3d9c6b81c5b2b88356240a3c4))
68
+
69
+ - **test**: Add CE045, document the plugin-path divergence, unpin a test from ordering
70
+ ([#143](https://github.com/UiPath/coder_eval/pull/143),
71
+ [`c565ebb`](https://github.com/UiPath/coder_eval/commit/c565ebb8c8c7d895489d2ae6e244959ba12470af))
72
+
73
+ - **utils**: Use explicit concatenation in the plugin-root warning
74
+ ([#143](https://github.com/UiPath/coder_eval/pull/143),
75
+ [`c565ebb`](https://github.com/UiPath/coder_eval/commit/c565ebb8c8c7d895489d2ae6e244959ba12470af))
76
+
77
+ ### Chores
78
+
79
+ - **opencode**: Standardize on deepseek-v4-pro, drop the flash-0731 rate entry
80
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
81
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
82
+
83
+ - **plugin**: Answer "skills only?", fold tags into keywords, add CE044
84
+ ([#141](https://github.com/UiPath/coder_eval/pull/141),
85
+ [`2ae9b7b`](https://github.com/UiPath/coder_eval/commit/2ae9b7badb10831a11d81e703aa5e7a981616ace))
86
+
87
+ - **plugin**: Give both author objects the same contact address
88
+ ([#141](https://github.com/UiPath/coder_eval/pull/141),
89
+ [`2ae9b7b`](https://github.com/UiPath/coder_eval/commit/2ae9b7badb10831a11d81e703aa5e7a981616ace))
90
+
91
+ - **plugin**: Give the marketplace owner a contact address
92
+ ([#141](https://github.com/UiPath/coder_eval/pull/141),
93
+ [`2ae9b7b`](https://github.com/UiPath/coder_eval/commit/2ae9b7badb10831a11d81e703aa5e7a981616ace))
94
+
95
+ - **plugin**: Lead both manifests with skill evaluation, add discovery metadata
96
+ ([#141](https://github.com/UiPath/coder_eval/pull/141),
97
+ [`2ae9b7b`](https://github.com/UiPath/coder_eval/commit/2ae9b7badb10831a11d81e703aa5e7a981616ace))
98
+
99
+ - **plugin**: Pin both manifests to their published JSON schemas
100
+ ([#141](https://github.com/UiPath/coder_eval/pull/141),
101
+ [`2ae9b7b`](https://github.com/UiPath/coder_eval/commit/2ae9b7badb10831a11d81e703aa5e7a981616ace))
102
+
103
+ ### Documentation
104
+
105
+ - **opencode**: Note _TERM_GRACE_SECONDS's second role as the post-EOF exit grace
106
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
107
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
108
+
109
+ ### Features
110
+
111
+ - **agents**: Add OpenCode harness with opt-in [opencode] extra
112
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
113
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
114
+
115
+ - **opencode**: Add require_token_telemetry, an escape hatch for the zero-token guard
116
+ ([#115](https://github.com/UiPath/coder_eval/pull/115),
117
+ [`5532b87`](https://github.com/UiPath/coder_eval/commit/5532b87ac218f6e413479ad7e2eb8d11d89686b9))
118
+
119
+
5
120
  ## v0.11.4 (2026-08-27)
6
121
 
7
122
  ### Chores
@@ -144,7 +144,7 @@ action.yml # Published composite GitHub Action (coder-ev
144
144
  - **Sub-agent token accounting**: There is NO separate per-sub-agent field. Every sub-agent generation is captured as a `parent_tool_use_id`-tagged `AssistantMessage` in the turn transcript, so per-sub-agent usage is derived by grouping those messages on that id (the evalboard's `aggregateSubAgentUsage` does exactly this). Claude bubbles its sub-agent's intermediate generations into the parent stream natively, and the **terminal** generation (delivered as the Agent tool result, never streamed) is synthesized into one via `_synthesize_subagent_terminal_message` from `tool_use_result.usage`. Codex reconstructs all child generations from the child rollout (`_recover_subagent_tool_calls`). The turn total already includes sub-agent cost — Claude via the SDK's cumulative `model_usage`; Codex via `_fold_subagent_tokens`, which folds the child messages (their real per-generation tokens) into the parent total. `CommandTelemetry.result_summary` is stored **untruncated** (no 200-char cap) so sub-agent returns are preserved whole. Set `CODER_EVAL_RAW_SDK_LOG=1` to dump every raw SDK event to the task log for inspection.
145
145
  - **Reconciliation message (stream self-reconciles to the turn total)**: The per-message stream consistently under-reports the authoritative turn total — a fixed prompt slice (~512 input tokens on Claude) is billed on no SDK-emitted message, and sub-agent input/cache only partially bubbles up. So `EventCollector.build_turn_record` appends one synthetic `ReconciliationMessage` (`role="reconciliation"`, in the `TranscriptMessage` union) per turn, carrying the per-bucket residual = `token_usage` − Σ(assistant message buckets). The invariant: **summing the four token buckets across `TurnRecord.messages` (assistant + reconciliation) equals `token_usage` exactly**, for both Claude and Codex (Codex's stream is already complete after `_recover_subagent_tool_calls`, so its residual is usually 0 and no entry is emitted). This is what lets the evalboard SUM the message stream as the source of truth instead of reading a separate aggregate ("agent tokens"): `selectTokenTotals` returns the stream sum whenever a reconciliation entry is present, and the timeline renders it as its own row. It is agent-agnostic (booked at the single `EventCollector` seam), carries no cost (cost stays on `token_usage`), and is excluded from generation/turn counts and the cost simulator. The LiteLLM open-weight actual-cost join (`litellm_cost.apply_actual_cost`) deliberately writes cost at the TURN level only (`token_usage.total_cost_usd` = the real OpenRouter bill) plus the per-call `TurnRecord.provider_call_costs` audit record; it does NOT touch the message token buckets, so `EventCollector` stays the single writer and this invariant holds on every backend. The Python `token_usage`/`total_token_usage` aggregate is unchanged and still authoritative for budget/judges/reports.
146
146
  - **Reference solutions are directory-only, and shielded (partially) from the agent**: `task.reference` is a single required `directory:` (relative to the task YAML) — the inline `code:` / single-file `file:` forms are gone, because a directory is the only shape that can be permission-gated as a unit; a `model_validator(mode="before")` gives the removed forms a migration error. The orchestrator stages a **per-run private copy** (`orchestration/evaluation.py::stage_reference_dir`, symlinks stripped) into a tempdir, removed in `_cleanup` via `path_utils.rmtree_restrictive` (keyed on `_reference_staging_root`, recorded BEFORE the copy so a failed copy still cleans up; `rmtree(ignore_errors=True)` silently declines on a tree left at 000) and deliberately never preserved into `run_dir/artifacts`. That copy is held at mode `000` for the whole of every `agent.communicate` call via **`Sandbox.set_permissions`**, the driver-aware wrapper over `fs_permissions.py::set_permissions`. Windows **stack**: exiting restores the *enclosing* window's mode, only the outermost exit restores the pre-window mode — that is what makes a mid-turn re-grant (`mode=READ_ONLY_MODE`) expressible, and it covers two windows at the same mode so no refcount is needed. The window is enforced **only inside a docker container** (`Sandbox.enforces_permission_windows`) and is a no-op on the host, where the agent shares our uid. **That gate keys on the `CODER_EVAL_IN_CONTAINER` env var, NOT `sandbox.driver`** — `run_task_internal_command` rewrites `driver: docker` → `tempdir` before building the in-container Orchestrator, so a driver-based gate would silently disable the anti-cheat on exactly the path that needs it (regression-guarded by `TestSandboxDriverGate`); `resolve_reference_dir` gates its `/work/references` branch on the same var for the same reason. The task directory is **not** shielded (`:ro` mount → EROFS, and the same YAML is readable at `/work/input`). Criteria address reference files with the `$REFERENCE_DIR` token (same resolver as `$TASK_DIR`) and the `REFERENCE_DIR` env var for `run_command`; `reference_comparison` names one file via `reference_file`. Docker mounts a throwaway **read-write** copy at `/work/references` (a `:ro` mount cannot be chmod'd — EROFS), masks the in-task-dir original with an empty tmpfs, and drops `DAC_OVERRIDE`/`DAC_READ_SEARCH`. `FOWNER`/`CHOWN` are deliberately **NOT** dropped: the in-container orchestrator that applies the window is the same root process with the same caps, so dropping `FOWNER` breaks *the harness's own* chmod wherever the bind mount preserves a non-root owner (native Linux — verified: `chmod: Operation not permitted`), i.e. exactly where the drop would otherwise bite. A window that cannot be applied is now a hard error, not a warning: `Sandbox.set_permissions` passes `strict=True` whenever it enforces, so an unprotected run fails instead of producing a normal-looking score. **KNOWN GAP — this is defense-in-depth, not a boundary**: (a) `chmod(2)` is gated on owner-or-`CAP_FOWNER` and the container runs as root owning the copy, so a deliberate `chmod 755 /work/references` restores access; (b) the window spans `agent.communicate` only, and nothing reaps agent child processes at turn end, so a backgrounded read loop succeeds once the window closes. The **write** half of (b) is closed — `path_utils.digest_tree` hashes the tree at staging and `Orchestrator._verify_reference_integrity` re-checks before grading, raising `ReferenceTamperedError` (→ `FinalStatus.ERROR`) on a mismatch so an agent cannot overwrite the reference to drive `reference_comparison` to 1.0. Passive reads are blocked; an adversarial agent is not. Full containment requires running the agent as a non-root uid AND holding the window for the agent's whole lifetime — follow-up. `tasks/anti_cheat_reference` probes the passive-read half.
147
- - **Harness run-limit parity**: a shared `BaseAgentConfig` field must mean the same thing on every backend, so a divergence is either fixed or documented — never silent. **`run_limits.max_turns` on Codex/Antigravity counts VISIBLE turns** (resolved tool calls, read live off the shared `EventCollector.visible_turn_count`, the same list `TurnRecord.commands` holds) because one `communicate()` is a single SDK turn on both, so a native counter would clamp at 1; claude-code keeps its native SDK cap, whose unit (an agent-loop turn) absorbs arbitrarily many parallel calls — the same number is NOT the same budget across harnesses. The cap is enforced on the same loop boundary as the cooperative early stop and finalizes cleanly as `max_turns_exhausted` (no crash, no retry); on Antigravity that boundary lives in `_drain()`, so the background-work poll loop honors it too. Known unfixed divergences: `permission_mode` on Codex and Antigravity (both run unconfined — the sandbox driver is the isolation boundary), `disallowed_tools` on Codex (forwarded, not SDK-enforced), `allowed_tools`/`disallowed_tools` on Antigravity (not read at all), and `turn_timeout` on Antigravity (bounded by an earlier internal poll deadline at 80% of it). Full table + rationale: docs/agents/HARNESS_PARITY.md.
147
+ - **Harness run-limit parity**: a shared `BaseAgentConfig` field must mean the same thing on every backend, so a divergence is either fixed or documented — never silent. **`run_limits.max_turns` on Codex/Antigravity counts VISIBLE turns** (resolved tool calls, read live off the shared `EventCollector.visible_turn_count`, the same list `TurnRecord.commands` holds) because one `communicate()` is a single SDK turn on both, so a native counter would clamp at 1; claude-code keeps its native SDK cap, whose unit (an agent-loop turn) absorbs arbitrarily many parallel calls — the same number is NOT the same budget across harnesses. OpenCode likewise keeps a native unit — the CLI streams a real multi-step loop per `communicate()` (`step_start`/`step_finish`), so `max_turns: N` allows N complete steps and cuts cleanly when step N+1 begins. The cap is enforced on the same loop boundary as the cooperative early stop and finalizes cleanly as `max_turns_exhausted` (no crash, no retry); on Antigravity that boundary lives in `_drain()`, so the background-work poll loop honors it too. Known unfixed divergences: `permission_mode` on Codex and Antigravity (both run unconfined — the sandbox driver is the isolation boundary), `disallowed_tools` on Codex (forwarded, not SDK-enforced), `allowed_tools`/`disallowed_tools` on Antigravity (not read at all), `turn_timeout` on Antigravity (bounded by an earlier internal poll deadline at 80% of it), `allowed_tools`/`disallowed_tools`/`system_prompt` on OpenCode (no CLI knob; warned at `start()`, not enforced), and **`agent.plugins[].path` depth** — claude-code REQUIRES a plugin root holding `skills/` and silently loads NOTHING from a bare skills directory, while Codex and Antigravity scan both depths and accept either. That is the costly direction: the wrong depth produces no error, every positive row of an activation suite scores 0, and the suite reports recall 0.0, which reads exactly like a skill that never triggers. Held to the plugin-root shape (for `SKILL_SOURCE_PATH` only) by lint rule CE045. `plugins` on OpenCode is **honored for skills**: each local plugin root is mapped to the `skills` dir its `.claude-plugin/plugin.json` declares (default `<root>/skills`, never the root itself — `skills.paths` is scanned recursively and a plugin root can hold a self-referential symlink) and injected via `OPENCODE_CONFIG_CONTENT`, which `--pure` does not suppress; a plugin's agents/hooks/commands/MCP servers are still dropped. Full table + rationale: docs/agents/HARNESS_PARITY.md.
148
148
  - **sandbox isolation**: Tasks that don't need MCP servers should set `setting_sources: []` in their `agent:` block to isolate the sandbox from the host project's CLAUDE.md and settings. Without this, the host project's CLAUDE.md (often 20 KB+) is injected into every API call, inflating cache-creation tokens and cost significantly.
149
149
  - **Run-time caps (non-criterion enforcement)**: `TaskDefinition.run_limits` (`RunLimits` model) is the single namespace for all *task-level* run-time caps — `max_turns` / `task_timeout` / `turn_timeout` (structural) and `max_input_tokens` / `max_output_tokens` / `max_total_tokens` / `max_usd` (cumulative budget). Token/USD breaches abort with `FinalStatus.TOKEN_BUDGET_EXCEEDED` or `COST_BUDGET_EXCEEDED` (both `category == "failed"`). Structural caps are set from the CLI via `-D run_limits.max_turns=…` / `-D run_limits.task_timeout=…` / `-D run_limits.turn_timeout=…` (field-merged into `run_limits`); budget caps via `-D run_limits.max_usd=…` etc. or YAML. Layered config uses field-merge — a variant block overrides individual keys without replacing the task's block. The one *per-criterion* cap, `stop_early.decide_within`, deliberately lives on `LiveSuccessCriterion` instead (see below) — the watcher must attribute a decision-step timeout to a specific criterion, which `RunLimits` (task-scoped, criterion-agnostic) cannot express.
150
150
  - **Early stop on criterion (opt-in, per-criterion arming)**: a `stop_early:` block (`StopEarlyPolicy`) on a criterion ends a single-shot run early once the run's **armed** criteria decide the outcome, so a raised `max_turns` isn't wasted on the smoke flavor. The block's PRESENCE is the arming and alone activates the watcher — there is **no run-level master switch**: `run_limits.stop_early: false` is the run-level KILL SWITCH that force-disarms every block (the one-line experiment-variant/`-D` override for an authoritative full run), and `run_limits.stop_early: true` (the removed master arm) is a hard `EarlyStopConfigError` at resolution. The block exists on `LiveSuccessCriterion` only (currently `skill_triggered`, `command_executed` — so arming an unobservable criterion is unrepresentable, a pydantic extra-forbid error). Arming carries one implicit trigger (a native live-fail may fail-stop the run); its keys refine it: `on_pass: stop` (pass-stop the moment the criterion live-passes; default `continue` just latches) and `decide_within: N` (still undecided after N tool-call steps latches an **effective fail**, fed through the same fail-stop rule, reported as `decision_budget_exceeded` — an ordinary weighted fail, NOT a gate-bypassing force-fail; cumulative across retry attempts of the same turn). A trigger whose polarity the instance can't decide (per the abstract, checker-independent `live_decidable_polarities()`, a pure function of the criterion's own fields, paired with the checker's `live_verdict` override by lint rule CE025, a registry-based whole-tree check) is **inert by design** — one dataset-fanned YAML line serves both positive rows (pass/timeout live) and distractor rows (fail live). Verdicts **latch**: once a criterion decides, its `live_verdict` is never polled again. Stop rule is weighted, not strict-boolean: `run_limits.stop_early_gate_threshold` (default `1.0`, reproducing strict-AND behavior exactly) is the minimum weighted score (`Σ weight·score / Σ weight` over the armed subset) required to pass; a fail-stop fires once the armed set's **ceiling** (best case for everything still undecided) can no longer reach the threshold — so a low-weight fail or timeout that can't doom the gate is absorbed and the run continues — and is **deferred while any pass-capable armed criterion is undecided** (a distractor misfire never truncates a positive row's recall signal); a pass-stop fires once the `on_pass: stop` subset's **floor** (worst case) already meets the threshold, and is symmetrically **deferred while any pass-capable armed criterion outside the `on_pass: stop` subset is undecided** (so an early pass never freezes a sibling `on_pass: continue` criterion's signal out of the trajectory). A fail-stop is therefore verdict-preserving; a pass-stop can miss a *later* distractor misfire, so authoritative P/R/F1 comes from a kill-switched (`stop_early: false`) run. Driven by `orchestration/early_stop.py::EarlyStopWatcher` (built when `early_stop_active(task)`: ≥1 armed criterion, kill switch not thrown) through the agent's cooperative `should_stop` seam (tool-call granularity, no SIGKILL); live verdicts only *trigger* the stop — the standard `check_all_async` on the frozen trajectory is authoritative. Gating is **FIRED-ONLY**: a run the watcher actually cut gates on the **armed subset** via the weighted `EvaluationResult.armed_criteria_passed`; a run that completes naturally — armed or not — gates strict-AND via `all_criteria_passed`, so adding a block never changes the verdict of a run it didn't cut. Note the gate keys on the watcher having FIRED (`result.early_stop is not None`), not on confirmed truncation — an agent that ignores `should_stop`, or a stop firing on the final message, still gates armed-only. Every resolution-time guardrail violation is a hard error at resolution (plan *and* run); the one load-time case — a `stop_early:` block on a non-live criterion — is a pydantic schema error at task load, which the run surface reports as a skipped task like any other malformed task. A runtime verdict bug **fails open** to a full run. Surfaces: `EarlyStopInfo` (incl. `gate_threshold` at stop time), report notes/badges, `stopped_early` run.json rows, `EarlyStopped`/`EarlyStopReason` telemetry dims. Worked rationale: docs/TASK_DEFINITION_GUIDE.md § `stop_early`. No blocks anywhere ⇒ behavior byte-for-byte unchanged.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: coder-eval
3
- Version: 0.11.4
3
+ Version: 0.11.5
4
4
  Summary: Evaluate, benchmark, and A/B-test AI coding agents (Claude Code, Codex, Gemini/Antigravity) with sandboxed, reproducible YAML task suites.
5
5
  Project-URL: Homepage, https://coder-eval.com
6
6
  Project-URL: Repository, https://github.com/UiPath/coder_eval
@@ -60,6 +60,7 @@ Requires-Dist: pytest>=9.0.2; extra == 'dev'
60
60
  Requires-Dist: ruff>=0.15.7; extra == 'dev'
61
61
  Provides-Extra: litellm
62
62
  Requires-Dist: litellm<2.0.0,>=1.95.0; extra == 'litellm'
63
+ Provides-Extra: opencode
63
64
  Provides-Extra: uipath
64
65
  Requires-Dist: uipath>=2.10.31; extra == 'uipath'
65
66
  Description-Content-Type: text/markdown
@@ -77,14 +78,14 @@ Description-Content-Type: text/markdown
77
78
  **Coder Eval** (`pip install coder-eval` / `uv tool install coder-eval`) is an open-source framework for
78
79
  **evaluating and benchmarking AI coding agents and their skills** — built for CLI
79
80
  and skill builders — with sandboxing, reproducibility, and data-driven analysis.
80
- It runs a real agent (**Claude Code**, **Codex**, or **Google Antigravity /
81
- Gemini**) in a sandbox against declarative YAML tasks, then scores the files and
81
+ It runs a real agent (**Claude Code**, **Codex**, **Google Antigravity /
82
+ Gemini**, or **OpenCode**) in a sandbox against declarative YAML tasks, then scores the files and
82
83
  commands it actually produced. Not an "agentic coding" benchmark: it measures how
83
84
  effective your CLI and skills are when used by coding agents.
84
85
 
85
86
  Reach for it when you want to **test whether a Claude Code skill triggers**,
86
- **A/B-test Claude Code vs. Codex vs. Gemini** (or model vs. model, prompt vs.
87
- prompt), or **gate CI on coding-agent quality**. Unlike fixed datasets (SWE-bench,
87
+ **A/B-test Claude Code vs. Codex vs. Gemini vs. OpenCode** (or model vs. model,
88
+ prompt vs. prompt), or **gate CI on coding-agent quality**. Unlike fixed datasets (SWE-bench,
88
89
  SkillsBench) that rank models on a shared leaderboard, Coder Eval evaluates the
89
90
  tasks, skills, and workflows *you* ship — with weighted 0.0–1.0 criteria, a
90
91
  `skill_triggered` activation check, an A/B experiment layer, and per-tool cost
@@ -99,14 +100,14 @@ telemetry. See [How it compares](https://coder-eval.com/docs/comparison).
99
100
  - **Sandboxed execution** in isolated environments with resource limits
100
101
  - **Weighted, continuous scoring** (0.0–1.0) with fractional credit and thresholds
101
102
  - **Many criterion types** — from file checks to code similarity and LLM-graded rubrics
102
- - **Agent abstraction** — Claude Code, Codex, and Antigravity (Gemini) today, extensible via a plugin SPI
103
+ - **Agent abstraction** — Claude Code, Codex, Antigravity (Gemini), and OpenCode today, extensible via a plugin SPI
103
104
  - **Experiment layer** — A/B agent configs (models, tools, prompts) side-by-side
104
105
  - **Full telemetry** — every tool call, token counts, and cost, with real-time streaming
105
106
 
106
107
  ## What you can do with it
107
108
 
108
109
  - **Benchmark coding agents** — score an agent across a suite of tasks with weighted scoring and pass/fail thresholds
109
- - **Compare models & configs** — A/B-test Claude vs. Codex vs. Gemini, model vs. model, tool-on vs. tool-off, prompt vs. prompt
110
+ - **Compare models & configs** — A/B-test Claude vs. Codex vs. Gemini vs. OpenCode, model vs. model, tool-on vs. tool-off, prompt vs. prompt
110
111
  - **Evaluate skills** — verify an agent actually engages a target skill (`skill_triggered`) and score skill-driven suites (SkillsBench-style)
111
112
  - **Keep skills up to date in CI** — re-validate your skills on every change or on a schedule; catch silent regressions when models, prompts, or the skills themselves drift
112
113
  - **Gate CI on agent quality** — run the suite in GitHub Actions and fail the build on regressions
@@ -275,6 +276,7 @@ alone.
275
276
  | [Claude Code](docs/agents/CLAUDE_CODE.md) | Configuring and running the default Claude Code agent |
276
277
  | [Codex](docs/agents/CODEX.md) | Running the OpenAI Codex agent |
277
278
  | [Antigravity (Gemini)](docs/agents/ANTIGRAVITY.md) | Running the Google Antigravity / Gemini agent |
279
+ | [OpenCode](docs/agents/OPENCODE.md) | Running the OpenCode agent on open-weight models |
278
280
  | [Run-Limit Parity](docs/agents/HARNESS_PARITY.md) | What each run_limits field means on every harness |
279
281
  | [A/B Experiments](docs/AB_EXPERIMENTS.md) | Compare models / tools / prompts across the same tasks |
280
282
  | [Bring Your Own Dataset](docs/DATASETS.md) | Fan a single task out over a dataset |
@@ -11,14 +11,14 @@
11
11
  **Coder Eval** (`pip install coder-eval` / `uv tool install coder-eval`) is an open-source framework for
12
12
  **evaluating and benchmarking AI coding agents and their skills** — built for CLI
13
13
  and skill builders — with sandboxing, reproducibility, and data-driven analysis.
14
- It runs a real agent (**Claude Code**, **Codex**, or **Google Antigravity /
15
- Gemini**) in a sandbox against declarative YAML tasks, then scores the files and
14
+ It runs a real agent (**Claude Code**, **Codex**, **Google Antigravity /
15
+ Gemini**, or **OpenCode**) in a sandbox against declarative YAML tasks, then scores the files and
16
16
  commands it actually produced. Not an "agentic coding" benchmark: it measures how
17
17
  effective your CLI and skills are when used by coding agents.
18
18
 
19
19
  Reach for it when you want to **test whether a Claude Code skill triggers**,
20
- **A/B-test Claude Code vs. Codex vs. Gemini** (or model vs. model, prompt vs.
21
- prompt), or **gate CI on coding-agent quality**. Unlike fixed datasets (SWE-bench,
20
+ **A/B-test Claude Code vs. Codex vs. Gemini vs. OpenCode** (or model vs. model,
21
+ prompt vs. prompt), or **gate CI on coding-agent quality**. Unlike fixed datasets (SWE-bench,
22
22
  SkillsBench) that rank models on a shared leaderboard, Coder Eval evaluates the
23
23
  tasks, skills, and workflows *you* ship — with weighted 0.0–1.0 criteria, a
24
24
  `skill_triggered` activation check, an A/B experiment layer, and per-tool cost
@@ -33,14 +33,14 @@ telemetry. See [How it compares](https://coder-eval.com/docs/comparison).
33
33
  - **Sandboxed execution** in isolated environments with resource limits
34
34
  - **Weighted, continuous scoring** (0.0–1.0) with fractional credit and thresholds
35
35
  - **Many criterion types** — from file checks to code similarity and LLM-graded rubrics
36
- - **Agent abstraction** — Claude Code, Codex, and Antigravity (Gemini) today, extensible via a plugin SPI
36
+ - **Agent abstraction** — Claude Code, Codex, Antigravity (Gemini), and OpenCode today, extensible via a plugin SPI
37
37
  - **Experiment layer** — A/B agent configs (models, tools, prompts) side-by-side
38
38
  - **Full telemetry** — every tool call, token counts, and cost, with real-time streaming
39
39
 
40
40
  ## What you can do with it
41
41
 
42
42
  - **Benchmark coding agents** — score an agent across a suite of tasks with weighted scoring and pass/fail thresholds
43
- - **Compare models & configs** — A/B-test Claude vs. Codex vs. Gemini, model vs. model, tool-on vs. tool-off, prompt vs. prompt
43
+ - **Compare models & configs** — A/B-test Claude vs. Codex vs. Gemini vs. OpenCode, model vs. model, tool-on vs. tool-off, prompt vs. prompt
44
44
  - **Evaluate skills** — verify an agent actually engages a target skill (`skill_triggered`) and score skill-driven suites (SkillsBench-style)
45
45
  - **Keep skills up to date in CI** — re-validate your skills on every change or on a schedule; catch silent regressions when models, prompts, or the skills themselves drift
46
46
  - **Gate CI on agent quality** — run the suite in GitHub Actions and fail the build on regressions
@@ -209,6 +209,7 @@ alone.
209
209
  | [Claude Code](docs/agents/CLAUDE_CODE.md) | Configuring and running the default Claude Code agent |
210
210
  | [Codex](docs/agents/CODEX.md) | Running the OpenAI Codex agent |
211
211
  | [Antigravity (Gemini)](docs/agents/ANTIGRAVITY.md) | Running the Google Antigravity / Gemini agent |
212
+ | [OpenCode](docs/agents/OPENCODE.md) | Running the OpenCode agent on open-weight models |
212
213
  | [Run-Limit Parity](docs/agents/HARNESS_PARITY.md) | What each run_limits field means on every harness |
213
214
  | [A/B Experiments](docs/AB_EXPERIMENTS.md) | Compare models / tools / prompts across the same tasks |
214
215
  | [Bring Your Own Dataset](docs/DATASETS.md) | Fan a single task out over a dataset |
@@ -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.4" # <-- kept in sync with releases by release.yml
44
+ default: "0.11.5" # <-- kept in sync with releases by release.yml
45
45
  run-dir:
46
46
  description: Run directory (--run-dir)
47
47
  required: false
@@ -49,15 +49,21 @@ COPY src/ ./src/
49
49
  COPY experiments/default.yaml ./experiments/default.yaml
50
50
 
51
51
  # Codex, Antigravity, and litellm are always baked into the image -- codex/
52
- # antigravity are peers to the claude-code agent installed above, so all
53
- # built-in agents ship in every build; litellm backs the `checker_context.
54
- # api_route.route: litellm` judge dispatch (see pyproject.toml's `litellm`
55
- # extra), which every DockerRunner-isolated task needs available IN-container
56
- # since the checker runs there too, not just on the host. `openai-codex`
57
- # (+ its pinned cli-bin), `google-antigravity` (which bundles its
58
- # `localharness` binary as a manylinux wheel), and `litellm` all come from
59
- # public PyPI, so this needs no private-index credentials. The RUN below
60
- # always passes `--extra codex --extra antigravity --extra litellm`.
52
+ # antigravity are peers to the claude-code agent installed above; litellm backs
53
+ # the `checker_context.api_route.route: litellm` judge dispatch (see
54
+ # pyproject.toml's `litellm` extra), which every DockerRunner-isolated task
55
+ # needs available IN-container since the checker runs there too, not just on the
56
+ # host. `openai-codex` (+ its pinned cli-bin), `google-antigravity` (which
57
+ # bundles its `localharness` binary as a manylinux wheel), and `litellm` all
58
+ # come from public PyPI, so this needs no private-index credentials. The RUN
59
+ # below always passes `--extra codex --extra antigravity --extra litellm`.
60
+ #
61
+ # NOT every built-in agent ships here: `opencode` is registered unconditionally
62
+ # but its CLI is a Node package (`npm install -g opencode-ai`), absent from this
63
+ # image, and no OpenCode credentials are in SandboxConfig.env_passthrough -- so
64
+ # `--driver docker` does not support it. Adding it means a pinned version that
65
+ # travels with the release tag (as CLAUDE_CODE_VERSION does) plus an
66
+ # env_passthrough block; see docs/agents/OPENCODE.md "Running in Docker".
61
67
  #
62
68
  # CODER_EVAL_UV_EXTRAS carries ADDITIONAL opt-in extras on top of those; it
63
69
  # defaults to none. `make docker-image-full` passes `--extra uipath`, which
@@ -130,7 +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
+ | `checker_context` | dict | Backend/model override for the judge side (llm_judge, agent_judge) — has no bearing on the simulator; see [Checker Context](TASK_DEFINITION_GUIDE.md#checker-context); **not** currently `-D`-reachable |
134
134
 
135
135
  The `agent` dict is the lever for most A/B tests. Anything on `AgentConfig` is
136
136
  fair game: `model`, `permission_mode`, `allowed_tools`, `disallowed_tools`,
@@ -181,7 +181,7 @@ variants:
181
181
  agent:
182
182
  plugins:
183
183
  - type: "local"
184
- path: "../skills" # skill available
184
+ path: ".." # PLUGIN ROOT holding skills/ — see note below
185
185
  ```
186
186
 
187
187
  Notes:
@@ -193,8 +193,14 @@ Notes:
193
193
  it. Pair the experiment with a [`skill_triggered`](TASK_DEFINITION_GUIDE.md#skill_triggered)
194
194
  criterion to measure _whether it fired_ alongside your real success criteria
195
195
  that measure _whether outcomes improved_.
196
+ - **`path` must be a plugin ROOT — a directory holding `skills/`** — so the skill
197
+ resolves at `<path>/skills/<name>/SKILL.md`. Point one level deeper, at the
198
+ directory of skill directories, and claude-code loads **nothing**: the `with-skill`
199
+ arm then silently matches the baseline and the A/B compares two identical arms.
200
+ Codex and Antigravity accept either depth, so this fails on claude-code alone —
201
+ see [Harness parity](agents/HARNESS_PARITY.md#agentpluginspath-accepts-different-depths-per-harness).
196
202
  - Plugin paths are environment-dependent. The shipped example expects a
197
- `$PLUGIN_PATH` env var pointing at your plugin directory. See
203
+ `$PLUGIN_PATH` env var pointing at your plugin **root**. See
198
204
  `experiments/plugin-comparison.yaml`.
199
205
 
200
206
  Run it:
@@ -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 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
63
+ - The simulator resolves its own `ApiRoute` independently of `checker_context.api_route` (that
64
+ override is judge-only see [Checker Context](TASK_DEFINITION_GUIDE.md#checker-context)) same
65
+ resolution as the coding agent's own route (`--backend direct` / `--backend bedrock`), including
66
+ the pin to a constant Claude backend when the agent itself runs on an open-weight LiteLLM route.
67
+ The **model** is separately
66
68
  pinned by `simulation.model` (see [Simulation](TASK_DEFINITION_GUIDE.md#simulation)), not inherited
67
69
  from the route — so an A/B varying the subject model doesn't silently vary the simulated user too.
68
70
 
@@ -285,8 +285,8 @@ The base package ships **no** plugin rates; only the built-in table.
285
285
  ## See also
286
286
 
287
287
  - [Claude Code](agents/CLAUDE_CODE.md) · [Codex](agents/CODEX.md) ·
288
- [Antigravity](agents/ANTIGRAVITY.md) the built-in agents, each registered via
289
- this same SPI
288
+ [Antigravity](agents/ANTIGRAVITY.md) · [OpenCode](agents/OPENCODE.md) the
289
+ built-in agents, each registered via this same SPI
290
290
  - [Task Definition Guide](TASK_DEFINITION_GUIDE.md) — the criterion catalogue
291
291
  - [CLAUDE.md](https://github.com/UiPath/coder_eval/blob/main/CLAUDE.md) — architecture
292
292
  and extension points in depth
@@ -106,10 +106,12 @@ It then:
106
106
  One prerequisite the suite cannot infer: the evaluated agent runs in a fresh
107
107
  sandbox holding none of your files, so it is offered no skills unless the task
108
108
  says where they live. The template reads that location from an environment
109
- variable — point it at the directory *containing* the skill's own directory:
109
+ variable — point it at a **plugin root**: a directory holding a `skills/`
110
+ subdirectory, so the skill sits at `<path>/skills/<skill-name>/SKILL.md`. For
111
+ `.claude/skills/pdf-forms/SKILL.md` that root is `.claude`, not `.claude/skills`:
110
112
 
111
113
  ```bash
112
- export SKILL_SOURCE_PATH="$(pwd)/.claude/skills"
114
+ export SKILL_SOURCE_PATH="$(pwd)/.claude"
113
115
  ```
114
116
 
115
117
  Leave it unset and the skill is simply absent, every positive row scores 0, and
@@ -64,7 +64,7 @@ reference: { ... } # Optional reference solution (a directory
64
64
  pre_run: [ ... ] # Optional pre-run commands (before agent starts)
65
65
  post_run: [ ... ] # Optional post-run commands
66
66
  dataset: { ... } # Optional dataset fan-out (one task -> N row-tasks)
67
- checker_context: { ... } # Optional: backend/model for the evaluation side (judge, simulator)
67
+ checker_context: { ... } # Optional: backend/model for the judge side (llm_judge/agent_judge)
68
68
  ```
69
69
 
70
70
  ### `dataset`
@@ -1308,11 +1308,11 @@ success_criteria:
1308
1308
 
1309
1309
  checker_context:
1310
1310
  api_route:
1311
- route: bedrock # which backend the whole eval side (llm_judge/agent_judge/simulator) uses
1311
+ route: bedrock # which backend the eval side uses
1312
1312
  model: claude-haiku-4-5 # model override for that route
1313
1313
  ```
1314
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).
1315
+ - `route` selects which backend `llm_judge` and `agent_judge` call they share one resolved eval route per run for `direct`/`bedrock`/`litellm` (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). The simulator is NOT part of this sharing: it always resolves its own route the same way the agent under test does (subprocess-safe by construction), independent of `checker_context.api_route` entirely — see the `route: litellm` note below. 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` ONLY** 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. `agent_judge` spawns a real Claude Code CLI subprocess that only speaks Anthropic Messages — combining `route: litellm` with an enabled `agent_judge` criterion is rejected at resolution time (see below); the simulator is unaffected since it never reads this override. 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
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
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
1318
  ```yaml
@@ -1327,7 +1327,7 @@ checker_context:
1327
1327
  api_key: LITELLM_AUTH_TOKEN
1328
1328
  ```
1329
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.
1330
+ **`route: litellm` has no bearing on the simulator** — the simulator is a real Claude Code CLI subprocess that speaks the Anthropic Messages protocol, so pointing it at an arbitrary litellm-fronted gateway (which may speak an entirely different wire protocol) isn't representable. Rather than rejecting a task that combines `route: litellm` with `simulation.enabled: true`, the simulator always resolves its own route independently of `checker_context.api_route` the same way the agent under test resolves its route — so `llm_judge` grades through the gateway named here while the simulator behaves exactly as if this override weren't set. A task can freely combine `route: litellm` with `simulation.enabled: true`; there is nothing to disable or remove. **`agent_judge` is NOT decoupled the same way** — it still shares the `llm_judge` eval route, and `agent_judge`'s Claude Code CLI subprocess has no way to honor a `LiteLLMRoute` safely, so the orchestrator rejects `route: litellm` combined with an enabled `agent_judge` criterion at resolution time (a clear error, not a silent misroute) — use `route: bedrock`/`direct` instead if a task needs both.
1331
1331
 
1332
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
1333
 
@@ -1613,7 +1613,7 @@ simulation:
1613
1613
  | `check_criteria` | `end_of_dialog` | `end_of_dialog`, `every_turn`, or `both`. |
1614
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. |
1615
1615
 
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.
1616
+ The simulator runs as a tools-disabled Claude Code agent on its own resolved `ApiRoute` (the same resolution as the coding agent's own route [`checker_context.api_route.route`](#checker-context) has no bearing on 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.
1617
1617
 
1618
1618
  **Semantics:**
1619
1619
 
@@ -39,7 +39,7 @@ coder-eval run tasks/hello_date.yaml --stream full # live LLM output
39
39
  | `-D path=value` / `--set` | Override any resolved task-config field (`agent`/`run_limits`/`sandbox` roots), e.g. `-D run_limits.max_turns=30 -D agent.permission_mode=plan -D agent.sdk_options.effort=high`. Repeatable; schema-validated. This is the way to set permission mode, turn/timeout limits, token/USD budget caps, tools, plugins, and SDK options. |
40
40
  | `--model, -m` | Shorthand alias for `-D agent.model=…` (e.g., `claude-sonnet-5`) |
41
41
  | `--driver` | Shorthand alias for `-D sandbox.driver=…` (`tempdir` or `docker`) |
42
- | `--type, -T` | Override agent type for all tasks (`claude-code`, `codex`, `antigravity`, or a plugin kind). |
42
+ | `--type, -T` | Override agent type for all tasks (`claude-code`, `codex`, `antigravity`, `opencode`, or a plugin kind). |
43
43
  | `--repeats` | Run each `(task, variant)` N times (≥1); overrides experiment/variant `repeats:`. See [Replicates](#replicates). |
44
44
  | `--resume` | Resume an interrupted run: skip tasks already finalized in `--run-dir` and run the rest, folding prior results into `run.json`. Requires `--run-dir`. A task with *any* final status (incl. FAILED/ERROR) counts as finalized, so resume does **not** retry failures — delete a task's `task.json` to force a re-run. A config mismatch is warned, not refused. |
45
45
  | `--sample N` | For dataset-backed tasks, run a fixed-seed random N-row sample (reproducible; cheap smoke test). See [Bring Your Own Dataset](DATASETS.md). |
@@ -98,7 +98,7 @@ agent:
98
98
  | `permission_mode` | default **`acceptEdits`** | `default` / `acceptEdits` / `plan` / `bypassPermissions` — semantics come from the Claude Code SDK. `plan` is read-only; `bypassPermissions` grants full autonomy. |
99
99
  | `allowed_tools` | `list[str] \| null` | Tool allowlist. Unset ⇒ all tools allowed. |
100
100
  | `disallowed_tools` | `list[str] \| null` | Tool denylist. (`ToolSearch` is always appended for Bedrock parity.) |
101
- | `plugins` | `list[{type: local, path}]` | Local plugin/skill directories; `$VAR` in `path` is expanded and resolved to an absolute path. |
101
+ | `plugins` | `list[{type: local, path}]` | Local plugin roots; `$VAR` in `path` is expanded and resolved to an absolute path. **`path` must hold a `skills/` subdirectory** — a bare directory of skill directories loads nothing here, though Codex and Antigravity accept it. See [Harness parity](HARNESS_PARITY.md#agentpluginspath-accepts-different-depths-per-harness). |
102
102
  | `system_prompt` | `str \| null` | **Appended** to the default Claude Code system prompt (via the SDK's `claude_code` preset) — the default's behavioral guidance is kept unless `system_prompt_mode: replace` opts out. Mutually exclusive with `system_prompt_file`. An empty or whitespace-only value is treated as unset. |
103
103
  | `system_prompt_mode` | `"append"` (default) / `"replace"` | `replace` sends `system_prompt` as the **entire** system prompt (no preset) and requires a non-blank `system_prompt` / `system_prompt_file` (validated at load). Used by judge sub-agents and the user simulator, which must not carry the coding-agent persona; rarely needed in tasks — see [the migration note](#migrating-tasks-that-set-system_prompt). |
104
104
  | `system_prompt_file` | `str \| null` | Path (relative to the task YAML) loaded into `system_prompt` at resolution. Works with either `system_prompt_mode`. |
@@ -183,6 +183,16 @@ simulator force `[]` for the same reason.)
183
183
  that call and scores skill-activation suites.
184
184
  - **Plugins** are supplied as `plugins: [{type: local, path: …}]`; the path is
185
185
  env-expanded and resolved to an absolute path before being handed to the SDK.
186
+ It must name a **plugin root** — a directory holding `skills/`, so the skill
187
+ resolves at `<path>/skills/<name>/SKILL.md`. One level deeper loads nothing, with
188
+ no error: every positive row of an activation suite then scores 0 and the suite
189
+ reports recall 0.0, which reads exactly like a skill that never triggers. Codex
190
+ and Antigravity scan both depths, so this is claude-code-only — see
191
+ [Harness parity](HARNESS_PARITY.md#agentpluginspath-accepts-different-depths-per-harness).
192
+ - A plugin root loads **everything** the plugin declares, not only `skills/`: an
193
+ `agents/`, `commands/` or `hooks/` directory beside it becomes visible to the
194
+ evaluated agent too. Point at a minimal root when the suite must measure one
195
+ skill in isolation.
186
196
  - **`PLUGIN_TOOLS_DIR`** pins the canonical `node_modules/@uipath` directory for
187
197
  UiPath CLI plugin discovery; when unset the sandbox derives it from the resolved
188
198
  `uip` binary. See [User Guide → Environment Variables](../USER_GUIDE.md#environment-variables).