coder-eval 0.8.9__tar.gz → 0.9.0__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.0/.claude/harness-candidates.md +109 -0
- coder_eval-0.9.0/.github/pages-stub/index.html +293 -0
- coder_eval-0.9.0/.github/scripts/release_notes.py +74 -0
- coder_eval-0.9.0/.github/workflows/docs.yml +75 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/pr-checks.yml +58 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/publish-testpypi.yml +12 -4
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/release.yml +143 -13
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.pre-commit-config.yaml +11 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/CHANGELOG.md +122 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/CLAUDE.md +14 -6
- {coder_eval-0.8.9 → coder_eval-0.9.0}/Makefile +14 -5
- {coder_eval-0.8.9 → coder_eval-0.9.0}/PKG-INFO +93 -13
- {coder_eval-0.8.9 → coder_eval-0.9.0}/README.md +90 -11
- coder_eval-0.9.0/action.yml +209 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/AB_EXPERIMENTS.md +50 -12
- coder_eval-0.9.0/docs/CI_GATE.md +147 -0
- coder_eval-0.9.0/docs/DATASETS.md +276 -0
- coder_eval-0.9.0/docs/DIALOG_MODE.md +237 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/DOCKER_ISOLATION.md +58 -1
- coder_eval-0.9.0/docs/EXTENDING.md +266 -0
- coder_eval-0.9.0/docs/REPORT_SCHEMA.md +256 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/TASK_DEFINITION_GUIDE.md +240 -46
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/USER_GUIDE.md +86 -7
- coder_eval-0.9.0/docs/agents/ANTIGRAVITY.md +203 -0
- coder_eval-0.9.0/docs/agents/CLAUDE_CODE.md +194 -0
- coder_eval-0.8.9/docs/CODEX_AGENT_GUIDE.md → coder_eval-0.9.0/docs/agents/CODEX.md +6 -6
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/comparison.md +3 -3
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/index.md +13 -5
- coder_eval-0.9.0/docs/llms.txt +56 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/02-ci-pipeline.md +75 -3
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/03-evalboard-local.md +3 -3
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/04-writing-a-task.md +2 -2
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/05-comparing-models.md +1 -1
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/06-use-docker-isolation.md +1 -1
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/README.md +2 -2
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/package.json +3 -3
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/pnpm-lock.yaml +325 -234
- {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/early-stop-ab.yaml +5 -3
- coder_eval-0.9.0/litellm/README.md +193 -0
- coder_eval-0.9.0/litellm/litellm-config.yaml +81 -0
- coder_eval-0.9.0/litellm/start-litellm.sh +88 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/mkdocs.yml +36 -10
- {coder_eval-0.8.9 → coder_eval-0.9.0}/pyproject.toml +3 -2
- coder_eval-0.9.0/scripts/check_commit_msg.sh +21 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/__init__.py +1 -1
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/claude_code_agent.py +108 -17
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/report_command.py +21 -3
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/run_command.py +71 -2
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/config.py +45 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/agent_judge.py +19 -11
- coder_eval-0.9.0/src/coder_eval/criteria/base.py +519 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/llm_judge.py +36 -20
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/__init__.py +2 -0
- coder_eval-0.9.0/src/coder_eval/errors/checker_misuse.py +13 -0
- coder_eval-0.9.0/src/coder_eval/evaluation/checker.py +404 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_anthropic.py +12 -5
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_bedrock.py +36 -30
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_usage.py +2 -2
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/sub_agent.py +70 -18
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/verdict_tool.py +2 -2
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/isolation/docker_runner.py +41 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/__init__.py +4 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/criteria.py +7 -2
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/enums.py +1 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/limits.py +9 -6
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/routing.py +69 -4
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/sandbox.py +9 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/tasks.py +5 -8
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/early_stop.py +115 -22
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestrator.py +45 -16
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/pricing.py +21 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/reports.py +1 -1
- coder_eval-0.9.0/src/coder_eval/reports_junit.py +431 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/simulation/user_simulator.py +10 -2
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -1
- coder_eval-0.9.0/tests/conftest.py +108 -0
- coder_eval-0.9.0/tests/lint/dead_config_fields.py +83 -0
- coder_eval-0.9.0/tests/lint/doc_env_parity.py +125 -0
- coder_eval-0.9.0/tests/lint/doc_examples.py +211 -0
- coder_eval-0.9.0/tests/lint/doc_indexes.py +283 -0
- coder_eval-0.9.0/tests/lint/doc_schema_parity.py +85 -0
- coder_eval-0.9.0/tests/test_action_version_pin.py +59 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_judge_criterion.py +37 -18
- coder_eval-0.9.0/tests/test_check_all_async.py +635 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_backend_flag.py +1 -1
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_config_precedence.py +3 -2
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_custom_lint.py +535 -0
- coder_eval-0.9.0/tests/test_docker_litellm_env.py +119 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_early_stop.py +168 -6
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_anthropic.py +21 -19
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_bedrock.py +61 -38
- coder_eval-0.9.0/tests/test_litellm_route.py +454 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_llm_judge_criterion.py +142 -68
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_orchestrator.py +42 -7
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_evaluator.py +24 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_registry.py +13 -2
- coder_eval-0.9.0/tests/test_release_notes.py +145 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_report_command.py +52 -0
- coder_eval-0.9.0/tests/test_reports_junit.py +863 -0
- coder_eval-0.9.0/tests/test_route_seam_exhaustiveness.py +94 -0
- coder_eval-0.9.0/tests/test_run_command_junit.py +77 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_run_limits_orchestrator.py +5 -5
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_simulation_config.py +0 -1
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sub_agent_runner.py +125 -30
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_orchestrator.py +2 -2
- {coder_eval-0.8.9 → coder_eval-0.9.0}/uv.lock +3 -1
- coder_eval-0.8.9/.claude/harness-candidates.md +0 -39
- coder_eval-0.8.9/.github/workflows/docs.yml +0 -48
- coder_eval-0.8.9/docs/BYOD.md +0 -210
- coder_eval-0.8.9/docs/IDEAS.md +0 -459
- coder_eval-0.8.9/docs/llms.txt +0 -46
- coder_eval-0.8.9/src/coder_eval/criteria/base.py +0 -306
- coder_eval-0.8.9/src/coder_eval/evaluation/checker.py +0 -267
- coder_eval-0.8.9/tests/conftest.py +0 -56
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-code-review-full.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-code-review-wf.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-code-review.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-create-plan.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-implement-plan.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-review.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-run-analysis.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/commands/coder-eval-task-create.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/shared/axes.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/shared/multi-model-review.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/shared/review-rubric.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/shared/run-layout.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/workflows/cr-axis.js +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.claude/workflows/cr-parent.js +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.env.example +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/CODEOWNERS +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/code_review.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/dependabot.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/claude-pr-review.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/codeql.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/conventional-commits.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.github/workflows/docker-publish.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.gitignore +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/.python-version +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/ADOPTERS.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/CODE_OF_CONDUCT.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/CONTRIBUTING.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/LICENSE +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/NOTICE +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/SECURITY.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docker/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docker/Dockerfile.runtime +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docker/coder_eval_entrypoint.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docker/coder_eval_runtime_entrypoint.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/assets/hero.gif +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/docs/tutorials/01-first-evaluation.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/.gitignore +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/col-help.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/collapsible-rail.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/harness-badge.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/harness-selector.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/scroll-table.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/search-box.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/unit-toggle.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/version-list.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_components/window-selector.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_overview/daily-chart.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_overview/tag-rail.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/_overview/window-summary.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/api/download/route.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/api/file/route.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/api/refresh/route.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/error.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/globals.css +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/icon.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/layout.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/page.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/path-to-ga/page.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/trends/actions.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/trends/page.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/trends/trends-view.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/watchlist/page.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/next-env.d.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/next.config.mjs +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/postcss.config.mjs +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/public/harness/antigravity.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/public/harness/claude-code.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/public/harness/codex.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/public/uipath.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/tailwind.config.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/tsconfig.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/vitest.config.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/evalboard/vitest.setup.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/default.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/model-comparison.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/permissions-smoke.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/plugin-comparison.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/prompt-mutations-example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/experiments/smoke_variants.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/osv-scanner.toml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/.gitattributes +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/_logging.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/antigravity_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/codex_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/noop_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/registry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/agents/watchdog.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/analysis.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/aggregate_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/console.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/evaluate_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/plan_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/run_helpers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/run_task_internal_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/cli/utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/classification_match.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/command_executed.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/commands_efficiency.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/file_check.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/file_contains.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/file_exists.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/file_matches_regex.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/json_check.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/reference_comparison.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/run_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/skill_triggered.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/criteria/uipath_eval.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/budget.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/categories.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/categorization.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/executor.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/judge.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/retry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/errors/timeout.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_context.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/judge_persistence.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/evaluation/summaries.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/formatting.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/isolation/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/logging_config.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/agent_config.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/container_paths.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/experiment.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/judge.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/judge_defaults.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/merge_strategy.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/mutations.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/results.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/models/templates.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/batch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/config.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/config_merge.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/evaluation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/experiment.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/overrides.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/orchestration/task_loader.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/path_utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/plugins.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/py.typed +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/reports_experiment.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/reports_html.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/reports_stats.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/resources/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/resources/tags.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/sandbox.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/ast_similarity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/complexity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/quality.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/signature_similarity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/similarity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/scoring/token_similarity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/simulation/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/simulation/termination.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/callbacks.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/collector.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/events.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/renderers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/streaming/wire.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/src/coder_eval/utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agentless_smoke_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/antigravity_hello_world.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/claude_hello_world.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/claude_hello_world_docker.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/claude_subagent_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_hello_world.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_parallel_commands.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_skills_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_string_utils.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/codex_subagent_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/subagent_bash_long_input.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/agents/subagent_merge_sort.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/byod_smoke_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dataset_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/datasets/sentiment.jsonl +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/environment/input.txt +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/fibonacci_with_template.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/hello_date.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/inline_starter_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/internal/session_resumption.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_smoke.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/sentiment_classification.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_agent_judge.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_budget_exceeded.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_llm_judge.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_negative_path.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_task_timeout.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/smoke_variants.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/test_sandbox.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tasks/token_check.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/templates/byod_smoke_test/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/templates/fibonacci-starter/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/templates/fibonacci-starter/src/main.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/templates/fibonacci-starter/tests/test_main.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/_scrub.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/run_full.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/_path_helpers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/mock_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/fixtures/text_stub_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/base.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_agent_timing_access.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_silent_except.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_submodule_model_imports.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/open_explicit_encoding.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/register_criterion_required.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/runner.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/lint/violation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_config_no_timing_fields.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_config_optional_type.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_config_registry_dispatch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_config_sdk_decoupling.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_golden_master.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_telemetry_advanced.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agent_timeout.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_agentless.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_aggregate.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_antigravity_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_byoa_plugin.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_byoa_plugin_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_byod_feature.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_checker_logging.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_classification_match.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_claude_settings_enforcement_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cleanup_preservation_guard.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_empty_glob.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_sdk_options.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_set_overrides.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_cli_type_flag.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_code_review_bugs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_codex_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_codex_agent_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_codex_agent_unit.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_codex_token_mapping.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_command_executed.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_command_statistics.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_command_telemetry_result_data.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_commands_efficiency.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_config_lineage.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_config_merge_engine.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_continuous_scoring.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_criterion_result_round_trip.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_dataset_expansion.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_debug_logging.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_build_failure.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_runner_container_death.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_runner_mounts.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_runner_stream_limit.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_wildcard_env.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_docker_workdir_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_driver_resolver.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_error_handling.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_evaluate_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_evaluator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_event_collector.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_cli.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_loader.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_reports.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_resolver.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_experiment_runner.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_file_check.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_file_contains_scoring.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_formatting.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_git_clone_failure.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_heartbeat_watchdog.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_ignore_patterns_negation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_image_from_dockerfiles.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_integration.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_json_check.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_burn_in_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_context_builder.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_judge_persistence.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_lint_no_top_level_run_limits.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_lint_runner.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_log_tail_buffer.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_logging.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_logging_isolation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_merge_characterization.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_merge_strategy_annotations.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_merge_unification.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_mutations.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_new_criteria.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_node_env_config.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_optional_dependencies.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_orchestrator_error_log_tail.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_orchestrator_telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_overrides_engine.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_parallel.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_path_utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_plan_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_plugin_processing.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_plugins.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_post_run.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_pr_review_workflow.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_pre_run.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_preservation_mode.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_pricing_registry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_comparison_scoring.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_missing_file.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reference_orchestrator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_replicate_stats.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports_experiment.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports_html.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports_stats.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_reports_stats_nonfinite.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_resolve_task_files.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_resume.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_retry_logic_comprehensive.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_routing.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_run_command_stdout.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_run_limits_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_run_limits_resolver.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_runtime_tool_versions.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_layer_builder.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_optional.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_security.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_symlink_preservation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sandbox_templates.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_scorers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_scoring_quality.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_sdk_option_classification.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_simulation_integration.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_simulation_termination.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_simulation_trials.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_skill_triggered.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_agent_integration.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_batch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_callbacks.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_cli.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_events.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_orchestrator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_renderers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_streaming_wire.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_success_criterion_union.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_suite_rollup.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_summaries.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_tags.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_task_definition_unknown_fields.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_teardown_interrupt.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_template_env_expansion.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_threshold_enforcement.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_batch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_categorization.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_exceptions.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_timeout_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_token_usage.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_uipath_eval.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_user_simulator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_utterance_extraction.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_variant_prompt_file.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_verdict_tool.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_watchdog.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.9.0}/tests/test_yaml_migration.py +0 -0
|
@@ -0,0 +1,109 @@
|
|
|
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.
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Coder Eval — evaluate AI coding agents and Claude Code skills</title>
|
|
7
|
+
<!--
|
|
8
|
+
The description is here for link previews and for anyone reading source,
|
|
9
|
+
not for ranking: this page is noindex (see below), so search engines will
|
|
10
|
+
not surface it. It mirrors the wording used on coder-eval.com and in the
|
|
11
|
+
package metadata so the product is described the same way everywhere.
|
|
12
|
+
-->
|
|
13
|
+
<meta
|
|
14
|
+
name="description"
|
|
15
|
+
content="Coder Eval is an open-source framework for evaluating and benchmarking AI coding agents and Claude Code skills — sandboxed runs of Claude Code, Codex, and Gemini against declarative YAML tasks, with weighted scoring and CI gates. Documentation: coder-eval.com/docs"
|
|
16
|
+
/>
|
|
17
|
+
|
|
18
|
+
<!--
|
|
19
|
+
This page replaces the MkDocs build that used to be published here.
|
|
20
|
+
|
|
21
|
+
Two copies of the same docs were live — this GitHub Pages mirror and
|
|
22
|
+
coder-eval.com/docs — each declaring itself canonical, which splits search
|
|
23
|
+
signals and lets the wrong host rank. The docs are now published only at
|
|
24
|
+
coder-eval.com/docs; this stub exists so anything still pointing here
|
|
25
|
+
(a crawl queue entry, an internal link) lands somewhere useful instead of
|
|
26
|
+
on a 404.
|
|
27
|
+
|
|
28
|
+
`noindex, follow` rather than a canonical pointing at /docs: this page's
|
|
29
|
+
content differs from the target, and Google both discourages combining
|
|
30
|
+
noindex with rel=canonical and ignores canonicals across substantially
|
|
31
|
+
different pages. noindex keeps the stub out of the index while its links
|
|
32
|
+
are still followed.
|
|
33
|
+
|
|
34
|
+
Self-contained by design: the logo is inlined from the website's
|
|
35
|
+
src/assets/logo-light.svg with its navy fills swapped to `currentColor`
|
|
36
|
+
(the "Eval" wordmark and the icon arc stay brand orange), so one copy
|
|
37
|
+
serves both colour schemes. No external stylesheets, fonts, or images.
|
|
38
|
+
-->
|
|
39
|
+
<meta name="robots" content="noindex, follow" />
|
|
40
|
+
|
|
41
|
+
<style>
|
|
42
|
+
:root {
|
|
43
|
+
color-scheme: light dark;
|
|
44
|
+
/* Brand palette, matching the website's src/assets logos. */
|
|
45
|
+
--orange: #fa4616;
|
|
46
|
+
--navy: #10233a;
|
|
47
|
+
--offwhite: #f5f7fa;
|
|
48
|
+
|
|
49
|
+
--fg: var(--navy);
|
|
50
|
+
--muted: #5b6b7c;
|
|
51
|
+
--bg: #ffffff;
|
|
52
|
+
--border: #e3e8ee;
|
|
53
|
+
--on-orange: #ffffff;
|
|
54
|
+
}
|
|
55
|
+
@media (prefers-color-scheme: dark) {
|
|
56
|
+
:root {
|
|
57
|
+
--fg: var(--offwhite);
|
|
58
|
+
--muted: #9aabbc;
|
|
59
|
+
--bg: #0b1826;
|
|
60
|
+
--border: #21354a;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
* {
|
|
64
|
+
box-sizing: border-box;
|
|
65
|
+
}
|
|
66
|
+
body {
|
|
67
|
+
margin: 0;
|
|
68
|
+
min-height: 100vh;
|
|
69
|
+
display: flex;
|
|
70
|
+
align-items: center;
|
|
71
|
+
justify-content: center;
|
|
72
|
+
padding: 2rem 1.25rem;
|
|
73
|
+
background: var(--bg);
|
|
74
|
+
color: var(--fg);
|
|
75
|
+
font: 16px/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
76
|
+
}
|
|
77
|
+
main {
|
|
78
|
+
width: 100%;
|
|
79
|
+
max-width: 34rem;
|
|
80
|
+
}
|
|
81
|
+
/* The inlined wordmark inherits `color` for its navy parts. */
|
|
82
|
+
.logo {
|
|
83
|
+
display: block;
|
|
84
|
+
width: 11rem;
|
|
85
|
+
max-width: 60%;
|
|
86
|
+
height: auto;
|
|
87
|
+
margin-bottom: 1.75rem;
|
|
88
|
+
color: var(--fg);
|
|
89
|
+
}
|
|
90
|
+
h1 {
|
|
91
|
+
margin: 0 0 0.5rem;
|
|
92
|
+
font-size: 1.5rem;
|
|
93
|
+
line-height: 1.3;
|
|
94
|
+
}
|
|
95
|
+
p {
|
|
96
|
+
margin: 0 0 1rem;
|
|
97
|
+
color: var(--muted);
|
|
98
|
+
}
|
|
99
|
+
/* What the product is — the reason a visitor who lands here should care.
|
|
100
|
+
With the h1 visually hidden this is the first thing read, so it carries
|
|
101
|
+
the visual weight a heading otherwise would. */
|
|
102
|
+
.lead {
|
|
103
|
+
color: var(--fg);
|
|
104
|
+
font-size: 1.0625rem;
|
|
105
|
+
}
|
|
106
|
+
/* Why this page exists; secondary to the description above it. */
|
|
107
|
+
.notice {
|
|
108
|
+
margin-bottom: 1.5rem;
|
|
109
|
+
font-size: 0.9375rem;
|
|
110
|
+
}
|
|
111
|
+
.notice a {
|
|
112
|
+
color: var(--orange);
|
|
113
|
+
font-weight: 600;
|
|
114
|
+
}
|
|
115
|
+
ul {
|
|
116
|
+
margin: 0 0 1.75rem;
|
|
117
|
+
padding: 0;
|
|
118
|
+
list-style: none;
|
|
119
|
+
border-top: 1px solid var(--border);
|
|
120
|
+
}
|
|
121
|
+
li {
|
|
122
|
+
border-bottom: 1px solid var(--border);
|
|
123
|
+
}
|
|
124
|
+
ul a {
|
|
125
|
+
display: flex;
|
|
126
|
+
flex-wrap: wrap;
|
|
127
|
+
gap: 0.25rem 0.75rem;
|
|
128
|
+
align-items: baseline;
|
|
129
|
+
padding: 0.9rem 0.25rem;
|
|
130
|
+
color: var(--orange);
|
|
131
|
+
font-weight: 600;
|
|
132
|
+
text-decoration: none;
|
|
133
|
+
}
|
|
134
|
+
ul a:hover,
|
|
135
|
+
ul a:focus-visible {
|
|
136
|
+
text-decoration: underline;
|
|
137
|
+
}
|
|
138
|
+
ul a span {
|
|
139
|
+
color: var(--muted);
|
|
140
|
+
font-weight: 400;
|
|
141
|
+
font-size: 0.9375rem;
|
|
142
|
+
}
|
|
143
|
+
/* Repo bar: brand-orange pill with the repo name and live star/fork counts. */
|
|
144
|
+
.repo {
|
|
145
|
+
display: flex;
|
|
146
|
+
flex-wrap: wrap;
|
|
147
|
+
align-items: center;
|
|
148
|
+
gap: 0.5rem 0.9rem;
|
|
149
|
+
padding: 0.7rem 1rem;
|
|
150
|
+
border-radius: 0.5rem;
|
|
151
|
+
background: var(--orange);
|
|
152
|
+
color: var(--on-orange);
|
|
153
|
+
text-decoration: none;
|
|
154
|
+
font-weight: 600;
|
|
155
|
+
}
|
|
156
|
+
.repo:hover,
|
|
157
|
+
.repo:focus-visible {
|
|
158
|
+
filter: brightness(1.07);
|
|
159
|
+
}
|
|
160
|
+
.repo svg {
|
|
161
|
+
flex: none;
|
|
162
|
+
fill: currentColor;
|
|
163
|
+
}
|
|
164
|
+
.repo-name {
|
|
165
|
+
margin-right: auto;
|
|
166
|
+
}
|
|
167
|
+
.stat {
|
|
168
|
+
display: inline-flex;
|
|
169
|
+
align-items: center;
|
|
170
|
+
gap: 0.3rem;
|
|
171
|
+
font-variant-numeric: tabular-nums;
|
|
172
|
+
}
|
|
173
|
+
/* Reserve a few digits of width so replacing the spinner with the fetched
|
|
174
|
+
number doesn't shift the rest of the bar. */
|
|
175
|
+
.count {
|
|
176
|
+
display: inline-flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
justify-content: flex-end;
|
|
179
|
+
min-width: 2.25ch;
|
|
180
|
+
}
|
|
181
|
+
/* The counts' initial state; the script swaps each one for a real number. */
|
|
182
|
+
.spinner {
|
|
183
|
+
display: inline-block;
|
|
184
|
+
width: 0.8em;
|
|
185
|
+
height: 0.8em;
|
|
186
|
+
border: 2px solid currentColor;
|
|
187
|
+
border-right-color: transparent;
|
|
188
|
+
border-radius: 50%;
|
|
189
|
+
opacity: 0.75;
|
|
190
|
+
animation: spin 0.6s linear infinite;
|
|
191
|
+
}
|
|
192
|
+
@keyframes spin {
|
|
193
|
+
to {
|
|
194
|
+
transform: rotate(360deg);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
@media (prefers-reduced-motion: reduce) {
|
|
198
|
+
.spinner {
|
|
199
|
+
animation-duration: 2.4s;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/* Visually hidden, still announced — the counts are bare numbers otherwise. */
|
|
203
|
+
.sr-only {
|
|
204
|
+
position: absolute;
|
|
205
|
+
width: 1px;
|
|
206
|
+
height: 1px;
|
|
207
|
+
padding: 0;
|
|
208
|
+
margin: -1px;
|
|
209
|
+
overflow: hidden;
|
|
210
|
+
clip: rect(0, 0, 0, 0);
|
|
211
|
+
white-space: nowrap;
|
|
212
|
+
border: 0;
|
|
213
|
+
}
|
|
214
|
+
</style>
|
|
215
|
+
</head>
|
|
216
|
+
<body>
|
|
217
|
+
<main>
|
|
218
|
+
<svg class="logo" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1400 440" fill="none"><g transform="translate(-75,-36)"><path d="M224 176 L216 176 A56 56 0 0 0 160 232 L160 280 A56 56 0 0 0 216 336 L224 336" fill="none" stroke="#FA4616" stroke-width="28" stroke-linecap="round" stroke-linejoin="round"/><rect x="200" y="210" width="78" height="18" rx="9" fill="currentColor"/><rect x="200" y="247" width="52" height="18" rx="9" fill="currentColor"/><rect x="200" y="284" width="104" height="18" rx="9" fill="currentColor"/></g><g fill="currentColor"><g transform="translate(270.00,278.00) scale(0.19000,-0.19000)"><path d="M308 -10Q237 -10 185.0 16.5Q133 43 104.5 91.5Q76 140 76 206V524Q76 590 104.5 638.5Q133 687 185.0 713.5Q237 740 308 740Q378 740 430.0 713.5Q482 687 511.0 638.5Q540 590 540 524H414Q414 575 386.5 602.5Q359 630 308 630Q257 630 229.0 602.5Q201 575 201 524V206Q201 155 229.0 127.5Q257 100 308 100Q359 100 386.5 127.5Q414 155 414 206H540Q540 140 511.0 91.5Q482 43 430.0 16.5Q378 -10 308 -10Z"/></g><g transform="translate(380.00,278.00) scale(0.19000,-0.19000)"><path d="M300 -9Q194 -9 132.0 50.5Q70 110 70 211V339Q70 441 132.0 500.0Q194 559 300 559Q406 559 468.0 500.0Q530 441 530 339V211Q530 110 468.0 50.5Q406 -9 300 -9ZM300 100Q350 100 377.5 127.5Q405 155 405 207V343Q405 395 377.5 422.5Q350 450 300 450Q250 450 222.5 422.5Q195 395 195 343V207Q195 155 222.5 127.5Q250 100 300 100Z"/></g><g transform="translate(490.00,278.00) scale(0.19000,-0.19000)"><path d="M250 -10Q170 -10 120.5 47.0Q71 104 71 200V349Q71 446 120.0 503.0Q169 560 250 560Q307 560 346.5 531.0Q386 502 402 450L398 576V730H523V0H401V100Q386 48 347.0 19.0Q308 -10 250 -10ZM297 98Q345 98 371.5 127.0Q398 156 398 209V341Q398 394 371.5 423.0Q345 452 297 452Q249 452 222.5 426.0Q196 400 196 346V204Q196 150 222.5 124.0Q249 98 297 98Z"/></g><g transform="translate(600.00,278.00) scale(0.19000,-0.19000)"><path d="M301 -10Q231 -10 179.0 17.0Q127 44 98.5 93.5Q70 143 70 210V340Q70 407 98.5 456.5Q127 506 179.0 533.0Q231 560 301 560Q370 560 421.5 533.0Q473 506 501.5 457.5Q530 409 530 344V244H190V206Q190 150 219.0 121.5Q248 93 301 93Q340 93 367.5 106.5Q395 120 400 146H524Q511 75 450.0 32.5Q389 -10 301 -10ZM190 344V325L410 326V345Q410 402 382.0 433.0Q354 464 301 464Q246 464 218.0 432.5Q190 401 190 344Z"/></g><g transform="translate(710.00,278.00) scale(0.19000,-0.19000)"><path d="M97 0V550H219V443Q229 497 268.5 528.5Q308 560 371 560Q455 560 502.0 506.0Q549 452 549 355V303H424V349Q424 399 398.0 425.5Q372 452 324 452Q274 452 248.0 422.0Q222 392 222 337V0Z"/></g></g><g fill="#FA4616"><g transform="translate(890.00,278.00) scale(0.19000,-0.19000)"><path d="M88 0V730H526V620H211V430H491V324H211V110H526V0Z"/></g><g transform="translate(1000.00,278.00) scale(0.19000,-0.19000)"><path d="M221 0 36 550H167L273 216Q283 186 290.5 155.5Q298 125 301 103Q305 125 311.5 155.5Q318 186 327 215L432 550H564L380 0Z"/></g><g transform="translate(1110.00,278.00) scale(0.19000,-0.19000)"><path d="M239 -10Q155 -10 106.5 37.5Q58 85 58 162Q58 242 113.0 289.5Q168 337 264 337H398V376Q398 459 301 459Q257 459 231.0 442.0Q205 425 202 394H82Q86 468 144.5 514.0Q203 560 302 560Q407 560 465.0 511.0Q523 462 523 373V0H401V103Q394 50 351.0 20.0Q308 -10 239 -10ZM279 92Q334 92 366.0 119.0Q398 146 398 191V256H270Q229 256 205.0 233.0Q181 210 181 174Q181 137 206.5 114.5Q232 92 279 92Z"/></g><g transform="translate(1220.00,278.00) scale(0.19000,-0.19000)"><path d="M389 0Q307 0 257.5 49.0Q208 98 208 178V617H27V730H333V181Q333 150 350.5 131.5Q368 113 398 113H559V0Z"/></g></g></svg>
|
|
219
|
+
|
|
220
|
+
<!--
|
|
221
|
+
Visually hidden on purpose: the wordmark above already renders "Coder
|
|
222
|
+
Eval", so showing this too was the same two words twice. The heading
|
|
223
|
+
still exists for document structure, and it is the accessible name for
|
|
224
|
+
the page now that the logo is aria-hidden.
|
|
225
|
+
-->
|
|
226
|
+
<h1 class="sr-only">Coder Eval</h1>
|
|
227
|
+
<p class="lead">
|
|
228
|
+
An open-source framework for evaluating and benchmarking AI coding agents and their Claude
|
|
229
|
+
Code skills: it runs a real agent — Claude Code, Codex, or Gemini — in a sandbox against
|
|
230
|
+
declarative YAML tasks, then scores the files and commands the agent actually produced.
|
|
231
|
+
</p>
|
|
232
|
+
<p class="notice">
|
|
233
|
+
The documentation has moved to
|
|
234
|
+
<a href="https://coder-eval.com/docs">coder-eval.com/docs</a>.
|
|
235
|
+
</p>
|
|
236
|
+
|
|
237
|
+
<!--
|
|
238
|
+
Only the project site here: the docs link lives in the notice above and
|
|
239
|
+
the repo in the bar below, so each destination appears exactly once.
|
|
240
|
+
-->
|
|
241
|
+
<ul>
|
|
242
|
+
<li>
|
|
243
|
+
<a href="https://coder-eval.com">Project website <span>coder-eval.com</span></a>
|
|
244
|
+
</li>
|
|
245
|
+
</ul>
|
|
246
|
+
|
|
247
|
+
<a class="repo" href="https://github.com/UiPath/coder_eval">
|
|
248
|
+
<svg width="20" height="20" viewBox="0 0 16 16" aria-hidden="true">
|
|
249
|
+
<path
|
|
250
|
+
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.07-.2-.36-1.02.07-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.43 1.1.14 1.92.07 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0016 8c0-4.42-3.58-8-8-8z"
|
|
251
|
+
/>
|
|
252
|
+
</svg>
|
|
253
|
+
<span class="repo-name">UiPath/coder_eval</span>
|
|
254
|
+
<span class="stat" title="Stars">
|
|
255
|
+
<svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true">
|
|
256
|
+
<path
|
|
257
|
+
d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z"
|
|
258
|
+
/>
|
|
259
|
+
</svg>
|
|
260
|
+
<span class="count" data-stat="stars"><span class="spinner" aria-hidden="true"></span></span>
|
|
261
|
+
<span class="sr-only">stars</span>
|
|
262
|
+
</span>
|
|
263
|
+
<span class="stat" title="Forks">
|
|
264
|
+
<svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true">
|
|
265
|
+
<path
|
|
266
|
+
d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-.878a2.25 2.25 0 111.5 0v.878a2.25 2.25 0 01-2.25 2.25h-1.5v2.128a2.251 2.251 0 11-1.5 0V8.5h-1.5A2.25 2.25 0 013.5 6.25v-.878a2.25 2.25 0 111.5 0zM5 3.25a.75.75 0 10-1.5 0 .75.75 0 001.5 0zm6.75.75a.75.75 0 100-1.5.75.75 0 000 1.5zm-3 8.75a.75.75 0 100-1.5.75.75 0 000 1.5z"
|
|
267
|
+
/>
|
|
268
|
+
</svg>
|
|
269
|
+
<span class="count" data-stat="forks"><span class="spinner" aria-hidden="true"></span></span>
|
|
270
|
+
<span class="sr-only">forks</span>
|
|
271
|
+
</span>
|
|
272
|
+
</a>
|
|
273
|
+
</main>
|
|
274
|
+
|
|
275
|
+
<script>
|
|
276
|
+
// Fill the star/fork counts from api.github.com, replacing the spinners the
|
|
277
|
+
// markup ships. Nothing is hardcoded: a committed count would be wrong
|
|
278
|
+
// within days. Any failure — offline, rate limit (unauthenticated is 60
|
|
279
|
+
// requests/hour/IP), unexpected payload, scripting disabled — simply leaves
|
|
280
|
+
// the spinner in place rather than showing a stale or invented number.
|
|
281
|
+
fetch("https://api.github.com/repos/UiPath/coder_eval")
|
|
282
|
+
.then((r) => r.json())
|
|
283
|
+
.then((d) => {
|
|
284
|
+
const values = { stars: d.stargazers_count, forks: d.forks_count };
|
|
285
|
+
document.querySelectorAll("[data-stat]").forEach((el) => {
|
|
286
|
+
const n = values[el.dataset.stat];
|
|
287
|
+
if (Number.isFinite(n)) el.textContent = n.toLocaleString();
|
|
288
|
+
});
|
|
289
|
+
})
|
|
290
|
+
.catch(() => {});
|
|
291
|
+
</script>
|
|
292
|
+
</body>
|
|
293
|
+
</html>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Slice one version's section out of ``CHANGELOG.md`` for a GitHub Release body.
|
|
3
|
+
|
|
4
|
+
Used by ``.github/workflows/release.yml``'s "Publish GitHub Release" step.
|
|
5
|
+
|
|
6
|
+
This lives in a real module rather than inline in a ``run:`` heredoc because
|
|
7
|
+
code inside a heredoc is structurally invisible to ruff, pyright, pytest and
|
|
8
|
+
coverage — and this particular code has three distinct failure modes (version
|
|
9
|
+
absent, section is the file's last, version string carrying regex
|
|
10
|
+
metacharacters) on a path that executes exactly once per release, against
|
|
11
|
+
production ``main``, after the tag is already pushed. The prerelease dispatch
|
|
12
|
+
skips the step, so there is no rehearsal; ``tests/test_release_notes.py`` is
|
|
13
|
+
what exercises it before it matters.
|
|
14
|
+
|
|
15
|
+
Usage::
|
|
16
|
+
|
|
17
|
+
release_notes.py <version> <output-path>
|
|
18
|
+
|
|
19
|
+
Writes the section body (heading line excluded, stripped) to ``<output-path>``,
|
|
20
|
+
or an empty file when no matching section exists — the caller treats an empty
|
|
21
|
+
file as "fall back to GitHub's generated notes".
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import re
|
|
27
|
+
import sys
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
_REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
32
|
+
|
|
33
|
+
# semantic-release's default changelog template renders headings as
|
|
34
|
+
# "## v0.8.9 (2026-07-23)". Capture everything after that heading line up to the
|
|
35
|
+
# next "## v" heading, or EOF for the newest entry (the common case on a release
|
|
36
|
+
# run, since the just-generated section is at the top of the file).
|
|
37
|
+
#
|
|
38
|
+
# The trailing \b on the version is load-bearing: without it "0.8.1" would match
|
|
39
|
+
# the "## v0.8.10" heading and publish the wrong section.
|
|
40
|
+
_SECTION_TEMPLATE = r"(?m)^## v{version}\b.*?$(.*?)(?=^## v|\Z)"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def extract_section(changelog_text: str, version: str) -> str:
|
|
44
|
+
"""Return the changelog body for ``version``, or ``""`` when absent.
|
|
45
|
+
|
|
46
|
+
``version`` is regex-escaped, so a PEP 440 local/prerelease version
|
|
47
|
+
containing metacharacters (``+``, ``!``) is matched literally.
|
|
48
|
+
"""
|
|
49
|
+
pattern = _SECTION_TEMPLATE.format(version=re.escape(version))
|
|
50
|
+
match = re.search(pattern, changelog_text, re.S)
|
|
51
|
+
return match.group(1).strip() if match else ""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def main(argv: list[str]) -> int:
|
|
55
|
+
if len(argv) != 3:
|
|
56
|
+
print("usage: release_notes.py <version> <output-path>", file=sys.stderr)
|
|
57
|
+
return 2
|
|
58
|
+
version, out_path = argv[1], argv[2]
|
|
59
|
+
# Encoding is pinned rather than left to the ambient locale: CHANGELOG.md
|
|
60
|
+
# verifiably carries non-ASCII (arrows, em dashes, check marks), so a
|
|
61
|
+
# non-UTF-8 locale would raise UnicodeDecodeError here and — under the
|
|
62
|
+
# caller's `continue-on-error: true` — silently publish no Release at all.
|
|
63
|
+
text = (_REPO_ROOT / "CHANGELOG.md").read_text(encoding="utf-8")
|
|
64
|
+
body = extract_section(text, version)
|
|
65
|
+
Path(out_path).write_text(body, encoding="utf-8")
|
|
66
|
+
if not body:
|
|
67
|
+
# Surfaced as a workflow annotation; the caller falls back to
|
|
68
|
+
# --generate-notes when the file is empty.
|
|
69
|
+
print(f"::warning::no CHANGELOG section found for v{version}; using GitHub's generated notes")
|
|
70
|
+
return 0
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
if __name__ == "__main__":
|
|
74
|
+
raise SystemExit(main(sys.argv))
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
name: Pages stub
|
|
2
|
+
|
|
3
|
+
# Publishes `.github/pages-stub/` to the `gh-pages` branch, which GitHub Pages
|
|
4
|
+
# serves at https://uipath.github.io/coder_eval/.
|
|
5
|
+
#
|
|
6
|
+
# This workflow used to run `mkdocs gh-deploy`, publishing a full second copy of
|
|
7
|
+
# docs/ here. That was a duplicate of coder-eval.com/docs: both copies declared
|
|
8
|
+
# themselves canonical, which splits search signals and lets the wrong host rank —
|
|
9
|
+
# and the mirror drifted, serving pages (BYOD, CODEX_AGENT_GUIDE) that had been
|
|
10
|
+
# renamed upstream. The docs are now published only at coder-eval.com/docs, synced
|
|
11
|
+
# from docs/ by the website's scripts/sync-docs.mjs.
|
|
12
|
+
#
|
|
13
|
+
# The mkdocs deploy is REMOVED rather than commented out: leaving it one
|
|
14
|
+
# uncomment away meant a future run would silently restore the duplicate. mkdocs
|
|
15
|
+
# itself is still used — `mkdocs.yml` remains the docs IA source of truth (CE028
|
|
16
|
+
# generates the index surfaces from its `nav:`, and the website derives its
|
|
17
|
+
# sidebar from it), and `mkdocs build` is still the way to verify anchors locally.
|
|
18
|
+
# What's gone is only the *publishing* of a second site.
|
|
19
|
+
#
|
|
20
|
+
# The gh-pages branch is force-replaced with the stub on each run, so the stale
|
|
21
|
+
# MkDocs output — including its sitemap.xml, which was still advertising the old
|
|
22
|
+
# URLs for indexing — is cleared rather than left alongside.
|
|
23
|
+
#
|
|
24
|
+
# Manual-only by design: the stub changes about once a year. Run it from the
|
|
25
|
+
# Actions tab when the stub itself changes.
|
|
26
|
+
on:
|
|
27
|
+
workflow_dispatch:
|
|
28
|
+
|
|
29
|
+
permissions:
|
|
30
|
+
contents: write
|
|
31
|
+
|
|
32
|
+
concurrency:
|
|
33
|
+
group: docs-gh-pages
|
|
34
|
+
cancel-in-progress: true
|
|
35
|
+
|
|
36
|
+
jobs:
|
|
37
|
+
publish:
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@v4
|
|
41
|
+
|
|
42
|
+
- name: Assemble the published tree
|
|
43
|
+
run: |
|
|
44
|
+
set -euo pipefail
|
|
45
|
+
out="$(mktemp -d)"
|
|
46
|
+
cp .github/pages-stub/index.html "$out/index.html"
|
|
47
|
+
# Pages serves 404.html for any unknown path, so the same stub catches
|
|
48
|
+
# every old deep URL (/USER_GUIDE/, /tutorials/01-.../, …) without
|
|
49
|
+
# needing a file per route.
|
|
50
|
+
cp .github/pages-stub/index.html "$out/404.html"
|
|
51
|
+
# Without .nojekyll, Pages runs the tree through Jekyll, which strips
|
|
52
|
+
# files and directories whose names begin with an underscore.
|
|
53
|
+
touch "$out/.nojekyll"
|
|
54
|
+
# The old MkDocs llms.txt lived here and is referenced from the site's
|
|
55
|
+
# /llms.txt history; a .txt cannot meta-refresh, so point it in prose.
|
|
56
|
+
printf '# Coder Eval\n\nThe documentation moved to https://coder-eval.com/docs\n\nllms.txt: https://coder-eval.com/llms.txt\nFull docs in one file: https://coder-eval.com/llms-full.txt\n' \
|
|
57
|
+
> "$out/llms.txt"
|
|
58
|
+
echo "OUT_DIR=$out" >> "$GITHUB_ENV"
|
|
59
|
+
|
|
60
|
+
- name: Force-replace gh-pages with the stub
|
|
61
|
+
env:
|
|
62
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
63
|
+
run: |
|
|
64
|
+
set -euo pipefail
|
|
65
|
+
cd "$OUT_DIR"
|
|
66
|
+
git init -q -b gh-pages
|
|
67
|
+
git config user.name "coder-eval"
|
|
68
|
+
git config user.email "coder-eval@uipath.com"
|
|
69
|
+
git add -A
|
|
70
|
+
git commit -qm "Publish Pages stub redirecting to coder-eval.com/docs"
|
|
71
|
+
# A fresh single-commit history, force-pushed: gh-pages is a build
|
|
72
|
+
# artifact, so there is no history worth preserving, and this guarantees
|
|
73
|
+
# none of the old MkDocs output survives.
|
|
74
|
+
git push --force \
|
|
75
|
+
"https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" gh-pages
|
|
@@ -831,3 +831,61 @@ jobs:
|
|
|
831
831
|
name: byoa-live-output
|
|
832
832
|
path: tmp/
|
|
833
833
|
retention-days: 7
|
|
834
|
+
|
|
835
|
+
action-dogfood:
|
|
836
|
+
name: Action Dogfood (composite action, real API)
|
|
837
|
+
runs-on: ubuntu-latest
|
|
838
|
+
timeout-minutes: 15
|
|
839
|
+
# Skip on fork PRs where secrets aren't available (matches e2e-smoke).
|
|
840
|
+
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
|
|
841
|
+
steps:
|
|
842
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
843
|
+
|
|
844
|
+
# The composite action is agent-agnostic and does NOT install a coding-agent
|
|
845
|
+
# runtime. The dogfood task uses the default claude-code agent, so provide
|
|
846
|
+
# Node + the Claude CLI here (as e2e-smoke does), before invoking the action.
|
|
847
|
+
- name: Set up Node.js 20
|
|
848
|
+
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
|
849
|
+
with:
|
|
850
|
+
node-version: "20"
|
|
851
|
+
- name: Install Claude CLI
|
|
852
|
+
run: npm install -g @anthropic-ai/claude-code
|
|
853
|
+
|
|
854
|
+
- name: Run coder-eval via local action
|
|
855
|
+
id: dogfood
|
|
856
|
+
uses: ./
|
|
857
|
+
with:
|
|
858
|
+
version: local
|
|
859
|
+
tasks: tasks/hello_date.yaml
|
|
860
|
+
model: claude-haiku-4-5-20251001
|
|
861
|
+
run-dir: runs/ci-action-dogfood
|
|
862
|
+
junit-path: runs/ci-action-dogfood/junit.xml
|
|
863
|
+
# Credentials go through the generic env passthrough (the only channel);
|
|
864
|
+
# ANTHROPIC_API_KEY reaching the run is proven by the API-backed task
|
|
865
|
+
# succeeding. A floor of 0.0 passes for any produced score (exercises
|
|
866
|
+
# the gate path green in CI without flakiness); the second line
|
|
867
|
+
# exercises multi-line env parsing.
|
|
868
|
+
minimum-task-score: "0.0"
|
|
869
|
+
env: |
|
|
870
|
+
ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}
|
|
871
|
+
CE_DOGFOOD_MARKER=1
|
|
872
|
+
|
|
873
|
+
- name: Verify outputs and JUnit file
|
|
874
|
+
env:
|
|
875
|
+
JUNIT: ${{ steps.dogfood.outputs.junit-path }}
|
|
876
|
+
RUNDIR: ${{ steps.dogfood.outputs.run-dir }}
|
|
877
|
+
run: |
|
|
878
|
+
set -euo pipefail
|
|
879
|
+
test -n "$JUNIT" && test -f "$JUNIT" || { echo "junit output missing"; exit 1; }
|
|
880
|
+
# Well-formedness check on a file this job just generated (trusted input;
|
|
881
|
+
# our writer emits no DTDs/entities) — stdlib ET is fine here.
|
|
882
|
+
python3 -c "import sys, xml.etree.ElementTree as ET; ET.parse(sys.argv[1])" "$JUNIT"
|
|
883
|
+
test -f "$RUNDIR/run.json" || { echo "run.json missing"; exit 1; }
|
|
884
|
+
|
|
885
|
+
- name: Upload dogfood run on failure
|
|
886
|
+
if: failure()
|
|
887
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
888
|
+
with:
|
|
889
|
+
name: action-dogfood-runs
|
|
890
|
+
path: runs/ci-action-dogfood/
|
|
891
|
+
retention-days: 7
|
|
@@ -64,8 +64,14 @@ jobs:
|
|
|
64
64
|
CURRENT_VERSION=$(python3 -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
|
|
65
65
|
# PEP 440 dev release: sorts before the base release, unique per run.
|
|
66
66
|
DEV_VERSION="${CURRENT_VERSION}.dev${RUN_NUMBER}"
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
# Exported so the heredoc below can read it from os.environ. The delimiter
|
|
68
|
+
# is QUOTED (<<'PY'): with a bare <<PY the shell expands $DEV_VERSION into
|
|
69
|
+
# the Python source text, so a value containing a quote or newline would
|
|
70
|
+
# break out of the string literal it lands in.
|
|
71
|
+
export DEV_VERSION
|
|
72
|
+
python3 - <<'PY'
|
|
73
|
+
import os, re, pathlib
|
|
74
|
+
version = os.environ["DEV_VERSION"]
|
|
69
75
|
# pyproject.toml is the canonical source; __init__ is kept in sync.
|
|
70
76
|
for path, pat in (
|
|
71
77
|
("pyproject.toml", r'(?m)^version\s*=\s*".+?"$'),
|
|
@@ -76,10 +82,12 @@ jobs:
|
|
|
76
82
|
# re.subn (not re.sub) so a version-line format drift aborts loudly
|
|
77
83
|
# instead of silently no-op'ing (rc=0) and publishing a stale/base
|
|
78
84
|
# version that then collides on TestPyPI (masked by skip-existing).
|
|
79
|
-
|
|
85
|
+
# encoding pinned rather than left to the ambient locale, which would
|
|
86
|
+
# otherwise raise UnicodeDecodeError mid-publish on a non-ASCII source.
|
|
87
|
+
new, n = re.subn(pat, f'{key} = "{version}"', p.read_text(encoding="utf-8"), count=1)
|
|
80
88
|
if n != 1:
|
|
81
89
|
raise SystemExit(f"version pattern did not match {path} (matched {n}); refusing to publish a stale/colliding artifact")
|
|
82
|
-
p.write_text(new)
|
|
90
|
+
p.write_text(new, encoding="utf-8")
|
|
83
91
|
PY
|
|
84
92
|
echo "Stamped dev version: ${DEV_VERSION}"
|
|
85
93
|
|