coder-eval 0.12.2__tar.gz → 0.12.4__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 (1006) hide show
  1. coder_eval-0.12.4/.claude/harness-candidates.md +1011 -0
  2. coder_eval-0.12.4/.claude/notes/README.md +86 -0
  3. coder_eval-0.12.4/.claude/notes/agents.md +744 -0
  4. coder_eval-0.12.4/.claude/notes/contracts.md +393 -0
  5. coder_eval-0.12.4/.claude/notes/isolation.md +1038 -0
  6. coder_eval-0.12.4/.claude/notes/lint-rules.md +964 -0
  7. coder_eval-0.12.4/.claude/notes/orchestration.md +872 -0
  8. coder_eval-0.12.4/.claude/notes/permissions.md +164 -0
  9. coder_eval-0.12.4/.claude/notes/persistence.md +201 -0
  10. coder_eval-0.12.4/.claude/notes/reporting.md +586 -0
  11. coder_eval-0.12.4/.claude/notes/timing.md +423 -0
  12. coder_eval-0.12.4/.claude/shared/run-layout.md +33 -0
  13. coder_eval-0.12.4/.github/scripts/harbor_e2e.py +287 -0
  14. coder_eval-0.12.4/.github/workflows/harbor-e2e.yml +117 -0
  15. coder_eval-0.12.4/CHANGELOG.md +3991 -0
  16. coder_eval-0.12.4/CLAUDE.md +325 -0
  17. coder_eval-0.12.4/Makefile +148 -0
  18. coder_eval-0.12.4/PKG-INFO +440 -0
  19. coder_eval-0.12.4/action.yml +268 -0
  20. coder_eval-0.12.4/docker/Dockerfile.runtime +114 -0
  21. coder_eval-0.12.4/docs/DOCKER_ISOLATION.md +344 -0
  22. coder_eval-0.12.4/docs/REPORT_SCHEMA.md +366 -0
  23. coder_eval-0.12.4/docs/USER_GUIDE.md +460 -0
  24. coder_eval-0.12.4/plugins/coder-eval/.claude-plugin/plugin.json +23 -0
  25. coder_eval-0.12.4/plugins/coder-eval/reference/run-layout.md +32 -0
  26. coder_eval-0.12.4/pyproject.toml +489 -0
  27. coder_eval-0.12.4/src/coder_eval/__init__.py +3 -0
  28. coder_eval-0.12.4/src/coder_eval/cli/__init__.py +92 -0
  29. coder_eval-0.12.4/src/coder_eval/cli/evaluate_command.py +672 -0
  30. coder_eval-0.12.4/src/coder_eval/cli/execute_command.py +280 -0
  31. coder_eval-0.12.4/src/coder_eval/cli/export_command.py +116 -0
  32. coder_eval-0.12.4/src/coder_eval/cli/report_command.py +189 -0
  33. coder_eval-0.12.4/src/coder_eval/cli/run_command.py +1189 -0
  34. coder_eval-0.12.4/src/coder_eval/cli/run_task_internal_command.py +301 -0
  35. coder_eval-0.12.4/src/coder_eval/config.py +218 -0
  36. coder_eval-0.12.4/src/coder_eval/criteria/base.py +458 -0
  37. coder_eval-0.12.4/src/coder_eval/criteria/cli_called.py +193 -0
  38. coder_eval-0.12.4/src/coder_eval/harbor/agent.py +135 -0
  39. coder_eval-0.12.4/src/coder_eval/harbor/atif_emit.py +416 -0
  40. coder_eval-0.12.4/src/coder_eval/harbor/experiment_packager.py +205 -0
  41. coder_eval-0.12.4/src/coder_eval/harbor/packager.py +708 -0
  42. coder_eval-0.12.4/src/coder_eval/harbor/portability.py +130 -0
  43. coder_eval-0.12.4/src/coder_eval/isolation/docker_runner.py +1436 -0
  44. coder_eval-0.12.4/src/coder_eval/logging_config.py +396 -0
  45. coder_eval-0.12.4/src/coder_eval/models/__init__.py +425 -0
  46. coder_eval-0.12.4/src/coder_eval/models/container_context.py +65 -0
  47. coder_eval-0.12.4/src/coder_eval/models/container_paths.py +106 -0
  48. coder_eval-0.12.4/src/coder_eval/models/criteria.py +1391 -0
  49. coder_eval-0.12.4/src/coder_eval/orchestration/batch.py +835 -0
  50. coder_eval-0.12.4/src/coder_eval/orchestration/config.py +200 -0
  51. coder_eval-0.12.4/src/coder_eval/orchestration/early_stop.py +553 -0
  52. coder_eval-0.12.4/src/coder_eval/orchestration/experiment.py +962 -0
  53. coder_eval-0.12.4/src/coder_eval/orchestration/regrade.py +1019 -0
  54. coder_eval-0.12.4/src/coder_eval/orchestration/run_summary_rebuild.py +136 -0
  55. coder_eval-0.12.4/src/coder_eval/orchestrator.py +3090 -0
  56. coder_eval-0.12.4/src/coder_eval/path_utils.py +288 -0
  57. coder_eval-0.12.4/src/coder_eval/reports/helpers.py +242 -0
  58. coder_eval-0.12.4/src/coder_eval/sandbox.py +1582 -0
  59. coder_eval-0.12.4/src/coder_eval/timing.py +315 -0
  60. coder_eval-0.12.4/tests/_bracket_clock.py +77 -0
  61. coder_eval-0.12.4/tests/_container_contract.py +25 -0
  62. coder_eval-0.12.4/tests/_fixtures/golden_streams/_scrub.py +249 -0
  63. coder_eval-0.12.4/tests/_fixtures/golden_streams/codex_fixtures.py +400 -0
  64. coder_eval-0.12.4/tests/_fixtures/golden_streams/opencode_fixtures.py +367 -0
  65. coder_eval-0.12.4/tests/_fixtures/golden_streams/pi_fixtures.py +333 -0
  66. coder_eval-0.12.4/tests/_fixtures/harbor_export_golden/expected/task.toml +75 -0
  67. coder_eval-0.12.4/tests/_fixtures/harbor_export_golden/expected/tests/test.sh +37 -0
  68. coder_eval-0.12.4/tests/_fixtures/harbor_export_golden/source_task/environment/Dockerfile +2 -0
  69. coder_eval-0.12.4/tests/harbor_e2e/fixtures/llm_judge.yaml +44 -0
  70. coder_eval-0.12.4/tests/harbor_e2e/fixtures/trajectory_criteria.yaml +43 -0
  71. coder_eval-0.12.4/tests/lint/action_docs.py +287 -0
  72. coder_eval-0.12.4/tests/lint/agent_roster_parity.py +111 -0
  73. coder_eval-0.12.4/tests/lint/dead_config_fields.py +71 -0
  74. coder_eval-0.12.4/tests/lint/doc_env_parity.py +120 -0
  75. coder_eval-0.12.4/tests/lint/doc_examples.py +206 -0
  76. coder_eval-0.12.4/tests/lint/doc_indexes.py +263 -0
  77. coder_eval-0.12.4/tests/lint/doc_schema_parity.py +76 -0
  78. coder_eval-0.12.4/tests/lint/live_verdict_contract.py +488 -0
  79. coder_eval-0.12.4/tests/lint/plugin_manifest_parity.py +89 -0
  80. coder_eval-0.12.4/tests/lint/plugin_reference.py +233 -0
  81. coder_eval-0.12.4/tests/lint/pricing_mirror.py +141 -0
  82. coder_eval-0.12.4/tests/lint/prose_budget.py +617 -0
  83. coder_eval-0.12.4/tests/lint/rules/_layers.py +115 -0
  84. coder_eval-0.12.4/tests/lint/rules/_model_ctor.py +109 -0
  85. coder_eval-0.12.4/tests/lint/rules/ce014_merge_strategy_declared.py +109 -0
  86. coder_eval-0.12.4/tests/lint/rules/ce019_telemetry_non_fatal.py +82 -0
  87. coder_eval-0.12.4/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +102 -0
  88. coder_eval-0.12.4/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +89 -0
  89. coder_eval-0.12.4/tests/lint/rules/ce022_dialog_loop_statement_cap.py +57 -0
  90. coder_eval-0.12.4/tests/lint/rules/ce024_discriminated_unions.py +129 -0
  91. coder_eval-0.12.4/tests/lint/rules/ce032_criteria_path_seam.py +42 -0
  92. coder_eval-0.12.4/tests/lint/rules/ce037_no_dead_private_helper.py +106 -0
  93. coder_eval-0.12.4/tests/lint/rules/ce038_acquire_inside_try.py +79 -0
  94. coder_eval-0.12.4/tests/lint/rules/ce039_config_error_escalates.py +72 -0
  95. coder_eval-0.12.4/tests/lint/rules/ce043_no_command_output_truncation.py +69 -0
  96. coder_eval-0.12.4/tests/lint/rules/ce046_env_info_spreads_super.py +72 -0
  97. coder_eval-0.12.4/tests/lint/rules/ce048_no_in_process_typer_command_call.py +104 -0
  98. coder_eval-0.12.4/tests/lint/rules/ce049_no_score_or_zero.py +60 -0
  99. coder_eval-0.12.4/tests/lint/rules/ce050_no_union_getattr_probe.py +114 -0
  100. coder_eval-0.12.4/tests/lint/rules/ce051_no_driver_override.py +86 -0
  101. coder_eval-0.12.4/tests/lint/rules/ce052_process_lethal_must_be_container_gated.py +75 -0
  102. coder_eval-0.12.4/tests/lint/rules/ce053_run_record_filename_literal.py +87 -0
  103. coder_eval-0.12.4/tests/lint/rules/ce054_env_info_key_round_trip.py +123 -0
  104. coder_eval-0.12.4/tests/lint/rules/ce056_no_container_env_literal.py +66 -0
  105. coder_eval-0.12.4/tests/lint/rules/ce057_sidecar_shim_stdlib_only.py +72 -0
  106. coder_eval-0.12.4/tests/lint/rules/ce058_no_timing_literal.py +210 -0
  107. coder_eval-0.12.4/tests/lint/rules/ce059_generation_window_is_two_reads.py +59 -0
  108. coder_eval-0.12.4/tests/lint/rules/ce060_message_id_declared.py +67 -0
  109. coder_eval-0.12.4/tests/lint/rules/ce061_window_via_close_window.py +106 -0
  110. coder_eval-0.12.4/tests/lint/rules/ce063_no_busy_ms_in_agents.py +76 -0
  111. coder_eval-0.12.4/tests/lint/rules/ce064_turn_bracket_on_the_clock.py +73 -0
  112. coder_eval-0.12.4/tests/lint/rules/ce066_no_report_imports_in_core.py +89 -0
  113. coder_eval-0.12.4/tests/lint/rules/no_agent_timing_access.py +42 -0
  114. coder_eval-0.12.4/tests/lint/rules/no_cli_imports_in_core.py +51 -0
  115. coder_eval-0.12.4/tests/lint/rules/no_top_level_run_limits_access.py +121 -0
  116. coder_eval-0.12.4/tests/lint/rules/no_transcript_regex_in_eval.py +74 -0
  117. coder_eval-0.12.4/tests/lint/rules/yaml_models_forbid_extras.py +108 -0
  118. coder_eval-0.12.4/tests/lint/runner.py +180 -0
  119. coder_eval-0.12.4/tests/lint/workflow_outputs.py +251 -0
  120. coder_eval-0.12.4/tests/test_action_inputs.py +478 -0
  121. coder_eval-0.12.4/tests/test_action_version_pin.py +83 -0
  122. coder_eval-0.12.4/tests/test_agent.py +1972 -0
  123. coder_eval-0.12.4/tests/test_agent_config_no_timing_fields.py +50 -0
  124. coder_eval-0.12.4/tests/test_agent_config_sdk_decoupling.py +130 -0
  125. coder_eval-0.12.4/tests/test_agent_golden_master.py +488 -0
  126. coder_eval-0.12.4/tests/test_agent_telemetry.py +1563 -0
  127. coder_eval-0.12.4/tests/test_antigravity_agent.py +2197 -0
  128. coder_eval-0.12.4/tests/test_atif_emit.py +417 -0
  129. coder_eval-0.12.4/tests/test_cleanup_preservation_guard.py +263 -0
  130. coder_eval-0.12.4/tests/test_cli_called_criterion.py +1147 -0
  131. coder_eval-0.12.4/tests/test_cli_telemetry.py +160 -0
  132. coder_eval-0.12.4/tests/test_codex_agent.py +2709 -0
  133. coder_eval-0.12.4/tests/test_codex_agent_unit.py +274 -0
  134. coder_eval-0.12.4/tests/test_command_executed.py +1103 -0
  135. coder_eval-0.12.4/tests/test_command_statistics.py +83 -0
  136. coder_eval-0.12.4/tests/test_container_context.py +333 -0
  137. coder_eval-0.12.4/tests/test_custom_lint.py +5225 -0
  138. coder_eval-0.12.4/tests/test_detached_grading_boundaries.py +1027 -0
  139. coder_eval-0.12.4/tests/test_detached_grading_guards.py +471 -0
  140. coder_eval-0.12.4/tests/test_docker_build_failure.py +107 -0
  141. coder_eval-0.12.4/tests/test_docker_runner_container_death.py +283 -0
  142. coder_eval-0.12.4/tests/test_docker_runner_mounts.py +1176 -0
  143. coder_eval-0.12.4/tests/test_early_stop.py +3183 -0
  144. coder_eval-0.12.4/tests/test_error_handling.py +853 -0
  145. coder_eval-0.12.4/tests/test_evaluate_command.py +419 -0
  146. coder_eval-0.12.4/tests/test_event_collector.py +1316 -0
  147. coder_eval-0.12.4/tests/test_execute_command.py +374 -0
  148. coder_eval-0.12.4/tests/test_execute_evaluate_loop.py +763 -0
  149. coder_eval-0.12.4/tests/test_experiment_reports.py +1809 -0
  150. coder_eval-0.12.4/tests/test_experiment_resolver.py +1134 -0
  151. coder_eval-0.12.4/tests/test_experiment_runner.py +830 -0
  152. coder_eval-0.12.4/tests/test_harbor_agent.py +186 -0
  153. coder_eval-0.12.4/tests/test_harbor_e2e_fixtures.py +49 -0
  154. coder_eval-0.12.4/tests/test_harbor_experiment_packager.py +301 -0
  155. coder_eval-0.12.4/tests/test_harbor_export_golden.py +105 -0
  156. coder_eval-0.12.4/tests/test_harbor_packager.py +752 -0
  157. coder_eval-0.12.4/tests/test_harbor_portability.py +140 -0
  158. coder_eval-0.12.4/tests/test_image_from_dockerfiles.py +516 -0
  159. coder_eval-0.12.4/tests/test_image_skew_refusal.py +180 -0
  160. coder_eval-0.12.4/tests/test_judge_anthropic.py +139 -0
  161. coder_eval-0.12.4/tests/test_judge_context_builder.py +851 -0
  162. coder_eval-0.12.4/tests/test_judge_models.py +95 -0
  163. coder_eval-0.12.4/tests/test_judge_persistence.py +603 -0
  164. coder_eval-0.12.4/tests/test_litellm_route.py +745 -0
  165. coder_eval-0.12.4/tests/test_llm_judge_criterion.py +1249 -0
  166. coder_eval-0.12.4/tests/test_models.py +692 -0
  167. coder_eval-0.12.4/tests/test_new_criteria.py +202 -0
  168. coder_eval-0.12.4/tests/test_opencode_agent.py +2219 -0
  169. coder_eval-0.12.4/tests/test_orchestrator.py +2500 -0
  170. coder_eval-0.12.4/tests/test_parallel.py +463 -0
  171. coder_eval-0.12.4/tests/test_path_utils.py +305 -0
  172. coder_eval-0.12.4/tests/test_pi_agent.py +1585 -0
  173. coder_eval-0.12.4/tests/test_pr_review_workflow.py +163 -0
  174. coder_eval-0.12.4/tests/test_preservation_mode.py +197 -0
  175. coder_eval-0.12.4/tests/test_prose_budget.py +615 -0
  176. coder_eval-0.12.4/tests/test_prose_budget_commands.py +35 -0
  177. coder_eval-0.12.4/tests/test_reference_permissions.py +1136 -0
  178. coder_eval-0.12.4/tests/test_regrade.py +1242 -0
  179. coder_eval-0.12.4/tests/test_reports_junit.py +904 -0
  180. coder_eval-0.12.4/tests/test_run_command_junit.py +77 -0
  181. coder_eval-0.12.4/tests/test_run_helpers.py +79 -0
  182. coder_eval-0.12.4/tests/test_run_limits_resolver.py +338 -0
  183. coder_eval-0.12.4/tests/test_run_metrics.py +251 -0
  184. coder_eval-0.12.4/tests/test_run_summary_rebuild.py +505 -0
  185. coder_eval-0.12.4/tests/test_sandbox.py +1363 -0
  186. coder_eval-0.12.4/tests/test_sandbox_adopt.py +240 -0
  187. coder_eval-0.12.4/tests/test_sandbox_record_cli.py +1180 -0
  188. coder_eval-0.12.4/tests/test_sandbox_templates.py +773 -0
  189. coder_eval-0.12.4/tests/test_sandbox_venv_live.py +100 -0
  190. coder_eval-0.12.4/tests/test_seed_from_prior_result.py +333 -0
  191. coder_eval-0.12.4/tests/test_streaming_events.py +193 -0
  192. coder_eval-0.12.4/tests/test_sub_agent_runner.py +700 -0
  193. coder_eval-0.12.4/tests/test_suite_rollup.py +826 -0
  194. coder_eval-0.12.4/tests/test_tags.py +460 -0
  195. coder_eval-0.12.4/tests/test_task_definition_unknown_fields.py +66 -0
  196. coder_eval-0.12.4/tests/test_teardown_interrupt.py +90 -0
  197. coder_eval-0.12.4/tests/test_telemetry.py +610 -0
  198. coder_eval-0.12.4/tests/test_timeout_exceptions.py +101 -0
  199. coder_eval-0.12.4/tests/test_timing_close_window.py +592 -0
  200. coder_eval-0.12.4/tests/test_timing_identity_contract.py +637 -0
  201. coder_eval-0.12.4/tests/test_ungraded_reporting.py +290 -0
  202. coder_eval-0.12.4/tests/test_verify_published_workflow.py +471 -0
  203. coder_eval-0.12.4/uv.lock +3373 -0
  204. coder_eval-0.12.2/.claude/harness-candidates.md +0 -964
  205. coder_eval-0.12.2/.claude/notes/README.md +0 -66
  206. coder_eval-0.12.2/.claude/notes/agents.md +0 -715
  207. coder_eval-0.12.2/.claude/notes/contracts.md +0 -376
  208. coder_eval-0.12.2/.claude/notes/isolation.md +0 -915
  209. coder_eval-0.12.2/.claude/notes/orchestration.md +0 -825
  210. coder_eval-0.12.2/.claude/notes/permissions.md +0 -150
  211. coder_eval-0.12.2/.claude/notes/persistence.md +0 -113
  212. coder_eval-0.12.2/.claude/notes/reporting.md +0 -502
  213. coder_eval-0.12.2/.claude/notes/timing.md +0 -310
  214. coder_eval-0.12.2/.claude/shared/run-layout.md +0 -33
  215. coder_eval-0.12.2/.github/scripts/harbor_e2e.py +0 -163
  216. coder_eval-0.12.2/.github/workflows/harbor-e2e.yml +0 -91
  217. coder_eval-0.12.2/CHANGELOG.md +0 -3774
  218. coder_eval-0.12.2/CLAUDE.md +0 -320
  219. coder_eval-0.12.2/Makefile +0 -148
  220. coder_eval-0.12.2/PKG-INFO +0 -440
  221. coder_eval-0.12.2/action.yml +0 -268
  222. coder_eval-0.12.2/docker/Dockerfile.runtime +0 -114
  223. coder_eval-0.12.2/docs/DOCKER_ISOLATION.md +0 -342
  224. coder_eval-0.12.2/docs/REPORT_SCHEMA.md +0 -366
  225. coder_eval-0.12.2/docs/USER_GUIDE.md +0 -455
  226. coder_eval-0.12.2/plugins/coder-eval/.claude-plugin/plugin.json +0 -23
  227. coder_eval-0.12.2/plugins/coder-eval/reference/run-layout.md +0 -32
  228. coder_eval-0.12.2/pyproject.toml +0 -490
  229. coder_eval-0.12.2/src/coder_eval/__init__.py +0 -3
  230. coder_eval-0.12.2/src/coder_eval/cli/__init__.py +0 -95
  231. coder_eval-0.12.2/src/coder_eval/cli/aggregate_command.py +0 -153
  232. coder_eval-0.12.2/src/coder_eval/cli/evaluate_command.py +0 -639
  233. coder_eval-0.12.2/src/coder_eval/cli/execute_command.py +0 -253
  234. coder_eval-0.12.2/src/coder_eval/cli/export_command.py +0 -126
  235. coder_eval-0.12.2/src/coder_eval/cli/report_command.py +0 -139
  236. coder_eval-0.12.2/src/coder_eval/cli/run_command.py +0 -1105
  237. coder_eval-0.12.2/src/coder_eval/cli/run_task_internal_command.py +0 -343
  238. coder_eval-0.12.2/src/coder_eval/config.py +0 -217
  239. coder_eval-0.12.2/src/coder_eval/criteria/base.py +0 -464
  240. coder_eval-0.12.2/src/coder_eval/criteria/cli_called.py +0 -194
  241. coder_eval-0.12.2/src/coder_eval/harbor/agent.py +0 -126
  242. coder_eval-0.12.2/src/coder_eval/harbor/atif_emit.py +0 -412
  243. coder_eval-0.12.2/src/coder_eval/harbor/experiment_packager.py +0 -208
  244. coder_eval-0.12.2/src/coder_eval/harbor/packager.py +0 -731
  245. coder_eval-0.12.2/src/coder_eval/harbor/portability.py +0 -134
  246. coder_eval-0.12.2/src/coder_eval/isolation/docker_runner.py +0 -1523
  247. coder_eval-0.12.2/src/coder_eval/logging_config.py +0 -383
  248. coder_eval-0.12.2/src/coder_eval/models/__init__.py +0 -421
  249. coder_eval-0.12.2/src/coder_eval/models/container_paths.py +0 -105
  250. coder_eval-0.12.2/src/coder_eval/models/criteria.py +0 -1393
  251. coder_eval-0.12.2/src/coder_eval/orchestration/batch.py +0 -785
  252. coder_eval-0.12.2/src/coder_eval/orchestration/config.py +0 -125
  253. coder_eval-0.12.2/src/coder_eval/orchestration/early_stop.py +0 -555
  254. coder_eval-0.12.2/src/coder_eval/orchestration/experiment.py +0 -961
  255. coder_eval-0.12.2/src/coder_eval/orchestration/regrade.py +0 -997
  256. coder_eval-0.12.2/src/coder_eval/orchestrator.py +0 -3063
  257. coder_eval-0.12.2/src/coder_eval/path_utils.py +0 -221
  258. coder_eval-0.12.2/src/coder_eval/reports/helpers.py +0 -251
  259. coder_eval-0.12.2/src/coder_eval/sandbox.py +0 -1544
  260. coder_eval-0.12.2/src/coder_eval/timing.py +0 -316
  261. coder_eval-0.12.2/tests/_bracket_clock.py +0 -97
  262. coder_eval-0.12.2/tests/_fixtures/golden_streams/_scrub.py +0 -319
  263. coder_eval-0.12.2/tests/_fixtures/golden_streams/codex_fixtures.py +0 -402
  264. coder_eval-0.12.2/tests/_fixtures/golden_streams/opencode_fixtures.py +0 -375
  265. coder_eval-0.12.2/tests/_fixtures/golden_streams/pi_fixtures.py +0 -345
  266. coder_eval-0.12.2/tests/_fixtures/harbor_export_golden/expected/environment/Dockerfile +0 -4
  267. coder_eval-0.12.2/tests/_fixtures/harbor_export_golden/expected/task.toml +0 -73
  268. coder_eval-0.12.2/tests/_fixtures/harbor_export_golden/expected/tests/test.sh +0 -17
  269. coder_eval-0.12.2/tests/harbor_e2e/fixtures/llm_judge.yaml +0 -44
  270. coder_eval-0.12.2/tests/lint/action_docs.py +0 -302
  271. coder_eval-0.12.2/tests/lint/agent_roster_parity.py +0 -124
  272. coder_eval-0.12.2/tests/lint/dead_config_fields.py +0 -83
  273. coder_eval-0.12.2/tests/lint/doc_env_parity.py +0 -148
  274. coder_eval-0.12.2/tests/lint/doc_examples.py +0 -218
  275. coder_eval-0.12.2/tests/lint/doc_indexes.py +0 -267
  276. coder_eval-0.12.2/tests/lint/doc_schema_parity.py +0 -98
  277. coder_eval-0.12.2/tests/lint/live_verdict_contract.py +0 -555
  278. coder_eval-0.12.2/tests/lint/plugin_manifest_parity.py +0 -101
  279. coder_eval-0.12.2/tests/lint/plugin_reference.py +0 -254
  280. coder_eval-0.12.2/tests/lint/pricing_mirror.py +0 -165
  281. coder_eval-0.12.2/tests/lint/prose_budget.py +0 -523
  282. coder_eval-0.12.2/tests/lint/rules/_layers.py +0 -142
  283. coder_eval-0.12.2/tests/lint/rules/_model_ctor.py +0 -116
  284. coder_eval-0.12.2/tests/lint/rules/ce014_merge_strategy_declared.py +0 -120
  285. coder_eval-0.12.2/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -86
  286. coder_eval-0.12.2/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -110
  287. coder_eval-0.12.2/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -99
  288. coder_eval-0.12.2/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -63
  289. coder_eval-0.12.2/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -52
  290. coder_eval-0.12.2/tests/lint/rules/ce024_discriminated_unions.py +0 -137
  291. coder_eval-0.12.2/tests/lint/rules/ce032_criteria_path_seam.py +0 -50
  292. coder_eval-0.12.2/tests/lint/rules/ce037_no_dead_private_helper.py +0 -115
  293. coder_eval-0.12.2/tests/lint/rules/ce038_acquire_inside_try.py +0 -91
  294. coder_eval-0.12.2/tests/lint/rules/ce039_config_error_escalates.py +0 -81
  295. coder_eval-0.12.2/tests/lint/rules/ce043_no_command_output_truncation.py +0 -75
  296. coder_eval-0.12.2/tests/lint/rules/ce046_env_info_spreads_super.py +0 -83
  297. coder_eval-0.12.2/tests/lint/rules/ce048_no_in_process_typer_command_call.py +0 -106
  298. coder_eval-0.12.2/tests/lint/rules/ce049_no_score_or_zero.py +0 -70
  299. coder_eval-0.12.2/tests/lint/rules/ce050_no_union_getattr_probe.py +0 -132
  300. coder_eval-0.12.2/tests/lint/rules/ce051_no_driver_override.py +0 -94
  301. coder_eval-0.12.2/tests/lint/rules/ce052_process_lethal_must_be_container_gated.py +0 -98
  302. coder_eval-0.12.2/tests/lint/rules/ce053_run_record_filename_literal.py +0 -96
  303. coder_eval-0.12.2/tests/lint/rules/ce054_env_info_key_round_trip.py +0 -126
  304. coder_eval-0.12.2/tests/lint/rules/ce056_no_container_env_literal.py +0 -83
  305. coder_eval-0.12.2/tests/lint/rules/ce057_sidecar_shim_stdlib_only.py +0 -82
  306. coder_eval-0.12.2/tests/lint/rules/ce058_no_timing_literal.py +0 -277
  307. coder_eval-0.12.2/tests/lint/rules/ce059_generation_window_is_two_reads.py +0 -79
  308. coder_eval-0.12.2/tests/lint/rules/ce060_message_id_declared.py +0 -112
  309. coder_eval-0.12.2/tests/lint/rules/ce061_window_via_close_window.py +0 -141
  310. coder_eval-0.12.2/tests/lint/rules/ce063_no_busy_ms_in_agents.py +0 -105
  311. coder_eval-0.12.2/tests/lint/rules/ce064_turn_bracket_on_the_clock.py +0 -116
  312. coder_eval-0.12.2/tests/lint/rules/ce066_no_report_imports_in_core.py +0 -106
  313. coder_eval-0.12.2/tests/lint/rules/no_agent_timing_access.py +0 -43
  314. coder_eval-0.12.2/tests/lint/rules/no_cli_imports_in_core.py +0 -63
  315. coder_eval-0.12.2/tests/lint/rules/no_top_level_run_limits_access.py +0 -122
  316. coder_eval-0.12.2/tests/lint/rules/no_transcript_regex_in_eval.py +0 -82
  317. coder_eval-0.12.2/tests/lint/rules/yaml_models_forbid_extras.py +0 -147
  318. coder_eval-0.12.2/tests/lint/runner.py +0 -190
  319. coder_eval-0.12.2/tests/lint/workflow_outputs.py +0 -269
  320. coder_eval-0.12.2/tests/test_action_inputs.py +0 -499
  321. coder_eval-0.12.2/tests/test_action_version_pin.py +0 -98
  322. coder_eval-0.12.2/tests/test_agent.py +0 -1992
  323. coder_eval-0.12.2/tests/test_agent_config_no_timing_fields.py +0 -49
  324. coder_eval-0.12.2/tests/test_agent_config_sdk_decoupling.py +0 -130
  325. coder_eval-0.12.2/tests/test_agent_golden_master.py +0 -544
  326. coder_eval-0.12.2/tests/test_agent_telemetry.py +0 -1578
  327. coder_eval-0.12.2/tests/test_aggregate.py +0 -347
  328. coder_eval-0.12.2/tests/test_antigravity_agent.py +0 -2239
  329. coder_eval-0.12.2/tests/test_atif_emit.py +0 -365
  330. coder_eval-0.12.2/tests/test_cleanup_preservation_guard.py +0 -215
  331. coder_eval-0.12.2/tests/test_cli_called_criterion.py +0 -1145
  332. coder_eval-0.12.2/tests/test_cli_telemetry.py +0 -160
  333. coder_eval-0.12.2/tests/test_codex_agent.py +0 -2715
  334. coder_eval-0.12.2/tests/test_codex_agent_unit.py +0 -280
  335. coder_eval-0.12.2/tests/test_command_executed.py +0 -1106
  336. coder_eval-0.12.2/tests/test_command_statistics.py +0 -83
  337. coder_eval-0.12.2/tests/test_custom_lint.py +0 -5358
  338. coder_eval-0.12.2/tests/test_detached_grading_boundaries.py +0 -951
  339. coder_eval-0.12.2/tests/test_detached_grading_guards.py +0 -479
  340. coder_eval-0.12.2/tests/test_docker_build_failure.py +0 -107
  341. coder_eval-0.12.2/tests/test_docker_runner_container_death.py +0 -273
  342. coder_eval-0.12.2/tests/test_docker_runner_mounts.py +0 -1179
  343. coder_eval-0.12.2/tests/test_early_stop.py +0 -3285
  344. coder_eval-0.12.2/tests/test_error_handling.py +0 -853
  345. coder_eval-0.12.2/tests/test_evaluate_command.py +0 -218
  346. coder_eval-0.12.2/tests/test_event_collector.py +0 -1317
  347. coder_eval-0.12.2/tests/test_execute_command.py +0 -305
  348. coder_eval-0.12.2/tests/test_execute_evaluate_loop.py +0 -771
  349. coder_eval-0.12.2/tests/test_experiment_reports.py +0 -1809
  350. coder_eval-0.12.2/tests/test_experiment_resolver.py +0 -1134
  351. coder_eval-0.12.2/tests/test_experiment_runner.py +0 -833
  352. coder_eval-0.12.2/tests/test_harbor_agent.py +0 -171
  353. coder_eval-0.12.2/tests/test_harbor_experiment_packager.py +0 -308
  354. coder_eval-0.12.2/tests/test_harbor_export_golden.py +0 -104
  355. coder_eval-0.12.2/tests/test_harbor_packager.py +0 -690
  356. coder_eval-0.12.2/tests/test_harbor_portability.py +0 -135
  357. coder_eval-0.12.2/tests/test_image_from_dockerfiles.py +0 -540
  358. coder_eval-0.12.2/tests/test_judge_anthropic.py +0 -139
  359. coder_eval-0.12.2/tests/test_judge_context_builder.py +0 -855
  360. coder_eval-0.12.2/tests/test_judge_models.py +0 -96
  361. coder_eval-0.12.2/tests/test_judge_persistence.py +0 -603
  362. coder_eval-0.12.2/tests/test_litellm_route.py +0 -746
  363. coder_eval-0.12.2/tests/test_llm_judge_criterion.py +0 -1249
  364. coder_eval-0.12.2/tests/test_models.py +0 -689
  365. coder_eval-0.12.2/tests/test_new_criteria.py +0 -216
  366. coder_eval-0.12.2/tests/test_opencode_agent.py +0 -2228
  367. coder_eval-0.12.2/tests/test_orchestrator.py +0 -2501
  368. coder_eval-0.12.2/tests/test_parallel.py +0 -213
  369. coder_eval-0.12.2/tests/test_path_utils.py +0 -131
  370. coder_eval-0.12.2/tests/test_pi_agent.py +0 -1600
  371. coder_eval-0.12.2/tests/test_pr_review_workflow.py +0 -172
  372. coder_eval-0.12.2/tests/test_preservation_mode.py +0 -194
  373. coder_eval-0.12.2/tests/test_prose_budget.py +0 -406
  374. coder_eval-0.12.2/tests/test_reference_permissions.py +0 -1147
  375. coder_eval-0.12.2/tests/test_regrade.py +0 -1274
  376. coder_eval-0.12.2/tests/test_reports_junit.py +0 -904
  377. coder_eval-0.12.2/tests/test_run_command_junit.py +0 -77
  378. coder_eval-0.12.2/tests/test_run_helpers.py +0 -79
  379. coder_eval-0.12.2/tests/test_run_limits_resolver.py +0 -337
  380. coder_eval-0.12.2/tests/test_run_metrics.py +0 -255
  381. coder_eval-0.12.2/tests/test_sandbox.py +0 -1367
  382. coder_eval-0.12.2/tests/test_sandbox_adopt.py +0 -130
  383. coder_eval-0.12.2/tests/test_sandbox_record_cli.py +0 -1182
  384. coder_eval-0.12.2/tests/test_sandbox_templates.py +0 -776
  385. coder_eval-0.12.2/tests/test_sandbox_venv_live.py +0 -110
  386. coder_eval-0.12.2/tests/test_seed_from_prior_result.py +0 -334
  387. coder_eval-0.12.2/tests/test_streaming_events.py +0 -197
  388. coder_eval-0.12.2/tests/test_sub_agent_runner.py +0 -701
  389. coder_eval-0.12.2/tests/test_suite_rollup.py +0 -825
  390. coder_eval-0.12.2/tests/test_tags.py +0 -465
  391. coder_eval-0.12.2/tests/test_task_definition_unknown_fields.py +0 -66
  392. coder_eval-0.12.2/tests/test_teardown_interrupt.py +0 -90
  393. coder_eval-0.12.2/tests/test_telemetry.py +0 -610
  394. coder_eval-0.12.2/tests/test_timeout_exceptions.py +0 -101
  395. coder_eval-0.12.2/tests/test_timing_close_window.py +0 -599
  396. coder_eval-0.12.2/tests/test_timing_identity_contract.py +0 -694
  397. coder_eval-0.12.2/tests/test_ungraded_reporting.py +0 -288
  398. coder_eval-0.12.2/tests/test_verify_published_workflow.py +0 -478
  399. coder_eval-0.12.2/uv.lock +0 -3373
  400. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-code-review-full.md +0 -0
  401. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-code-review-wf.md +0 -0
  402. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-code-review.md +0 -0
  403. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-create-plan.md +0 -0
  404. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-implement-plan.md +0 -0
  405. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-review.md +0 -0
  406. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/shared/axes.md +0 -0
  407. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/shared/multi-model-review.md +0 -0
  408. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/shared/review-rubric.md +0 -0
  409. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/workflows/cr-axis.js +0 -0
  410. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/workflows/cr-parent.js +0 -0
  411. {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude-plugin/marketplace.json +0 -0
  412. {coder_eval-0.12.2 → coder_eval-0.12.4}/.env.example +0 -0
  413. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/CODEOWNERS +0 -0
  414. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
  415. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  416. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  417. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/actionlint.yaml +0 -0
  418. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/code_review.md +0 -0
  419. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/dependabot.yml +0 -0
  420. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/pages-stub/index.html +0 -0
  421. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/scripts/release_notes.py +0 -0
  422. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/claude-pr-review.yml +0 -0
  423. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/codeql.yml +0 -0
  424. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/conventional-commits.yml +0 -0
  425. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/docker-publish.yml +0 -0
  426. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/docs.yml +0 -0
  427. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/pr-checks.yml +0 -0
  428. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/publish-testpypi.yml +0 -0
  429. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/release.yml +0 -0
  430. {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/verify-published-action.yml +0 -0
  431. {coder_eval-0.12.2 → coder_eval-0.12.4}/.gitignore +0 -0
  432. {coder_eval-0.12.2 → coder_eval-0.12.4}/.pre-commit-config.yaml +0 -0
  433. {coder_eval-0.12.2 → coder_eval-0.12.4}/.python-version +0 -0
  434. {coder_eval-0.12.2 → coder_eval-0.12.4}/ADOPTERS.md +0 -0
  435. {coder_eval-0.12.2 → coder_eval-0.12.4}/CODE_OF_CONDUCT.md +0 -0
  436. {coder_eval-0.12.2 → coder_eval-0.12.4}/CONTRIBUTING.md +0 -0
  437. {coder_eval-0.12.2 → coder_eval-0.12.4}/LICENSE +0 -0
  438. {coder_eval-0.12.2 → coder_eval-0.12.4}/NOTICE +0 -0
  439. {coder_eval-0.12.2 → coder_eval-0.12.4}/README.md +0 -0
  440. {coder_eval-0.12.2 → coder_eval-0.12.4}/SECURITY.md +0 -0
  441. {coder_eval-0.12.2 → coder_eval-0.12.4}/comparison.md +0 -0
  442. {coder_eval-0.12.2 → coder_eval-0.12.4}/docker/Dockerfile +0 -0
  443. {coder_eval-0.12.2 → coder_eval-0.12.4}/docker/coder_eval_entrypoint.sh +0 -0
  444. {coder_eval-0.12.2 → coder_eval-0.12.4}/docker/coder_eval_runtime_entrypoint.sh +0 -0
  445. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/AB_EXPERIMENTS.md +0 -0
  446. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/CI_GATE.md +0 -0
  447. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/DATASETS.md +0 -0
  448. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/DIALOG_MODE.md +0 -0
  449. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/EXTENDING.md +0 -0
  450. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/PLUGIN.md +0 -0
  451. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/TASK_DEFINITION_GUIDE.md +0 -0
  452. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/ANTIGRAVITY.md +0 -0
  453. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/CLAUDE_CODE.md +0 -0
  454. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/CODEX.md +0 -0
  455. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/HARNESS_PARITY.md +0 -0
  456. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/OPENCODE.md +0 -0
  457. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/PI.md +0 -0
  458. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/assets/hero.gif +0 -0
  459. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/comparison.md +0 -0
  460. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/index.md +0 -0
  461. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/llms.txt +0 -0
  462. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/01-first-evaluation.md +0 -0
  463. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/02-ci-pipeline.md +0 -0
  464. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/03-evalboard-local.md +0 -0
  465. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/04-writing-a-task.md +0 -0
  466. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/05-comparing-models.md +0 -0
  467. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/06-use-docker-isolation.md +0 -0
  468. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/07-plugin-in-claude-code.md +0 -0
  469. {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/README.md +0 -0
  470. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/.gitignore +0 -0
  471. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/README.md +0 -0
  472. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/__tests__/harness-badge.test.tsx +0 -0
  473. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/__tests__/harness-selector.test.tsx +0 -0
  474. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
  475. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/__tests__/skeleton.test.tsx +0 -0
  476. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/col-help.tsx +0 -0
  477. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/collapsible-rail.tsx +0 -0
  478. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/harness-badge.tsx +0 -0
  479. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/harness-selector.tsx +0 -0
  480. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/scroll-table.tsx +0 -0
  481. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/search-box.tsx +0 -0
  482. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/skeleton.tsx +0 -0
  483. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/unit-toggle.tsx +0 -0
  484. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/version-list.tsx +0 -0
  485. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_lib/__tests__/source-param.test.ts +0 -0
  486. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_lib/source-param.ts +0 -0
  487. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/__tests__/efficiency-charts.test.tsx +0 -0
  488. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/__tests__/harness-legend.test.tsx +0 -0
  489. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/__tests__/harness-series.test.ts +0 -0
  490. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/daily-chart.tsx +0 -0
  491. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/efficiency-charts.tsx +0 -0
  492. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/harness-legend.tsx +0 -0
  493. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/harness-series.ts +0 -0
  494. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/tag-rail.tsx +0 -0
  495. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
  496. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/wall-clock-chart.tsx +0 -0
  497. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/window-summary.tsx +0 -0
  498. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/api/download/route.ts +0 -0
  499. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/api/file/route.ts +0 -0
  500. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
  501. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/api/refresh/route.ts +0 -0
  502. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/error.tsx +0 -0
  503. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/globals.css +0 -0
  504. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/icon.png +0 -0
  505. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/layout.tsx +0 -0
  506. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/loading.tsx +0 -0
  507. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/page.tsx +0 -0
  508. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/path-to-ga/__tests__/task-table.test.tsx +0 -0
  509. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/path-to-ga/page.tsx +0 -0
  510. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/path-to-ga/task-table.tsx +0 -0
  511. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/scribe/page.tsx +0 -0
  512. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/scribe/run-table.tsx +0 -0
  513. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
  514. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/trends/actions.ts +0 -0
  515. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/trends/page.tsx +0 -0
  516. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/trends/trends-view.tsx +0 -0
  517. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
  518. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/watchlist/page.tsx +0 -0
  519. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
  520. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/next-env.d.ts +0 -0
  521. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/next.config.mjs +0 -0
  522. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/package.json +0 -0
  523. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/pnpm-lock.yaml +0 -0
  524. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/postcss.config.mjs +0 -0
  525. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/harness/antigravity.png +0 -0
  526. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/harness/claude-code.png +0 -0
  527. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/harness/codex.png +0 -0
  528. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/harness/pi.png +0 -0
  529. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/uipath.png +0 -0
  530. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/tailwind.config.ts +0 -0
  531. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/tsconfig.json +0 -0
  532. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/vitest.config.ts +0 -0
  533. {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/vitest.setup.ts +0 -0
  534. {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/default.yaml +0 -0
  535. {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/early-stop-ab.yaml +0 -0
  536. {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/model-comparison.yaml +0 -0
  537. {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/permissions-smoke.yaml +0 -0
  538. {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/plugin-comparison.yaml +0 -0
  539. {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/prompt-mutations-example.yaml +0 -0
  540. {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/smoke_variants.yaml +0 -0
  541. {coder_eval-0.12.2 → coder_eval-0.12.4}/litellm/README.md +0 -0
  542. {coder_eval-0.12.2 → coder_eval-0.12.4}/litellm/cost_logger.py +0 -0
  543. {coder_eval-0.12.2 → coder_eval-0.12.4}/litellm/litellm-config.yaml +0 -0
  544. {coder_eval-0.12.2 → coder_eval-0.12.4}/litellm/start-litellm.sh +0 -0
  545. {coder_eval-0.12.2 → coder_eval-0.12.4}/mkdocs.yml +0 -0
  546. {coder_eval-0.12.2 → coder_eval-0.12.4}/osv-scanner.toml +0 -0
  547. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/README.md +0 -0
  548. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/cli-setup.md +0 -0
  549. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/criteria.md +0 -0
  550. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/repo-layout.md +0 -0
  551. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/task-rubric.md +0 -0
  552. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/templates/activation-rows.jsonl +0 -0
  553. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/templates/activation.yaml +0 -0
  554. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/analyze/SKILL.md +0 -0
  555. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/check-skill/SKILL.md +0 -0
  556. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/ci/SKILL.md +0 -0
  557. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/init/SKILL.md +0 -0
  558. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/lint-tasks/SKILL.md +0 -0
  559. {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/task/SKILL.md +0 -0
  560. {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/check_commit_msg.sh +0 -0
  561. {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/README.md +0 -0
  562. {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/antigravity.json +0 -0
  563. {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/claude-code.json +0 -0
  564. {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/codex.json +0 -0
  565. {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/opencode.json +0 -0
  566. {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/pi.json +0 -0
  567. {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/decompose_run.py +0 -0
  568. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/.gitattributes +0 -0
  569. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agent.py +0 -0
  570. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/__init__.py +0 -0
  571. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/_logging.py +0 -0
  572. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/_skills.py +0 -0
  573. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/antigravity_agent.py +0 -0
  574. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/claude_code_agent.py +0 -0
  575. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/codex_agent.py +0 -0
  576. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/noop_agent.py +0 -0
  577. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/opencode_agent.py +0 -0
  578. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/pi_agent.py +0 -0
  579. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/registry.py +0 -0
  580. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/watchdog.py +0 -0
  581. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/analysis.py +0 -0
  582. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/argv_match.py +0 -0
  583. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/console.py +0 -0
  584. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/evaluate_target.py +0 -0
  585. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/harbor_command.py +0 -0
  586. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/plan_command.py +0 -0
  587. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/run_helpers.py +0 -0
  588. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/utils.py +0 -0
  589. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/__init__.py +0 -0
  590. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
  591. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/agent_judge.py +0 -0
  592. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/classification_match.py +0 -0
  593. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/command_executed.py +0 -0
  594. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/commands_efficiency.py +0 -0
  595. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/file_check.py +0 -0
  596. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/file_contains.py +0 -0
  597. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/file_exists.py +0 -0
  598. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/file_matches_regex.py +0 -0
  599. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/json_check.py +0 -0
  600. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/llm_judge.py +0 -0
  601. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/reference_comparison.py +0 -0
  602. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/run_command.py +0 -0
  603. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/skill_triggered.py +0 -0
  604. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/uipath_eval.py +0 -0
  605. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/durations.py +0 -0
  606. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/__init__.py +0 -0
  607. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/agent.py +0 -0
  608. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/budget.py +0 -0
  609. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/categories.py +0 -0
  610. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/categorization.py +0 -0
  611. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/checker_misuse.py +0 -0
  612. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/executor.py +0 -0
  613. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/judge.py +0 -0
  614. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/reference.py +0 -0
  615. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/retry.py +0 -0
  616. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/timeout.py +0 -0
  617. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/__init__.py +0 -0
  618. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/checker.py +0 -0
  619. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
  620. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
  621. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_context.py +0 -0
  622. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_litellm.py +0 -0
  623. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_models.py +0 -0
  624. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_persistence.py +0 -0
  625. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_usage.py +0 -0
  626. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/sub_agent.py +0 -0
  627. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/summaries.py +0 -0
  628. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/verdict_tool.py +0 -0
  629. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/formatting.py +0 -0
  630. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/fs_permissions.py +0 -0
  631. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/__init__.py +0 -0
  632. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/agent_paths.py +0 -0
  633. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/atif_hydrate.py +0 -0
  634. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/atif_models.py +0 -0
  635. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/reward.py +0 -0
  636. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/invocation_log.py +0 -0
  637. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/isolation/__init__.py +0 -0
  638. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/litellm_cost.py +0 -0
  639. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/agent_config.py +0 -0
  640. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/cli_match.py +0 -0
  641. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/enums.py +0 -0
  642. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/experiment.py +0 -0
  643. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/judge.py +0 -0
  644. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/judge_defaults.py +0 -0
  645. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/limits.py +0 -0
  646. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/merge_strategy.py +0 -0
  647. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/mutations.py +0 -0
  648. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/results.py +0 -0
  649. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/routing.py +0 -0
  650. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/sandbox.py +0 -0
  651. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/tasks.py +0 -0
  652. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/telemetry.py +0 -0
  653. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/templates.py +0 -0
  654. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/__init__.py +0 -0
  655. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/config_merge.py +0 -0
  656. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/evaluation.py +0 -0
  657. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/overrides.py +0 -0
  658. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/run_limits.py +0 -0
  659. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/task_loader.py +0 -0
  660. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/plugins.py +0 -0
  661. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/pricing.py +0 -0
  662. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/py.typed +0 -0
  663. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/__init__.py +0 -0
  664. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/experiment.py +0 -0
  665. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/html.py +0 -0
  666. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/junit.py +0 -0
  667. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/markdown.py +0 -0
  668. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/resources/__init__.py +0 -0
  669. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
  670. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/resources/tags.yaml +0 -0
  671. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/result_metrics.py +0 -0
  672. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/run_record.py +0 -0
  673. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/__init__.py +0 -0
  674. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/ast_similarity.py +0 -0
  675. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/complexity.py +0 -0
  676. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/quality.py +0 -0
  677. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/signature_similarity.py +0 -0
  678. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/similarity.py +0 -0
  679. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/token_similarity.py +0 -0
  680. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/simulation/__init__.py +0 -0
  681. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/simulation/termination.py +0 -0
  682. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/simulation/user_simulator.py +0 -0
  683. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/stats.py +0 -0
  684. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/__init__.py +0 -0
  685. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/callbacks.py +0 -0
  686. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/collector.py +0 -0
  687. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/events.py +0 -0
  688. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/renderers.py +0 -0
  689. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/wire.py +0 -0
  690. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/telemetry.py +0 -0
  691. {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/utils.py +0 -0
  692. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/README.md +0 -0
  693. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agentless_smoke_test.yaml +0 -0
  694. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/antigravity_hello_world.yaml +0 -0
  695. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
  696. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/claude_hello_world.yaml +0 -0
  697. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/claude_hello_world_docker.yaml +0 -0
  698. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
  699. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/claude_subagent_test.yaml +0 -0
  700. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
  701. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_hello_world.yaml +0 -0
  702. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_parallel_commands.yaml +0 -0
  703. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
  704. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_skills_test.yaml +0 -0
  705. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_string_utils.yaml +0 -0
  706. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_subagent_test.yaml +0 -0
  707. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/subagent_bash_long_input.yaml +0 -0
  708. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/subagent_merge_sort.yaml +0 -0
  709. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/anti_cheat_reference/anti_cheat_reference.yaml +0 -0
  710. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/anti_cheat_reference/reference/solution.py +0 -0
  711. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/byod_smoke_test.yaml +0 -0
  712. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dataset_example.yaml +0 -0
  713. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/datasets/sentiment.jsonl +0 -0
  714. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
  715. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
  716. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
  717. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/environment/input.txt +0 -0
  718. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
  719. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
  720. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/early_stop_decision_budget_exceeded.yaml +0 -0
  721. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/early_stop_weighted_high_weight_kills_run.yaml +0 -0
  722. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/early_stop_weighted_low_weight_absorbed.yaml +0 -0
  723. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/fibonacci_with_template.yaml +0 -0
  724. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/hello_date.yaml +0 -0
  725. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/inline_starter_example.yaml +0 -0
  726. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/internal/session_resumption.yaml +0 -0
  727. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_smoke.yaml +0 -0
  728. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
  729. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
  730. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
  731. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
  732. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
  733. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/opencode_smoke_test.yaml +0 -0
  734. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/pi_smoke_test.yaml +0 -0
  735. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
  736. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/record_cli_responses.yaml +0 -0
  737. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/run_limits/max_turns_cap.yaml +0 -0
  738. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/run_limits/turn_timeout.yaml +0 -0
  739. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
  740. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
  741. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
  742. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
  743. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
  744. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
  745. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/README.md +0 -0
  746. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
  747. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
  748. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
  749. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
  750. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
  751. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
  752. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
  753. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
  754. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
  755. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
  756. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/sentiment_classification.yaml +0 -0
  757. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_agent_judge.yaml +0 -0
  758. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_budget_exceeded.yaml +0 -0
  759. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
  760. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_llm_judge.yaml +0 -0
  761. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_negative_path.yaml +0 -0
  762. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_task_timeout.yaml +0 -0
  763. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_variants.yaml +0 -0
  764. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/test_sandbox.yaml +0 -0
  765. {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/token_check.yaml +0 -0
  766. {coder_eval-0.12.2 → coder_eval-0.12.4}/templates/byod_smoke_test/Dockerfile +0 -0
  767. {coder_eval-0.12.2 → coder_eval-0.12.4}/templates/fibonacci-starter/README.md +0 -0
  768. {coder_eval-0.12.2 → coder_eval-0.12.4}/templates/fibonacci-starter/src/main.py +0 -0
  769. {coder_eval-0.12.2 → coder_eval-0.12.4}/templates/fibonacci-starter/tests/test_main.py +0 -0
  770. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/__init__.py +0 -0
  771. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/__init__.py +0 -0
  772. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/__init__.py +0 -0
  773. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/antigravity_fixtures.py +0 -0
  774. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
  775. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/antigravity_a_single_text_turn.json +0 -0
  776. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/antigravity_b_tool_call_resolved.json +0 -0
  777. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/antigravity_c_thinking_and_tool_same_generation.json +0 -0
  778. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/antigravity_d_orphaned_tool.json +0 -0
  779. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/antigravity_e_multi_generation.json +0 -0
  780. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
  781. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
  782. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
  783. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
  784. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
  785. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
  786. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
  787. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
  788. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
  789. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
  790. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
  791. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
  792. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
  793. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
  794. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
  795. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
  796. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
  797. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
  798. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_a_single_text_turn.json +0 -0
  799. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_b_tool_call_resolved.json +0 -0
  800. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_c_multi_step_tiling.json +0 -0
  801. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_d_orphaned_tool.json +0 -0
  802. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_e_error_after_generation.json +0 -0
  803. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_a_single_text_turn.json +0 -0
  804. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_b_tool_call_resolved.json +0 -0
  805. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_c_multi_turn_tiling.json +0 -0
  806. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_d_orphaned_tool.json +0 -0
  807. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_e_error_after_generation.json +0 -0
  808. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_f_duplicate_turn_end.json +0 -0
  809. {coder_eval-0.12.2/tests/_fixtures/harbor_export_golden/source_task → coder_eval-0.12.4/tests/_fixtures/harbor_export_golden/expected}/environment/Dockerfile +0 -0
  810. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/environment/docker-compose.yaml +0 -0
  811. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/environment/task.yaml +0 -0
  812. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/instruction.md +0 -0
  813. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/tests/reference/greeting.txt +0 -0
  814. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/tests/task.yaml +0 -0
  815. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/source_task/reference/greeting.txt +0 -0
  816. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/source_task/task.yaml +0 -0
  817. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/live_criteria.py +0 -0
  818. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/__init__.py +0 -0
  819. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
  820. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
  821. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
  822. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
  823. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/run_full.md +0 -0
  824. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
  825. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/timing_union_cases.json +0 -0
  826. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_path_helpers.py +0 -0
  827. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/conftest.py +0 -0
  828. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/__init__.py +0 -0
  829. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/atif/known_good_trajectory.json +0 -0
  830. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
  831. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
  832. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/mock_agent.py +0 -0
  833. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/pi_happy_stream.jsonl +0 -0
  834. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
  835. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
  836. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
  837. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/text_stub_agent.py +0 -0
  838. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/harbor_e2e/fixtures/docker_baseline.yaml +0 -0
  839. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/harbor_e2e/fixtures/template_sources.yaml +0 -0
  840. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/__init__.py +0 -0
  841. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/generated.py +0 -0
  842. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/pyright_config.py +0 -0
  843. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/__init__.py +0 -0
  844. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/base.py +0 -0
  845. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
  846. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
  847. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
  848. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
  849. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
  850. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/no_silent_except.py +0 -0
  851. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/no_submodule_model_imports.py +0 -0
  852. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
  853. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/open_explicit_encoding.py +0 -0
  854. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
  855. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/register_criterion_required.py +0 -0
  856. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
  857. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/violation.py +0 -0
  858. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_config_optional_type.py +0 -0
  859. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_config_registry_dispatch.py +0 -0
  860. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_judge_criterion.py +0 -0
  861. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_telemetry_advanced.py +0 -0
  862. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_timeout.py +0 -0
  863. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agentless.py +0 -0
  864. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_atif_hydrate.py +0 -0
  865. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_atif_models.py +0 -0
  866. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_byoa_plugin.py +0 -0
  867. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_byoa_plugin_live.py +0 -0
  868. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_byod_feature.py +0 -0
  869. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_check_all_async.py +0 -0
  870. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_checker_logging.py +0 -0
  871. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_classification_match.py +0 -0
  872. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_claude_settings_enforcement_live.py +0 -0
  873. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_backend_flag.py +0 -0
  874. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_empty_glob.py +0 -0
  875. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_match_parity.py +0 -0
  876. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_sdk_options.py +0 -0
  877. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_set_overrides.py +0 -0
  878. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_type_flag.py +0 -0
  879. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_code_review_bugs.py +0 -0
  880. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_codex_agent_live.py +0 -0
  881. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_codex_token_mapping.py +0 -0
  882. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_command_telemetry_result_data.py +0 -0
  883. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_commands_efficiency.py +0 -0
  884. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_config_lineage.py +0 -0
  885. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_config_merge_engine.py +0 -0
  886. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_config_precedence.py +0 -0
  887. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_continuous_scoring.py +0 -0
  888. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cost_accounting_paths.py +0 -0
  889. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_criterion_result_round_trip.py +0 -0
  890. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_dataset_expansion.py +0 -0
  891. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_debug_logging.py +0 -0
  892. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_docker_litellm_env.py +0 -0
  893. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_docker_runner_stream_limit.py +0 -0
  894. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_docker_wildcard_env.py +0 -0
  895. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_docker_workdir_live.py +0 -0
  896. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_driver_resolver.py +0 -0
  897. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_durations.py +0 -0
  898. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_evaluate_format_harbor.py +0 -0
  899. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_evaluate_target.py +0 -0
  900. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_evaluator.py +0 -0
  901. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_execute_format_harbor.py +0 -0
  902. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_experiment_cli.py +0 -0
  903. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_experiment_loader.py +0 -0
  904. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_experiment_models.py +0 -0
  905. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_file_check.py +0 -0
  906. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_file_contains_scoring.py +0 -0
  907. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_formatting.py +0 -0
  908. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_git_clone_failure.py +0 -0
  909. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_glob_paths_in_file_criteria.py +0 -0
  910. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_harbor_reward.py +0 -0
  911. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_heartbeat_watchdog.py +0 -0
  912. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_ignore_patterns_negation.py +0 -0
  913. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_integration.py +0 -0
  914. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_json_check.py +0 -0
  915. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_judge_bedrock.py +0 -0
  916. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_judge_burn_in_live.py +0 -0
  917. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_judge_litellm.py +0 -0
  918. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_lint_no_top_level_run_limits.py +0 -0
  919. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_lint_runner.py +0 -0
  920. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_litellm_config.py +0 -0
  921. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_litellm_cost.py +0 -0
  922. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_litellm_cost_logger.py +0 -0
  923. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_litellm_judge_live.py +0 -0
  924. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_log_tail_buffer.py +0 -0
  925. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_logging.py +0 -0
  926. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_logging_isolation.py +0 -0
  927. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_merge_characterization.py +0 -0
  928. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_merge_strategy_annotations.py +0 -0
  929. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_merge_unification.py +0 -0
  930. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_mutations.py +0 -0
  931. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_node_env_config.py +0 -0
  932. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_optional_dependencies.py +0 -0
  933. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_orchestrator_error_log_tail.py +0 -0
  934. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_orchestrator_telemetry.py +0 -0
  935. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_overrides_engine.py +0 -0
  936. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pi_agent_config.py +0 -0
  937. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pi_smoke_task.py +0 -0
  938. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_plan_command.py +0 -0
  939. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_plugin_processing.py +0 -0
  940. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_plugins.py +0 -0
  941. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_post_run.py +0 -0
  942. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pre_run.py +0 -0
  943. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pricing_mirror.py +0 -0
  944. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pricing_registry.py +0 -0
  945. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reference_comparison_scoring.py +0 -0
  946. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reference_evaluator.py +0 -0
  947. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reference_missing_file.py +0 -0
  948. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reference_models.py +0 -0
  949. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_registry.py +0 -0
  950. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_release_notes.py +0 -0
  951. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_replicate_stats.py +0 -0
  952. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_report_command.py +0 -0
  953. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reports.py +0 -0
  954. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reports_html.py +0 -0
  955. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reports_package.py +0 -0
  956. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_resolve_task_files.py +0 -0
  957. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_result_metrics.py +0 -0
  958. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_resume.py +0 -0
  959. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_retry_logic_comprehensive.py +0 -0
  960. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_route_seam_exhaustiveness.py +0 -0
  961. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_routing.py +0 -0
  962. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_run_command_stdout.py +0 -0
  963. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_run_limits_models.py +0 -0
  964. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_run_limits_orchestrator.py +0 -0
  965. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_run_record.py +0 -0
  966. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_runtime_tool_versions.py +0 -0
  967. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sandbox_layer_builder.py +0 -0
  968. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sandbox_optional.py +0 -0
  969. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sandbox_security.py +0 -0
  970. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sandbox_symlink_preservation.py +0 -0
  971. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_scorers.py +0 -0
  972. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_scoring_quality.py +0 -0
  973. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sdk_option_classification.py +0 -0
  974. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_simulation_config.py +0 -0
  975. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_simulation_integration.py +0 -0
  976. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_simulation_termination.py +0 -0
  977. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_simulation_trials.py +0 -0
  978. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_skill_triggered.py +0 -0
  979. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_stats.py +0 -0
  980. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_stats_nonfinite.py +0 -0
  981. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_agent_integration.py +0 -0
  982. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_batch.py +0 -0
  983. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_callbacks.py +0 -0
  984. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_cli.py +0 -0
  985. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_orchestrator.py +0 -0
  986. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_renderers.py +0 -0
  987. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_wire.py +0 -0
  988. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_success_criterion_union.py +0 -0
  989. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_summaries.py +0 -0
  990. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_template_env_expansion.py +0 -0
  991. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_threshold_enforcement.py +0 -0
  992. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timeout_batch.py +0 -0
  993. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timeout_categorization.py +0 -0
  994. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timeout_models.py +0 -0
  995. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timeout_orchestrator.py +0 -0
  996. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timing_union_parity.py +0 -0
  997. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_token_usage.py +0 -0
  998. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_uipath_eval.py +0 -0
  999. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_user_simulator.py +0 -0
  1000. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_utils.py +0 -0
  1001. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_utterance_extraction.py +0 -0
  1002. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_variant_prompt_file.py +0 -0
  1003. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_verdict_tool.py +0 -0
  1004. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_visible_turn_cap.py +0 -0
  1005. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_watchdog.py +0 -0
  1006. {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_yaml_migration.py +0 -0
@@ -0,0 +1,1011 @@
1
+ # Harness Candidates
2
+
3
+ Deferred lint/test guardrails surfaced during reviews. Promote to a `CExxx` rule
4
+ (or a test) when picked up.
5
+
6
+ ## From code review 260701-1954 (fix-review-top5 run) — deferred to a dedicated guardrail plan
7
+
8
+ > Numbering note: these are *proposed* ids. `CE024` (discriminated-unions) and
9
+ > `CE025` (live-verdict consistency) have since been **implemented** for other
10
+ > rules, so the candidates below were renumbered to the next free ids. Always
11
+ > claim the next unused number in `tests/lint/rules/` — the id-uniqueness assert
12
+ > in `tests/lint/runner.py` is the source of truth.
13
+
14
+ - **CE026** — workflow-YAML rule: forbid any `uses:` step pinned to a floating ref
15
+ (`@v3`, `@main`) rather than a 40-hex commit SHA. Would have caught
16
+ `mxschmitt/action-tmate@v3` (fixed manually in this run). >30 min: needs a
17
+ non-Python file-walk branch in `tests/lint/runner.py`.
18
+ - **CE027** — retired-token grep gate: fail when a removed-subsystem token
19
+ (`LLMGW_`, `API_BACKEND=proxy`, `uipath_llmgw_client`) reappears outside an
20
+ allowlist across docs/config/src. Would have caught the LLM-Gateway residue
21
+ swept in this run. >30 min: needs an allowlist + repo-wide text scan.
22
+ - **CE028** — assert the Makefile `lint:` help does not hardcode a stale `CE0NN`
23
+ upper bound (use `CE001+`). Would have caught the `CE001–CE005` drift fixed here.
24
+ - **docs-vs-harness smoke test** — execute the CI tutorial's `coder-eval run`
25
+ command against a NoOp task and assert the produced tree matches the documented
26
+ globs. Would have caught the `--run-dir runs` layout bug. Not statically
27
+ reachable (needs a live run).
28
+ - [ ] CE-rule: `type: Literal[...]` fields on models in `coder_eval/models/` must declare their tag default (`type: Literal["x"] = "x"`) — a member without the default degrades `validate_registry` diagnostics (PydanticUndefined in expected_types) and breaks direct construction. Nothing guards it today; needs a rule-design call (second violation class inside CE024 vs. a new CExxx at the next free id), and the failure is already double-caught by the MINIMAL_PAYLOADS parity test + direct-construction tests — caught in the 2026-07-03 top5-review-fixes run (Phase 1 quality review).
29
+
30
+ ## From 2026-07-23 stop_when:auto early-stop review
31
+
32
+ - [ ] CE-rule: the early-stop watcher stop rule must decide polarity via the
33
+ resolved `_armed_polarities`, never a raw `criterion.stop_when` comparison —
34
+ forbid `.stop_when` attribute reads inside `EarlyStopWatcher._evaluate` /
35
+ `_resolve_armed_polarities`'s callers in `orchestration/early_stop.py`. This
36
+ diff *was* the fix for exactly that class of bug (the old rule compared
37
+ `stop_when in ("pass","decided")` and so vetoed every mixed `auto` pass-stop).
38
+ Deferred, not cheap: existing CE rules scope by file/module, not by a specific
39
+ method, so a method-scoped attribute-ban needs a new AST-walk shape (and risks
40
+ false positives on the legitimate `is not None` membership reads elsewhere in
41
+ the file). Claim the next free id in `tests/lint/rules/`. Caught in the
42
+ 2026-07-23 stop_when:auto review; the behavior itself is guarded by
43
+ `test_auto_mixed_pass_stops_ignoring_undecided_distractors` +
44
+ `test_mixed_static_arming_pass_stops_ignoring_fail_armed`.
45
+
46
+ ## From 2026-07-24 publish-github-releases review
47
+
48
+ - [ ] **sdist-contents assertion** — build the sdist and assert it contains only
49
+ intended paths. `pyproject.toml` declares no `[tool.hatch.build.targets.sdist]`
50
+ section, so hatchling's default selection honors only the **root** `.gitignore`
51
+ and sweeps in everything else sitting in the tree at build time. Two distinct
52
+ consequences, worth keeping apart:
53
+ - **What actually reaches PyPI today: nothing unintended.** A local `uv build`
54
+ in a developed worktree produces a 135 MB sdist carrying
55
+ `evalboard/node_modules/**` (8520 files) and `evalboard/.next/**` (190),
56
+ because `evalboard/.gitignore` is nested and therefore not honored. CI is
57
+ spared only incidentally — `release.yml` never runs `npm`/`pnpm install`, so
58
+ those paths do not exist on the runner at `uv build` time. Verified against
59
+ the published artifacts: the 0.8.9 and 0.8.2 sdists on PyPI are ~7.5 MB /
60
+ ~550 files with **zero** `node_modules` entries. (A dirty-tree release would
61
+ not silently ship JS either — 135 MB exceeds PyPI's 100 MB per-file limit, so
62
+ it fails at upload. The real exposure is a broken release, not a stealth one.)
63
+ - **The live hazard is untracked files a workflow leaves in the tree**, which
64
+ hatchling *does* package: a `release-notes.md` written at the repo root by a
65
+ CI step landed in `coder_eval-X.Y.Z/release-notes.md` (verified by building
66
+ it). This is why the "Publish GitHub Release" step writes to
67
+ `${RUNNER_TEMP}` — a convention no check enforces.
68
+
69
+ Not cheap: needs a real `uv build` inside the test suite (slow) plus a decision
70
+ on whether to add an explicit sdist include/exclude allowlist, which changes
71
+ published artifacts. Worth pairing with the allowlist so the contract is
72
+ declared rather than inferred from hatchling's defaults — caught in the
73
+ 2026-07-24 ci/publish-github-releases review.
74
+ - [ ] **CE032 — run the existing AST lint rules over Python embedded in
75
+ `.github/workflows/*.yml`.** CE008/CE009/CE010 already forbid unencoded
76
+ `read_text`/`open`/`subprocess.run`, but `tests/lint/runner.py::check_paths`
77
+ walks only `*.py` under `src/`, so Python inside a `run:` heredoc is invisible
78
+ to ruff, pyright, pytest, coverage *and* the CE runner. Would have caught the
79
+ four unencoded `read_text`/`write_text` calls fixed by hand in this review
80
+ (`release.yml` ×2, `publish-testpypi.yml` ×2). Needs a heredoc extractor
81
+ (`python3 - <<'PY' … PY` → dedent → `ast.parse`) with line-number mapping back
82
+ to the YAML; wire as a `tests/test_custom_lint.py` class like CE027–CE031
83
+ rather than a `BaseRule`. Also consider extending CE008 to `write_text` (it
84
+ matches only `read_text` today, though `src/` happens to be clean).
85
+ - [ ] **CE033 — interpreter heredocs in `.github/workflows/**` must use a quoted
86
+ delimiter** (`<<'PY'`, not `<<PY`). With a bare tag the shell expands `$VAR`
87
+ into the *program text* before the interpreter parses it, so a value containing
88
+ a quote or newline breaks out of the string literal it lands in. Fixed by hand
89
+ in `publish-testpypi.yml` in this review (it interpolated `${DEV_VERSION}` into
90
+ Python source); regex-detectable in ~10 lines, and CE032's `ast.parse` is only
91
+ sound on quoted bodies, so the two ship together.
92
+ - [ ] **`actionlint` + `zizmor` over `.github/workflows/**`.** No static analysis
93
+ whatsoever runs over workflow YAML today (`make verify` never looks at it), so
94
+ every workflow finding in the 2026-07-24 review was caught by a human reading
95
+ it. `actionlint` runs shellcheck over `run:` bodies; `zizmor`'s
96
+ `excessive-permissions` / `artipacked` / `template-injection` rules cover the
97
+ credential-scoping and `${{ }}`-into-`run:` classes reviewed by hand. Subsumes
98
+ the CE026 SHA-pinning candidate above. Start as a non-blocking annotation job.
99
+
100
+ ## From 2026-07-03 open-source docs cleanup
101
+
102
+ - [ ] **Dead-relative-link checker for `docs/**/*.md`** — resolve every relative
103
+ `](target.md)` link against the tree and fail on a missing target. During the
104
+ docs/features purge, the literal `git grep "docs/features"` gate missed 3
105
+ dangling links written in relative form (`](features/...)` in
106
+ TASK_DEFINITION_GUIDE.md ×2 and DOCKER_ISOLATION.md ×1); only a reviewer sweep
107
+ caught them. The cleanup plan explicitly deferred this as YAGNI for the
108
+ one-time purge, but any future doc rename/deletion re-opens the same blind
109
+ spot — caught in the 2026-07-03 open-source-docs-cleanup implementation run.
110
+
111
+ ## From PR #77 (command-executed shell-normalize) — CE030-to-criteria deferred
112
+
113
+ - [ ] **Extend CE030 doc/schema-parity to the `SuccessCriterion` union** so a new
114
+ criterion (or field) can't ship undocumented. Attempted in PR #77 and reverted:
115
+ CI installs `--extra uipath`, and in that environment `coder_eval.models.criteria`
116
+ gains a `CliCalledCriterion` (fields `log`/`positional`) that is NOT present in a
117
+ plain checkout (it did not reproduce on macOS, whose lockfile resolution omits the
118
+ contributing linux-only component). It defeated every discriminator tried — union
119
+ membership, a `__module__` string filter (it is spoofed to `coder_eval.models.criteria`),
120
+ a genuine-module-attribute scan (it is `setattr` onto the module), and even an AST
121
+ parse of the `SuccessCriterion` union literal in `criteria.py` source (CI's imported
122
+ criteria module resolves to a file whose union literal already contains it). No
123
+ runtime OR source signal available in the lint could separate the injected criterion
124
+ from an in-tree one. Revisit only with a way to identify the in-tree criterion set that
125
+ is provably immune to the uipath integration — e.g. a hardcoded name allowlist of the
126
+ in-tree criteria (losing auto-coverage of new ones), or first understanding exactly how
127
+ that environment injects the criterion. Until then CE030 stays scoped to the four
128
+ top-level models; the `command_pattern`/`exclude_pattern` contract this PR changed is
129
+ documented in the Field descriptions and TASK_DEFINITION_GUIDE regardless.
130
+
131
+ ## From the evalboard Path-to-GA de-tag / mature-passes fix (4e5bbc4…dd5f7e9) — TS-side guards deferred
132
+
133
+ Context: the CExxx harness is a **Python** AST runner over `src/coder_eval/`, so none
134
+ of the invariants below are mechanizable in it. Each would need a TypeScript lint
135
+ harness (eslint config + custom rules) that `evalboard/` does not have today —
136
+ standing one up for three call sites fails the KISS/YAGNI gate. Deferring rather
137
+ than dropping; promote if a fourth TS-side invariant appears, and stand up the
138
+ harness once for all of them.
139
+
140
+ > **Update (PR #94 review round 2).** The *execution* half of this gap is closed:
141
+ > `evalboard/` is now gated by the `evalboard` job in `.github/workflows/pr-checks.yml`
142
+ > and reachable locally via `make evalboard-verify`, so the vitest suite (including
143
+ > the pricing drift guard) is enforcement rather than documentation. What remains
144
+ > deferred below is the *static-analysis* half — eslint has still not been stood up.
145
+ > The review that prompted this round names four more candidate TS rules (raw
146
+ > `status === "SUCCESS"` outside `lib/status.ts`; DOM-global shadowing in props;
147
+ > inline copies of the tag predicate; per-run tooltip copy reused on aggregate
148
+ > surfaces), which meets the "fourth invariant" promotion bar stated above —
149
+ > **stand up eslint next time `evalboard/` is touched substantively.**
150
+
151
+ - [ ] **"Every consumer of `RunOverviewTask.matureSkipped` must decide explicitly
152
+ whether a carry-forward row counts."** Four consumers now, and they deliberately
153
+ DISAGREE: `lib/trends.ts` and `app/runs/[id]/run-view.tsx` count a mature skip as
154
+ a pass; `lib/overview.ts::buildTagTaskRows` excludes it from both terms
155
+ (`/path-to-ga` is a GA-readiness page). A new consumer silently inheriting either
156
+ convention is a real hazard. Guard shape: flag a file that reads `.matureSkipped`
157
+ without a nearby comment naming its convention — weak, hence the deferral. Closed
158
+ for now by unit tests that assert the exclusion from BOTH numerator and denominator
159
+ (`lib/__tests__/overview.test.ts` → `describe("buildTagTaskRows")`).
160
+
161
+ - [x] ~~**`taskCarriesRepoTag` is the single repo-provenance tag predicate — but one
162
+ duplicate survives.**~~ **RESOLVED in PR #94 review round 2.** The predicate moved to
163
+ a dependency-free `lib/tags.ts` (structurally typed on `{skill, tags}` so
164
+ `RunOverviewTask`, `TaskResultSummary` and `TaskTrend` all satisfy it), re-exported
165
+ from `lib/overview.ts` for existing callers. Both inline copies now import it:
166
+ `app/runs/[id]/run-view.tsx` (the `"use client"` one that could not before) and
167
+ `lib/trends.ts::trendMatchesTag` (a third copy the original deferral missed).
168
+ Still worth a lint rule ("no inline `tags.includes(x) || skill === x`") to catch
169
+ future copies — folded into the eslint promotion noted above.
170
+
171
+ - [ ] **The de-tag rule fails CLOSED on a newest run that loads fine but stamps no
172
+ `tags`** (`lib/overview.ts::buildTagTaskRows`): every tagged task would read as
173
+ de-tagged and the table would empty, rendering an empty state indistinguishable from
174
+ a genuine full de-tagging. Its sibling failure mode (`overview == null`, a transient
175
+ blob read failure) IS guarded, with exactly this rationale. Currently unreachable —
176
+ 0 of ~116k date-shaped non-ad-hoc task rows in `runs-remote/` lack `tags`, and the
177
+ six zero-tag runs found are all ad-hoc (filtered upstream by id shape + `meta.adhoc`)
178
+ — so the barrier is two upstream filters rather than a check at the seam. Left
179
+ unguarded on purpose: a `if (taggedInRun.size === 0) skip the de-tag signal` guard
180
+ would also mask a real, total de-tagging. Revisit if the pipeline ever stops
181
+ stamping tags, or if a non-ad-hoc run legitimately carries zero tagged rows.
182
+
183
+ - [ ] **Discriminating-test discipline for predicate narrowings.** Two tests in this
184
+ change passed for the wrong reason — a downstream rule (the de-tag drop) masked the
185
+ mutation they claimed to catch — and the plan leaned on a `grep` acceptance criterion
186
+ that CI never runs. Both were found by mutation-testing the suite and fixed. No
187
+ mechanizable guard; the durable lesson is: when a test names a narrowing, construct
188
+ the fixture so the row SURVIVES every other rule, or the assertion proves nothing.
189
+
190
+ - [ ] **CE038 — runner-label registry + dogfood runner parity** over
191
+ `.github/workflows/*.yml`. Two clauses: (a) every label a job can land on must appear
192
+ in `.github/actionlint.yaml`'s `self-hosted-runner.labels` or a stock GitHub-hosted
193
+ allowlist — including *both* branches of an expression-valued `runs-on:`, which
194
+ actionlint treats as opaque; (b) `action-dogfood`'s label must equal the one the
195
+ consumer snippet in `docs/tutorials/02-ci-pipeline.md` advertises. Nothing guards
196
+ either today: actionlint is not wired into `make verify` or pre-commit (grep: the
197
+ config file is its only mention), and CE026 parses that job's prerequisite *steps*
198
+ but never its `runs-on:`. Why it matters: an undeclared label is not a runtime error,
199
+ the job queues until GitHub cancels it hours later — indistinguishable from a pool
200
+ outage; and a repo-wide `runs-on:` migration has twice swept up `action-dogfood`
201
+ (#306, then 027121e in this PR), which exists precisely to prove the published Action
202
+ works on the image external integrators use. Implemented and verified once (both
203
+ clauses caught their regression class on the real tree) but reverted as out of
204
+ proportion to a 16-line runner migration — ~240 lines including tests. Note when
205
+ writing it: discriminate labels from expression operands structurally, on the
206
+ preceding `&&`/`||`, NOT on the string's shape — a "contains 'ubuntu'" heuristic
207
+ silently fails on `uipath-ubunut-latest`, the exact transposition typo the rule is
208
+ for. Caught in the multi-model review of PR #86.
209
+
210
+ ## From the 2026-08-04 Claude Code plugin marketplace run
211
+
212
+ - [ ] **Plugin skills must not name a file that exists only in THIS repo** — the
213
+ `test_bundled_files_reference_no_repo_paths` denylist (`docs/`, `src/`,
214
+ `.claude/shared/`, `.claude/commands/`, `uv run`, `../`) deliberately allows
215
+ `tasks/` and `.claude/skills/`, because those are user-workspace paths the
216
+ skills legitimately scan and scaffold. So a skill body naming a specific repo
217
+ file (e.g. `tasks/hello_date.yaml`) would slip past the guard even though an
218
+ installed plugin is copied to `~/.claude/plugins/cache/` without it. The
219
+ obvious rule — "extract path-shaped tokens, fail if the path exists at the repo
220
+ root" — is NOT cheap: `init` legitimately tells users to scan `pyproject.toml`
221
+ and `package.json`, and `pyproject.toml` exists here, so the heuristic
222
+ false-positives on correct prose. Needs a token classifier that distinguishes
223
+ "a file to look for in the user's repo" from "a file in ours", which is a
224
+ design problem, not a 30-minute one. No skill violates it today (grepped) —
225
+ caught in the 2026-08-04 claude-code-plugin-marketplace implementation run.
226
+ *Update (2026-08-04, plugin-audit-p0-p1 run): the guard was renamed and widened
227
+ from `skills/*/SKILL.md` to every shipped text file under `plugins/coder-eval/`
228
+ (`PLUGIN_TEXT_FILES`), which closed the coverage half of this gap — a bundled
229
+ reference now cannot name a repo path either. The token-classifier problem
230
+ described above is unchanged and still deferred.*
231
+
232
+ ## From 2026-08-04 plugin-audit-p0-p1 run
233
+
234
+ - [ ] **A skill's advertised `description` must not promise a check that no bundled
235
+ reference declares.** `lint-tasks` ships a user-facing description claiming it
236
+ finds "prompts that give away the answer", but that check was declared only in
237
+ `skills/task/SKILL.md` prose — a file `lint-tasks` never reads — so the two
238
+ rubric readers had already forked on it before the skill shipped. Caught by a
239
+ reviewer, not by a test; fixed by promoting it to rubric check 7. A guard would
240
+ have to map claim-phrases in a description onto declarations in
241
+ `reference/task-rubric.md`, which is natural-language matching, not a token
242
+ grep — the phrasings are deliberately different (a description sells, a rubric
243
+ check instructs), so any cheap version either misses the real case or fails on
244
+ correct prose. Needs a fixed vocabulary of claim tags shared between the two
245
+ files to become mechanical, which is a design change rather than a 30-minute
246
+ rule — caught in the 2026-08-04 plugin-audit-p0-p1 implementation run.
247
+
248
+ ## From the PR #82 review follow-up (2026-08-10)
249
+
250
+ - [ ] **CE039 — documented `coder-eval` invocations must be executable as written.**
251
+ `init/SKILL.md` told the agent to run `coder-eval plan <task-directory>` and
252
+ "iterate until it exits 0", which the CLI rejects outright (`plan` takes files;
253
+ a directory argument exits 1 with a hint) — an unreachable loop condition
254
+ shipped in a skill. A rule would scan inline-code spans and fenced `bash` blocks
255
+ across `README.md`, `docs/**/*.md` and `plugins/**/*.md`, assert the subcommand
256
+ exists in the Typer app, and — the harder half — that the *argument shape* is
257
+ one the command accepts. The subcommand check is cheap and would not have caught
258
+ this; the argument-shape check is what matters and needs either a real
259
+ invocation (see the live-smoke candidate below) or a per-command arity model
260
+ that duplicates the CLI signature. Deferred on that split — caught in the PR #82
261
+ review, fixed by hand in `init/SKILL.md`.
262
+
263
+ - [ ] **Documented-CLI live smoke.** The behavioural counterpart to CE039: in a
264
+ `-m live`/`-m slow` test, materialize a fixture repo with one task YAML and
265
+ execute every fenced `coder-eval …` command extracted from the shipped skills
266
+ and docs, asserting exit 0 (or an explicitly-expected non-zero). This is the
267
+ only form that proves argument shape rather than command existence. Not
268
+ statically reachable, hence separate from CE039 — proposed in the PR #82 review.
269
+
270
+ ## From the 2026-08-11 plugin generic-adopter run
271
+
272
+ - [ ] **`working-directory` input on `action.yml`.** A repository whose eval tree is
273
+ nested (`tests/tasks/…`) has no way to tell the composite action to run from that
274
+ subdirectory, so every path in every input has to be spelled from the repo root. The
275
+ fix is a new input, and that is why it is deferred rather than cheap: `action.yml`'s
276
+ inputs are a **published API** — CE026 clause 4 asserts every `with:` key across four
277
+ onboarding surfaces is a real input, so adding one means updating those surfaces (the
278
+ `ci` skill among them, whose output lands in other people's repositories), and it
279
+ carries action tag/release implications. Out of scope for the plan that surfaced it,
280
+ which worked around it in the `ci` skill's prose instead.
281
+
282
+ - [ ] **`shopt -s globstar` (or quoting `$CE_TASKS`) in `action.yml`'s run step.** The
283
+ real fix for a degradation the `ci` skill currently works around in prose:
284
+ `args+=($CE_TASKS)` is deliberately unquoted so a caller can pass several patterns, but
285
+ with `globstar` off `a/**/*.yaml` expands to `a/*/*.yaml` and **silently drops every
286
+ top-level task** — reproduced with `a/top.yaml` + `a/sub/deep.yaml`, which yields
287
+ `deep.yaml` alone. `nullglob` is off too, so an unmatched pattern reaches the CLI
288
+ literally and exits 1 (`Error: Task file not found: …`). One line in the action fixes
289
+ the first half; the second half is arguably correct-as-is (failing loudly beats
290
+ silently running nothing). Deferred alongside `working-directory` because both change
291
+ the action's observable contract and belong in one considered change.
292
+
293
+ ## From the final review of the 2026-08-11 plugin generic-adopter run
294
+
295
+ Two **pre-existing `action.yml` defects** surfaced by an external reviewer during that
296
+ run's final review. Neither is caused by the change, and `action.yml` was explicitly out
297
+ of that plan's scope, so both are recorded here rather than fixed in passing. They belong
298
+ with the two `action.yml` items above — one considered change to the action's contract.
299
+
300
+ - [ ] **The score gate silently drops a malformed `weighted_score`.** `action.yml`'s
301
+ minimum-task-score step filters `task_results` rows down to usable floats; a row whose
302
+ score is a string, a bool, `NaN`/`inf`, or out of `[0, 1]` is omitted from the
303
+ comparison rather than failing it. So a `run.json` carrying one corrupt row **and** one
304
+ valid row above the floor gates **green**, which contradicts the fail-closed intent
305
+ stated in that step's own comment. The fix is to error on a present-but-invalid score
306
+ while still skipping `None` (errored tasks are already covered by coder-eval's exit
307
+ code). Wants a test over a synthetic `run.json` per bad-value class, which is why it is
308
+ not a five-minute change.
309
+
310
+ - [ ] **`tasks:` is declared optional but omitting it cannot work.** The input defaults to
311
+ empty and the run step then appends no path arguments, so `coder-eval run` is invoked
312
+ bare — and zero-argument discovery resolves against the *installed package's* location,
313
+ finds nothing, and exits 1. The input is therefore effectively required, and the action
314
+ advertises otherwise. Either mark it `required: true` (a published-input contract change,
315
+ see the `working-directory` item) or fail with a clear message instead of an obscure
316
+ discovery error.
317
+
318
+ ## From the coder-eval-code-review of fix/antigravity-wait-for-wakeup (2026-08-12)
319
+
320
+ - [ ] **A retry/poll loop's continuation state must derive from a stable per-entity
321
+ key, never a mutable monotonic counter used as an id fallback.** `_AntigravityTurnState._handle_tool_call`
322
+ minted a synthetic tool-call id from `f"{raw_name}_{self._next_seq}"` when the SDK's
323
+ `call.id` was falsy; since `_next_seq` advances between a tool call's ACTIVE and DONE
324
+ emissions, the DONE step computed a *different* fallback id than the ACTIVE step,
325
+ stranding the ACTIVE entry as a permanent orphan and stalling `communicate()`'s new
326
+ poll loop for its full `_MAX_BACKGROUND_POLLS` budget on every id-less turn. Fixed by
327
+ deriving the fallback from `(step.step_index, call_index)` instead (stable across a
328
+ step's own re-emissions, per this class's own docstring) -- then, in the same PR,
329
+ further folded in `step.trajectory_id` (falling back to bare `step_index` when it's
330
+ empty, mirroring the SDK's own `trajectory_id:step_index` id scheme), since a
331
+ sub-agent trajectory can reuse the same low `step_index` values as the main one and
332
+ two id-less calls across trajectories would otherwise collide. Not promoted to a CExxx rule:
333
+ this is the only id-fallback-driving-control-flow site in the codebase today (a
334
+ single call site, not a recurring class per the existing "single call-site fix, no
335
+ recurring pattern to guard" convention) — a mechanical AST rule for "no mutable
336
+ counter in a dict-key fallback" would need real design work to avoid false-positiving
337
+ on ordinary sequence-numbering counters elsewhere in the file. Caught by two
338
+ independent reviewers (Opus fallback pair) in this run's final code review.
339
+
340
+ - [ ] **A `while` loop built around a cooperative-cancellation watchdog should read the
341
+ watchdog's own "already decided to fire" flag in its condition, not rely solely on a
342
+ later exception handler to notice.** The antigravity poll loop's condition checked
343
+ `not state.stopped_early_hit and state.has_orphaned_tool_call() and poll_count < cap`
344
+ but not `state.timeout_hit`, so if `ThreadedWatchdog`'s background thread set the flag
345
+ before its `task.cancel()` actually landed on this coroutine, the loop kept
346
+ sleeping/re-draining for up to the full poll budget before the pre-existing
347
+ post-loop `if state.timeout_hit:` check ever got a chance to run. Fixed by adding
348
+ `and not state.timeout_hit` to the condition, plus a mid-body early exit right after
349
+ the sleep (`if state.timeout_hit: break`) so a flag landing DURING the sleep skips
350
+ the following re-drain too, instead of waiting for the loop's next head check. Not
351
+ promoted: `ThreadedWatchdog` + a bespoke poll loop reading its own state flag is a
352
+ one-off shape unique to this agent; no second instance exists to generalize a rule
353
+ from. Caught in the same
354
+ final review as above.
355
+
356
+ - [ ] **A regression test's fake dependency must model every layer the fix under test
357
+ actually touches, not just the outermost one.** `_drain()`'s cooperative-stop path
358
+ wraps a real SDK call (`Conversation.receive_steps()`) that is itself a delegating
359
+ async generator over an inner, connection-layer generator holding the real
360
+ re-entrancy guard. The first regression test written for this fix used a
361
+ single-layer fake (the guard lived on the SAME generator `_drain()` iterated), which
362
+ passed against an incomplete fix (`contextlib.aclosing` on the outer generator only)
363
+ that does not work against the real two-layer SDK shape — confirmed live that the
364
+ inner generator's cleanup is deferred to a LATER event-loop turn, not synchronous
365
+ with the outer's `aclose()`. Caught by a reviewer re-deriving the real dependency's
366
+ shape from its installed source, not by the test itself. Not promoted: detecting "a
367
+ test double is missing a delegation layer the source has" is a semantic match
368
+ against third-party source, not an AST pattern in our own code — no cheap mechanical
369
+ check exists. Caught in the round-3 coder-eval-code-review of this same branch.
370
+
371
+ - [ ] **An agent's internal sleep-and-retry loop must derive its own exit bound from
372
+ the turn's actual `timeout`, never a fixed cycle count picked independently.** The
373
+ poll loop's own graceful exit path (force-close a never-resolving orphan as
374
+ unresolved, finalize and grade normally) was bounded by `_MAX_BACKGROUND_POLLS * _BACKGROUND_POLL_INTERVAL_SECONDS`
375
+ (120 × 5s = 600s) — DOUBLE `experiments/default.yaml`'s own default `turn_timeout: 300`.
376
+ Since the pre-existing `ThreadedWatchdog` enforces `timeout` by cancelling the whole
377
+ turn, it always won that race under default settings, making the graceful path dead
378
+ code: a tool call spuriously left ACTIVE with no real background job behind it (a
379
+ real, observed case — see the final validation run) went from "finalizes immediately,
380
+ graded on whatever the agent wrote" pre-fix to "burns the full 300s, then crashes as
381
+ `TurnTimeoutError` with zero criteria graded" post-fix — a strict regression for that
382
+ input class. Fixed by deriving a `poll_deadline` from a fraction (0.8x) of the actual
383
+ `timeout` passed to `communicate()`, falling back to the cycle cap only when
384
+ `timeout is None`. Caught independently by two reviewers (`bai-uipath`, `uipreliga`)
385
+ on the PR, both citing the exact same arithmetic mismatch. **Not promoted in this
386
+ pass**, but a stronger candidate than most entries here: `uipreliga` proposed a
387
+ generic whole-tree rule (proposed as CE035, renumbered CE042 here — CE035 shipped as
388
+ the workflow-outputs resolver on the published-action branch) — for every sleep-loop under
389
+ `src/coder_eval/agents/**`, assert its own cycle-count × interval either references a
390
+ timeout-derived name or is provably below `experiments/default.yaml`'s baseline — that
391
+ would catch this class of bug in ANY agent, not just this one (confirmed zero
392
+ violations on `main` before this bug, one on this PR). Worth a real look next time
393
+ `agents/` is touched, since a second agent adding its own disconnected sleep-loop
394
+ constant would reintroduce the exact same shape.
395
+
396
+ ## From 2026-08-04 published-action verification review
397
+
398
+ - [ ] **CE041 — `VAR=$(… | grep …)` under `set -e` followed by an emptiness check
399
+ is a dead diagnostic.** With `set -euo pipefail`, a pipeline whose `grep` matches
400
+ nothing exits 1, so the assignment aborts the step *before* the
401
+ `if [ -z "$VAR" ]; then echo "::error::…"` branch that was written to report it —
402
+ the operator gets a bare exit 1 with no message. Also applies to `head -1`
403
+ closing the pipe early (SIGPIPE 141). Fix is `|| true` on the substitution,
404
+ letting the emptiness check own every failure mode. Detectable by matching
405
+ `\w+=\$\(.*\|\s*(grep|head)\b` inside a `run:` body whose script sets `-e`, then
406
+ requiring `|| true`/`|| :` on the same logical line. Caught by a reviewer in
407
+ `verify-published-action.yml`; **`actionlint` + shellcheck do NOT flag it**
408
+ (verified against the exact snippet), so the actionlint candidate above does not
409
+ subsume this one.
410
+ - [ ] **CE036 — ban the skipped-green job gate.** Fail a job-level `if:` in
411
+ `.github/workflows/**` whose only discriminator is an emptiness/equality test on
412
+ `needs.<job>.outputs.<key>`. A lost output on a partial "Re-run failed jobs" resolves
413
+ the job to SKIPPED-**green**, so an operator sees a green re-run while nothing ran.
414
+ Fixed by hand twice now: `promote` was designed around the hazard, and
415
+ `publish-pypi`'s `if: needs.release.outputs.version != ''` (dead *and* dangerous — a
416
+ skipped publish also skipped `promote`) was removed in the follow-up review. CE035
417
+ catches the *typo* class; this catches the *shape*. Escape hatch: inline
418
+ `# noqa: CE036 — <reason>` for value-driven gates that cannot strand a release.
419
+ - [ ] **CE037 — `if: failure()` is wrong in a job containing a `continue-on-error`
420
+ step.** Require `always()` (or a reference to the tolerated step's
421
+ `steps.<id>.outcome`) on diagnostic/upload steps in such a job. Fixed by hand in
422
+ `verify-published-action.yml`: the run dir was discarded in exactly the tolerated-red
423
+ case the gate is designed around, because a tolerated red leaves the job green and
424
+ `failure()` never fires. Pure YAML shape check, ~30 lines.
425
+ - [ ] **CE040 — cap inline `run:` bodies; oversized decision logic belongs in
426
+ `.github/scripts/`.** `verify-published-action.yml`'s parity step (~70 lines, 7
427
+ decision points) and its e2e gate (~66 lines, switching from bash to a `python3`
428
+ heredoc mid-step) are 10-20-branch units invisible to `make check`, `make lint`,
429
+ `pyright` and coverage — which is the structural reason the `steps.parity.outputs.version`
430
+ bug survived to `main`. Analogous to CE022's statement cap; composes with CE032/CE033.
431
+ Deferred as a refactor, not a fix: extraction touches all 423 lines of a workflow that
432
+ cannot be exercised before merge, and CE035 + `tests/test_verify_published_workflow.py`
433
+ now cover the specific failure classes. Precedent for the extraction:
434
+ `.github/scripts/release_notes.py` + `tests/test_release_notes.py`.
435
+ - [ ] **Exercise the Action's score gate in the FAILING direction.** Both
436
+ consumer-simulating jobs pass `minimum-task-score: "0.0"`
437
+ (`verify-published-action.yml`'s `e2e`, `pr-checks.yml`'s `action-dogfood`), so the gate
438
+ is only ever proven to *pass*. The new exit-contract assertion catches a gate that
439
+ wrongly fails; nothing catches one that wrongly passes — the direction that silently
440
+ disables every consumer's quality gate. Needs a second invocation with an unmeetable
441
+ score floor, i.e. a second paid agent run per nightly; deferred on cost, and better
442
+ placed in `action-dogfood` (PR-time, already paying) than in the cron.
443
+ - [ ] **Extend CE026's `REQUIRED_PREREQ_TOKENS` anchor to the `e2e` job.** The lint pins
444
+ the documented Node + `@anthropic-ai/claude-code` prerequisite steps to a single
445
+ executable reference (`action-dogfood` in `pr-checks.yml`, via
446
+ `tests/lint/action_docs.py::DOGFOOD_JOB`). `verify-published-action.yml`'s `e2e` job is
447
+ now a third copy of the same two steps — and the truer consumer proof (no checkout,
448
+ published action, default pin) — so the two can drift while the docs follow only one.
449
+ - [ ] **Runtime-key parity for `run.json` consumers outside `src/`.** The e2e gate in
450
+ `verify-published-action.yml` reads `task_results[*].status` / `weighted_score` /
451
+ `total_tokens`, and `action.yml`'s score gate reads `weighted_score` / `task_id`.
452
+ These are string keys in shell/YAML that no test or type-checker binds to
453
+ `eval_result_to_task_dict` (`run_record.py`), so renaming a key there
454
+ silently turns an external gate into a no-op — a reviewer here proposed
455
+ `final_status`, which does not exist in `run.json` and would have made a new
456
+ assertion dead on arrival. Guard: assert the key set that non-Python consumers
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
+ **Consequence, as of the turn-timing consolidation (2026-09-12):** such a
542
+ call now contributes to no bucket on EITHER surface — the evalboard's
543
+ `toolExecutionMs` lost its `durationMs` fallback, matching the `is not None`
544
+ filter Python has always had — so the time reads as Unaccounted rather than
545
+ as tool execution. Pinned by `unbounded_cases` in
546
+ `tests/_fixtures/timing_union_cases.json`, which both suites replay.
547
+
548
+ - [ ] **Pre-existing, surfaced by this work's final review: `TokenUsage._adopt_legacy_input_tokens`
549
+ double-counts the cache buckets.** The validator copies a legacy record's
550
+ full-prompt `input_tokens` straight into `uncached_input_tokens`, and the
551
+ computed `input_tokens` then adds `cache_creation` + `cache_read` again. A
552
+ legacy record with `input_tokens=1000`, `cache_creation=200`, `cache_read=150`
553
+ reloads as 1350 prompt tokens and bills 1000 at the uncached rate instead of
554
+ 650. Affects every report, budget check and detached regrade over a
555
+ pre-split run that used prompt caching. NOT touched by the timing work
556
+ (token accounting was explicitly out of its scope) and not a guardrail
557
+ candidate — a real bug needing its own change, with a decision about
558
+ whether legacy records can be distinguished from current ones at all.
559
+ Caught in: timing-capture final review (gpt-5.6-sol).
560
+
561
+ - [x] ~~No golden-corpus assertion of the four-bucket identity.~~ **DONE.** The
562
+ fixture clocks were unified (`_rebase_notifications` / `_rebase_lines` shift
563
+ codex's 2027 base and opencode's month-old base onto the replay's own clock,
564
+ keeping every derived duration exact) and `assert_timing_captured` now
565
+ asserts `Σ generation + ∪ tool + head + tail` against `duration_seconds`.
566
+ Mutation-verified: reintroducing the defect fails
567
+ `test_antigravity_golden[d_orphaned_tool]`, which previously passed.
568
+ 22 of 27 scenarios are checked. The remaining 5 are exempt via
569
+ `FICTIONAL_DURATIONS` for a reason rebasing cannot fix: they inject SDK
570
+ stamps in integer MILLISECONDS (17-900 ms of declared item time) while the
571
+ replay runs in well under one, so closing that last gap needs the agent's
572
+ own clock faked, not the fixtures' rebased.
573
+
574
+ - [x] ~~No TypeScript counterpart to CE058.~~ **DONE.**
575
+ `evalboard/lib/__tests__/no-zero-coalesce.test.ts` is a vitest source scan
576
+ (there is no eslint in `evalboard/`) over `lib/runs.ts`, `lib/timing.ts` and
577
+ `_sections.tsx`. It is an ALLOWLIST rather than a ban, exactly because the
578
+ residual arithmetic uses `?? 0` correctly — each of its 14 entries carries a
579
+ one-line reason, and a new occurrence fails until its author justifies it or
580
+ keeps the value null. It is keyed on the codebase's own `…Ms` naming
581
+ convention rather than on every `?? 0`: a blanket scan matches 58
582
+ occurrences, ~40 of them token buckets where zero is a fine answer, and an
583
+ allowlist that long is one nobody reads. Blind spots are declared in the
584
+ file. Two meta-tests keep it honest — a negative control (so the scan cannot
585
+ pass by matching nothing) and an assertion that every allowlist entry is
586
+ still present, so an entry cannot outlive its reason.
587
+ Caught in: turn head/tail timing final review.
588
+
589
+ - [x] ~~**`timing.py::decompose_turn` raises an uncaught `TypeError` on a
590
+ naive/aware datetime mix**~~ **DONE.** `timing.py::_require_same_awareness`
591
+ now raises from five call sites (`decompose_turn`'s head and tail,
592
+ `busy_ms`'s window bounds and each span's two ends) with one message template
593
+ naming the field and which side is aware. Deliberately a GUARD and not a lint
594
+ rule: the invariant is still unviolated in-tree, and the exposure that
595
+ actually matters is a third-party agent registered through the
596
+ `coder_eval.plugins` SPI, which lives outside `src/coder_eval/agents/` and
597
+ which a rule scoped to that directory could never see — so the message
598
+ addresses that reader directly. An empty span list is checked not at all,
599
+ bounds included: nothing is compared, so there is no pair to be about.
600
+ Caught in: turn head/tail timing final review.
601
+
602
+ - [x] ~~**`claude-code` does not subtract tool execution from its generation
603
+ windows.**~~ **FIXED** in `_ClaudeTurnState._subtract_tool_time_from_windows`,
604
+ which runs at finalization (it cannot run at flush time — a tool issued by an
605
+ earlier emission is still running when the next window closes). Re-measured
606
+ on the same task: 481 ms / 2.691% -> **1.4 ms / 0.006%** over four turns that
607
+ all carried overlapping tool calls. Original report kept below for the
608
+ reasoning.
609
+
610
+ ORIGINAL: The other four
611
+ harnesses subtract the union (`timing.py::busy_ms`); claude-code is exempted
612
+ on the reasoning that it "marks the end of the previous SDK event and reads
613
+ again when the next message arrives, so a tool's execution falls between two
614
+ windows rather than inside one". But a tool's timer starts at the **emission**
615
+ carrying its `tool_use` block, and one assistant turn spans several emissions,
616
+ so a later emission's window runs concurrently with a tool already timing.
617
+ Measured live on a task with five parallel writes, five reads and two
618
+ concurrent `Bash` calls: the generation/tool overlap was **482 ms and 340 ms**
619
+ on two ~18-25 s turns, and the four-bucket residual came out at exactly
620
+ `-481 ms` / `-339 ms` — the overlap accounts for it to within 1.4 ms. The
621
+ other four harnesses overlapped by ~2.0-2.3 s on the same task and reconciled
622
+ to within 1.2 ms. Two claude-code turns with <1 ms of overlap reconciled to
623
+ within 0.1 ms, so the fault is precisely the missing subtraction.
624
+ Fix is to apply `busy_ms` in `on_assistant_message` as the other four do, but
625
+ it changes a PUBLISHED `generation_duration_ms` on the most-used harness, so
626
+ it needs its own golden regeneration and live pass. NOT introduced by the
627
+ head/tail work — generation-vs-tool timing predates it — but that work's
628
+ four-bucket identity is what made it visible.
629
+ Caught in: post-merge live verification of the head/tail buckets.
630
+
631
+ ### Deferred lint-rule widenings
632
+
633
+ - [ ] **CE058 and CE059 still match `AssistantMessage` by a hardcoded constructor
634
+ NAME LIST** (`_MESSAGE_CONSTRUCTORS`), where CE060 derives the set from each
635
+ module's own `coder_eval.models` imports. The weakness is live, not
636
+ theoretical: `claude_code_agent.py` binds *only*
637
+ `AssistantMessage as AssistantMessageTelemetry` and never the bare name, so
638
+ the two shipped rules guard that file's two construction sites purely because
639
+ somebody wrote the current alias into a different file's frozenset — rename
640
+ the alias and both go silently blind there — and an arbitrary
641
+ `AssistantMessage as Msg` is missed outright by both. Adopting CE060's
642
+ alias-resolving `check()` pre-pass is about ten lines per rule, but it widens
643
+ two SHIPPED rules whose firing sets are load-bearing (CE058's constructor set
644
+ is a different, wider one: `CommandTelemetry`, `SlowestCommandInfo`,
645
+ `TurnRecord`), so it needs its own mutation check per rule and a re-measured
646
+ firing set over all of `src/`, not a drive-by edit. If a fourth same-scope
647
+ kwarg rule ever lands, extract `tests/lint/rules/_message_calls.py` at that
648
+ point rather than sooner.
649
+ Caught in: the CE060 / antigravity `message_id` run.
650
+
651
+ - [ ] **Nothing pins that `message_id` is only ever a WITHIN-TURN identity.** Ids
652
+ repeat across retry attempts of one turn on every synthetic-id harness —
653
+ `Agent.discard_pending_turn` rolls the iteration counter back, so a crashed
654
+ partial and its retry both emit `<harness>-1-msg-0` (antigravity, codex, and
655
+ the out-of-tree delegate agent alike). Harmless today, and verified so: the
656
+ evalboard declares its grouping list INSIDE the per-turn loop
657
+ (`runs.ts:1822`, flushed at `:2217`) and only ever compares adjacent raws, and
658
+ no Python consumer reads the field at all. It stops being harmless the moment
659
+ anything joins on the id run-wide (a React key across turns, a cost join, a
660
+ dedup) — which is a natural thing to reach for once every harness populates
661
+ it. No cheap guard exists: the property to assert is "no consumer treats this
662
+ as run-unique", which is a negative over two languages, and asserting
663
+ within-turn uniqueness instead would pass today and catch nothing. Cheapest
664
+ real option is a comment on the model field; the durable one is a run-level
665
+ id if a consumer ever needs one.
666
+ Caught in: the CE060 / antigravity `message_id` final review.
667
+
668
+ - [ ] **No evalboard test is fed by a Python golden snapshot.** The two halves of
669
+ a capture fix are pinned by two hand-written fixtures that never meet: the
670
+ golden (`tests/_fixtures/golden_streams/expected/antigravity_e_multi_generation.json`)
671
+ pins what the reducer emits, and `evalboard/lib/__tests__/parseMessages.test.ts`
672
+ pins what the consumer does with a fixture an author typed from the same
673
+ understanding. Nothing feeds a real recorded shape through `parseMessages`, so
674
+ a reducer change that makes the TS fixture unrepresentative breaks no test on
675
+ either side. Deferred as architectural: it needs a loader, a scrub-aware
676
+ timestamp story (the goldens mask exactly the stamps the grouping reads), and
677
+ a convention for which snapshots the JS suite owns — well over 30 min, and
678
+ wider than any one capture fix.
679
+ Caught in: the CE060 / antigravity `message_id` final review.
680
+
681
+ - [x] ~~**`AssistantMessage.message_id`'s field description names one harness of
682
+ five**~~ **DONE.** It said "Anthropic API message_id … when the Claude Code
683
+ CLI splits one API response", while five backends write the field and four
684
+ synthesize it — so `docs/agents/HARNESS_PARITY.md`'s row was the real SSOT
685
+ and the model, which this project's DRY principle designates as
686
+ authoritative, described claude-code only. Rewritten agent-agnostically: what
687
+ the id MEANS (the generation an emission belongs to), that all five write it
688
+ and four synthesize it, each scheme named, a pointer to the per-harness row,
689
+ and the fact that it is a WITHIN-TURN identity that repeats across retry
690
+ attempts. No mechanical guard was added and none is obvious — "a field
691
+ description must not name a single harness when the union has five writers"
692
+ needs a writer census per field, which is CE054-shaped but over a `str`
693
+ description rather than a key; the cheap version was exactly this, fixing the
694
+ sentence in the next change that touches the model.
695
+ Caught in: the CE060 / antigravity `message_id` final review.
696
+
697
+ - [ ] **The golden corpus pins that a timing value EXISTS, never what it is.**
698
+ `tests/_fixtures/golden_streams/_scrub.py::SCRUB_KEYS` masks
699
+ `generation_duration_ms`, `started_at`, `completed_at` and both
700
+ `execution_*_at` to a placeholder, and the one assertion that does look at
701
+ magnitudes (`assert_timing_captured`'s four-bucket check) is an UPPER BOUND —
702
+ it catches a bucket claiming more time than the turn contains and says
703
+ nothing about one claiming less. So the committed suite cannot see a
704
+ per-harness generation number move at all, in either direction. Not
705
+ hypothetical: a whole phase of the timing plan was written on the premise
706
+ that changing those numbers would turn the golden master red, and it never
707
+ did. The two-sided check exists (`scripts/timing/decompose_run.py
708
+ --max-residual-pct`) but runs only against live `task.json` files, by hand.
709
+ Not cheap to guard: porting the two-sided residual into `_scrub.py` means
710
+ deciding a per-scenario tolerance for replays whose real wall clock is under
711
+ a millisecond while their SDK stamps declare hundreds — the same problem
712
+ `FICTIONAL_DURATIONS` already exempts six scenarios from, so the honest
713
+ version needs those scenarios to fake the agent's own clock too, not just
714
+ their item stamps. Interim cover is the per-reducer ms-exact identity test
715
+ added on pi and opencode
716
+ (`test_the_four_bucket_identity_closes_exactly_across_the_boundary`).
717
+ Caught in: the timing-architecture-standardization final review.
718
+
719
+ ## From the turn-timing P0–P3 run (2026-09-12)
720
+
721
+ - [ ] **A golden scenario's justification comment can contradict its own
722
+ snapshot, and nothing notices.** Three did in this run: two orphan-tool
723
+ comments asserted bounds the committed JSON plainly carries (`pi_d`,
724
+ `opencode_d`), and `opencode_c`'s exemption claimed "the snapshot still
725
+ records the tiling" while `SCRUB_KEYS` masks both bounds and the duration.
726
+ Each was found by a human/model reading the JSON beside the prose — nothing
727
+ mechanically ties an exemption's stated reason to what its snapshot contains.
728
+ A rule would have to parse prose, so this is probably not guardable; the cheap
729
+ substitute is the review instruction that already exists ("read every new
730
+ snapshot before committing") plus the habit of quoting the actual JSON in the
731
+ comment. Caught in: turn-timing P0–P3, phases 2 and 5.
732
+
733
+ - [ ] **A rationale comment asserting a now-false premise survives a ripple that
734
+ updated its siblings.** The "in-process SDK" claim was corrected in six files
735
+ and left standing in two (`test_event_collector.py`,
736
+ `message-timeline.test.tsx`), one of them directly beside a sibling that WAS
737
+ updated. Same shape as CE026/CE047 (doc-surface parity) but over a PHRASE
738
+ rather than a symbol, so a rule would be a phrase blocklist with an
739
+ ever-growing allowlist. Deferred on cost, not on value — a grep for the retired
740
+ phrase in the acceptance criteria is what actually caught these, and that is
741
+ cheap to write into a plan.
742
+
743
+ - [ ] **`EventCollector` retains `_commands` and `_turn_starts` across a retry's
744
+ `AgentStartEvent`**, which resets only `_agent_end`. Pre-existing and NOT
745
+ introduced by the timing work. Blast radius is narrower than it first looks:
746
+ the persisted record, the reports and `max_turns` all read the AGENT's
747
+ collector, which is fresh per `communicate()`. Only `EarlyStopWatcher`'s
748
+ long-lived collector accumulates — where carrying a turn's whole engagement
749
+ across retry attempts is arguably what a live "did it engage the skill"
750
+ verdict wants, and `_check_round`'s docstring already reasons about crashed
751
+ attempts. Needs a decision on intent before any guard. Caught in: turn-timing
752
+ P0–P3 final review.
753
+
754
+ - [x] ~~**claude-code has no `TurnClock`.**~~ **RESOLVED.** `_ClaudeTurnState`
755
+ now takes an injected `TurnClock` and every wall stamp the turn records
756
+ derives from it — both window bounds, the tool span
757
+ `_resolve_pending_command` stamps (which takes the reading as an argument, so
758
+ the span and the bounds it is clipped against cannot end up on two clocks),
759
+ and the fallback tool timestamp. One raw `datetime.now()` is deliberately
760
+ left, on the synthesized sub-agent terminal message: those bounds are an
761
+ admitted placeholder that `subtract_tool_time` and the head/tail bracket both
762
+ exclude, so no arithmetic reads them and there is no basis to share. The
763
+ ms-exact sensor was re-pointed at the injected clock rather than the module
764
+ `datetime` — a derived stamp escapes a monkeypatch, so the old patch would
765
+ have left `tests/test_timing_identity_contract.py` measuring the real clock
766
+ and passing by accident; reverting the conversion now fails it by ~10^7 ms.
767
+
768
+ - [x] ~~**`pi_agent` publishes a `duration_ms` and a subtracted tool SPAN for an
769
+ UNRESOLVED orphan.**~~ **RESOLVED.** `_close_tool` now stamps
770
+ `execution_completed_at` and derives `duration_ms` only when the status is
771
+ not `UNRESOLVED`; the guard the old comment claimed is the guard the code
772
+ has. `execution_started_at` is kept (the CLI really did emit that start) and
773
+ one bound alone forms no span, so the orphan no longer has time subtracted
774
+ from a generation window it never occupied. `pi_d_orphaned_tool.json` now
775
+ records both fields as `null`.
776
+
777
+ **Sibling, NOT fixed:** `antigravity_agent` does the same thing at its own
778
+ orphan sweep (`tel.model_copy(update={..., "execution_completed_at":
779
+ self.clock.now()})`), though it stops short of a `duration_ms`. Deliberately
780
+ left: `timing.decompose_turn`'s docstring reasons about that stamped
781
+ completion landing inside the tail, and the `antigravity_d_orphaned_tool`
782
+ residual was measured against it, so changing it is a separate piece of work
783
+ with its own fixture to re-derive — not a ride-along.
784
+
785
+ - [x] ~~**`pi_agent` republishes a turn's content on a duplicate `turn_end`.**~~
786
+ **RESOLVED.** `turn_text_parts` / `turn_tool_ids` are now cleared in
787
+ `on_turn_end` beside `turn_started_at`, on the argument that comment already
788
+ made: all three have been SPENT into the message just appended.
789
+ `pi_f_duplicate_turn_end.json` now records the second message with an empty
790
+ `content_blocks` and no `tool_use_ids` — it books the duplicate's own usage
791
+ and nothing else. The timing half had a unit test that stayed green while the
792
+ content half was broken, so the two are now asserted separately
793
+ (`test_a_duplicate_turn_end_does_not_republish_the_previous_content`).
794
+
795
+ ## From the turn-timing consolidation (2026-09-12)
796
+
797
+ Two findings from `c/turn-audit.md` were CUT during planning, on evidence. They
798
+ are registered here with their corrected cost/benefit and the trigger that would
799
+ reopen them — not because they are cheap guards waiting to be written, but
800
+ because the reason they were cut is the part a later reader will otherwise
801
+ re-derive from scratch.
802
+
803
+ - [ ] **A2-full — reducers publish BOUNDS only; the collector derives the raw
804
+ window.** The audit justified this partly as retiring two lint rules. Neither
805
+ holds. `CE058` form 1 is a generic keyword rule over five constructors
806
+ (`ce058_no_timing_literal.py:71-76`) and stays live whatever a reducer
807
+ publishes. `CE059` keys its exemption on `generation_duration_ms=None` being
808
+ PRESENT at the call site (`ce059_generation_window_is_two_reads.py:68`), so
809
+ removing the kwarg makes `claims_a_window` true at the three legitimate
810
+ placeholder sites and forces a rule REWRITE rather than a retirement. Net
811
+ cost: five reducers, a regeneration of every golden, and a CE059 rework; net
812
+ benefit: SSOT alone. **Deferring it is safe because the seam assertion in
813
+ `timing.subtract_tool_time` now checks the property at runtime** — a group's
814
+ raw total must equal the span its own bounds describe — which also covers a
815
+ third-party agent registered through the `coder_eval.plugins` SPI, where no
816
+ lint rule scoped to `agents/` reaches. REVISIT IF: that assertion ever has to
817
+ be relaxed for a legitimate reducer, which would mean the equality is no
818
+ longer the contract and storage has stopped paying for itself.
819
+
820
+ - [ ] **C2 — a persisted `clock_inversions` counter.** The audit wanted the
821
+ number of clamped negatives recorded on the turn. CE064 removed the reachable
822
+ cause (the cross-basis head/tail comparison), and a field nothing may ever
823
+ read is YAGNI. The DOC half was done instead: the two contradictory clamp
824
+ docstrings now state one position — a measured inversion IS a real zero,
825
+ because both ends were observed (`timing.decompose_turn`), and claude-code's
826
+ case was never about the clamp but about the head being measured against the
827
+ wrong instant. REVISIT IF: an inversion is observed on a live run after
828
+ CE064, which would mean a basis is still mixed somewhere the rule cannot see
829
+ (the plugin SPI, or a harness whose spans come from a CLI).
830
+
831
+ - [ ] **`test_codex_golden[a_agent_message_only]` is FLAKY, ~5% — measured, and
832
+ pre-existing.** Forty consecutive runs on an unmodified tree (`-n 0`): 2
833
+ failures, `"no assistant message reports a positive generation window with
834
+ bounds that span it"` with `(0.0, '...164797', '...164797')`. The replay
835
+ finishes faster than `datetime`'s 1 us resolution, so codex's rebased item
836
+ stamps can collapse to one instant and the window rounds to `0.0` — which
837
+ `assert_timing_captured`'s `expect_generation_window` arm then correctly
838
+ refuses. Surfaced (not caused) by the turn-timing consolidation, which runs
839
+ that file repeatedly. Not fixed here because the fix is in the codex fixture's
840
+ stamp rebasing (`_rebase_notifications`), which is its own change with its own
841
+ risk of ratifying whatever it then produces; the honest options are to give
842
+ the fixture's items a floor above the clock's resolution, or to give the
843
+ scenario `expect_generation_window=False` and say why. Caught in: the
844
+ turn-timing consolidation, Phase 6.
845
+
846
+ - [ ] **CE058 misses a sixth form: `<expr> if <test> else <numeric literal>`.**
847
+ Its five forms are a zero constructor keyword, `x or 0`, `x if x is not None
848
+ else 0.0`, an `if x is None: x = 0.0` assignment, and a `model_copy(update=)`
849
+ dict. Form 3 keys on an `is None` / `is not None` COMPARISON, so the shape the
850
+ single production writer of `tool_union_ms` actually uses —
851
+ `union_ms(tool_spans) if tool_spans else None`, a truthiness test on a list —
852
+ is invisible to the rule in either polarity. Nothing ships wrong today (that
853
+ line correctly writes `None`, and `test_a_turn_with_no_bounded_span_records_none_not_zero`
854
+ covers it), but an author flipping it to `else 0.0` would publish "measured,
855
+ and instant" with the rule silent. Candidate: a form that fires on an
856
+ `ast.IfExp` whose `orelse` is a numeric literal and whose assignment target —
857
+ or enclosing timing-constructor keyword — matches `_TIMING_NAME`. Deferred
858
+ because the target-name resolution is new machinery rather than a variant of
859
+ an existing form. Caught in: the turn-timing consolidation, Phase 5 review.
860
+
861
+ - [ ] **Pre-existing, surfaced by the turn-timing final review:
862
+ `stats.regularized_incomplete_beta` clamps an out-of-domain `x`
863
+ instead of raising.** Its docstring says "Raises ValueError outside that
864
+ domain — returning NaN would let a bad input render as a real-looking
865
+ statistic downstream", and it does raise for a non-finite `a`/`b`/`x` and for
866
+ a non-positive `a`/`b`. But the boundary branches are `if x <= 0.0: return
867
+ 0.0` / `if x >= 1.0: return 1.0`, so a NEGATIVE `x` or one above 1 silently
868
+ becomes a valid-looking probability — exactly the outcome the docstring says
869
+ it prevents. `x == 0.0` and `x == 1.0` are legitimately in the domain, so the
870
+ fix is to split the equality from the inequality, not to tighten the branch.
871
+ The internal Student-t callers construct an in-range `x`, so nothing ships
872
+ wrong today; the exposure is a future or external caller. NOT touched by the
873
+ timing work (the function is zero lines of its diff) and not a guardrail
874
+ candidate — a small real bug needing its own change. Caught in: the
875
+ turn-timing consolidation final review (gpt-5.6-sol).
876
+
877
+ - [ ] **A comment line that opens mid-sentence directly after one that ended.**
878
+ The residue of a block replacement whose anchor matched the wrong line: the
879
+ tail of the replaced prose survives as a severed fragment. The exact-form half
880
+ of this — a `Rationale:` pointer that is not the last line of its block — was
881
+ PROMOTED in the prose-mass-reduction run and now ships as
882
+ `prose_budget.check_pointer_placement`. What remains is the general case,
883
+ where no pointer is involved, and it is heuristic: a legitimately wrapped
884
+ sentence looks identical to a severed one, so it needs an allowlist (a
885
+ continuation opening with a backtick, a quote, or a list marker is usually
886
+ fine). ~30 min plus the false-positive triage. Caught in: prose mass
887
+ reduction, Phases 4-7 review.
888
+
889
+ - [ ] **Two `.claude/notes/` sections covering ONE topic under different
890
+ headings.** The single-home rule is the load-bearing invariant of the notes
891
+ tree and nothing enforces it. `check_pointers` proves a pointer resolves;
892
+ nothing proves the topic is not also argued three files away. It bit every
893
+ phase of the prose-mass-reduction run, including once against a file the
894
+ phase never opened (`reporting.md` vs `orchestration.md` on
895
+ `nothing_was_measured`). Needs a similarity measure over section bodies —
896
+ shared rare tokens, or a shared symbol name appearing as the subject of two
897
+ headings — so it is real work rather than a regex. Deferred on cost, not on
898
+ value: this is the highest-value unbuilt guard in the notes design. Caught
899
+ in: prose mass reduction, all phases.
900
+
901
+ - [ ] **A `Rationale:` pointer that resolves to a heading which does not hold
902
+ the rationale that left the site.** The weaker sibling of the above and the
903
+ same shape of miss: the gate goes green while the reader arrives somewhere
904
+ unhelpful. Five instances in Phase 5 alone, all fixed by hand. Probably not
905
+ mechanizable without a semantic check, but worth recording as a known blind
906
+ spot of `check_pointers` so nobody reads its green as "the pointers are
907
+ good". Caught in: prose mass reduction, Phases 5-6 review.
908
+
909
+ - [ ] **A criterion-class first docstring line changing without
910
+ `make plugin-reference` in the same commit.** CE033 already diffs the
911
+ generated `plugins/coder-eval/reference/criteria.md`, so drift IS caught —
912
+ but only for classes that reach the generated file, and only as "the
913
+ generated file is stale" rather than "you edited a generated surface". A
914
+ commit-scoped guard would name the cause. Deferred because the lint harness
915
+ has no access to a commit-scoped diff today; the ad-hoc version
916
+ (AST-comparing every `ClassDef` first line against a base ref) was written
917
+ and used throughout Phase 6 and is the thing to promote if that access
918
+ appears. Caught in: prose mass reduction, Phase 6.
919
+
920
+ - [ ] A generated surface (`*.generated.*`) has no mechanical guard against being hand-edited
921
+ — CE065/CE033/CE028 all catch *drift* (source changed, output not regenerated) but an edit
922
+ to BOTH passes cleanly. Guarding it needs a checksum or a git-attribute gate, not a diff,
923
+ so it is a different shape of sensor. — caught during the reports consolidation (CE065).
924
+ - [ ] No rule resolves file paths named in PROSE (comments, docstrings, Markdown) across
925
+ `src/`, `evalboard/`, `litellm/` and `.github/`. That consolidation hand-fixed ~25 stale
926
+ module references across five phases, and two reviewers each found more the greps missed.
927
+ The plan's Open Questions measured and declined the CLAUDE.md-only variant (its stale refs
928
+ live in an ASCII tree, not backticks); a wider variant has the same parsing problem plus
929
+ legitimate non-resolving refs (container paths, plugin-relative paths). Recorded because
930
+ the recurrence is now the argument, not the idea. — caught during the reports consolidation.
931
+ - [ ] The anchored package regex `(?:^|[/\\])src[/\\]coder_eval[/\\]` is compiled
932
+ independently across the rule tree — `ce050_no_union_getattr_probe.py:101`,
933
+ `ce051_no_driver_override.py:60`, `ce052_process_lethal_must_be_container_gated.py:78`,
934
+ `ce053_run_record_filename_literal.py:65`, `ce054_env_info_key_round_trip.py:66`,
935
+ `ce056_no_container_env_literal.py:51` and `ce058_no_timing_literal.py:116` — seven
936
+ rule modules, to which `_layers.py` adds one more (its `_CLI` and `_REPORTS` derive from it), with the
937
+ `agents/`-suffixed variant of the same idiom in
938
+ `_model_ctor.py:28` and `ce059_generation_window_is_two_reads.py:45`, plus a near-variant
939
+ in `ce037_no_dead_private_helper.py:61` and a `cli/`-suffixed one in
940
+ `ce048_no_in_process_typer_command_call.py:68`. `_layers.py` is the designated shared rule-helper
941
+ module, though `_model_ctor.py` is an equal peer and a generic src-path regex arguably
942
+ belongs in a neutrally named helper rather than one named `_layers`. Not hoisted here
943
+ because retargeting seven unrelated rules needs a per-rule verification that its scope
944
+ did not shift — a second refactor inside a review-fix plan. The new copies were written
945
+ in the established *spelling* deliberately: the defect being fixed was a regex that
946
+ disagreed with its siblings, so a new variant would be that defect again. — caught during the reports-consolidation review fixes, Phase 1.
947
+ - [x] ~~**CE004 inherits CE066's `reports/` exemption because the two rules share one
948
+ predicate.**~~ **DONE.** `_layers.py` now shares the package anchor and the `cli/`
949
+ boundary (`is_package_path`, `is_cli_path`) rather than one exemption set. CE066 keeps
950
+ `is_core_path` (`{cli, reports}` exempt); CE004's scope is the package minus `cli/`.
951
+ Widening CE004 to `reports/` found 0 violations. `test_the_reports_package_is_in_scope`
952
+ and `TestCoreLayerMembership.test_ce004_scope_is_every_module_outside_cli` both fail if
953
+ CE004 goes back to the core predicate; `test_the_reports_package_itself_stays_exempt`
954
+ pins that CE066's scope did not widen with it. — caught in the reports-consolidation
955
+ review fixes, Phase 1 quality review.
956
+
957
+ - [ ] **A CLAUDE.md Directory Structure bullet naming a path that no longer exists.**
958
+ Shipped briefly as CE067 over the fenced `coder_eval/` tree, then removed when that
959
+ tree was replaced by `ls` plus selective bullets — the exhaustive half of the rule
960
+ became false by design. The surviving half is still real: the bullets name modules
961
+ (`result_metrics.py`, `reports/html.py`, `models/container_paths.py`) and a rename
962
+ leaves them stale with nothing failing. Needs a backtick-path extractor scoped to
963
+ one section, which is the narrow case of the prose-path candidate above. — caught
964
+ during the reports consolidation rebase.
965
+
966
+ - [ ] **A prose "see X's docstring" citation whose target no longer holds the
967
+ claim.** Moving rationale out of a docstring leaves every citation of that
968
+ docstring pointing at text that is gone, and `check_pointers` cannot see it
969
+ because the citation is prose, not a `Rationale:` pointer. Not mechanised: the
970
+ match is heuristic ("see the module docstring", "see CE063's docstring",
971
+ "see that class's docstring" all read differently), and most citations are
972
+ in-file and still valid, so a rule would need per-site triage rather than a
973
+ regex. Instances found (line numbers at 946ca968):
974
+ `src/coder_eval/harbor/packager.py:382` and `:386`,
975
+ `tests/test_harbor_packager.py:163` and `:187`,
976
+ `tests/lint/rules/ce064_turn_bracket_on_the_clock.py:40`. Caught in: tests
977
+ prose slimming, Phases 3 and 7.
978
+
979
+ - [ ] **Narrative after a docstring's `Args:`/`Returns:` block that follows a
980
+ `Rationale:` pointer.** `check_pointer_placement` accepts any tail that STARTS
981
+ with a trailing section, so pointer → `Args:` → an indented entry → a new
982
+ base-indented paragraph passes although the pointer is no longer the last prose
983
+ line. Guarding it means walking section blocks by indentation (the shape
984
+ `prose_words` already uses), plus false-positive triage over every src/ and
985
+ tests/ docstring that ends in a section — more than a quick add. Caught in:
986
+ tests prose slimming, final review (gpt-5.6-sol).
987
+
988
+ - [ ] **A `Rationale:` pointer whose target is not under `.claude/notes/`.**
989
+ `check_pointers` joins the captured path onto the repo root, so an absolute
990
+ path, a `..` segment or any other Markdown file resolves, while CLAUDE.md and
991
+ `.claude/notes/README.md` define the pointer as a repo-relative notes path. No
992
+ such pointer exists today. Deferred because restricting the target is a design
993
+ decision (a `docs/` guide heading is a plausible SSOT target) rather than a
994
+ mechanical guard. Caught in: tests prose slimming, final review (gpt-5.6-sol).
995
+
996
+ ## From container-contract-and-command-surface (2026-09-15)
997
+
998
+ - [ ] **A field-name assertion against CLI output can pass vacuously through `tmp_path`.**
999
+ `assert "variant_id" in result.output` matched the echoed `context.json` path, because
1000
+ pytest names each `tmp_path` after the test (`test_a_non_string_variant_id_i…`). Nothing
1001
+ guards it today; the fix was to assert the pydantic `loc` line (`"\nvariant_id\n"`).
1002
+ Deferred because telling a vacuous substring from a real one needs to know the test's
1003
+ own name and what the command echoes — a convention for reviewers, not an AST pattern.
1004
+ Caught in: Phase 1 quality review.
1005
+ - [ ] **A path interpolated into Rich markup without `escape()`.** A run directory name is
1006
+ untrusted, and `[/y]` in it raised `rich.errors.MarkupError` (not an `OSError`) inside
1007
+ `evaluate`'s best-effort refresh, after the verdict printed. Nothing guards it; the fix
1008
+ escaped every new console line. Deferred because the rule needs type information (which
1009
+ f-string placeholders are `Path`s) that an AST-only rule does not have, and the existing
1010
+ CLI has many pre-existing unescaped lines a literal rule would flag at once. Caught in:
1011
+ Phase 5 quality review.