coder-eval 0.9.0__tar.gz → 0.9.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.env.example +11 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/CHANGELOG.md +195 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/CLAUDE.md +3 -2
- {coder_eval-0.9.0 → coder_eval-0.9.2}/PKG-INFO +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/action.yml +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/REPORT_SCHEMA.md +58 -4
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/agents/ANTIGRAVITY.md +4 -7
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/agents/CLAUDE_CODE.md +4 -3
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/agents/CODEX.md +1 -0
- coder_eval-0.9.2/evalboard/app/_components/__tests__/harness-badge.test.tsx +45 -0
- coder_eval-0.9.2/evalboard/app/_components/__tests__/harness-selector.test.tsx +81 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_components/harness-badge.tsx +21 -3
- coder_eval-0.9.2/evalboard/app/_components/harness-selector.tsx +101 -0
- coder_eval-0.9.2/evalboard/app/_overview/__tests__/harness-legend.test.tsx +130 -0
- coder_eval-0.9.2/evalboard/app/_overview/__tests__/harness-series.test.ts +148 -0
- coder_eval-0.9.2/evalboard/app/_overview/daily-chart.tsx +106 -0
- coder_eval-0.9.2/evalboard/app/_overview/harness-legend.tsx +111 -0
- coder_eval-0.9.2/evalboard/app/_overview/harness-series.ts +75 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_overview/tag-rail.tsx +6 -17
- coder_eval-0.9.2/evalboard/app/_overview/turn-budget-chart.tsx +110 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_overview/window-summary.tsx +15 -8
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/page.tsx +166 -150
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/path-to-ga/page.tsx +43 -30
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/trends/trends-view.tsx +6 -7
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/watchlist/watchlist-view.tsx +4 -3
- coder_eval-0.9.2/litellm/cost_logger.py +226 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/litellm/litellm-config.yaml +35 -10
- {coder_eval-0.9.0 → coder_eval-0.9.2}/litellm/start-litellm.sh +11 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/pyproject.toml +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/__init__.py +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/agent.py +18 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/agents/antigravity_agent.py +46 -14
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/agents/claude_code_agent.py +49 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/agents/codex_agent.py +50 -16
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/config.py +6 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/llm_judge.py +2 -2
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/judge_usage.py +18 -2
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/isolation/docker_runner.py +16 -2
- coder_eval-0.9.2/src/coder_eval/litellm_cost.py +231 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/__init__.py +16 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/experiment.py +13 -2
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/results.py +175 -2
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/sandbox.py +6 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/telemetry.py +18 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestration/batch.py +45 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestration/early_stop.py +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestrator.py +122 -2
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/pricing.py +75 -53
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/reports.py +44 -7
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/reports_experiment.py +70 -10
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/reports_html.py +14 -14
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/_scrub.py +10 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/report_snapshots/experiment_2variant.md +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/report_snapshots/experiment_3variant.md +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/report_snapshots/experiment_replicates.md +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/report_snapshots/run_full.md +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/report_snapshots/run_minimal.md +1 -1
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent_timeout.py +57 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_antigravity_agent.py +4 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_codex_agent_live.py +39 -0
- coder_eval-0.9.2/tests/test_cost_accounting_paths.py +362 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_docker_litellm_env.py +25 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_early_stop.py +530 -10
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_event_collector.py +7 -4
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_experiment_reports.py +2 -2
- coder_eval-0.9.2/tests/test_litellm_config.py +57 -0
- coder_eval-0.9.2/tests/test_litellm_cost.py +336 -0
- coder_eval-0.9.2/tests/test_litellm_cost_logger.py +259 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_litellm_route.py +56 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reports.py +5 -2
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_route_seam_exhaustiveness.py +1 -1
- coder_eval-0.9.2/tests/test_run_metrics.py +253 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_timeout_orchestrator.py +82 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_token_usage.py +87 -3
- {coder_eval-0.9.0 → coder_eval-0.9.2}/uv.lock +1 -1
- coder_eval-0.9.0/evalboard/app/_components/harness-selector.tsx +0 -49
- coder_eval-0.9.0/evalboard/app/_components/window-selector.tsx +0 -33
- coder_eval-0.9.0/evalboard/app/_overview/daily-chart.tsx +0 -112
- coder_eval-0.9.0/evalboard/app/_overview/turn-budget-chart.tsx +0 -117
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/commands/coder-eval-code-review-full.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/commands/coder-eval-code-review-wf.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/commands/coder-eval-code-review.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/commands/coder-eval-create-plan.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/commands/coder-eval-implement-plan.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/commands/coder-eval-review.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/commands/coder-eval-run-analysis.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/commands/coder-eval-task-create.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/harness-candidates.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/shared/axes.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/shared/multi-model-review.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/shared/review-rubric.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/shared/run-layout.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/workflows/cr-axis.js +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.claude/workflows/cr-parent.js +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/CODEOWNERS +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/code_review.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/dependabot.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/pages-stub/index.html +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/scripts/release_notes.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/workflows/claude-pr-review.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/workflows/codeql.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/workflows/conventional-commits.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/workflows/docker-publish.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/workflows/docs.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/workflows/pr-checks.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/workflows/publish-testpypi.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.github/workflows/release.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.gitignore +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.pre-commit-config.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/.python-version +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/ADOPTERS.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/CODE_OF_CONDUCT.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/CONTRIBUTING.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/LICENSE +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/Makefile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/NOTICE +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/SECURITY.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docker/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docker/Dockerfile.runtime +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docker/coder_eval_entrypoint.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docker/coder_eval_runtime_entrypoint.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/AB_EXPERIMENTS.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/CI_GATE.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/DATASETS.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/DIALOG_MODE.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/DOCKER_ISOLATION.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/EXTENDING.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/TASK_DEFINITION_GUIDE.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/USER_GUIDE.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/assets/hero.gif +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/comparison.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/index.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/llms.txt +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/tutorials/01-first-evaluation.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/tutorials/02-ci-pipeline.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/tutorials/03-evalboard-local.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/tutorials/04-writing-a-task.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/tutorials/05-comparing-models.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/tutorials/06-use-docker-isolation.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/docs/tutorials/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/.gitignore +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_components/col-help.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_components/collapsible-rail.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_components/scroll-table.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_components/search-box.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_components/unit-toggle.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/_components/version-list.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/api/download/route.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/api/file/route.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/api/refresh/route.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/error.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/globals.css +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/icon.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/layout.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/trends/actions.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/trends/page.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/app/watchlist/page.tsx +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/next-env.d.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/next.config.mjs +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/package.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/pnpm-lock.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/postcss.config.mjs +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/public/harness/antigravity.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/public/harness/claude-code.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/public/harness/codex.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/public/uipath.png +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/tailwind.config.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/tsconfig.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/vitest.config.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/evalboard/vitest.setup.ts +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/experiments/default.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/experiments/early-stop-ab.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/experiments/model-comparison.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/experiments/permissions-smoke.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/experiments/plugin-comparison.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/experiments/prompt-mutations-example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/experiments/smoke_variants.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/litellm/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/mkdocs.yml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/osv-scanner.toml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/scripts/check_commit_msg.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/.gitattributes +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/agents/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/agents/_logging.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/agents/noop_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/agents/registry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/agents/watchdog.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/analysis.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/aggregate_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/console.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/evaluate_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/plan_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/report_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/run_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/run_helpers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/run_task_internal_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/cli/utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/agent_judge.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/base.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/classification_match.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/command_executed.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/commands_efficiency.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/file_check.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/file_contains.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/file_exists.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/file_matches_regex.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/json_check.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/reference_comparison.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/run_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/skill_triggered.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/criteria/uipath_eval.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/budget.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/categories.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/categorization.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/checker_misuse.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/executor.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/judge.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/retry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/errors/timeout.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/checker.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/judge_context.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/judge_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/judge_persistence.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/sub_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/summaries.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/evaluation/verdict_tool.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/formatting.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/isolation/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/logging_config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/agent_config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/container_paths.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/criteria.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/enums.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/judge.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/judge_defaults.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/limits.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/merge_strategy.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/mutations.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/routing.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/tasks.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/models/templates.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestration/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestration/config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestration/config_merge.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestration/evaluation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestration/experiment.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestration/overrides.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/orchestration/task_loader.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/path_utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/plugins.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/py.typed +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/reports_junit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/reports_stats.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/resources/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/resources/tags.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/sandbox.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/scoring/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/scoring/ast_similarity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/scoring/complexity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/scoring/quality.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/scoring/signature_similarity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/scoring/similarity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/scoring/token_similarity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/simulation/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/simulation/termination.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/simulation/user_simulator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/streaming/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/streaming/callbacks.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/streaming/collector.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/streaming/events.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/streaming/renderers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/streaming/wire.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/src/coder_eval/utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agentless_smoke_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/antigravity_hello_world.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/claude_hello_world.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/claude_hello_world_docker.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/claude_subagent_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/codex_hello_world.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/codex_parallel_commands.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/codex_skills_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/codex_string_utils.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/codex_subagent_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/subagent_bash_long_input.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/agents/subagent_merge_sort.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/byod_smoke_test.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/dataset_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/datasets/sentiment.jsonl +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/dockerfile_build_example/environment/input.txt +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/fibonacci_with_template.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/hello_date.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/inline_starter_example.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/internal/session_resumption.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/mock_path_dirs_smoke.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/sentiment_classification.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/smoke_agent_judge.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/smoke_budget_exceeded.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/smoke_llm_judge.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/smoke_negative_path.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/smoke_task_timeout.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/smoke_variants.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/test_sandbox.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tasks/token_check.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/templates/byod_smoke_test/Dockerfile +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/templates/fibonacci-starter/README.md +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/templates/fibonacci-starter/src/main.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/templates/fibonacci-starter/tests/test_main.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/report_snapshots/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/_path_helpers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/conftest.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/fixtures/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/fixtures/mock_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/fixtures/text_stub_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/dead_config_fields.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/doc_env_parity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/doc_examples.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/doc_indexes.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/doc_schema_parity.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/__init__.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/base.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/no_agent_timing_access.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/no_silent_except.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/no_submodule_model_imports.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/open_explicit_encoding.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/register_criterion_required.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/runner.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/lint/violation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_action_version_pin.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent_config_no_timing_fields.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent_config_optional_type.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent_config_registry_dispatch.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent_config_sdk_decoupling.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent_golden_master.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent_judge_criterion.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent_telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agent_telemetry_advanced.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_agentless.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_aggregate.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_byoa_plugin.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_byoa_plugin_live.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_byod_feature.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_check_all_async.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_checker_logging.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_classification_match.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_claude_settings_enforcement_live.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_cleanup_preservation_guard.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_cli_backend_flag.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_cli_empty_glob.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_cli_sdk_options.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_cli_set_overrides.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_cli_telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_cli_type_flag.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_code_review_bugs.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_codex_agent.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_codex_agent_unit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_codex_token_mapping.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_command_executed.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_command_statistics.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_command_telemetry_result_data.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_commands_efficiency.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_config_lineage.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_config_merge_engine.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_config_precedence.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_continuous_scoring.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_criterion_result_round_trip.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_custom_lint.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_dataset_expansion.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_debug_logging.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_docker_build_failure.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_docker_runner_container_death.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_docker_runner_mounts.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_docker_runner_stream_limit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_docker_wildcard_env.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_docker_workdir_live.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_driver_resolver.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_error_handling.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_evaluate_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_evaluator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_experiment_cli.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_experiment_loader.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_experiment_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_experiment_resolver.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_experiment_runner.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_file_check.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_file_contains_scoring.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_formatting.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_git_clone_failure.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_heartbeat_watchdog.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_ignore_patterns_negation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_image_from_dockerfiles.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_integration.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_json_check.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_judge_anthropic.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_judge_bedrock.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_judge_burn_in_live.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_judge_context_builder.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_judge_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_judge_persistence.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_lint_no_top_level_run_limits.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_lint_runner.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_llm_judge_criterion.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_log_tail_buffer.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_logging.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_logging_isolation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_merge_characterization.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_merge_strategy_annotations.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_merge_unification.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_mutations.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_new_criteria.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_node_env_config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_optional_dependencies.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_orchestrator_error_log_tail.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_orchestrator_telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_overrides_engine.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_parallel.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_path_utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_plan_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_plugin_processing.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_plugins.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_post_run.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_pr_review_workflow.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_pre_run.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_preservation_mode.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_pricing_registry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reference_comparison_scoring.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reference_evaluator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reference_missing_file.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reference_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reference_orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_registry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_release_notes.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_replicate_stats.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_report_command.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reports_experiment.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reports_html.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reports_junit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reports_stats.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_reports_stats_nonfinite.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_resolve_task_files.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_resume.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_retry_logic_comprehensive.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_routing.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_run_command_junit.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_run_command_stdout.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_run_limits_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_run_limits_orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_run_limits_resolver.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_runtime_tool_versions.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_sandbox.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_sandbox_layer_builder.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_sandbox_optional.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_sandbox_security.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_sandbox_symlink_preservation.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_sandbox_templates.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_scorers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_scoring_quality.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_sdk_option_classification.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_simulation_config.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_simulation_integration.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_simulation_termination.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_simulation_trials.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_skill_triggered.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_streaming_agent_integration.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_streaming_batch.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_streaming_callbacks.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_streaming_cli.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_streaming_events.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_streaming_orchestrator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_streaming_renderers.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_streaming_wire.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_sub_agent_runner.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_success_criterion_union.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_suite_rollup.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_summaries.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_tags.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_task_definition_unknown_fields.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_teardown_interrupt.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_telemetry.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_template_env_expansion.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_threshold_enforcement.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_timeout_batch.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_timeout_categorization.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_timeout_exceptions.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_timeout_models.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_uipath_eval.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_user_simulator.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_utils.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_utterance_extraction.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_variant_prompt_file.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_verdict_tool.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_watchdog.py +0 -0
- {coder_eval-0.9.0 → coder_eval-0.9.2}/tests/test_yaml_migration.py +0 -0
|
@@ -58,6 +58,17 @@ LOG_TO_FILE=false # Set to true to enable file logging
|
|
|
58
58
|
# GEMINI_API_KEY="AIza..."
|
|
59
59
|
# ANTIGRAVITY_MODEL="gemini-3.1-pro-preview"
|
|
60
60
|
|
|
61
|
+
# LiteLLM (Anthropic-compatible) open-weight backend (API_BACKEND=litellm). Point
|
|
62
|
+
# the agent at a self-hosted LiteLLM proxy (see litellm/start-litellm.sh, which
|
|
63
|
+
# prints these). LITELLM_COST_LOG must be the SAME path the proxy writes its
|
|
64
|
+
# per-call JSONL to — that is how the run joins ACTUAL OpenRouter cost + cache back
|
|
65
|
+
# onto each turn; if it is unset (or points elsewhere) the run silently falls back
|
|
66
|
+
# to static rate-card pricing with 0 cache reads.
|
|
67
|
+
# LITELLM_BASE_URL="http://localhost:4000"
|
|
68
|
+
# LITELLM_AUTH_TOKEN="sk-..."
|
|
69
|
+
# LITELLM_MODEL="zai.glm-5"
|
|
70
|
+
# LITELLM_COST_LOG="./tmp/litellm-costs.jsonl"
|
|
71
|
+
|
|
61
72
|
# UiPath CLI plugin-discovery pin. When unset, the sandbox auto-derives
|
|
62
73
|
# the canonical `node_modules/@uipath` from the resolved `uip` binary at setup
|
|
63
74
|
# time. Operators on dedicated eval hosts can pin explicitly to override.
|
|
@@ -2,6 +2,201 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.9.2 (2026-07-31)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **cost**: A task timeout with no preserved turn is unrecorded spend, not free
|
|
10
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
11
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
12
|
+
|
|
13
|
+
- **cost**: Book spend on the error and timeout paths, flag what is unpriced
|
|
14
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
15
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
16
|
+
|
|
17
|
+
- **cost**: Flag every hard-killed task as a cost floor, not just the empty ones
|
|
18
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
19
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
20
|
+
|
|
21
|
+
- **evalboard**: Honest scoped counts, and one definition of a run's scope
|
|
22
|
+
([#69](https://github.com/UiPath/coder_eval/pull/69),
|
|
23
|
+
[`0bdac0b`](https://github.com/UiPath/coder_eval/commit/0bdac0b2bab0d9f2937a2ddc5e54b26d110a56d1))
|
|
24
|
+
|
|
25
|
+
- **litellm**: Gate cost_log_tags on agent capability, not route (fixes non-Claude crash)
|
|
26
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
27
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
28
|
+
|
|
29
|
+
- **litellm**: Make the orphaned-spend warning actually fire
|
|
30
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
31
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
32
|
+
|
|
33
|
+
- **litellm**: Per-attempt cost-log scoping + single run-id accessor + no-match warning
|
|
34
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
35
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
36
|
+
|
|
37
|
+
- **litellm**: Pin each open-weight model to a vetted provider set (no silent fallback)
|
|
38
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
39
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
40
|
+
|
|
41
|
+
- **litellm**: Proxy-authoritative token buckets + all-priced gate + transactional join
|
|
42
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
43
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
44
|
+
|
|
45
|
+
- **litellm**: Sanitize cost headers, reject non-finite cost, drop debug scaffolding
|
|
46
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
47
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
48
|
+
|
|
49
|
+
- **orchestrator**: Recover the in-flight turn's spend on a hard kill
|
|
50
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
51
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
52
|
+
|
|
53
|
+
- **pricing**: Add the claude-opus-5 rate so killed turns stop booking zero
|
|
54
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
55
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
56
|
+
|
|
57
|
+
- **pricing**: Add the five unpriced codex tiers still on OpenAI's rate card
|
|
58
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
59
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
60
|
+
|
|
61
|
+
- **pricing**: Correct every wrong rate-card entry and close the alias gaps
|
|
62
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
63
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
64
|
+
|
|
65
|
+
- **pricing**: Refresh the rate card and correct gemini-3-flash-preview
|
|
66
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
67
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
68
|
+
|
|
69
|
+
- **reports**: Count errors as misses and stop losing cost on error paths
|
|
70
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
71
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
72
|
+
|
|
73
|
+
- **reports**: Count errors as misses in one canonical pass rate
|
|
74
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
75
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
76
|
+
|
|
77
|
+
### Code Style
|
|
78
|
+
|
|
79
|
+
- **evalboard**: Drop the swatch dots and the scope caption from the header
|
|
80
|
+
([#69](https://github.com/UiPath/coder_eval/pull/69),
|
|
81
|
+
[`0bdac0b`](https://github.com/UiPath/coder_eval/commit/0bdac0b2bab0d9f2937a2ddc5e54b26d110a56d1))
|
|
82
|
+
|
|
83
|
+
### Documentation
|
|
84
|
+
|
|
85
|
+
- **cost**: Describe the per-turn backfill as the net it is
|
|
86
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
87
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
88
|
+
|
|
89
|
+
- **cost**: Describe the unpriced-crash mechanism accurately and keep comments framework-general
|
|
90
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
91
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
92
|
+
|
|
93
|
+
- **litellm**: Correct the cost contract after cutting per-message distribution
|
|
94
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
95
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
96
|
+
|
|
97
|
+
- **litellm**: Document LITELLM_COST_LOG wiring + correct the reconciliation-cost contract
|
|
98
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
99
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
100
|
+
|
|
101
|
+
### Features
|
|
102
|
+
|
|
103
|
+
- **cost**: Publish one accurate total on every reporting surface
|
|
104
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
105
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
106
|
+
|
|
107
|
+
- **docker**: Bind-mount the LiteLLM cost log so --driver docker joins actual cost
|
|
108
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
109
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
110
|
+
|
|
111
|
+
- **evalboard**: Compare every harness on the overview, and scope the whole page to one
|
|
112
|
+
([#69](https://github.com/UiPath/coder_eval/pull/69),
|
|
113
|
+
[`0bdac0b`](https://github.com/UiPath/coder_eval/commit/0bdac0b2bab0d9f2937a2ddc5e54b26d110a56d1))
|
|
114
|
+
|
|
115
|
+
- **evalboard**: Compare harnesses on the overview, and identify each run
|
|
116
|
+
([#69](https://github.com/UiPath/coder_eval/pull/69),
|
|
117
|
+
[`0bdac0b`](https://github.com/UiPath/coder_eval/commit/0bdac0b2bab0d9f2937a2ddc5e54b26d110a56d1))
|
|
118
|
+
|
|
119
|
+
- **evalboard**: Lift the harness scope to the page header, in vendor colors
|
|
120
|
+
([#69](https://github.com/UiPath/coder_eval/pull/69),
|
|
121
|
+
[`0bdac0b`](https://github.com/UiPath/coder_eval/commit/0bdac0b2bab0d9f2937a2ddc5e54b26d110a56d1))
|
|
122
|
+
|
|
123
|
+
- **evalboard**: Make each turn's provider-call table a collapsed dropdown
|
|
124
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
125
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
126
|
+
|
|
127
|
+
- **evalboard**: Mark a partly-priced run total as a floor, not the bill
|
|
128
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
129
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
130
|
+
|
|
131
|
+
- **evalboard**: One set of pass-rate cutoffs, and a run table that pages through all history
|
|
132
|
+
([#69](https://github.com/UiPath/coder_eval/pull/69),
|
|
133
|
+
[`0bdac0b`](https://github.com/UiPath/coder_eval/commit/0bdac0b2bab0d9f2937a2ddc5e54b26d110a56d1))
|
|
134
|
+
|
|
135
|
+
- **evalboard**: Per-call cost/cache table from provider_call_costs (replaces inline)
|
|
136
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
137
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
138
|
+
|
|
139
|
+
- **evalboard**: Read the canonical pass rate and surface incomplete cost
|
|
140
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
141
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
142
|
+
|
|
143
|
+
- **evalboard**: Say which harness, model, and framework version a run used
|
|
144
|
+
([#69](https://github.com/UiPath/coder_eval/pull/69),
|
|
145
|
+
[`0bdac0b`](https://github.com/UiPath/coder_eval/commit/0bdac0b2bab0d9f2937a2ddc5e54b26d110a56d1))
|
|
146
|
+
|
|
147
|
+
- **litellm**: Actual per-call cost + cache accounting for the open-weight backend
|
|
148
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
149
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
150
|
+
|
|
151
|
+
### Refactoring
|
|
152
|
+
|
|
153
|
+
- **cost**: Correct the simulator-cost bound and drop the unread variant error share
|
|
154
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
155
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
156
|
+
|
|
157
|
+
- **cost**: Cut the commentary and drop unreachable rate-card keys
|
|
158
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
159
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
160
|
+
|
|
161
|
+
- **cost**: Define the unpriced-row test once, and only for new runs
|
|
162
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
163
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
164
|
+
|
|
165
|
+
- **cost**: Total_cost_usd means the whole bill everywhere
|
|
166
|
+
([#63](https://github.com/UiPath/coder_eval/pull/63),
|
|
167
|
+
[`93c7fc0`](https://github.com/UiPath/coder_eval/commit/93c7fc086bbefe74e25625dd8b77106bef736c09))
|
|
168
|
+
|
|
169
|
+
- **evalboard**: Call the UiPath harness Delegate
|
|
170
|
+
([#69](https://github.com/UiPath/coder_eval/pull/69),
|
|
171
|
+
[`0bdac0b`](https://github.com/UiPath/coder_eval/commit/0bdac0b2bab0d9f2937a2ddc5e54b26d110a56d1))
|
|
172
|
+
|
|
173
|
+
- **litellm**: Cut per-message distribution; turn-level join + per-call audit record
|
|
174
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
175
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
176
|
+
|
|
177
|
+
- **litellm**: Drop the provider field/column — unavailable on the streaming path
|
|
178
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
179
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
180
|
+
|
|
181
|
+
- **litellm**: Stream the cost log + de-duplicate the OpenRouter config comment
|
|
182
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
183
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
184
|
+
|
|
185
|
+
### Testing
|
|
186
|
+
|
|
187
|
+
- **litellm**: Cover config shape, join ordering, and defensive cost branches
|
|
188
|
+
([#66](https://github.com/UiPath/coder_eval/pull/66),
|
|
189
|
+
[`4131a2a`](https://github.com/UiPath/coder_eval/commit/4131a2a2983c347023927c66c04756595c3dbceb))
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
## v0.9.1 (2026-07-29)
|
|
193
|
+
|
|
194
|
+
### Features
|
|
195
|
+
|
|
196
|
+
- **agents**: Extend cooperative early stop to codex and antigravity
|
|
197
|
+
([`b849421`](https://github.com/UiPath/coder_eval/commit/b8494218af6870feff2a9809e3050e96da849cd8))
|
|
198
|
+
|
|
199
|
+
|
|
5
200
|
## v0.9.0 (2026-07-28)
|
|
6
201
|
|
|
7
202
|
### Features
|
|
@@ -25,6 +25,7 @@ coder_eval/
|
|
|
25
25
|
├── logging_config.py # Structured logging setup
|
|
26
26
|
├── path_utils.py # Run ID generation, path utilities
|
|
27
27
|
├── pricing.py # Model pricing / cost calculation (ModelPricing, calculate_cost, register_pricing)
|
|
28
|
+
├── litellm_cost.py # Join proxy-captured ACTUAL per-call cost/cache onto turns (LiteLLM backend; apply_actual_cost)
|
|
28
29
|
├── utils.py # Version info helpers
|
|
29
30
|
│
|
|
30
31
|
├── agents/
|
|
@@ -41,7 +42,7 @@ coder_eval/
|
|
|
41
42
|
│ ├── routing.py # ApiRoute (DirectRoute/BedrockRoute)
|
|
42
43
|
│ ├── sandbox.py # SandboxConfig, ResourceLimits
|
|
43
44
|
│ ├── tasks.py # TaskDefinition, AgentConfig, Dataset (dataset fan-out + sample)
|
|
44
|
-
│ ├── telemetry.py # CommandTelemetry, CommandStatistics, TokenUsage, ReconciliationMessage, TranscriptMessage
|
|
45
|
+
│ ├── telemetry.py # CommandTelemetry, CommandStatistics, TokenUsage, ProviderCallCost, ReconciliationMessage, TranscriptMessage
|
|
45
46
|
│ └── templates.py # RepoSource, TemplateDirSource, StarterFilesSource
|
|
46
47
|
│
|
|
47
48
|
├── criteria/ # Criterion checker plugins (one file per type)
|
|
@@ -138,7 +139,7 @@ action.yml # Published composite GitHub Action (coder-ev
|
|
|
138
139
|
- **Dataset fan-out**: `TaskDefinition.dataset` (inline rows or JSONL path) expands a single task into N row-tasks with `${row.<field>}` substitution in `initial_prompt` and `success_criteria` string fields. Expansion runs in `task_loader.expand_dataset` **before** variant resolution, so variants cannot override the dataset. Row sampling: CLI `--sample N` (fixed-seed uniform-random N over the whole dataset) overrides `--sample-per-stratum N` / `dataset.sample_per_stratum` (stratified random N-per-stratum, keyed on `stratify_field`, default `expected_skill` — for classification suites like activation). Stratified sampling (whether the N-per-stratum count comes from the **CLI** `--sample-per-stratum` flag or **YAML** `dataset.sample_per_stratum`) is **nondeterministic** by default — it re-draws each run (so the nightly activation suite broadens coverage over time). Set `dataset.sample_seed` to pin a reproducible sample; an explicit seed always wins. (Only `--sample N` uses a fixed seed, since a smoke test wants the same N rows each run.)
|
|
139
140
|
- **Per-criterion aggregation**: Each `BaseCriterion` subclass exposes `aggregate(criterion, per_row_results) -> CriterionAggregate | None`. Default emits `count / mean / median / std / min / max` so every criterion is suite-thresholdable for free. Classification-style criteria return `ClassificationCriterionResult` (subclass of `CriterionResult`) and layer accuracy / P/R/F1 / confusion via the shared `overlay_classification_metrics` utility. `BaseSuccessCriterion.suite_thresholds` gates the suite on those metrics; CLI exits non-zero on any gate failure.
|
|
140
141
|
- **Sub-agent token accounting**: There is NO separate per-sub-agent field. Every sub-agent generation is captured as a `parent_tool_use_id`-tagged `AssistantMessage` in the turn transcript, so per-sub-agent usage is derived by grouping those messages on that id (the evalboard's `aggregateSubAgentUsage` does exactly this). Claude bubbles its sub-agent's intermediate generations into the parent stream natively, and the **terminal** generation (delivered as the Agent tool result, never streamed) is synthesized into one via `_synthesize_subagent_terminal_message` from `tool_use_result.usage`. Codex reconstructs all child generations from the child rollout (`_recover_subagent_tool_calls`). The turn total already includes sub-agent cost — Claude via the SDK's cumulative `model_usage`; Codex via `_fold_subagent_tokens`, which folds the child messages (their real per-generation tokens) into the parent total. `CommandTelemetry.result_summary` is stored **untruncated** (no 200-char cap) so sub-agent returns are preserved whole. Set `CODER_EVAL_RAW_SDK_LOG=1` to dump every raw SDK event to the task log for inspection.
|
|
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.
|
|
142
|
+
- **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 LiteLLM open-weight actual-cost join (`litellm_cost.apply_actual_cost`) deliberately writes cost at the TURN level only (`token_usage.total_cost_usd` = the real OpenRouter bill) plus the per-call `TurnRecord.provider_call_costs` audit record; it does NOT touch the message token buckets, so `EventCollector` stays the single writer and this invariant holds on every backend. The Python `token_usage`/`total_token_usage` aggregate is unchanged and still authoritative for budget/judges/reports.
|
|
142
143
|
- **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.
|
|
143
144
|
- **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.
|
|
144
145
|
- **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_async` 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coder-eval
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2
|
|
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.2" # <-- kept in sync with releases by release.yml
|
|
37
37
|
run-dir:
|
|
38
38
|
description: Run directory (--run-dir)
|
|
39
39
|
required: false
|
|
@@ -51,6 +51,21 @@ run-level summary; full per-replicate detail lives in each `task.json`.
|
|
|
51
51
|
| `framework_version` | `str` | Coder Eval version chip. |
|
|
52
52
|
| `environment_info` | `dict` | Version/dependency info (may nest, e.g. `tool_plugins`). |
|
|
53
53
|
|
|
54
|
+
These are **computed**, not stored — derived from the counts and rows above on every
|
|
55
|
+
serialization, so they cannot drift from what they summarize. Read them rather than
|
|
56
|
+
re-deriving your own; independent re-derivations are how two consumers end up
|
|
57
|
+
publishing different numbers for the same run.
|
|
58
|
+
|
|
59
|
+
| Key | Type | Meaning |
|
|
60
|
+
| --- | --- | --- |
|
|
61
|
+
| `pass_rate` | `float \| None` | `tasks_succeeded / tasks_run` — errors are in the denominator, counted as misses. `None` on an empty run (0/0 is unknown, not 0%). |
|
|
62
|
+
| `error_share` | `float \| None` | `tasks_error / tasks_run`. Diagnostic only; never adjusts the rate. |
|
|
63
|
+
| `total_cost_usd` | `float \| None` | **The bill**: agent + judge + simulator, summed over the rows. `None` when nothing could be priced. |
|
|
64
|
+
| `agent_cost_usd` | `float \| None` | Subject-agent spend alone. The harness-vs-harness comparison figure — judge spend is a property of the suite's criteria and identical across harnesses, so leaving it in would make two harnesses look closer than they are. |
|
|
65
|
+
| `eval_overhead_cost_usd` | `float \| None` | Judge + simulator spend. The other half of `total_cost_usd`. |
|
|
66
|
+
| `tasks_cost_incomplete` | `int` | Rows whose recorded spend is missing money (unpriced model, or a hard kill that lost an in-flight turn). |
|
|
67
|
+
| `cost_complete` | `bool` | `tasks_cost_incomplete == 0`. When false, every cost figure above is a **floor**, not the bill. A run is never failed for this — see [Missing cost is never fatal](#missing-cost-is-never-fatal). |
|
|
68
|
+
|
|
54
69
|
### `task_results[]` — the flat per-task row
|
|
55
70
|
|
|
56
71
|
Each entry is an **untyped dict** (a denormalization, not a Pydantic model) with keys
|
|
@@ -58,7 +73,10 @@ including: `task_id`, `replicate_index`, `variant_id`, `status`
|
|
|
58
73
|
([`FinalStatus`](#finalstatus)), `weighted_score`, `duration`, `iteration_count`,
|
|
59
74
|
`tags`, `task_path`, `model_used`, `reference_similarity`, the token buckets
|
|
60
75
|
(`input_tokens` = uncached input, `output_tokens`, `cache_creation_input_tokens`,
|
|
61
|
-
`cache_read_input_tokens`, `total_tokens`),
|
|
76
|
+
`cache_read_input_tokens`, `total_tokens`), the cost fields
|
|
77
|
+
(`total_cost_usd` = agent + judge + simulator, plus the `agent_cost_usd` /
|
|
78
|
+
`judge_cost_usd` / `simulator_cost_usd` slices and the `cost_complete` flag),
|
|
79
|
+
`expected_commands`,
|
|
62
80
|
`actual_commands`, `commands_efficiency`, `agent_config`, `sdk_options`,
|
|
63
81
|
`installed_tools`, turn accounting (`total_turns`, `visible_turns`, `expected_turns`,
|
|
64
82
|
`max_turns_exhausted`, `has_final_reply`), and early-stop fields (`stopped_early`,
|
|
@@ -66,6 +84,29 @@ including: `task_id`, `replicate_index`, `variant_id`, `status`
|
|
|
66
84
|
turn digest (`{iteration, duration_seconds, command_count, assistant_turn_count,
|
|
67
85
|
crashed, crash_reason}`) — the full transcript is in `task.json`.
|
|
68
86
|
|
|
87
|
+
### Missing cost is never fatal
|
|
88
|
+
|
|
89
|
+
Pricing degrades; the evaluation does not. A model absent from the rate card, a turn
|
|
90
|
+
the backend never priced, a hard-killed task that lost its in-flight spend: each one
|
|
91
|
+
lowers a total and sets `cost_complete: false`. None of them raises, none of them
|
|
92
|
+
books a zero, and none of them changes a run's exit code.
|
|
93
|
+
|
|
94
|
+
The reasoning is that the two failure modes are not symmetric. A missing cost is
|
|
95
|
+
recoverable after the fact — the token counts are on the record, so a corrected rate
|
|
96
|
+
card reprices the run from its artifacts. A failed run is not: the tokens are already
|
|
97
|
+
spent and the only way back is to run it again. So the framework warns loudly and
|
|
98
|
+
keeps going.
|
|
99
|
+
|
|
100
|
+
The warning fires up front. `check_pricing_coverage` walks every model the run pins
|
|
101
|
+
(subject agents and judge criteria) before the first task dispatches, and logs the
|
|
102
|
+
ones the card cannot price — early enough to fix the card and restart while it is
|
|
103
|
+
still cheap. After that the run is on its own: totals become floors, and
|
|
104
|
+
`tasks_cost_incomplete` says how many rows are behind that floor.
|
|
105
|
+
|
|
106
|
+
Consumers should treat any cost field as a lower bound whenever `cost_complete` is
|
|
107
|
+
false, and must not read `None` as `0.0` — "nothing could be priced" and "it was
|
|
108
|
+
free" are different facts.
|
|
109
|
+
|
|
69
110
|
---
|
|
70
111
|
|
|
71
112
|
## `task.json` — `EvaluationResult`
|
|
@@ -127,15 +168,22 @@ fields so subclass keys round-trip.
|
|
|
127
168
|
`iteration`, `user_input`, `agent_output`, `commands` (`list[CommandTelemetry]`),
|
|
128
169
|
`timestamp`, `duration_seconds`, `token_usage`, `model_used`, `assistant_turn_count`,
|
|
129
170
|
`messages` (`list[TranscriptMessage]`, discriminated on `role`:
|
|
130
|
-
`user`/`assistant`/`reconciliation`), `
|
|
171
|
+
`user`/`assistant`/`reconciliation`), `provider_call_costs`
|
|
172
|
+
(`list[ProviderCallCost]` — one row per real upstream call with its ACTUAL cost +
|
|
173
|
+
cache buckets, captured proxy-side on the LiteLLM open-weight backend and rendered
|
|
174
|
+
by the evalboard as a per-call table; empty on every other
|
|
175
|
+
backend), `num_turns`, `max_turns_exhausted`,
|
|
131
176
|
`result_summary` (`{is_error, subtype, stop_reason, result}`), `crashed`,
|
|
132
177
|
`crash_reason`.
|
|
133
178
|
|
|
134
179
|
> **Token invariant.** Summing the four token buckets across `messages`
|
|
135
180
|
> (assistant + the synthetic `reconciliation` entry) equals `token_usage` exactly.
|
|
136
181
|
> The `reconciliation` message carries the residual the per-message stream
|
|
137
|
-
> under-reports; it has no cost and is excluded from turn/generation counts.
|
|
138
|
-
>
|
|
182
|
+
> under-reports; it has no cost and is excluded from turn/generation counts. The
|
|
183
|
+
> LiteLLM actual-cost join writes cost at the TURN level only (`token_usage.total_cost_usd`
|
|
184
|
+
> = the real bill) plus the per-call `provider_call_costs` audit record — it does
|
|
185
|
+
> NOT touch the message token buckets, so this invariant holds on every backend.
|
|
186
|
+
> See the [Claude Code guide](agents/CLAUDE_CODE.md#telemetry).
|
|
139
187
|
|
|
140
188
|
### EarlyStopInfo
|
|
141
189
|
|
|
@@ -247,6 +295,12 @@ respectively), checked after each completed agent turn — see
|
|
|
247
295
|
- `TokenUsage.total_tokens` is not serialized; sum the buckets (or use the computed
|
|
248
296
|
`input_tokens` + `output_tokens` + cache buckets).
|
|
249
297
|
- `EarlyStopInfo` presence is itself the "stopped early" signal.
|
|
298
|
+
- `total_cost_usd` is the whole bill (agent + judge + simulator) at both row and run
|
|
299
|
+
level; `agent_cost_usd` is the agent-only slice. `TokenUsage.total_cost_usd` is a
|
|
300
|
+
different thing: the cost of those tokens, so always agent-only. `run_limits.max_usd`
|
|
301
|
+
gates on that one, since judge and simulator spend is not known mid-run.
|
|
302
|
+
- A cost of `None` means unpriced, not free, and any total is a floor while
|
|
303
|
+
`cost_complete` is false — see [Missing cost is never fatal](#missing-cost-is-never-fatal).
|
|
250
304
|
|
|
251
305
|
## See also
|
|
252
306
|
|
|
@@ -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
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import { KNOWN_HARNESSES } from "@/lib/harness";
|
|
4
|
+
import { HarnessBadge, harnessShortLabel } from "../harness-badge";
|
|
5
|
+
|
|
6
|
+
describe("harnessShortLabel", () => {
|
|
7
|
+
test("every known harness has a human label", () => {
|
|
8
|
+
// A missing entry falls through to the raw id, which would put
|
|
9
|
+
// "delegate-sdk" in a legend next to "Codex" and "Antigravity".
|
|
10
|
+
for (const h of KNOWN_HARNESSES) {
|
|
11
|
+
expect(harnessShortLabel(h)).not.toBe(h);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test("the UiPath harness reads as Delegate", () => {
|
|
16
|
+
// The run data's id stays `delegate-sdk` (it's the registered
|
|
17
|
+
// `agent.type`); only the label people read is the short one.
|
|
18
|
+
expect(harnessShortLabel("delegate-sdk")).toBe("Delegate");
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test("an unknown harness falls back to its id rather than a wrong name", () => {
|
|
22
|
+
expect(harnessShortLabel("some-new-agent")).toBe("some-new-agent");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("HarnessBadge", () => {
|
|
27
|
+
test("names the vendor in the alt text, not just the product", () => {
|
|
28
|
+
render(<HarnessBadge harness="delegate-sdk" />);
|
|
29
|
+
expect(screen.getByAltText("Delegate · UiPath")).toBeInTheDocument();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("renders the id as text when there is no logo for it", () => {
|
|
33
|
+
// Better a raw id than another vendor's mark on someone else's run.
|
|
34
|
+
render(<HarnessBadge harness="some-new-agent" />);
|
|
35
|
+
expect(screen.getByText("some-new-agent")).toBeInTheDocument();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("takes a size so the chart legend can sit inside 11px text", () => {
|
|
39
|
+
render(<HarnessBadge harness="codex" size={14} />);
|
|
40
|
+
expect(screen.getByAltText("Codex · OpenAI")).toHaveAttribute(
|
|
41
|
+
"width",
|
|
42
|
+
"14",
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, expect, test, vi } from "vitest";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import { KNOWN_HARNESSES } from "@/lib/harness";
|
|
4
|
+
import { harnessShortLabel } from "../harness-badge";
|
|
5
|
+
|
|
6
|
+
// The selector reads router/params hooks; stub them so it renders in jsdom
|
|
7
|
+
// without a router provider.
|
|
8
|
+
const replace = vi.fn();
|
|
9
|
+
vi.mock("next/navigation", () => ({
|
|
10
|
+
useRouter: () => ({ replace }),
|
|
11
|
+
usePathname: () => "/",
|
|
12
|
+
useSearchParams: () => new URLSearchParams(),
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
const { HarnessSelector } = await import("../harness-selector");
|
|
16
|
+
|
|
17
|
+
describe("HarnessSelector", () => {
|
|
18
|
+
test("the all-harness segment is present and selected by default", () => {
|
|
19
|
+
render(
|
|
20
|
+
<HarnessSelector
|
|
21
|
+
current={null}
|
|
22
|
+
harnesses={[...KNOWN_HARNESSES]}
|
|
23
|
+
includeAll
|
|
24
|
+
/>,
|
|
25
|
+
);
|
|
26
|
+
expect(screen.getByRole("button", { name: "All" })).toHaveAttribute(
|
|
27
|
+
"aria-pressed",
|
|
28
|
+
"true",
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("a scoped harness reads as pressed, and All does not", () => {
|
|
33
|
+
render(
|
|
34
|
+
<HarnessSelector
|
|
35
|
+
current="codex"
|
|
36
|
+
harnesses={[...KNOWN_HARNESSES]}
|
|
37
|
+
includeAll
|
|
38
|
+
/>,
|
|
39
|
+
);
|
|
40
|
+
expect(screen.getByRole("button", { name: "Codex" })).toHaveAttribute(
|
|
41
|
+
"aria-pressed",
|
|
42
|
+
"true",
|
|
43
|
+
);
|
|
44
|
+
expect(screen.getByRole("button", { name: "All" })).toHaveAttribute(
|
|
45
|
+
"aria-pressed",
|
|
46
|
+
"false",
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("a deep-linked harness that has aged out still shows as a segment", () => {
|
|
51
|
+
// Otherwise `?h=delegate-sdk` after a quiet fortnight renders a control
|
|
52
|
+
// with nothing selected, which reads as an unscoped page.
|
|
53
|
+
render(
|
|
54
|
+
<HarnessSelector
|
|
55
|
+
current="delegate-sdk"
|
|
56
|
+
harnesses={["claude-code", "codex"]}
|
|
57
|
+
includeAll
|
|
58
|
+
/>,
|
|
59
|
+
);
|
|
60
|
+
expect(
|
|
61
|
+
screen.getByRole("button", { name: "Delegate" }),
|
|
62
|
+
).toHaveAttribute("aria-pressed", "true");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("every segment is named for screen readers, not color-only", () => {
|
|
66
|
+
render(
|
|
67
|
+
<HarnessSelector
|
|
68
|
+
current={null}
|
|
69
|
+
harnesses={[...KNOWN_HARNESSES]}
|
|
70
|
+
includeAll
|
|
71
|
+
/>,
|
|
72
|
+
);
|
|
73
|
+
// The accessible name comes from aria-label, so it survives the
|
|
74
|
+
// below-`sm` breakpoint that hides the visible text.
|
|
75
|
+
for (const h of KNOWN_HARNESSES) {
|
|
76
|
+
expect(
|
|
77
|
+
screen.getByRole("button", { name: harnessShortLabel(h) }),
|
|
78
|
+
).toBeInTheDocument();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -22,6 +22,16 @@ const HARNESS_LOGO: Record<string, { src: string; label: string; short: string }
|
|
|
22
22
|
label: "Antigravity · Google Gemini",
|
|
23
23
|
short: "Antigravity",
|
|
24
24
|
},
|
|
25
|
+
// The Delegate harness is UiPath's own (the coder_eval_uipath plugin), so
|
|
26
|
+
// its vendor mark is the UiPath logo already served for the site header
|
|
27
|
+
// rather than a per-harness file under /harness. The key stays `delegate-sdk`
|
|
28
|
+
// because that is the `agent.type` the plugin registers and therefore what
|
|
29
|
+
// run.json carries; only the label people read is shortened.
|
|
30
|
+
"delegate-sdk": {
|
|
31
|
+
src: "/uipath.png",
|
|
32
|
+
label: "Delegate · UiPath",
|
|
33
|
+
short: "Delegate",
|
|
34
|
+
},
|
|
25
35
|
};
|
|
26
36
|
|
|
27
37
|
// Short human label for a harness id ("Claude Code"), for selectors and prose.
|
|
@@ -30,7 +40,15 @@ export function harnessShortLabel(harness: string): string {
|
|
|
30
40
|
return HARNESS_LOGO[harness]?.short ?? harness;
|
|
31
41
|
}
|
|
32
42
|
|
|
33
|
-
export function HarnessBadge({
|
|
43
|
+
export function HarnessBadge({
|
|
44
|
+
harness,
|
|
45
|
+
// Square edge in px. Defaults to the runs-table size; the chart legend asks
|
|
46
|
+
// for a smaller mark so the logo sits inside a line of 11px text.
|
|
47
|
+
size = 20,
|
|
48
|
+
}: {
|
|
49
|
+
harness?: string | null;
|
|
50
|
+
size?: number;
|
|
51
|
+
}) {
|
|
34
52
|
const key = harness ?? "claude-code";
|
|
35
53
|
const logo = HARNESS_LOGO[key];
|
|
36
54
|
// Unknown harness: show the raw id rather than a misleading logo.
|
|
@@ -42,8 +60,8 @@ export function HarnessBadge({ harness }: { harness?: string | null }) {
|
|
|
42
60
|
src={logo.src}
|
|
43
61
|
alt={logo.label}
|
|
44
62
|
title={logo.label}
|
|
45
|
-
width={
|
|
46
|
-
height={
|
|
63
|
+
width={size}
|
|
64
|
+
height={size}
|
|
47
65
|
className="rounded-sm"
|
|
48
66
|
/>
|
|
49
67
|
);
|