coder-eval 0.11.2__tar.gz → 0.11.3__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.11.2 → coder_eval-0.11.3}/.github/workflows/pr-checks.yml +11 -8
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/release.yml +9 -2
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.gitignore +3 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/CHANGELOG.md +81 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/PKG-INFO +3 -1
- {coder_eval-0.11.2 → coder_eval-0.11.3}/action.yml +1 -1
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/AB_EXPERIMENTS.md +1 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/DIALOG_MODE.md +5 -3
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/TASK_DEFINITION_GUIDE.md +37 -1
- coder_eval-0.11.3/evalboard/app/_components/col-help.tsx +10 -0
- coder_eval-0.11.3/evalboard/app/_overview/__tests__/efficiency-charts.test.tsx +80 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/__tests__/harness-legend.test.tsx +38 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/__tests__/harness-series.test.ts +6 -4
- coder_eval-0.11.3/evalboard/app/_overview/efficiency-charts.tsx +104 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/harness-legend.tsx +28 -15
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/harness-series.ts +7 -3
- coder_eval-0.11.3/evalboard/app/_overview/wall-clock-chart.tsx +138 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/page.tsx +8 -19
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/trends/trends-view.tsx +75 -36
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +1 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/watchlist/watchlist-view.tsx +39 -0
- coder_eval-0.11.3/evalboard/vitest.setup.ts +22 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/.claude-plugin/plugin.json +1 -1
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/criteria.md +1 -1
- {coder_eval-0.11.2 → coder_eval-0.11.3}/pyproject.toml +14 -1
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/__init__.py +1 -1
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/claude_code_agent.py +26 -5
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/base.py +6 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/llm_judge.py +38 -9
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/checker.py +2 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_bedrock.py +12 -3
- coder_eval-0.11.3/src/coder_eval/evaluation/judge_litellm.py +148 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_usage.py +42 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/verdict_tool.py +45 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/__init__.py +4 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/criteria.py +6 -3
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/experiment.py +16 -0
- coder_eval-0.11.3/src/coder_eval/models/routing.py +385 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/tasks.py +71 -1
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/experiment.py +47 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestrator.py +100 -12
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_config_precedence.py +0 -1
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_bedrock.py +8 -1
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_burn_in_live.py +1 -1
- coder_eval-0.11.3/tests/test_judge_litellm.py +209 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_litellm_cost.py +3 -3
- coder_eval-0.11.3/tests/test_litellm_judge_live.py +69 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_litellm_route.py +261 -31
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_llm_judge_criterion.py +89 -10
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_models.py +6 -2
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_orchestrator.py +81 -6
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_route_seam_exhaustiveness.py +7 -3
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_routing.py +32 -15
- {coder_eval-0.11.2 → coder_eval-0.11.3}/uv.lock +401 -2
- coder_eval-0.11.2/evalboard/app/_components/col-help.tsx +0 -131
- coder_eval-0.11.2/evalboard/vitest.setup.ts +0 -1
- coder_eval-0.11.2/src/coder_eval/models/routing.py +0 -225
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-code-review-full.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-code-review-wf.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-code-review.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-create-plan.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-implement-plan.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/commands/coder-eval-review.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/harness-candidates.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/shared/axes.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/shared/multi-model-review.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/shared/review-rubric.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/shared/run-layout.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/workflows/cr-axis.js +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude/workflows/cr-parent.js +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.claude-plugin/marketplace.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.env.example +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/CODEOWNERS +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/ISSUE_TEMPLATE/adopter.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/actionlint.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/code_review.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/dependabot.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/pages-stub/index.html +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/scripts/release_notes.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/claude-pr-review.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/codeql.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/conventional-commits.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/docker-publish.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/docs.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/publish-testpypi.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.github/workflows/verify-published-action.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.pre-commit-config.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/.python-version +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/ADOPTERS.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/CLAUDE.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/CODE_OF_CONDUCT.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/CONTRIBUTING.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/LICENSE +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/Makefile +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/NOTICE +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/README.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/SECURITY.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/comparison.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docker/Dockerfile +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docker/Dockerfile.runtime +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docker/coder_eval_entrypoint.sh +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docker/coder_eval_runtime_entrypoint.sh +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/CI_GATE.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/DATASETS.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/DOCKER_ISOLATION.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/EXTENDING.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/PLUGIN.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/REPORT_SCHEMA.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/USER_GUIDE.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/agents/ANTIGRAVITY.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/agents/CLAUDE_CODE.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/agents/CODEX.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/agents/HARNESS_PARITY.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/assets/hero.gif +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/comparison.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/index.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/llms.txt +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/01-first-evaluation.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/02-ci-pipeline.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/03-evalboard-local.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/04-writing-a-task.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/05-comparing-models.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/06-use-docker-isolation.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/07-plugin-in-claude-code.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/docs/tutorials/README.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/.gitignore +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/README.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/__tests__/harness-badge.test.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/__tests__/harness-selector.test.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/collapsible-rail.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/harness-badge.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/harness-selector.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/scroll-table.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/search-box.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/unit-toggle.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_components/version-list.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_lib/__tests__/source-param.test.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_lib/source-param.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/daily-chart.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/tag-rail.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/window-summary.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/api/download/route.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/api/file/route.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/api/refresh/route.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/error.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/globals.css +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/icon.png +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/layout.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/path-to-ga/__tests__/task-table.test.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/path-to-ga/page.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/path-to-ga/task-table.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/scribe/page.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/scribe/run-table.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/trends/actions.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/trends/page.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/watchlist/page.tsx +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/next-env.d.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/next.config.mjs +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/package.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/pnpm-lock.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/postcss.config.mjs +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/public/harness/antigravity.png +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/public/harness/claude-code.png +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/public/harness/codex.png +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/public/uipath.png +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/tailwind.config.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/tsconfig.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/vitest.config.ts +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/default.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/early-stop-ab.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/model-comparison.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/permissions-smoke.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/plugin-comparison.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/prompt-mutations-example.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/experiments/smoke_variants.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/litellm/README.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/litellm/cost_logger.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/litellm/litellm-config.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/litellm/start-litellm.sh +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/mkdocs.yml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/osv-scanner.toml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/README.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/cli-setup.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/repo-layout.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/run-layout.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/task-rubric.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/templates/activation-rows.jsonl +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/reference/templates/activation.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/analyze/SKILL.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/check-skill/SKILL.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/ci/SKILL.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/init/SKILL.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/lint-tasks/SKILL.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/plugins/coder-eval/skills/task/SKILL.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/scripts/check_commit_msg.sh +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/.gitattributes +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/_logging.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/antigravity_agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/codex_agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/noop_agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/registry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/agents/watchdog.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/analysis.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/aggregate_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/console.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/evaluate_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/plan_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/report_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/run_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/run_helpers.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/run_task_internal_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/cli/utils.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/config.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/agent_judge.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/classification_match.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/cli_called.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/command_executed.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/commands_efficiency.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/file_check.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/file_contains.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/file_exists.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/file_matches_regex.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/json_check.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/reference_comparison.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/run_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/skill_triggered.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/criteria/uipath_eval.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/budget.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/categories.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/categorization.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/checker_misuse.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/executor.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/judge.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/reference.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/retry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/errors/timeout.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_context.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_models.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/judge_persistence.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/sub_agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/evaluation/summaries.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/formatting.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/fs_permissions.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/invocation_log.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/isolation/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/isolation/docker_runner.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/litellm_cost.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/logging_config.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/agent_config.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/container_paths.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/enums.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/judge.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/judge_defaults.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/limits.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/merge_strategy.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/mutations.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/results.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/sandbox.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/telemetry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/models/templates.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/batch.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/config.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/config_merge.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/early_stop.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/evaluation.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/overrides.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/run_limits.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/orchestration/task_loader.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/path_utils.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/plugins.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/pricing.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/py.typed +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports_experiment.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports_html.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports_junit.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/reports_stats.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/resources/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/resources/tags.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/sandbox.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/ast_similarity.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/complexity.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/quality.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/signature_similarity.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/similarity.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/scoring/token_similarity.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/simulation/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/simulation/termination.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/simulation/user_simulator.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/callbacks.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/collector.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/events.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/renderers.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/streaming/wire.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/telemetry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/src/coder_eval/utils.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/README.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agentless_smoke_test.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/antigravity_hello_world.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/claude_hello_world.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/claude_hello_world_docker.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/claude_subagent_test.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_hello_world.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_parallel_commands.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_skills_test.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_string_utils.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/codex_subagent_test.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/subagent_bash_long_input.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/agents/subagent_merge_sort.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/anti_cheat_reference/anti_cheat_reference.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/anti_cheat_reference/reference/solution.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/byod_smoke_test.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dataset_example.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/datasets/sentiment.jsonl +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/environment/input.txt +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/early_stop_decision_budget_exceeded.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/early_stop_weighted_high_weight_kills_run.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/early_stop_weighted_low_weight_absorbed.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/fibonacci_with_template.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/hello_date.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/inline_starter_example.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/internal/session_resumption.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_smoke.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/run_limits/max_turns_cap.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/run_limits/turn_timeout.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/README.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/sentiment_classification.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_agent_judge.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_budget_exceeded.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_llm_judge.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_negative_path.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_task_timeout.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/smoke_variants.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/test_sandbox.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tasks/token_check.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/templates/byod_smoke_test/Dockerfile +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/templates/fibonacci-starter/README.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/templates/fibonacci-starter/src/main.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/templates/fibonacci-starter/tests/test_main.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/_scrub.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/live_criteria.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/run_full.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/_path_helpers.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/conftest.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/mock_agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/tasks/test_task_informational_criterion.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/fixtures/text_stub_agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/action_docs.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/dead_config_fields.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/doc_env_parity.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/doc_examples.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/doc_indexes.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/doc_schema_parity.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/generated.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/live_verdict_contract.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/plugin_reference.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/pyright_config.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/__init__.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/base.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce032_criteria_path_seam.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce037_no_dead_private_helper.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce038_acquire_inside_try.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce039_config_error_escalates.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/ce043_no_command_output_truncation.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_agent_timing_access.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_silent_except.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_submodule_model_imports.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/open_explicit_encoding.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/register_criterion_required.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/runner.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/violation.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/lint/workflow_outputs.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_action_version_pin.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_config_no_timing_fields.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_config_optional_type.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_config_registry_dispatch.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_config_sdk_decoupling.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_golden_master.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_judge_criterion.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_telemetry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_telemetry_advanced.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agent_timeout.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_agentless.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_aggregate.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_antigravity_agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_byoa_plugin.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_byoa_plugin_live.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_byod_feature.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_check_all_async.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_checker_logging.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_classification_match.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_claude_settings_enforcement_live.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cleanup_preservation_guard.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_backend_flag.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_called_criterion.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_empty_glob.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_sdk_options.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_set_overrides.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_telemetry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cli_type_flag.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_code_review_bugs.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_codex_agent.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_codex_agent_live.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_codex_agent_unit.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_codex_token_mapping.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_command_executed.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_command_statistics.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_command_telemetry_result_data.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_commands_efficiency.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_config_lineage.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_config_merge_engine.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_continuous_scoring.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_cost_accounting_paths.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_criterion_result_round_trip.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_custom_lint.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_dataset_expansion.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_debug_logging.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_build_failure.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_litellm_env.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_runner_container_death.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_runner_mounts.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_runner_stream_limit.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_wildcard_env.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_docker_workdir_live.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_driver_resolver.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_early_stop.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_error_handling.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_evaluate_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_evaluator.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_event_collector.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_cli.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_loader.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_models.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_reports.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_resolver.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_experiment_runner.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_file_check.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_file_contains_scoring.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_formatting.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_git_clone_failure.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_glob_paths_in_file_criteria.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_heartbeat_watchdog.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_ignore_patterns_negation.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_image_from_dockerfiles.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_integration.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_json_check.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_anthropic.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_context_builder.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_models.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_judge_persistence.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_lint_no_top_level_run_limits.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_lint_runner.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_litellm_config.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_litellm_cost_logger.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_log_tail_buffer.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_logging.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_logging_isolation.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_merge_characterization.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_merge_strategy_annotations.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_merge_unification.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_mutations.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_new_criteria.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_node_env_config.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_optional_dependencies.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_orchestrator_error_log_tail.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_orchestrator_telemetry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_overrides_engine.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_parallel.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_path_utils.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_plan_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_plugin_processing.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_plugins.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_post_run.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_pr_review_workflow.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_pre_run.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_preservation_mode.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_pricing_registry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_comparison_scoring.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_evaluator.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_missing_file.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_models.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reference_permissions.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_registry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_release_notes.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_replicate_stats.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_report_command.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_experiment.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_html.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_junit.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_stats.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_reports_stats_nonfinite.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_resolve_task_files.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_resume.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_retry_logic_comprehensive.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_command_junit.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_command_stdout.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_limits_models.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_limits_orchestrator.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_limits_resolver.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_run_metrics.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_runtime_tool_versions.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_layer_builder.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_optional.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_record_cli.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_security.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_symlink_preservation.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sandbox_templates.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_scorers.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_scoring_quality.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sdk_option_classification.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_simulation_config.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_simulation_integration.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_simulation_termination.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_simulation_trials.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_skill_triggered.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_agent_integration.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_batch.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_callbacks.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_cli.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_events.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_orchestrator.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_renderers.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_streaming_wire.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_sub_agent_runner.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_success_criterion_union.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_suite_rollup.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_summaries.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_tags.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_task_definition_unknown_fields.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_teardown_interrupt.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_telemetry.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_template_env_expansion.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_threshold_enforcement.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_batch.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_categorization.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_exceptions.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_models.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_timeout_orchestrator.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_token_usage.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_uipath_eval.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_user_simulator.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_utils.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_utterance_extraction.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_variant_prompt_file.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_verdict_tool.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_verify_published_workflow.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_visible_turn_cap.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_watchdog.py +0 -0
- {coder_eval-0.11.2 → coder_eval-0.11.3}/tests/test_yaml_migration.py +0 -0
|
@@ -80,7 +80,7 @@ jobs:
|
|
|
80
80
|
pip install uv
|
|
81
81
|
|
|
82
82
|
- name: Install project dependencies (hash-verified from uv.lock)
|
|
83
|
-
run: uv sync --frozen --extra dev --extra uipath --extra codex
|
|
83
|
+
run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm
|
|
84
84
|
|
|
85
85
|
# PHASE 1: Fast checks (fail early)
|
|
86
86
|
- name: Check code formatting (ruff format)
|
|
@@ -385,7 +385,7 @@ jobs:
|
|
|
385
385
|
pip install uv
|
|
386
386
|
|
|
387
387
|
- name: Install project dependencies (hash-verified from uv.lock)
|
|
388
|
-
run: uv sync --frozen --extra dev --extra uipath --extra codex
|
|
388
|
+
run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm
|
|
389
389
|
|
|
390
390
|
- name: Check code formatting (ruff format)
|
|
391
391
|
run: .venv/Scripts/ruff format --check src/ tests/
|
|
@@ -843,8 +843,8 @@ jobs:
|
|
|
843
843
|
python -m pip install --upgrade "pip>=26.2" # PYSEC-2026-3721 fix floor
|
|
844
844
|
pip install uv
|
|
845
845
|
|
|
846
|
-
- name: Install project dependencies (with codex
|
|
847
|
-
run: uv sync --frozen --extra dev --extra uipath --extra codex
|
|
846
|
+
- name: Install project dependencies (with codex + litellm extras)
|
|
847
|
+
run: uv sync --frozen --extra dev --extra uipath --extra codex --extra litellm
|
|
848
848
|
|
|
849
849
|
- name: Verify required secrets are present
|
|
850
850
|
run: |
|
|
@@ -854,14 +854,17 @@ jobs:
|
|
|
854
854
|
fi
|
|
855
855
|
echo "CODEX_API_KEY present."
|
|
856
856
|
|
|
857
|
-
- name: Run Codex live tests
|
|
857
|
+
- name: Run Codex + litellm-judge live tests
|
|
858
858
|
run: |
|
|
859
859
|
mkdir -p tmp
|
|
860
860
|
# Run serially: `-n0` overrides the global `-n auto` (addopts).
|
|
861
861
|
# Parallel xdist workers share ~/.codex and race the Codex SQLite
|
|
862
862
|
# state migration (`duplicate column name: thread_id`); serial init
|
|
863
|
-
# migrates the fresh DB exactly once.
|
|
864
|
-
|
|
863
|
+
# migrates the fresh DB exactly once. test_litellm_judge_live.py
|
|
864
|
+
# reuses these same CODEX_* secrets to exercise
|
|
865
|
+
# checker_context.api_route.route: litellm end-to-end (PR #137
|
|
866
|
+
# review: "nothing in the repo exercises the feature").
|
|
867
|
+
.venv/bin/pytest tests/test_codex_agent_live.py tests/test_litellm_judge_live.py \
|
|
865
868
|
-m live -n0 -v --tb=short --strict-markers -ra \
|
|
866
869
|
--junit-xml=tmp/junit-codex-live.xml
|
|
867
870
|
|
|
@@ -878,7 +881,7 @@ jobs:
|
|
|
878
881
|
passed = total - skipped - errors - failures
|
|
879
882
|
print(f"codex-live passed={passed} skipped={skipped} errors={errors} failures={failures}")
|
|
880
883
|
if passed < 1:
|
|
881
|
-
sys.exit("
|
|
884
|
+
sys.exit("Live Codex/litellm-judge tests reported zero PASSED tests (missing API key / silent skip?)")
|
|
882
885
|
PY
|
|
883
886
|
|
|
884
887
|
- name: Upload Codex live-test artifacts on failure
|
|
@@ -140,7 +140,14 @@ jobs:
|
|
|
140
140
|
fi
|
|
141
141
|
|
|
142
142
|
- name: Install build + release tools
|
|
143
|
-
|
|
143
|
+
# Pinned: python-semantic-release declares gitpython~=3.0, so an
|
|
144
|
+
# unpinned install can resolve GitPython 3.1.60+, which removed
|
|
145
|
+
# git.Actor.name_email_regex and breaks semantic-release's `version`
|
|
146
|
+
# command outright ("type object 'Actor' has no attribute
|
|
147
|
+
# 'name_email_regex'"). Pin both explicitly until upstream adapts.
|
|
148
|
+
run: |
|
|
149
|
+
uv tool install python-semantic-release==10.6.1 --with gitpython==3.1.59
|
|
150
|
+
uv tool install twine
|
|
144
151
|
|
|
145
152
|
- name: Run semantic-release (bump + tag, no push yet)
|
|
146
153
|
id: release
|
|
@@ -157,7 +164,7 @@ jobs:
|
|
|
157
164
|
# version to pyproject.toml + __init__.py, tags it, and regenerates the
|
|
158
165
|
# changelog, but does not push yet (--no-push) so we can regenerate
|
|
159
166
|
# uv.lock and amend before sending.
|
|
160
|
-
PSR="uv tool run --from python-semantic-release semantic-release"
|
|
167
|
+
PSR="uv tool run --from python-semantic-release==10.6.1 --with gitpython==3.1.59 semantic-release"
|
|
161
168
|
$PSR version "--$BUMP" --no-vcs-release --no-push --changelog
|
|
162
169
|
# A dispatch always cuts a release; report the just-published version.
|
|
163
170
|
echo "version=$($PSR version --print)" >> "$GITHUB_OUTPUT"
|
|
@@ -2,6 +2,87 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.11.3 (2026-08-27)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **checker-context**: Typed model, reject litellm+agent_judge/sim, live test
|
|
10
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
11
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
12
|
+
|
|
13
|
+
- **eval-routing**: Restore DEFAULT_JUDGE_MODEL floor + add litellm judge transport
|
|
14
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
15
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
16
|
+
|
|
17
|
+
- **evalboard**: Exclude carried-forward passes from the wall-clock aggregates
|
|
18
|
+
([#125](https://github.com/UiPath/coder_eval/pull/125),
|
|
19
|
+
[`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
|
|
20
|
+
|
|
21
|
+
- **release**: Pin python-semantic-release + GitPython to unbreak version bump
|
|
22
|
+
([#139](https://github.com/UiPath/coder_eval/pull/139),
|
|
23
|
+
[`ef74014`](https://github.com/UiPath/coder_eval/commit/ef74014d3dd4b389f794e0cba743fc67ed430df8))
|
|
24
|
+
|
|
25
|
+
- **routing**: Make _resolve_backend_route's match exhaustive
|
|
26
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
27
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
28
|
+
|
|
29
|
+
### Continuous Integration
|
|
30
|
+
|
|
31
|
+
- Retrigger checks (GH Actions appeared stalled repo-wide)
|
|
32
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
33
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
34
|
+
|
|
35
|
+
- Retrigger checks (previous push did not trigger CI)
|
|
36
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
37
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
38
|
+
|
|
39
|
+
- **fix**: Install litellm extra for pyright, address CodeQL findings
|
|
40
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
41
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
42
|
+
|
|
43
|
+
### Documentation
|
|
44
|
+
|
|
45
|
+
- **timing**: Trim justification prose from the wall-clock comments
|
|
46
|
+
([#125](https://github.com/UiPath/coder_eval/pull/125),
|
|
47
|
+
[`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
|
|
48
|
+
|
|
49
|
+
### Features
|
|
50
|
+
|
|
51
|
+
- **eval-routing**: Decouple judge/agent_judge backend+model from the agent's own route
|
|
52
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
53
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
54
|
+
|
|
55
|
+
- **eval-routing**: Decouple judge/agent_judge backend+model from the agent's route
|
|
56
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
57
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
58
|
+
|
|
59
|
+
- **evalboard**: Chart seconds per passed task on the overview
|
|
60
|
+
([#125](https://github.com/UiPath/coder_eval/pull/125),
|
|
61
|
+
[`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
|
|
62
|
+
|
|
63
|
+
- **evalboard**: Read the time ratio without hovering
|
|
64
|
+
([#125](https://github.com/UiPath/coder_eval/pull/125),
|
|
65
|
+
[`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
|
|
66
|
+
|
|
67
|
+
- **evalboard**: Replace the turn-budget signal with time per passed task
|
|
68
|
+
([#125](https://github.com/UiPath/coder_eval/pull/125),
|
|
69
|
+
[`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
|
|
70
|
+
|
|
71
|
+
- **evalboard**: Run the wall-clock signal beside the turn budget, behind tabs
|
|
72
|
+
([#125](https://github.com/UiPath/coder_eval/pull/125),
|
|
73
|
+
[`dd918e6`](https://github.com/UiPath/coder_eval/commit/dd918e68a454f39c8254f74fe2e4f346cff3a16f))
|
|
74
|
+
|
|
75
|
+
- **litellm-judge**: Support arbitrary litellm kwargs via params/auth
|
|
76
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
77
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
78
|
+
|
|
79
|
+
### Refactoring
|
|
80
|
+
|
|
81
|
+
- **litellm-judge**: Drop settings coupling, rename auth to env_params
|
|
82
|
+
([#137](https://github.com/UiPath/coder_eval/pull/137),
|
|
83
|
+
[`727bb7b`](https://github.com/UiPath/coder_eval/commit/727bb7bee459b43c51af93067907687c5e04cfc8))
|
|
84
|
+
|
|
85
|
+
|
|
5
86
|
## v0.11.2 (2026-08-24)
|
|
6
87
|
|
|
7
88
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: coder-eval
|
|
3
|
-
Version: 0.11.
|
|
3
|
+
Version: 0.11.3
|
|
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
|
|
@@ -58,6 +58,8 @@ Requires-Dist: pytest-mock>=3.15.1; extra == 'dev'
|
|
|
58
58
|
Requires-Dist: pytest-xdist[psutil]>=3.0.0; extra == 'dev'
|
|
59
59
|
Requires-Dist: pytest>=9.0.2; extra == 'dev'
|
|
60
60
|
Requires-Dist: ruff>=0.15.7; extra == 'dev'
|
|
61
|
+
Provides-Extra: litellm
|
|
62
|
+
Requires-Dist: litellm<2.0.0,>=1.95.0; extra == 'litellm'
|
|
61
63
|
Provides-Extra: uipath
|
|
62
64
|
Requires-Dist: uipath>=2.10.31; extra == 'uipath'
|
|
63
65
|
Description-Content-Type: text/markdown
|
|
@@ -41,7 +41,7 @@ inputs:
|
|
|
41
41
|
version:
|
|
42
42
|
description: coder-eval version to install from PyPI, or "local" to install from the action checkout
|
|
43
43
|
required: false
|
|
44
|
-
default: "0.11.
|
|
44
|
+
default: "0.11.3" # <-- kept in sync with releases by release.yml
|
|
45
45
|
run-dir:
|
|
46
46
|
description: Run directory (--run-dir)
|
|
47
47
|
required: false
|
|
@@ -130,6 +130,7 @@ From `ExperimentVariant` (`coder_eval/models/experiment.py`):
|
|
|
130
130
|
| `initial_prompt_file` | str | Prompt replacement loaded from a file |
|
|
131
131
|
| `run_limits` | block | Per-key cap overrides (`max_turns`, `task_timeout`, token/USD budgets) |
|
|
132
132
|
| `driver` | `tempdir`/`docker` | Sandbox driver — enables tempdir-vs-docker arms |
|
|
133
|
+
| `checker_context` | dict | Backend/model override for the evaluation side (judge, simulator) — see [Checker Context](TASK_DEFINITION_GUIDE.md#checker-context); **not** currently `-D`-reachable |
|
|
133
134
|
|
|
134
135
|
The `agent` dict is the lever for most A/B tests. Anything on `AgentConfig` is
|
|
135
136
|
fair game: `model`, `permission_mode`, `allowed_tools`, `disallowed_tools`,
|
|
@@ -60,9 +60,11 @@ The mechanics:
|
|
|
60
60
|
- The simulator is a **tools-disabled Claude Code agent** with `allowed_tools: []`, an explicit
|
|
61
61
|
deny-list, and no plugins or settings sources. It is pure text-in / text-out, and it **cannot see
|
|
62
62
|
the sandbox** — no files, no terminal, no agent reasoning. Only what the agent writes in the chat.
|
|
63
|
-
- The simulator
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
- The simulator runs on the run's resolved *evaluation* `ApiRoute` — the coding agent's own route
|
|
64
|
+
(`--backend direct` / `--backend bedrock`) unless `checker_context.api_route.route` overrides it
|
|
65
|
+
(see [Checker Context](TASK_DEFINITION_GUIDE.md#checker-context)). The **model** is separately
|
|
66
|
+
pinned by `simulation.model` (see [Simulation](TASK_DEFINITION_GUIDE.md#simulation)), not inherited
|
|
67
|
+
from the route — so an A/B varying the subject model doesn't silently vary the simulated user too.
|
|
66
68
|
|
|
67
69
|
**Agent-kind constraint.** The *subject* agent can be any registered kind — the dialog driver only
|
|
68
70
|
calls the agent's `communicate()`, so Codex and plugin agents work. The *simulator*, however, is
|
|
@@ -35,6 +35,7 @@ Complete reference for defining evaluation tasks in Coder Eval.
|
|
|
35
35
|
- [llm_judge](#llm_judge)
|
|
36
36
|
- [agent_judge](#agent_judge)
|
|
37
37
|
- [skill_triggered](#skill_triggered)
|
|
38
|
+
- [Checker Context](#checker-context)
|
|
38
39
|
- [Reference Solutions](#reference-solutions)
|
|
39
40
|
- [Pre-Run Commands](#pre-run-commands)
|
|
40
41
|
- [Post-Run Commands](#post-run-commands)
|
|
@@ -63,6 +64,7 @@ reference: { ... } # Optional reference solution (a directory
|
|
|
63
64
|
pre_run: [ ... ] # Optional pre-run commands (before agent starts)
|
|
64
65
|
post_run: [ ... ] # Optional post-run commands
|
|
65
66
|
dataset: { ... } # Optional dataset fan-out (one task -> N row-tasks)
|
|
67
|
+
checker_context: { ... } # Optional: backend/model for the evaluation side (judge, simulator)
|
|
66
68
|
```
|
|
67
69
|
|
|
68
70
|
### `dataset`
|
|
@@ -1295,6 +1297,40 @@ Observed label is `"yes"` when either signal is found, else `"no"`. Expected lab
|
|
|
1295
1297
|
|
|
1296
1298
|
**Typical pattern.** Label each dataset row with its true skill (`expected_skill`, `""` for negatives) and stack one `skill_triggered` criterion per skill against the same dataset — each gets its own confusion matrix from the same agent traces. This is the natural companion to a skill A/B experiment (skill plugin on vs. off); see the [A/B Experiment Guide](AB_EXPERIMENTS.md#recipe-ab-a-skill).
|
|
1297
1299
|
|
|
1300
|
+
## Checker Context
|
|
1301
|
+
|
|
1302
|
+
`checker_context` carries task-authored config for the success-checking side, namespaced by reserved key. Currently the only recognized namespace is **`api_route`**:
|
|
1303
|
+
|
|
1304
|
+
```yaml
|
|
1305
|
+
success_criteria:
|
|
1306
|
+
- type: llm_judge
|
|
1307
|
+
prompt: "Grade the fix for correctness."
|
|
1308
|
+
|
|
1309
|
+
checker_context:
|
|
1310
|
+
api_route:
|
|
1311
|
+
route: bedrock # which backend the whole eval side (llm_judge/agent_judge/simulator) uses
|
|
1312
|
+
model: claude-haiku-4-5 # model override for that route
|
|
1313
|
+
```
|
|
1314
|
+
|
|
1315
|
+
- `route` selects which backend the WHOLE evaluation side calls (`llm_judge`, `agent_judge`, and the simulator all share one resolved eval route per run — this isn't per-criterion), **decoupled from the agent's own route** (a Claude agent can be graded by a differently-backed judge, or vice versa). This is a backend *name* (`direct` / `bedrock` / `litellm`), not a route object. For `direct`/`bedrock` credentials are never read from the task, always from the matching environment variables (`ANTHROPIC_API_KEY` for `direct`, `AWS_BEARER_TOKEN_BEDROCK`/`AWS_REGION` for `bedrock`). An unconfigured or unknown backend name raises at dispatch rather than silently falling back. **`route: litellm` dispatches `llm_judge` through the `litellm` library** (the `coder-eval[litellm]` extra, `litellm.acompletion`) rather than assuming one wire protocol — a gateway-routed judge model (e.g. an Azure AI `/openai/v1` deployment) rarely speaks Anthropic Messages, so this lets `model` carry its own provider hint (e.g. `azure/gpt-5.6-luna`) and get that provider's actual request/response shape handled by the library. Unlike the other two backends, `route: litellm` has NO implicit env-var fallback — see `params`/`env_params` below, which is how it's configured. `model` is required for `route: litellm` (there is no default open-weight/gateway model).
|
|
1316
|
+
- `model` overrides the model that resolved route uses for **`llm_judge` only** — when the criterion itself leaves `model:` unset (precedence: an explicit per-criterion `model:` always wins; below that, `checker_context.api_route.model`; below that, the built-in `DEFAULT_JUDGE_MODEL`). This floor is deliberate and never the agent's own model — an unpinned judge must grade identically regardless of which model the agent under test is using, so `resolve_evaluation_route` never lets the agent's env-configured model (e.g. `BEDROCK_MODEL`) leak into `route.model` on its own; `route.model` is set only when this override was actually given. This works because every `ApiRoute` (`DirectRoute`/`BedrockRoute`/`LiteLLMRoute`) carries its own `model` field; the orchestrator bakes the override into the resolved route's `model` before any criterion runs, so `llm_judge` just reads `context.route.model` — it never reads `checker_context` directly. **`agent_judge` and the simulator do not honor this override** — `agent_judge`'s sub-agent model comes from the criterion's own `agent:` block (defaulted to a fixed judge model), and the simulator's model is pinned by `SimulationConfig.model` (see [Simulation](#simulation) below) — both independent of `checker_context.api_route.model` by design, for the same "measuring instrument stays fixed" reason.
|
|
1317
|
+
- `params`/`env_params` (**`route: litellm` only**) are how the call is actually configured — there is no fallback to the agent's own `LITELLM_BASE_URL`/`LITELLM_AUTH_TOKEN` env vars, since a gateway-routed judge model rarely reuses the agent's own LiteLLM proxy/credential. They also cover any of the dozens of other provider-specific kwargs `litellm.acompletion` accepts (`aws_access_key_id`, `vertex_project`, `api_version`, ...), which have no dedicated field on `LiteLLMRoute`:
|
|
1318
|
+
```yaml
|
|
1319
|
+
checker_context:
|
|
1320
|
+
api_route:
|
|
1321
|
+
route: litellm
|
|
1322
|
+
model: azure/gpt-5.6-luna
|
|
1323
|
+
params: # arbitrary literal passthrough kwargs to litellm.acompletion
|
|
1324
|
+
api_version: "2024-05-01"
|
|
1325
|
+
env_params: # param name -> ENV VAR NAME (never the secret itself)
|
|
1326
|
+
api_base: LITELLM_BASE_URL
|
|
1327
|
+
api_key: LITELLM_AUTH_TOKEN
|
|
1328
|
+
```
|
|
1329
|
+
`params` is merged straight into the `litellm.acompletion(**kwargs)` call — litellm validates the param names itself, so there's no allowlist to keep in sync here. `env_params` maps a kwarg name to the *name* of an environment variable; the value is resolved right before the call, so no secret is ever written into task/experiment YAML — this is how an arbitrary provider's config, including secrets (IAM keys, an Azure AD token, a service-account path, ...), is representable without a dedicated field per provider. `env_params` is resolved after `params`, so it always wins for the same key. Rejected at task-load time if given without `route: litellm`. For an Azure deployment, pin `api_version` via `params` to whatever API version the agent side is actually configured for (e.g. Codex's `CODEX_API_VERSION`) — the judge has no way to inherit it, and a mismatched version can hit a different shape of the same endpoint.
|
|
1330
|
+
**`route: litellm` is `llm_judge`-only** — `agent_judge` and the simulator run as real Claude Code CLI subprocesses that speak the Anthropic Messages protocol, so pointing them at an arbitrary litellm-fronted gateway (which may speak an entirely different wire protocol) isn't representable. The orchestrator rejects the combination at resolution time (a clear error, not a silent misroute) if the task has an enabled `agent_judge` criterion or `simulation.enabled: true` alongside `route: litellm` — use `route: bedrock`/`direct` for those instead.
|
|
1331
|
+
|
|
1332
|
+
`checker_context` merges shallow-per-namespace across `default_experiment.defaults.checker_context` → `experiment.defaults.checker_context` → `task.checker_context` → `variant.checker_context` (same 4-layer precedence as `agent`/`simulation`). So a judge-model A/B, or a judge-backend A/B, is a variant-level config change, not an edit to every task YAML.
|
|
1333
|
+
|
|
1298
1334
|
## Reference Solutions
|
|
1299
1335
|
|
|
1300
1336
|
A reference solution is always a **directory**, given relative to the task YAML's own directory:
|
|
@@ -1577,7 +1613,7 @@ simulation:
|
|
|
1577
1613
|
| `check_criteria` | `end_of_dialog` | `end_of_dialog`, `every_turn`, or `both`. |
|
|
1578
1614
|
| `model` | `anthropic.claude-sonnet-4-6` | Model that plays the simulated user. Auto-translated to the run's backend (Bedrock inference profile / bare Anthropic alias), the same way [`llm_judge`](#llm_judge)'s `model` is. |
|
|
1579
1615
|
|
|
1580
|
-
The simulator runs as a tools-disabled Claude Code agent
|
|
1616
|
+
The simulator runs as a tools-disabled Claude Code agent on the run's resolved *evaluation* `ApiRoute` (the coding agent's own route unless [`checker_context.api_route.route`](#checker-context) overrides it), so temperature and sampling are resolved at the route level (same `-b` flag as the coding agent by default) and are not configured on this block. The **model is not**: it is pinned by `model` above. Inheriting it from the route meant `BEDROCK_MODEL` decided who the simulated user was, so an A/B varying the subject model silently varied its interlocutor too. Hold `model` fixed across variants for the same reason you hold a judge model fixed — the simulator is part of the measuring instrument, not the thing being measured.
|
|
1581
1617
|
|
|
1582
1618
|
**Semantics:**
|
|
1583
1619
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Column definitions, surfaced as native `title` tooltips on table headers.
|
|
2
|
+
// Shared by the run-page task grid and the task-page message timeline so the two
|
|
3
|
+
// describe the same number the same way. Wording is page-neutral (no "this task"
|
|
4
|
+
// / "this call") because both surfaces read the same string.
|
|
5
|
+
export const TOKEN_COLUMN_HELP = {
|
|
6
|
+
input: "Input tokens (uncached): fresh prompt input billed at the full input rate — the slice that was neither written to nor read from the prompt cache.",
|
|
7
|
+
output: "Output tokens: text, code, tool arguments and reasoning the model generated.",
|
|
8
|
+
cw: "Cache-write tokens: context newly written into the prompt cache (cache_creation_input_tokens).",
|
|
9
|
+
cr: "Cache-read tokens: cached input re-billed on every later call (cache_read_input_tokens). Usually the dominant cost line.",
|
|
10
|
+
} satisfies Record<string, string>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { fireEvent, render, screen } from "@testing-library/react";
|
|
3
|
+
import type { RunPoint } from "@/lib/overview";
|
|
4
|
+
import { EfficiencyCharts } from "../efficiency-charts";
|
|
5
|
+
|
|
6
|
+
function point(overrides: Partial<RunPoint> = {}): RunPoint {
|
|
7
|
+
return {
|
|
8
|
+
runId: "2026-08-18_04-51-58",
|
|
9
|
+
timestamp: Date.UTC(2026, 7, 18),
|
|
10
|
+
harness: "codex",
|
|
11
|
+
successRate: 96,
|
|
12
|
+
turnBudgetRate: 87,
|
|
13
|
+
withinExpectedTimeRate: 78,
|
|
14
|
+
timePerPassedTask: 192,
|
|
15
|
+
...overrides,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function renderCharts(scoped = false) {
|
|
20
|
+
return render(
|
|
21
|
+
<EfficiencyCharts
|
|
22
|
+
data={[point()]}
|
|
23
|
+
harnesses={["codex"]}
|
|
24
|
+
windowStart={Date.UTC(2026, 7, 1)}
|
|
25
|
+
windowEnd={Date.UTC(2026, 7, 31)}
|
|
26
|
+
scoped={scoped}
|
|
27
|
+
/>,
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
describe("EfficiencyCharts", () => {
|
|
32
|
+
test("opens on the wall-clock metric", () => {
|
|
33
|
+
renderCharts();
|
|
34
|
+
expect(screen.getByRole("heading")).toHaveTextContent(
|
|
35
|
+
"Time per Passed Task",
|
|
36
|
+
);
|
|
37
|
+
expect(
|
|
38
|
+
screen.getByRole("tab", { name: "Time" }),
|
|
39
|
+
).toHaveAttribute("aria-selected", "true");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("the Turns tab still reaches the retired turn-budget chart", () => {
|
|
43
|
+
// The turn budget is kept visible while the derived expected-time line
|
|
44
|
+
// is being watched; retiring it is deleting this tab.
|
|
45
|
+
renderCharts();
|
|
46
|
+
fireEvent.click(screen.getByRole("tab", { name: "Turns" }));
|
|
47
|
+
expect(screen.getByRole("heading")).toHaveTextContent(
|
|
48
|
+
"Within Expected Turns (%)",
|
|
49
|
+
);
|
|
50
|
+
expect(screen.getByText(/1.5× their expected turns/)).toBeInTheDocument();
|
|
51
|
+
expect(
|
|
52
|
+
screen.getByRole("tab", { name: "Turns" }),
|
|
53
|
+
).toHaveAttribute("aria-selected", "true");
|
|
54
|
+
expect(screen.getByRole("tab", { name: "Time" })).toHaveAttribute(
|
|
55
|
+
"aria-selected",
|
|
56
|
+
"false",
|
|
57
|
+
);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("switching back restores the wall-clock blurb", () => {
|
|
61
|
+
renderCharts();
|
|
62
|
+
fireEvent.click(screen.getByRole("tab", { name: "Turns" }));
|
|
63
|
+
fireEvent.click(screen.getByRole("tab", { name: "Time" }));
|
|
64
|
+
expect(
|
|
65
|
+
screen.getByText(/the number that passed/),
|
|
66
|
+
).toBeInTheDocument();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("says so when the numbers are filter-scoped", () => {
|
|
70
|
+
renderCharts(true);
|
|
71
|
+
expect(
|
|
72
|
+
screen.getByText(/scoped to the active filter/),
|
|
73
|
+
).toBeInTheDocument();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("no filter note when the window is unscoped", () => {
|
|
77
|
+
renderCharts();
|
|
78
|
+
expect(screen.queryByText(/scoped to the active filter/)).toBeNull();
|
|
79
|
+
});
|
|
80
|
+
});
|
{coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/__tests__/harness-legend.test.tsx
RENAMED
|
@@ -37,6 +37,44 @@ describe("HarnessLegend", () => {
|
|
|
37
37
|
describe("HarnessTooltip", () => {
|
|
38
38
|
const s = series("claude-code", "codex");
|
|
39
39
|
|
|
40
|
+
test("formats the value with the chart's own formatter", () => {
|
|
41
|
+
render(
|
|
42
|
+
<HarnessTooltip
|
|
43
|
+
active
|
|
44
|
+
label={1_700_000_000_000}
|
|
45
|
+
series={s}
|
|
46
|
+
suffix="per passed task"
|
|
47
|
+
emptyText="no passing tasks"
|
|
48
|
+
format={(v) => `${Math.round(v)}s`}
|
|
49
|
+
payload={[{ dataKey: s[1].dataKey, value: 192.3 }]}
|
|
50
|
+
/>,
|
|
51
|
+
);
|
|
52
|
+
expect(screen.getByText("192s per passed task")).toBeInTheDocument();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("adds the secondary line for the hovered point only", () => {
|
|
56
|
+
// The within-expected rate belongs to one run, so it rides the hover on
|
|
57
|
+
// that run's point instead of being summarized over the whole chart.
|
|
58
|
+
render(
|
|
59
|
+
<HarnessTooltip
|
|
60
|
+
active
|
|
61
|
+
label={1_700_000_000_000}
|
|
62
|
+
series={s}
|
|
63
|
+
suffix="per passed task"
|
|
64
|
+
emptyText="no passing tasks"
|
|
65
|
+
secondary={(harness) =>
|
|
66
|
+
harness === "codex" ? "78% within 2× expected" : null
|
|
67
|
+
}
|
|
68
|
+
payload={[
|
|
69
|
+
{ dataKey: s[0].dataKey, value: 300 },
|
|
70
|
+
{ dataKey: s[1].dataKey, value: 192 },
|
|
71
|
+
]}
|
|
72
|
+
/>,
|
|
73
|
+
);
|
|
74
|
+
expect(screen.getByText("78% within 2× expected")).toBeInTheDocument();
|
|
75
|
+
expect(screen.queryAllByText(/within/)).toHaveLength(1);
|
|
76
|
+
});
|
|
77
|
+
|
|
40
78
|
test("shows only the harnesses that actually ran at the hovered x", () => {
|
|
41
79
|
// Recharts hands over every series, including the ones with no value
|
|
42
80
|
// here. Listing those would invent runs that never happened.
|
{coder_eval-0.11.2 → coder_eval-0.11.3}/evalboard/app/_overview/__tests__/harness-series.test.ts
RENAMED
|
@@ -12,14 +12,16 @@ function point(
|
|
|
12
12
|
harness: string,
|
|
13
13
|
timestamp: number,
|
|
14
14
|
successRate: number | null,
|
|
15
|
-
|
|
15
|
+
withinExpectedTimeRate: number | null = null,
|
|
16
16
|
): RunPoint {
|
|
17
17
|
return {
|
|
18
18
|
runId: `run-${timestamp}`,
|
|
19
19
|
timestamp,
|
|
20
20
|
harness,
|
|
21
21
|
successRate,
|
|
22
|
-
turnBudgetRate,
|
|
22
|
+
turnBudgetRate: null,
|
|
23
|
+
withinExpectedTimeRate,
|
|
24
|
+
timePerPassedTask: null,
|
|
23
25
|
};
|
|
24
26
|
}
|
|
25
27
|
|
|
@@ -99,7 +101,7 @@ describe("pivotByHarness", () => {
|
|
|
99
101
|
timestamp: 100,
|
|
100
102
|
[key]: 90,
|
|
101
103
|
});
|
|
102
|
-
expect(pivotByHarness(pts, ["codex"], "
|
|
104
|
+
expect(pivotByHarness(pts, ["codex"], "withinExpectedTimeRate").rows[0]).toEqual(
|
|
103
105
|
{ timestamp: 100, [key]: 40 },
|
|
104
106
|
);
|
|
105
107
|
});
|
|
@@ -111,7 +113,7 @@ describe("pivotByHarness", () => {
|
|
|
111
113
|
const { rows } = pivotByHarness(
|
|
112
114
|
[point("codex", 100, 90, null)],
|
|
113
115
|
["codex"],
|
|
114
|
-
"
|
|
116
|
+
"withinExpectedTimeRate",
|
|
115
117
|
);
|
|
116
118
|
expect(rows).toEqual([]);
|
|
117
119
|
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// The overview's efficiency section, tabbed.
|
|
4
|
+
//
|
|
5
|
+
// Two signals run side by side for now. "Time" is the derived wall-clock line
|
|
6
|
+
// (lib/timing.ts): expected seconds per task per harness, computed from that
|
|
7
|
+
// task's own passing history by the eval runner and stamped into run.json.
|
|
8
|
+
// "Turns" is the hand-written predecessor it is meant to replace, kept visible
|
|
9
|
+
// while the new number is being watched rather than trusted.
|
|
10
|
+
//
|
|
11
|
+
// The tab strip is the seam: retiring the turn budget is deleting the "turns"
|
|
12
|
+
// entry from TABS and the TurnBudgetChart import, with no other edit to this
|
|
13
|
+
// page. Tab state is local — deliberately not a search param, so switching
|
|
14
|
+
// charts never re-renders the server page or perturbs a shared link.
|
|
15
|
+
|
|
16
|
+
import { useState } from "react";
|
|
17
|
+
import type { RunPoint } from "@/lib/overview";
|
|
18
|
+
import { TimePerPassedTaskChart } from "./wall-clock-chart";
|
|
19
|
+
import { TurnBudgetChart } from "./turn-budget-chart";
|
|
20
|
+
|
|
21
|
+
type TabKey = "time" | "turns";
|
|
22
|
+
|
|
23
|
+
interface ChartProps {
|
|
24
|
+
data: RunPoint[];
|
|
25
|
+
harnesses: string[];
|
|
26
|
+
windowStart: number;
|
|
27
|
+
windowEnd: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const TABS: Array<{
|
|
31
|
+
key: TabKey;
|
|
32
|
+
label: string;
|
|
33
|
+
heading: string;
|
|
34
|
+
// Hover text on the heading: what the number actually is.
|
|
35
|
+
title: string;
|
|
36
|
+
// Shown under the heading. `scoped` appends the active-filter note.
|
|
37
|
+
blurb: (scoped: boolean) => string;
|
|
38
|
+
render: (props: ChartProps) => React.ReactNode;
|
|
39
|
+
}> = [
|
|
40
|
+
{
|
|
41
|
+
key: "time",
|
|
42
|
+
label: "Time",
|
|
43
|
+
heading: "Time per Passed Task",
|
|
44
|
+
title: "Total wall clock ÷ tasks passed. Every task's seconds count, failures included; only passes count in the denominator, so a run that fails more reads slower.",
|
|
45
|
+
blurb: (scoped) =>
|
|
46
|
+
"Seconds of every task that ran ÷ the number that passed · hover a point for the share within 2× expected" +
|
|
47
|
+
(scoped ? " · scoped to the active filter" : ""),
|
|
48
|
+
render: (props) => <TimePerPassedTaskChart {...props} />,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
key: "turns",
|
|
52
|
+
label: "Turns",
|
|
53
|
+
heading: "Within Expected Turns (%)",
|
|
54
|
+
title: "Share of tasks carrying an expected_turns budget whose visible turns stayed within 1.5× it. A budgeted task that failed counts as over budget.",
|
|
55
|
+
blurb: (scoped) =>
|
|
56
|
+
"% of budgeted tasks that stayed within 1.5× their expected turns (a budgeted task that failed counts as over budget) · runs with no budgeted task are omitted rather than plotted at 0" +
|
|
57
|
+
(scoped ? " · scoped to the active filter" : ""),
|
|
58
|
+
render: (props) => <TurnBudgetChart {...props} />,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
export function EfficiencyCharts({
|
|
63
|
+
scoped = false,
|
|
64
|
+
...props
|
|
65
|
+
}: ChartProps & { scoped?: boolean }) {
|
|
66
|
+
const [active, setActive] = useState<TabKey>(TABS[0].key);
|
|
67
|
+
const tab = TABS.find((t) => t.key === active) ?? TABS[0];
|
|
68
|
+
return (
|
|
69
|
+
<div className="pt-4 mt-2 border-t border-dashed border-gray-200 space-y-1">
|
|
70
|
+
<div className="flex items-start justify-between gap-3">
|
|
71
|
+
<h2
|
|
72
|
+
className="text-sm font-semibold text-gray-900"
|
|
73
|
+
title={tab.title}
|
|
74
|
+
>
|
|
75
|
+
{tab.heading}
|
|
76
|
+
</h2>
|
|
77
|
+
<span
|
|
78
|
+
className="inline-flex shrink-0 overflow-hidden rounded-md border border-gray-200 text-xs"
|
|
79
|
+
role="tablist"
|
|
80
|
+
aria-label="Efficiency metric"
|
|
81
|
+
>
|
|
82
|
+
{TABS.map((t) => (
|
|
83
|
+
<button
|
|
84
|
+
key={t.key}
|
|
85
|
+
type="button"
|
|
86
|
+
role="tab"
|
|
87
|
+
aria-selected={t.key === active}
|
|
88
|
+
onClick={() => setActive(t.key)}
|
|
89
|
+
className={`px-2 py-0.5 transition-colors ${
|
|
90
|
+
t.key === active
|
|
91
|
+
? "bg-studio-blue text-white"
|
|
92
|
+
: "bg-white text-gray-600 hover:bg-gray-50"
|
|
93
|
+
}`}
|
|
94
|
+
>
|
|
95
|
+
{t.label}
|
|
96
|
+
</button>
|
|
97
|
+
))}
|
|
98
|
+
</span>
|
|
99
|
+
</div>
|
|
100
|
+
<p className="text-xs text-gray-500">{tab.blurb(scoped)}</p>
|
|
101
|
+
{tab.render(props)}
|
|
102
|
+
</div>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
@@ -57,6 +57,8 @@ export function HarnessTooltip({
|
|
|
57
57
|
series,
|
|
58
58
|
suffix,
|
|
59
59
|
emptyText,
|
|
60
|
+
format = (v) => `${v.toFixed(1)}%`,
|
|
61
|
+
secondary,
|
|
60
62
|
}: {
|
|
61
63
|
active?: boolean;
|
|
62
64
|
payload?: TooltipEntry[];
|
|
@@ -67,6 +69,12 @@ export function HarnessTooltip({
|
|
|
67
69
|
suffix: string;
|
|
68
70
|
// Shown when the hovered run produced no value for this metric at all.
|
|
69
71
|
emptyText: string;
|
|
72
|
+
// How to render the value. Defaults to a percentage; a seconds chart passes
|
|
73
|
+
// its own duration formatter.
|
|
74
|
+
format?: (value: number) => string;
|
|
75
|
+
// Optional second line for a row, e.g. a companion rate the chart doesn't
|
|
76
|
+
// plot. Returning null omits it for that point.
|
|
77
|
+
secondary?: (harness: string, timestamp: number) => string | null;
|
|
70
78
|
}) {
|
|
71
79
|
if (!active || !payload?.length) return null;
|
|
72
80
|
const byKey = new Map(series.map((s) => [s.dataKey, s]));
|
|
@@ -86,22 +94,27 @@ export function HarnessTooltip({
|
|
|
86
94
|
) : (
|
|
87
95
|
rows.map((e) => {
|
|
88
96
|
const s = byKey.get(String(e.dataKey))!;
|
|
97
|
+
const sub = secondary?.(s.harness, ms) ?? null;
|
|
89
98
|
return (
|
|
90
|
-
<div
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
99
|
+
<div key={s.harness} className="tabular-nums">
|
|
100
|
+
<div className="flex items-center gap-1.5 text-gray-600">
|
|
101
|
+
<span
|
|
102
|
+
aria-hidden
|
|
103
|
+
className="inline-block h-0.5 w-3 rounded-full shrink-0"
|
|
104
|
+
style={{ backgroundColor: s.color }}
|
|
105
|
+
/>
|
|
106
|
+
<span className="text-gray-700">
|
|
107
|
+
{harnessShortLabel(s.harness)}
|
|
108
|
+
</span>
|
|
109
|
+
<span>
|
|
110
|
+
{format(e.value as number)} {suffix}
|
|
111
|
+
</span>
|
|
112
|
+
</div>
|
|
113
|
+
{sub && (
|
|
114
|
+
<div className="pl-[1.125rem] text-gray-500">
|
|
115
|
+
{sub}
|
|
116
|
+
</div>
|
|
117
|
+
)}
|
|
105
118
|
</div>
|
|
106
119
|
);
|
|
107
120
|
})
|