coder-eval 0.9.0__tar.gz → 0.9.1__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 → coder_eval-0.9.1}/CHANGELOG.md +8 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/PKG-INFO +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.1}/action.yml +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/agents/ANTIGRAVITY.md +4 -7
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/agents/CLAUDE_CODE.md +4 -3
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/agents/CODEX.md +1 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/pyproject.toml +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/__init__.py +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/agents/antigravity_agent.py +45 -12
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/agents/codex_agent.py +49 -14
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestration/early_stop.py +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_codex_agent_live.py +39 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_early_stop.py +530 -10
- {coder_eval-0.9.0 → coder_eval-0.9.1}/uv.lock +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/commands/coder-eval-code-review-full.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/commands/coder-eval-code-review-wf.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/commands/coder-eval-code-review.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/commands/coder-eval-create-plan.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/commands/coder-eval-implement-plan.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/commands/coder-eval-review.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/commands/coder-eval-run-analysis.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/commands/coder-eval-task-create.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/harness-candidates.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/shared/axes.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/shared/multi-model-review.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/shared/review-rubric.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/shared/run-layout.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/workflows/cr-axis.js +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.claude/workflows/cr-parent.js +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.env.example +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/CODEOWNERS +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/code_review.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/dependabot.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/pages-stub/index.html +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/scripts/release_notes.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/workflows/claude-pr-review.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/workflows/codeql.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/workflows/conventional-commits.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/workflows/docker-publish.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/workflows/docs.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/workflows/pr-checks.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/workflows/publish-testpypi.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.github/workflows/release.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.gitignore +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.pre-commit-config.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/.python-version +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/ADOPTERS.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/CLAUDE.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/CODE_OF_CONDUCT.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/CONTRIBUTING.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/LICENSE +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/Makefile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/NOTICE +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/SECURITY.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docker/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docker/Dockerfile.runtime +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docker/coder_eval_entrypoint.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docker/coder_eval_runtime_entrypoint.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/AB_EXPERIMENTS.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/CI_GATE.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/DATASETS.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/DIALOG_MODE.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/DOCKER_ISOLATION.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/EXTENDING.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/REPORT_SCHEMA.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/TASK_DEFINITION_GUIDE.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/USER_GUIDE.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/assets/hero.gif +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/comparison.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/index.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/llms.txt +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/tutorials/01-first-evaluation.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/tutorials/02-ci-pipeline.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/tutorials/03-evalboard-local.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/tutorials/04-writing-a-task.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/tutorials/05-comparing-models.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/tutorials/06-use-docker-isolation.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/docs/tutorials/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/.gitignore +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/col-help.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/collapsible-rail.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/harness-badge.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/harness-selector.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/scroll-table.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/search-box.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/unit-toggle.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/version-list.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_components/window-selector.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_overview/daily-chart.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_overview/tag-rail.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/_overview/window-summary.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/api/download/route.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/api/file/route.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/api/refresh/route.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/error.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/globals.css +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/icon.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/layout.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/page.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/path-to-ga/page.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/trends/actions.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/trends/page.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/trends/trends-view.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/watchlist/page.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/next-env.d.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/next.config.mjs +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/package.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/pnpm-lock.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/postcss.config.mjs +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/public/harness/antigravity.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/public/harness/claude-code.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/public/harness/codex.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/public/uipath.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/tailwind.config.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/tsconfig.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/vitest.config.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/evalboard/vitest.setup.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/experiments/default.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/experiments/early-stop-ab.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/experiments/model-comparison.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/experiments/permissions-smoke.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/experiments/plugin-comparison.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/experiments/prompt-mutations-example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/experiments/smoke_variants.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/litellm/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/litellm/litellm-config.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/litellm/start-litellm.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/mkdocs.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/osv-scanner.toml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/scripts/check_commit_msg.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/.gitattributes +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/agents/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/agents/_logging.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/agents/claude_code_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/agents/noop_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/agents/registry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/agents/watchdog.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/analysis.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/aggregate_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/console.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/evaluate_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/plan_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/report_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/run_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/run_helpers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/run_task_internal_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/cli/utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/agent_judge.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/base.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/classification_match.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/command_executed.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/commands_efficiency.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/file_check.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/file_contains.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/file_exists.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/file_matches_regex.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/json_check.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/llm_judge.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/reference_comparison.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/run_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/skill_triggered.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/criteria/uipath_eval.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/budget.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/categories.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/categorization.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/checker_misuse.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/executor.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/judge.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/retry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/errors/timeout.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/checker.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/judge_context.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/judge_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/judge_persistence.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/judge_usage.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/sub_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/summaries.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/evaluation/verdict_tool.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/formatting.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/isolation/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/isolation/docker_runner.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/logging_config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/agent_config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/container_paths.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/criteria.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/enums.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/experiment.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/judge.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/judge_defaults.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/limits.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/merge_strategy.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/mutations.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/results.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/routing.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/sandbox.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/tasks.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/models/templates.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestration/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestration/batch.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestration/config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestration/config_merge.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestration/evaluation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestration/experiment.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestration/overrides.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestration/task_loader.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/path_utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/plugins.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/pricing.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/py.typed +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/reports.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/reports_experiment.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/reports_html.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/reports_junit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/reports_stats.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/resources/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/resources/tags.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/sandbox.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/scoring/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/scoring/ast_similarity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/scoring/complexity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/scoring/quality.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/scoring/signature_similarity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/scoring/similarity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/scoring/token_similarity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/simulation/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/simulation/termination.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/simulation/user_simulator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/streaming/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/streaming/callbacks.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/streaming/collector.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/streaming/events.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/streaming/renderers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/streaming/wire.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/src/coder_eval/utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agentless_smoke_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/antigravity_hello_world.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/claude_hello_world.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/claude_hello_world_docker.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/claude_subagent_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/codex_hello_world.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/codex_parallel_commands.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/codex_skills_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/codex_string_utils.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/codex_subagent_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/subagent_bash_long_input.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/agents/subagent_merge_sort.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/byod_smoke_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/dataset_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/datasets/sentiment.jsonl +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/dockerfile_build_example/environment/input.txt +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/fibonacci_with_template.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/hello_date.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/inline_starter_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/internal/session_resumption.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/mock_path_dirs_smoke.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/sentiment_classification.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/smoke_agent_judge.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/smoke_budget_exceeded.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/smoke_llm_judge.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/smoke_negative_path.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/smoke_task_timeout.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/smoke_variants.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/test_sandbox.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tasks/token_check.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/templates/byod_smoke_test/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/templates/fibonacci-starter/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/templates/fibonacci-starter/src/main.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/templates/fibonacci-starter/tests/test_main.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/_scrub.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/report_snapshots/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/report_snapshots/run_full.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/_path_helpers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/conftest.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/fixtures/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/fixtures/mock_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/fixtures/text_stub_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/dead_config_fields.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/doc_env_parity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/doc_examples.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/doc_indexes.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/doc_schema_parity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/base.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/no_agent_timing_access.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/no_silent_except.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/no_submodule_model_imports.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/open_explicit_encoding.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/register_criterion_required.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/runner.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/lint/violation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_action_version_pin.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent_config_no_timing_fields.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent_config_optional_type.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent_config_registry_dispatch.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent_config_sdk_decoupling.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent_golden_master.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent_judge_criterion.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent_telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent_telemetry_advanced.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agent_timeout.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_agentless.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_aggregate.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_antigravity_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_byoa_plugin.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_byoa_plugin_live.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_byod_feature.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_check_all_async.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_checker_logging.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_classification_match.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_claude_settings_enforcement_live.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_cleanup_preservation_guard.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_cli_backend_flag.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_cli_empty_glob.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_cli_sdk_options.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_cli_set_overrides.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_cli_telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_cli_type_flag.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_code_review_bugs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_codex_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_codex_agent_unit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_codex_token_mapping.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_command_executed.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_command_statistics.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_command_telemetry_result_data.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_commands_efficiency.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_config_lineage.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_config_merge_engine.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_config_precedence.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_continuous_scoring.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_criterion_result_round_trip.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_custom_lint.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_dataset_expansion.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_debug_logging.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_docker_build_failure.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_docker_litellm_env.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_docker_runner_container_death.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_docker_runner_mounts.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_docker_runner_stream_limit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_docker_wildcard_env.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_docker_workdir_live.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_driver_resolver.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_error_handling.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_evaluate_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_evaluator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_event_collector.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_experiment_cli.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_experiment_loader.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_experiment_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_experiment_reports.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_experiment_resolver.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_experiment_runner.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_file_check.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_file_contains_scoring.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_formatting.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_git_clone_failure.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_heartbeat_watchdog.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_ignore_patterns_negation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_image_from_dockerfiles.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_integration.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_json_check.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_judge_anthropic.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_judge_bedrock.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_judge_burn_in_live.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_judge_context_builder.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_judge_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_judge_persistence.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_lint_no_top_level_run_limits.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_lint_runner.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_litellm_route.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_llm_judge_criterion.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_log_tail_buffer.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_logging.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_logging_isolation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_merge_characterization.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_merge_strategy_annotations.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_merge_unification.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_mutations.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_new_criteria.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_node_env_config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_optional_dependencies.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_orchestrator_error_log_tail.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_orchestrator_telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_overrides_engine.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_parallel.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_path_utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_plan_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_plugin_processing.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_plugins.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_post_run.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_pr_review_workflow.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_pre_run.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_preservation_mode.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_pricing_registry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reference_comparison_scoring.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reference_evaluator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reference_missing_file.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reference_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reference_orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_registry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_release_notes.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_replicate_stats.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_report_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reports.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reports_experiment.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reports_html.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reports_junit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reports_stats.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_reports_stats_nonfinite.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_resolve_task_files.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_resume.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_retry_logic_comprehensive.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_route_seam_exhaustiveness.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_routing.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_run_command_junit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_run_command_stdout.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_run_limits_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_run_limits_orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_run_limits_resolver.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_runtime_tool_versions.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_sandbox.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_sandbox_layer_builder.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_sandbox_optional.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_sandbox_security.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_sandbox_symlink_preservation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_sandbox_templates.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_scorers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_scoring_quality.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_sdk_option_classification.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_simulation_config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_simulation_integration.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_simulation_termination.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_simulation_trials.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_skill_triggered.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_streaming_agent_integration.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_streaming_batch.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_streaming_callbacks.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_streaming_cli.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_streaming_events.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_streaming_orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_streaming_renderers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_streaming_wire.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_sub_agent_runner.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_success_criterion_union.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_suite_rollup.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_summaries.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_tags.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_task_definition_unknown_fields.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_teardown_interrupt.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_template_env_expansion.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_threshold_enforcement.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_timeout_batch.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_timeout_categorization.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_timeout_exceptions.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_timeout_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_timeout_orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_token_usage.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_uipath_eval.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_user_simulator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_utterance_extraction.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_variant_prompt_file.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_verdict_tool.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_watchdog.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.1}/tests/test_yaml_migration.py +0 -0
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.9.1 (2026-07-29)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- **agents**: Extend cooperative early stop to codex and antigravity
|
|
10
|
+
([`b849421`](https://github.com/UiPath/coder_eval/commit/b8494218af6870feff2a9809e3050e96da849cd8))
|
|
11
|
+
|
|
12
|
+
|
|
5
13
|
## v0.9.0 (2026-07-28)
|
|
6
14
|
|
|
7
15
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coder-eval
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.1
|
|
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
|
|
@@ -33,7 +33,7 @@ inputs:
|
|
|
33
33
|
version:
|
|
34
34
|
description: coder-eval version to install from PyPI, or "local" to install from the action checkout
|
|
35
35
|
required: false
|
|
36
|
-
default: "0.9.
|
|
36
|
+
default: "0.9.1" # <-- kept in sync with releases by release.yml
|
|
37
37
|
run-dir:
|
|
38
38
|
description: Run directory (--run-dir)
|
|
39
39
|
required: false
|
|
@@ -168,18 +168,15 @@ as every other agent.
|
|
|
168
168
|
|
|
169
169
|
## Known limitations
|
|
170
170
|
|
|
171
|
-
1. **No
|
|
172
|
-
seam, so `run_limits.stop_early` is unsupported for this agent (it errors at
|
|
173
|
-
resolution, as it does for any non-Claude agent).
|
|
174
|
-
2. **No endpoint routing.** Only `GEMINI_API_KEY` + `ANTIGRAVITY_MODEL` are read —
|
|
171
|
+
1. **No endpoint routing.** Only `GEMINI_API_KEY` + `ANTIGRAVITY_MODEL` are read —
|
|
175
172
|
there is no base-URL, project, region, or gateway override.
|
|
176
|
-
|
|
173
|
+
2. **Default-model drift.** The runtime fallback (`gemini-3.5-flash`) may differ from
|
|
177
174
|
what a given release's docs or example tasks pin; always set `agent.model`
|
|
178
175
|
explicitly for reproducible runs.
|
|
179
|
-
|
|
176
|
+
3. **`kill_sync()` is best-effort.** The SDK's cancel/disconnect are async-only, so
|
|
180
177
|
the watchdog's synchronous kill only flips agent state to `ERROR`; real teardown
|
|
181
178
|
happens on the subsequent async `stop()`.
|
|
182
|
-
|
|
179
|
+
4. **Process-global spawn lock.** The SDK spawns `localharness` via a subprocess with
|
|
183
180
|
no env-injection seam, so the agent transiently mutates `PATH` across the spawn
|
|
184
181
|
under a process-wide lock. This serializes harness startup across concurrent
|
|
185
182
|
tasks (it does not serialize the turns themselves).
|
|
@@ -145,13 +145,14 @@ simulator force `[]` for the same reason.)
|
|
|
145
145
|
UiPath CLI plugin discovery; when unset the sandbox derives it from the resolved
|
|
146
146
|
`uip` binary. See [User Guide → Environment Variables](../USER_GUIDE.md#environment-variables).
|
|
147
147
|
|
|
148
|
-
## Early stop
|
|
148
|
+
## Early stop
|
|
149
149
|
|
|
150
|
-
Claude Code
|
|
150
|
+
Claude Code supports the cooperative early-stop seam, as do the
|
|
151
|
+
[Codex](CODEX.md) and [Antigravity](ANTIGRAVITY.md) agents. With
|
|
151
152
|
`run_limits.stop_early: true`, a single-shot run ends cleanly at the next
|
|
152
153
|
tool-call boundary once its **armed** criteria (`stop_when: pass|fail|decided`) are
|
|
153
154
|
decided — so a raised `max_turns` isn't wasted on a smoke run. Early stop errors at
|
|
154
|
-
resolution for any
|
|
155
|
+
resolution for any agent that does not declare `supports_cooperative_stop`. See the
|
|
155
156
|
[Task Definition Guide](../TASK_DEFINITION_GUIDE.md) for the full contract.
|
|
156
157
|
|
|
157
158
|
## Telemetry
|
|
@@ -216,6 +216,7 @@ The Codex SDK is synchronous. The agent uses `_run_async()` helper to detect and
|
|
|
216
216
|
| **Session Resume** | `--resume {session_id}` | Via thread ID |
|
|
217
217
|
| **Permissions** | `permission_mode` + `allowed_tools` | `permission_mode` → sandbox/approval + `allowed_tools`/`disallowed_tools` → thread config |
|
|
218
218
|
| **Tool Enforcement** | Not enforced by Coder Eval wrapper | `enabled_tools` honored; `disabled_tools` NOT enforced by the SDK |
|
|
219
|
+
| **Early stop** | Supported (cooperative `should_stop`, polled between messages) | Supported — polled after each streamed notification; the in-flight turn is interrupted best-effort |
|
|
219
220
|
|
|
220
221
|
## Known Limitations
|
|
221
222
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "coder-eval"
|
|
3
|
-
version = "0.9.
|
|
3
|
+
version = "0.9.1"
|
|
4
4
|
description = "Evaluate, benchmark, and A/B-test AI coding agents (Claude Code, Codex, Gemini/Antigravity) with sandboxed, reproducible YAML task suites."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -27,7 +27,7 @@ from collections.abc import AsyncIterator, Callable
|
|
|
27
27
|
from contextlib import AsyncExitStack
|
|
28
28
|
from datetime import datetime
|
|
29
29
|
from pathlib import Path
|
|
30
|
-
from typing import Any
|
|
30
|
+
from typing import Any, ClassVar
|
|
31
31
|
|
|
32
32
|
from coder_eval.agent import Agent, AgentState
|
|
33
33
|
from coder_eval.agents._logging import PrefixedAdapter
|
|
@@ -185,6 +185,10 @@ def _to_token_usage(usage: Any, model: str | None) -> TokenUsage:
|
|
|
185
185
|
class AntigravityAgent(Agent[AntigravityAgentConfig]):
|
|
186
186
|
"""Implementation of the Agent interface for Google Antigravity (Gemini)."""
|
|
187
187
|
|
|
188
|
+
# The step loop has a between-steps guard where the cooperative
|
|
189
|
+
# ``should_stop`` check runs, so this agent supports early-stop-on-criterion.
|
|
190
|
+
supports_cooperative_stop: ClassVar[bool] = True
|
|
191
|
+
|
|
188
192
|
def __init__(
|
|
189
193
|
self,
|
|
190
194
|
config: AntigravityAgentConfig,
|
|
@@ -413,10 +417,10 @@ class AntigravityAgent(Agent[AntigravityAgentConfig]):
|
|
|
413
417
|
) -> TurnRecord:
|
|
414
418
|
"""Send a message to the Antigravity agent and receive its response.
|
|
415
419
|
|
|
416
|
-
``should_stop`` is
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
+
``should_stop`` is the cooperative early-stop callback, polled after each
|
|
421
|
+
processed step. When it returns True the step loop breaks, the
|
|
422
|
+
conversation is cancelled (best-effort) and the turn finalizes cleanly as
|
|
423
|
+
``STOPPED_EARLY`` (``crashed=False``).
|
|
420
424
|
|
|
421
425
|
Drives one logical turn: ``conversation.send(prompt)`` then iterate
|
|
422
426
|
``receive_steps()`` until the turn goes idle, mapping the Gemini step
|
|
@@ -468,8 +472,21 @@ class AntigravityAgent(Agent[AntigravityAgentConfig]):
|
|
|
468
472
|
conversation = self._sdk_agent.conversation
|
|
469
473
|
try:
|
|
470
474
|
await conversation.send(user_input)
|
|
475
|
+
# The cooperative should_stop poll runs AFTER process_step (the
|
|
476
|
+
# emission that lets the watcher latch on the deciding tool
|
|
477
|
+
# call) and BEFORE the next step is pulled — the deciding step
|
|
478
|
+
# is kept, the next is not. No-op when should_stop is None.
|
|
471
479
|
async for step in conversation.receive_steps():
|
|
472
480
|
state.process_step(step)
|
|
481
|
+
if should_stop is not None and should_stop():
|
|
482
|
+
state.stopped_early_hit = True
|
|
483
|
+
self._log.debug("Cooperative stop requested; ending step loop at this boundary")
|
|
484
|
+
break
|
|
485
|
+
if state.stopped_early_hit:
|
|
486
|
+
# Best-effort server-side cancel, mirrors kill(); a raising
|
|
487
|
+
# cancel() lands in the guarded handler below.
|
|
488
|
+
with contextlib.suppress(Exception):
|
|
489
|
+
await conversation.cancel()
|
|
473
490
|
except asyncio.CancelledError:
|
|
474
491
|
if state.timeout_hit:
|
|
475
492
|
self._finalize_and_raise_timeout(state.finalize, timeout or 0)
|
|
@@ -477,9 +494,17 @@ class AntigravityAgent(Agent[AntigravityAgentConfig]):
|
|
|
477
494
|
except Exception as e:
|
|
478
495
|
if state.timeout_hit:
|
|
479
496
|
self._finalize_and_raise_timeout(state.finalize, timeout or 0, cause=e)
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
497
|
+
if state.stopped_early_hit:
|
|
498
|
+
# The turn already stopped cleanly (e.g. the generator's
|
|
499
|
+
# aclose() raised on the break); escalating to a crash
|
|
500
|
+
# would trigger the orchestrator's retry with the watcher's
|
|
501
|
+
# decision still latched → immediate stop-at-turn-0 on the
|
|
502
|
+
# retry (wasted spend). Fall through to the clean tail.
|
|
503
|
+
self._log.warning("Ignoring post-stop exception; finalizing as STOPPED_EARLY: %s", e)
|
|
504
|
+
else:
|
|
505
|
+
self._finalize_and_raise_crash(
|
|
506
|
+
state.finalize, truncate_crash_message(f"Antigravity turn failed: {e!s}"), cause=e
|
|
507
|
+
)
|
|
483
508
|
|
|
484
509
|
if state.timeout_hit:
|
|
485
510
|
# Watchdog fired but the pump finished before the cancel landed.
|
|
@@ -493,13 +518,20 @@ class AntigravityAgent(Agent[AntigravityAgentConfig]):
|
|
|
493
518
|
state.finalize(AgentEndStatus.CRASHED, crashed=True, crash_reason="turn cancelled")
|
|
494
519
|
raise
|
|
495
520
|
except Exception as e:
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
521
|
+
if state.stopped_early_hit and not state.timeout_hit:
|
|
522
|
+
# Same retry-poisoning guard as the inner handler: a cooperative
|
|
523
|
+
# stop already happened, so finalize cleanly instead of crashing.
|
|
524
|
+
self._log.warning("Ignoring post-stop exception; finalizing as STOPPED_EARLY: %s", e)
|
|
525
|
+
else:
|
|
526
|
+
self._finalize_and_raise_crash(
|
|
527
|
+
state.finalize, truncate_crash_message(f"Antigravity turn failed: {e!s}"), cause=e
|
|
528
|
+
)
|
|
499
529
|
|
|
500
530
|
self._state = AgentState.WORKING
|
|
501
531
|
self._end_turn_ok()
|
|
502
|
-
|
|
532
|
+
# Precedence matches Claude: timeout (raised above) > stopped_early > completed.
|
|
533
|
+
status = AgentEndStatus.STOPPED_EARLY if state.stopped_early_hit else AgentEndStatus.COMPLETED
|
|
534
|
+
state.finalize(status, crashed=False, crash_reason=None)
|
|
503
535
|
return collector.build_turn_record()
|
|
504
536
|
|
|
505
537
|
async def stop(self) -> None:
|
|
@@ -589,6 +621,7 @@ class _AntigravityTurnState:
|
|
|
589
621
|
self.turn_start_time = turn_start_time
|
|
590
622
|
|
|
591
623
|
self.timeout_hit = False
|
|
624
|
+
self.stopped_early_hit = False
|
|
592
625
|
self.finalized = False
|
|
593
626
|
|
|
594
627
|
self.total_usage = TokenUsage()
|
|
@@ -12,7 +12,7 @@ import time
|
|
|
12
12
|
from collections.abc import Callable
|
|
13
13
|
from datetime import datetime
|
|
14
14
|
from pathlib import Path
|
|
15
|
-
from typing import Any
|
|
15
|
+
from typing import Any, ClassVar
|
|
16
16
|
from urllib.parse import urlparse
|
|
17
17
|
|
|
18
18
|
from coder_eval.agent import Agent, AgentState
|
|
@@ -280,6 +280,7 @@ class _CodexTurnState:
|
|
|
280
280
|
self.iteration = iteration
|
|
281
281
|
self.turn_start_time = turn_start_time
|
|
282
282
|
self.timeout_hit = False
|
|
283
|
+
self.stopped_early_hit = False
|
|
283
284
|
self.finalized = False
|
|
284
285
|
|
|
285
286
|
# Live pump scratch (set during streaming).
|
|
@@ -634,6 +635,10 @@ class _CodexTurnState:
|
|
|
634
635
|
class CodexAgent(Agent[CodexAgentConfig]):
|
|
635
636
|
"""Implementation of the Agent interface for OpenAI Codex using the Codex SDK."""
|
|
636
637
|
|
|
638
|
+
# The notification pump has a between-items guard where the cooperative
|
|
639
|
+
# ``should_stop`` check runs, so this agent supports early-stop-on-criterion.
|
|
640
|
+
supports_cooperative_stop: ClassVar[bool] = True
|
|
641
|
+
|
|
637
642
|
def __init__(
|
|
638
643
|
self,
|
|
639
644
|
config: CodexAgentConfig,
|
|
@@ -740,10 +745,10 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
740
745
|
stream_callback: Optional callback for real-time event streaming
|
|
741
746
|
timeout: Hard wall-clock deadline in seconds
|
|
742
747
|
max_turns: Hard cap on inner-loop turns (unused for Codex single-turn)
|
|
743
|
-
should_stop:
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
748
|
+
should_stop: Cooperative early-stop callback, polled after each
|
|
749
|
+
dispatched notification. When it returns True the pump breaks,
|
|
750
|
+
the in-flight turn is interrupted (best-effort) and the turn
|
|
751
|
+
finalizes cleanly as ``STOPPED_EARLY`` (``crashed=False``).
|
|
747
752
|
|
|
748
753
|
Returns:
|
|
749
754
|
TurnRecord containing the complete interaction
|
|
@@ -822,7 +827,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
822
827
|
# return; a crash skips this, so finalize reads the crash
|
|
823
828
|
# defaults (None/"") and falls back to the captured messages.
|
|
824
829
|
state.result_turn, state.sdk_token_usage, state.result_text = await self._run_turn_with_streaming(
|
|
825
|
-
state
|
|
830
|
+
state, should_stop
|
|
826
831
|
)
|
|
827
832
|
except asyncio.CancelledError:
|
|
828
833
|
if state.timeout_hit:
|
|
@@ -831,9 +836,16 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
831
836
|
except Exception as e:
|
|
832
837
|
if state.timeout_hit:
|
|
833
838
|
self._finalize_and_raise_timeout(state.finalize, timeout or 0, cause=e)
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
839
|
+
if state.stopped_early_hit:
|
|
840
|
+
# The turn already stopped cleanly; escalating to a crash
|
|
841
|
+
# would trigger the orchestrator's retry with the watcher's
|
|
842
|
+
# decision still latched → immediate stop-at-turn-0 on the
|
|
843
|
+
# retry (wasted spend). Fall through to the clean tail.
|
|
844
|
+
self._log.warning("Ignoring post-stop exception; finalizing as STOPPED_EARLY: %s", e)
|
|
845
|
+
else:
|
|
846
|
+
self._finalize_and_raise_crash(
|
|
847
|
+
state.finalize, truncate_crash_message(f"Codex turn failed: {e!s}"), cause=e
|
|
848
|
+
)
|
|
837
849
|
|
|
838
850
|
if state.timeout_hit:
|
|
839
851
|
# Watchdog fired but the pump finished before the cancel landed.
|
|
@@ -860,13 +872,22 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
860
872
|
# and _format_turn_result. Without this, such errors escape as a bare
|
|
861
873
|
# exception: the orchestrator never drains pending_turn and _iteration
|
|
862
874
|
# stays incremented, violating the pending-turn contract.
|
|
863
|
-
|
|
875
|
+
if state.stopped_early_hit and not state.timeout_hit:
|
|
876
|
+
# Same retry-poisoning guard as the inner handler: a cooperative
|
|
877
|
+
# stop already happened, so finalize cleanly instead of crashing.
|
|
878
|
+
self._log.warning("Ignoring post-stop exception; finalizing as STOPPED_EARLY: %s", e)
|
|
879
|
+
else:
|
|
880
|
+
self._finalize_and_raise_crash(
|
|
881
|
+
state.finalize, truncate_crash_message(f"Codex turn failed: {e!s}"), cause=e
|
|
882
|
+
)
|
|
864
883
|
|
|
865
884
|
self._state = AgentState.WORKING
|
|
866
885
|
self._end_turn_ok()
|
|
867
886
|
|
|
868
887
|
# The TurnRecord is the EventCollector's reduction of the emitted events.
|
|
869
|
-
|
|
888
|
+
# Precedence matches Claude: timeout (raised above) > stopped_early > completed.
|
|
889
|
+
status = AgentEndStatus.STOPPED_EARLY if state.stopped_early_hit else AgentEndStatus.COMPLETED
|
|
890
|
+
state.finalize(status, crashed=False, crash_reason=None)
|
|
870
891
|
return collector.build_turn_record()
|
|
871
892
|
|
|
872
893
|
async def stop(self) -> None:
|
|
@@ -1380,7 +1401,9 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
1380
1401
|
self._log.warning(f"Failed to format turn result: {e}")
|
|
1381
1402
|
return str(turn_result)
|
|
1382
1403
|
|
|
1383
|
-
async def _run_turn_with_streaming(
|
|
1404
|
+
async def _run_turn_with_streaming(
|
|
1405
|
+
self, state: _CodexTurnState, should_stop: Callable[[], bool] | None = None
|
|
1406
|
+
) -> tuple[Any, Any, str]:
|
|
1384
1407
|
"""Drive ``turn.stream()`` through the per-turn state, emitting the standard
|
|
1385
1408
|
event protocol; returns ``(turn_result, latest_token_usage, agent_text)``.
|
|
1386
1409
|
|
|
@@ -1388,6 +1411,11 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
1388
1411
|
boundaries; this drives the inner notification pump. ``state`` accumulates
|
|
1389
1412
|
commands, the assistant transcript, sub-agent spawns and per-generation
|
|
1390
1413
|
tokens — all mutated in place so a mid-turn crash keeps the partial.
|
|
1414
|
+
|
|
1415
|
+
The cooperative ``should_stop`` poll runs AFTER ``state.dispatch`` (the
|
|
1416
|
+
emission that lets the watcher latch on the deciding tool call) and BEFORE
|
|
1417
|
+
the next notification is pulled — the deciding item is kept, the next is
|
|
1418
|
+
not. No-op when ``should_stop is None`` (behaviorally identical to before).
|
|
1391
1419
|
"""
|
|
1392
1420
|
# Create the turn handle (starts the turn but doesn't block) + event stream.
|
|
1393
1421
|
turn_handle = await self._run_async(self.thread.turn, state.user_input)
|
|
@@ -1405,6 +1433,11 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
1405
1433
|
break
|
|
1406
1434
|
if state.dispatch(notification): # True on a valid turn/completed
|
|
1407
1435
|
break
|
|
1436
|
+
if should_stop is not None and should_stop():
|
|
1437
|
+
state.stopped_early_hit = True
|
|
1438
|
+
self._log.debug("Cooperative stop requested; ending notification pump at this boundary")
|
|
1439
|
+
self._interrupt_active_turn() # best-effort; stops server-side spend
|
|
1440
|
+
break
|
|
1408
1441
|
finally:
|
|
1409
1442
|
self._active_turn_handle = None
|
|
1410
1443
|
# Close any orphan tool (item/started without item/completed), flush any
|
|
@@ -1415,7 +1448,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
1415
1448
|
with contextlib.suppress(Exception):
|
|
1416
1449
|
await self._run_async(stream.close)
|
|
1417
1450
|
|
|
1418
|
-
if state.turn_result is None:
|
|
1451
|
+
if state.turn_result is None and not state.stopped_early_hit:
|
|
1419
1452
|
raise RuntimeError("Turn did not complete (no turn/completed notification received)")
|
|
1420
1453
|
|
|
1421
1454
|
# Belt-and-suspenders: if streaming surfaced no assistant transcript,
|
|
@@ -1427,7 +1460,9 @@ class CodexAgent(Agent[CodexAgentConfig]):
|
|
|
1427
1460
|
# and nest them under the spawning Agent call. The parent stream never
|
|
1428
1461
|
# carries the child's commands (Limited persistence drops them), but its
|
|
1429
1462
|
# rollout always persists the raw function_call/local_shell_call items.
|
|
1430
|
-
|
|
1463
|
+
# Skipped on a cooperative stop: children may have no rollout yet and the
|
|
1464
|
+
# run is already decided — recovery adds nothing the armed gate uses.
|
|
1465
|
+
if state.spawned_children and not state.stopped_early_hit:
|
|
1431
1466
|
await self._recover_subagent_tool_calls(
|
|
1432
1467
|
state.spawned_children,
|
|
1433
1468
|
state.collab_results,
|
|
@@ -159,7 +159,7 @@ def validate_early_stop(task: TaskDefinition) -> None:
|
|
|
159
159
|
if not supports:
|
|
160
160
|
raise EarlyStopConfigError(
|
|
161
161
|
"run_limits.stop_early requires an agent that supports cooperative stopping "
|
|
162
|
-
+ f"(
|
|
162
|
+
+ f"(claude-code, codex, antigravity); agent type {agent_type!r} does not."
|
|
163
163
|
)
|
|
164
164
|
|
|
165
165
|
# (2) Arming requires at least one stop criterion.
|
|
@@ -105,6 +105,45 @@ async def test_codex_live_edits_file_and_records_telemetry(tmp_path):
|
|
|
105
105
|
assert record.commands, "expected command telemetry for the file creation"
|
|
106
106
|
|
|
107
107
|
|
|
108
|
+
@_live
|
|
109
|
+
async def test_codex_live_cooperative_stop_ends_turn_promptly(tmp_path):
|
|
110
|
+
"""A ``should_stop`` that flips True after the first ToolStart ends the turn
|
|
111
|
+
cleanly as STOPPED_EARLY instead of running the multi-step task out — the
|
|
112
|
+
only automated check of real ``handle.interrupt()`` behavior."""
|
|
113
|
+
from coder_eval.streaming.events import AgentEndEvent, AgentEndStatus, ToolStartEvent
|
|
114
|
+
|
|
115
|
+
class _Sink:
|
|
116
|
+
def __init__(self):
|
|
117
|
+
self.tool_started = False
|
|
118
|
+
self.ends = []
|
|
119
|
+
|
|
120
|
+
def on_event(self, event):
|
|
121
|
+
if isinstance(event, ToolStartEvent):
|
|
122
|
+
self.tool_started = True
|
|
123
|
+
if isinstance(event, AgentEndEvent):
|
|
124
|
+
self.ends.append(event)
|
|
125
|
+
|
|
126
|
+
sink = _Sink()
|
|
127
|
+
agent = _make_agent()
|
|
128
|
+
await agent.start(str(tmp_path))
|
|
129
|
+
try:
|
|
130
|
+
record = await agent.communicate(
|
|
131
|
+
"Run `echo one`, then `echo two`, then `echo three`, each as a separate shell command, "
|
|
132
|
+
"then create three files a.txt, b.txt and c.txt.",
|
|
133
|
+
timeout=180,
|
|
134
|
+
stream_callback=sink,
|
|
135
|
+
should_stop=lambda: sink.tool_started,
|
|
136
|
+
)
|
|
137
|
+
finally:
|
|
138
|
+
await agent.stop()
|
|
139
|
+
|
|
140
|
+
# Clean cooperative stop: no crash, no pending partial, STOPPED_EARLY status.
|
|
141
|
+
assert record.crashed is False
|
|
142
|
+
assert agent.pending_turn is None
|
|
143
|
+
assert sink.ends, "expected an AgentEndEvent"
|
|
144
|
+
assert sink.ends[-1].status == AgentEndStatus.STOPPED_EARLY
|
|
145
|
+
|
|
146
|
+
|
|
108
147
|
@_live
|
|
109
148
|
async def test_codex_live_token_usage_populated(tmp_path):
|
|
110
149
|
"""Token usage is captured from the SDK and attached to the TurnRecord."""
|