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.
- coder_eval-0.12.4/.claude/harness-candidates.md +1011 -0
- coder_eval-0.12.4/.claude/notes/README.md +86 -0
- coder_eval-0.12.4/.claude/notes/agents.md +744 -0
- coder_eval-0.12.4/.claude/notes/contracts.md +393 -0
- coder_eval-0.12.4/.claude/notes/isolation.md +1038 -0
- coder_eval-0.12.4/.claude/notes/lint-rules.md +964 -0
- coder_eval-0.12.4/.claude/notes/orchestration.md +872 -0
- coder_eval-0.12.4/.claude/notes/permissions.md +164 -0
- coder_eval-0.12.4/.claude/notes/persistence.md +201 -0
- coder_eval-0.12.4/.claude/notes/reporting.md +586 -0
- coder_eval-0.12.4/.claude/notes/timing.md +423 -0
- coder_eval-0.12.4/.claude/shared/run-layout.md +33 -0
- coder_eval-0.12.4/.github/scripts/harbor_e2e.py +287 -0
- coder_eval-0.12.4/.github/workflows/harbor-e2e.yml +117 -0
- coder_eval-0.12.4/CHANGELOG.md +3991 -0
- coder_eval-0.12.4/CLAUDE.md +325 -0
- coder_eval-0.12.4/Makefile +148 -0
- coder_eval-0.12.4/PKG-INFO +440 -0
- coder_eval-0.12.4/action.yml +268 -0
- coder_eval-0.12.4/docker/Dockerfile.runtime +114 -0
- coder_eval-0.12.4/docs/DOCKER_ISOLATION.md +344 -0
- coder_eval-0.12.4/docs/REPORT_SCHEMA.md +366 -0
- coder_eval-0.12.4/docs/USER_GUIDE.md +460 -0
- coder_eval-0.12.4/plugins/coder-eval/.claude-plugin/plugin.json +23 -0
- coder_eval-0.12.4/plugins/coder-eval/reference/run-layout.md +32 -0
- coder_eval-0.12.4/pyproject.toml +489 -0
- coder_eval-0.12.4/src/coder_eval/__init__.py +3 -0
- coder_eval-0.12.4/src/coder_eval/cli/__init__.py +92 -0
- coder_eval-0.12.4/src/coder_eval/cli/evaluate_command.py +672 -0
- coder_eval-0.12.4/src/coder_eval/cli/execute_command.py +280 -0
- coder_eval-0.12.4/src/coder_eval/cli/export_command.py +116 -0
- coder_eval-0.12.4/src/coder_eval/cli/report_command.py +189 -0
- coder_eval-0.12.4/src/coder_eval/cli/run_command.py +1189 -0
- coder_eval-0.12.4/src/coder_eval/cli/run_task_internal_command.py +301 -0
- coder_eval-0.12.4/src/coder_eval/config.py +218 -0
- coder_eval-0.12.4/src/coder_eval/criteria/base.py +458 -0
- coder_eval-0.12.4/src/coder_eval/criteria/cli_called.py +193 -0
- coder_eval-0.12.4/src/coder_eval/harbor/agent.py +135 -0
- coder_eval-0.12.4/src/coder_eval/harbor/atif_emit.py +416 -0
- coder_eval-0.12.4/src/coder_eval/harbor/experiment_packager.py +205 -0
- coder_eval-0.12.4/src/coder_eval/harbor/packager.py +708 -0
- coder_eval-0.12.4/src/coder_eval/harbor/portability.py +130 -0
- coder_eval-0.12.4/src/coder_eval/isolation/docker_runner.py +1436 -0
- coder_eval-0.12.4/src/coder_eval/logging_config.py +396 -0
- coder_eval-0.12.4/src/coder_eval/models/__init__.py +425 -0
- coder_eval-0.12.4/src/coder_eval/models/container_context.py +65 -0
- coder_eval-0.12.4/src/coder_eval/models/container_paths.py +106 -0
- coder_eval-0.12.4/src/coder_eval/models/criteria.py +1391 -0
- coder_eval-0.12.4/src/coder_eval/orchestration/batch.py +835 -0
- coder_eval-0.12.4/src/coder_eval/orchestration/config.py +200 -0
- coder_eval-0.12.4/src/coder_eval/orchestration/early_stop.py +553 -0
- coder_eval-0.12.4/src/coder_eval/orchestration/experiment.py +962 -0
- coder_eval-0.12.4/src/coder_eval/orchestration/regrade.py +1019 -0
- coder_eval-0.12.4/src/coder_eval/orchestration/run_summary_rebuild.py +136 -0
- coder_eval-0.12.4/src/coder_eval/orchestrator.py +3090 -0
- coder_eval-0.12.4/src/coder_eval/path_utils.py +288 -0
- coder_eval-0.12.4/src/coder_eval/reports/helpers.py +242 -0
- coder_eval-0.12.4/src/coder_eval/sandbox.py +1582 -0
- coder_eval-0.12.4/src/coder_eval/timing.py +315 -0
- coder_eval-0.12.4/tests/_bracket_clock.py +77 -0
- coder_eval-0.12.4/tests/_container_contract.py +25 -0
- coder_eval-0.12.4/tests/_fixtures/golden_streams/_scrub.py +249 -0
- coder_eval-0.12.4/tests/_fixtures/golden_streams/codex_fixtures.py +400 -0
- coder_eval-0.12.4/tests/_fixtures/golden_streams/opencode_fixtures.py +367 -0
- coder_eval-0.12.4/tests/_fixtures/golden_streams/pi_fixtures.py +333 -0
- coder_eval-0.12.4/tests/_fixtures/harbor_export_golden/expected/task.toml +75 -0
- coder_eval-0.12.4/tests/_fixtures/harbor_export_golden/expected/tests/test.sh +37 -0
- coder_eval-0.12.4/tests/_fixtures/harbor_export_golden/source_task/environment/Dockerfile +2 -0
- coder_eval-0.12.4/tests/harbor_e2e/fixtures/llm_judge.yaml +44 -0
- coder_eval-0.12.4/tests/harbor_e2e/fixtures/trajectory_criteria.yaml +43 -0
- coder_eval-0.12.4/tests/lint/action_docs.py +287 -0
- coder_eval-0.12.4/tests/lint/agent_roster_parity.py +111 -0
- coder_eval-0.12.4/tests/lint/dead_config_fields.py +71 -0
- coder_eval-0.12.4/tests/lint/doc_env_parity.py +120 -0
- coder_eval-0.12.4/tests/lint/doc_examples.py +206 -0
- coder_eval-0.12.4/tests/lint/doc_indexes.py +263 -0
- coder_eval-0.12.4/tests/lint/doc_schema_parity.py +76 -0
- coder_eval-0.12.4/tests/lint/live_verdict_contract.py +488 -0
- coder_eval-0.12.4/tests/lint/plugin_manifest_parity.py +89 -0
- coder_eval-0.12.4/tests/lint/plugin_reference.py +233 -0
- coder_eval-0.12.4/tests/lint/pricing_mirror.py +141 -0
- coder_eval-0.12.4/tests/lint/prose_budget.py +617 -0
- coder_eval-0.12.4/tests/lint/rules/_layers.py +115 -0
- coder_eval-0.12.4/tests/lint/rules/_model_ctor.py +109 -0
- coder_eval-0.12.4/tests/lint/rules/ce014_merge_strategy_declared.py +109 -0
- coder_eval-0.12.4/tests/lint/rules/ce019_telemetry_non_fatal.py +82 -0
- coder_eval-0.12.4/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +102 -0
- coder_eval-0.12.4/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +89 -0
- coder_eval-0.12.4/tests/lint/rules/ce022_dialog_loop_statement_cap.py +57 -0
- coder_eval-0.12.4/tests/lint/rules/ce024_discriminated_unions.py +129 -0
- coder_eval-0.12.4/tests/lint/rules/ce032_criteria_path_seam.py +42 -0
- coder_eval-0.12.4/tests/lint/rules/ce037_no_dead_private_helper.py +106 -0
- coder_eval-0.12.4/tests/lint/rules/ce038_acquire_inside_try.py +79 -0
- coder_eval-0.12.4/tests/lint/rules/ce039_config_error_escalates.py +72 -0
- coder_eval-0.12.4/tests/lint/rules/ce043_no_command_output_truncation.py +69 -0
- coder_eval-0.12.4/tests/lint/rules/ce046_env_info_spreads_super.py +72 -0
- coder_eval-0.12.4/tests/lint/rules/ce048_no_in_process_typer_command_call.py +104 -0
- coder_eval-0.12.4/tests/lint/rules/ce049_no_score_or_zero.py +60 -0
- coder_eval-0.12.4/tests/lint/rules/ce050_no_union_getattr_probe.py +114 -0
- coder_eval-0.12.4/tests/lint/rules/ce051_no_driver_override.py +86 -0
- coder_eval-0.12.4/tests/lint/rules/ce052_process_lethal_must_be_container_gated.py +75 -0
- coder_eval-0.12.4/tests/lint/rules/ce053_run_record_filename_literal.py +87 -0
- coder_eval-0.12.4/tests/lint/rules/ce054_env_info_key_round_trip.py +123 -0
- coder_eval-0.12.4/tests/lint/rules/ce056_no_container_env_literal.py +66 -0
- coder_eval-0.12.4/tests/lint/rules/ce057_sidecar_shim_stdlib_only.py +72 -0
- coder_eval-0.12.4/tests/lint/rules/ce058_no_timing_literal.py +210 -0
- coder_eval-0.12.4/tests/lint/rules/ce059_generation_window_is_two_reads.py +59 -0
- coder_eval-0.12.4/tests/lint/rules/ce060_message_id_declared.py +67 -0
- coder_eval-0.12.4/tests/lint/rules/ce061_window_via_close_window.py +106 -0
- coder_eval-0.12.4/tests/lint/rules/ce063_no_busy_ms_in_agents.py +76 -0
- coder_eval-0.12.4/tests/lint/rules/ce064_turn_bracket_on_the_clock.py +73 -0
- coder_eval-0.12.4/tests/lint/rules/ce066_no_report_imports_in_core.py +89 -0
- coder_eval-0.12.4/tests/lint/rules/no_agent_timing_access.py +42 -0
- coder_eval-0.12.4/tests/lint/rules/no_cli_imports_in_core.py +51 -0
- coder_eval-0.12.4/tests/lint/rules/no_top_level_run_limits_access.py +121 -0
- coder_eval-0.12.4/tests/lint/rules/no_transcript_regex_in_eval.py +74 -0
- coder_eval-0.12.4/tests/lint/rules/yaml_models_forbid_extras.py +108 -0
- coder_eval-0.12.4/tests/lint/runner.py +180 -0
- coder_eval-0.12.4/tests/lint/workflow_outputs.py +251 -0
- coder_eval-0.12.4/tests/test_action_inputs.py +478 -0
- coder_eval-0.12.4/tests/test_action_version_pin.py +83 -0
- coder_eval-0.12.4/tests/test_agent.py +1972 -0
- coder_eval-0.12.4/tests/test_agent_config_no_timing_fields.py +50 -0
- coder_eval-0.12.4/tests/test_agent_config_sdk_decoupling.py +130 -0
- coder_eval-0.12.4/tests/test_agent_golden_master.py +488 -0
- coder_eval-0.12.4/tests/test_agent_telemetry.py +1563 -0
- coder_eval-0.12.4/tests/test_antigravity_agent.py +2197 -0
- coder_eval-0.12.4/tests/test_atif_emit.py +417 -0
- coder_eval-0.12.4/tests/test_cleanup_preservation_guard.py +263 -0
- coder_eval-0.12.4/tests/test_cli_called_criterion.py +1147 -0
- coder_eval-0.12.4/tests/test_cli_telemetry.py +160 -0
- coder_eval-0.12.4/tests/test_codex_agent.py +2709 -0
- coder_eval-0.12.4/tests/test_codex_agent_unit.py +274 -0
- coder_eval-0.12.4/tests/test_command_executed.py +1103 -0
- coder_eval-0.12.4/tests/test_command_statistics.py +83 -0
- coder_eval-0.12.4/tests/test_container_context.py +333 -0
- coder_eval-0.12.4/tests/test_custom_lint.py +5225 -0
- coder_eval-0.12.4/tests/test_detached_grading_boundaries.py +1027 -0
- coder_eval-0.12.4/tests/test_detached_grading_guards.py +471 -0
- coder_eval-0.12.4/tests/test_docker_build_failure.py +107 -0
- coder_eval-0.12.4/tests/test_docker_runner_container_death.py +283 -0
- coder_eval-0.12.4/tests/test_docker_runner_mounts.py +1176 -0
- coder_eval-0.12.4/tests/test_early_stop.py +3183 -0
- coder_eval-0.12.4/tests/test_error_handling.py +853 -0
- coder_eval-0.12.4/tests/test_evaluate_command.py +419 -0
- coder_eval-0.12.4/tests/test_event_collector.py +1316 -0
- coder_eval-0.12.4/tests/test_execute_command.py +374 -0
- coder_eval-0.12.4/tests/test_execute_evaluate_loop.py +763 -0
- coder_eval-0.12.4/tests/test_experiment_reports.py +1809 -0
- coder_eval-0.12.4/tests/test_experiment_resolver.py +1134 -0
- coder_eval-0.12.4/tests/test_experiment_runner.py +830 -0
- coder_eval-0.12.4/tests/test_harbor_agent.py +186 -0
- coder_eval-0.12.4/tests/test_harbor_e2e_fixtures.py +49 -0
- coder_eval-0.12.4/tests/test_harbor_experiment_packager.py +301 -0
- coder_eval-0.12.4/tests/test_harbor_export_golden.py +105 -0
- coder_eval-0.12.4/tests/test_harbor_packager.py +752 -0
- coder_eval-0.12.4/tests/test_harbor_portability.py +140 -0
- coder_eval-0.12.4/tests/test_image_from_dockerfiles.py +516 -0
- coder_eval-0.12.4/tests/test_image_skew_refusal.py +180 -0
- coder_eval-0.12.4/tests/test_judge_anthropic.py +139 -0
- coder_eval-0.12.4/tests/test_judge_context_builder.py +851 -0
- coder_eval-0.12.4/tests/test_judge_models.py +95 -0
- coder_eval-0.12.4/tests/test_judge_persistence.py +603 -0
- coder_eval-0.12.4/tests/test_litellm_route.py +745 -0
- coder_eval-0.12.4/tests/test_llm_judge_criterion.py +1249 -0
- coder_eval-0.12.4/tests/test_models.py +692 -0
- coder_eval-0.12.4/tests/test_new_criteria.py +202 -0
- coder_eval-0.12.4/tests/test_opencode_agent.py +2219 -0
- coder_eval-0.12.4/tests/test_orchestrator.py +2500 -0
- coder_eval-0.12.4/tests/test_parallel.py +463 -0
- coder_eval-0.12.4/tests/test_path_utils.py +305 -0
- coder_eval-0.12.4/tests/test_pi_agent.py +1585 -0
- coder_eval-0.12.4/tests/test_pr_review_workflow.py +163 -0
- coder_eval-0.12.4/tests/test_preservation_mode.py +197 -0
- coder_eval-0.12.4/tests/test_prose_budget.py +615 -0
- coder_eval-0.12.4/tests/test_prose_budget_commands.py +35 -0
- coder_eval-0.12.4/tests/test_reference_permissions.py +1136 -0
- coder_eval-0.12.4/tests/test_regrade.py +1242 -0
- coder_eval-0.12.4/tests/test_reports_junit.py +904 -0
- coder_eval-0.12.4/tests/test_run_command_junit.py +77 -0
- coder_eval-0.12.4/tests/test_run_helpers.py +79 -0
- coder_eval-0.12.4/tests/test_run_limits_resolver.py +338 -0
- coder_eval-0.12.4/tests/test_run_metrics.py +251 -0
- coder_eval-0.12.4/tests/test_run_summary_rebuild.py +505 -0
- coder_eval-0.12.4/tests/test_sandbox.py +1363 -0
- coder_eval-0.12.4/tests/test_sandbox_adopt.py +240 -0
- coder_eval-0.12.4/tests/test_sandbox_record_cli.py +1180 -0
- coder_eval-0.12.4/tests/test_sandbox_templates.py +773 -0
- coder_eval-0.12.4/tests/test_sandbox_venv_live.py +100 -0
- coder_eval-0.12.4/tests/test_seed_from_prior_result.py +333 -0
- coder_eval-0.12.4/tests/test_streaming_events.py +193 -0
- coder_eval-0.12.4/tests/test_sub_agent_runner.py +700 -0
- coder_eval-0.12.4/tests/test_suite_rollup.py +826 -0
- coder_eval-0.12.4/tests/test_tags.py +460 -0
- coder_eval-0.12.4/tests/test_task_definition_unknown_fields.py +66 -0
- coder_eval-0.12.4/tests/test_teardown_interrupt.py +90 -0
- coder_eval-0.12.4/tests/test_telemetry.py +610 -0
- coder_eval-0.12.4/tests/test_timeout_exceptions.py +101 -0
- coder_eval-0.12.4/tests/test_timing_close_window.py +592 -0
- coder_eval-0.12.4/tests/test_timing_identity_contract.py +637 -0
- coder_eval-0.12.4/tests/test_ungraded_reporting.py +290 -0
- coder_eval-0.12.4/tests/test_verify_published_workflow.py +471 -0
- coder_eval-0.12.4/uv.lock +3373 -0
- coder_eval-0.12.2/.claude/harness-candidates.md +0 -964
- coder_eval-0.12.2/.claude/notes/README.md +0 -66
- coder_eval-0.12.2/.claude/notes/agents.md +0 -715
- coder_eval-0.12.2/.claude/notes/contracts.md +0 -376
- coder_eval-0.12.2/.claude/notes/isolation.md +0 -915
- coder_eval-0.12.2/.claude/notes/orchestration.md +0 -825
- coder_eval-0.12.2/.claude/notes/permissions.md +0 -150
- coder_eval-0.12.2/.claude/notes/persistence.md +0 -113
- coder_eval-0.12.2/.claude/notes/reporting.md +0 -502
- coder_eval-0.12.2/.claude/notes/timing.md +0 -310
- coder_eval-0.12.2/.claude/shared/run-layout.md +0 -33
- coder_eval-0.12.2/.github/scripts/harbor_e2e.py +0 -163
- coder_eval-0.12.2/.github/workflows/harbor-e2e.yml +0 -91
- coder_eval-0.12.2/CHANGELOG.md +0 -3774
- coder_eval-0.12.2/CLAUDE.md +0 -320
- coder_eval-0.12.2/Makefile +0 -148
- coder_eval-0.12.2/PKG-INFO +0 -440
- coder_eval-0.12.2/action.yml +0 -268
- coder_eval-0.12.2/docker/Dockerfile.runtime +0 -114
- coder_eval-0.12.2/docs/DOCKER_ISOLATION.md +0 -342
- coder_eval-0.12.2/docs/REPORT_SCHEMA.md +0 -366
- coder_eval-0.12.2/docs/USER_GUIDE.md +0 -455
- coder_eval-0.12.2/plugins/coder-eval/.claude-plugin/plugin.json +0 -23
- coder_eval-0.12.2/plugins/coder-eval/reference/run-layout.md +0 -32
- coder_eval-0.12.2/pyproject.toml +0 -490
- coder_eval-0.12.2/src/coder_eval/__init__.py +0 -3
- coder_eval-0.12.2/src/coder_eval/cli/__init__.py +0 -95
- coder_eval-0.12.2/src/coder_eval/cli/aggregate_command.py +0 -153
- coder_eval-0.12.2/src/coder_eval/cli/evaluate_command.py +0 -639
- coder_eval-0.12.2/src/coder_eval/cli/execute_command.py +0 -253
- coder_eval-0.12.2/src/coder_eval/cli/export_command.py +0 -126
- coder_eval-0.12.2/src/coder_eval/cli/report_command.py +0 -139
- coder_eval-0.12.2/src/coder_eval/cli/run_command.py +0 -1105
- coder_eval-0.12.2/src/coder_eval/cli/run_task_internal_command.py +0 -343
- coder_eval-0.12.2/src/coder_eval/config.py +0 -217
- coder_eval-0.12.2/src/coder_eval/criteria/base.py +0 -464
- coder_eval-0.12.2/src/coder_eval/criteria/cli_called.py +0 -194
- coder_eval-0.12.2/src/coder_eval/harbor/agent.py +0 -126
- coder_eval-0.12.2/src/coder_eval/harbor/atif_emit.py +0 -412
- coder_eval-0.12.2/src/coder_eval/harbor/experiment_packager.py +0 -208
- coder_eval-0.12.2/src/coder_eval/harbor/packager.py +0 -731
- coder_eval-0.12.2/src/coder_eval/harbor/portability.py +0 -134
- coder_eval-0.12.2/src/coder_eval/isolation/docker_runner.py +0 -1523
- coder_eval-0.12.2/src/coder_eval/logging_config.py +0 -383
- coder_eval-0.12.2/src/coder_eval/models/__init__.py +0 -421
- coder_eval-0.12.2/src/coder_eval/models/container_paths.py +0 -105
- coder_eval-0.12.2/src/coder_eval/models/criteria.py +0 -1393
- coder_eval-0.12.2/src/coder_eval/orchestration/batch.py +0 -785
- coder_eval-0.12.2/src/coder_eval/orchestration/config.py +0 -125
- coder_eval-0.12.2/src/coder_eval/orchestration/early_stop.py +0 -555
- coder_eval-0.12.2/src/coder_eval/orchestration/experiment.py +0 -961
- coder_eval-0.12.2/src/coder_eval/orchestration/regrade.py +0 -997
- coder_eval-0.12.2/src/coder_eval/orchestrator.py +0 -3063
- coder_eval-0.12.2/src/coder_eval/path_utils.py +0 -221
- coder_eval-0.12.2/src/coder_eval/reports/helpers.py +0 -251
- coder_eval-0.12.2/src/coder_eval/sandbox.py +0 -1544
- coder_eval-0.12.2/src/coder_eval/timing.py +0 -316
- coder_eval-0.12.2/tests/_bracket_clock.py +0 -97
- coder_eval-0.12.2/tests/_fixtures/golden_streams/_scrub.py +0 -319
- coder_eval-0.12.2/tests/_fixtures/golden_streams/codex_fixtures.py +0 -402
- coder_eval-0.12.2/tests/_fixtures/golden_streams/opencode_fixtures.py +0 -375
- coder_eval-0.12.2/tests/_fixtures/golden_streams/pi_fixtures.py +0 -345
- coder_eval-0.12.2/tests/_fixtures/harbor_export_golden/expected/environment/Dockerfile +0 -4
- coder_eval-0.12.2/tests/_fixtures/harbor_export_golden/expected/task.toml +0 -73
- coder_eval-0.12.2/tests/_fixtures/harbor_export_golden/expected/tests/test.sh +0 -17
- coder_eval-0.12.2/tests/harbor_e2e/fixtures/llm_judge.yaml +0 -44
- coder_eval-0.12.2/tests/lint/action_docs.py +0 -302
- coder_eval-0.12.2/tests/lint/agent_roster_parity.py +0 -124
- coder_eval-0.12.2/tests/lint/dead_config_fields.py +0 -83
- coder_eval-0.12.2/tests/lint/doc_env_parity.py +0 -148
- coder_eval-0.12.2/tests/lint/doc_examples.py +0 -218
- coder_eval-0.12.2/tests/lint/doc_indexes.py +0 -267
- coder_eval-0.12.2/tests/lint/doc_schema_parity.py +0 -98
- coder_eval-0.12.2/tests/lint/live_verdict_contract.py +0 -555
- coder_eval-0.12.2/tests/lint/plugin_manifest_parity.py +0 -101
- coder_eval-0.12.2/tests/lint/plugin_reference.py +0 -254
- coder_eval-0.12.2/tests/lint/pricing_mirror.py +0 -165
- coder_eval-0.12.2/tests/lint/prose_budget.py +0 -523
- coder_eval-0.12.2/tests/lint/rules/_layers.py +0 -142
- coder_eval-0.12.2/tests/lint/rules/_model_ctor.py +0 -116
- coder_eval-0.12.2/tests/lint/rules/ce014_merge_strategy_declared.py +0 -120
- coder_eval-0.12.2/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -86
- coder_eval-0.12.2/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -110
- coder_eval-0.12.2/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -99
- coder_eval-0.12.2/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -63
- coder_eval-0.12.2/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -52
- coder_eval-0.12.2/tests/lint/rules/ce024_discriminated_unions.py +0 -137
- coder_eval-0.12.2/tests/lint/rules/ce032_criteria_path_seam.py +0 -50
- coder_eval-0.12.2/tests/lint/rules/ce037_no_dead_private_helper.py +0 -115
- coder_eval-0.12.2/tests/lint/rules/ce038_acquire_inside_try.py +0 -91
- coder_eval-0.12.2/tests/lint/rules/ce039_config_error_escalates.py +0 -81
- coder_eval-0.12.2/tests/lint/rules/ce043_no_command_output_truncation.py +0 -75
- coder_eval-0.12.2/tests/lint/rules/ce046_env_info_spreads_super.py +0 -83
- coder_eval-0.12.2/tests/lint/rules/ce048_no_in_process_typer_command_call.py +0 -106
- coder_eval-0.12.2/tests/lint/rules/ce049_no_score_or_zero.py +0 -70
- coder_eval-0.12.2/tests/lint/rules/ce050_no_union_getattr_probe.py +0 -132
- coder_eval-0.12.2/tests/lint/rules/ce051_no_driver_override.py +0 -94
- coder_eval-0.12.2/tests/lint/rules/ce052_process_lethal_must_be_container_gated.py +0 -98
- coder_eval-0.12.2/tests/lint/rules/ce053_run_record_filename_literal.py +0 -96
- coder_eval-0.12.2/tests/lint/rules/ce054_env_info_key_round_trip.py +0 -126
- coder_eval-0.12.2/tests/lint/rules/ce056_no_container_env_literal.py +0 -83
- coder_eval-0.12.2/tests/lint/rules/ce057_sidecar_shim_stdlib_only.py +0 -82
- coder_eval-0.12.2/tests/lint/rules/ce058_no_timing_literal.py +0 -277
- coder_eval-0.12.2/tests/lint/rules/ce059_generation_window_is_two_reads.py +0 -79
- coder_eval-0.12.2/tests/lint/rules/ce060_message_id_declared.py +0 -112
- coder_eval-0.12.2/tests/lint/rules/ce061_window_via_close_window.py +0 -141
- coder_eval-0.12.2/tests/lint/rules/ce063_no_busy_ms_in_agents.py +0 -105
- coder_eval-0.12.2/tests/lint/rules/ce064_turn_bracket_on_the_clock.py +0 -116
- coder_eval-0.12.2/tests/lint/rules/ce066_no_report_imports_in_core.py +0 -106
- coder_eval-0.12.2/tests/lint/rules/no_agent_timing_access.py +0 -43
- coder_eval-0.12.2/tests/lint/rules/no_cli_imports_in_core.py +0 -63
- coder_eval-0.12.2/tests/lint/rules/no_top_level_run_limits_access.py +0 -122
- coder_eval-0.12.2/tests/lint/rules/no_transcript_regex_in_eval.py +0 -82
- coder_eval-0.12.2/tests/lint/rules/yaml_models_forbid_extras.py +0 -147
- coder_eval-0.12.2/tests/lint/runner.py +0 -190
- coder_eval-0.12.2/tests/lint/workflow_outputs.py +0 -269
- coder_eval-0.12.2/tests/test_action_inputs.py +0 -499
- coder_eval-0.12.2/tests/test_action_version_pin.py +0 -98
- coder_eval-0.12.2/tests/test_agent.py +0 -1992
- coder_eval-0.12.2/tests/test_agent_config_no_timing_fields.py +0 -49
- coder_eval-0.12.2/tests/test_agent_config_sdk_decoupling.py +0 -130
- coder_eval-0.12.2/tests/test_agent_golden_master.py +0 -544
- coder_eval-0.12.2/tests/test_agent_telemetry.py +0 -1578
- coder_eval-0.12.2/tests/test_aggregate.py +0 -347
- coder_eval-0.12.2/tests/test_antigravity_agent.py +0 -2239
- coder_eval-0.12.2/tests/test_atif_emit.py +0 -365
- coder_eval-0.12.2/tests/test_cleanup_preservation_guard.py +0 -215
- coder_eval-0.12.2/tests/test_cli_called_criterion.py +0 -1145
- coder_eval-0.12.2/tests/test_cli_telemetry.py +0 -160
- coder_eval-0.12.2/tests/test_codex_agent.py +0 -2715
- coder_eval-0.12.2/tests/test_codex_agent_unit.py +0 -280
- coder_eval-0.12.2/tests/test_command_executed.py +0 -1106
- coder_eval-0.12.2/tests/test_command_statistics.py +0 -83
- coder_eval-0.12.2/tests/test_custom_lint.py +0 -5358
- coder_eval-0.12.2/tests/test_detached_grading_boundaries.py +0 -951
- coder_eval-0.12.2/tests/test_detached_grading_guards.py +0 -479
- coder_eval-0.12.2/tests/test_docker_build_failure.py +0 -107
- coder_eval-0.12.2/tests/test_docker_runner_container_death.py +0 -273
- coder_eval-0.12.2/tests/test_docker_runner_mounts.py +0 -1179
- coder_eval-0.12.2/tests/test_early_stop.py +0 -3285
- coder_eval-0.12.2/tests/test_error_handling.py +0 -853
- coder_eval-0.12.2/tests/test_evaluate_command.py +0 -218
- coder_eval-0.12.2/tests/test_event_collector.py +0 -1317
- coder_eval-0.12.2/tests/test_execute_command.py +0 -305
- coder_eval-0.12.2/tests/test_execute_evaluate_loop.py +0 -771
- coder_eval-0.12.2/tests/test_experiment_reports.py +0 -1809
- coder_eval-0.12.2/tests/test_experiment_resolver.py +0 -1134
- coder_eval-0.12.2/tests/test_experiment_runner.py +0 -833
- coder_eval-0.12.2/tests/test_harbor_agent.py +0 -171
- coder_eval-0.12.2/tests/test_harbor_experiment_packager.py +0 -308
- coder_eval-0.12.2/tests/test_harbor_export_golden.py +0 -104
- coder_eval-0.12.2/tests/test_harbor_packager.py +0 -690
- coder_eval-0.12.2/tests/test_harbor_portability.py +0 -135
- coder_eval-0.12.2/tests/test_image_from_dockerfiles.py +0 -540
- coder_eval-0.12.2/tests/test_judge_anthropic.py +0 -139
- coder_eval-0.12.2/tests/test_judge_context_builder.py +0 -855
- coder_eval-0.12.2/tests/test_judge_models.py +0 -96
- coder_eval-0.12.2/tests/test_judge_persistence.py +0 -603
- coder_eval-0.12.2/tests/test_litellm_route.py +0 -746
- coder_eval-0.12.2/tests/test_llm_judge_criterion.py +0 -1249
- coder_eval-0.12.2/tests/test_models.py +0 -689
- coder_eval-0.12.2/tests/test_new_criteria.py +0 -216
- coder_eval-0.12.2/tests/test_opencode_agent.py +0 -2228
- coder_eval-0.12.2/tests/test_orchestrator.py +0 -2501
- coder_eval-0.12.2/tests/test_parallel.py +0 -213
- coder_eval-0.12.2/tests/test_path_utils.py +0 -131
- coder_eval-0.12.2/tests/test_pi_agent.py +0 -1600
- coder_eval-0.12.2/tests/test_pr_review_workflow.py +0 -172
- coder_eval-0.12.2/tests/test_preservation_mode.py +0 -194
- coder_eval-0.12.2/tests/test_prose_budget.py +0 -406
- coder_eval-0.12.2/tests/test_reference_permissions.py +0 -1147
- coder_eval-0.12.2/tests/test_regrade.py +0 -1274
- coder_eval-0.12.2/tests/test_reports_junit.py +0 -904
- coder_eval-0.12.2/tests/test_run_command_junit.py +0 -77
- coder_eval-0.12.2/tests/test_run_helpers.py +0 -79
- coder_eval-0.12.2/tests/test_run_limits_resolver.py +0 -337
- coder_eval-0.12.2/tests/test_run_metrics.py +0 -255
- coder_eval-0.12.2/tests/test_sandbox.py +0 -1367
- coder_eval-0.12.2/tests/test_sandbox_adopt.py +0 -130
- coder_eval-0.12.2/tests/test_sandbox_record_cli.py +0 -1182
- coder_eval-0.12.2/tests/test_sandbox_templates.py +0 -776
- coder_eval-0.12.2/tests/test_sandbox_venv_live.py +0 -110
- coder_eval-0.12.2/tests/test_seed_from_prior_result.py +0 -334
- coder_eval-0.12.2/tests/test_streaming_events.py +0 -197
- coder_eval-0.12.2/tests/test_sub_agent_runner.py +0 -701
- coder_eval-0.12.2/tests/test_suite_rollup.py +0 -825
- coder_eval-0.12.2/tests/test_tags.py +0 -465
- coder_eval-0.12.2/tests/test_task_definition_unknown_fields.py +0 -66
- coder_eval-0.12.2/tests/test_teardown_interrupt.py +0 -90
- coder_eval-0.12.2/tests/test_telemetry.py +0 -610
- coder_eval-0.12.2/tests/test_timeout_exceptions.py +0 -101
- coder_eval-0.12.2/tests/test_timing_close_window.py +0 -599
- coder_eval-0.12.2/tests/test_timing_identity_contract.py +0 -694
- coder_eval-0.12.2/tests/test_ungraded_reporting.py +0 -288
- coder_eval-0.12.2/tests/test_verify_published_workflow.py +0 -478
- coder_eval-0.12.2/uv.lock +0 -3373
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-code-review-full.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-code-review-wf.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-code-review.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-create-plan.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-implement-plan.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/commands/coder-eval-review.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/shared/axes.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/shared/multi-model-review.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/shared/review-rubric.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/workflows/cr-axis.js +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude/workflows/cr-parent.js +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.claude-plugin/marketplace.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.env.example +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/CODEOWNERS +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/actionlint.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/code_review.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/dependabot.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/pages-stub/index.html +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/scripts/release_notes.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/claude-pr-review.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/codeql.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/conventional-commits.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/docker-publish.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/docs.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/pr-checks.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/publish-testpypi.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/release.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.github/workflows/verify-published-action.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.gitignore +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.pre-commit-config.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/.python-version +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/ADOPTERS.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/CODE_OF_CONDUCT.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/CONTRIBUTING.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/LICENSE +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/NOTICE +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/SECURITY.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/comparison.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docker/Dockerfile +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docker/coder_eval_entrypoint.sh +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docker/coder_eval_runtime_entrypoint.sh +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/AB_EXPERIMENTS.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/CI_GATE.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/DATASETS.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/DIALOG_MODE.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/EXTENDING.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/PLUGIN.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/TASK_DEFINITION_GUIDE.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/ANTIGRAVITY.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/CLAUDE_CODE.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/CODEX.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/HARNESS_PARITY.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/OPENCODE.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/agents/PI.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/assets/hero.gif +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/comparison.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/index.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/llms.txt +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/01-first-evaluation.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/02-ci-pipeline.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/03-evalboard-local.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/04-writing-a-task.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/05-comparing-models.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/06-use-docker-isolation.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/07-plugin-in-claude-code.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/docs/tutorials/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/.gitignore +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/__tests__/harness-badge.test.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/__tests__/harness-selector.test.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/__tests__/skeleton.test.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/col-help.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/collapsible-rail.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/harness-badge.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/harness-selector.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/scroll-table.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/search-box.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/skeleton.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/unit-toggle.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_components/version-list.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_lib/__tests__/source-param.test.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_lib/source-param.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/__tests__/efficiency-charts.test.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/__tests__/harness-legend.test.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/__tests__/harness-series.test.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/daily-chart.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/efficiency-charts.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/harness-legend.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/harness-series.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/tag-rail.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/wall-clock-chart.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/_overview/window-summary.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/api/download/route.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/api/file/route.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/api/refresh/route.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/error.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/globals.css +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/icon.png +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/layout.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/loading.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/page.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/path-to-ga/__tests__/task-table.test.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/path-to-ga/page.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/path-to-ga/task-table.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/scribe/page.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/scribe/run-table.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/trends/actions.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/trends/page.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/trends/trends-view.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/watchlist/page.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/next-env.d.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/next.config.mjs +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/package.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/pnpm-lock.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/postcss.config.mjs +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/harness/antigravity.png +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/harness/claude-code.png +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/harness/codex.png +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/harness/pi.png +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/public/uipath.png +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/tailwind.config.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/tsconfig.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/vitest.config.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/evalboard/vitest.setup.ts +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/default.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/early-stop-ab.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/model-comparison.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/permissions-smoke.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/plugin-comparison.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/prompt-mutations-example.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/experiments/smoke_variants.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/litellm/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/litellm/cost_logger.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/litellm/litellm-config.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/litellm/start-litellm.sh +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/mkdocs.yml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/osv-scanner.toml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/cli-setup.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/criteria.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/repo-layout.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/task-rubric.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/templates/activation-rows.jsonl +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/reference/templates/activation.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/analyze/SKILL.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/check-skill/SKILL.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/ci/SKILL.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/init/SKILL.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/lint-tasks/SKILL.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/plugins/coder-eval/skills/task/SKILL.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/check_commit_msg.sh +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/antigravity.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/claude-code.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/codex.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/opencode.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/corpus/pi.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/scripts/timing/decompose_run.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/.gitattributes +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/_logging.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/_skills.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/antigravity_agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/claude_code_agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/codex_agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/noop_agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/opencode_agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/pi_agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/registry.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/agents/watchdog.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/analysis.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/argv_match.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/console.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/evaluate_target.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/harbor_command.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/plan_command.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/run_helpers.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/cli/utils.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/agent_judge.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/classification_match.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/command_executed.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/commands_efficiency.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/file_check.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/file_contains.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/file_exists.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/file_matches_regex.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/json_check.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/llm_judge.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/reference_comparison.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/run_command.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/skill_triggered.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/criteria/uipath_eval.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/durations.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/budget.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/categories.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/categorization.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/checker_misuse.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/executor.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/judge.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/reference.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/retry.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/errors/timeout.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/checker.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_context.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_litellm.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_models.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_persistence.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/judge_usage.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/sub_agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/summaries.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/evaluation/verdict_tool.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/formatting.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/fs_permissions.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/agent_paths.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/atif_hydrate.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/atif_models.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/harbor/reward.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/invocation_log.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/isolation/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/litellm_cost.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/agent_config.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/cli_match.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/enums.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/experiment.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/judge.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/judge_defaults.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/limits.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/merge_strategy.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/mutations.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/results.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/routing.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/sandbox.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/tasks.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/telemetry.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/models/templates.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/config_merge.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/evaluation.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/overrides.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/run_limits.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/orchestration/task_loader.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/plugins.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/pricing.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/py.typed +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/experiment.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/html.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/junit.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/reports/markdown.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/resources/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/resources/tags.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/result_metrics.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/run_record.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/ast_similarity.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/complexity.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/quality.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/signature_similarity.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/similarity.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/scoring/token_similarity.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/simulation/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/simulation/termination.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/simulation/user_simulator.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/stats.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/callbacks.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/collector.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/events.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/renderers.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/streaming/wire.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/telemetry.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/src/coder_eval/utils.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agentless_smoke_test.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/antigravity_hello_world.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/claude_hello_world.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/claude_hello_world_docker.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/claude_subagent_test.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_hello_world.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_parallel_commands.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_skills_test.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_string_utils.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/codex_subagent_test.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/subagent_bash_long_input.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/agents/subagent_merge_sort.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/anti_cheat_reference/anti_cheat_reference.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/anti_cheat_reference/reference/solution.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/byod_smoke_test.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dataset_example.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/datasets/sentiment.jsonl +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/environment/input.txt +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/early_stop_decision_budget_exceeded.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/early_stop_weighted_high_weight_kills_run.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/early_stop_weighted_low_weight_absorbed.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/fibonacci_with_template.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/hello_date.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/inline_starter_example.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/internal/session_resumption.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_smoke.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
- {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
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/opencode_smoke_test.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/pi_smoke_test.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/record_cli_responses.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/run_limits/max_turns_cap.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/run_limits/turn_timeout.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/sentiment_classification.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_agent_judge.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_budget_exceeded.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_llm_judge.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_negative_path.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_task_timeout.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/smoke_variants.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/test_sandbox.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tasks/token_check.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/templates/byod_smoke_test/Dockerfile +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/templates/fibonacci-starter/README.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/templates/fibonacci-starter/src/main.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/templates/fibonacci-starter/tests/test_main.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/antigravity_fixtures.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/antigravity_a_single_text_turn.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/antigravity_b_tool_call_resolved.json +0 -0
- {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
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/antigravity_d_orphaned_tool.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/antigravity_e_multi_generation.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_a_single_text_turn.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_b_tool_call_resolved.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_c_multi_step_tiling.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_d_orphaned_tool.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/opencode_e_error_after_generation.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_a_single_text_turn.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_b_tool_call_resolved.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_c_multi_turn_tiling.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_d_orphaned_tool.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_e_error_after_generation.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/golden_streams/expected/pi_f_duplicate_turn_end.json +0 -0
- {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
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/environment/docker-compose.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/environment/task.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/instruction.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/tests/reference/greeting.txt +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/expected/tests/task.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/source_task/reference/greeting.txt +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/harbor_export_golden/source_task/task.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/live_criteria.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/run_full.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_fixtures/timing_union_cases.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/_path_helpers.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/conftest.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/atif/known_good_trajectory.json +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/mock_agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/pi_happy_stream.jsonl +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/fixtures/text_stub_agent.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/harbor_e2e/fixtures/docker_baseline.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/harbor_e2e/fixtures/template_sources.yaml +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/generated.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/pyright_config.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/__init__.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/base.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/no_silent_except.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/no_submodule_model_imports.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/open_explicit_encoding.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/register_criterion_required.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/lint/violation.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_config_optional_type.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_config_registry_dispatch.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_judge_criterion.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_telemetry_advanced.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agent_timeout.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_agentless.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_atif_hydrate.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_atif_models.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_byoa_plugin.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_byoa_plugin_live.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_byod_feature.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_check_all_async.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_checker_logging.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_classification_match.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_claude_settings_enforcement_live.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_backend_flag.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_empty_glob.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_match_parity.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_sdk_options.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_set_overrides.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cli_type_flag.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_code_review_bugs.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_codex_agent_live.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_codex_token_mapping.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_command_telemetry_result_data.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_commands_efficiency.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_config_lineage.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_config_merge_engine.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_config_precedence.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_continuous_scoring.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_cost_accounting_paths.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_criterion_result_round_trip.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_dataset_expansion.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_debug_logging.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_docker_litellm_env.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_docker_runner_stream_limit.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_docker_wildcard_env.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_docker_workdir_live.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_driver_resolver.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_durations.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_evaluate_format_harbor.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_evaluate_target.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_evaluator.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_execute_format_harbor.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_experiment_cli.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_experiment_loader.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_experiment_models.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_file_check.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_file_contains_scoring.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_formatting.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_git_clone_failure.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_glob_paths_in_file_criteria.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_harbor_reward.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_heartbeat_watchdog.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_ignore_patterns_negation.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_integration.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_json_check.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_judge_bedrock.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_judge_burn_in_live.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_judge_litellm.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_lint_no_top_level_run_limits.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_lint_runner.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_litellm_config.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_litellm_cost.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_litellm_cost_logger.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_litellm_judge_live.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_log_tail_buffer.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_logging.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_logging_isolation.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_merge_characterization.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_merge_strategy_annotations.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_merge_unification.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_mutations.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_node_env_config.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_optional_dependencies.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_orchestrator_error_log_tail.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_orchestrator_telemetry.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_overrides_engine.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pi_agent_config.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pi_smoke_task.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_plan_command.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_plugin_processing.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_plugins.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_post_run.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pre_run.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pricing_mirror.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_pricing_registry.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reference_comparison_scoring.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reference_evaluator.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reference_missing_file.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reference_models.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_registry.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_release_notes.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_replicate_stats.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_report_command.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reports.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reports_html.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_reports_package.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_resolve_task_files.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_result_metrics.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_resume.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_retry_logic_comprehensive.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_route_seam_exhaustiveness.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_routing.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_run_command_stdout.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_run_limits_models.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_run_limits_orchestrator.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_run_record.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_runtime_tool_versions.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sandbox_layer_builder.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sandbox_optional.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sandbox_security.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sandbox_symlink_preservation.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_scorers.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_scoring_quality.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_sdk_option_classification.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_simulation_config.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_simulation_integration.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_simulation_termination.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_simulation_trials.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_skill_triggered.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_stats.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_stats_nonfinite.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_agent_integration.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_batch.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_callbacks.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_cli.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_orchestrator.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_renderers.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_streaming_wire.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_success_criterion_union.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_summaries.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_template_env_expansion.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_threshold_enforcement.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timeout_batch.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timeout_categorization.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timeout_models.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timeout_orchestrator.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_timing_union_parity.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_token_usage.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_uipath_eval.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_user_simulator.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_utils.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_utterance_extraction.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_variant_prompt_file.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_verdict_tool.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_visible_turn_cap.py +0 -0
- {coder_eval-0.12.2 → coder_eval-0.12.4}/tests/test_watchdog.py +0 -0
- {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.
|