coder-eval 0.11.7__tar.gz → 0.12.1__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 (764) hide show
  1. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/commands/coder-eval-review.md +2 -1
  2. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/harness-candidates.md +96 -0
  3. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/shared/run-layout.md +3 -0
  4. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/pages-stub/index.html +2 -2
  5. coder_eval-0.12.1/.github/scripts/harbor_e2e.py +163 -0
  6. coder_eval-0.12.1/.github/workflows/harbor-e2e.yml +91 -0
  7. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/workflows/pr-checks.yml +15 -8
  8. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/workflows/verify-published-action.yml +12 -0
  9. {coder_eval-0.11.7 → coder_eval-0.12.1}/CHANGELOG.md +303 -0
  10. {coder_eval-0.11.7 → coder_eval-0.12.1}/CLAUDE.md +26 -6
  11. {coder_eval-0.11.7 → coder_eval-0.12.1}/PKG-INFO +13 -8
  12. {coder_eval-0.11.7 → coder_eval-0.12.1}/README.md +6 -5
  13. {coder_eval-0.11.7 → coder_eval-0.12.1}/action.yml +1 -1
  14. {coder_eval-0.11.7 → coder_eval-0.12.1}/docker/Dockerfile +29 -15
  15. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/DOCKER_ISOLATION.md +1 -1
  16. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/EXTENDING.md +2 -2
  17. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/REPORT_SCHEMA.md +28 -6
  18. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/TASK_DEFINITION_GUIDE.md +43 -1
  19. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/USER_GUIDE.md +202 -10
  20. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/agents/HARNESS_PARITY.md +127 -13
  21. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/agents/OPENCODE.md +16 -15
  22. coder_eval-0.12.1/docs/agents/PI.md +272 -0
  23. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/comparison.md +4 -4
  24. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/index.md +5 -4
  25. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/llms.txt +2 -1
  26. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/tutorials/02-ci-pipeline.md +8 -3
  27. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/tutorials/06-use-docker-isolation.md +2 -2
  28. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/__tests__/harness-badge.test.tsx +11 -0
  29. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/harness-badge.tsx +1 -0
  30. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/window-summary.tsx +2 -2
  31. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/page.tsx +55 -14
  32. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/path-to-ga/__tests__/task-table.test.tsx +1 -0
  33. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/scribe/run-table.tsx +5 -3
  34. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/trends/trends-view.tsx +17 -9
  35. coder_eval-0.12.1/evalboard/public/harness/pi.png +0 -0
  36. {coder_eval-0.11.7 → coder_eval-0.12.1}/experiments/default.yaml +2 -1
  37. {coder_eval-0.11.7 → coder_eval-0.12.1}/mkdocs.yml +3 -1
  38. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/.claude-plugin/plugin.json +1 -1
  39. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/reference/run-layout.md +3 -0
  40. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/skills/analyze/SKILL.md +11 -0
  41. {coder_eval-0.11.7 → coder_eval-0.12.1}/pyproject.toml +70 -3
  42. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/__init__.py +1 -1
  43. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agents/__init__.py +5 -2
  44. coder_eval-0.12.1/src/coder_eval/agents/_skills.py +113 -0
  45. coder_eval-0.12.1/src/coder_eval/agents/_timing.py +42 -0
  46. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agents/antigravity_agent.py +85 -5
  47. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agents/claude_code_agent.py +8 -3
  48. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agents/codex_agent.py +232 -27
  49. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agents/opencode_agent.py +53 -88
  50. coder_eval-0.12.1/src/coder_eval/agents/pi_agent.py +1269 -0
  51. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/analysis.py +16 -8
  52. coder_eval-0.12.1/src/coder_eval/argv_match.py +267 -0
  53. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/cli/__init__.py +10 -2
  54. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/cli/aggregate_command.py +9 -5
  55. coder_eval-0.12.1/src/coder_eval/cli/evaluate_command.py +693 -0
  56. coder_eval-0.12.1/src/coder_eval/cli/evaluate_target.py +120 -0
  57. coder_eval-0.12.1/src/coder_eval/cli/execute_command.py +261 -0
  58. coder_eval-0.12.1/src/coder_eval/cli/export_command.py +126 -0
  59. coder_eval-0.12.1/src/coder_eval/cli/harbor_command.py +65 -0
  60. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/cli/plan_command.py +14 -1
  61. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/cli/report_command.py +2 -1
  62. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/cli/run_command.py +471 -28
  63. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/cli/run_helpers.py +17 -1
  64. coder_eval-0.12.1/src/coder_eval/cli/run_task_internal_command.py +410 -0
  65. coder_eval-0.12.1/src/coder_eval/criteria/cli_called.py +218 -0
  66. coder_eval-0.12.1/src/coder_eval/harbor/__init__.py +22 -0
  67. coder_eval-0.12.1/src/coder_eval/harbor/agent.py +160 -0
  68. coder_eval-0.12.1/src/coder_eval/harbor/agent_paths.py +29 -0
  69. coder_eval-0.12.1/src/coder_eval/harbor/atif_emit.py +422 -0
  70. coder_eval-0.12.1/src/coder_eval/harbor/atif_hydrate.py +180 -0
  71. coder_eval-0.12.1/src/coder_eval/harbor/atif_models.py +290 -0
  72. coder_eval-0.12.1/src/coder_eval/harbor/experiment_packager.py +211 -0
  73. coder_eval-0.12.1/src/coder_eval/harbor/packager.py +701 -0
  74. coder_eval-0.12.1/src/coder_eval/harbor/portability.py +149 -0
  75. coder_eval-0.12.1/src/coder_eval/harbor/reward.py +102 -0
  76. coder_eval-0.12.1/src/coder_eval/invocation_log.py +306 -0
  77. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/isolation/docker_runner.py +245 -11
  78. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/__init__.py +21 -1
  79. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/agent_config.py +55 -1
  80. coder_eval-0.12.1/src/coder_eval/models/cli_match.py +392 -0
  81. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/container_paths.py +23 -0
  82. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/criteria.py +50 -172
  83. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/enums.py +59 -2
  84. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/experiment.py +57 -9
  85. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/results.py +156 -12
  86. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/sandbox.py +186 -6
  87. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/tasks.py +13 -10
  88. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/telemetry.py +13 -2
  89. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/batch.py +112 -14
  90. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/config.py +32 -0
  91. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/evaluation.py +2 -2
  92. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/experiment.py +121 -36
  93. coder_eval-0.12.1/src/coder_eval/orchestration/regrade.py +1213 -0
  94. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestrator.py +724 -103
  95. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/path_utils.py +101 -3
  96. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/reports.py +64 -15
  97. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/reports_experiment.py +27 -8
  98. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/reports_html.py +31 -6
  99. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/reports_junit.py +13 -4
  100. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/reports_stats.py +43 -2
  101. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/sandbox.py +250 -18
  102. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/README.md +5 -3
  103. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/byod_smoke_test.yaml +9 -2
  104. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +14 -6
  105. coder_eval-0.12.1/tasks/pi_smoke_test.yaml +38 -0
  106. coder_eval-0.12.1/tasks/record_cli_responses.yaml +206 -0
  107. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/__init__.py +2 -1
  108. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/_scrub.py +64 -0
  109. coder_eval-0.12.1/tests/_fixtures/golden_streams/antigravity_fixtures.py +279 -0
  110. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/codex_fixtures.py +50 -12
  111. coder_eval-0.12.1/tests/_fixtures/golden_streams/expected/antigravity_a_single_text_turn.json +52 -0
  112. coder_eval-0.12.1/tests/_fixtures/golden_streams/expected/antigravity_b_tool_call_resolved.json +83 -0
  113. coder_eval-0.12.1/tests/_fixtures/golden_streams/expected/antigravity_c_thinking_and_tool_same_generation.json +92 -0
  114. coder_eval-0.12.1/tests/_fixtures/golden_streams/expected/antigravity_d_orphaned_tool.json +72 -0
  115. coder_eval-0.12.1/tests/_fixtures/golden_streams/expected/antigravity_e_multi_generation.json +106 -0
  116. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +1 -1
  117. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +1 -1
  118. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +12 -3
  119. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +2 -2
  120. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +1 -1
  121. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +7 -7
  122. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +1 -1
  123. coder_eval-0.12.1/tests/_fixtures/golden_streams/expected/opencode_a_single_text_turn.json +57 -0
  124. coder_eval-0.12.1/tests/_fixtures/golden_streams/expected/opencode_b_tool_call_resolved.json +106 -0
  125. coder_eval-0.12.1/tests/_fixtures/golden_streams/expected/pi_a_single_text_turn.json +47 -0
  126. coder_eval-0.12.1/tests/_fixtures/golden_streams/expected/pi_b_tool_call_resolved.json +155 -0
  127. coder_eval-0.12.1/tests/_fixtures/golden_streams/opencode_fixtures.py +227 -0
  128. coder_eval-0.12.1/tests/_fixtures/golden_streams/pi_fixtures.py +207 -0
  129. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/expected/environment/Dockerfile +6 -0
  130. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/expected/environment/task.yaml +25 -0
  131. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/expected/instruction.md +9 -0
  132. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/expected/task.toml +73 -0
  133. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/expected/tests/reference/greeting.txt +1 -0
  134. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/expected/tests/task.yaml +28 -0
  135. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/expected/tests/test.sh +17 -0
  136. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/source_task/environment/Dockerfile +2 -0
  137. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/source_task/reference/greeting.txt +1 -0
  138. coder_eval-0.12.1/tests/_fixtures/harbor_export_golden/source_task/task.yaml +33 -0
  139. coder_eval-0.12.1/tests/_fixtures/timing_union_cases.json +100 -0
  140. coder_eval-0.12.1/tests/fixtures/atif/known_good_trajectory.json +125 -0
  141. coder_eval-0.12.1/tests/fixtures/pi_happy_stream.jsonl +45 -0
  142. coder_eval-0.12.1/tests/harbor_e2e/fixtures/docker_baseline.yaml +35 -0
  143. coder_eval-0.12.1/tests/harbor_e2e/fixtures/llm_judge.yaml +44 -0
  144. coder_eval-0.12.1/tests/harbor_e2e/fixtures/template_sources.yaml +38 -0
  145. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/agent_roster_parity.py +12 -5
  146. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/doc_env_parity.py +23 -0
  147. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/doc_schema_parity.py +16 -3
  148. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce018_no_final_status_name_denylist.py +1 -0
  149. coder_eval-0.12.1/tests/lint/rules/ce048_no_in_process_typer_command_call.py +106 -0
  150. coder_eval-0.12.1/tests/lint/rules/ce049_no_score_or_zero.py +70 -0
  151. coder_eval-0.12.1/tests/lint/rules/ce050_no_union_getattr_probe.py +132 -0
  152. coder_eval-0.12.1/tests/lint/rules/ce051_no_driver_override.py +94 -0
  153. coder_eval-0.12.1/tests/lint/rules/ce052_process_lethal_must_be_container_gated.py +98 -0
  154. coder_eval-0.12.1/tests/lint/rules/ce053_run_record_filename_literal.py +96 -0
  155. coder_eval-0.12.1/tests/lint/rules/ce054_env_info_key_round_trip.py +126 -0
  156. coder_eval-0.12.1/tests/lint/rules/ce056_no_container_env_literal.py +83 -0
  157. coder_eval-0.12.1/tests/lint/rules/ce057_sidecar_shim_stdlib_only.py +82 -0
  158. coder_eval-0.12.1/tests/lint/rules/ce058_no_timing_literal.py +204 -0
  159. coder_eval-0.12.1/tests/lint/rules/ce059_generation_window_is_two_reads.py +79 -0
  160. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/no_cli_imports_in_core.py +7 -2
  161. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/runner.py +22 -0
  162. coder_eval-0.12.1/tests/test_agent_golden_master.py +364 -0
  163. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agent_telemetry.py +8 -1
  164. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agent_telemetry_advanced.py +3 -1
  165. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_antigravity_agent.py +436 -99
  166. coder_eval-0.12.1/tests/test_atif_emit.py +365 -0
  167. coder_eval-0.12.1/tests/test_atif_hydrate.py +138 -0
  168. coder_eval-0.12.1/tests/test_atif_models.py +181 -0
  169. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_cleanup_preservation_guard.py +4 -0
  170. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_cli_called_criterion.py +235 -41
  171. coder_eval-0.12.1/tests/test_cli_match_parity.py +121 -0
  172. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_cli_telemetry.py +2 -2
  173. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_codex_agent.py +344 -3
  174. coder_eval-0.12.1/tests/test_codex_agent_unit.py +280 -0
  175. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_command_statistics.py +37 -0
  176. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_custom_lint.py +762 -5
  177. coder_eval-0.12.1/tests/test_detached_grading_boundaries.py +951 -0
  178. coder_eval-0.12.1/tests/test_detached_grading_guards.py +479 -0
  179. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_docker_runner_mounts.py +37 -0
  180. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_docker_wildcard_env.py +7 -0
  181. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_early_stop.py +3 -3
  182. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_evaluate_command.py +16 -16
  183. coder_eval-0.12.1/tests/test_evaluate_format_harbor.py +126 -0
  184. coder_eval-0.12.1/tests/test_evaluate_target.py +102 -0
  185. coder_eval-0.12.1/tests/test_execute_command.py +305 -0
  186. coder_eval-0.12.1/tests/test_execute_evaluate_loop.py +771 -0
  187. coder_eval-0.12.1/tests/test_execute_format_harbor.py +87 -0
  188. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_experiment_reports.py +99 -0
  189. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_experiment_runner.py +81 -0
  190. coder_eval-0.12.1/tests/test_harbor_agent.py +171 -0
  191. coder_eval-0.12.1/tests/test_harbor_experiment_packager.py +308 -0
  192. coder_eval-0.12.1/tests/test_harbor_export_golden.py +80 -0
  193. coder_eval-0.12.1/tests/test_harbor_packager.py +659 -0
  194. coder_eval-0.12.1/tests/test_harbor_portability.py +135 -0
  195. coder_eval-0.12.1/tests/test_harbor_reward.py +123 -0
  196. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_image_from_dockerfiles.py +31 -0
  197. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_litellm_cost.py +6 -0
  198. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_models.py +56 -0
  199. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_opencode_agent.py +174 -125
  200. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_orchestrator.py +73 -0
  201. coder_eval-0.12.1/tests/test_pi_agent.py +1187 -0
  202. coder_eval-0.12.1/tests/test_pi_agent_config.py +73 -0
  203. coder_eval-0.12.1/tests/test_pi_smoke_task.py +38 -0
  204. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_plan_command.py +11 -11
  205. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_post_run.py +10 -10
  206. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_pre_run.py +16 -16
  207. coder_eval-0.12.1/tests/test_regrade.py +1274 -0
  208. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reports.py +74 -0
  209. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reports_html.py +90 -5
  210. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_resume.py +110 -6
  211. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_route_seam_exhaustiveness.py +9 -1
  212. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_run_command_junit.py +1 -1
  213. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_run_metrics.py +3 -1
  214. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_sandbox.py +56 -1
  215. coder_eval-0.12.1/tests/test_sandbox_adopt.py +130 -0
  216. coder_eval-0.12.1/tests/test_sandbox_record_cli.py +1182 -0
  217. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_sandbox_templates.py +11 -6
  218. coder_eval-0.12.1/tests/test_sandbox_venv_live.py +110 -0
  219. coder_eval-0.12.1/tests/test_seed_from_prior_result.py +319 -0
  220. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_simulation_integration.py +73 -0
  221. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_suite_rollup.py +78 -1
  222. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_tags.py +186 -1
  223. coder_eval-0.12.1/tests/test_timing_union_parity.py +55 -0
  224. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_token_usage.py +12 -0
  225. coder_eval-0.12.1/tests/test_ungraded_reporting.py +288 -0
  226. {coder_eval-0.11.7 → coder_eval-0.12.1}/uv.lock +261 -8
  227. coder_eval-0.11.7/src/coder_eval/cli/evaluate_command.py +0 -173
  228. coder_eval-0.11.7/src/coder_eval/cli/run_task_internal_command.py +0 -210
  229. coder_eval-0.11.7/src/coder_eval/criteria/cli_called.py +0 -312
  230. coder_eval-0.11.7/src/coder_eval/invocation_log.py +0 -151
  231. coder_eval-0.11.7/tests/test_agent_golden_master.py +0 -98
  232. coder_eval-0.11.7/tests/test_codex_agent_unit.py +0 -131
  233. coder_eval-0.11.7/tests/test_sandbox_record_cli.py +0 -506
  234. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/commands/coder-eval-code-review-full.md +0 -0
  235. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/commands/coder-eval-code-review-wf.md +0 -0
  236. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/commands/coder-eval-code-review.md +0 -0
  237. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/commands/coder-eval-create-plan.md +0 -0
  238. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/commands/coder-eval-implement-plan.md +0 -0
  239. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/shared/axes.md +0 -0
  240. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/shared/multi-model-review.md +0 -0
  241. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/shared/review-rubric.md +0 -0
  242. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/workflows/cr-axis.js +0 -0
  243. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude/workflows/cr-parent.js +0 -0
  244. {coder_eval-0.11.7 → coder_eval-0.12.1}/.claude-plugin/marketplace.json +0 -0
  245. {coder_eval-0.11.7 → coder_eval-0.12.1}/.env.example +0 -0
  246. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/CODEOWNERS +0 -0
  247. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
  248. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  249. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  250. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/actionlint.yaml +0 -0
  251. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/code_review.md +0 -0
  252. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/dependabot.yml +0 -0
  253. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/scripts/release_notes.py +0 -0
  254. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/workflows/claude-pr-review.yml +0 -0
  255. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/workflows/codeql.yml +0 -0
  256. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/workflows/conventional-commits.yml +0 -0
  257. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/workflows/docker-publish.yml +0 -0
  258. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/workflows/docs.yml +0 -0
  259. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/workflows/publish-testpypi.yml +0 -0
  260. {coder_eval-0.11.7 → coder_eval-0.12.1}/.github/workflows/release.yml +0 -0
  261. {coder_eval-0.11.7 → coder_eval-0.12.1}/.gitignore +0 -0
  262. {coder_eval-0.11.7 → coder_eval-0.12.1}/.pre-commit-config.yaml +0 -0
  263. {coder_eval-0.11.7 → coder_eval-0.12.1}/.python-version +0 -0
  264. {coder_eval-0.11.7 → coder_eval-0.12.1}/ADOPTERS.md +0 -0
  265. {coder_eval-0.11.7 → coder_eval-0.12.1}/CODE_OF_CONDUCT.md +0 -0
  266. {coder_eval-0.11.7 → coder_eval-0.12.1}/CONTRIBUTING.md +0 -0
  267. {coder_eval-0.11.7 → coder_eval-0.12.1}/LICENSE +0 -0
  268. {coder_eval-0.11.7 → coder_eval-0.12.1}/Makefile +0 -0
  269. {coder_eval-0.11.7 → coder_eval-0.12.1}/NOTICE +0 -0
  270. {coder_eval-0.11.7 → coder_eval-0.12.1}/SECURITY.md +0 -0
  271. {coder_eval-0.11.7 → coder_eval-0.12.1}/comparison.md +0 -0
  272. {coder_eval-0.11.7 → coder_eval-0.12.1}/docker/Dockerfile.runtime +0 -0
  273. {coder_eval-0.11.7 → coder_eval-0.12.1}/docker/coder_eval_entrypoint.sh +0 -0
  274. {coder_eval-0.11.7 → coder_eval-0.12.1}/docker/coder_eval_runtime_entrypoint.sh +0 -0
  275. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/AB_EXPERIMENTS.md +0 -0
  276. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/CI_GATE.md +0 -0
  277. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/DATASETS.md +0 -0
  278. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/DIALOG_MODE.md +0 -0
  279. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/PLUGIN.md +0 -0
  280. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/agents/ANTIGRAVITY.md +0 -0
  281. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/agents/CLAUDE_CODE.md +0 -0
  282. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/agents/CODEX.md +0 -0
  283. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/assets/hero.gif +0 -0
  284. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/tutorials/01-first-evaluation.md +0 -0
  285. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/tutorials/03-evalboard-local.md +0 -0
  286. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/tutorials/04-writing-a-task.md +0 -0
  287. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/tutorials/05-comparing-models.md +0 -0
  288. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/tutorials/07-plugin-in-claude-code.md +0 -0
  289. {coder_eval-0.11.7 → coder_eval-0.12.1}/docs/tutorials/README.md +0 -0
  290. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/.gitignore +0 -0
  291. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/README.md +0 -0
  292. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/__tests__/harness-selector.test.tsx +0 -0
  293. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
  294. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/__tests__/skeleton.test.tsx +0 -0
  295. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/col-help.tsx +0 -0
  296. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/collapsible-rail.tsx +0 -0
  297. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/harness-selector.tsx +0 -0
  298. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/scroll-table.tsx +0 -0
  299. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/search-box.tsx +0 -0
  300. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/skeleton.tsx +0 -0
  301. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/unit-toggle.tsx +0 -0
  302. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_components/version-list.tsx +0 -0
  303. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_lib/__tests__/source-param.test.ts +0 -0
  304. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_lib/source-param.ts +0 -0
  305. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/__tests__/efficiency-charts.test.tsx +0 -0
  306. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/__tests__/harness-legend.test.tsx +0 -0
  307. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/__tests__/harness-series.test.ts +0 -0
  308. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/daily-chart.tsx +0 -0
  309. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/efficiency-charts.tsx +0 -0
  310. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/harness-legend.tsx +0 -0
  311. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/harness-series.ts +0 -0
  312. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/tag-rail.tsx +0 -0
  313. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
  314. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/_overview/wall-clock-chart.tsx +0 -0
  315. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/api/download/route.ts +0 -0
  316. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/api/file/route.ts +0 -0
  317. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
  318. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/api/refresh/route.ts +0 -0
  319. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/error.tsx +0 -0
  320. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/globals.css +0 -0
  321. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/icon.png +0 -0
  322. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/layout.tsx +0 -0
  323. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/loading.tsx +0 -0
  324. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/path-to-ga/page.tsx +0 -0
  325. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/path-to-ga/task-table.tsx +0 -0
  326. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/scribe/page.tsx +0 -0
  327. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
  328. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/trends/actions.ts +0 -0
  329. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/trends/page.tsx +0 -0
  330. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
  331. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/watchlist/page.tsx +0 -0
  332. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
  333. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/next-env.d.ts +0 -0
  334. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/next.config.mjs +0 -0
  335. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/package.json +0 -0
  336. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/pnpm-lock.yaml +0 -0
  337. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/postcss.config.mjs +0 -0
  338. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/public/harness/antigravity.png +0 -0
  339. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/public/harness/claude-code.png +0 -0
  340. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/public/harness/codex.png +0 -0
  341. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/public/uipath.png +0 -0
  342. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/tailwind.config.ts +0 -0
  343. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/tsconfig.json +0 -0
  344. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/vitest.config.ts +0 -0
  345. {coder_eval-0.11.7 → coder_eval-0.12.1}/evalboard/vitest.setup.ts +0 -0
  346. {coder_eval-0.11.7 → coder_eval-0.12.1}/experiments/early-stop-ab.yaml +0 -0
  347. {coder_eval-0.11.7 → coder_eval-0.12.1}/experiments/model-comparison.yaml +0 -0
  348. {coder_eval-0.11.7 → coder_eval-0.12.1}/experiments/permissions-smoke.yaml +0 -0
  349. {coder_eval-0.11.7 → coder_eval-0.12.1}/experiments/plugin-comparison.yaml +0 -0
  350. {coder_eval-0.11.7 → coder_eval-0.12.1}/experiments/prompt-mutations-example.yaml +0 -0
  351. {coder_eval-0.11.7 → coder_eval-0.12.1}/experiments/smoke_variants.yaml +0 -0
  352. {coder_eval-0.11.7 → coder_eval-0.12.1}/litellm/README.md +0 -0
  353. {coder_eval-0.11.7 → coder_eval-0.12.1}/litellm/cost_logger.py +0 -0
  354. {coder_eval-0.11.7 → coder_eval-0.12.1}/litellm/litellm-config.yaml +0 -0
  355. {coder_eval-0.11.7 → coder_eval-0.12.1}/litellm/start-litellm.sh +0 -0
  356. {coder_eval-0.11.7 → coder_eval-0.12.1}/osv-scanner.toml +0 -0
  357. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/README.md +0 -0
  358. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/reference/cli-setup.md +0 -0
  359. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/reference/criteria.md +0 -0
  360. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/reference/repo-layout.md +0 -0
  361. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/reference/task-rubric.md +0 -0
  362. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/reference/templates/activation-rows.jsonl +0 -0
  363. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/reference/templates/activation.yaml +0 -0
  364. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/skills/check-skill/SKILL.md +0 -0
  365. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/skills/ci/SKILL.md +0 -0
  366. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/skills/init/SKILL.md +0 -0
  367. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/skills/lint-tasks/SKILL.md +0 -0
  368. {coder_eval-0.11.7 → coder_eval-0.12.1}/plugins/coder-eval/skills/task/SKILL.md +0 -0
  369. {coder_eval-0.11.7 → coder_eval-0.12.1}/scripts/check_commit_msg.sh +0 -0
  370. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/.gitattributes +0 -0
  371. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agent.py +0 -0
  372. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agents/_logging.py +0 -0
  373. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agents/noop_agent.py +0 -0
  374. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agents/registry.py +0 -0
  375. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/agents/watchdog.py +0 -0
  376. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/cli/console.py +0 -0
  377. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/cli/utils.py +0 -0
  378. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/config.py +0 -0
  379. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/__init__.py +0 -0
  380. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
  381. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/agent_judge.py +0 -0
  382. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/base.py +0 -0
  383. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/classification_match.py +0 -0
  384. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/command_executed.py +0 -0
  385. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/commands_efficiency.py +0 -0
  386. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/file_check.py +0 -0
  387. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/file_contains.py +0 -0
  388. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/file_exists.py +0 -0
  389. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/file_matches_regex.py +0 -0
  390. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/json_check.py +0 -0
  391. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/llm_judge.py +0 -0
  392. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/reference_comparison.py +0 -0
  393. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/run_command.py +0 -0
  394. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/skill_triggered.py +0 -0
  395. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/criteria/uipath_eval.py +0 -0
  396. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/__init__.py +0 -0
  397. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/agent.py +0 -0
  398. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/budget.py +0 -0
  399. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/categories.py +0 -0
  400. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/categorization.py +0 -0
  401. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/checker_misuse.py +0 -0
  402. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/executor.py +0 -0
  403. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/judge.py +0 -0
  404. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/reference.py +0 -0
  405. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/retry.py +0 -0
  406. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/errors/timeout.py +0 -0
  407. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/__init__.py +0 -0
  408. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/checker.py +0 -0
  409. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
  410. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
  411. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/judge_context.py +0 -0
  412. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/judge_litellm.py +0 -0
  413. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/judge_models.py +0 -0
  414. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/judge_persistence.py +0 -0
  415. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/judge_usage.py +0 -0
  416. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/sub_agent.py +0 -0
  417. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/summaries.py +0 -0
  418. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/evaluation/verdict_tool.py +0 -0
  419. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/formatting.py +0 -0
  420. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/fs_permissions.py +0 -0
  421. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/isolation/__init__.py +0 -0
  422. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/litellm_cost.py +0 -0
  423. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/logging_config.py +0 -0
  424. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/judge.py +0 -0
  425. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/judge_defaults.py +0 -0
  426. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/limits.py +0 -0
  427. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/merge_strategy.py +0 -0
  428. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/mutations.py +0 -0
  429. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/routing.py +0 -0
  430. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/models/templates.py +0 -0
  431. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/__init__.py +0 -0
  432. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/config_merge.py +0 -0
  433. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/early_stop.py +0 -0
  434. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/overrides.py +0 -0
  435. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/run_limits.py +0 -0
  436. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/orchestration/task_loader.py +0 -0
  437. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/plugins.py +0 -0
  438. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/pricing.py +0 -0
  439. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/py.typed +0 -0
  440. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/resources/__init__.py +0 -0
  441. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
  442. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/resources/tags.yaml +0 -0
  443. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/scoring/__init__.py +0 -0
  444. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/scoring/ast_similarity.py +0 -0
  445. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/scoring/complexity.py +0 -0
  446. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/scoring/quality.py +0 -0
  447. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/scoring/signature_similarity.py +0 -0
  448. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/scoring/similarity.py +0 -0
  449. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/scoring/token_similarity.py +0 -0
  450. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/simulation/__init__.py +0 -0
  451. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/simulation/termination.py +0 -0
  452. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/simulation/user_simulator.py +0 -0
  453. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/streaming/__init__.py +0 -0
  454. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/streaming/callbacks.py +0 -0
  455. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/streaming/collector.py +0 -0
  456. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/streaming/events.py +0 -0
  457. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/streaming/renderers.py +0 -0
  458. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/streaming/wire.py +0 -0
  459. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/telemetry.py +0 -0
  460. {coder_eval-0.11.7 → coder_eval-0.12.1}/src/coder_eval/utils.py +0 -0
  461. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agentless_smoke_test.yaml +0 -0
  462. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/antigravity_hello_world.yaml +0 -0
  463. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
  464. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/claude_hello_world.yaml +0 -0
  465. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/claude_hello_world_docker.yaml +0 -0
  466. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
  467. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/claude_subagent_test.yaml +0 -0
  468. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
  469. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/codex_hello_world.yaml +0 -0
  470. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/codex_parallel_commands.yaml +0 -0
  471. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
  472. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/codex_skills_test.yaml +0 -0
  473. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/codex_string_utils.yaml +0 -0
  474. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/codex_subagent_test.yaml +0 -0
  475. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/subagent_bash_long_input.yaml +0 -0
  476. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/agents/subagent_merge_sort.yaml +0 -0
  477. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/anti_cheat_reference/anti_cheat_reference.yaml +0 -0
  478. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/anti_cheat_reference/reference/solution.py +0 -0
  479. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/dataset_example.yaml +0 -0
  480. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/datasets/sentiment.jsonl +0 -0
  481. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
  482. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
  483. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/dockerfile_build_example/environment/input.txt +0 -0
  484. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
  485. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
  486. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/early_stop_decision_budget_exceeded.yaml +0 -0
  487. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/early_stop_weighted_high_weight_kills_run.yaml +0 -0
  488. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/early_stop_weighted_low_weight_absorbed.yaml +0 -0
  489. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/fibonacci_with_template.yaml +0 -0
  490. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/hello_date.yaml +0 -0
  491. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/inline_starter_example.yaml +0 -0
  492. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/internal/session_resumption.yaml +0 -0
  493. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/mock_path_dirs_smoke.yaml +0 -0
  494. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
  495. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
  496. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
  497. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
  498. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
  499. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/opencode_smoke_test.yaml +0 -0
  500. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
  501. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/run_limits/max_turns_cap.yaml +0 -0
  502. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/run_limits/turn_timeout.yaml +0 -0
  503. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
  504. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
  505. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
  506. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
  507. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
  508. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
  509. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/README.md +0 -0
  510. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
  511. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
  512. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
  513. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
  514. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
  515. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
  516. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
  517. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
  518. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
  519. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
  520. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/sentiment_classification.yaml +0 -0
  521. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/smoke_agent_judge.yaml +0 -0
  522. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/smoke_budget_exceeded.yaml +0 -0
  523. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
  524. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/smoke_llm_judge.yaml +0 -0
  525. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/smoke_negative_path.yaml +0 -0
  526. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/smoke_task_timeout.yaml +0 -0
  527. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/smoke_variants.yaml +0 -0
  528. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/test_sandbox.yaml +0 -0
  529. {coder_eval-0.11.7 → coder_eval-0.12.1}/tasks/token_check.yaml +0 -0
  530. {coder_eval-0.11.7 → coder_eval-0.12.1}/templates/byod_smoke_test/Dockerfile +0 -0
  531. {coder_eval-0.11.7 → coder_eval-0.12.1}/templates/fibonacci-starter/README.md +0 -0
  532. {coder_eval-0.11.7 → coder_eval-0.12.1}/templates/fibonacci-starter/src/main.py +0 -0
  533. {coder_eval-0.11.7 → coder_eval-0.12.1}/templates/fibonacci-starter/tests/test_main.py +0 -0
  534. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/__init__.py +0 -0
  535. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/__init__.py +0 -0
  536. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
  537. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
  538. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
  539. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
  540. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
  541. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
  542. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
  543. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
  544. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
  545. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
  546. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
  547. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
  548. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/live_criteria.py +0 -0
  549. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/report_snapshots/__init__.py +0 -0
  550. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
  551. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
  552. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
  553. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
  554. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/report_snapshots/run_full.md +0 -0
  555. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
  556. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/_path_helpers.py +0 -0
  557. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/conftest.py +0 -0
  558. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/fixtures/__init__.py +0 -0
  559. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
  560. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
  561. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/fixtures/mock_agent.py +0 -0
  562. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
  563. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
  564. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
  565. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/fixtures/text_stub_agent.py +0 -0
  566. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/__init__.py +0 -0
  567. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/action_docs.py +0 -0
  568. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/dead_config_fields.py +0 -0
  569. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/doc_examples.py +0 -0
  570. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/doc_indexes.py +0 -0
  571. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/generated.py +0 -0
  572. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/live_verdict_contract.py +0 -0
  573. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/plugin_manifest_parity.py +0 -0
  574. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/plugin_reference.py +0 -0
  575. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/pyright_config.py +0 -0
  576. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/__init__.py +0 -0
  577. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/base.py +0 -0
  578. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
  579. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
  580. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
  581. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
  582. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
  583. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
  584. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
  585. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
  586. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
  587. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
  588. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce032_criteria_path_seam.py +0 -0
  589. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce037_no_dead_private_helper.py +0 -0
  590. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce038_acquire_inside_try.py +0 -0
  591. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce039_config_error_escalates.py +0 -0
  592. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce043_no_command_output_truncation.py +0 -0
  593. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/ce046_env_info_spreads_super.py +0 -0
  594. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/no_agent_timing_access.py +0 -0
  595. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
  596. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/no_silent_except.py +0 -0
  597. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/no_submodule_model_imports.py +0 -0
  598. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
  599. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
  600. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
  601. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/open_explicit_encoding.py +0 -0
  602. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
  603. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/register_criterion_required.py +0 -0
  604. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
  605. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
  606. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/violation.py +0 -0
  607. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/lint/workflow_outputs.py +0 -0
  608. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_action_inputs.py +0 -0
  609. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_action_version_pin.py +0 -0
  610. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agent.py +0 -0
  611. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agent_config_no_timing_fields.py +0 -0
  612. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agent_config_optional_type.py +0 -0
  613. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agent_config_registry_dispatch.py +0 -0
  614. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agent_config_sdk_decoupling.py +0 -0
  615. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agent_judge_criterion.py +0 -0
  616. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agent_timeout.py +0 -0
  617. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_agentless.py +0 -0
  618. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_aggregate.py +0 -0
  619. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_byoa_plugin.py +0 -0
  620. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_byoa_plugin_live.py +0 -0
  621. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_byod_feature.py +0 -0
  622. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_check_all_async.py +0 -0
  623. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_checker_logging.py +0 -0
  624. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_classification_match.py +0 -0
  625. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_claude_settings_enforcement_live.py +0 -0
  626. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_cli_backend_flag.py +0 -0
  627. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_cli_empty_glob.py +0 -0
  628. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_cli_sdk_options.py +0 -0
  629. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_cli_set_overrides.py +0 -0
  630. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_cli_type_flag.py +0 -0
  631. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_code_review_bugs.py +0 -0
  632. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_codex_agent_live.py +0 -0
  633. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_codex_token_mapping.py +0 -0
  634. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_command_executed.py +0 -0
  635. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_command_telemetry_result_data.py +0 -0
  636. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_commands_efficiency.py +0 -0
  637. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_config_lineage.py +0 -0
  638. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_config_merge_engine.py +0 -0
  639. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_config_precedence.py +0 -0
  640. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_continuous_scoring.py +0 -0
  641. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_cost_accounting_paths.py +0 -0
  642. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_criterion_result_round_trip.py +0 -0
  643. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_dataset_expansion.py +0 -0
  644. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_debug_logging.py +0 -0
  645. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_docker_build_failure.py +0 -0
  646. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_docker_litellm_env.py +0 -0
  647. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_docker_runner_container_death.py +0 -0
  648. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_docker_runner_stream_limit.py +0 -0
  649. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_docker_workdir_live.py +0 -0
  650. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_driver_resolver.py +0 -0
  651. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_error_handling.py +0 -0
  652. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_evaluator.py +0 -0
  653. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_event_collector.py +0 -0
  654. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_experiment_cli.py +0 -0
  655. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_experiment_loader.py +0 -0
  656. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_experiment_models.py +0 -0
  657. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_experiment_resolver.py +0 -0
  658. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_file_check.py +0 -0
  659. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_file_contains_scoring.py +0 -0
  660. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_formatting.py +0 -0
  661. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_git_clone_failure.py +0 -0
  662. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_glob_paths_in_file_criteria.py +0 -0
  663. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_heartbeat_watchdog.py +0 -0
  664. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_ignore_patterns_negation.py +0 -0
  665. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_integration.py +0 -0
  666. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_json_check.py +0 -0
  667. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_judge_anthropic.py +0 -0
  668. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_judge_bedrock.py +0 -0
  669. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_judge_burn_in_live.py +0 -0
  670. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_judge_context_builder.py +0 -0
  671. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_judge_litellm.py +0 -0
  672. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_judge_models.py +0 -0
  673. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_judge_persistence.py +0 -0
  674. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_lint_no_top_level_run_limits.py +0 -0
  675. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_lint_runner.py +0 -0
  676. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_litellm_config.py +0 -0
  677. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_litellm_cost_logger.py +0 -0
  678. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_litellm_judge_live.py +0 -0
  679. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_litellm_route.py +0 -0
  680. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_llm_judge_criterion.py +0 -0
  681. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_log_tail_buffer.py +0 -0
  682. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_logging.py +0 -0
  683. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_logging_isolation.py +0 -0
  684. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_merge_characterization.py +0 -0
  685. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_merge_strategy_annotations.py +0 -0
  686. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_merge_unification.py +0 -0
  687. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_mutations.py +0 -0
  688. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_new_criteria.py +0 -0
  689. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_node_env_config.py +0 -0
  690. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_optional_dependencies.py +0 -0
  691. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_orchestrator_error_log_tail.py +0 -0
  692. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_orchestrator_telemetry.py +0 -0
  693. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_overrides_engine.py +0 -0
  694. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_parallel.py +0 -0
  695. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_path_utils.py +0 -0
  696. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_plugin_processing.py +0 -0
  697. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_plugins.py +0 -0
  698. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_pr_review_workflow.py +0 -0
  699. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_preservation_mode.py +0 -0
  700. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_pricing_registry.py +0 -0
  701. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reference_comparison_scoring.py +0 -0
  702. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reference_evaluator.py +0 -0
  703. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reference_missing_file.py +0 -0
  704. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reference_models.py +0 -0
  705. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reference_permissions.py +0 -0
  706. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_registry.py +0 -0
  707. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_release_notes.py +0 -0
  708. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_replicate_stats.py +0 -0
  709. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_report_command.py +0 -0
  710. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reports_experiment.py +0 -0
  711. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reports_junit.py +0 -0
  712. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reports_stats.py +0 -0
  713. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_reports_stats_nonfinite.py +0 -0
  714. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_resolve_task_files.py +0 -0
  715. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_retry_logic_comprehensive.py +0 -0
  716. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_routing.py +0 -0
  717. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_run_command_stdout.py +0 -0
  718. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_run_helpers.py +0 -0
  719. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_run_limits_models.py +0 -0
  720. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_run_limits_orchestrator.py +0 -0
  721. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_run_limits_resolver.py +0 -0
  722. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_runtime_tool_versions.py +0 -0
  723. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_sandbox_layer_builder.py +0 -0
  724. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_sandbox_optional.py +0 -0
  725. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_sandbox_security.py +0 -0
  726. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_sandbox_symlink_preservation.py +0 -0
  727. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_scorers.py +0 -0
  728. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_scoring_quality.py +0 -0
  729. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_sdk_option_classification.py +0 -0
  730. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_simulation_config.py +0 -0
  731. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_simulation_termination.py +0 -0
  732. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_simulation_trials.py +0 -0
  733. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_skill_triggered.py +0 -0
  734. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_streaming_agent_integration.py +0 -0
  735. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_streaming_batch.py +0 -0
  736. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_streaming_callbacks.py +0 -0
  737. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_streaming_cli.py +0 -0
  738. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_streaming_events.py +0 -0
  739. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_streaming_orchestrator.py +0 -0
  740. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_streaming_renderers.py +0 -0
  741. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_streaming_wire.py +0 -0
  742. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_sub_agent_runner.py +0 -0
  743. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_success_criterion_union.py +0 -0
  744. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_summaries.py +0 -0
  745. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_task_definition_unknown_fields.py +0 -0
  746. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_teardown_interrupt.py +0 -0
  747. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_telemetry.py +0 -0
  748. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_template_env_expansion.py +0 -0
  749. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_threshold_enforcement.py +0 -0
  750. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_timeout_batch.py +0 -0
  751. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_timeout_categorization.py +0 -0
  752. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_timeout_exceptions.py +0 -0
  753. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_timeout_models.py +0 -0
  754. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_timeout_orchestrator.py +0 -0
  755. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_uipath_eval.py +0 -0
  756. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_user_simulator.py +0 -0
  757. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_utils.py +0 -0
  758. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_utterance_extraction.py +0 -0
  759. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_variant_prompt_file.py +0 -0
  760. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_verdict_tool.py +0 -0
  761. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_verify_published_workflow.py +0 -0
  762. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_visible_turn_cap.py +0 -0
  763. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_watchdog.py +0 -0
  764. {coder_eval-0.11.7 → coder_eval-0.12.1}/tests/test_yaml_migration.py +0 -0
