coder-eval 0.8.9__tar.gz → 0.8.10__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.8.9 → coder_eval-0.8.10}/.claude/harness-candidates.md +16 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/docs.yml +11 -6
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/pr-checks.yml +58 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/release.yml +33 -6
- {coder_eval-0.8.9 → coder_eval-0.8.10}/CHANGELOG.md +115 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/CLAUDE.md +12 -4
- {coder_eval-0.8.9 → coder_eval-0.8.10}/Makefile +4 -1
- {coder_eval-0.8.9 → coder_eval-0.8.10}/PKG-INFO +93 -13
- {coder_eval-0.8.9 → coder_eval-0.8.10}/README.md +90 -11
- coder_eval-0.8.10/action.yml +209 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/AB_EXPERIMENTS.md +50 -12
- coder_eval-0.8.10/docs/CI_GATE.md +147 -0
- coder_eval-0.8.10/docs/DATASETS.md +276 -0
- coder_eval-0.8.10/docs/DIALOG_MODE.md +237 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/DOCKER_ISOLATION.md +58 -1
- coder_eval-0.8.10/docs/EXTENDING.md +239 -0
- coder_eval-0.8.10/docs/REPORT_SCHEMA.md +256 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/TASK_DEFINITION_GUIDE.md +240 -46
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/USER_GUIDE.md +86 -7
- coder_eval-0.8.10/docs/agents/ANTIGRAVITY.md +203 -0
- coder_eval-0.8.10/docs/agents/CLAUDE_CODE.md +194 -0
- coder_eval-0.8.9/docs/CODEX_AGENT_GUIDE.md → coder_eval-0.8.10/docs/agents/CODEX.md +6 -6
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/comparison.md +3 -3
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/index.md +13 -5
- coder_eval-0.8.10/docs/llms.txt +56 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/02-ci-pipeline.md +75 -3
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/03-evalboard-local.md +3 -3
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/04-writing-a-task.md +2 -2
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/05-comparing-models.md +1 -1
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/06-use-docker-isolation.md +1 -1
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/README.md +2 -2
- {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/early-stop-ab.yaml +5 -3
- {coder_eval-0.8.9 → coder_eval-0.8.10}/mkdocs.yml +36 -10
- {coder_eval-0.8.9 → coder_eval-0.8.10}/pyproject.toml +3 -2
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/__init__.py +1 -1
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/report_command.py +21 -3
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/run_command.py +19 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/criteria.py +7 -2
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/limits.py +9 -6
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/tasks.py +5 -8
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/early_stop.py +114 -21
- coder_eval-0.8.10/src/coder_eval/reports_junit.py +431 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -1
- coder_eval-0.8.10/tests/conftest.py +108 -0
- coder_eval-0.8.10/tests/lint/dead_config_fields.py +83 -0
- coder_eval-0.8.10/tests/lint/doc_env_parity.py +125 -0
- coder_eval-0.8.10/tests/lint/doc_examples.py +211 -0
- coder_eval-0.8.10/tests/lint/doc_indexes.py +283 -0
- coder_eval-0.8.10/tests/lint/doc_schema_parity.py +85 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_custom_lint.py +535 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_early_stop.py +164 -4
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_report_command.py +52 -0
- coder_eval-0.8.10/tests/test_reports_junit.py +863 -0
- coder_eval-0.8.10/tests/test_run_command_junit.py +77 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_simulation_config.py +0 -1
- {coder_eval-0.8.9 → coder_eval-0.8.10}/uv.lock +3 -1
- 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/tests/conftest.py +0 -56
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-code-review-full.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-code-review-wf.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-code-review.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-create-plan.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-implement-plan.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-review.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-run-analysis.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/commands/coder-eval-task-create.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/shared/axes.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/shared/multi-model-review.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/shared/review-rubric.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/shared/run-layout.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/workflows/cr-axis.js +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.claude/workflows/cr-parent.js +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.env.example +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/CODEOWNERS +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/code_review.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/dependabot.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/claude-pr-review.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/codeql.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/conventional-commits.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/docker-publish.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.github/workflows/publish-testpypi.yml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.gitignore +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.pre-commit-config.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/.python-version +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/ADOPTERS.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/CODE_OF_CONDUCT.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/CONTRIBUTING.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/LICENSE +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/NOTICE +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/SECURITY.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docker/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docker/Dockerfile.runtime +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docker/coder_eval_entrypoint.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docker/coder_eval_runtime_entrypoint.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/assets/hero.gif +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/docs/tutorials/01-first-evaluation.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/.gitignore +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/col-help.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/collapsible-rail.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/harness-badge.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/harness-selector.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/scroll-table.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/search-box.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/unit-toggle.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/version-list.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_components/window-selector.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_overview/daily-chart.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_overview/tag-rail.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/_overview/window-summary.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/api/download/route.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/api/file/route.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/api/refresh/route.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/error.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/globals.css +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/icon.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/layout.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/page.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/path-to-ga/page.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/trends/actions.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/trends/page.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/trends/trends-view.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/watchlist/page.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/next-env.d.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/next.config.mjs +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/package.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/pnpm-lock.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/postcss.config.mjs +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/public/harness/antigravity.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/public/harness/claude-code.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/public/harness/codex.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/public/uipath.png +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/tailwind.config.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/tsconfig.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/vitest.config.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/evalboard/vitest.setup.ts +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/default.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/model-comparison.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/permissions-smoke.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/plugin-comparison.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/prompt-mutations-example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/experiments/smoke_variants.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/osv-scanner.toml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/.gitattributes +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/_logging.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/antigravity_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/claude_code_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/codex_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/noop_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/registry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/agents/watchdog.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/analysis.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/aggregate_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/console.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/evaluate_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/plan_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/run_helpers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/run_task_internal_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/cli/utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/config.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/agent_judge.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/base.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/classification_match.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/command_executed.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/commands_efficiency.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/file_check.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/file_contains.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/file_exists.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/file_matches_regex.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/json_check.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/llm_judge.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/reference_comparison.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/run_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/skill_triggered.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/criteria/uipath_eval.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/budget.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/categories.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/categorization.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/executor.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/judge.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/retry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/errors/timeout.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/checker.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_context.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_persistence.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/judge_usage.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/sub_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/summaries.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/evaluation/verdict_tool.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/formatting.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/isolation/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/isolation/docker_runner.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/logging_config.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/agent_config.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/container_paths.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/enums.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/experiment.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/judge.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/judge_defaults.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/merge_strategy.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/mutations.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/results.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/routing.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/sandbox.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/models/templates.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/batch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/config.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/config_merge.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/evaluation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/experiment.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/overrides.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestration/task_loader.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/orchestrator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/path_utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/plugins.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/pricing.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/py.typed +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/reports.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/reports_experiment.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/reports_html.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/reports_stats.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/resources/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/resources/tags.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/sandbox.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/ast_similarity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/complexity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/quality.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/signature_similarity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/similarity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/scoring/token_similarity.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/simulation/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/simulation/termination.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/simulation/user_simulator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/callbacks.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/collector.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/events.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/renderers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/streaming/wire.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/src/coder_eval/utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agentless_smoke_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/antigravity_hello_world.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/claude_hello_world.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/claude_hello_world_docker.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/claude_subagent_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_hello_world.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_parallel_commands.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_skills_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_string_utils.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/codex_subagent_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/subagent_bash_long_input.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/agents/subagent_merge_sort.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/byod_smoke_test.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dataset_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/datasets/sentiment.jsonl +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/environment/input.txt +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/fibonacci_with_template.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/hello_date.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/inline_starter_example.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/internal/session_resumption.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_smoke.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/sentiment_classification.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_agent_judge.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_budget_exceeded.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_llm_judge.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_negative_path.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_task_timeout.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/smoke_variants.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/test_sandbox.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tasks/token_check.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/templates/byod_smoke_test/Dockerfile +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/templates/fibonacci-starter/README.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/templates/fibonacci-starter/src/main.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/templates/fibonacci-starter/tests/test_main.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/_scrub.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/run_full.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/_path_helpers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/mock_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/fixtures/text_stub_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/__init__.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/base.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_agent_timing_access.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_silent_except.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_submodule_model_imports.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/open_explicit_encoding.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/register_criterion_required.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/runner.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/lint/violation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_config_no_timing_fields.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_config_optional_type.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_config_registry_dispatch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_config_sdk_decoupling.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_golden_master.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_judge_criterion.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_telemetry_advanced.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agent_timeout.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_agentless.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_aggregate.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_antigravity_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_byoa_plugin.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_byoa_plugin_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_byod_feature.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_checker_logging.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_classification_match.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_claude_settings_enforcement_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cleanup_preservation_guard.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_backend_flag.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_empty_glob.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_sdk_options.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_set_overrides.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_cli_type_flag.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_code_review_bugs.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_codex_agent.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_codex_agent_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_codex_agent_unit.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_codex_token_mapping.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_command_executed.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_command_statistics.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_command_telemetry_result_data.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_commands_efficiency.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_config_lineage.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_config_merge_engine.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_config_precedence.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_continuous_scoring.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_criterion_result_round_trip.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_dataset_expansion.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_debug_logging.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_build_failure.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_runner_container_death.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_runner_mounts.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_runner_stream_limit.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_wildcard_env.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_docker_workdir_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_driver_resolver.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_error_handling.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_evaluate_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_evaluator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_event_collector.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_cli.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_loader.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_reports.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_resolver.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_experiment_runner.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_file_check.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_file_contains_scoring.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_formatting.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_git_clone_failure.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_heartbeat_watchdog.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_ignore_patterns_negation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_image_from_dockerfiles.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_integration.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_json_check.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_anthropic.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_bedrock.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_burn_in_live.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_context_builder.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_judge_persistence.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_lint_no_top_level_run_limits.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_lint_runner.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_llm_judge_criterion.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_log_tail_buffer.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_logging.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_logging_isolation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_merge_characterization.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_merge_strategy_annotations.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_merge_unification.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_mutations.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_new_criteria.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_node_env_config.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_optional_dependencies.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_orchestrator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_orchestrator_error_log_tail.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_orchestrator_telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_overrides_engine.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_parallel.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_path_utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_plan_command.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_plugin_processing.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_plugins.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_post_run.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_pr_review_workflow.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_pre_run.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_preservation_mode.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_pricing_registry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_comparison_scoring.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_evaluator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_missing_file.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reference_orchestrator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_registry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_replicate_stats.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports_experiment.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports_html.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports_stats.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_reports_stats_nonfinite.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_resolve_task_files.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_resume.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_retry_logic_comprehensive.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_routing.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_run_command_stdout.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_run_limits_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_run_limits_orchestrator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_run_limits_resolver.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_runtime_tool_versions.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_layer_builder.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_optional.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_security.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_symlink_preservation.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sandbox_templates.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_scorers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_scoring_quality.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sdk_option_classification.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_simulation_integration.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_simulation_termination.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_simulation_trials.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_skill_triggered.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_agent_integration.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_batch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_callbacks.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_cli.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_events.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_orchestrator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_renderers.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_streaming_wire.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_sub_agent_runner.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_success_criterion_union.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_suite_rollup.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_summaries.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_tags.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_task_definition_unknown_fields.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_teardown_interrupt.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_telemetry.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_template_env_expansion.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_threshold_enforcement.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_batch.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_categorization.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_exceptions.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_models.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_timeout_orchestrator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_token_usage.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_uipath_eval.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_user_simulator.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_utils.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_utterance_extraction.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_variant_prompt_file.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_verdict_tool.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_watchdog.py +0 -0
- {coder_eval-0.8.9 → coder_eval-0.8.10}/tests/test_yaml_migration.py +0 -0
|
@@ -27,6 +27,22 @@ Deferred lint/test guardrails surfaced during reviews. Promote to a `CExxx` rule
|
|
|
27
27
|
reachable (needs a live run).
|
|
28
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
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
|
+
|
|
30
46
|
## From 2026-07-03 open-source docs cleanup
|
|
31
47
|
|
|
32
48
|
- [ ] **Dead-relative-link checker for `docs/**/*.md`** — resolve every relative
|
|
@@ -10,12 +10,17 @@ name: Docs
|
|
|
10
10
|
# Source: "Deploy from a branch" → branch `gh-pages` / `/ (root)`. That's the same
|
|
11
11
|
# (legacy, branch-based) configuration uipath-python already runs on.
|
|
12
12
|
on:
|
|
13
|
-
push:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
# Auto-publish on push is DISABLED: GitHub Pages is not yet enabled for this
|
|
14
|
+
# repo on uipath.github.io (org owner must switch it on once — Settings → Pages
|
|
15
|
+
# → Deploy from a branch → gh-pages / root). The published docs currently serve
|
|
16
|
+
# from coder-eval.com/docs (synced separately by the website), so the gh-pages
|
|
17
|
+
# deploy is not needed yet. Re-enable by uncommenting the `push:` trigger below.
|
|
18
|
+
# push:
|
|
19
|
+
# branches: [main]
|
|
20
|
+
# paths:
|
|
21
|
+
# - "docs/**"
|
|
22
|
+
# - "mkdocs.yml"
|
|
23
|
+
# - ".github/workflows/docs.yml"
|
|
19
24
|
workflow_dispatch:
|
|
20
25
|
|
|
21
26
|
permissions:
|
|
@@ -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
|
|
@@ -182,23 +182,50 @@ jobs:
|
|
|
182
182
|
echo "version=$V" >> "$GITHUB_OUTPUT"
|
|
183
183
|
echo "Publishing version: $V"
|
|
184
184
|
|
|
185
|
-
- name: Regenerate uv.lock and amend release commit
|
|
185
|
+
- name: Regenerate uv.lock, bump action.yml pin, and amend release commit
|
|
186
186
|
if: steps.mode.outputs.prerelease != 'true' && steps.release.outputs.version != ''
|
|
187
|
+
env:
|
|
188
|
+
# Passed via env (not interpolated into the script) per GitHub's
|
|
189
|
+
# injection guidance.
|
|
190
|
+
VERSION: ${{ steps.release.outputs.version }}
|
|
187
191
|
run: |
|
|
192
|
+
set -euo pipefail
|
|
193
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
194
|
+
git config user.name "github-actions[bot]"
|
|
195
|
+
# Bump the composite action's default `version:` pin to the just-released
|
|
196
|
+
# version so `UiPath/coder_eval@vX.Y.Z` installs `coder-eval==X.Y.Z`. The
|
|
197
|
+
# anchor is indentation-tolerant and keyed on the unique trailing
|
|
198
|
+
# "# <-- kept in sync" comment; the grep guard fails the release loudly
|
|
199
|
+
# if a reformat ever detaches it (rather than shipping a stale pin).
|
|
200
|
+
sed -i -E 's/^([[:space:]]*default: ")[0-9]+\.[0-9]+\.[0-9]+(" # <-- kept in sync)/\1'"${VERSION}"'\2/' action.yml
|
|
201
|
+
grep -q "default: \"${VERSION}\"" action.yml || { echo "action.yml version bump failed"; exit 1; }
|
|
202
|
+
git add action.yml
|
|
203
|
+
# Regenerate the lock too; stage it (a no-op if unchanged).
|
|
188
204
|
uv lock
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
git add uv.lock
|
|
205
|
+
git add uv.lock
|
|
206
|
+
# Amend only if action.yml/uv.lock actually changed the tree.
|
|
207
|
+
if ! git diff --cached --quiet; then
|
|
193
208
|
git commit --amend --no-edit
|
|
194
209
|
# Amend replaced the commit the tag points at; re-point it before pushing.
|
|
195
|
-
git tag -f "v${
|
|
210
|
+
git tag -f "v${VERSION}"
|
|
196
211
|
fi
|
|
197
212
|
|
|
198
213
|
- name: Push release commit and tags
|
|
199
214
|
if: steps.mode.outputs.prerelease != 'true' && steps.release.outputs.version != ''
|
|
200
215
|
run: git push origin main "v${{ steps.release.outputs.version }}"
|
|
201
216
|
|
|
217
|
+
- name: Move major action tag (vN -> this release)
|
|
218
|
+
if: steps.release.outputs.version != ''
|
|
219
|
+
env:
|
|
220
|
+
VERSION: ${{ steps.release.outputs.version }}
|
|
221
|
+
run: |
|
|
222
|
+
set -euo pipefail
|
|
223
|
+
# Consumers pin `UiPath/coder_eval@v0` (becomes `@v1` at 1.0.0). Force-move
|
|
224
|
+
# the moving major tag to this release. Force on a missing tag creates it.
|
|
225
|
+
MAJOR="v${VERSION%%.*}"
|
|
226
|
+
git tag -f "$MAJOR" "v${VERSION}"
|
|
227
|
+
git push -f origin "$MAJOR"
|
|
228
|
+
|
|
202
229
|
- name: Build wheel + sdist
|
|
203
230
|
if: steps.ver.outputs.version != ''
|
|
204
231
|
run: uv build
|
|
@@ -2,6 +2,121 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.8.10 (2026-07-24)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- Remove dead SimulationConfig.parallel_trials; add CE031 to guard the class
|
|
10
|
+
([`947acd3`](https://github.com/UiPath/coder_eval/commit/947acd34a4f0451c69cb7bf0eb863127b9995f76))
|
|
11
|
+
|
|
12
|
+
- **early-stop**: Add stop_when 'auto' — per-instance arming + pass-armed-subset stop rule
|
|
13
|
+
([#51](https://github.com/UiPath/coder_eval/pull/51),
|
|
14
|
+
[`08e21e6`](https://github.com/UiPath/coder_eval/commit/08e21e67b67fdab84d26b8a0e5551e04289d92a8))
|
|
15
|
+
|
|
16
|
+
- **early-stop**: Defer fail-stop while a pass-armed criterion is undecided
|
|
17
|
+
([#51](https://github.com/UiPath/coder_eval/pull/51),
|
|
18
|
+
[`08e21e6`](https://github.com/UiPath/coder_eval/commit/08e21e67b67fdab84d26b8a0e5551e04289d92a8))
|
|
19
|
+
|
|
20
|
+
- **early-stop**: Return assert_never explicitly to satisfy CodeQL
|
|
21
|
+
([#51](https://github.com/UiPath/coder_eval/pull/51),
|
|
22
|
+
[`08e21e6`](https://github.com/UiPath/coder_eval/commit/08e21e67b67fdab84d26b8a0e5551e04289d92a8))
|
|
23
|
+
|
|
24
|
+
- **reports**: Code review fixes for the JUnit CI gate
|
|
25
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
26
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
27
|
+
|
|
28
|
+
- **reports**: JUnit CI-gate review fixes + CE027 env-var lint
|
|
29
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
30
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
31
|
+
|
|
32
|
+
- **reports**: Make skipped-task JUnit names platform-independent
|
|
33
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
34
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
35
|
+
|
|
36
|
+
### Chores
|
|
37
|
+
|
|
38
|
+
- Re-trigger CI (GitHub dropped the force-push event)
|
|
39
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
40
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
41
|
+
|
|
42
|
+
- **deps**: Lock defusedxml (dev-only, test-side XML parsing)
|
|
43
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
44
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
45
|
+
|
|
46
|
+
### Continuous Integration
|
|
47
|
+
|
|
48
|
+
- Disable Docs gh-pages auto-publish on push (Pages not enabled yet)
|
|
49
|
+
([`c289d46`](https://github.com/UiPath/coder_eval/commit/c289d46c5cec269f205224e4dfce27affab5557e))
|
|
50
|
+
|
|
51
|
+
### Documentation
|
|
52
|
+
|
|
53
|
+
- 1/8 — add DATASETS.md and a task-schema dataset: section
|
|
54
|
+
([`e3d37ac`](https://github.com/UiPath/coder_eval/commit/e3d37ac793e6f12c020b71a4ed19df2279b4b2c1))
|
|
55
|
+
|
|
56
|
+
- 2/8 — retire BYOD.md into DOCKER_ISOLATION.md
|
|
57
|
+
([`1a4a2a5`](https://github.com/UiPath/coder_eval/commit/1a4a2a5893639d14832dbd1614163aa7c18bf70a))
|
|
58
|
+
|
|
59
|
+
- 3/8 — one complete run_limits reference; document skip
|
|
60
|
+
([`bcb7e24`](https://github.com/UiPath/coder_eval/commit/bcb7e24132c229114efe9a38281a37e736d83312))
|
|
61
|
+
|
|
62
|
+
- 4/8 — add DIALOG_MODE.md and correct four stale simulation claims
|
|
63
|
+
([`18dcbe9`](https://github.com/UiPath/coder_eval/commit/18dcbe95d156856149538406ededc8c75ec594f8))
|
|
64
|
+
|
|
65
|
+
- 5/8 — fix prompt_mutations example; add CE029
|
|
66
|
+
([`b524009`](https://github.com/UiPath/coder_eval/commit/b5240099c58f5b50c7b5fe531a12f1f8b98aec29))
|
|
67
|
+
|
|
68
|
+
- 7/8 — generate flat indexes from the mkdocs nav; add CE028
|
|
69
|
+
([`1514bcb`](https://github.com/UiPath/coder_eval/commit/1514bcb8f075ed48f2857a84269513c60878ea81))
|
|
70
|
+
|
|
71
|
+
- Add CI Gate reference (GitHub Action + JUnit) and wire into indexes
|
|
72
|
+
([`b8c6301`](https://github.com/UiPath/coder_eval/commit/b8c63018bd93ba91751511d95f4af96a444d9873))
|
|
73
|
+
|
|
74
|
+
- Agent guides, extending & report-schema references, and fixes
|
|
75
|
+
([`ce74824`](https://github.com/UiPath/coder_eval/commit/ce74824bde2b5322dc745bace045e1806f77324b))
|
|
76
|
+
|
|
77
|
+
- Fold nav long tail into one Advanced group; align index ordering
|
|
78
|
+
([`e2ff053`](https://github.com/UiPath/coder_eval/commit/e2ff0539af8c9e3e6deb85c0a0124c0232224033))
|
|
79
|
+
|
|
80
|
+
- Point docs links to coder-eval.com/docs; drop Ruff badge
|
|
81
|
+
([`60430e5`](https://github.com/UiPath/coder_eval/commit/60430e5e857f0af6fbf08cde00f0621de4610562))
|
|
82
|
+
|
|
83
|
+
- Point pyproject Documentation URL to coder-eval.com/docs
|
|
84
|
+
([`be39df2`](https://github.com/UiPath/coder_eval/commit/be39df23c8ba1a0f6f945dc99e3827eb5d6f2772))
|
|
85
|
+
|
|
86
|
+
- Reword CODER_EVAL_RAW_SDK_LOG to prose form (satisfy CE027)
|
|
87
|
+
([`d7d5b59`](https://github.com/UiPath/coder_eval/commit/d7d5b59b990127810fcfe33272f3ff733a9498cd))
|
|
88
|
+
|
|
89
|
+
- Use the brand name "Coder Eval" in prose and titles
|
|
90
|
+
([`821f11b`](https://github.com/UiPath/coder_eval/commit/821f11bf94762f6578913090568f5b092e237596))
|
|
91
|
+
|
|
92
|
+
### Features
|
|
93
|
+
|
|
94
|
+
- Packaged CI gate — JUnit XML output + composite GitHub Action
|
|
95
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
96
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
97
|
+
|
|
98
|
+
- **action**: Generic env passthrough + minimum-task-score gate
|
|
99
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
100
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
101
|
+
|
|
102
|
+
- **ci**: 3/3 — publish composite action, release automation, PR dogfood
|
|
103
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
104
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
105
|
+
|
|
106
|
+
- **cli**: 2/3 — wire run --junit-xml and report -f junit
|
|
107
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
108
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
109
|
+
|
|
110
|
+
- **reports**: 1/3 — add reports_junit.py disk-driven JUnit XML writer
|
|
111
|
+
([#37](https://github.com/UiPath/coder_eval/pull/37),
|
|
112
|
+
[`74db6fa`](https://github.com/UiPath/coder_eval/commit/74db6facfea6f898af4db6709e563d90af0d7b30))
|
|
113
|
+
|
|
114
|
+
### Testing
|
|
115
|
+
|
|
116
|
+
- 6/8 — CE030 documents-or-exempts model fields
|
|
117
|
+
([`c9a3b16`](https://github.com/UiPath/coder_eval/commit/c9a3b160deeec385386a7009812025bc26021363))
|
|
118
|
+
|
|
119
|
+
|
|
5
120
|
## v0.8.9 (2026-07-23)
|
|
6
121
|
|
|
7
122
|
### Bug Fixes
|
|
@@ -20,6 +20,7 @@ coder_eval/
|
|
|
20
20
|
├── orchestrator.py # Main evaluation loop
|
|
21
21
|
├── reports.py # Markdown/JSON report generation (run-level + per-suite rollup via write_suite_rollups)
|
|
22
22
|
├── reports_experiment.py # Experiment/cross-variant report generation
|
|
23
|
+
├── reports_junit.py # JUnit XML report from a finalized run dir (run.json spine; for CI test-report ingestion)
|
|
23
24
|
├── analysis.py # Command statistics aggregation
|
|
24
25
|
├── logging_config.py # Structured logging setup
|
|
25
26
|
├── path_utils.py # Run ID generation, path utilities
|
|
@@ -120,6 +121,7 @@ tasks/ # Task definition YAML files
|
|
|
120
121
|
tests/ # Test suite
|
|
121
122
|
docs/ # Documentation
|
|
122
123
|
templates/ # Sandbox template directories
|
|
124
|
+
action.yml # Published composite GitHub Action (coder-eval as a CI gate). release.yml maintains its `version:` default + the moving `v<major>` tag.
|
|
123
125
|
```
|
|
124
126
|
|
|
125
127
|
## Key Architectural Patterns
|
|
@@ -139,7 +141,7 @@ templates/ # Sandbox template directories
|
|
|
139
141
|
- **Reconciliation message (stream self-reconciles to the turn total)**: The per-message stream consistently under-reports the authoritative turn total — a fixed prompt slice (~512 input tokens on Claude) is billed on no SDK-emitted message, and sub-agent input/cache only partially bubbles up. So `EventCollector.build_turn_record` appends one synthetic `ReconciliationMessage` (`role="reconciliation"`, in the `TranscriptMessage` union) per turn, carrying the per-bucket residual = `token_usage` − Σ(assistant message buckets). The invariant: **summing the four token buckets across `TurnRecord.messages` (assistant + reconciliation) equals `token_usage` exactly**, for both Claude and Codex (Codex's stream is already complete after `_recover_subagent_tool_calls`, so its residual is usually 0 and no entry is emitted). This is what lets the evalboard SUM the message stream as the source of truth instead of reading a separate aggregate ("agent tokens"): `selectTokenTotals` returns the stream sum whenever a reconciliation entry is present, and the timeline renders it as its own row. It is agent-agnostic (booked at the single `EventCollector` seam), carries no cost (cost stays on `token_usage`), and is excluded from generation/turn counts and the cost simulator. The Python `token_usage`/`total_token_usage` aggregate is unchanged and still authoritative for budget/judges/reports.
|
|
140
142
|
- **sandbox isolation**: Tasks that don't need MCP servers should set `setting_sources: []` in their `agent:` block to isolate the sandbox from the host project's CLAUDE.md and settings. Without this, the host project's CLAUDE.md (often 20 KB+) is injected into every API call, inflating cache-creation tokens and cost significantly.
|
|
141
143
|
- **Run-time caps (non-criterion enforcement)**: `TaskDefinition.run_limits` (`RunLimits` model) is the single namespace for all run-time caps — `max_turns` / `task_timeout` / `turn_timeout` (structural) and `max_input_tokens` / `max_output_tokens` / `max_total_tokens` / `max_usd` (cumulative budget). Token/USD breaches abort with `FinalStatus.TOKEN_BUDGET_EXCEEDED` or `COST_BUDGET_EXCEEDED` (both `category == "failed"`). Structural caps are set from the CLI via `-D run_limits.max_turns=…` / `-D run_limits.task_timeout=…` / `-D run_limits.turn_timeout=…` (field-merged into `run_limits`); budget caps via `-D run_limits.max_usd=…` etc. or YAML. Layered config uses field-merge — a variant block overrides individual keys without replacing the task's block.
|
|
142
|
-
- **Early stop on criterion (opt-in)**: `run_limits.stop_early` (default off) ends a single-shot Claude run early once the run's **armed** criteria are decided, so a raised `max_turns` isn't wasted on the smoke flavor. A criterion is armed by `stop_when: pass|fail|decided`; only criteria that can decide from a partial trajectory may arm (
|
|
144
|
+
- **Early stop on criterion (opt-in)**: `run_limits.stop_early` (default off) ends a single-shot Claude run early once the run's **armed** criteria are decided, so a raised `max_turns` isn't wasted on the smoke flavor. A criterion is armed by `stop_when: pass|fail|decided|auto`; only criteria that can decide from a partial trajectory may arm (non-empty `live_stop_polarities` ClassVar + `live_verdict` override — currently `skill_triggered`, `command_executed`; CE025 keeps the two consistent). `decided` arms **both** polarities; `auto` arms whichever polarities **this instance** can decide — the value for dataset-fanned criteria whose positive/distractor role flips per row. Stop rule: the pass-stop fires when every **pass-armed** criterion live-passes (fail-armed distractors are not required to pass; zero pass-armed ⇒ never pass-stops); the fail-stop fires on the first fail-armed live-fail but is **deferred while any pass-armed criterion is undecided** — a distractor misfire must not truncate a positive row's recall signal, so the latched misfire fires once the positives resolve (or the run continues to the cap). A fail-stop is therefore verdict-preserving; a pass-stop can miss a *later* distractor misfire, so authoritative P/R/F1 comes from a `stop_early: false` run. Driven by `orchestration/early_stop.py::EarlyStopWatcher` through the Claude agent's cooperative `should_stop` seam (tool-call granularity, no SIGKILL); live verdicts only *trigger* the stop — the standard `check_all` on the frozen trajectory is authoritative. An early-stopped run gates on the **armed subset** (`EvaluationResult.armed_criteria_passed`); a completed run gates on the full set. Every unsupported use is a hard error at resolution (plan *and* run), and a runtime verdict bug **fails open** to a full run. Surfaces: `EarlyStopInfo`, report notes/badges, `stopped_early` run.json rows, `EarlyStopped`/`EarlyStopReason` telemetry dims. Worked rationale: docs/TASK_DEFINITION_GUIDE.md § `stop_early`. Defaults off ⇒ behavior byte-for-behavior unchanged.
|
|
143
145
|
|
|
144
146
|
## Success Criteria (14 types)
|
|
145
147
|
|
|
@@ -160,7 +162,7 @@ templates/ # Sandbox template directories
|
|
|
160
162
|
| `llm_judge` | Continuous | LLM grades artifacts + optional trajectory + optional reference; routes through the run's backend (Bedrock / Anthropic) |
|
|
161
163
|
| `agent_judge` | Continuous | Spawns a Claude Code SDK agent in an isolated sandbox copy; judge uses tools (Bash/Read/Grep/…) to investigate and returns a JSON verdict. Expensive; runs with evaluator credentials — see SECURITY note in the criterion docstring. |
|
|
162
164
|
|
|
163
|
-
All criteria support `weight` (default 1.0) and `pass_threshold` (default 0.9), plus `stop_when` (`pass`/`fail`/`decided`, default `null`) which arms the criterion for early stop when `run_limits.stop_early` is set (observable criteria only). On dataset-backed tasks, criteria may also set `suite_thresholds: {metric: min_value}` — the suite gate passes iff every listed metric (from the criterion's `aggregate()` output) meets its minimum.
|
|
165
|
+
All criteria support `weight` (default 1.0) and `pass_threshold` (default 0.9), plus `stop_when` (`pass`/`fail`/`decided`/`auto`, default `null`) which arms the criterion for early stop when `run_limits.stop_early` is set (observable criteria only; `auto` arms the instance's own decidable polarities). On dataset-backed tasks, criteria may also set `suite_thresholds: {metric: min_value}` — the suite gate passes iff every listed metric (from the criterion's `aggregate()` output) meets its minimum.
|
|
164
166
|
|
|
165
167
|
## Evaluation Flow
|
|
166
168
|
|
|
@@ -193,11 +195,17 @@ make format # ruff format
|
|
|
193
195
|
make check # ruff check (lint)
|
|
194
196
|
make typecheck # pyright
|
|
195
197
|
make test # pytest
|
|
196
|
-
make lint # custom architectural lint rules (CE001
|
|
198
|
+
make lint # custom architectural lint rules (CE001+)
|
|
197
199
|
make verify # All of the above + coverage check (CI equivalent)
|
|
198
200
|
```
|
|
199
201
|
|
|
200
|
-
When fixing a bug, ask: *could a custom lint rule have prevented this?* If the root cause is a mechanically detectable pattern (e.g., "always import from `coder_eval.models`", "never call blocking IO in async"), add a rule to `tests/lint/rules/` following the CE001
|
|
202
|
+
When fixing a bug, ask: *could a custom lint rule have prevented this?* If the root cause is a mechanically detectable pattern (e.g., "always import from `coder_eval.models`", "never call blocking IO in async"), add a rule to `tests/lint/rules/` following the CE001+ pattern and wire it up in `tests/lint/runner.py`. This turns a one-time fix into permanent enforcement. See `tests/test_custom_lint.py` for how rules are tested. (Doc-surface / whole-tree rules that reason over Markdown/YAML or the entire `src/` tree rather than one `.py` AST at a time — CE027–CE031 — are not `BaseRule`s in the runner; they are wired as dedicated `@pytest.mark.lint` test classes. CE031 guards against dead config: a behavior-driving field on `SimulationConfig`/`RunLimits`/`Dataset` that no code reads by name.)
|
|
203
|
+
|
|
204
|
+
Adding a user-facing field to one of the models CE030 tracks (`TaskDefinition`, `RunLimits`, `Dataset`, `SimulationConfig` — see `tests/lint/doc_schema_parity.py`) means documenting it in its guide (mention the field name as inline code) or adding an `EXEMPT` entry with a reason it is not user-authored. `make lint` fails otherwise.
|
|
205
|
+
|
|
206
|
+
**Docs index SSOT.** `nav:` plus `extra.docs_index` (blurbs) in `mkdocs.yml` are the single source of truth for the flat index surfaces — `README.md`'s Documentation table, `docs/index.md`'s "Where to go next" table, and the `## Docs` / `## Tutorials` sections of `docs/llms.txt`. Regenerate all three with `make docs-indexes`; **CE028** fails the build if any drifts, if a nav page lacks a blurb (or vice-versa), or if a `docs/*.md` page is missing from the nav. The website sidebar derives from the same `nav:`. When adding or renaming a docs page, edit `nav:` + `extra.docs_index` and run `make docs-indexes` — never hand-edit the generated tables (they sit between `<!-- docs-index:start -->` / `<!-- docs-index:end -->` markers).
|
|
207
|
+
|
|
208
|
+
**Anchor slugger convention.** The docs are rendered by three sluggers (GitHub, Starlight/github-slugger on coder-eval.com, and python-markdown/mkdocs), which disagree on headings containing `&` or punctuation (`api-routing--benchmarking` vs `api-routing-benchmarking`). Prefer punctuation-free headings so all three agree; if a heading needs `&`, add a GitHub-form `<a id="…"></a>` shim above it and link that form. Verify a new intra-doc anchor link resolves in the built HTML (`mkdocs build`), not by eye.
|
|
201
209
|
|
|
202
210
|
## Configuration
|
|
203
211
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.PHONY: help install format check typecheck test test-live test-smoke verify verify-noextra clean run lint docker-image docker-image-full coder-eval-runtime docker-images
|
|
1
|
+
.PHONY: help install format check typecheck test test-live test-smoke verify verify-noextra clean run lint docs-indexes docker-image docker-image-full coder-eval-runtime docker-images
|
|
2
2
|
|
|
3
3
|
# Single source of the installed coder-eval version (used to tag the docker
|
|
4
4
|
# images). Referenced lazily inside the docker recipes, so it doesn't run on
|
|
@@ -24,6 +24,9 @@ check: ## Run linting checks
|
|
|
24
24
|
lint: ## Run custom architectural lint rules (CE001+)
|
|
25
25
|
uv run pytest tests/test_custom_lint.py -v --tb=short --no-header -p no:warnings
|
|
26
26
|
|
|
27
|
+
docs-indexes: ## Regenerate README/docs indexes from the mkdocs nav (SSOT)
|
|
28
|
+
uv run python -m tests.lint.doc_indexes
|
|
29
|
+
|
|
27
30
|
typecheck: ## Run type checking with pyright
|
|
28
31
|
uv run pyright
|
|
29
32
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coder-eval
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.10
|
|
4
4
|
Summary: Evaluate, benchmark, and A/B-test AI coding agents (Claude Code, Codex, Gemini/Antigravity) with sandboxed, reproducible YAML task suites.
|
|
5
5
|
Project-URL: Homepage, https://coder-eval.com
|
|
6
6
|
Project-URL: Repository, https://github.com/UiPath/coder_eval
|
|
7
|
-
Project-URL: Documentation, https://
|
|
7
|
+
Project-URL: Documentation, https://coder-eval.com/docs
|
|
8
8
|
Project-URL: Issues, https://github.com/UiPath/coder_eval/issues
|
|
9
9
|
Project-URL: Changelog, https://github.com/UiPath/coder_eval/blob/main/CHANGELOG.md
|
|
10
10
|
Author-email: UiPath <coder-eval@uipath.com>
|
|
@@ -46,6 +46,7 @@ Provides-Extra: codex
|
|
|
46
46
|
Requires-Dist: openai-codex>=0.144.4; extra == 'codex'
|
|
47
47
|
Provides-Extra: dev
|
|
48
48
|
Requires-Dist: bandit[toml]>=1.9.4; extra == 'dev'
|
|
49
|
+
Requires-Dist: defusedxml>=0.7.1; extra == 'dev'
|
|
49
50
|
Requires-Dist: mcp>=1.28.1; extra == 'dev'
|
|
50
51
|
Requires-Dist: pip-audit>=2.10.0; extra == 'dev'
|
|
51
52
|
Requires-Dist: pre-commit>=4.5.1; extra == 'dev'
|
|
@@ -64,11 +65,10 @@ Description-Content-Type: text/markdown
|
|
|
64
65
|
|
|
65
66
|
[](https://pypi.org/project/coder-eval/)
|
|
66
67
|
[](https://coder-eval.com)
|
|
67
|
-
[](https://coder-eval.com/docs)
|
|
68
69
|
[](LICENSE)
|
|
69
70
|
[](https://www.python.org/downloads/)
|
|
70
71
|
[](https://github.com/UiPath/coder_eval/actions/workflows/pr-checks.yml)
|
|
71
|
-
[](https://github.com/astral-sh/ruff)
|
|
72
72
|
|
|
73
73
|
**Coder Eval** (`pip install coder-eval` / `uv tool install coder-eval`) is an open-source framework for
|
|
74
74
|
**evaluating and benchmarking AI coding agents and their skills** — built for CLI
|
|
@@ -84,8 +84,8 @@ prompt), or **gate CI on coding-agent quality**. Unlike fixed datasets (SWE-benc
|
|
|
84
84
|
SkillsBench) that rank models on a shared leaderboard, Coder Eval evaluates the
|
|
85
85
|
tasks, skills, and workflows *you* ship — with weighted 0.0–1.0 criteria, a
|
|
86
86
|
`skill_triggered` activation check, an A/B experiment layer, and per-tool cost
|
|
87
|
-
telemetry. See [How it compares](https://
|
|
88
|
-
📚 **Full docs:** **[
|
|
87
|
+
telemetry. See [How it compares](https://coder-eval.com/docs/comparison).
|
|
88
|
+
📚 **Full docs:** **[coder-eval.com/docs](https://coder-eval.com/docs)**.
|
|
89
89
|
|
|
90
90
|
<p align="center">
|
|
91
91
|
<img src="docs/assets/hero.gif" alt="Coder Eval running the hello_date task: a sandboxed agent writes and runs a script from a YAML task, then the scored result is browsed in evalboard" width="100%">
|
|
@@ -111,7 +111,7 @@ telemetry. See [How it compares](https://uipath.github.io/coder_eval/comparison/
|
|
|
111
111
|
> **Keeping skills fresh?** Run Coder Eval as a scheduled GitHub Actions job so your
|
|
112
112
|
> skills are continuously re-evaluated against the latest model — a skill that quietly
|
|
113
113
|
> stops triggering surfaces as a failing criterion before your users hit it. See
|
|
114
|
-
> **[Tutorial 02 — Running
|
|
114
|
+
> **[Tutorial 02 — Running Coder Eval in CI](docs/tutorials/02-ci-pipeline.md)**.
|
|
115
115
|
|
|
116
116
|
## Quick Start
|
|
117
117
|
|
|
@@ -155,9 +155,77 @@ To add it as a project dependency instead: `uv add coder-eval` or
|
|
|
155
155
|
`pip install coder-eval`. In a real CI gate, pin to a specific released version
|
|
156
156
|
so a harness upgrade can't silently move your results. (The example `tasks/`
|
|
157
157
|
live in this repo — clone it or point the CLI at your own task files.) See
|
|
158
|
-
[Tutorial 02 — Running
|
|
158
|
+
[Tutorial 02 — Running Coder Eval in CI](docs/tutorials/02-ci-pipeline.md) for
|
|
159
159
|
the full setup.
|
|
160
160
|
|
|
161
|
+
## Use as a GitHub Action
|
|
162
|
+
|
|
163
|
+
A composite action at the repo root runs `coder-eval` as a CI gate — it installs
|
|
164
|
+
the pinned CLI, runs your tasks, writes a JUnit XML report, appends `run.md` to
|
|
165
|
+
the job summary, and fails the step on any task/gate failure:
|
|
166
|
+
|
|
167
|
+
```yaml
|
|
168
|
+
- uses: UiPath/coder_eval@v0 # becomes @v1 once 1.0.0 ships; @vX.Y.Z pins exactly
|
|
169
|
+
with:
|
|
170
|
+
tasks: tests/tasks/**/*.yaml
|
|
171
|
+
model: claude-sonnet-5
|
|
172
|
+
env: |
|
|
173
|
+
ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
| Input | Default | Purpose |
|
|
177
|
+
| --- | --- | --- |
|
|
178
|
+
| `tasks` | *(all `tasks/`)* | Task YAML path(s)/glob |
|
|
179
|
+
| `tags` | — | `--tags` filter |
|
|
180
|
+
| `model` | — | `--model` override |
|
|
181
|
+
| `extra-args` | — | Verbatim extra args (`--experiment`, `-D …`, …) |
|
|
182
|
+
| `version` | pinned release | PyPI version, or `local` to install from the checkout |
|
|
183
|
+
| `run-dir` | `runs/ci` | Run directory |
|
|
184
|
+
| `junit-path` | `coder-eval-junit.xml` | Where to write the JUnit report |
|
|
185
|
+
| `step-summary` | `true` | Append `run.md` to the job summary |
|
|
186
|
+
| `env` | — | Credentials/backend passthrough: newline-separated `NAME=VALUE` pairs, exported for the run step only |
|
|
187
|
+
| `minimum-task-score` | *(off)* | Strict floor (0.0–1.0): fail the step if any task's `weighted_score` is below it |
|
|
188
|
+
|
|
189
|
+
Outputs: `run-dir` and `junit-path`. Feed the JUnit file to your platform's
|
|
190
|
+
test-report renderer — e.g. on GitHub Actions with
|
|
191
|
+
[`mikepenz/action-junit-report`](https://github.com/mikepenz/action-junit-report):
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
- uses: mikepenz/action-junit-report@v5
|
|
195
|
+
if: always()
|
|
196
|
+
with:
|
|
197
|
+
report_paths: coder-eval-junit.xml
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Credentials and backend config** are the sole responsibility of `env` — a
|
|
201
|
+
passthrough exported for the run step only (never written to `$GITHUB_ENV`, so
|
|
202
|
+
it can't leak into later steps). Set whatever the run needs, Anthropic or not:
|
|
203
|
+
|
|
204
|
+
```yaml
|
|
205
|
+
- uses: UiPath/coder_eval@v0
|
|
206
|
+
with:
|
|
207
|
+
tasks: tests/tasks/**/*.yaml
|
|
208
|
+
minimum-task-score: "0.8" # fail the build if any task scores below 0.8
|
|
209
|
+
env: |
|
|
210
|
+
API_BACKEND=bedrock
|
|
211
|
+
AWS_BEARER_TOKEN_BEDROCK=${{ secrets.BEDROCK_TOKEN }}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
`minimum-task-score` is a strict floor **on top of** coder-eval's own exit
|
|
215
|
+
code: the step fails if *either* coder-eval exits non-zero *or* any task's
|
|
216
|
+
`weighted_score` falls below the floor. Leave it unset to gate on the exit code
|
|
217
|
+
alone.
|
|
218
|
+
|
|
219
|
+
> **Agent runtime is the caller's responsibility.** The action is agent-agnostic —
|
|
220
|
+
> it installs `coder-eval` but no coding-agent runtime. Tasks using the default
|
|
221
|
+
> `claude-code` agent need the `claude` CLI on `PATH` (`actions/setup-node` +
|
|
222
|
+
> `npm install -g @anthropic-ai/claude-code`) in the job before the action runs.
|
|
223
|
+
|
|
224
|
+
> **Security.** Evaluated tasks execute agent-generated code. Do **not** run this
|
|
225
|
+
> action under `pull_request_target` with secrets exposed to untrusted fork PRs —
|
|
226
|
+
> use `pull_request` and gate on the same-repo condition, as this repo's own
|
|
227
|
+
> dogfood job does.
|
|
228
|
+
|
|
161
229
|
## Telemetry
|
|
162
230
|
|
|
163
231
|
> 📊 **Usage telemetry is on by default.** `coder-eval` sends **anonymous** usage
|
|
@@ -170,15 +238,27 @@ the full setup.
|
|
|
170
238
|
|
|
171
239
|
## Documentation
|
|
172
240
|
|
|
241
|
+
<!-- docs-index:start -->
|
|
173
242
|
| Guide | What's in it |
|
|
174
243
|
| --- | --- |
|
|
175
244
|
| [Tutorials](docs/tutorials/README.md) | Step-by-step walkthroughs — start here |
|
|
176
245
|
| [User Guide](docs/USER_GUIDE.md) | Full CLI, configuration, output, and environment-variable reference |
|
|
177
246
|
| [Task Definition Guide](docs/TASK_DEFINITION_GUIDE.md) | The task-file schema — all criterion types, scoring, templates |
|
|
247
|
+
| [Claude Code](docs/agents/CLAUDE_CODE.md) | Configuring and running the default Claude Code agent |
|
|
248
|
+
| [Codex](docs/agents/CODEX.md) | Running the OpenAI Codex agent |
|
|
249
|
+
| [Antigravity (Gemini)](docs/agents/ANTIGRAVITY.md) | Running the Google Antigravity / Gemini agent |
|
|
178
250
|
| [A/B Experiments](docs/AB_EXPERIMENTS.md) | Compare models / tools / prompts across the same tasks |
|
|
179
|
-
| [Bring Your Own Dataset](docs/
|
|
180
|
-
| [
|
|
181
|
-
| [Docker Isolation](docs/DOCKER_ISOLATION.md) | The container sandbox driver |
|
|
251
|
+
| [Bring Your Own Dataset](docs/DATASETS.md) | Fan a single task out over a dataset |
|
|
252
|
+
| [Dialog Mode](docs/DIALOG_MODE.md) | Evaluate agents in multi-turn conversation via a simulated user |
|
|
253
|
+
| [Docker Isolation](docs/DOCKER_ISOLATION.md) | The container sandbox driver, with custom images |
|
|
254
|
+
| [CI Gate & GitHub Action](docs/CI_GATE.md) | Run Coder Eval as a CI gate — the packaged Action, JUnit output, score floor |
|
|
255
|
+
| [Extending Coder Eval](docs/EXTENDING.md) | Author a custom agent, criterion, or model pricing via the plugin SPI |
|
|
256
|
+
| [Report Schema](docs/REPORT_SCHEMA.md) | Field-level reference for run.json / variant.json / task.json |
|
|
257
|
+
| [How It Compares](docs/comparison.md) | vs. SWE-bench, SkillsBench, Harbor, OpenAI Evals, hand-rolled scripts |
|
|
258
|
+
<!-- docs-index:end -->
|
|
259
|
+
|
|
260
|
+
| Repo doc | What's in it |
|
|
261
|
+
| --- | --- |
|
|
182
262
|
| [CLAUDE.md](CLAUDE.md) | Architecture, key patterns, and extension points |
|
|
183
263
|
| [CONTRIBUTING.md](CONTRIBUTING.md) | Dev setup, quality bar, and how to contribute |
|
|
184
264
|
|
|
@@ -186,7 +266,7 @@ the full setup.
|
|
|
186
266
|
|
|
187
267
|
- **vs. fixed benchmarks (SWE-bench, SkillsBench)** — they score a canonical dataset;
|
|
188
268
|
Coder Eval scores *your* tasks with continuous 0.0–1.0 weighted criteria (and can
|
|
189
|
-
still wrap a fixed dataset via [Bring Your Own Dataset](docs/
|
|
269
|
+
still wrap a fixed dataset via [Bring Your Own Dataset](docs/DATASETS.md)).
|
|
190
270
|
- **vs. large-scale / RL harnesses (Harbor)** — Harbor targets scale and RL rollouts;
|
|
191
271
|
Coder Eval targets weighted, skill-aware suites gated in CI.
|
|
192
272
|
- **vs. model-output eval tools (OpenAI Evals)** — they grade model text; Coder Eval
|
|
@@ -194,7 +274,7 @@ the full setup.
|
|
|
194
274
|
- **vs. hand-rolled scripts** — reproducible sandboxes, weighted criteria,
|
|
195
275
|
cost/token telemetry, A/B experiments, and CI-ready pass/fail gates out of the box.
|
|
196
276
|
|
|
197
|
-
See the full [comparison — with sources](https://
|
|
277
|
+
See the full [comparison — with sources](https://coder-eval.com/docs/comparison).
|
|
198
278
|
|
|
199
279
|
## Task Definition
|
|
200
280
|
|