coder-eval 0.8.8__tar.gz → 0.8.9__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 (560) hide show
  1. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-code-review.md +3 -3
  2. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/shared/multi-model-review.md +1 -1
  3. coder_eval-0.8.9/.github/ISSUE_TEMPLATE/adopter.yml +84 -0
  4. coder_eval-0.8.9/ADOPTERS.md +13 -0
  5. {coder_eval-0.8.8 → coder_eval-0.8.9}/CHANGELOG.md +97 -0
  6. {coder_eval-0.8.8 → coder_eval-0.8.9}/CLAUDE.md +2 -2
  7. {coder_eval-0.8.8 → coder_eval-0.8.9}/PKG-INFO +1 -1
  8. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/AB_EXPERIMENTS.md +2 -2
  9. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/TASK_DEFINITION_GUIDE.md +24 -5
  10. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/harness-badge.tsx +16 -3
  11. coder_eval-0.8.9/evalboard/app/_components/harness-selector.tsx +49 -0
  12. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_overview/tag-rail.tsx +15 -1
  13. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/page.tsx +30 -8
  14. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/path-to-ga/page.tsx +22 -7
  15. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/trends/__tests__/trends-view.test.tsx +11 -0
  16. coder_eval-0.8.9/evalboard/app/trends/actions.ts +18 -0
  17. coder_eval-0.8.9/evalboard/app/trends/page.tsx +163 -0
  18. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/trends/trends-view.tsx +30 -11
  19. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +27 -10
  20. coder_eval-0.8.9/evalboard/app/watchlist/page.tsx +87 -0
  21. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/watchlist/watchlist-view.tsx +23 -6
  22. {coder_eval-0.8.8 → coder_eval-0.8.9}/pyproject.toml +1 -1
  23. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/__init__.py +1 -1
  24. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/evaluate_command.py +14 -5
  25. coder_eval-0.8.9/src/coder_eval/criteria/skill_triggered.py +222 -0
  26. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/checker.py +9 -2
  27. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/formatting.py +6 -3
  28. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/criteria.py +39 -5
  29. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/results.py +38 -10
  30. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/sandbox.py +3 -2
  31. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/early_stop.py +70 -29
  32. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/reports.py +5 -1
  33. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/reports_experiment.py +51 -82
  34. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/reports_html.py +67 -33
  35. coder_eval-0.8.9/src/coder_eval/reports_stats.py +498 -0
  36. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/experiment_2variant.md +9 -4
  37. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/experiment_replicates.md +3 -1
  38. coder_eval-0.8.9/tests/fixtures/tasks/test_task_informational_criterion.yaml +17 -0
  39. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent.py +12 -0
  40. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_early_stop.py +217 -42
  41. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_evaluate_command.py +21 -0
  42. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_evaluator.py +2 -0
  43. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_reports.py +372 -9
  44. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_replicate_stats.py +64 -42
  45. coder_eval-0.8.9/tests/test_reports_stats_nonfinite.py +73 -0
  46. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_skill_triggered.py +209 -0
  47. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_suite_rollup.py +23 -0
  48. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_threshold_enforcement.py +102 -0
  49. {coder_eval-0.8.8 → coder_eval-0.8.9}/uv.lock +1 -1
  50. coder_eval-0.8.8/evalboard/app/trends/actions.ts +0 -10
  51. coder_eval-0.8.8/evalboard/app/trends/page.tsx +0 -88
  52. coder_eval-0.8.8/evalboard/app/watchlist/page.tsx +0 -12
  53. coder_eval-0.8.8/src/coder_eval/criteria/skill_triggered.py +0 -177
  54. coder_eval-0.8.8/src/coder_eval/reports_stats.py +0 -250
  55. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-code-review-full.md +0 -0
  56. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-code-review-wf.md +0 -0
  57. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-create-plan.md +0 -0
  58. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-implement-plan.md +0 -0
  59. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-review.md +0 -0
  60. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-run-analysis.md +0 -0
  61. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-task-create.md +0 -0
  62. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/harness-candidates.md +0 -0
  63. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/shared/axes.md +0 -0
  64. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/shared/review-rubric.md +0 -0
  65. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/shared/run-layout.md +0 -0
  66. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/workflows/cr-axis.js +0 -0
  67. {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/workflows/cr-parent.js +0 -0
  68. {coder_eval-0.8.8 → coder_eval-0.8.9}/.env.example +0 -0
  69. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/CODEOWNERS +0 -0
  70. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  71. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  72. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/code_review.md +0 -0
  73. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/dependabot.yml +0 -0
  74. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/claude-pr-review.yml +0 -0
  75. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/codeql.yml +0 -0
  76. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/conventional-commits.yml +0 -0
  77. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/docker-publish.yml +0 -0
  78. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/docs.yml +0 -0
  79. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/pr-checks.yml +0 -0
  80. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/publish-testpypi.yml +0 -0
  81. {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/release.yml +0 -0
  82. {coder_eval-0.8.8 → coder_eval-0.8.9}/.gitignore +0 -0
  83. {coder_eval-0.8.8 → coder_eval-0.8.9}/.pre-commit-config.yaml +0 -0
  84. {coder_eval-0.8.8 → coder_eval-0.8.9}/.python-version +0 -0
  85. {coder_eval-0.8.8 → coder_eval-0.8.9}/CODE_OF_CONDUCT.md +0 -0
  86. {coder_eval-0.8.8 → coder_eval-0.8.9}/CONTRIBUTING.md +0 -0
  87. {coder_eval-0.8.8 → coder_eval-0.8.9}/LICENSE +0 -0
  88. {coder_eval-0.8.8 → coder_eval-0.8.9}/Makefile +0 -0
  89. {coder_eval-0.8.8 → coder_eval-0.8.9}/NOTICE +0 -0
  90. {coder_eval-0.8.8 → coder_eval-0.8.9}/README.md +0 -0
  91. {coder_eval-0.8.8 → coder_eval-0.8.9}/SECURITY.md +0 -0
  92. {coder_eval-0.8.8 → coder_eval-0.8.9}/docker/Dockerfile +0 -0
  93. {coder_eval-0.8.8 → coder_eval-0.8.9}/docker/Dockerfile.runtime +0 -0
  94. {coder_eval-0.8.8 → coder_eval-0.8.9}/docker/coder_eval_entrypoint.sh +0 -0
  95. {coder_eval-0.8.8 → coder_eval-0.8.9}/docker/coder_eval_runtime_entrypoint.sh +0 -0
  96. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/BYOD.md +0 -0
  97. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/CODEX_AGENT_GUIDE.md +0 -0
  98. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/DOCKER_ISOLATION.md +0 -0
  99. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/IDEAS.md +0 -0
  100. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/USER_GUIDE.md +0 -0
  101. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/assets/hero.gif +0 -0
  102. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/comparison.md +0 -0
  103. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/index.md +0 -0
  104. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/llms.txt +0 -0
  105. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/01-first-evaluation.md +0 -0
  106. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/02-ci-pipeline.md +0 -0
  107. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/03-evalboard-local.md +0 -0
  108. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/04-writing-a-task.md +0 -0
  109. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/05-comparing-models.md +0 -0
  110. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/06-use-docker-isolation.md +0 -0
  111. {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/README.md +0 -0
  112. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/.gitignore +0 -0
  113. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/README.md +0 -0
  114. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
  115. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/col-help.tsx +0 -0
  116. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/collapsible-rail.tsx +0 -0
  117. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/scroll-table.tsx +0 -0
  118. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/search-box.tsx +0 -0
  119. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/unit-toggle.tsx +0 -0
  120. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/version-list.tsx +0 -0
  121. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/window-selector.tsx +0 -0
  122. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_overview/daily-chart.tsx +0 -0
  123. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
  124. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_overview/window-summary.tsx +0 -0
  125. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/api/download/route.ts +0 -0
  126. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/api/file/route.ts +0 -0
  127. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
  128. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/api/refresh/route.ts +0 -0
  129. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/error.tsx +0 -0
  130. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/globals.css +0 -0
  131. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/icon.png +0 -0
  132. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/layout.tsx +0 -0
  133. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/next-env.d.ts +0 -0
  134. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/next.config.mjs +0 -0
  135. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/package.json +0 -0
  136. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/pnpm-lock.yaml +0 -0
  137. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/postcss.config.mjs +0 -0
  138. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/public/harness/antigravity.png +0 -0
  139. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/public/harness/claude-code.png +0 -0
  140. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/public/harness/codex.png +0 -0
  141. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/public/uipath.png +0 -0
  142. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/tailwind.config.ts +0 -0
  143. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/tsconfig.json +0 -0
  144. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/vitest.config.ts +0 -0
  145. {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/vitest.setup.ts +0 -0
  146. {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/default.yaml +0 -0
  147. {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/early-stop-ab.yaml +0 -0
  148. {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/model-comparison.yaml +0 -0
  149. {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/permissions-smoke.yaml +0 -0
  150. {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/plugin-comparison.yaml +0 -0
  151. {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/prompt-mutations-example.yaml +0 -0
  152. {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/smoke_variants.yaml +0 -0
  153. {coder_eval-0.8.8 → coder_eval-0.8.9}/mkdocs.yml +0 -0
  154. {coder_eval-0.8.8 → coder_eval-0.8.9}/osv-scanner.toml +0 -0
  155. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/.gitattributes +0 -0
  156. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agent.py +0 -0
  157. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/__init__.py +0 -0
  158. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/_logging.py +0 -0
  159. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/antigravity_agent.py +0 -0
  160. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/claude_code_agent.py +0 -0
  161. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/codex_agent.py +0 -0
  162. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/noop_agent.py +0 -0
  163. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/registry.py +0 -0
  164. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/watchdog.py +0 -0
  165. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/analysis.py +0 -0
  166. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/__init__.py +0 -0
  167. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/aggregate_command.py +0 -0
  168. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/console.py +0 -0
  169. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/plan_command.py +0 -0
  170. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/report_command.py +0 -0
  171. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/run_command.py +0 -0
  172. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/run_helpers.py +0 -0
  173. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/run_task_internal_command.py +0 -0
  174. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/utils.py +0 -0
  175. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/config.py +0 -0
  176. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/__init__.py +0 -0
  177. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
  178. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/agent_judge.py +0 -0
  179. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/base.py +0 -0
  180. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/classification_match.py +0 -0
  181. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/command_executed.py +0 -0
  182. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/commands_efficiency.py +0 -0
  183. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/file_check.py +0 -0
  184. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/file_contains.py +0 -0
  185. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/file_exists.py +0 -0
  186. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/file_matches_regex.py +0 -0
  187. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/json_check.py +0 -0
  188. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/llm_judge.py +0 -0
  189. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/reference_comparison.py +0 -0
  190. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/run_command.py +0 -0
  191. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/uipath_eval.py +0 -0
  192. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/__init__.py +0 -0
  193. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/agent.py +0 -0
  194. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/budget.py +0 -0
  195. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/categories.py +0 -0
  196. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/categorization.py +0 -0
  197. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/executor.py +0 -0
  198. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/judge.py +0 -0
  199. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/retry.py +0 -0
  200. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/timeout.py +0 -0
  201. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/__init__.py +0 -0
  202. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
  203. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
  204. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_context.py +0 -0
  205. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_models.py +0 -0
  206. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_persistence.py +0 -0
  207. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_usage.py +0 -0
  208. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/sub_agent.py +0 -0
  209. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/summaries.py +0 -0
  210. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/verdict_tool.py +0 -0
  211. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/isolation/__init__.py +0 -0
  212. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/isolation/docker_runner.py +0 -0
  213. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/logging_config.py +0 -0
  214. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/__init__.py +0 -0
  215. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/agent_config.py +0 -0
  216. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/container_paths.py +0 -0
  217. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/enums.py +0 -0
  218. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/experiment.py +0 -0
  219. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/judge.py +0 -0
  220. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/judge_defaults.py +0 -0
  221. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/limits.py +0 -0
  222. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/merge_strategy.py +0 -0
  223. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/mutations.py +0 -0
  224. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/routing.py +0 -0
  225. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/tasks.py +0 -0
  226. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/telemetry.py +0 -0
  227. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/templates.py +0 -0
  228. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/__init__.py +0 -0
  229. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/batch.py +0 -0
  230. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/config.py +0 -0
  231. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/config_merge.py +0 -0
  232. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/evaluation.py +0 -0
  233. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/experiment.py +0 -0
  234. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/overrides.py +0 -0
  235. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/task_loader.py +0 -0
  236. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestrator.py +0 -0
  237. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/path_utils.py +0 -0
  238. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/plugins.py +0 -0
  239. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/pricing.py +0 -0
  240. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/py.typed +0 -0
  241. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/resources/__init__.py +0 -0
  242. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
  243. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/resources/tags.yaml +0 -0
  244. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/sandbox.py +0 -0
  245. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/__init__.py +0 -0
  246. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/ast_similarity.py +0 -0
  247. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/complexity.py +0 -0
  248. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/quality.py +0 -0
  249. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/signature_similarity.py +0 -0
  250. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/similarity.py +0 -0
  251. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/token_similarity.py +0 -0
  252. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/simulation/__init__.py +0 -0
  253. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/simulation/termination.py +0 -0
  254. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/simulation/user_simulator.py +0 -0
  255. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/__init__.py +0 -0
  256. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/callbacks.py +0 -0
  257. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/collector.py +0 -0
  258. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/events.py +0 -0
  259. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/renderers.py +0 -0
  260. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/wire.py +0 -0
  261. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/telemetry.py +0 -0
  262. {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/utils.py +0 -0
  263. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/README.md +0 -0
  264. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agentless_smoke_test.yaml +0 -0
  265. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/antigravity_hello_world.yaml +0 -0
  266. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
  267. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/claude_hello_world.yaml +0 -0
  268. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/claude_hello_world_docker.yaml +0 -0
  269. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
  270. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/claude_subagent_test.yaml +0 -0
  271. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
  272. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_hello_world.yaml +0 -0
  273. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_parallel_commands.yaml +0 -0
  274. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
  275. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_skills_test.yaml +0 -0
  276. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_string_utils.yaml +0 -0
  277. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_subagent_test.yaml +0 -0
  278. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/subagent_bash_long_input.yaml +0 -0
  279. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/subagent_merge_sort.yaml +0 -0
  280. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/byod_smoke_test.yaml +0 -0
  281. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dataset_example.yaml +0 -0
  282. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/datasets/sentiment.jsonl +0 -0
  283. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
  284. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
  285. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
  286. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/environment/input.txt +0 -0
  287. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
  288. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
  289. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/fibonacci_with_template.yaml +0 -0
  290. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/hello_date.yaml +0 -0
  291. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/inline_starter_example.yaml +0 -0
  292. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/internal/session_resumption.yaml +0 -0
  293. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_smoke.yaml +0 -0
  294. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
  295. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
  296. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
  297. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
  298. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
  299. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
  300. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
  301. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
  302. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
  303. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
  304. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
  305. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
  306. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/README.md +0 -0
  307. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
  308. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
  309. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
  310. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
  311. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
  312. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
  313. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
  314. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
  315. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
  316. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
  317. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/sentiment_classification.yaml +0 -0
  318. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_agent_judge.yaml +0 -0
  319. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_budget_exceeded.yaml +0 -0
  320. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
  321. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_llm_judge.yaml +0 -0
  322. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_negative_path.yaml +0 -0
  323. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_task_timeout.yaml +0 -0
  324. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_variants.yaml +0 -0
  325. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/test_sandbox.yaml +0 -0
  326. {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/token_check.yaml +0 -0
  327. {coder_eval-0.8.8 → coder_eval-0.8.9}/templates/byod_smoke_test/Dockerfile +0 -0
  328. {coder_eval-0.8.8 → coder_eval-0.8.9}/templates/fibonacci-starter/README.md +0 -0
  329. {coder_eval-0.8.8 → coder_eval-0.8.9}/templates/fibonacci-starter/src/main.py +0 -0
  330. {coder_eval-0.8.8 → coder_eval-0.8.9}/templates/fibonacci-starter/tests/test_main.py +0 -0
  331. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/__init__.py +0 -0
  332. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/__init__.py +0 -0
  333. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/__init__.py +0 -0
  334. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/_scrub.py +0 -0
  335. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
  336. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
  337. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
  338. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
  339. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
  340. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
  341. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
  342. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
  343. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
  344. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
  345. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
  346. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
  347. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
  348. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
  349. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
  350. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
  351. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
  352. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
  353. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
  354. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
  355. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/__init__.py +0 -0
  356. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
  357. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
  358. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/run_full.md +0 -0
  359. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
  360. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_path_helpers.py +0 -0
  361. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/conftest.py +0 -0
  362. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/__init__.py +0 -0
  363. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
  364. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
  365. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/mock_agent.py +0 -0
  366. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
  367. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
  368. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/text_stub_agent.py +0 -0
  369. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/__init__.py +0 -0
  370. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/__init__.py +0 -0
  371. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/base.py +0 -0
  372. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
  373. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
  374. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
  375. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
  376. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
  377. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
  378. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
  379. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
  380. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
  381. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
  382. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
  383. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
  384. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_agent_timing_access.py +0 -0
  385. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
  386. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
  387. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_silent_except.py +0 -0
  388. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_submodule_model_imports.py +0 -0
  389. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
  390. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
  391. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
  392. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/open_explicit_encoding.py +0 -0
  393. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
  394. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/register_criterion_required.py +0 -0
  395. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
  396. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
  397. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/runner.py +0 -0
  398. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/violation.py +0 -0
  399. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_config_no_timing_fields.py +0 -0
  400. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_config_optional_type.py +0 -0
  401. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_config_registry_dispatch.py +0 -0
  402. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_config_sdk_decoupling.py +0 -0
  403. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_golden_master.py +0 -0
  404. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_judge_criterion.py +0 -0
  405. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_telemetry.py +0 -0
  406. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_telemetry_advanced.py +0 -0
  407. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_timeout.py +0 -0
  408. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agentless.py +0 -0
  409. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_aggregate.py +0 -0
  410. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_antigravity_agent.py +0 -0
  411. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_byoa_plugin.py +0 -0
  412. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_byoa_plugin_live.py +0 -0
  413. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_byod_feature.py +0 -0
  414. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_checker_logging.py +0 -0
  415. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_classification_match.py +0 -0
  416. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_claude_settings_enforcement_live.py +0 -0
  417. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cleanup_preservation_guard.py +0 -0
  418. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_backend_flag.py +0 -0
  419. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_empty_glob.py +0 -0
  420. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_sdk_options.py +0 -0
  421. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_set_overrides.py +0 -0
  422. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_telemetry.py +0 -0
  423. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_type_flag.py +0 -0
  424. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_code_review_bugs.py +0 -0
  425. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_codex_agent.py +0 -0
  426. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_codex_agent_live.py +0 -0
  427. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_codex_agent_unit.py +0 -0
  428. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_codex_token_mapping.py +0 -0
  429. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_command_executed.py +0 -0
  430. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_command_statistics.py +0 -0
  431. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_command_telemetry_result_data.py +0 -0
  432. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_commands_efficiency.py +0 -0
  433. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_config_lineage.py +0 -0
  434. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_config_merge_engine.py +0 -0
  435. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_config_precedence.py +0 -0
  436. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_continuous_scoring.py +0 -0
  437. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_criterion_result_round_trip.py +0 -0
  438. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_custom_lint.py +0 -0
  439. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_dataset_expansion.py +0 -0
  440. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_debug_logging.py +0 -0
  441. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_build_failure.py +0 -0
  442. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_runner_container_death.py +0 -0
  443. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_runner_mounts.py +0 -0
  444. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_runner_stream_limit.py +0 -0
  445. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_wildcard_env.py +0 -0
  446. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_workdir_live.py +0 -0
  447. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_driver_resolver.py +0 -0
  448. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_error_handling.py +0 -0
  449. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_event_collector.py +0 -0
  450. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_cli.py +0 -0
  451. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_loader.py +0 -0
  452. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_models.py +0 -0
  453. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_resolver.py +0 -0
  454. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_runner.py +0 -0
  455. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_file_check.py +0 -0
  456. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_file_contains_scoring.py +0 -0
  457. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_formatting.py +0 -0
  458. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_git_clone_failure.py +0 -0
  459. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_heartbeat_watchdog.py +0 -0
  460. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_ignore_patterns_negation.py +0 -0
  461. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_image_from_dockerfiles.py +0 -0
  462. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_integration.py +0 -0
  463. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_json_check.py +0 -0
  464. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_anthropic.py +0 -0
  465. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_bedrock.py +0 -0
  466. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_burn_in_live.py +0 -0
  467. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_context_builder.py +0 -0
  468. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_models.py +0 -0
  469. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_persistence.py +0 -0
  470. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_lint_no_top_level_run_limits.py +0 -0
  471. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_lint_runner.py +0 -0
  472. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_llm_judge_criterion.py +0 -0
  473. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_log_tail_buffer.py +0 -0
  474. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_logging.py +0 -0
  475. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_logging_isolation.py +0 -0
  476. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_merge_characterization.py +0 -0
  477. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_merge_strategy_annotations.py +0 -0
  478. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_merge_unification.py +0 -0
  479. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_models.py +0 -0
  480. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_mutations.py +0 -0
  481. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_new_criteria.py +0 -0
  482. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_node_env_config.py +0 -0
  483. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_optional_dependencies.py +0 -0
  484. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_orchestrator.py +0 -0
  485. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_orchestrator_error_log_tail.py +0 -0
  486. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_orchestrator_telemetry.py +0 -0
  487. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_overrides_engine.py +0 -0
  488. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_parallel.py +0 -0
  489. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_path_utils.py +0 -0
  490. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_plan_command.py +0 -0
  491. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_plugin_processing.py +0 -0
  492. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_plugins.py +0 -0
  493. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_post_run.py +0 -0
  494. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_pr_review_workflow.py +0 -0
  495. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_pre_run.py +0 -0
  496. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_preservation_mode.py +0 -0
  497. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_pricing_registry.py +0 -0
  498. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_comparison_scoring.py +0 -0
  499. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_evaluator.py +0 -0
  500. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_missing_file.py +0 -0
  501. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_models.py +0 -0
  502. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_orchestrator.py +0 -0
  503. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_registry.py +0 -0
  504. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_report_command.py +0 -0
  505. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reports.py +0 -0
  506. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reports_experiment.py +0 -0
  507. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reports_html.py +0 -0
  508. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reports_stats.py +0 -0
  509. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_resolve_task_files.py +0 -0
  510. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_resume.py +0 -0
  511. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_retry_logic_comprehensive.py +0 -0
  512. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_routing.py +0 -0
  513. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_run_command_stdout.py +0 -0
  514. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_run_limits_models.py +0 -0
  515. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_run_limits_orchestrator.py +0 -0
  516. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_run_limits_resolver.py +0 -0
  517. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_runtime_tool_versions.py +0 -0
  518. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox.py +0 -0
  519. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_layer_builder.py +0 -0
  520. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_optional.py +0 -0
  521. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_security.py +0 -0
  522. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_symlink_preservation.py +0 -0
  523. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_templates.py +0 -0
  524. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_scorers.py +0 -0
  525. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_scoring_quality.py +0 -0
  526. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sdk_option_classification.py +0 -0
  527. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_simulation_config.py +0 -0
  528. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_simulation_integration.py +0 -0
  529. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_simulation_termination.py +0 -0
  530. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_simulation_trials.py +0 -0
  531. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_agent_integration.py +0 -0
  532. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_batch.py +0 -0
  533. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_callbacks.py +0 -0
  534. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_cli.py +0 -0
  535. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_events.py +0 -0
  536. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_orchestrator.py +0 -0
  537. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_renderers.py +0 -0
  538. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_wire.py +0 -0
  539. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sub_agent_runner.py +0 -0
  540. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_success_criterion_union.py +0 -0
  541. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_summaries.py +0 -0
  542. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_tags.py +0 -0
  543. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_task_definition_unknown_fields.py +0 -0
  544. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_teardown_interrupt.py +0 -0
  545. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_telemetry.py +0 -0
  546. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_template_env_expansion.py +0 -0
  547. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_batch.py +0 -0
  548. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_categorization.py +0 -0
  549. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_exceptions.py +0 -0
  550. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_models.py +0 -0
  551. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_orchestrator.py +0 -0
  552. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_token_usage.py +0 -0
  553. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_uipath_eval.py +0 -0
  554. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_user_simulator.py +0 -0
  555. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_utils.py +0 -0
  556. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_utterance_extraction.py +0 -0
  557. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_variant_prompt_file.py +0 -0
  558. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_verdict_tool.py +0 -0
  559. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_watchdog.py +0 -0
  560. {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_yaml_migration.py +0 -0
@@ -12,7 +12,7 @@ description: Run a multi-model code review on uncommitted changes or a described
12
12
 
13
13
  Run a thorough code review using multiple AI models in parallel, then fix all high-confidence medium-severity and above findings.
14
14
 
15
- **Cost note**: This command runs `make verify` + a multi-model review (`gemini-3` + `codex` via MCP, plus an Opus sub-agent) + automatic fixes. Expensive in time and tokens. Use this for changes you're about to ship; for broad codebase audits use `/coder-eval-code-review-full`; for quick local checks, run targeted tools (`ruff`, `pyright`, `pytest`) directly.
15
+ **Cost note**: This command runs `make verify` + a multi-model review (`gemini-3` + `gpt-5` via MCP, plus an Opus sub-agent) + automatic fixes. Expensive in time and tokens. Use this for changes you're about to ship; for broad codebase audits use `/coder-eval-code-review-full`; for quick local checks, run targeted tools (`ruff`, `pyright`, `pytest`) directly.
16
16
 
17
17
  Input: $ARGUMENTS
18
18
 
@@ -65,7 +65,7 @@ If it fails, report what's failing and stop — code review on broken code is pr
65
65
 
66
66
  Launch two reviews **in parallel**:
67
67
 
68
- **Review A — Multi-model (via `mcp__multi__codereview`)**: run it per the shared procedure in `.claude/shared/multi-model-review.md` — `models: ["gemini-3", "codex"]`, `relevant_files` = absolute paths of all changed files, `content` = a review request citing the Severity Standard, Review Principles, and Checklist. **Heed the multi-step protocol described there** (the step-1 response is usually an `in_progress` checklist, not findings — you must make the `step_number: 2` follow-up call with the same `thread_id`). Falls back to two Opus sub-agents if the tool is unavailable.
68
+ **Review A — Multi-model (via `mcp__multi__codereview`)**: run it per the shared procedure in `.claude/shared/multi-model-review.md` — `models: ["gemini-3", "gpt-5"]`, `relevant_files` = absolute paths of all changed files, `content` = a review request citing the Severity Standard, Review Principles, and Checklist. **Heed the multi-step protocol described there** (the step-1 response is usually an `in_progress` checklist, not findings — you must make the `step_number: 2` follow-up call with the same `thread_id`). Falls back to two Opus sub-agents if the tool is unavailable.
69
69
 
70
70
  **Review B — Opus sub-agent**: Use the `Agent` tool with `model: "opus"`. Give it the list of changed files and the following specialized tasks to run in parallel internally:
71
71
 
@@ -120,7 +120,7 @@ across sessions and provides forensic context if a fix later proves wrong:
120
120
  - Git SHA: <`git rev-parse HEAD`>
121
121
  - Branch: <`git rev-parse --abbrev-ref HEAD`>
122
122
  - Scope: <uncommitted | described "<input>" | last commit>
123
- - Reviewers: <e.g. gemini-3, codex, opus-fallback-1, opus-fallback-2 — list actual reviewers used>
123
+ - Reviewers: <e.g. gemini-3, gpt-5, opus-fallback-1, opus-fallback-2 — list actual reviewers used>
124
124
 
125
125
  ### Scope
126
126
  - Files reviewed: (list)
@@ -14,7 +14,7 @@ If `mcp__multi__codereview` is available (check the deferred-tools list; if list
14
14
  but not loaded, load it with `ToolSearch` → `select:mcp__multi__codereview`), call
15
15
  it with:
16
16
 
17
- - `models`: the strongest available (e.g. `["gemini-3", "codex"]`)
17
+ - `models`: the strongest available (e.g. `["gemini-3", "gpt-5"]` — as of July 2026 these resolve to `gemini-3.1-pro-preview` and `gpt-5.6-sol`; check `mcp__multi__models` if unsure)
18
18
  - `relevant_files`: absolute paths of every changed / in-scope file
19
19
  - `content`: the review request, citing the consumer's rubric (the shared **Review Criteria**, the **Severity Standard**, etc.)
20
20
  - `base_path`: project root
@@ -0,0 +1,84 @@
1
+ name: Adopter — we're using coder_eval
2
+ description: Tell us your team uses coder_eval so we can add you to ADOPTERS.md
3
+ title: "[adopter] <organization>"
4
+ labels: ["adopter"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for using coder_eval! Adopter entries help other teams see the project is
10
+ real and in production, and they tell us which use cases to keep supporting.
11
+
12
+ Everything below is optional except the organization and how you use it. We only
13
+ publish what you explicitly allow here.
14
+ - type: input
15
+ id: organization
16
+ attributes:
17
+ label: Organization
18
+ description: The name you'd like listed.
19
+ placeholder: Acme Corp
20
+ validations:
21
+ required: true
22
+ - type: input
23
+ id: website
24
+ attributes:
25
+ label: Website
26
+ placeholder: https://example.com
27
+ validations:
28
+ required: false
29
+ - type: textarea
30
+ id: usage
31
+ attributes:
32
+ label: How do you use coder_eval?
33
+ description: |
34
+ A sentence or two. What do you evaluate — Claude Code skills, agent A/B tests,
35
+ CI quality gates, your own repos — and roughly at what scale?
36
+ placeholder: |
37
+ We gate CI on a suite of ~40 YAML tasks that check our internal Claude Code
38
+ skills still trigger, and A/B Claude Code against Codex each release.
39
+ validations:
40
+ required: true
41
+ - type: dropdown
42
+ id: listing
43
+ attributes:
44
+ label: How may we list you?
45
+ description: |
46
+ Pick the most you're comfortable with. **Logo use needs someone who can approve
47
+ trademark use for your organization** — if that isn't you, choose a name-only or
48
+ private option and we'll follow up.
49
+ options:
50
+ - Name only, in ADOPTERS.md
51
+ - Name in ADOPTERS.md and on the project website
52
+ - Name and logo in ADOPTERS.md and on the project website
53
+ - Please don't list us publicly — this is just for the maintainers
54
+ default: 0
55
+ validations:
56
+ required: true
57
+ - type: checkboxes
58
+ id: logo-permission
59
+ attributes:
60
+ label: Trademark permission
61
+ description: Only required if you selected a logo option above.
62
+ options:
63
+ - label: >-
64
+ I am authorized to grant this permission on behalf of my organization, and I
65
+ grant the coder_eval maintainers a non-exclusive, revocable license to display
66
+ our name and logo as an adopter in ADOPTERS.md and on the project website. We
67
+ can withdraw it at any time by commenting on this issue.
68
+ required: false
69
+ - type: input
70
+ id: contact
71
+ attributes:
72
+ label: Contact
73
+ description: GitHub handle or email, so we can reach you before publishing anything.
74
+ validations:
75
+ required: false
76
+ - type: checkboxes
77
+ id: case-study
78
+ attributes:
79
+ label: Anything else?
80
+ options:
81
+ - label: We'd be open to a short case study or a talk about our setup.
82
+ required: false
83
+ - label: We'd like to hear about breaking changes before they ship.
84
+ required: false
@@ -0,0 +1,13 @@
1
+ # Adopters
2
+
3
+ Teams and organizations using `coder_eval` in their development or CI workflows.
4
+
5
+ Using it? [Open an adopter issue](https://github.com/UiPath/coder_eval/issues/new?template=adopter.yml)
6
+ and we'll add you here. Name-only listings are welcome — a logo is never required.
7
+
8
+ Every entry below is published with the organization's permission, and any of them can be
9
+ removed on request by opening an issue.
10
+
11
+ | Organization | How they use it |
12
+ |---|---|
13
+ | [UiPath](https://www.uipath.com) | Nightly evaluation of internal Claude Code skills and agent A/B experiments; maintains `coder_eval`. |
@@ -2,6 +2,103 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.8.9 (2026-07-23)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Code review fixes for welch-t-test-exact ([#38](https://github.com/UiPath/coder_eval/pull/38),
10
+ [`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
11
+
12
+ - Render weight:0 criteria as informational on every display surface
13
+ ([#34](https://github.com/UiPath/coder_eval/pull/34),
14
+ [`9a34e90`](https://github.com/UiPath/coder_eval/commit/9a34e90bba2854316149cad61613a75dd3bd91e4))
15
+
16
+ - Weight:0 un-gates criteria (informational criteria)
17
+ ([#34](https://github.com/UiPath/coder_eval/pull/34),
18
+ [`9a34e90`](https://github.com/UiPath/coder_eval/commit/9a34e90bba2854316149cad61613a75dd3bd91e4))
19
+
20
+ - Weight:0 un-gates criteria and renders as informational
21
+ ([#34](https://github.com/UiPath/coder_eval/pull/34),
22
+ [`9a34e90`](https://github.com/UiPath/coder_eval/commit/9a34e90bba2854316149cad61613a75dd3bd91e4))
23
+
24
+ - **early-stop**: Decide skill activation on the tool call, not its result
25
+ ([#43](https://github.com/UiPath/coder_eval/pull/43),
26
+ [`d34aa97`](https://github.com/UiPath/coder_eval/commit/d34aa97416ae3af09d09cdf78cb6607b4e2e6f7c))
27
+
28
+ - **early-stop**: Latch skill activation on any engagement, not first
29
+ ([#43](https://github.com/UiPath/coder_eval/pull/43),
30
+ [`d34aa97`](https://github.com/UiPath/coder_eval/commit/d34aa97416ae3af09d09cdf78cb6607b4e2e6f7c))
31
+
32
+ - **evalboard**: Match watchlist skeleton header to avoid layout shift
33
+ ([#45](https://github.com/UiPath/coder_eval/pull/45),
34
+ [`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
35
+
36
+ - **reports**: 1/2 — exact Student-t p-values in welch_t_test
37
+ ([#38](https://github.com/UiPath/coder_eval/pull/38),
38
+ [`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
39
+
40
+ - **reports**: Exact Student-t p-values and a paired comparison section
41
+ ([#38](https://github.com/UiPath/coder_eval/pull/38),
42
+ [`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
43
+
44
+ - **reports**: Fail loud on t* overflow; surface excluded paired tasks
45
+ ([#38](https://github.com/UiPath/coder_eval/pull/38),
46
+ [`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
47
+
48
+ - **reports**: One source of truth for variant series and paired stats
49
+ ([#38](https://github.com/UiPath/coder_eval/pull/38),
50
+ [`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
51
+
52
+ - **reports**: Validate confidence and n_resamples in bootstrap_mean_ci
53
+ ([#38](https://github.com/UiPath/coder_eval/pull/38),
54
+ [`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
55
+
56
+ ### Chores
57
+
58
+ - **harness**: Defer two guards from the welch-t-test-exact run
59
+ ([#38](https://github.com/UiPath/coder_eval/pull/38),
60
+ [`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
61
+
62
+ ### Documentation
63
+
64
+ - Add adopter issue template and ADOPTERS.md ([#40](https://github.com/UiPath/coder_eval/pull/40),
65
+ [`bfbed4e`](https://github.com/UiPath/coder_eval/commit/bfbed4e4a2ca857167fac2cb15462b7159e97684))
66
+
67
+ - Switch multi-model review from codex to gpt-5 alias
68
+ ([#36](https://github.com/UiPath/coder_eval/pull/36),
69
+ [`0a3f2a7`](https://github.com/UiPath/coder_eval/commit/0a3f2a71a0a1e1e56f42a668fff57bac06eb99ec))
70
+
71
+ ### Features
72
+
73
+ - **evalboard**: Make all pages harness-aware and stream tables
74
+ ([#45](https://github.com/UiPath/coder_eval/pull/45),
75
+ [`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
76
+
77
+ - **evalboard**: Make analytics surfaces harness-aware and stream tables
78
+ ([#45](https://github.com/UiPath/coder_eval/pull/45),
79
+ [`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
80
+
81
+ - **evalboard**: Scope task trends to one harness
82
+ ([#45](https://github.com/UiPath/coder_eval/pull/45),
83
+ [`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
84
+
85
+ - **reports**: 2/2 — add a Paired Comparison section to experiment reports
86
+ ([#38](https://github.com/UiPath/coder_eval/pull/38),
87
+ [`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
88
+
89
+ ### Refactoring
90
+
91
+ - **evalboard**: Address review nits on harness plumbing
92
+ ([#45](https://github.com/UiPath/coder_eval/pull/45),
93
+ [`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
94
+
95
+ ### Testing
96
+
97
+ - **early-stop**: Cover second-review items (two-AgentStart, golden corpus, parity)
98
+ ([#43](https://github.com/UiPath/coder_eval/pull/43),
99
+ [`d34aa97`](https://github.com/UiPath/coder_eval/commit/d34aa97416ae3af09d09cdf78cb6607b4e2e6f7c))
100
+
101
+
5
102
  ## v0.8.8 (2026-07-22)
6
103
 
7
104
  ### Bug Fixes
@@ -35,7 +35,7 @@ coder_eval/
35
35
  │ ├── criteria.py # 14 success criterion types + base + union
36
36
  │ ├── experiment.py # ExperimentDefinition, ExperimentVariant, ResolvedTask, result models
37
37
  │ ├── judge_defaults.py # DEFAULT_JUDGE_MODEL constant (cycle-free leaf)
38
- │ ├── mutations.py # PromptMutation variants (prefix/suffix/replace/template/rephrase)
38
+ │ ├── mutations.py # PromptMutation variants (prefix/suffix/replace/template)
39
39
  │ ├── results.py # CriterionResult (+ ClassificationCriterionResult), TurnRecord, EvaluationResult, EarlyStopInfo/EarlyStopReason, CriterionAggregate, ThresholdCheck, SuiteRollup
40
40
  │ ├── routing.py # ApiRoute (DirectRoute/BedrockRoute)
41
41
  │ ├── sandbox.py # SandboxConfig, ResourceLimits
@@ -294,7 +294,7 @@ Tasks are YAML files. See [docs/TASK_DEFINITION_GUIDE.md](docs/TASK_DEFINITION_G
294
294
 
295
295
  **Runtime (always)**: pydantic, pydantic-settings, pyyaml, typer, rich, python-dotenv, anthropic, claude-agent-sdk, anyio, radon, tqdm, jmespath, jsonschema
296
296
 
297
- **Runtime (optional, `[uipath]` extra)**: uipath — the in-host `uipath` SDK (handy for local sandbox parity with tasks that invoke `uv run uipath eval ...`). Base installs without this extra still run end-to-end; UiPath-dependent paths fail at dispatch with a clear `pip install 'coder-eval[uipath]'` hint. The LLM judge and the `rephrase` mutation no longer use the LLM Gateway client — they route through the run's backend (Bedrock / Anthropic), so `uipath-llmgw-client` is no longer a dependency.
297
+ **Runtime (optional, `[uipath]` extra)**: uipath — the in-host `uipath` SDK (handy for local sandbox parity with tasks that invoke `uv run uipath eval ...`). Base installs without this extra still run end-to-end; UiPath-dependent paths fail at dispatch with a clear `pip install 'coder-eval[uipath]'` hint. The LLM judge no longer uses the LLM Gateway client — it routes through the run's backend (Bedrock / Anthropic), so `uipath-llmgw-client` is no longer a dependency.
298
298
 
299
299
  **Dev**: pytest, pytest-asyncio, pytest-mock, pytest-cov, ruff, pyright, pip-audit, bandit, pre-commit, mcp
300
300
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coder-eval
3
- Version: 0.8.8
3
+ Version: 0.8.9
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
@@ -227,8 +227,8 @@ variants:
227
227
  text: "\n\nThink step by step and validate your work before finishing."
228
228
  ```
229
229
 
230
- The full mutation catalog (prefix / suffix / replace / template / rephrase) is
231
- defined in `coder_eval/models/mutations.py`.
230
+ The full mutation catalog (prefix / suffix / replace / template) is defined in
231
+ `coder_eval/models/mutations.py`.
232
232
 
233
233
  ## Recipe: Smoke vs. e2e Flavors (Early Stop)
234
234
 
@@ -275,11 +275,17 @@ sandbox:
275
275
  - "!node_modules"
276
276
  - "*.bak" # bare entry adds an extra pattern
277
277
  limits: # Optional: resource limits
278
- timeout: 300 # Enforced via subprocess timeout
279
- max_memory_mb: 512 # NOT enforced (reserved for future use)
280
- max_disk_mb: 1024 # NOT enforced (reserved for future use)
278
+ timeout: 300 # Enforced via subprocess timeout (both drivers)
279
+ max_memory_mb: 512 # driver:docker -> `--memory`; ignored under tempdir
280
+ max_cpus: 2 # driver:docker -> `--cpus`; ignored under tempdir
281
+ max_pids: 512 # driver:docker -> `--pids-limit`; ignored under tempdir
282
+ max_disk_mb: 1024 # NOT enforced (reserved: no portable docker knob)
281
283
  ```
282
284
 
285
+ Under `driver: tempdir` only `timeout` is enforced — the agent can consume
286
+ arbitrary host memory, CPU, and PIDs. Use `driver: docker` when you need the
287
+ container limits above to actually bind.
288
+
283
289
  ## Template Sources
284
290
 
285
291
  Tasks can start with preset files instead of an empty sandbox. Multiple sources are applied sequentially (last wins for conflicts).
@@ -383,7 +389,7 @@ All criteria share these fields:
383
389
  | Field | Default | Description |
384
390
  |-------|---------|-------------|
385
391
  | `description` | — | Human-readable description (required) |
386
- | `weight` | 1.0 | Relative importance for weighted score |
392
+ | `weight` | 1.0 | Relative importance for weighted score. `0` = **informational**: excluded from both the score and the pass/fail gate |
387
393
  | `pass_threshold` | 0.9 | Minimum score (0.0–1.0) to pass |
388
394
  | `stop_when` | `null` | Arms this criterion for early stop (`pass`/`fail`/`decided`); requires `run_limits.stop_early: true` and an observable criterion type (`skill_triggered`, `command_executed`). See [`stop_early`](#stop_early-opt-in-early-stop). |
389
395
 
@@ -392,7 +398,20 @@ All criteria share these fields:
392
398
  - **Fractional** (0.0–1.0): `file_contains`, `file_check`, `json_check`, `command_executed`, `uipath_eval`
393
399
  - **Continuous** (0.0–1.0): `reference_comparison`, `llm_judge`, `agent_judge`
394
400
 
395
- **Task success:** ALL criteria must score >= their `pass_threshold`.
401
+ **Task success:** all *gating* criteria must score >= their `pass_threshold`. A
402
+ criterion with `weight: 0` is informational — it is still checked, stored, and
403
+ rendered in reports, but it neither contributes to the score nor fails the task.
404
+ (A `weight: 0` criterion may not set `stop_when` or `suite_thresholds`: arming a
405
+ non-gating criterion for the early-stop or suite gate would let an
406
+ "informational" check flip a run to failure.)
407
+
408
+ Every surface labels it as such rather than as a failure: the terminal shows `○`
409
+ instead of `✓`/`✗`, the HTML report tags the row "informational — not gated" and
410
+ excludes it from the *n*/*m* passed header, the evalboard renders an `INFO` pill,
411
+ and a below-threshold informational criterion is never sampled as the reason a
412
+ suite row failed. The persisted `CriterionResult.gating` field carries this to
413
+ every consumer, so no reader needs the original criterion to know whether a low
414
+ score mattered.
396
415
 
397
416
  **Weighted score:** `weighted_score = sum(score * weight) / sum(weight)` — calculated regardless for quality assessment.
398
417
 
@@ -1,22 +1,35 @@
1
1
  import Image from "next/image";
2
2
 
3
- // Vendor logo for a run's harness (RunConfig). Renders the recognizable
3
+ // Canonical harness constants live in the leaf lib/harness module (shared by
4
+ // the server data layer); re-exported here so existing badge importers are
5
+ // unaffected.
6
+ export { KNOWN_HARNESSES, type KnownHarness } from "@/lib/harness";
7
+
8
+ // Vendor logo + labels for a run's harness (RunConfig). Renders the recognizable
4
9
  // vendor mark instead of raw "claude-code"/"codex"/"antigravity" text,
5
10
  // mirroring the Slack rollup's vendor emoji. A missing harness defaults to
6
11
  // claude-code (the nightly). This is an internal-only column — the caller
7
12
  // gates it behind isInternal (see lib/edition.ts).
8
- const HARNESS_LOGO: Record<string, { src: string; label: string }> = {
13
+ const HARNESS_LOGO: Record<string, { src: string; label: string; short: string }> = {
9
14
  "claude-code": {
10
15
  src: "/harness/claude-code.png",
11
16
  label: "Claude Code · Anthropic",
17
+ short: "Claude Code",
12
18
  },
13
- codex: { src: "/harness/codex.png", label: "Codex · OpenAI" },
19
+ codex: { src: "/harness/codex.png", label: "Codex · OpenAI", short: "Codex" },
14
20
  antigravity: {
15
21
  src: "/harness/antigravity.png",
16
22
  label: "Antigravity · Google Gemini",
23
+ short: "Antigravity",
17
24
  },
18
25
  };
19
26
 
27
+ // Short human label for a harness id ("Claude Code"), for selectors and prose.
28
+ // Unknown ids fall through to the raw id.
29
+ export function harnessShortLabel(harness: string): string {
30
+ return HARNESS_LOGO[harness]?.short ?? harness;
31
+ }
32
+
20
33
  export function HarnessBadge({ harness }: { harness?: string | null }) {
21
34
  const key = harness ?? "claude-code";
22
35
  const logo = HARNESS_LOGO[key];
@@ -0,0 +1,49 @@
1
+ "use client";
2
+
3
+ import { usePathname, useRouter, useSearchParams } from "next/navigation";
4
+ import { HarnessBadge, harnessShortLabel } from "./harness-badge";
5
+
6
+ // Segmented control for the trends page's harness scope. Sets `?h=<harness>`
7
+ // while preserving the active q/tag params, mirroring WindowSelector. Each
8
+ // segment shows the vendor logo + short label so it reads like the per-run
9
+ // harness badge on the runs tables.
10
+ export function HarnessSelector({
11
+ current,
12
+ harnesses,
13
+ }: {
14
+ current: string;
15
+ harnesses: readonly string[];
16
+ }) {
17
+ const router = useRouter();
18
+ const pathname = usePathname();
19
+ const searchParams = useSearchParams();
20
+ const set = (h: string) => {
21
+ const p = new URLSearchParams(searchParams.toString());
22
+ p.set("h", h);
23
+ router.replace(`${pathname}?${p.toString()}`, { scroll: false });
24
+ };
25
+ // Always show the active harness, even if it has aged out of the recent
26
+ // window (so a deep-linked `?h=` still reads as selected rather than absent).
27
+ const opts = harnesses.includes(current)
28
+ ? harnesses
29
+ : [current, ...harnesses];
30
+ return (
31
+ <div className="inline-flex border border-gray-200 rounded-md overflow-hidden text-sm">
32
+ {opts.map((h) => {
33
+ const active = h === current;
34
+ return (
35
+ <button
36
+ key={h}
37
+ type="button"
38
+ onClick={() => set(h)}
39
+ aria-pressed={active}
40
+ className={`flex items-center gap-1.5 px-3 py-1 ${active ? "bg-studio-blue text-white" : "bg-white text-gray-700 hover:bg-gray-50"}`}
41
+ >
42
+ <HarnessBadge harness={h} />
43
+ {harnessShortLabel(h)}
44
+ </button>
45
+ );
46
+ })}
47
+ </div>
48
+ );
49
+ }
@@ -1,5 +1,6 @@
1
1
  import Link from "next/link";
2
2
  import type { TagCount } from "@/lib/overview";
3
+ import { DEFAULT_HARNESS } from "@/lib/harness";
3
4
  import type { Window } from "@/lib/reviews-types";
4
5
 
5
6
  type Variant = "neutral" | "rose" | "indigo";
@@ -35,11 +36,16 @@ function hrefForTag(
35
36
  tag: string | null,
36
37
  window: Window | null,
37
38
  q: string | null,
39
+ harness: string | null,
38
40
  ): string {
39
41
  const params = new URLSearchParams();
40
42
  if (window) params.set("window", window);
41
43
  if (tag) params.set("tag", tag);
42
44
  if (q) params.set("q", q);
45
+ // Preserve the active harness scope across tag clicks (omit the default to
46
+ // keep URLs clean). Without this, filtering by a tag would silently reset a
47
+ // codex/antigravity view back to claude-code.
48
+ if (harness && harness !== DEFAULT_HARNESS) params.set("h", harness);
43
49
  const qs = params.toString();
44
50
  return qs ? `${basePath}?${qs}` : basePath;
45
51
  }
@@ -52,6 +58,7 @@ function TagChip({
52
58
  basePath,
53
59
  window,
54
60
  q,
61
+ harness,
55
62
  }: {
56
63
  tag: string;
57
64
  count: number;
@@ -60,11 +67,12 @@ function TagChip({
60
67
  basePath: string;
61
68
  window: Window | null;
62
69
  q: string | null;
70
+ harness: string | null;
63
71
  }) {
64
72
  const s = STYLES[variant];
65
73
  return (
66
74
  <Link
67
- href={hrefForTag(basePath, active ? null : tag, window, q)}
75
+ href={hrefForTag(basePath, active ? null : tag, window, q, harness)}
68
76
  scroll={false}
69
77
  className={`inline-flex items-center gap-1 text-[11px] leading-none px-2 py-1 rounded border transition-colors ${active ? s.chipActive : s.chip}`}
70
78
  >
@@ -111,6 +119,7 @@ export function MergedTagRail({
111
119
  basePath = "/",
112
120
  window = null,
113
121
  q = null,
122
+ harness = null,
114
123
  limit = 24,
115
124
  }: {
116
125
  skills: TagCount[];
@@ -123,6 +132,8 @@ export function MergedTagRail({
123
132
  // Null on pages that don't expose a window selector (e.g. /trends).
124
133
  window?: Window | null;
125
134
  q?: string | null;
135
+ // Active harness scope to preserve in chip links (null = not harness-scoped).
136
+ harness?: string | null;
126
137
  limit?: number;
127
138
  }) {
128
139
  const s = pickShown(skills, limit, activeTag);
@@ -146,6 +157,7 @@ export function MergedTagRail({
146
157
  basePath={basePath}
147
158
  window={window}
148
159
  q={q}
160
+ harness={harness}
149
161
  />
150
162
  ))}
151
163
  {r.shown.map((tc) => (
@@ -158,6 +170,7 @@ export function MergedTagRail({
158
170
  basePath={basePath}
159
171
  window={window}
160
172
  q={q}
173
+ harness={harness}
161
174
  />
162
175
  ))}
163
176
  {t.shown.map((tc) => (
@@ -170,6 +183,7 @@ export function MergedTagRail({
170
183
  basePath={basePath}
171
184
  window={window}
172
185
  q={q}
186
+ harness={harness}
173
187
  />
174
188
  ))}
175
189
  {totalRemaining > 0 && (
@@ -3,8 +3,10 @@ import {
3
3
  getAdhocRunListing,
4
4
  getOverview,
5
5
  getRunListing,
6
+ listRecentHarnesses,
6
7
  type TagCount,
7
8
  } from "@/lib/overview";
9
+ import { parseHarnessParam, DEFAULT_HARNESS } from "@/lib/harness";
8
10
  import { fmtDuration, fmtRunTime, fmtTimestamp, passClass } from "@/lib/format";
9
11
  import { WindowSelector } from "./_components/window-selector";
10
12
  import { WINDOWS, type Window } from "@/lib/reviews-types";
@@ -15,7 +17,8 @@ import { ChipLegend, MergedTagRail } from "./_overview/tag-rail";
15
17
  import { TableScroll } from "./_components/scroll-table";
16
18
  import { CollapsibleRail } from "./_components/collapsible-rail";
17
19
  import { isInternal } from "@/lib/edition";
18
- import { HarnessBadge } from "@/app/_components/harness-badge";
20
+ import { HarnessBadge, harnessShortLabel } from "@/app/_components/harness-badge";
21
+ import { HarnessSelector } from "@/app/_components/harness-selector";
19
22
 
20
23
  export const dynamic = "force-dynamic";
21
24
 
@@ -98,6 +101,7 @@ export default async function Page({
98
101
  window?: string;
99
102
  tag?: string;
100
103
  q?: string;
104
+ h?: string;
101
105
  limit?: string;
102
106
  alimit?: string;
103
107
  }>;
@@ -106,14 +110,20 @@ export default async function Page({
106
110
  const window = parseWindow(params.window);
107
111
  const activeTag = parseTag(params.tag);
108
112
  const q = parseQ(params.q);
113
+ const harness = parseHarnessParam(params.h);
109
114
  const limit = parseLimit(params.limit);
110
115
  const adhocLimit = parseAdhocLimit(params.alimit);
111
116
  const isFiltered = activeTag != null || q != null;
112
117
 
113
- const [overview, listing, adhoc] = await Promise.all([
114
- getOverview(window, activeTag, q),
118
+ // The analytics block (chart + rails) is scoped to one harness so the
119
+ // success line stops zigzagging across incomparable harnesses. The run
120
+ // LIST stays all-harness — seeing every recent run is the page's job, and
121
+ // the Harness column already disambiguates each row.
122
+ const [overview, listing, adhoc, harnesses] = await Promise.all([
123
+ getOverview(window, activeTag, q, harness),
115
124
  getRunListing(window, activeTag, q, limit),
116
125
  getAdhocRunListing(adhocLimit),
126
+ listRecentHarnesses(),
117
127
  ]);
118
128
 
119
129
  const skills = filterTagsByQuery(overview.skills, q);
@@ -133,10 +143,14 @@ export default async function Page({
133
143
  const rawAlimit = Array.isArray(params.alimit)
134
144
  ? params.alimit[0]
135
145
  : params.alimit;
146
+ // Omit the default harness from URLs to keep them clean; carry a non-default
147
+ // scope through every self-link so it isn't reset by pagination/clear.
148
+ const hParam = harness === DEFAULT_HARNESS ? undefined : harness;
136
149
  const base = {
137
150
  window,
138
151
  tag: activeTag,
139
152
  q,
153
+ h: hParam,
140
154
  limit: rawLimit,
141
155
  alimit: rawAlimit,
142
156
  };
@@ -146,7 +160,7 @@ export default async function Page({
146
160
  limit: Math.min(tableTotalLabel, shownCount + DEFAULT_LIMIT),
147
161
  });
148
162
  const showAllHref = buildHref({ ...base, limit: "all" });
149
- const clearAllHref = buildHref({ window });
163
+ const clearAllHref = buildHref({ window, h: hParam });
150
164
 
151
165
  // Ad-hoc section disclosure: rows are filtered (by `q`) then capped to
152
166
  // adhocLimit; offer "Show all" while more match than are shown, and a
@@ -212,7 +226,7 @@ export default async function Page({
212
226
  {overview.runs.length === 1 ? "" : "s"}
213
227
  {" · "}
214
228
  <Link
215
- href={buildHref({ window })}
229
+ href={buildHref({ window, h: hParam })}
216
230
  scroll={false}
217
231
  className="text-studio-blue hover:underline"
218
232
  >
@@ -221,14 +235,21 @@ export default async function Page({
221
235
  </>
222
236
  ) : (
223
237
  <>
224
- Success rate per run across the last{" "}
225
- {window} · {overview.runs.length} run
238
+ Success rate per{" "}
239
+ {harnessShortLabel(harness)} run across the
240
+ last {window} · {overview.runs.length} run
226
241
  {overview.runs.length === 1 ? "" : "s"}
227
242
  </>
228
243
  )}
229
244
  </p>
230
245
  </div>
231
- <WindowSelector current={window} />
246
+ <div className="flex items-center gap-3">
247
+ <HarnessSelector
248
+ current={harness}
249
+ harnesses={harnesses}
250
+ />
251
+ <WindowSelector current={window} />
252
+ </div>
232
253
  </div>
233
254
  <DailySuccessChart
234
255
  data={overview.runs}
@@ -261,6 +282,7 @@ export default async function Page({
261
282
  activeTag={activeTag}
262
283
  window={window}
263
284
  q={q}
285
+ harness={harness}
264
286
  limit={24}
265
287
  />
266
288
  </CollapsibleRail>