@@ -24,7 +24,8 @@ The run layout (`runs/<run_id>/<variant_id>/<task_id>/<NN>/…`, `<NN>` a zero-p
24
24
  1. Read `<run_path>/run.json` if present (for context — `run_id`, `start_time`).
25
25
  2. Glob `<run_path>/*/*/*/task.json` and read each one.
26
26
  3. Read `<run_path>/analysis.md` if present — it already diagnoses many failures; lean on its findings rather than re-deriving them.
27
- 4. A task counts as **failed** if `final_status != "SUCCESS"` **or** `weighted_score < 0.9`. Skip passing tasks for now (we may extend to passing tasks later the schema supports it).
27
+ 4. Skip any task whose `final_status` is `"NOT_GRADED"` `coder-eval execute` produced it, no criterion ran, and `weighted_score` is `null`. It is neither a pass nor a failure, and comparing `null < 0.9` would book every ungraded row as a failure to review.
28
+ 5. Of the rest, a task counts as **failed** if `final_status != "SUCCESS"` **or** `weighted_score < 0.9`. Skip passing tasks for now (we may extend to passing tasks later — the schema supports it).
28
29
 
29
30
  If no `task.json` files exist, write an empty `review_index.json` (`{"reviews": []}`) and exit.
30
31
 
@@ -455,3 +455,99 @@ with the two `action.yml` items above — one considered change to the action's
455
455
  `final_status`, which does not exist in `run.json` and would have made a new
456
456
  assertion dead on arrival. Guard: assert the key set that non-Python consumers
457
457
  depend on, mirroring how CE030 pins doc/schema parity.
458
+ - [ ] **A probe task's detector must not be satisfiable from the sandbox-readable task
459
+ YAML.** `docker_runner._stage_inputs` serialises the post-override `TaskDefinition` to
460
+ `/work/input/task.yaml` and mounts `tasks/` again at `/work/task_dir`, both agent-readable.
461
+ Two probes now depend on NOT being satisfiable from that text — `anti_cheat_reference` via a
462
+ regex that cannot match its own source, `record_cli_responses` via a log-derived detector —
463
+ and nothing enforces it. `record_cli_responses` originally shipped (in review) with
464
+ `file_contains` needles that were verbatim in its own YAML, which would have let a
465
+ transcribing agent pass while dispatch was dead. Guard: for every `smoke-pass` task, assert no
466
+ `file_contains` needle / `file_matches_regex` pattern on a must-match criterion appears in the
467
+ serialised task YAML. Deferred: needs per-criterion-type handling and a real false-positive
468
+ pass (paths and generic words will collide), so well over 30 min.
469
+ - [ ] **A new shim failure mode must still RECORD the invocation.** A generated shim that dies
470
+ before `record()` leaves a log byte-identical to "the agent never ran it", which passes a
471
+ `max_count: 0` guard. The sidecar import was exactly that, caught only in review. Guard:
472
+ render each shim shape, break each external dependency in turn, assert the log is non-empty.
473
+ Deferred: "each external dependency" has no enumeration today, so the rule needs a seam
474
+ (a declared list of what a shim depends on) before it can be mechanical rather than a
475
+ hand-maintained list that decays.
476
+ - [ ] **A generated-artifact invariant must be asserted against a real run of that artifact,
477
+ not against the config that produced it.** `TestRecordCliProbeIntegrity` first shipped
478
+ comparing the task YAML with itself and hardcoding `"rule": 0` — a spelling `json.dumps`'s
479
+ default separators own — so a separator change would have left it green while the blocking CI
480
+ probe failed. Now fixed for this case by running a real shim. Deferred as a general guard:
481
+ "derives its expectation from the thing it checks" is not mechanically detectable; it belongs
482
+ in the review rubric rather than a lint rule.
483
+
484
+ - [ ] A `_*TurnState` (agent turn-state) attribute that is written but never read
485
+ outside its own assignment — CE037-class dead accumulator. Surfaced during the
486
+ Pi harness port: `_PiTurnState.turns_finished` was copied from OpenCode's
487
+ `steps_finished` (which drives that agent's `finished_without_tokens` guard) but
488
+ Pi deliberately dropped that guard, leaving the counter dead. Fixed by hand this
489
+ run. Guard would need cross-method dataflow over each `Agent`-subclass turn-state
490
+ class (write sites vs read sites), which the AST-only CExxx runner can't express
491
+ in ~30 min — deferred. Caught in: Pi harness Phase 2 quality review.
492
+
493
+ - [ ] A duration/count aggregate over run-task rows that fails to exclude
494
+ `mature_skipped`. Nothing guards it: the CExxx runner is Python-AST only and
495
+ this defect class lives in the evalboard's TypeScript. A codex nightly
496
+ rendered "1300 tasks · 15h 29m" for the 397 tasks that actually ran. Fixed
497
+ for the two whole-run sites by extracting `deriveRunDuration`; a general
498
+ guard needs a TS lint surface the harness does not have.
499
+ Caught in: timing-capture Phase 1 review.
500
+
501
+ - [ ] Subtracting a SUM of intervals from a wall span where the intervals can
502
+ overlap. Semantic, not syntactic — an AST rule cannot tell a sum of
503
+ durations from a union. Antigravity shipped it: four concurrent 400ms tool
504
+ calls inside a 1000ms window summed to 1600ms and clamped generation to the
505
+ 0.0 the change existed to remove. The real guard is the replay-based
506
+ `assert_timing_captured` golden sensor, which now exists; a static rule
507
+ would not have caught it. Caught in: timing-capture Phase 3 review.
508
+
509
+ - [ ] A test fixture whose field name does not exist on the type it models.
510
+ `parseMessages`'s `CommandEntry` keys on `tool_id`; a fixture using
511
+ `tool_use_id` never resolves, params fall back to `{}`, and every tool
512
+ weighs exactly 1 — which silently turned a "split by content size" test
513
+ into a 99%-thinking assertion that passed. TypeScript accepts it because
514
+ the fixtures are untyped object literals. Typing the fixture factories
515
+ against the real interfaces would guard the whole class; that is a
516
+ sweep across the evalboard test suite, not ~30 min.
517
+ Caught in: timing-capture Phase 5 review.
518
+
519
+ ### Deferred timing divergences (not guardrails — accounting gaps)
520
+
521
+ Recorded here as well as in `docs/agents/HARNESS_PARITY.md` § Known
522
+ divergences, so the deferred-work record is one place. Measurements in
523
+ `c/time-bugs-audit.md`.
524
+
525
+ - [ ] **Antigravity books orphan-poll waiting as agent duration** (audit P2-1).
526
+ A task can spend `0.8 × turn_timeout` waiting on a tool call that never
527
+ reaches DONE — 14 tasks, 9.6h of one 83h run. Only CLOSED tool intervals are
528
+ subtracted from a generation window, so that wait stays inside whichever
529
+ window contains it; the force-close records `execution_completed_at` while
530
+ leaving `duration_ms` as `None`. Deliberately out of scope of the timing
531
+ work: closing it means deciding whether a backgrounded tool's elapsed time
532
+ is model time (the model IS generating while it runs), which is a semantic
533
+ question, not a bug fix.
534
+
535
+ - [ ] **Delegate (`delegate-sdk`) records no execution bounds** (audit P3-1).
536
+ It reports `duration_ms` but neither `execution_started_at` nor
537
+ `execution_completed_at`, so its tool calls cannot be placed on a timeline.
538
+ Coverage is ~88%, so it is not urgent. The agent lives in the separate
539
+ `coder_eval_uipath` repo; mirror the Codex change there
540
+ (`_item_timing` + threading the SDK stamps through the telemetry builders).
541
+
542
+ - [ ] **Pre-existing, surfaced by this work's final review: `TokenUsage._adopt_legacy_input_tokens`
543
+ double-counts the cache buckets.** The validator copies a legacy record's
544
+ full-prompt `input_tokens` straight into `uncached_input_tokens`, and the
545
+ computed `input_tokens` then adds `cache_creation` + `cache_read` again. A
546
+ legacy record with `input_tokens=1000`, `cache_creation=200`, `cache_read=150`
547
+ reloads as 1350 prompt tokens and bills 1000 at the uncached rate instead of
548
+ 650. Affects every report, budget check and detached regrade over a
549
+ pre-split run that used prompt caching. NOT touched by the timing work
550
+ (token accounting was explicitly out of its scope) and not a guardrail
551
+ candidate — a real bug needing its own change, with a decision about
552
+ whether legacy records can be distinguished from current ones at all.
553
+ Caught in: timing-capture final review (gpt-5.6-sol).
@@ -12,6 +12,9 @@ runs/<run_id>/<variant_id>/<task_id>/<NN>/{task.json, task.log, artifacts/}
12
12
  - `<NN>` — zero-padded replicate index (e.g. `00`, `01`).
13
13
  - `task.json` — the persisted per-replicate result (the consumer contract; carries the large `iterations` array — still accepted under its former name `turns` when reading, but not what current runs write).
14
14
  - `task.json.malformed` — present only on the docker degrade path: when an existing `task.json` fails to parse (schema skew from a stale `:latest` image, or a truncated/torn write), the docker runner moves the unparseable original aside to this sidecar and writes a synthetic `final_status=ERROR` `task.json` in its place. Diagnostic-only; `rglob("task.json")` consumers do not match it.
15
+ - `task.execute.json` — present only after a DETACHED grade (`coder-eval evaluate <run_dir>` or `coder-eval run --resume` over a `NOT_GRADED` row). The pre-grade snapshot of `task.json`, written once and never overwritten by a later grade, so "this run was executed separately from grading" stays auditable. Diagnostic-only; `rglob("task.json")` consumers do not match it.
16
+ - `task.json.graded` — present only after `coder-eval execute --driver docker` refused a container's verdict: the runtime image predated `execute` and graded anyway, so the runner quarantines the graded record here rather than leaving it readable as `task.json`, where a later `--resume` / `aggregate` would fold in exactly the row it declined to publish. Diagnostic-only; `rglob("task.json")` consumers do not match it.
17
+ - `grade.log` — present only after a DETACHED grade over this directory (`coder-eval run --resume`). The grading pass's own log. It is a separate file because the log handler truncates whatever file it opens, so writing to `task.log` would destroy the agent trajectory log the run already paid for.
15
18
  - `task.log` — the human-readable task log; `artifacts/` — files the agent produced.
16
19
 
17
20
  **Scope-marker files** (used to detect what a given path represents):
@@ -12,7 +12,7 @@
12
12
  -->
13
13
  <meta
14
14
  name="description"
15
- content="Coder Eval is Playwright for coding agents: an open-source, agent-agnostic framework for evaluating and benchmarking AI coding agents and their skills — sandboxed runs of Claude Code, Codex, Antigravity (Gemini), or OpenCode against declarative YAML tasks, with weighted scoring and CI gates. Documentation: coder-eval.com/docs"
15
+ content="Coder Eval is Playwright for coding agents: an open-source, agent-agnostic framework for evaluating and benchmarking AI coding agents and their skills — sandboxed runs of Claude Code, Codex, Antigravity (Gemini), OpenCode, or Pi against declarative YAML tasks, with weighted scoring and CI gates. Documentation: coder-eval.com/docs"
16
16
  />
17
17
 
18
18
  <!--
@@ -227,7 +227,7 @@
227
227
  <p class="lead">
228
228
  <strong>Playwright for coding agents.</strong> An open-source, agent-agnostic framework for
229
229
  evaluating and benchmarking AI coding agents and their skills: it runs a real agent — Claude
230
- Code, Codex, Antigravity (Gemini), or OpenCode — in a sandbox against declarative YAML
230
+ Code, Codex, Antigravity (Gemini), OpenCode, or Pi — in a sandbox against declarative YAML
231
231
  tasks, then scores the files and commands the agent actually produced.
232
232
  </p>
233
233
  <p class="notice">
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env python3
2
+ """Harbor end-to-end smoke test.
3
+
4
+ Exports a handful of coder-eval tasks to Harbor (`coder-eval export --format
5
+ harbor`), runs each with `hb run -a coder_eval.harbor.agent:CoderEvalAgent`
6
+ against real Docker, and asserts that:
7
+
8
+ - the verifier phase wrote `reward.json` with `reward == 1.0`
9
+ - the agent phase wrote a real ATIF `trajectory.json`
10
+ - both the agent and verifier phases left a `task.json` behind
11
+
12
+ Invoked by `.github/workflows/harbor-e2e.yml` -- deliberately NOT part of
13
+ `make test`: it shells out to a real `hb` CLI, real Docker builds, and (for
14
+ the llm_judge scenario) a real model call, none of which belong in the fast
15
+ unit-test suite.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import json
21
+ import shutil
22
+ import subprocess
23
+ import sys
24
+ from dataclasses import dataclass
25
+ from pathlib import Path
26
+
27
+
28
+ REPO_ROOT = Path(__file__).resolve().parents[2]
29
+ WORK_DIR = REPO_ROOT / "tmp" / "harbor_e2e"
30
+ AGENT_IMPORT_PATH = "coder_eval.harbor.agent:CoderEvalAgent"
31
+
32
+
33
+ @dataclass(frozen=True)
34
+ class Scenario:
35
+ """One (task.yaml, export flags) pair to round-trip through Harbor."""
36
+
37
+ name: str
38
+ task_file: Path
39
+ allow_credentials: bool = False
40
+
41
+
42
+ SCENARIOS: list[Scenario] = [
43
+ # "tmpdir" baseline: plain docker driver, default coder-eval-agent image,
44
+ # no dockerfile_path / template_sources / llm_judge -- exercises the bare
45
+ # export -> CoderEvalAgent -> --workspace-dir -> verifier round trip.
46
+ Scenario("baseline", REPO_ROOT / "tests/harbor_e2e/fixtures/docker_baseline.yaml"),
47
+ # llm_judge: real model call inside the VERIFIER phase, not just the agent.
48
+ Scenario("llm_judge", REPO_ROOT / "tests/harbor_e2e/fixtures/llm_judge.yaml", allow_credentials=True),
49
+ # Custom (BYOD) Docker image via dockerfile_path -- reuses the in-tree
50
+ # byod_smoke_test task/image rather than duplicating it.
51
+ Scenario("docker_custom_image", REPO_ROOT / "tasks/byod_smoke_test.yaml"),
52
+ # template_sources: TemplateDirSource copy-in + rewritten path, plus
53
+ # sandbox.python.env_packages surviving the agent-phase task.yaml merge.
54
+ Scenario("template_sources", REPO_ROOT / "tests/harbor_e2e/fixtures/template_sources.yaml"),
55
+ ]
56
+
57
+
58
+ def _run(cmd: list[str]) -> subprocess.CompletedProcess[str]:
59
+ print(f"+ {' '.join(cmd)}", flush=True)
60
+ return subprocess.run(cmd, check=False, text=True, capture_output=True)
61
+
62
+
63
+ def export_task(scenario: Scenario, out_dir: Path) -> None:
64
+ if out_dir.exists():
65
+ shutil.rmtree(out_dir)
66
+ cmd = ["coder-eval", "export", str(scenario.task_file), "-o", str(out_dir)]
67
+ if scenario.allow_credentials:
68
+ cmd.append("--allow-credentials")
69
+ result = _run(cmd)
70
+ print(result.stdout)
71
+ print(result.stderr, file=sys.stderr)
72
+ if result.returncode != 0:
73
+ raise RuntimeError(f"[{scenario.name}] `coder-eval export` failed (exit {result.returncode})")
74
+
75
+
76
+ def run_harbor(scenario: Scenario, export_dir: Path, jobs_dir: Path) -> Path:
77
+ if jobs_dir.exists():
78
+ shutil.rmtree(jobs_dir)
79
+ cmd = [
80
+ "hb",
81
+ "run",
82
+ "-p",
83
+ str(export_dir),
84
+ "-a",
85
+ AGENT_IMPORT_PATH,
86
+ "--jobs-dir",
87
+ str(jobs_dir),
88
+ "-n",
89
+ "1",
90
+ "-y",
91
+ ]
92
+ result = _run(cmd)
93
+ print(result.stdout)
94
+ print(result.stderr, file=sys.stderr)
95
+ if result.returncode != 0:
96
+ raise RuntimeError(f"[{scenario.name}] `hb run` failed (exit {result.returncode})")
97
+
98
+ # <jobs_dir>/<job_timestamp>/<trial_name>/{agent,verifier}/... -- glob for
99
+ # the one directory two levels down that actually holds a verifier/ output,
100
+ # rather than assuming a fixed trial-name shape Harbor doesn't guarantee.
101
+ trial_dirs = [d for d in jobs_dir.glob("*/*/") if (d / "verifier").is_dir()]
102
+ if len(trial_dirs) != 1:
103
+ raise RuntimeError(
104
+ f"[{scenario.name}] expected exactly one trial directory under {jobs_dir}, found {len(trial_dirs)}"
105
+ )
106
+ return trial_dirs[0]
107
+
108
+
109
+ def assert_scenario_artifacts(scenario: Scenario, trial_dir: Path) -> None:
110
+ reward_path = trial_dir / "verifier" / "reward.json"
111
+ if not reward_path.is_file():
112
+ raise RuntimeError(f"[{scenario.name}] missing {reward_path}")
113
+ reward = json.loads(reward_path.read_text(encoding="utf-8"))
114
+ if reward.get("reward") != 1.0:
115
+ raise RuntimeError(f"[{scenario.name}] expected reward 1.0, got {reward!r} ({reward_path})")
116
+
117
+ trajectory_path = trial_dir / "agent" / "trajectory.json"
118
+ if not trajectory_path.is_file():
119
+ raise RuntimeError(f"[{scenario.name}] missing {trajectory_path}")
120
+ trajectory = json.loads(trajectory_path.read_text(encoding="utf-8"))
121
+ if "schema_version" not in trajectory:
122
+ raise RuntimeError(f"[{scenario.name}] {trajectory_path} is missing 'schema_version'")
123
+
124
+ agent_task_jsons = list((trial_dir / "agent").glob("**/task.json"))
125
+ if not agent_task_jsons:
126
+ raise RuntimeError(f"[{scenario.name}] no task.json found under {trial_dir / 'agent'}")
127
+ verifier_task_json = trial_dir / "verifier" / "task.json"
128
+ if not verifier_task_json.is_file():
129
+ raise RuntimeError(f"[{scenario.name}] missing {verifier_task_json}")
130
+
131
+ print(
132
+ f"[{scenario.name}] OK: reward=1.0, trajectory.json present, "
133
+ + f"{len(agent_task_jsons)} agent task.json + verifier/task.json present"
134
+ )
135
+
136
+
137
+ def main() -> int:
138
+ WORK_DIR.mkdir(parents=True, exist_ok=True)
139
+ failures: list[str] = []
140
+ for scenario in SCENARIOS:
141
+ export_dir = WORK_DIR / scenario.name / "export"
142
+ jobs_dir = WORK_DIR / scenario.name / "jobs"
143
+ print(f"\n=== {scenario.name} ===", flush=True)
144
+ try:
145
+ export_task(scenario, export_dir)
146
+ trial_dir = run_harbor(scenario, export_dir, jobs_dir)
147
+ assert_scenario_artifacts(scenario, trial_dir)
148
+ except Exception as exc:
149
+ print(f"[{scenario.name}] FAILED: {exc}", file=sys.stderr)
150
+ failures.append(scenario.name)
151
+
152
+ print("\n=== Summary ===")
153
+ for scenario in SCENARIOS:
154
+ print(f" {scenario.name}: {'FAILED' if scenario.name in failures else 'OK'}")
155
+
156
+ if failures:
157
+ print(f"\n{len(failures)}/{len(SCENARIOS)} scenario(s) failed: {', '.join(failures)}", file=sys.stderr)
158
+ return 1
159
+ return 0
160
+
161
+
162
+ if __name__ == "__main__":
163
+ raise SystemExit(main())
@@ -0,0 +1,91 @@
1
+ name: Harbor E2E
2
+
3
+ # Deliberately NOT triggered on pull_request: this exercises real Docker
4
+ # builds, a real `harbor` install, and (for the llm_judge scenario) a real
5
+ # model call, so it is informational rather than a required PR check for now
6
+ # (see .github/scripts/harbor_e2e.py's module docstring). workflow_dispatch
7
+ # lets a maintainer run it on demand; the nightly schedule catches drift
8
+ # between coder-eval's own release and Harbor's own upstream releases without
9
+ # blocking anyone's PR.
10
+ on:
11
+ workflow_dispatch:
12
+ schedule:
13
+ - cron: "17 5 * * *" # nightly, off the hour to avoid GitHub's peak-load pile-up
14
+ push:
15
+ branches: [main]
16
+
17
+ concurrency:
18
+ group: ${{ github.workflow }}-${{ github.ref }}
19
+ cancel-in-progress: true
20
+
21
+ permissions:
22
+ contents: read
23
+
24
+ env:
25
+ TELEMETRY_ENABLED: "false"
26
+ # Route through Bedrock, mirroring pr-checks.yml's smoke-pass job -- keeps
27
+ # Anthropic-credit spend off this path; DirectRoute is exercised elsewhere.
28
+ API_BACKEND: "bedrock"
29
+ CLAUDE_CODE_USE_BEDROCK: "1"
30
+ AWS_BEARER_TOKEN_BEDROCK: ${{ secrets.AWS_BEARER_TOKEN_BEDROCK }}
31
+ AWS_REGION: ${{ secrets.AWS_REGION }}
32
+ BEDROCK_MODEL: ${{ secrets.BEDROCK_MODEL }}
33
+
34
+ jobs:
35
+ harbor-e2e:
36
+ name: Harbor export + CoderEvalAgent round trip
37
+ runs-on: uipath-ubuntu-latest
38
+ timeout-minutes: 20
39
+
40
+ steps:
41
+ - name: Checkout code
42
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
43
+
44
+ - name: Set up Python 3.13
45
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
46
+ with:
47
+ python-version: "3.13"
48
+
49
+ - name: Set up Node.js 20
50
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
51
+ with:
52
+ node-version: "20"
53
+
54
+ - name: Install Claude CLI
55
+ run: npm install -g @anthropic-ai/claude-code
56
+
57
+ - name: Cache dependencies
58
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
59
+ with:
60
+ path: |
61
+ ~/.cache/uv
62
+ ~/.cache/pip
63
+ key: ${{ runner.os }}-py3.13-harbor-e2e-${{ hashFiles('pyproject.toml', 'uv.lock') }}
64
+ restore-keys: |
65
+ ${{ runner.os }}-py3.13-harbor-e2e-
66
+
67
+ - name: Install uv
68
+ run: |
69
+ python -m pip install --upgrade "pip>=26.2"
70
+ pip install uv
71
+
72
+ - name: Install project dependencies (hash-verified from uv.lock)
73
+ # --extra harbor installs `harbor` into the SAME venv as coder-eval:
74
+ # CoderEvalAgent is resolved by `hb run -a
75
+ # coder_eval.harbor.agent:CoderEvalAgent` on the HOST process, so
76
+ # `harbor` and `coder_eval` must be importable from the same
77
+ # interpreter (see harbor/agent.py's module docstring). The version is
78
+ # pinned once, in pyproject.toml's `harbor` extra -- bump it there.
79
+ run: uv sync --frozen --extra dev --extra harbor
80
+
81
+ - name: Put the project venv on PATH
82
+ run: echo "${{ github.workspace }}/.venv/bin" >> "$GITHUB_PATH"
83
+
84
+ - name: Build coder-eval-agent base Docker image
85
+ run: make docker-image
86
+
87
+ - name: Build BYOD template Docker image
88
+ run: docker build -t byod-custom-image:0.1.0 templates/byod_smoke_test/
89
+
90
+ - name: Run Harbor E2E scenarios
91
+ run: python .github/scripts/harbor_e2e.py
@@ -80,7 +80,9 @@ jobs:
80
80
  pip install uv
81
81
 
82
82
  - name: Install project dependencies (hash-verified from uv.lock)
83
- run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm
83
+ # --extra harbor: pyright below type-checks src/coder_eval/harbor/agent.py
84
+ # against harbor's real types, not a scoped ignore.
85
+ run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm --extra harbor
84
86
 
85
87
  # PHASE 1: Fast checks (fail early)
86
88
  - name: Check code formatting (ruff format)
@@ -385,7 +387,9 @@ jobs:
385
387
  pip install uv
386
388
 
387
389
  - name: Install project dependencies (hash-verified from uv.lock)
388
- run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm
390
+ # --extra harbor: pyright below type-checks src/coder_eval/harbor/agent.py
391
+ # against harbor's real types, not a scoped ignore.
392
+ run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm --extra harbor
389
393
 
390
394
  - name: Check code formatting (ruff format)
391
395
  run: .venv/Scripts/ruff format --check src/ tests/
@@ -469,16 +473,16 @@ jobs:
469
473
  AWS_BEARER_TOKEN_BEDROCK: ${{ secrets.AWS_BEARER_TOKEN_BEDROCK }}
470
474
  AWS_REGION: ${{ secrets.AWS_REGION }}
471
475
  BEDROCK_MODEL: ${{ secrets.BEDROCK_MODEL }}
472
- # tasks_run for --tags smoke-pass. 7 task files (hello_date, dataset_example,
476
+ # tasks_run for --tags smoke-pass. 8 task files (hello_date, dataset_example,
473
477
  # smoke_llm_judge, smoke_agent_judge, byod_smoke_test, agentless_smoke_test,
474
- # anti_cheat_reference); dataset_example fans out to 2 inline rows, so 8
475
- # sub-tasks. If you add/remove a smoke-pass task or change the dataset row
476
- # count, bump these.
478
+ # anti_cheat_reference, record_cli_responses); dataset_example fans out to 2
479
+ # inline rows, so 9 sub-tasks. If you add/remove a smoke-pass task or change
480
+ # the dataset row count, bump these.
477
481
  #
478
482
  # anti_cheat_reference lives in a SUBDIRECTORY, which `tasks/*.yaml` does not
479
483
  # match — the smoke-pass step names its path explicitly. Keep that in sync.
480
- EXPECTED_SMOKE_PASS_RUN: "8"
481
- EXPECTED_SMOKE_PASS_SUCCEEDED: "8"
484
+ EXPECTED_SMOKE_PASS_RUN: "9"
485
+ EXPECTED_SMOKE_PASS_SUCCEEDED: "9"
482
486
  # smoke-fail bucket: three tasks expected to fail.
483
487
  # 1. smoke_negative_path: file_contains criterion is unsatisfiable
484
488
  # (sentinel-string regression detection for success-checker).
@@ -549,6 +553,9 @@ jobs:
549
553
  # explicitly. anti_cheat_reference is the adversarial probe that the agent
550
554
  # cannot read the reference solution during its turn; it needs the
551
555
  # coder-eval-agent image built above (it is a driver: docker task).
556
+ # record_cli_responses is the record_cli per-invocation-response probe and
557
+ # is also driver: docker, so it needs that same image; it is flat in
558
+ # tasks/, so the glob already matches it.
552
559
  - name: Run smoke-pass bucket (expect all to succeed)
553
560
  run: |
554
561
  .venv/bin/coder-eval run tasks/*.yaml tasks/anti_cheat_reference/*.yaml \
@@ -541,6 +541,18 @@ jobs:
541
541
  "uploaded run dir before re-running; this is an unattended paid job.")
542
542
  sys.exit(1)
543
543
 
544
+ # NOT_GRADED means a task ran but was never scored. This job invokes the
545
+ # published action, which runs `coder-eval run` (graded), so reaching it is
546
+ # impossible unless the action started dispatching `coder-eval execute` --
547
+ # in which case every score gate below silently measures nothing and the job
548
+ # goes green having verified no verdict at all. Hard-fail, don't tolerate.
549
+ ungraded = [s for s in statuses if s == "NOT_GRADED"]
550
+ if ungraded:
551
+ print("::error::task(s) reported NOT_GRADED -- the published action ran without "
552
+ "grading. `coder-eval run` always grades, so the action is dispatching the "
553
+ "wrong command and every score gate in this job is measuring nothing.")
554
+ sys.exit(1)
555
+
544
556
  # Exit-contract check, conditional on the model having actually performed.
545
557
  # Ignoring the step's exit code entirely (see the continue-on-error rationale
546
558
  # above) would also hide a REGRESSION in the action's own exit logic -- e.g. a