coder-eval 0.8.8__tar.gz → 0.8.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-code-review.md +3 -3
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/shared/multi-model-review.md +1 -1
- coder_eval-0.8.9/.github/ISSUE_TEMPLATE/adopter.yml +84 -0
- coder_eval-0.8.9/ADOPTERS.md +13 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/CHANGELOG.md +97 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/CLAUDE.md +2 -2
- {coder_eval-0.8.8 → coder_eval-0.8.9}/PKG-INFO +1 -1
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/AB_EXPERIMENTS.md +2 -2
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/TASK_DEFINITION_GUIDE.md +24 -5
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/harness-badge.tsx +16 -3
- coder_eval-0.8.9/evalboard/app/_components/harness-selector.tsx +49 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_overview/tag-rail.tsx +15 -1
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/page.tsx +30 -8
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/path-to-ga/page.tsx +22 -7
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/trends/__tests__/trends-view.test.tsx +11 -0
- coder_eval-0.8.9/evalboard/app/trends/actions.ts +18 -0
- coder_eval-0.8.9/evalboard/app/trends/page.tsx +163 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/trends/trends-view.tsx +30 -11
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +27 -10
- coder_eval-0.8.9/evalboard/app/watchlist/page.tsx +87 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/watchlist/watchlist-view.tsx +23 -6
- {coder_eval-0.8.8 → coder_eval-0.8.9}/pyproject.toml +1 -1
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/__init__.py +1 -1
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/evaluate_command.py +14 -5
- coder_eval-0.8.9/src/coder_eval/criteria/skill_triggered.py +222 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/checker.py +9 -2
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/formatting.py +6 -3
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/criteria.py +39 -5
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/results.py +38 -10
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/sandbox.py +3 -2
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/early_stop.py +70 -29
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/reports.py +5 -1
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/reports_experiment.py +51 -82
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/reports_html.py +67 -33
- coder_eval-0.8.9/src/coder_eval/reports_stats.py +498 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/experiment_2variant.md +9 -4
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/experiment_replicates.md +3 -1
- coder_eval-0.8.9/tests/fixtures/tasks/test_task_informational_criterion.yaml +17 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent.py +12 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_early_stop.py +217 -42
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_evaluate_command.py +21 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_evaluator.py +2 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_reports.py +372 -9
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_replicate_stats.py +64 -42
- coder_eval-0.8.9/tests/test_reports_stats_nonfinite.py +73 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_skill_triggered.py +209 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_suite_rollup.py +23 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_threshold_enforcement.py +102 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/uv.lock +1 -1
- coder_eval-0.8.8/evalboard/app/trends/actions.ts +0 -10
- coder_eval-0.8.8/evalboard/app/trends/page.tsx +0 -88
- coder_eval-0.8.8/evalboard/app/watchlist/page.tsx +0 -12
- coder_eval-0.8.8/src/coder_eval/criteria/skill_triggered.py +0 -177
- coder_eval-0.8.8/src/coder_eval/reports_stats.py +0 -250
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-code-review-full.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-code-review-wf.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-create-plan.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-implement-plan.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-review.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-run-analysis.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/commands/coder-eval-task-create.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/harness-candidates.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/shared/axes.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/shared/review-rubric.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/shared/run-layout.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/workflows/cr-axis.js +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.claude/workflows/cr-parent.js +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.env.example +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/CODEOWNERS +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/code_review.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/dependabot.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/claude-pr-review.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/codeql.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/conventional-commits.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/docker-publish.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/docs.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/pr-checks.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/publish-testpypi.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.github/workflows/release.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.gitignore +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.pre-commit-config.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/.python-version +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/CODE_OF_CONDUCT.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/CONTRIBUTING.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/LICENSE +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/Makefile +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/NOTICE +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/README.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/SECURITY.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docker/Dockerfile +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docker/Dockerfile.runtime +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docker/coder_eval_entrypoint.sh +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docker/coder_eval_runtime_entrypoint.sh +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/BYOD.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/CODEX_AGENT_GUIDE.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/DOCKER_ISOLATION.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/IDEAS.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/USER_GUIDE.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/assets/hero.gif +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/comparison.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/index.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/llms.txt +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/01-first-evaluation.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/02-ci-pipeline.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/03-evalboard-local.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/04-writing-a-task.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/05-comparing-models.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/06-use-docker-isolation.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/docs/tutorials/README.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/.gitignore +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/README.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/col-help.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/collapsible-rail.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/scroll-table.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/search-box.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/unit-toggle.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/version-list.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_components/window-selector.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_overview/daily-chart.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/_overview/window-summary.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/api/download/route.ts +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/api/file/route.ts +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/api/refresh/route.ts +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/error.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/globals.css +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/icon.png +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/app/layout.tsx +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/next-env.d.ts +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/next.config.mjs +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/package.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/pnpm-lock.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/postcss.config.mjs +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/public/harness/antigravity.png +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/public/harness/claude-code.png +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/public/harness/codex.png +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/public/uipath.png +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/tailwind.config.ts +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/tsconfig.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/vitest.config.ts +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/evalboard/vitest.setup.ts +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/default.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/early-stop-ab.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/model-comparison.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/permissions-smoke.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/plugin-comparison.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/prompt-mutations-example.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/experiments/smoke_variants.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/mkdocs.yml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/osv-scanner.toml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/.gitattributes +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/_logging.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/antigravity_agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/claude_code_agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/codex_agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/noop_agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/registry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/agents/watchdog.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/analysis.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/aggregate_command.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/console.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/plan_command.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/report_command.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/run_command.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/run_helpers.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/run_task_internal_command.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/cli/utils.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/config.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/agent_judge.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/base.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/classification_match.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/command_executed.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/commands_efficiency.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/file_check.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/file_contains.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/file_exists.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/file_matches_regex.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/json_check.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/llm_judge.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/reference_comparison.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/run_command.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/criteria/uipath_eval.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/budget.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/categories.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/categorization.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/executor.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/judge.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/retry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/errors/timeout.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_context.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_models.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_persistence.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/judge_usage.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/sub_agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/summaries.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/evaluation/verdict_tool.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/isolation/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/isolation/docker_runner.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/logging_config.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/agent_config.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/container_paths.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/enums.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/experiment.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/judge.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/judge_defaults.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/limits.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/merge_strategy.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/mutations.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/routing.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/tasks.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/telemetry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/models/templates.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/batch.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/config.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/config_merge.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/evaluation.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/experiment.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/overrides.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestration/task_loader.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/orchestrator.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/path_utils.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/plugins.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/pricing.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/py.typed +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/resources/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/resources/tags.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/sandbox.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/ast_similarity.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/complexity.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/quality.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/signature_similarity.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/similarity.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/scoring/token_similarity.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/simulation/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/simulation/termination.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/simulation/user_simulator.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/callbacks.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/collector.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/events.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/renderers.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/streaming/wire.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/telemetry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/src/coder_eval/utils.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/README.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agentless_smoke_test.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/antigravity_hello_world.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/claude_hello_world.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/claude_hello_world_docker.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/claude_subagent_test.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_hello_world.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_parallel_commands.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_skills_test.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_string_utils.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/codex_subagent_test.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/subagent_bash_long_input.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/agents/subagent_merge_sort.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/byod_smoke_test.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dataset_example.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/datasets/sentiment.jsonl +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/environment/input.txt +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/fibonacci_with_template.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/hello_date.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/inline_starter_example.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/internal/session_resumption.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_smoke.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/README.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/sentiment_classification.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_agent_judge.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_budget_exceeded.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_llm_judge.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_negative_path.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_task_timeout.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/smoke_variants.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/test_sandbox.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tasks/token_check.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/templates/byod_smoke_test/Dockerfile +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/templates/fibonacci-starter/README.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/templates/fibonacci-starter/src/main.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/templates/fibonacci-starter/tests/test_main.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/_scrub.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/run_full.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/_path_helpers.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/conftest.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/mock_agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/fixtures/text_stub_agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/__init__.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/base.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_agent_timing_access.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_silent_except.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_submodule_model_imports.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/open_explicit_encoding.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/register_criterion_required.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/runner.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/lint/violation.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_config_no_timing_fields.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_config_optional_type.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_config_registry_dispatch.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_config_sdk_decoupling.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_golden_master.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_judge_criterion.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_telemetry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_telemetry_advanced.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agent_timeout.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_agentless.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_aggregate.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_antigravity_agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_byoa_plugin.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_byoa_plugin_live.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_byod_feature.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_checker_logging.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_classification_match.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_claude_settings_enforcement_live.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cleanup_preservation_guard.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_backend_flag.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_empty_glob.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_sdk_options.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_set_overrides.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_telemetry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_cli_type_flag.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_code_review_bugs.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_codex_agent.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_codex_agent_live.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_codex_agent_unit.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_codex_token_mapping.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_command_executed.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_command_statistics.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_command_telemetry_result_data.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_commands_efficiency.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_config_lineage.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_config_merge_engine.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_config_precedence.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_continuous_scoring.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_criterion_result_round_trip.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_custom_lint.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_dataset_expansion.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_debug_logging.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_build_failure.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_runner_container_death.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_runner_mounts.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_runner_stream_limit.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_wildcard_env.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_docker_workdir_live.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_driver_resolver.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_error_handling.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_event_collector.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_cli.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_loader.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_models.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_resolver.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_experiment_runner.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_file_check.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_file_contains_scoring.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_formatting.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_git_clone_failure.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_heartbeat_watchdog.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_ignore_patterns_negation.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_image_from_dockerfiles.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_integration.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_json_check.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_anthropic.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_bedrock.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_burn_in_live.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_context_builder.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_models.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_judge_persistence.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_lint_no_top_level_run_limits.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_lint_runner.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_llm_judge_criterion.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_log_tail_buffer.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_logging.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_logging_isolation.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_merge_characterization.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_merge_strategy_annotations.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_merge_unification.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_models.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_mutations.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_new_criteria.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_node_env_config.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_optional_dependencies.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_orchestrator.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_orchestrator_error_log_tail.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_orchestrator_telemetry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_overrides_engine.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_parallel.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_path_utils.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_plan_command.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_plugin_processing.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_plugins.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_post_run.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_pr_review_workflow.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_pre_run.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_preservation_mode.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_pricing_registry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_comparison_scoring.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_evaluator.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_missing_file.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_models.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reference_orchestrator.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_registry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_report_command.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reports.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reports_experiment.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reports_html.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_reports_stats.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_resolve_task_files.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_resume.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_retry_logic_comprehensive.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_routing.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_run_command_stdout.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_run_limits_models.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_run_limits_orchestrator.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_run_limits_resolver.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_runtime_tool_versions.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_layer_builder.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_optional.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_security.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_symlink_preservation.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sandbox_templates.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_scorers.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_scoring_quality.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sdk_option_classification.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_simulation_config.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_simulation_integration.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_simulation_termination.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_simulation_trials.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_agent_integration.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_batch.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_callbacks.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_cli.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_events.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_orchestrator.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_renderers.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_streaming_wire.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_sub_agent_runner.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_success_criterion_union.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_summaries.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_tags.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_task_definition_unknown_fields.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_teardown_interrupt.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_telemetry.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_template_env_expansion.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_batch.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_categorization.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_exceptions.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_models.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_timeout_orchestrator.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_token_usage.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_uipath_eval.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_user_simulator.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_utils.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_utterance_extraction.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_variant_prompt_file.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_verdict_tool.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_watchdog.py +0 -0
- {coder_eval-0.8.8 → coder_eval-0.8.9}/tests/test_yaml_migration.py +0 -0
|
@@ -12,7 +12,7 @@ description: Run a multi-model code review on uncommitted changes or a described
|
|
|
12
12
|
|
|
13
13
|
Run a thorough code review using multiple AI models in parallel, then fix all high-confidence medium-severity and above findings.
|
|
14
14
|
|
|
15
|
-
**Cost note**: This command runs `make verify` + a multi-model review (`gemini-3` + `
|
|
15
|
+
**Cost note**: This command runs `make verify` + a multi-model review (`gemini-3` + `gpt-5` via MCP, plus an Opus sub-agent) + automatic fixes. Expensive in time and tokens. Use this for changes you're about to ship; for broad codebase audits use `/coder-eval-code-review-full`; for quick local checks, run targeted tools (`ruff`, `pyright`, `pytest`) directly.
|
|
16
16
|
|
|
17
17
|
Input: $ARGUMENTS
|
|
18
18
|
|
|
@@ -65,7 +65,7 @@ If it fails, report what's failing and stop — code review on broken code is pr
|
|
|
65
65
|
|
|
66
66
|
Launch two reviews **in parallel**:
|
|
67
67
|
|
|
68
|
-
**Review A — Multi-model (via `mcp__multi__codereview`)**: run it per the shared procedure in `.claude/shared/multi-model-review.md` — `models: ["gemini-3", "
|
|
68
|
+
**Review A — Multi-model (via `mcp__multi__codereview`)**: run it per the shared procedure in `.claude/shared/multi-model-review.md` — `models: ["gemini-3", "gpt-5"]`, `relevant_files` = absolute paths of all changed files, `content` = a review request citing the Severity Standard, Review Principles, and Checklist. **Heed the multi-step protocol described there** (the step-1 response is usually an `in_progress` checklist, not findings — you must make the `step_number: 2` follow-up call with the same `thread_id`). Falls back to two Opus sub-agents if the tool is unavailable.
|
|
69
69
|
|
|
70
70
|
**Review B — Opus sub-agent**: Use the `Agent` tool with `model: "opus"`. Give it the list of changed files and the following specialized tasks to run in parallel internally:
|
|
71
71
|
|
|
@@ -120,7 +120,7 @@ across sessions and provides forensic context if a fix later proves wrong:
|
|
|
120
120
|
- Git SHA: <`git rev-parse HEAD`>
|
|
121
121
|
- Branch: <`git rev-parse --abbrev-ref HEAD`>
|
|
122
122
|
- Scope: <uncommitted | described "<input>" | last commit>
|
|
123
|
-
- Reviewers: <e.g. gemini-3,
|
|
123
|
+
- Reviewers: <e.g. gemini-3, gpt-5, opus-fallback-1, opus-fallback-2 — list actual reviewers used>
|
|
124
124
|
|
|
125
125
|
### Scope
|
|
126
126
|
- Files reviewed: (list)
|
|
@@ -14,7 +14,7 @@ If `mcp__multi__codereview` is available (check the deferred-tools list; if list
|
|
|
14
14
|
but not loaded, load it with `ToolSearch` → `select:mcp__multi__codereview`), call
|
|
15
15
|
it with:
|
|
16
16
|
|
|
17
|
-
- `models`: the strongest available (e.g. `["gemini-3", "
|
|
17
|
+
- `models`: the strongest available (e.g. `["gemini-3", "gpt-5"]` — as of July 2026 these resolve to `gemini-3.1-pro-preview` and `gpt-5.6-sol`; check `mcp__multi__models` if unsure)
|
|
18
18
|
- `relevant_files`: absolute paths of every changed / in-scope file
|
|
19
19
|
- `content`: the review request, citing the consumer's rubric (the shared **Review Criteria**, the **Severity Standard**, etc.)
|
|
20
20
|
- `base_path`: project root
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
name: Adopter — we're using coder_eval
|
|
2
|
+
description: Tell us your team uses coder_eval so we can add you to ADOPTERS.md
|
|
3
|
+
title: "[adopter] <organization>"
|
|
4
|
+
labels: ["adopter"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for using coder_eval! Adopter entries help other teams see the project is
|
|
10
|
+
real and in production, and they tell us which use cases to keep supporting.
|
|
11
|
+
|
|
12
|
+
Everything below is optional except the organization and how you use it. We only
|
|
13
|
+
publish what you explicitly allow here.
|
|
14
|
+
- type: input
|
|
15
|
+
id: organization
|
|
16
|
+
attributes:
|
|
17
|
+
label: Organization
|
|
18
|
+
description: The name you'd like listed.
|
|
19
|
+
placeholder: Acme Corp
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
- type: input
|
|
23
|
+
id: website
|
|
24
|
+
attributes:
|
|
25
|
+
label: Website
|
|
26
|
+
placeholder: https://example.com
|
|
27
|
+
validations:
|
|
28
|
+
required: false
|
|
29
|
+
- type: textarea
|
|
30
|
+
id: usage
|
|
31
|
+
attributes:
|
|
32
|
+
label: How do you use coder_eval?
|
|
33
|
+
description: |
|
|
34
|
+
A sentence or two. What do you evaluate — Claude Code skills, agent A/B tests,
|
|
35
|
+
CI quality gates, your own repos — and roughly at what scale?
|
|
36
|
+
placeholder: |
|
|
37
|
+
We gate CI on a suite of ~40 YAML tasks that check our internal Claude Code
|
|
38
|
+
skills still trigger, and A/B Claude Code against Codex each release.
|
|
39
|
+
validations:
|
|
40
|
+
required: true
|
|
41
|
+
- type: dropdown
|
|
42
|
+
id: listing
|
|
43
|
+
attributes:
|
|
44
|
+
label: How may we list you?
|
|
45
|
+
description: |
|
|
46
|
+
Pick the most you're comfortable with. **Logo use needs someone who can approve
|
|
47
|
+
trademark use for your organization** — if that isn't you, choose a name-only or
|
|
48
|
+
private option and we'll follow up.
|
|
49
|
+
options:
|
|
50
|
+
- Name only, in ADOPTERS.md
|
|
51
|
+
- Name in ADOPTERS.md and on the project website
|
|
52
|
+
- Name and logo in ADOPTERS.md and on the project website
|
|
53
|
+
- Please don't list us publicly — this is just for the maintainers
|
|
54
|
+
default: 0
|
|
55
|
+
validations:
|
|
56
|
+
required: true
|
|
57
|
+
- type: checkboxes
|
|
58
|
+
id: logo-permission
|
|
59
|
+
attributes:
|
|
60
|
+
label: Trademark permission
|
|
61
|
+
description: Only required if you selected a logo option above.
|
|
62
|
+
options:
|
|
63
|
+
- label: >-
|
|
64
|
+
I am authorized to grant this permission on behalf of my organization, and I
|
|
65
|
+
grant the coder_eval maintainers a non-exclusive, revocable license to display
|
|
66
|
+
our name and logo as an adopter in ADOPTERS.md and on the project website. We
|
|
67
|
+
can withdraw it at any time by commenting on this issue.
|
|
68
|
+
required: false
|
|
69
|
+
- type: input
|
|
70
|
+
id: contact
|
|
71
|
+
attributes:
|
|
72
|
+
label: Contact
|
|
73
|
+
description: GitHub handle or email, so we can reach you before publishing anything.
|
|
74
|
+
validations:
|
|
75
|
+
required: false
|
|
76
|
+
- type: checkboxes
|
|
77
|
+
id: case-study
|
|
78
|
+
attributes:
|
|
79
|
+
label: Anything else?
|
|
80
|
+
options:
|
|
81
|
+
- label: We'd be open to a short case study or a talk about our setup.
|
|
82
|
+
required: false
|
|
83
|
+
- label: We'd like to hear about breaking changes before they ship.
|
|
84
|
+
required: false
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Adopters
|
|
2
|
+
|
|
3
|
+
Teams and organizations using `coder_eval` in their development or CI workflows.
|
|
4
|
+
|
|
5
|
+
Using it? [Open an adopter issue](https://github.com/UiPath/coder_eval/issues/new?template=adopter.yml)
|
|
6
|
+
and we'll add you here. Name-only listings are welcome — a logo is never required.
|
|
7
|
+
|
|
8
|
+
Every entry below is published with the organization's permission, and any of them can be
|
|
9
|
+
removed on request by opening an issue.
|
|
10
|
+
|
|
11
|
+
| Organization | How they use it |
|
|
12
|
+
|---|---|
|
|
13
|
+
| [UiPath](https://www.uipath.com) | Nightly evaluation of internal Claude Code skills and agent A/B experiments; maintains `coder_eval`. |
|
|
@@ -2,6 +2,103 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.8.9 (2026-07-23)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- Code review fixes for welch-t-test-exact ([#38](https://github.com/UiPath/coder_eval/pull/38),
|
|
10
|
+
[`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
|
|
11
|
+
|
|
12
|
+
- Render weight:0 criteria as informational on every display surface
|
|
13
|
+
([#34](https://github.com/UiPath/coder_eval/pull/34),
|
|
14
|
+
[`9a34e90`](https://github.com/UiPath/coder_eval/commit/9a34e90bba2854316149cad61613a75dd3bd91e4))
|
|
15
|
+
|
|
16
|
+
- Weight:0 un-gates criteria (informational criteria)
|
|
17
|
+
([#34](https://github.com/UiPath/coder_eval/pull/34),
|
|
18
|
+
[`9a34e90`](https://github.com/UiPath/coder_eval/commit/9a34e90bba2854316149cad61613a75dd3bd91e4))
|
|
19
|
+
|
|
20
|
+
- Weight:0 un-gates criteria and renders as informational
|
|
21
|
+
([#34](https://github.com/UiPath/coder_eval/pull/34),
|
|
22
|
+
[`9a34e90`](https://github.com/UiPath/coder_eval/commit/9a34e90bba2854316149cad61613a75dd3bd91e4))
|
|
23
|
+
|
|
24
|
+
- **early-stop**: Decide skill activation on the tool call, not its result
|
|
25
|
+
([#43](https://github.com/UiPath/coder_eval/pull/43),
|
|
26
|
+
[`d34aa97`](https://github.com/UiPath/coder_eval/commit/d34aa97416ae3af09d09cdf78cb6607b4e2e6f7c))
|
|
27
|
+
|
|
28
|
+
- **early-stop**: Latch skill activation on any engagement, not first
|
|
29
|
+
([#43](https://github.com/UiPath/coder_eval/pull/43),
|
|
30
|
+
[`d34aa97`](https://github.com/UiPath/coder_eval/commit/d34aa97416ae3af09d09cdf78cb6607b4e2e6f7c))
|
|
31
|
+
|
|
32
|
+
- **evalboard**: Match watchlist skeleton header to avoid layout shift
|
|
33
|
+
([#45](https://github.com/UiPath/coder_eval/pull/45),
|
|
34
|
+
[`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
|
|
35
|
+
|
|
36
|
+
- **reports**: 1/2 — exact Student-t p-values in welch_t_test
|
|
37
|
+
([#38](https://github.com/UiPath/coder_eval/pull/38),
|
|
38
|
+
[`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
|
|
39
|
+
|
|
40
|
+
- **reports**: Exact Student-t p-values and a paired comparison section
|
|
41
|
+
([#38](https://github.com/UiPath/coder_eval/pull/38),
|
|
42
|
+
[`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
|
|
43
|
+
|
|
44
|
+
- **reports**: Fail loud on t* overflow; surface excluded paired tasks
|
|
45
|
+
([#38](https://github.com/UiPath/coder_eval/pull/38),
|
|
46
|
+
[`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
|
|
47
|
+
|
|
48
|
+
- **reports**: One source of truth for variant series and paired stats
|
|
49
|
+
([#38](https://github.com/UiPath/coder_eval/pull/38),
|
|
50
|
+
[`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
|
|
51
|
+
|
|
52
|
+
- **reports**: Validate confidence and n_resamples in bootstrap_mean_ci
|
|
53
|
+
([#38](https://github.com/UiPath/coder_eval/pull/38),
|
|
54
|
+
[`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
|
|
55
|
+
|
|
56
|
+
### Chores
|
|
57
|
+
|
|
58
|
+
- **harness**: Defer two guards from the welch-t-test-exact run
|
|
59
|
+
([#38](https://github.com/UiPath/coder_eval/pull/38),
|
|
60
|
+
[`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
|
|
61
|
+
|
|
62
|
+
### Documentation
|
|
63
|
+
|
|
64
|
+
- Add adopter issue template and ADOPTERS.md ([#40](https://github.com/UiPath/coder_eval/pull/40),
|
|
65
|
+
[`bfbed4e`](https://github.com/UiPath/coder_eval/commit/bfbed4e4a2ca857167fac2cb15462b7159e97684))
|
|
66
|
+
|
|
67
|
+
- Switch multi-model review from codex to gpt-5 alias
|
|
68
|
+
([#36](https://github.com/UiPath/coder_eval/pull/36),
|
|
69
|
+
[`0a3f2a7`](https://github.com/UiPath/coder_eval/commit/0a3f2a71a0a1e1e56f42a668fff57bac06eb99ec))
|
|
70
|
+
|
|
71
|
+
### Features
|
|
72
|
+
|
|
73
|
+
- **evalboard**: Make all pages harness-aware and stream tables
|
|
74
|
+
([#45](https://github.com/UiPath/coder_eval/pull/45),
|
|
75
|
+
[`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
|
|
76
|
+
|
|
77
|
+
- **evalboard**: Make analytics surfaces harness-aware and stream tables
|
|
78
|
+
([#45](https://github.com/UiPath/coder_eval/pull/45),
|
|
79
|
+
[`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
|
|
80
|
+
|
|
81
|
+
- **evalboard**: Scope task trends to one harness
|
|
82
|
+
([#45](https://github.com/UiPath/coder_eval/pull/45),
|
|
83
|
+
[`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
|
|
84
|
+
|
|
85
|
+
- **reports**: 2/2 — add a Paired Comparison section to experiment reports
|
|
86
|
+
([#38](https://github.com/UiPath/coder_eval/pull/38),
|
|
87
|
+
[`6df6e9b`](https://github.com/UiPath/coder_eval/commit/6df6e9bb1f3bd009592185ec3473e8f2e67d3816))
|
|
88
|
+
|
|
89
|
+
### Refactoring
|
|
90
|
+
|
|
91
|
+
- **evalboard**: Address review nits on harness plumbing
|
|
92
|
+
([#45](https://github.com/UiPath/coder_eval/pull/45),
|
|
93
|
+
[`acc1c86`](https://github.com/UiPath/coder_eval/commit/acc1c86bc97b80383ce1ef402356853447088e4a))
|
|
94
|
+
|
|
95
|
+
### Testing
|
|
96
|
+
|
|
97
|
+
- **early-stop**: Cover second-review items (two-AgentStart, golden corpus, parity)
|
|
98
|
+
([#43](https://github.com/UiPath/coder_eval/pull/43),
|
|
99
|
+
[`d34aa97`](https://github.com/UiPath/coder_eval/commit/d34aa97416ae3af09d09cdf78cb6607b4e2e6f7c))
|
|
100
|
+
|
|
101
|
+
|
|
5
102
|
## v0.8.8 (2026-07-22)
|
|
6
103
|
|
|
7
104
|
### Bug Fixes
|
|
@@ -35,7 +35,7 @@ coder_eval/
|
|
|
35
35
|
│ ├── criteria.py # 14 success criterion types + base + union
|
|
36
36
|
│ ├── experiment.py # ExperimentDefinition, ExperimentVariant, ResolvedTask, result models
|
|
37
37
|
│ ├── judge_defaults.py # DEFAULT_JUDGE_MODEL constant (cycle-free leaf)
|
|
38
|
-
│ ├── mutations.py # PromptMutation variants (prefix/suffix/replace/template
|
|
38
|
+
│ ├── mutations.py # PromptMutation variants (prefix/suffix/replace/template)
|
|
39
39
|
│ ├── results.py # CriterionResult (+ ClassificationCriterionResult), TurnRecord, EvaluationResult, EarlyStopInfo/EarlyStopReason, CriterionAggregate, ThresholdCheck, SuiteRollup
|
|
40
40
|
│ ├── routing.py # ApiRoute (DirectRoute/BedrockRoute)
|
|
41
41
|
│ ├── sandbox.py # SandboxConfig, ResourceLimits
|
|
@@ -294,7 +294,7 @@ Tasks are YAML files. See [docs/TASK_DEFINITION_GUIDE.md](docs/TASK_DEFINITION_G
|
|
|
294
294
|
|
|
295
295
|
**Runtime (always)**: pydantic, pydantic-settings, pyyaml, typer, rich, python-dotenv, anthropic, claude-agent-sdk, anyio, radon, tqdm, jmespath, jsonschema
|
|
296
296
|
|
|
297
|
-
**Runtime (optional, `[uipath]` extra)**: uipath — the in-host `uipath` SDK (handy for local sandbox parity with tasks that invoke `uv run uipath eval ...`). Base installs without this extra still run end-to-end; UiPath-dependent paths fail at dispatch with a clear `pip install 'coder-eval[uipath]'` hint. The LLM judge
|
|
297
|
+
**Runtime (optional, `[uipath]` extra)**: uipath — the in-host `uipath` SDK (handy for local sandbox parity with tasks that invoke `uv run uipath eval ...`). Base installs without this extra still run end-to-end; UiPath-dependent paths fail at dispatch with a clear `pip install 'coder-eval[uipath]'` hint. The LLM judge no longer uses the LLM Gateway client — it routes through the run's backend (Bedrock / Anthropic), so `uipath-llmgw-client` is no longer a dependency.
|
|
298
298
|
|
|
299
299
|
**Dev**: pytest, pytest-asyncio, pytest-mock, pytest-cov, ruff, pyright, pip-audit, bandit, pre-commit, mcp
|
|
300
300
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coder-eval
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.9
|
|
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
|
|
@@ -227,8 +227,8 @@ variants:
|
|
|
227
227
|
text: "\n\nThink step by step and validate your work before finishing."
|
|
228
228
|
```
|
|
229
229
|
|
|
230
|
-
The full mutation catalog (prefix / suffix / replace / template
|
|
231
|
-
|
|
230
|
+
The full mutation catalog (prefix / suffix / replace / template) is defined in
|
|
231
|
+
`coder_eval/models/mutations.py`.
|
|
232
232
|
|
|
233
233
|
## Recipe: Smoke vs. e2e Flavors (Early Stop)
|
|
234
234
|
|
|
@@ -275,11 +275,17 @@ sandbox:
|
|
|
275
275
|
- "!node_modules"
|
|
276
276
|
- "*.bak" # bare entry adds an extra pattern
|
|
277
277
|
limits: # Optional: resource limits
|
|
278
|
-
timeout: 300 # Enforced via subprocess timeout
|
|
279
|
-
max_memory_mb: 512 #
|
|
280
|
-
|
|
278
|
+
timeout: 300 # Enforced via subprocess timeout (both drivers)
|
|
279
|
+
max_memory_mb: 512 # driver:docker -> `--memory`; ignored under tempdir
|
|
280
|
+
max_cpus: 2 # driver:docker -> `--cpus`; ignored under tempdir
|
|
281
|
+
max_pids: 512 # driver:docker -> `--pids-limit`; ignored under tempdir
|
|
282
|
+
max_disk_mb: 1024 # NOT enforced (reserved: no portable docker knob)
|
|
281
283
|
```
|
|
282
284
|
|
|
285
|
+
Under `driver: tempdir` only `timeout` is enforced — the agent can consume
|
|
286
|
+
arbitrary host memory, CPU, and PIDs. Use `driver: docker` when you need the
|
|
287
|
+
container limits above to actually bind.
|
|
288
|
+
|
|
283
289
|
## Template Sources
|
|
284
290
|
|
|
285
291
|
Tasks can start with preset files instead of an empty sandbox. Multiple sources are applied sequentially (last wins for conflicts).
|
|
@@ -383,7 +389,7 @@ All criteria share these fields:
|
|
|
383
389
|
| Field | Default | Description |
|
|
384
390
|
|-------|---------|-------------|
|
|
385
391
|
| `description` | — | Human-readable description (required) |
|
|
386
|
-
| `weight` | 1.0 | Relative importance for weighted score |
|
|
392
|
+
| `weight` | 1.0 | Relative importance for weighted score. `0` = **informational**: excluded from both the score and the pass/fail gate |
|
|
387
393
|
| `pass_threshold` | 0.9 | Minimum score (0.0–1.0) to pass |
|
|
388
394
|
| `stop_when` | `null` | Arms this criterion for early stop (`pass`/`fail`/`decided`); requires `run_limits.stop_early: true` and an observable criterion type (`skill_triggered`, `command_executed`). See [`stop_early`](#stop_early-opt-in-early-stop). |
|
|
389
395
|
|
|
@@ -392,7 +398,20 @@ All criteria share these fields:
|
|
|
392
398
|
- **Fractional** (0.0–1.0): `file_contains`, `file_check`, `json_check`, `command_executed`, `uipath_eval`
|
|
393
399
|
- **Continuous** (0.0–1.0): `reference_comparison`, `llm_judge`, `agent_judge`
|
|
394
400
|
|
|
395
|
-
**Task success:**
|
|
401
|
+
**Task success:** all *gating* criteria must score >= their `pass_threshold`. A
|
|
402
|
+
criterion with `weight: 0` is informational — it is still checked, stored, and
|
|
403
|
+
rendered in reports, but it neither contributes to the score nor fails the task.
|
|
404
|
+
(A `weight: 0` criterion may not set `stop_when` or `suite_thresholds`: arming a
|
|
405
|
+
non-gating criterion for the early-stop or suite gate would let an
|
|
406
|
+
"informational" check flip a run to failure.)
|
|
407
|
+
|
|
408
|
+
Every surface labels it as such rather than as a failure: the terminal shows `○`
|
|
409
|
+
instead of `✓`/`✗`, the HTML report tags the row "informational — not gated" and
|
|
410
|
+
excludes it from the *n*/*m* passed header, the evalboard renders an `INFO` pill,
|
|
411
|
+
and a below-threshold informational criterion is never sampled as the reason a
|
|
412
|
+
suite row failed. The persisted `CriterionResult.gating` field carries this to
|
|
413
|
+
every consumer, so no reader needs the original criterion to know whether a low
|
|
414
|
+
score mattered.
|
|
396
415
|
|
|
397
416
|
**Weighted score:** `weighted_score = sum(score * weight) / sum(weight)` — calculated regardless for quality assessment.
|
|
398
417
|
|
|
@@ -1,22 +1,35 @@
|
|
|
1
1
|
import Image from "next/image";
|
|
2
2
|
|
|
3
|
-
//
|
|
3
|
+
// Canonical harness constants live in the leaf lib/harness module (shared by
|
|
4
|
+
// the server data layer); re-exported here so existing badge importers are
|
|
5
|
+
// unaffected.
|
|
6
|
+
export { KNOWN_HARNESSES, type KnownHarness } from "@/lib/harness";
|
|
7
|
+
|
|
8
|
+
// Vendor logo + labels for a run's harness (RunConfig). Renders the recognizable
|
|
4
9
|
// vendor mark instead of raw "claude-code"/"codex"/"antigravity" text,
|
|
5
10
|
// mirroring the Slack rollup's vendor emoji. A missing harness defaults to
|
|
6
11
|
// claude-code (the nightly). This is an internal-only column — the caller
|
|
7
12
|
// gates it behind isInternal (see lib/edition.ts).
|
|
8
|
-
const HARNESS_LOGO: Record<string, { src: string; label: string }> = {
|
|
13
|
+
const HARNESS_LOGO: Record<string, { src: string; label: string; short: string }> = {
|
|
9
14
|
"claude-code": {
|
|
10
15
|
src: "/harness/claude-code.png",
|
|
11
16
|
label: "Claude Code · Anthropic",
|
|
17
|
+
short: "Claude Code",
|
|
12
18
|
},
|
|
13
|
-
codex: { src: "/harness/codex.png", label: "Codex · OpenAI" },
|
|
19
|
+
codex: { src: "/harness/codex.png", label: "Codex · OpenAI", short: "Codex" },
|
|
14
20
|
antigravity: {
|
|
15
21
|
src: "/harness/antigravity.png",
|
|
16
22
|
label: "Antigravity · Google Gemini",
|
|
23
|
+
short: "Antigravity",
|
|
17
24
|
},
|
|
18
25
|
};
|
|
19
26
|
|
|
27
|
+
// Short human label for a harness id ("Claude Code"), for selectors and prose.
|
|
28
|
+
// Unknown ids fall through to the raw id.
|
|
29
|
+
export function harnessShortLabel(harness: string): string {
|
|
30
|
+
return HARNESS_LOGO[harness]?.short ?? harness;
|
|
31
|
+
}
|
|
32
|
+
|
|
20
33
|
export function HarnessBadge({ harness }: { harness?: string | null }) {
|
|
21
34
|
const key = harness ?? "claude-code";
|
|
22
35
|
const logo = HARNESS_LOGO[key];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { usePathname, useRouter, useSearchParams } from "next/navigation";
|
|
4
|
+
import { HarnessBadge, harnessShortLabel } from "./harness-badge";
|
|
5
|
+
|
|
6
|
+
// Segmented control for the trends page's harness scope. Sets `?h=<harness>`
|
|
7
|
+
// while preserving the active q/tag params, mirroring WindowSelector. Each
|
|
8
|
+
// segment shows the vendor logo + short label so it reads like the per-run
|
|
9
|
+
// harness badge on the runs tables.
|
|
10
|
+
export function HarnessSelector({
|
|
11
|
+
current,
|
|
12
|
+
harnesses,
|
|
13
|
+
}: {
|
|
14
|
+
current: string;
|
|
15
|
+
harnesses: readonly string[];
|
|
16
|
+
}) {
|
|
17
|
+
const router = useRouter();
|
|
18
|
+
const pathname = usePathname();
|
|
19
|
+
const searchParams = useSearchParams();
|
|
20
|
+
const set = (h: string) => {
|
|
21
|
+
const p = new URLSearchParams(searchParams.toString());
|
|
22
|
+
p.set("h", h);
|
|
23
|
+
router.replace(`${pathname}?${p.toString()}`, { scroll: false });
|
|
24
|
+
};
|
|
25
|
+
// Always show the active harness, even if it has aged out of the recent
|
|
26
|
+
// window (so a deep-linked `?h=` still reads as selected rather than absent).
|
|
27
|
+
const opts = harnesses.includes(current)
|
|
28
|
+
? harnesses
|
|
29
|
+
: [current, ...harnesses];
|
|
30
|
+
return (
|
|
31
|
+
<div className="inline-flex border border-gray-200 rounded-md overflow-hidden text-sm">
|
|
32
|
+
{opts.map((h) => {
|
|
33
|
+
const active = h === current;
|
|
34
|
+
return (
|
|
35
|
+
<button
|
|
36
|
+
key={h}
|
|
37
|
+
type="button"
|
|
38
|
+
onClick={() => set(h)}
|
|
39
|
+
aria-pressed={active}
|
|
40
|
+
className={`flex items-center gap-1.5 px-3 py-1 ${active ? "bg-studio-blue text-white" : "bg-white text-gray-700 hover:bg-gray-50"}`}
|
|
41
|
+
>
|
|
42
|
+
<HarnessBadge harness={h} />
|
|
43
|
+
{harnessShortLabel(h)}
|
|
44
|
+
</button>
|
|
45
|
+
);
|
|
46
|
+
})}
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Link from "next/link";
|
|
2
2
|
import type { TagCount } from "@/lib/overview";
|
|
3
|
+
import { DEFAULT_HARNESS } from "@/lib/harness";
|
|
3
4
|
import type { Window } from "@/lib/reviews-types";
|
|
4
5
|
|
|
5
6
|
type Variant = "neutral" | "rose" | "indigo";
|
|
@@ -35,11 +36,16 @@ function hrefForTag(
|
|
|
35
36
|
tag: string | null,
|
|
36
37
|
window: Window | null,
|
|
37
38
|
q: string | null,
|
|
39
|
+
harness: string | null,
|
|
38
40
|
): string {
|
|
39
41
|
const params = new URLSearchParams();
|
|
40
42
|
if (window) params.set("window", window);
|
|
41
43
|
if (tag) params.set("tag", tag);
|
|
42
44
|
if (q) params.set("q", q);
|
|
45
|
+
// Preserve the active harness scope across tag clicks (omit the default to
|
|
46
|
+
// keep URLs clean). Without this, filtering by a tag would silently reset a
|
|
47
|
+
// codex/antigravity view back to claude-code.
|
|
48
|
+
if (harness && harness !== DEFAULT_HARNESS) params.set("h", harness);
|
|
43
49
|
const qs = params.toString();
|
|
44
50
|
return qs ? `${basePath}?${qs}` : basePath;
|
|
45
51
|
}
|
|
@@ -52,6 +58,7 @@ function TagChip({
|
|
|
52
58
|
basePath,
|
|
53
59
|
window,
|
|
54
60
|
q,
|
|
61
|
+
harness,
|
|
55
62
|
}: {
|
|
56
63
|
tag: string;
|
|
57
64
|
count: number;
|
|
@@ -60,11 +67,12 @@ function TagChip({
|
|
|
60
67
|
basePath: string;
|
|
61
68
|
window: Window | null;
|
|
62
69
|
q: string | null;
|
|
70
|
+
harness: string | null;
|
|
63
71
|
}) {
|
|
64
72
|
const s = STYLES[variant];
|
|
65
73
|
return (
|
|
66
74
|
<Link
|
|
67
|
-
href={hrefForTag(basePath, active ? null : tag, window, q)}
|
|
75
|
+
href={hrefForTag(basePath, active ? null : tag, window, q, harness)}
|
|
68
76
|
scroll={false}
|
|
69
77
|
className={`inline-flex items-center gap-1 text-[11px] leading-none px-2 py-1 rounded border transition-colors ${active ? s.chipActive : s.chip}`}
|
|
70
78
|
>
|
|
@@ -111,6 +119,7 @@ export function MergedTagRail({
|
|
|
111
119
|
basePath = "/",
|
|
112
120
|
window = null,
|
|
113
121
|
q = null,
|
|
122
|
+
harness = null,
|
|
114
123
|
limit = 24,
|
|
115
124
|
}: {
|
|
116
125
|
skills: TagCount[];
|
|
@@ -123,6 +132,8 @@ export function MergedTagRail({
|
|
|
123
132
|
// Null on pages that don't expose a window selector (e.g. /trends).
|
|
124
133
|
window?: Window | null;
|
|
125
134
|
q?: string | null;
|
|
135
|
+
// Active harness scope to preserve in chip links (null = not harness-scoped).
|
|
136
|
+
harness?: string | null;
|
|
126
137
|
limit?: number;
|
|
127
138
|
}) {
|
|
128
139
|
const s = pickShown(skills, limit, activeTag);
|
|
@@ -146,6 +157,7 @@ export function MergedTagRail({
|
|
|
146
157
|
basePath={basePath}
|
|
147
158
|
window={window}
|
|
148
159
|
q={q}
|
|
160
|
+
harness={harness}
|
|
149
161
|
/>
|
|
150
162
|
))}
|
|
151
163
|
{r.shown.map((tc) => (
|
|
@@ -158,6 +170,7 @@ export function MergedTagRail({
|
|
|
158
170
|
basePath={basePath}
|
|
159
171
|
window={window}
|
|
160
172
|
q={q}
|
|
173
|
+
harness={harness}
|
|
161
174
|
/>
|
|
162
175
|
))}
|
|
163
176
|
{t.shown.map((tc) => (
|
|
@@ -170,6 +183,7 @@ export function MergedTagRail({
|
|
|
170
183
|
basePath={basePath}
|
|
171
184
|
window={window}
|
|
172
185
|
q={q}
|
|
186
|
+
harness={harness}
|
|
173
187
|
/>
|
|
174
188
|
))}
|
|
175
189
|
{totalRemaining > 0 && (
|
|
@@ -3,8 +3,10 @@ import {
|
|
|
3
3
|
getAdhocRunListing,
|
|
4
4
|
getOverview,
|
|
5
5
|
getRunListing,
|
|
6
|
+
listRecentHarnesses,
|
|
6
7
|
type TagCount,
|
|
7
8
|
} from "@/lib/overview";
|
|
9
|
+
import { parseHarnessParam, DEFAULT_HARNESS } from "@/lib/harness";
|
|
8
10
|
import { fmtDuration, fmtRunTime, fmtTimestamp, passClass } from "@/lib/format";
|
|
9
11
|
import { WindowSelector } from "./_components/window-selector";
|
|
10
12
|
import { WINDOWS, type Window } from "@/lib/reviews-types";
|
|
@@ -15,7 +17,8 @@ import { ChipLegend, MergedTagRail } from "./_overview/tag-rail";
|
|
|
15
17
|
import { TableScroll } from "./_components/scroll-table";
|
|
16
18
|
import { CollapsibleRail } from "./_components/collapsible-rail";
|
|
17
19
|
import { isInternal } from "@/lib/edition";
|
|
18
|
-
import { HarnessBadge } from "@/app/_components/harness-badge";
|
|
20
|
+
import { HarnessBadge, harnessShortLabel } from "@/app/_components/harness-badge";
|
|
21
|
+
import { HarnessSelector } from "@/app/_components/harness-selector";
|
|
19
22
|
|
|
20
23
|
export const dynamic = "force-dynamic";
|
|
21
24
|
|
|
@@ -98,6 +101,7 @@ export default async function Page({
|
|
|
98
101
|
window?: string;
|
|
99
102
|
tag?: string;
|
|
100
103
|
q?: string;
|
|
104
|
+
h?: string;
|
|
101
105
|
limit?: string;
|
|
102
106
|
alimit?: string;
|
|
103
107
|
}>;
|
|
@@ -106,14 +110,20 @@ export default async function Page({
|
|
|
106
110
|
const window = parseWindow(params.window);
|
|
107
111
|
const activeTag = parseTag(params.tag);
|
|
108
112
|
const q = parseQ(params.q);
|
|
113
|
+
const harness = parseHarnessParam(params.h);
|
|
109
114
|
const limit = parseLimit(params.limit);
|
|
110
115
|
const adhocLimit = parseAdhocLimit(params.alimit);
|
|
111
116
|
const isFiltered = activeTag != null || q != null;
|
|
112
117
|
|
|
113
|
-
|
|
114
|
-
|
|
118
|
+
// The analytics block (chart + rails) is scoped to one harness so the
|
|
119
|
+
// success line stops zigzagging across incomparable harnesses. The run
|
|
120
|
+
// LIST stays all-harness — seeing every recent run is the page's job, and
|
|
121
|
+
// the Harness column already disambiguates each row.
|
|
122
|
+
const [overview, listing, adhoc, harnesses] = await Promise.all([
|
|
123
|
+
getOverview(window, activeTag, q, harness),
|
|
115
124
|
getRunListing(window, activeTag, q, limit),
|
|
116
125
|
getAdhocRunListing(adhocLimit),
|
|
126
|
+
listRecentHarnesses(),
|
|
117
127
|
]);
|
|
118
128
|
|
|
119
129
|
const skills = filterTagsByQuery(overview.skills, q);
|
|
@@ -133,10 +143,14 @@ export default async function Page({
|
|
|
133
143
|
const rawAlimit = Array.isArray(params.alimit)
|
|
134
144
|
? params.alimit[0]
|
|
135
145
|
: params.alimit;
|
|
146
|
+
// Omit the default harness from URLs to keep them clean; carry a non-default
|
|
147
|
+
// scope through every self-link so it isn't reset by pagination/clear.
|
|
148
|
+
const hParam = harness === DEFAULT_HARNESS ? undefined : harness;
|
|
136
149
|
const base = {
|
|
137
150
|
window,
|
|
138
151
|
tag: activeTag,
|
|
139
152
|
q,
|
|
153
|
+
h: hParam,
|
|
140
154
|
limit: rawLimit,
|
|
141
155
|
alimit: rawAlimit,
|
|
142
156
|
};
|
|
@@ -146,7 +160,7 @@ export default async function Page({
|
|
|
146
160
|
limit: Math.min(tableTotalLabel, shownCount + DEFAULT_LIMIT),
|
|
147
161
|
});
|
|
148
162
|
const showAllHref = buildHref({ ...base, limit: "all" });
|
|
149
|
-
const clearAllHref = buildHref({ window });
|
|
163
|
+
const clearAllHref = buildHref({ window, h: hParam });
|
|
150
164
|
|
|
151
165
|
// Ad-hoc section disclosure: rows are filtered (by `q`) then capped to
|
|
152
166
|
// adhocLimit; offer "Show all" while more match than are shown, and a
|
|
@@ -212,7 +226,7 @@ export default async function Page({
|
|
|
212
226
|
{overview.runs.length === 1 ? "" : "s"}
|
|
213
227
|
{" · "}
|
|
214
228
|
<Link
|
|
215
|
-
href={buildHref({ window })}
|
|
229
|
+
href={buildHref({ window, h: hParam })}
|
|
216
230
|
scroll={false}
|
|
217
231
|
className="text-studio-blue hover:underline"
|
|
218
232
|
>
|
|
@@ -221,14 +235,21 @@ export default async function Page({
|
|
|
221
235
|
</>
|
|
222
236
|
) : (
|
|
223
237
|
<>
|
|
224
|
-
Success rate per
|
|
225
|
-
{
|
|
238
|
+
Success rate per{" "}
|
|
239
|
+
{harnessShortLabel(harness)} run across the
|
|
240
|
+
last {window} · {overview.runs.length} run
|
|
226
241
|
{overview.runs.length === 1 ? "" : "s"}
|
|
227
242
|
</>
|
|
228
243
|
)}
|
|
229
244
|
</p>
|
|
230
245
|
</div>
|
|
231
|
-
<
|
|
246
|
+
<div className="flex items-center gap-3">
|
|
247
|
+
<HarnessSelector
|
|
248
|
+
current={harness}
|
|
249
|
+
harnesses={harnesses}
|
|
250
|
+
/>
|
|
251
|
+
<WindowSelector current={window} />
|
|
252
|
+
</div>
|
|
232
253
|
</div>
|
|
233
254
|
<DailySuccessChart
|
|
234
255
|
data={overview.runs}
|
|
@@ -261,6 +282,7 @@ export default async function Page({
|
|
|
261
282
|
activeTag={activeTag}
|
|
262
283
|
window={window}
|
|
263
284
|
q={q}
|
|
285
|
+
harness={harness}
|
|
264
286
|
limit={24}
|
|
265
287
|
/>
|
|
266
288
|
</CollapsibleRail>
|