coder-eval 0.9.6__tar.gz → 0.10.2__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.9.6 → coder_eval-0.10.2}/.claude/commands/coder-eval-review.md +1 -1
- coder_eval-0.10.2/.claude/harness-candidates.md +457 -0
- coder_eval-0.10.2/.claude/shared/run-layout.md +30 -0
- coder_eval-0.10.2/.claude-plugin/marketplace.json +17 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/workflows/pr-checks.yml +61 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/workflows/publish-testpypi.yml +1 -1
- coder_eval-0.10.2/.github/workflows/release.yml +684 -0
- coder_eval-0.10.2/.github/workflows/verify-published-action.yml +572 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/CHANGELOG.md +431 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/CLAUDE.md +11 -3
- {coder_eval-0.9.6 → coder_eval-0.10.2}/CONTRIBUTING.md +52 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/Makefile +4 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/PKG-INFO +26 -7
- {coder_eval-0.9.6 → coder_eval-0.10.2}/README.md +24 -5
- {coder_eval-0.9.6 → coder_eval-0.10.2}/action.yml +1 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/AB_EXPERIMENTS.md +8 -3
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/CI_GATE.md +26 -3
- coder_eval-0.10.2/docs/PLUGIN.md +205 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/REPORT_SCHEMA.md +32 -2
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/TASK_DEFINITION_GUIDE.md +32 -9
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/USER_GUIDE.md +14 -6
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/agents/ANTIGRAVITY.md +24 -4
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/agents/CLAUDE_CODE.md +47 -5
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/agents/CODEX.md +18 -0
- coder_eval-0.10.2/docs/agents/HARNESS_PARITY.md +115 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/index.md +2 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/llms.txt +3 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/tutorials/02-ci-pipeline.md +1 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/tutorials/04-writing-a-task.md +1 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/tutorials/05-comparing-models.md +1 -1
- coder_eval-0.10.2/docs/tutorials/07-plugin-in-claude-code.md +175 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/tutorials/README.md +1 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/.gitignore +4 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/README.md +48 -4
- coder_eval-0.10.2/evalboard/app/_lib/__tests__/source-param.test.ts +48 -0
- coder_eval-0.10.2/evalboard/app/_lib/source-param.ts +35 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/api/download/route.ts +7 -4
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/api/file/route.ts +6 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/api/refresh/__tests__/route.test.ts +56 -2
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/api/refresh/route.ts +9 -3
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/layout.tsx +21 -23
- coder_eval-0.10.2/evalboard/app/scribe/page.tsx +159 -0
- coder_eval-0.10.2/evalboard/app/scribe/run-table.tsx +139 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/experiments/model-comparison.yaml +2 -2
- {coder_eval-0.9.6 → coder_eval-0.10.2}/mkdocs.yml +5 -0
- coder_eval-0.10.2/plugins/coder-eval/.claude-plugin/plugin.json +10 -0
- coder_eval-0.10.2/plugins/coder-eval/README.md +71 -0
- coder_eval-0.10.2/plugins/coder-eval/reference/cli-setup.md +113 -0
- coder_eval-0.10.2/plugins/coder-eval/reference/criteria.md +289 -0
- coder_eval-0.10.2/plugins/coder-eval/reference/repo-layout.md +76 -0
- {coder_eval-0.9.6/.claude/shared → coder_eval-0.10.2/plugins/coder-eval/reference}/run-layout.md +13 -7
- coder_eval-0.10.2/plugins/coder-eval/reference/task-rubric.md +159 -0
- coder_eval-0.10.2/plugins/coder-eval/reference/templates/activation-rows.jsonl +6 -0
- coder_eval-0.10.2/plugins/coder-eval/reference/templates/activation.yaml +43 -0
- coder_eval-0.10.2/plugins/coder-eval/skills/analyze/SKILL.md +330 -0
- coder_eval-0.10.2/plugins/coder-eval/skills/check-skill/SKILL.md +232 -0
- coder_eval-0.10.2/plugins/coder-eval/skills/ci/SKILL.md +214 -0
- coder_eval-0.10.2/plugins/coder-eval/skills/init/SKILL.md +132 -0
- coder_eval-0.10.2/plugins/coder-eval/skills/lint-tasks/SKILL.md +218 -0
- coder_eval-0.10.2/plugins/coder-eval/skills/task/SKILL.md +243 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/pyproject.toml +1 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/__init__.py +1 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/agent.py +19 -4
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/agents/antigravity_agent.py +336 -77
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/agents/claude_code_agent.py +67 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/agents/codex_agent.py +192 -37
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/plan_command.py +5 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/agent_judge.py +26 -8
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/cli_called.py +14 -9
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/judge_persistence.py +53 -48
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/sub_agent.py +13 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/__init__.py +10 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/agent_config.py +60 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/criteria.py +92 -13
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/limits.py +3 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/results.py +48 -10
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/tasks.py +60 -17
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestration/experiment.py +6 -4
- coder_eval-0.10.2/src/coder_eval/orchestration/run_limits.py +34 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestration/task_loader.py +47 -16
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestrator.py +204 -15
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/reports.py +63 -12
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/reports_html.py +55 -15
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/reports_junit.py +54 -29
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/simulation/user_simulator.py +46 -7
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/streaming/collector.py +18 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/early_stop_decision_budget_exceeded.yaml +5 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/early_stop_weighted_high_weight_kills_run.yaml +6 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/early_stop_weighted_low_weight_absorbed.yaml +8 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +6 -0
- coder_eval-0.10.2/tasks/run_limits/max_turns_cap.yaml +51 -0
- coder_eval-0.10.2/tasks/run_limits/turn_timeout.yaml +29 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/action_docs.py +75 -5
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/doc_examples.py +11 -4
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/doc_indexes.py +4 -20
- coder_eval-0.10.2/tests/lint/generated.py +57 -0
- coder_eval-0.10.2/tests/lint/plugin_reference.py +254 -0
- coder_eval-0.10.2/tests/lint/workflow_outputs.py +269 -0
- coder_eval-0.10.2/tests/test_action_version_pin.py +98 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent.py +175 -3
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent_judge_criterion.py +88 -0
- coder_eval-0.10.2/tests/test_antigravity_agent.py +1565 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_cli_called_criterion.py +208 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_codex_agent.py +174 -2
- coder_eval-0.10.2/tests/test_codex_token_mapping.py +187 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_cost_accounting_paths.py +20 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_criterion_result_round_trip.py +49 -0
- coder_eval-0.10.2/tests/test_custom_lint.py +2966 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_early_stop.py +12 -2
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_judge_persistence.py +39 -3
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_models.py +74 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_orchestrator.py +8 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_plan_command.py +29 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reports.py +109 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reports_html.py +30 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reports_junit.py +42 -1
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_resolve_task_files.py +155 -8
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_run_limits_models.py +35 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_run_limits_orchestrator.py +36 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_sub_agent_runner.py +22 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_timeout_orchestrator.py +197 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_user_simulator.py +13 -0
- coder_eval-0.10.2/tests/test_verify_published_workflow.py +478 -0
- coder_eval-0.10.2/tests/test_visible_turn_cap.py +68 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/uv.lock +4 -4
- coder_eval-0.9.6/.claude/commands/coder-eval-run-analysis.md +0 -178
- coder_eval-0.9.6/.claude/commands/coder-eval-task-create.md +0 -177
- coder_eval-0.9.6/.claude/harness-candidates.md +0 -208
- coder_eval-0.9.6/.github/workflows/release.yml +0 -440
- coder_eval-0.9.6/tests/test_action_version_pin.py +0 -59
- coder_eval-0.9.6/tests/test_antigravity_agent.py +0 -693
- coder_eval-0.9.6/tests/test_codex_token_mapping.py +0 -60
- coder_eval-0.9.6/tests/test_custom_lint.py +0 -1413
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/commands/coder-eval-code-review-full.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/commands/coder-eval-code-review-wf.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/commands/coder-eval-code-review.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/commands/coder-eval-create-plan.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/commands/coder-eval-implement-plan.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/shared/axes.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/shared/multi-model-review.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/shared/review-rubric.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/workflows/cr-axis.js +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.claude/workflows/cr-parent.js +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.env.example +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/CODEOWNERS +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/actionlint.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/code_review.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/dependabot.yml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/pages-stub/index.html +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/scripts/release_notes.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/workflows/claude-pr-review.yml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/workflows/codeql.yml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/workflows/conventional-commits.yml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/workflows/docker-publish.yml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.github/workflows/docs.yml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.gitignore +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.pre-commit-config.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/.python-version +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/ADOPTERS.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/CODE_OF_CONDUCT.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/LICENSE +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/NOTICE +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/SECURITY.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docker/Dockerfile +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docker/Dockerfile.runtime +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docker/coder_eval_entrypoint.sh +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docker/coder_eval_runtime_entrypoint.sh +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/DATASETS.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/DIALOG_MODE.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/DOCKER_ISOLATION.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/EXTENDING.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/assets/hero.gif +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/comparison.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/tutorials/01-first-evaluation.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/tutorials/03-evalboard-local.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/docs/tutorials/06-use-docker-isolation.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/__tests__/harness-badge.test.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/__tests__/harness-selector.test.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/col-help.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/collapsible-rail.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/harness-badge.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/harness-selector.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/scroll-table.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/search-box.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/unit-toggle.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_components/version-list.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_overview/__tests__/harness-legend.test.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_overview/__tests__/harness-series.test.ts +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_overview/daily-chart.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_overview/harness-legend.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_overview/harness-series.ts +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_overview/tag-rail.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/_overview/window-summary.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/error.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/globals.css +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/icon.png +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/page.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/path-to-ga/__tests__/task-table.test.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/path-to-ga/page.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/path-to-ga/task-table.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/trends/actions.ts +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/trends/page.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/trends/trends-view.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/watchlist/page.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/next-env.d.ts +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/next.config.mjs +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/package.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/pnpm-lock.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/postcss.config.mjs +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/public/harness/antigravity.png +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/public/harness/claude-code.png +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/public/harness/codex.png +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/public/uipath.png +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/tailwind.config.ts +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/tsconfig.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/vitest.config.ts +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/evalboard/vitest.setup.ts +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/experiments/default.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/experiments/early-stop-ab.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/experiments/permissions-smoke.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/experiments/plugin-comparison.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/experiments/prompt-mutations-example.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/experiments/smoke_variants.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/litellm/README.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/litellm/cost_logger.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/litellm/litellm-config.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/litellm/start-litellm.sh +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/osv-scanner.toml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/scripts/check_commit_msg.sh +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/.gitattributes +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/agents/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/agents/_logging.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/agents/noop_agent.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/agents/registry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/agents/watchdog.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/analysis.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/aggregate_command.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/console.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/evaluate_command.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/report_command.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/run_command.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/run_helpers.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/run_task_internal_command.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/cli/utils.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/config.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/base.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/classification_match.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/command_executed.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/commands_efficiency.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/file_check.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/file_contains.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/file_exists.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/file_matches_regex.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/json_check.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/llm_judge.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/reference_comparison.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/run_command.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/skill_triggered.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/criteria/uipath_eval.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/agent.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/budget.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/categories.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/categorization.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/checker_misuse.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/executor.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/judge.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/retry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/errors/timeout.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/checker.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/judge_context.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/judge_models.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/judge_usage.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/summaries.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/evaluation/verdict_tool.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/formatting.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/invocation_log.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/isolation/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/isolation/docker_runner.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/litellm_cost.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/logging_config.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/container_paths.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/enums.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/experiment.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/judge.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/judge_defaults.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/merge_strategy.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/mutations.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/routing.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/sandbox.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/telemetry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/models/templates.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestration/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestration/batch.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestration/config.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestration/config_merge.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestration/early_stop.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestration/evaluation.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/orchestration/overrides.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/path_utils.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/plugins.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/pricing.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/py.typed +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/reports_experiment.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/reports_stats.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/resources/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/resources/tags.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/sandbox.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/scoring/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/scoring/ast_similarity.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/scoring/complexity.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/scoring/quality.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/scoring/signature_similarity.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/scoring/similarity.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/scoring/token_similarity.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/simulation/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/simulation/termination.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/streaming/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/streaming/callbacks.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/streaming/events.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/streaming/renderers.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/streaming/wire.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/telemetry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/src/coder_eval/utils.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/README.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agentless_smoke_test.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/antigravity_hello_world.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/claude_hello_world.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/claude_hello_world_docker.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/claude_subagent_test.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/codex_hello_world.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/codex_parallel_commands.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/codex_skills_test.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/codex_string_utils.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/codex_subagent_test.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/subagent_bash_long_input.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/agents/subagent_merge_sort.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/byod_smoke_test.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/dataset_example.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/datasets/sentiment.jsonl +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/dockerfile_build_example/environment/input.txt +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/fibonacci_with_template.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/hello_date.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/inline_starter_example.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/internal/session_resumption.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/mock_path_dirs_smoke.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/README.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/sentiment_classification.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/smoke_agent_judge.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/smoke_budget_exceeded.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/smoke_llm_judge.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/smoke_negative_path.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/smoke_task_timeout.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/smoke_variants.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/test_sandbox.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tasks/token_check.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/templates/byod_smoke_test/Dockerfile +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/templates/fibonacci-starter/README.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/templates/fibonacci-starter/src/main.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/templates/fibonacci-starter/tests/test_main.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/_scrub.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/report_snapshots/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/report_snapshots/run_full.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/_path_helpers.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/conftest.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/fixtures/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/fixtures/mock_agent.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/fixtures/text_stub_agent.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/dead_config_fields.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/doc_env_parity.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/doc_schema_parity.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/__init__.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/base.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/ce032_criteria_path_seam.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/no_agent_timing_access.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/no_silent_except.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/no_submodule_model_imports.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/open_explicit_encoding.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/register_criterion_required.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/runner.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/lint/violation.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent_config_no_timing_fields.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent_config_optional_type.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent_config_registry_dispatch.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent_config_sdk_decoupling.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent_golden_master.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent_telemetry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent_telemetry_advanced.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agent_timeout.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_agentless.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_aggregate.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_byoa_plugin.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_byoa_plugin_live.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_byod_feature.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_check_all_async.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_checker_logging.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_classification_match.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_claude_settings_enforcement_live.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_cleanup_preservation_guard.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_cli_backend_flag.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_cli_empty_glob.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_cli_sdk_options.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_cli_set_overrides.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_cli_telemetry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_cli_type_flag.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_code_review_bugs.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_codex_agent_live.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_codex_agent_unit.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_command_executed.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_command_statistics.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_command_telemetry_result_data.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_commands_efficiency.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_config_lineage.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_config_merge_engine.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_config_precedence.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_continuous_scoring.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_dataset_expansion.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_debug_logging.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_docker_build_failure.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_docker_litellm_env.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_docker_runner_container_death.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_docker_runner_mounts.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_docker_runner_stream_limit.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_docker_wildcard_env.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_docker_workdir_live.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_driver_resolver.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_error_handling.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_evaluate_command.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_evaluator.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_event_collector.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_experiment_cli.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_experiment_loader.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_experiment_models.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_experiment_reports.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_experiment_resolver.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_experiment_runner.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_file_check.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_file_contains_scoring.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_formatting.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_git_clone_failure.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_glob_paths_in_file_criteria.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_heartbeat_watchdog.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_ignore_patterns_negation.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_image_from_dockerfiles.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_integration.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_json_check.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_judge_anthropic.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_judge_bedrock.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_judge_burn_in_live.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_judge_context_builder.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_judge_models.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_lint_no_top_level_run_limits.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_lint_runner.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_litellm_config.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_litellm_cost.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_litellm_cost_logger.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_litellm_route.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_llm_judge_criterion.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_log_tail_buffer.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_logging.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_logging_isolation.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_merge_characterization.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_merge_strategy_annotations.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_merge_unification.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_mutations.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_new_criteria.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_node_env_config.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_optional_dependencies.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_orchestrator_error_log_tail.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_orchestrator_telemetry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_overrides_engine.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_parallel.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_path_utils.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_plugin_processing.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_plugins.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_post_run.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_pr_review_workflow.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_pre_run.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_preservation_mode.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_pricing_registry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reference_comparison_scoring.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reference_evaluator.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reference_missing_file.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reference_models.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reference_orchestrator.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_registry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_release_notes.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_replicate_stats.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_report_command.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reports_experiment.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reports_stats.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_reports_stats_nonfinite.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_resume.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_retry_logic_comprehensive.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_route_seam_exhaustiveness.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_routing.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_run_command_junit.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_run_command_stdout.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_run_limits_resolver.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_run_metrics.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_runtime_tool_versions.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_sandbox.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_sandbox_layer_builder.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_sandbox_optional.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_sandbox_record_cli.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_sandbox_security.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_sandbox_symlink_preservation.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_sandbox_templates.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_scorers.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_scoring_quality.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_sdk_option_classification.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_simulation_config.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_simulation_integration.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_simulation_termination.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_simulation_trials.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_skill_triggered.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_streaming_agent_integration.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_streaming_batch.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_streaming_callbacks.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_streaming_cli.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_streaming_events.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_streaming_orchestrator.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_streaming_renderers.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_streaming_wire.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_success_criterion_union.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_suite_rollup.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_summaries.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_tags.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_task_definition_unknown_fields.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_teardown_interrupt.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_telemetry.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_template_env_expansion.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_threshold_enforcement.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_timeout_batch.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_timeout_categorization.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_timeout_exceptions.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_timeout_models.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_token_usage.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_uipath_eval.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_utils.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_utterance_extraction.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_variant_prompt_file.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_verdict_tool.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_watchdog.py +0 -0
- {coder_eval-0.9.6 → coder_eval-0.10.2}/tests/test_yaml_migration.py +0 -0
|
@@ -5,7 +5,7 @@ description: Generate per-task review.json (summary + tags) for a completed run
|
|
|
5
5
|
|
|
6
6
|
## Context
|
|
7
7
|
|
|
8
|
-
If `$ARGUMENTS` is empty or blank,
|
|
8
|
+
If `$ARGUMENTS` is empty or blank, resolve the run to review per the "No target given" rule in `.claude/shared/run-layout.md` — discover the run root, then take `latest` if that symlink resolves and the newest run directory by name if it does not. Tell the user which run you picked and how you got there before reading anything.
|
|
9
9
|
|
|
10
10
|
You are producing post-run reviews for a coder_eval evaluation run. The target path is: `$ARGUMENTS`
|
|
11
11
|
|
|
@@ -0,0 +1,457 @@
|
|
|
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` (`reports_experiment.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.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!-- Mirrored verbatim at plugins/coder-eval/reference/run-layout.md — update both together. -->
|
|
2
|
+
# Run layout
|
|
3
|
+
|
|
4
|
+
The on-disk structure of a coder_eval evaluation run — the factual contract every
|
|
5
|
+
run-reading command and skill follows. If the run directory structure changes, update it
|
|
6
|
+
here and every consumer follows.
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
runs/<run_id>/<variant_id>/<task_id>/<NN>/{task.json, task.log, artifacts/}
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
- `<NN>` — zero-padded replicate index (e.g. `00`, `01`).
|
|
13
|
+
- `task.json` — the persisted per-replicate result (the consumer contract; carries the large `iterations` array — still accepted under its former name `turns` when reading, but not what current runs write).
|
|
14
|
+
- `task.json.malformed` — present only on the docker degrade path: when an existing `task.json` fails to parse (schema skew from a stale `:latest` image, or a truncated/torn write), the docker runner moves the unparseable original aside to this sidecar and writes a synthetic `final_status=ERROR` `task.json` in its place. Diagnostic-only; `rglob("task.json")` consumers do not match it.
|
|
15
|
+
- `task.log` — the human-readable task log; `artifacts/` — files the agent produced.
|
|
16
|
+
|
|
17
|
+
**Scope-marker files** (used to detect what a given path represents):
|
|
18
|
+
|
|
19
|
+
- `run.json` at the run root → **run scope**. If `experiment.json` (+ `experiment.md`) is also present → multi-variant experiment.
|
|
20
|
+
- `variant.json` at a variant directory → **variant scope**.
|
|
21
|
+
- `task.json` directly in the path → **task scope** (single replicate); `??/task.json` subdirs without `variant.json` → task scope aggregated over replicates.
|
|
22
|
+
|
|
23
|
+
**No target given:** do not assume a path. Resolve the repository's **run store** by
|
|
24
|
+
discovery — the directory holding run directories, each with a `run.json` — then within it
|
|
25
|
+
use a `latest` symlink only if it resolves to a directory inside that store carrying a
|
|
26
|
+
`run.json`, and otherwise the newest run directory by name (run ids sort
|
|
27
|
+
chronologically). A `latest` that dangles or points outside the store is a finding to
|
|
28
|
+
report, not a path to read through: it is repository content and can point anywhere. Say
|
|
29
|
+
which store you resolved, how, and which run you picked, before reading anything through
|
|
30
|
+
it.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "coder-eval",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "UiPath",
|
|
5
|
+
"url": "https://github.com/UiPath/coder_eval"
|
|
6
|
+
},
|
|
7
|
+
"description": "Evaluate and benchmark AI coding agents and Claude Code skills.",
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "coder-eval",
|
|
11
|
+
"source": "./plugins/coder-eval",
|
|
12
|
+
"description": "Author, run, and analyze coder-eval suites — including whether your Claude Code skills actually trigger.",
|
|
13
|
+
"category": "testing",
|
|
14
|
+
"keywords": ["evaluation", "testing", "skills", "benchmark", "ci"]
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -207,6 +207,67 @@ jobs:
|
|
|
207
207
|
working-directory: evalboard
|
|
208
208
|
run: pnpm verify
|
|
209
209
|
|
|
210
|
+
plugin-validate:
|
|
211
|
+
# Proves the Claude Code plugin marketplace is installable and that the suite
|
|
212
|
+
# `check-skill` scaffolds is real: the manifests pass strict validation, and the
|
|
213
|
+
# bundled activation template both schema-validates and expands to one task per
|
|
214
|
+
# dataset row. Needs no credentials — nothing here invokes a model.
|
|
215
|
+
name: Claude Code Plugin (manifests + offline scaffold)
|
|
216
|
+
runs-on: ubuntu-latest
|
|
217
|
+
timeout-minutes: 10
|
|
218
|
+
steps:
|
|
219
|
+
- name: Checkout code
|
|
220
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
221
|
+
|
|
222
|
+
# `claude plugin validate` ships in the Claude Code npm package.
|
|
223
|
+
- name: Set up Node.js 20
|
|
224
|
+
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
|
225
|
+
with:
|
|
226
|
+
node-version: "20"
|
|
227
|
+
|
|
228
|
+
- name: Install Claude CLI
|
|
229
|
+
run: npm install -g @anthropic-ai/claude-code
|
|
230
|
+
|
|
231
|
+
- name: Validate plugin manifest (strict)
|
|
232
|
+
run: claude plugin validate ./plugins/coder-eval --strict
|
|
233
|
+
|
|
234
|
+
- name: Validate marketplace manifest (strict)
|
|
235
|
+
run: claude plugin validate . --strict
|
|
236
|
+
|
|
237
|
+
- name: Install uv
|
|
238
|
+
uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4.2.0
|
|
239
|
+
|
|
240
|
+
# Runs OUTSIDE the source tree, the way a user's copy of the template does:
|
|
241
|
+
# no experiments/, no tasks/, no coder_eval checkout on the path. `plan` is a
|
|
242
|
+
# schema check only (it exits 0 even when dataset.paths names a nonexistent
|
|
243
|
+
# file), so the row-count assert goes through expand_dataset — otherwise this
|
|
244
|
+
# step would pass even if activation-rows.jsonl were never copied.
|
|
245
|
+
# Reproduce locally with: SCRATCH=$(mktemp -d) VENV=$(mktemp -d)/venv
|
|
246
|
+
- name: Scaffold assert (no source tree)
|
|
247
|
+
run: |
|
|
248
|
+
set -euo pipefail
|
|
249
|
+
SCRATCH="$RUNNER_TEMP/scratch"
|
|
250
|
+
VENV="$RUNNER_TEMP/venv"
|
|
251
|
+
mkdir -p "$SCRATCH"
|
|
252
|
+
cp plugins/coder-eval/reference/templates/activation.yaml "$SCRATCH/"
|
|
253
|
+
cp plugins/coder-eval/reference/templates/activation-rows.jsonl "$SCRATCH/"
|
|
254
|
+
# A venv (not `uv tool install`) because the expansion assert needs
|
|
255
|
+
# `coder_eval` importable, not just the `coder-eval` CLI on PATH.
|
|
256
|
+
uv venv "$VENV"
|
|
257
|
+
VIRTUAL_ENV="$VENV" uv pip install .
|
|
258
|
+
cd "$SCRATCH"
|
|
259
|
+
"$VENV/bin/coder-eval" plan activation.yaml
|
|
260
|
+
"$VENV/bin/python" - <<'PY'
|
|
261
|
+
from pathlib import Path
|
|
262
|
+
from coder_eval.orchestration.task_loader import expand_dataset, load_task
|
|
263
|
+
task, _ = load_task(Path("activation.yaml"))
|
|
264
|
+
rows = expand_dataset(task, Path("."))
|
|
265
|
+
assert len(rows) == 6, f"expected 6 row-tasks, got {len(rows)}"
|
|
266
|
+
labels = {c.expected_skill for t in rows for c in t.success_criteria}
|
|
267
|
+
assert labels == {"my-skill", ""}, labels
|
|
268
|
+
print(f"ok: {len(rows)} row-tasks")
|
|
269
|
+
PY
|
|
270
|
+
|
|
210
271
|
no-uipath-extra:
|
|
211
272
|
# Proves that `pip install coder-eval` (without the optional `[uipath]`
|
|
212
273
|
# extra) yields a working framework: imports succeed, the criterion
|
|
@@ -98,7 +98,7 @@ jobs:
|
|
|
98
98
|
run: uv build
|
|
99
99
|
|
|
100
100
|
- name: Publish to TestPyPI
|
|
101
|
-
uses: pypa/gh-action-pypi-publish@
|
|
101
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
102
102
|
with:
|
|
103
103
|
# Trusted Publisher is configured on test.pypi.org for this repo +
|
|
104
104
|
# workflow (publish-testpypi.yml) + environment (testpypi); no
|