coder-eval 0.8.6__tar.gz → 0.8.7rc11__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.
Files changed (545) hide show
  1. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/release.yml +119 -23
  2. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/PKG-INFO +4 -4
  3. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/pyproject.toml +19 -12
  4. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/__init__.py +1 -1
  5. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/codex_agent.py +184 -27
  6. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/skill_triggered.py +9 -9
  7. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/mock_agent.py +6 -1
  8. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/text_stub_agent.py +5 -1
  9. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_codex_agent.py +452 -61
  10. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_early_stop.py +8 -0
  11. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_simulation_integration.py +5 -1
  12. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_skill_triggered.py +16 -0
  13. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/uv.lock +33 -33
  14. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-code-review-full.md +0 -0
  15. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-code-review-wf.md +0 -0
  16. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-code-review.md +0 -0
  17. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-create-plan.md +0 -0
  18. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-implement-plan.md +0 -0
  19. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-review.md +0 -0
  20. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-run-analysis.md +0 -0
  21. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/commands/coder-eval-task-create.md +0 -0
  22. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/harness-candidates.md +0 -0
  23. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/shared/axes.md +0 -0
  24. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/shared/multi-model-review.md +0 -0
  25. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/shared/review-rubric.md +0 -0
  26. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/shared/run-layout.md +0 -0
  27. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/workflows/cr-axis.js +0 -0
  28. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.claude/workflows/cr-parent.js +0 -0
  29. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.env.example +0 -0
  30. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/CODEOWNERS +0 -0
  31. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  32. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  33. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/code_review.md +0 -0
  34. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/dependabot.yml +0 -0
  35. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/claude-pr-review.yml +0 -0
  36. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/codeql.yml +0 -0
  37. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/conventional-commits.yml +0 -0
  38. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/docker-publish.yml +0 -0
  39. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/pr-checks.yml +0 -0
  40. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.github/workflows/publish-testpypi.yml +0 -0
  41. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.gitignore +0 -0
  42. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.pre-commit-config.yaml +0 -0
  43. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/.python-version +0 -0
  44. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/CHANGELOG.md +0 -0
  45. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/CLAUDE.md +0 -0
  46. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/CODE_OF_CONDUCT.md +0 -0
  47. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/CONTRIBUTING.md +0 -0
  48. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/LICENSE +0 -0
  49. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/Makefile +0 -0
  50. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/NOTICE +0 -0
  51. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/README.md +0 -0
  52. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/SECURITY.md +0 -0
  53. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docker/Dockerfile +0 -0
  54. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docker/Dockerfile.runtime +0 -0
  55. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docker/coder_eval_entrypoint.sh +0 -0
  56. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docker/coder_eval_runtime_entrypoint.sh +0 -0
  57. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/AB_EXPERIMENTS.md +0 -0
  58. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/BYOD.md +0 -0
  59. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/CODEX_AGENT_GUIDE.md +0 -0
  60. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/DOCKER_ISOLATION.md +0 -0
  61. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/IDEAS.md +0 -0
  62. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/TASK_DEFINITION_GUIDE.md +0 -0
  63. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/USER_GUIDE.md +0 -0
  64. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/assets/hero.gif +0 -0
  65. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/01-first-evaluation.md +0 -0
  66. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/02-ci-pipeline.md +0 -0
  67. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/03-evalboard-local.md +0 -0
  68. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/04-writing-a-task.md +0 -0
  69. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/05-comparing-models.md +0 -0
  70. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/06-use-docker-isolation.md +0 -0
  71. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/docs/tutorials/README.md +0 -0
  72. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/.gitignore +0 -0
  73. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/README.md +0 -0
  74. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/__tests__/search-box.test.tsx +0 -0
  75. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/col-help.tsx +0 -0
  76. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/collapsible-rail.tsx +0 -0
  77. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/harness-badge.tsx +0 -0
  78. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/scroll-table.tsx +0 -0
  79. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/search-box.tsx +0 -0
  80. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/unit-toggle.tsx +0 -0
  81. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/version-list.tsx +0 -0
  82. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_components/window-selector.tsx +0 -0
  83. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_overview/daily-chart.tsx +0 -0
  84. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_overview/tag-rail.tsx +0 -0
  85. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_overview/turn-budget-chart.tsx +0 -0
  86. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/_overview/window-summary.tsx +0 -0
  87. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/api/download/route.ts +0 -0
  88. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/api/file/route.ts +0 -0
  89. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/api/refresh/__tests__/route.test.ts +0 -0
  90. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/api/refresh/route.ts +0 -0
  91. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/error.tsx +0 -0
  92. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/globals.css +0 -0
  93. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/icon.png +0 -0
  94. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/layout.tsx +0 -0
  95. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/page.tsx +0 -0
  96. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/path-to-ga/page.tsx +0 -0
  97. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/trends/__tests__/trends-view.test.tsx +0 -0
  98. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/trends/actions.ts +0 -0
  99. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/trends/page.tsx +0 -0
  100. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/trends/trends-view.tsx +0 -0
  101. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/watchlist/__tests__/watchlist-view.test.tsx +0 -0
  102. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/watchlist/page.tsx +0 -0
  103. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/app/watchlist/watchlist-view.tsx +0 -0
  104. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/next-env.d.ts +0 -0
  105. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/next.config.mjs +0 -0
  106. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/package.json +0 -0
  107. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/pnpm-lock.yaml +0 -0
  108. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/postcss.config.mjs +0 -0
  109. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/public/harness/antigravity.png +0 -0
  110. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/public/harness/claude-code.png +0 -0
  111. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/public/harness/codex.png +0 -0
  112. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/public/uipath.png +0 -0
  113. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/tailwind.config.ts +0 -0
  114. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/tsconfig.json +0 -0
  115. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/vitest.config.ts +0 -0
  116. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/evalboard/vitest.setup.ts +0 -0
  117. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/default.yaml +0 -0
  118. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/early-stop-ab.yaml +0 -0
  119. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/model-comparison.yaml +0 -0
  120. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/permissions-smoke.yaml +0 -0
  121. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/plugin-comparison.yaml +0 -0
  122. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/prompt-mutations-example.yaml +0 -0
  123. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/experiments/smoke_variants.yaml +0 -0
  124. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/osv-scanner.toml +0 -0
  125. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/.gitattributes +0 -0
  126. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agent.py +0 -0
  127. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/__init__.py +0 -0
  128. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/_logging.py +0 -0
  129. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/antigravity_agent.py +0 -0
  130. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/claude_code_agent.py +0 -0
  131. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/noop_agent.py +0 -0
  132. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/registry.py +0 -0
  133. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/agents/watchdog.py +0 -0
  134. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/analysis.py +0 -0
  135. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/__init__.py +0 -0
  136. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/aggregate_command.py +0 -0
  137. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/console.py +0 -0
  138. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/evaluate_command.py +0 -0
  139. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/plan_command.py +0 -0
  140. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/report_command.py +0 -0
  141. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/run_command.py +0 -0
  142. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/run_helpers.py +0 -0
  143. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/run_task_internal_command.py +0 -0
  144. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/cli/utils.py +0 -0
  145. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/config.py +0 -0
  146. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/__init__.py +0 -0
  147. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/_classification_aggregate.py +0 -0
  148. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/agent_judge.py +0 -0
  149. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/base.py +0 -0
  150. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/classification_match.py +0 -0
  151. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/command_executed.py +0 -0
  152. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/commands_efficiency.py +0 -0
  153. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/file_check.py +0 -0
  154. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/file_contains.py +0 -0
  155. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/file_exists.py +0 -0
  156. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/file_matches_regex.py +0 -0
  157. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/json_check.py +0 -0
  158. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/llm_judge.py +0 -0
  159. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/reference_comparison.py +0 -0
  160. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/run_command.py +0 -0
  161. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/criteria/uipath_eval.py +0 -0
  162. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/__init__.py +0 -0
  163. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/agent.py +0 -0
  164. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/budget.py +0 -0
  165. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/categories.py +0 -0
  166. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/categorization.py +0 -0
  167. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/executor.py +0 -0
  168. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/judge.py +0 -0
  169. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/retry.py +0 -0
  170. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/errors/timeout.py +0 -0
  171. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/__init__.py +0 -0
  172. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/checker.py +0 -0
  173. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_anthropic.py +0 -0
  174. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_bedrock.py +0 -0
  175. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_context.py +0 -0
  176. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_models.py +0 -0
  177. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_persistence.py +0 -0
  178. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/judge_usage.py +0 -0
  179. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/sub_agent.py +0 -0
  180. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/summaries.py +0 -0
  181. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/evaluation/verdict_tool.py +0 -0
  182. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/formatting.py +0 -0
  183. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/isolation/__init__.py +0 -0
  184. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/isolation/docker_runner.py +0 -0
  185. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/logging_config.py +0 -0
  186. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/__init__.py +0 -0
  187. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/agent_config.py +0 -0
  188. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/container_paths.py +0 -0
  189. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/criteria.py +0 -0
  190. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/enums.py +0 -0
  191. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/experiment.py +0 -0
  192. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/judge.py +0 -0
  193. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/judge_defaults.py +0 -0
  194. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/limits.py +0 -0
  195. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/merge_strategy.py +0 -0
  196. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/mutations.py +0 -0
  197. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/results.py +0 -0
  198. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/routing.py +0 -0
  199. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/sandbox.py +0 -0
  200. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/tasks.py +0 -0
  201. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/telemetry.py +0 -0
  202. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/models/templates.py +0 -0
  203. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/__init__.py +0 -0
  204. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/batch.py +0 -0
  205. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/config.py +0 -0
  206. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/config_merge.py +0 -0
  207. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/early_stop.py +0 -0
  208. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/evaluation.py +0 -0
  209. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/experiment.py +0 -0
  210. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/overrides.py +0 -0
  211. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestration/task_loader.py +0 -0
  212. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/orchestrator.py +0 -0
  213. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/path_utils.py +0 -0
  214. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/plugins.py +0 -0
  215. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/pricing.py +0 -0
  216. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/py.typed +0 -0
  217. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/reports.py +0 -0
  218. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/reports_experiment.py +0 -0
  219. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/reports_html.py +0 -0
  220. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/reports_stats.py +0 -0
  221. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/resources/__init__.py +0 -0
  222. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/resources/default_ignore_patterns.yaml +0 -0
  223. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/resources/tags.yaml +0 -0
  224. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/sandbox.py +0 -0
  225. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/__init__.py +0 -0
  226. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/ast_similarity.py +0 -0
  227. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/complexity.py +0 -0
  228. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/quality.py +0 -0
  229. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/signature_similarity.py +0 -0
  230. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/similarity.py +0 -0
  231. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/scoring/token_similarity.py +0 -0
  232. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/simulation/__init__.py +0 -0
  233. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/simulation/termination.py +0 -0
  234. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/simulation/user_simulator.py +0 -0
  235. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/__init__.py +0 -0
  236. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/callbacks.py +0 -0
  237. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/collector.py +0 -0
  238. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/events.py +0 -0
  239. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/renderers.py +0 -0
  240. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/streaming/wire.py +0 -0
  241. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/telemetry.py +0 -0
  242. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/src/coder_eval/utils.py +0 -0
  243. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/README.md +0 -0
  244. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agentless_smoke_test.yaml +0 -0
  245. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/antigravity_hello_world.yaml +0 -0
  246. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/antigravity_hello_world_docker.yaml +0 -0
  247. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/claude_hello_world.yaml +0 -0
  248. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/claude_hello_world_docker.yaml +0 -0
  249. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/claude_parallel_single_gen.yaml +0 -0
  250. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/claude_subagent_test.yaml +0 -0
  251. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_disallowed_tools_test.yaml +0 -0
  252. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_hello_world.yaml +0 -0
  253. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_parallel_commands.yaml +0 -0
  254. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_parallel_single_gen.yaml +0 -0
  255. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_skills_test.yaml +0 -0
  256. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_string_utils.yaml +0 -0
  257. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/codex_subagent_test.yaml +0 -0
  258. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/subagent_bash_long_input.yaml +0 -0
  259. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/agents/subagent_merge_sort.yaml +0 -0
  260. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/byod_smoke_test.yaml +0 -0
  261. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dataset_example.yaml +0 -0
  262. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/datasets/sentiment.jsonl +0 -0
  263. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/dockerfile_build_example.yaml +0 -0
  264. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/environment/Dockerfile +0 -0
  265. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/environment/Dockerfile.workdir +0 -0
  266. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/environment/input.txt +0 -0
  267. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/working_dir_auto_example.yaml +0 -0
  268. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/dockerfile_build_example/working_dir_concrete_example.yaml +0 -0
  269. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/fibonacci_with_template.yaml +0 -0
  270. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/hello_date.yaml +0 -0
  271. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/inline_starter_example.yaml +0 -0
  272. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/internal/session_resumption.yaml +0 -0
  273. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_smoke.yaml +0 -0
  274. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/mock-cli-bins/README.md +0 -0
  275. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/echo_args +0 -0
  276. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/fixtures/config.json +0 -0
  277. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/mock-cli-bins/mocks/say_hello +0 -0
  278. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/mock_path_dirs_template_dir/task.yaml +0 -0
  279. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/python_cli_simulated_judged/echo_simulated_judged.yaml +0 -0
  280. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/3d-scan-calc.yaml +0 -0
  281. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/environment/Dockerfile +0 -0
  282. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/environment/material_density_table.md +0 -0
  283. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/environment/scan_data.stl +0 -0
  284. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/verifier/test.sh +0 -0
  285. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/3d-scan-calc/verifier/test_outputs.py +0 -0
  286. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/README.md +0 -0
  287. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/court-form-filling.yaml +0 -0
  288. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/environment/Dockerfile +0 -0
  289. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/environment/sc100-blank.pdf +0 -0
  290. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/verifier/test.sh +0 -0
  291. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/court-form-filling/verifier/test_outputs.py +0 -0
  292. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/dialogue-parser.yaml +0 -0
  293. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/environment/Dockerfile +0 -0
  294. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/environment/script.txt +0 -0
  295. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/verifier/test.sh +0 -0
  296. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/samples/skillsbench/dialogue-parser/verifier/test_outputs.py +0 -0
  297. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/sentiment_classification.yaml +0 -0
  298. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_agent_judge.yaml +0 -0
  299. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_budget_exceeded.yaml +0 -0
  300. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_cost_budget_exceeded.yaml +0 -0
  301. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_llm_judge.yaml +0 -0
  302. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_negative_path.yaml +0 -0
  303. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_task_timeout.yaml +0 -0
  304. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/smoke_variants.yaml +0 -0
  305. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/test_sandbox.yaml +0 -0
  306. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tasks/token_check.yaml +0 -0
  307. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/templates/byod_smoke_test/Dockerfile +0 -0
  308. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/templates/fibonacci-starter/README.md +0 -0
  309. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/templates/fibonacci-starter/src/main.py +0 -0
  310. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/templates/fibonacci-starter/tests/test_main.py +0 -0
  311. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/__init__.py +0 -0
  312. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/__init__.py +0 -0
  313. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/__init__.py +0 -0
  314. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/_scrub.py +0 -0
  315. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/claude_fixtures.py +0 -0
  316. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/codex_fixtures.py +0 -0
  317. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_a_single_text_turn.json +0 -0
  318. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_b_tool_use_result.json +0 -0
  319. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_c_multi_emission_delta.json +0 -0
  320. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_d_subagent_terminal.json +0 -0
  321. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_e_model_usage_and_backfill.json +0 -0
  322. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_f_orphaned_tool.json +0 -0
  323. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_g_crash_format_placeholder.json +0 -0
  324. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_h1_timeout_process_error.json +0 -0
  325. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_h2_process_error_crash.json +0 -0
  326. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/claude_i_in_loop_deadline_break.json +0 -0
  327. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_a_agent_message_only.json +0 -0
  328. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_b_command_execution.json +0 -0
  329. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_c_reasoning_placeholder.json +0 -0
  330. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_d_cross_flush_is_error.json +0 -0
  331. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_e_orphan_tool.json +0 -0
  332. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_f_collab_fallback.json +0 -0
  333. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +0 -0
  334. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/golden_streams/expected/codex_h_no_turn_completed_crash.json +0 -0
  335. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/__init__.py +0 -0
  336. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/_snapshot.py +0 -0
  337. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/experiment_2variant.md +0 -0
  338. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/experiment_3variant.md +0 -0
  339. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/experiment_replicates.md +0 -0
  340. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/run_full.md +0 -0
  341. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_fixtures/report_snapshots/run_minimal.md +0 -0
  342. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/_path_helpers.py +0 -0
  343. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/conftest.py +0 -0
  344. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/__init__.py +0 -0
  345. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/byoa_demo_plugin/byoa_demo.py +0 -0
  346. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/byoa_demo_plugin/pyproject.toml +0 -0
  347. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/tasks/test_task_multiple_criteria.yaml +0 -0
  348. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/fixtures/tasks/test_task_pass.yaml +0 -0
  349. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/__init__.py +0 -0
  350. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/__init__.py +0 -0
  351. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/base.py +0 -0
  352. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce014_merge_strategy_declared.py +0 -0
  353. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce015_create_subprocess_limit.py +0 -0
  354. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce016_no_computed_tokenusage_kwargs.py +0 -0
  355. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce017_models_lazy_agent_imports.py +0 -0
  356. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce018_no_final_status_name_denylist.py +0 -0
  357. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce019_telemetry_non_fatal.py +0 -0
  358. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce020_no_sdk_typed_base_agent_fields.py +0 -0
  359. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce021_guarded_evaluationresult_parse.py +0 -0
  360. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce022_dialog_loop_statement_cap.py +0 -0
  361. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce023_no_proxy_shim_import.py +0 -0
  362. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce024_discriminated_unions.py +0 -0
  363. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/ce025_live_verdict_consistency.py +0 -0
  364. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_agent_timing_access.py +0 -0
  365. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_blocking_io_in_async.py +0 -0
  366. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_cli_imports_in_core.py +0 -0
  367. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_silent_except.py +0 -0
  368. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_submodule_model_imports.py +0 -0
  369. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_top_level_run_limits_access.py +0 -0
  370. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_transcript_regex_in_eval.py +0 -0
  371. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/no_type_name_string_dispatch.py +0 -0
  372. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/open_explicit_encoding.py +0 -0
  373. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/read_text_explicit_encoding.py +0 -0
  374. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/register_criterion_required.py +0 -0
  375. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/subprocess_run_explicit_encoding.py +0 -0
  376. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/rules/yaml_models_forbid_extras.py +0 -0
  377. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/runner.py +0 -0
  378. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/lint/violation.py +0 -0
  379. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent.py +0 -0
  380. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_config_no_timing_fields.py +0 -0
  381. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_config_optional_type.py +0 -0
  382. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_config_registry_dispatch.py +0 -0
  383. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_config_sdk_decoupling.py +0 -0
  384. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_golden_master.py +0 -0
  385. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_judge_criterion.py +0 -0
  386. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_telemetry.py +0 -0
  387. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_telemetry_advanced.py +0 -0
  388. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agent_timeout.py +0 -0
  389. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_agentless.py +0 -0
  390. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_aggregate.py +0 -0
  391. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_antigravity_agent.py +0 -0
  392. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_byoa_plugin.py +0 -0
  393. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_byoa_plugin_live.py +0 -0
  394. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_byod_feature.py +0 -0
  395. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_checker_logging.py +0 -0
  396. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_classification_match.py +0 -0
  397. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_claude_settings_enforcement_live.py +0 -0
  398. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cleanup_preservation_guard.py +0 -0
  399. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_backend_flag.py +0 -0
  400. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_empty_glob.py +0 -0
  401. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_sdk_options.py +0 -0
  402. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_set_overrides.py +0 -0
  403. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_telemetry.py +0 -0
  404. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_cli_type_flag.py +0 -0
  405. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_code_review_bugs.py +0 -0
  406. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_codex_agent_live.py +0 -0
  407. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_codex_agent_unit.py +0 -0
  408. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_codex_token_mapping.py +0 -0
  409. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_command_executed.py +0 -0
  410. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_command_statistics.py +0 -0
  411. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_command_telemetry_result_data.py +0 -0
  412. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_commands_efficiency.py +0 -0
  413. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_config_lineage.py +0 -0
  414. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_config_merge_engine.py +0 -0
  415. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_config_precedence.py +0 -0
  416. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_continuous_scoring.py +0 -0
  417. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_criterion_result_round_trip.py +0 -0
  418. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_custom_lint.py +0 -0
  419. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_dataset_expansion.py +0 -0
  420. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_debug_logging.py +0 -0
  421. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_build_failure.py +0 -0
  422. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_runner_container_death.py +0 -0
  423. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_runner_mounts.py +0 -0
  424. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_runner_stream_limit.py +0 -0
  425. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_wildcard_env.py +0 -0
  426. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_docker_workdir_live.py +0 -0
  427. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_driver_resolver.py +0 -0
  428. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_error_handling.py +0 -0
  429. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_evaluate_command.py +0 -0
  430. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_evaluator.py +0 -0
  431. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_event_collector.py +0 -0
  432. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_cli.py +0 -0
  433. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_loader.py +0 -0
  434. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_models.py +0 -0
  435. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_reports.py +0 -0
  436. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_resolver.py +0 -0
  437. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_experiment_runner.py +0 -0
  438. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_file_check.py +0 -0
  439. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_file_contains_scoring.py +0 -0
  440. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_formatting.py +0 -0
  441. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_git_clone_failure.py +0 -0
  442. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_heartbeat_watchdog.py +0 -0
  443. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_ignore_patterns_negation.py +0 -0
  444. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_image_from_dockerfiles.py +0 -0
  445. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_integration.py +0 -0
  446. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_json_check.py +0 -0
  447. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_anthropic.py +0 -0
  448. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_bedrock.py +0 -0
  449. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_burn_in_live.py +0 -0
  450. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_context_builder.py +0 -0
  451. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_models.py +0 -0
  452. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_judge_persistence.py +0 -0
  453. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_lint_no_top_level_run_limits.py +0 -0
  454. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_lint_runner.py +0 -0
  455. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_llm_judge_criterion.py +0 -0
  456. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_log_tail_buffer.py +0 -0
  457. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_logging.py +0 -0
  458. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_logging_isolation.py +0 -0
  459. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_merge_characterization.py +0 -0
  460. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_merge_strategy_annotations.py +0 -0
  461. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_merge_unification.py +0 -0
  462. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_models.py +0 -0
  463. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_mutations.py +0 -0
  464. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_new_criteria.py +0 -0
  465. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_node_env_config.py +0 -0
  466. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_optional_dependencies.py +0 -0
  467. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_orchestrator.py +0 -0
  468. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_orchestrator_error_log_tail.py +0 -0
  469. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_orchestrator_telemetry.py +0 -0
  470. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_overrides_engine.py +0 -0
  471. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_parallel.py +0 -0
  472. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_path_utils.py +0 -0
  473. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_plan_command.py +0 -0
  474. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_plugin_processing.py +0 -0
  475. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_plugins.py +0 -0
  476. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_post_run.py +0 -0
  477. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_pr_review_workflow.py +0 -0
  478. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_pre_run.py +0 -0
  479. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_preservation_mode.py +0 -0
  480. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_pricing_registry.py +0 -0
  481. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_comparison_scoring.py +0 -0
  482. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_evaluator.py +0 -0
  483. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_missing_file.py +0 -0
  484. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_models.py +0 -0
  485. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reference_orchestrator.py +0 -0
  486. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_registry.py +0 -0
  487. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_replicate_stats.py +0 -0
  488. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_report_command.py +0 -0
  489. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reports.py +0 -0
  490. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reports_experiment.py +0 -0
  491. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reports_html.py +0 -0
  492. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_reports_stats.py +0 -0
  493. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_resolve_task_files.py +0 -0
  494. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_resume.py +0 -0
  495. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_retry_logic_comprehensive.py +0 -0
  496. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_routing.py +0 -0
  497. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_run_command_stdout.py +0 -0
  498. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_run_limits_models.py +0 -0
  499. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_run_limits_orchestrator.py +0 -0
  500. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_run_limits_resolver.py +0 -0
  501. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_runtime_tool_versions.py +0 -0
  502. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox.py +0 -0
  503. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_layer_builder.py +0 -0
  504. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_optional.py +0 -0
  505. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_security.py +0 -0
  506. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_symlink_preservation.py +0 -0
  507. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sandbox_templates.py +0 -0
  508. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_scorers.py +0 -0
  509. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_scoring_quality.py +0 -0
  510. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sdk_option_classification.py +0 -0
  511. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_simulation_config.py +0 -0
  512. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_simulation_termination.py +0 -0
  513. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_simulation_trials.py +0 -0
  514. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_agent_integration.py +0 -0
  515. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_batch.py +0 -0
  516. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_callbacks.py +0 -0
  517. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_cli.py +0 -0
  518. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_events.py +0 -0
  519. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_orchestrator.py +0 -0
  520. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_renderers.py +0 -0
  521. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_streaming_wire.py +0 -0
  522. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_sub_agent_runner.py +0 -0
  523. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_success_criterion_union.py +0 -0
  524. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_suite_rollup.py +0 -0
  525. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_summaries.py +0 -0
  526. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_tags.py +0 -0
  527. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_task_definition_unknown_fields.py +0 -0
  528. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_teardown_interrupt.py +0 -0
  529. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_telemetry.py +0 -0
  530. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_template_env_expansion.py +0 -0
  531. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_threshold_enforcement.py +0 -0
  532. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_batch.py +0 -0
  533. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_categorization.py +0 -0
  534. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_exceptions.py +0 -0
  535. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_models.py +0 -0
  536. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_timeout_orchestrator.py +0 -0
  537. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_token_usage.py +0 -0
  538. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_uipath_eval.py +0 -0
  539. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_user_simulator.py +0 -0
  540. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_utils.py +0 -0
  541. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_utterance_extraction.py +0 -0
  542. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_variant_prompt_file.py +0 -0
  543. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_verdict_tool.py +0 -0
  544. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_watchdog.py +0 -0
  545. {coder_eval-0.8.6 → coder_eval-0.8.7rc11}/tests/test_yaml_migration.py +0 -0
@@ -13,6 +13,13 @@ name: Release
13
13
  # and push.
14
14
  # (Continuous :latest / :sha- agent images still publish on every main push via
15
15
  # docker-publish.yml -- only the versioned release artifacts gate on this run.)
16
+ #
17
+ # PRERELEASE mode (dispatched from a NON-main branch): instead of bumping and
18
+ # pushing main, stamp a throwaway `<next-patch>rc<run#>` version, then build and
19
+ # publish the wheel to public PyPI + a `:<version>` GHCR image. It does NOT move
20
+ # `:latest`, tag, commit, or push to main. This lets a branch be dry-run on the
21
+ # ADO nightly infra before merge (pinned via the pipeline's `coderEvalVersion`).
22
+ # The `bump` input is ignored off main. On `main` the behavior is unchanged.
16
23
 
17
24
  on:
18
25
  workflow_dispatch:
@@ -47,9 +54,9 @@ jobs:
47
54
  runs-on: ubuntu-latest
48
55
  timeout-minutes: 15
49
56
  outputs:
50
- # Exposed so the downstream publish-pypi job can gate on a real release
51
- # having been cut (empty => no version bumped => skip PyPI publish).
52
- version: ${{ steps.release.outputs.version }}
57
+ # Exposed so the downstream publish-pypi job gates on a version having been
58
+ # produced (real release on main, or a stamped prerelease on a branch).
59
+ version: ${{ steps.ver.outputs.version }}
53
60
  env:
54
61
  # The self-hosted `uipath-ubuntu-latest` runners enforce a minimum
55
62
  # package-age safe-chain check on uv installs; on GitHub-hosted runners
@@ -58,8 +65,13 @@ jobs:
58
65
  SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS: "openai-codex-cli-bin,openai-codex"
59
66
 
60
67
  steps:
68
+ # Only a real release (main) needs the app token: semantic-release pushes the
69
+ # bump commit + tag to the ruleset-protected main branch, and only this app
70
+ # has the bypass. A prerelease from a branch never commits or pushes, so it
71
+ # skips the token and checks out with the default GITHUB_TOKEN.
61
72
  - name: Mint release app token
62
73
  id: app-token
74
+ if: github.ref == 'refs/heads/main'
63
75
  uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
64
76
  with:
65
77
  app-id: ${{ secrets.RELEASE_APP_ID }}
@@ -70,8 +82,9 @@ jobs:
70
82
  with:
71
83
  fetch-depth: 0 # semantic-release needs full history for tags + changelog
72
84
  # Persisted in .git config so semantic-release's push to main is
73
- # authenticated as the app (which bypasses the branch ruleset).
74
- token: ${{ steps.app-token.outputs.token }}
85
+ # authenticated as the app (which bypasses the branch ruleset). Falls back
86
+ # to the default token for a prerelease (no push, read-only checkout).
87
+ token: ${{ steps.app-token.outputs.token || github.token }}
75
88
 
76
89
  - name: Set up Python 3.13
77
90
  uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
@@ -83,11 +96,38 @@ jobs:
83
96
  with:
84
97
  enable-cache: true
85
98
 
99
+ # Release mode is chosen by the dispatched ref: main => real release (the
100
+ # semantic-release path below); any other branch => prerelease (stamp a
101
+ # throwaway rc version, publish, never touch main). Keying off the ref (not a
102
+ # new input) keeps this dispatchable from a branch — a new input would have to
103
+ # exist on the default branch first to be accepted.
104
+ - name: Determine release mode
105
+ id: mode
106
+ env:
107
+ REF: ${{ github.ref }}
108
+ RUN_NUMBER: ${{ github.run_number }}
109
+ run: |
110
+ set -euo pipefail
111
+ if [ "$REF" = "refs/heads/main" ]; then
112
+ echo "prerelease=false" >> "$GITHUB_OUTPUT"
113
+ echo "Mode: RELEASE (main)"
114
+ else
115
+ # Next patch of the current version, suffixed with the run number so
116
+ # repeated dispatches never collide on PyPI. An exact `==` pin installs
117
+ # it even though pip/uv skip prereleases by default.
118
+ NEXT=$(python3 -c 'import re,tomllib; v=tomllib.load(open("pyproject.toml","rb"))["project"]["version"]; m=re.match(r"(\d+)\.(\d+)\.(\d+)",v); print("{}.{}.{}".format(int(m[1]),int(m[2]),int(m[3])+1))')
119
+ PRE="${NEXT}rc${RUN_NUMBER}"
120
+ echo "prerelease=true" >> "$GITHUB_OUTPUT"
121
+ echo "version=${PRE}" >> "$GITHUB_OUTPUT"
122
+ echo "Mode: PRERELEASE ${PRE}"
123
+ fi
124
+
86
125
  - name: Install build + release tools
87
126
  run: uv tool install python-semantic-release && uv tool install twine
88
127
 
89
128
  - name: Run semantic-release (bump + tag, no push yet)
90
129
  id: release
130
+ if: steps.mode.outputs.prerelease != 'true'
91
131
  env:
92
132
  GH_TOKEN: ${{ steps.app-token.outputs.token }}
93
133
  # Passed via env (not interpolated into the script) per GitHub's
@@ -105,8 +145,45 @@ jobs:
105
145
  # A dispatch always cuts a release; report the just-published version.
106
146
  echo "version=$($PSR version --print)" >> "$GITHUB_OUTPUT"
107
147
 
148
+ # PRERELEASE: stamp the rc version into the two canonical spots (mirrors
149
+ # publish-testpypi.yml), then refresh uv.lock so the Dockerfile's
150
+ # `uv export --frozen` accepts the bumped project version. No commit is made —
151
+ # the working tree is what `uv build` and the image build below consume.
152
+ - name: Stamp prerelease version
153
+ if: steps.mode.outputs.prerelease == 'true'
154
+ env:
155
+ PRE_VERSION: ${{ steps.mode.outputs.version }}
156
+ run: |
157
+ set -euo pipefail
158
+ python3 - <<'PY'
159
+ import os, re, pathlib
160
+ version = os.environ["PRE_VERSION"]
161
+ for path, key in (("pyproject.toml", "version"), ("src/coder_eval/__init__.py", "__version__")):
162
+ p = pathlib.Path(path)
163
+ new, n = re.subn(rf'(?m)^{key}\s*=\s*".+?"$', f'{key} = "{version}"', p.read_text(), count=1)
164
+ if n != 1:
165
+ raise SystemExit(f"version pattern did not match {path} (matched {n})")
166
+ p.write_text(new)
167
+ print(f"Stamped prerelease version: {version}")
168
+ PY
169
+ uv lock
170
+
171
+ # Single source of truth for the steps below: the real release version (main)
172
+ # or the stamped prerelease version (branch).
173
+ - name: Resolve published version
174
+ id: ver
175
+ env:
176
+ REL: ${{ steps.release.outputs.version }}
177
+ PRE: ${{ steps.mode.outputs.version }}
178
+ run: |
179
+ set -euo pipefail
180
+ V="${REL:-$PRE}"
181
+ if [ -z "$V" ]; then echo "no version resolved" >&2; exit 1; fi
182
+ echo "version=$V" >> "$GITHUB_OUTPUT"
183
+ echo "Publishing version: $V"
184
+
108
185
  - name: Regenerate uv.lock and amend release commit
109
- if: steps.release.outputs.version != ''
186
+ if: steps.mode.outputs.prerelease != 'true' && steps.release.outputs.version != ''
110
187
  run: |
111
188
  uv lock
112
189
  if ! git diff --quiet uv.lock; then
@@ -119,43 +196,64 @@ jobs:
119
196
  fi
120
197
 
121
198
  - name: Push release commit and tags
122
- if: steps.release.outputs.version != ''
199
+ if: steps.mode.outputs.prerelease != 'true' && steps.release.outputs.version != ''
123
200
  run: git push origin main "v${{ steps.release.outputs.version }}"
124
201
 
125
202
  - name: Build wheel + sdist
126
- if: steps.release.outputs.version != ''
203
+ if: steps.ver.outputs.version != ''
127
204
  run: uv build
128
205
 
129
206
  # Hand the exact built artifacts to the publish-pypi job. Publishing to
130
207
  # public PyPI runs in its own environment-gated job (OIDC), so it must
131
208
  # consume these files rather than rebuild them.
132
209
  - name: Upload dist for PyPI publish
133
- if: steps.release.outputs.version != ''
210
+ if: steps.ver.outputs.version != ''
134
211
  uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
135
212
  with:
136
213
  name: release-dist
137
214
  path: dist/
138
215
  if-no-files-found: error
139
216
 
140
- # Build + push the agent image HERE, in the same job that cut the release,
141
- # so the `:<version>` tag is built from the BUMPED pyproject (the version
142
- # only exists after the semantic-release step above). docker-publish.yml
143
- # runs on the triggering commit, BEFORE the bump, so it can never tag the
144
- # release version -- this is the authoritative versioned image. It also
145
- # repoints `:latest` to the exact release artifact.
217
+ # Build + push the agent image HERE, in the same job that produced the
218
+ # version, so the `:<version>` tag is built from the correct pyproject (bumped
219
+ # by semantic-release on main, or the stamped rc on a prerelease).
220
+ # docker-publish.yml runs on the triggering commit, BEFORE a main bump, so it
221
+ # can never tag the release version -- this is the authoritative versioned
222
+ # image. A real release also repoints `:latest`; a prerelease publishes only
223
+ # its `:<version>` tag (see Compute image tags).
146
224
  - name: Lowercase owner for GHCR
147
- if: steps.release.outputs.version != ''
225
+ if: steps.ver.outputs.version != ''
148
226
  id: img
149
227
  run: echo "owner_lc=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT"
150
228
 
229
+ # `:<version>` always; `:latest` only for a real release. A prerelease must
230
+ # not move `:latest`, which the nightly treats as tip-of-main.
231
+ - name: Compute image tags
232
+ if: steps.ver.outputs.version != ''
233
+ id: tags
234
+ env:
235
+ OWNER: ${{ steps.img.outputs.owner_lc }}
236
+ VERSION: ${{ steps.ver.outputs.version }}
237
+ IS_PRERELEASE: ${{ steps.mode.outputs.prerelease }}
238
+ run: |
239
+ set -euo pipefail
240
+ {
241
+ echo "tags<<EOF"
242
+ echo "ghcr.io/${OWNER}/coder-eval-agent:${VERSION}"
243
+ if [ "$IS_PRERELEASE" != "true" ]; then
244
+ echo "ghcr.io/${OWNER}/coder-eval-agent:latest"
245
+ fi
246
+ echo "EOF"
247
+ } >> "$GITHUB_OUTPUT"
248
+
151
249
  - name: Set up Docker Buildx
152
250
  continue-on-error: true # GHCR image is internal/best-effort; don't block PyPI
153
- if: steps.release.outputs.version != ''
251
+ if: steps.ver.outputs.version != ''
154
252
  uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
155
253
 
156
254
  - name: Log in to GHCR
157
255
  continue-on-error: true # GHCR image is internal/best-effort; don't block PyPI
158
- if: steps.release.outputs.version != ''
256
+ if: steps.ver.outputs.version != ''
159
257
  uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
160
258
  with:
161
259
  registry: ghcr.io
@@ -164,17 +262,15 @@ jobs:
164
262
 
165
263
  - name: Build and push versioned agent image
166
264
  continue-on-error: true # GHCR image is internal/best-effort; don't block PyPI
167
- if: steps.release.outputs.version != ''
265
+ if: steps.ver.outputs.version != ''
168
266
  uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
169
267
  with:
170
268
  context: .
171
269
  file: docker/Dockerfile
172
270
  push: true
173
- tags: |
174
- ghcr.io/${{ steps.img.outputs.owner_lc }}/coder-eval-agent:${{ steps.release.outputs.version }}
175
- ghcr.io/${{ steps.img.outputs.owner_lc }}/coder-eval-agent:latest
271
+ tags: ${{ steps.tags.outputs.tags }}
176
272
  build-args: |
177
- CODER_EVAL_VERSION=${{ steps.release.outputs.version }}
273
+ CODER_EVAL_VERSION=${{ steps.ver.outputs.version }}
178
274
  secrets: |
179
275
  "uv_index_username=${{ secrets.UV_INDEX_UIPATH_USERNAME }}"
180
276
  "uv_index_password=${{ secrets.UV_INDEX_UIPATH_PASSWORD }}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coder-eval
3
- Version: 0.8.6
3
+ Version: 0.8.7rc11
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://github.com/UiPath/coder_eval
6
6
  Project-URL: Repository, https://github.com/UiPath/coder_eval
@@ -26,7 +26,7 @@ Requires-Python: >=3.13
26
26
  Requires-Dist: anthropic>=0.86.0
27
27
  Requires-Dist: anyio>=4.13.0
28
28
  Requires-Dist: azure-monitor-opentelemetry-exporter<1.1.0,>=1.0.0b30
29
- Requires-Dist: claude-agent-sdk>=0.2.82
29
+ Requires-Dist: claude-agent-sdk>=0.2.124
30
30
  Requires-Dist: click>=8.3.3
31
31
  Requires-Dist: jmespath>=1.1.0
32
32
  Requires-Dist: jsonschema>=4.26.0
@@ -41,9 +41,9 @@ Requires-Dist: starlette>=1.3.1
41
41
  Requires-Dist: tqdm>=4.67.3
42
42
  Requires-Dist: typer>=0.24.1
43
43
  Provides-Extra: antigravity
44
- Requires-Dist: google-antigravity==0.1.5; extra == 'antigravity'
44
+ Requires-Dist: google-antigravity==0.1.7; extra == 'antigravity'
45
45
  Provides-Extra: codex
46
- Requires-Dist: openai-codex>=0.1.0b3; extra == 'codex'
46
+ Requires-Dist: openai-codex>=0.144.4; extra == 'codex'
47
47
  Provides-Extra: dev
48
48
  Requires-Dist: bandit[toml]>=1.9.4; extra == 'dev'
49
49
  Requires-Dist: mcp>=1.28.1; extra == 'dev'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "coder-eval"
3
- version = "0.8.6"
3
+ version = "0.8.7rc11"
4
4
  description = "Evaluate, benchmark, and A/B-test AI coding agents (Claude Code, Codex, Gemini/Antigravity) with sandboxed, reproducible YAML task suites."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -34,7 +34,7 @@ dependencies = [
34
34
  "rich>=14.3.3",
35
35
  "python-dotenv>=1.2.2",
36
36
  "anthropic>=0.86.0",
37
- "claude-agent-sdk>=0.2.82",
37
+ "claude-agent-sdk>=0.2.124",
38
38
  "anyio>=4.13.0",
39
39
  "radon>=6.0.1",
40
40
  "tqdm>=4.67.3",
@@ -85,19 +85,24 @@ uipath = [
85
85
  # Without this extra, the framework still installs and runs; Codex-dependent
86
86
  # code paths fail at dispatch with a clear hint pointing back here.
87
87
  codex = [
88
- "openai-codex>=0.1.0b3",
88
+ "openai-codex>=0.144.4",
89
89
  ]
90
90
  # Optional extra that enables Antigravity agent support:
91
91
  # - AntigravityAgent implementation using Google's official google-antigravity SDK
92
92
  # (drives the bundled `localharness` binary, authenticated via GEMINI_API_KEY).
93
93
  # Pinned exactly: the harness binary is a dominant non-model driver of eval results,
94
94
  # so it travels with the coder_eval release tag and is bumped deliberately (mirrors
95
- # the claude-code CLI / codex cli-bin pins). The wheel ships platform-specific
96
- # (manylinux x86_64 + aarch64, macOS, Windows), so CI/Linux/Docker installs work.
95
+ # the claude-code CLI / codex cli-bin pins).
96
+ # glibc note — verify before bumping: the wheel's manylinux_2_17 tag is NOT a
97
+ # reliable floor; the bundled `localharness` ELF can require a newer glibc than the
98
+ # tag advertises. Eval agents run on Ubuntu 22.04 (glibc 2.35), so the pinned build
99
+ # must load there. 0.1.7 links without DT_RELR (max required symbol GLIBC_2.26) and
100
+ # loads on 2.35+; confirm any future pin does too (readelf -d | grep RELR must be
101
+ # empty / max GLIBC symbol <= the oldest target's glibc).
97
102
  # Without this extra the framework still installs and runs; Antigravity-dependent
98
103
  # code paths fail at start() with a clear hint pointing back here.
99
104
  antigravity = [
100
- "google-antigravity==0.1.5",
105
+ "google-antigravity==0.1.7",
101
106
  ]
102
107
 
103
108
  [project.scripts]
@@ -129,12 +134,14 @@ packages = ["src/coder_eval"]
129
134
  allow-direct-references = true
130
135
 
131
136
  [tool.uv]
132
- # openai-codex 0.1.0b3 hardpins `openai-codex-cli-bin==0.137.0a4`, a
133
- # PRE-RELEASE. Because that pin is transitive (not referenced directly by us),
134
- # uv won't select it without an explicit opt-in. Naming it here as an override
135
- # both enables the pre-release and documents the pinned cli-bin build; 0.137.0a4
136
- # publishes manylinux wheels (x86_64 + aarch64), so CI/Linux installs work.
137
- override-dependencies = ["openai-codex-cli-bin==0.137.0a4"]
137
+ # openai-codex 0.144.4 hardpins `openai-codex-cli-bin==0.144.4` (a stable
138
+ # release; the SDK version now tracks the codex CLI version line). Naming it
139
+ # here documents and holds the pinned cli-bin build — the harness binary is a
140
+ # dominant non-model driver of eval results, so it travels with the coder_eval
141
+ # release tag and is bumped deliberately (mirrors the antigravity localharness
142
+ # and claude-code CLI pins). 0.144.4 publishes manylinux wheels (x86_64 +
143
+ # aarch64), so CI/Linux installs work.
144
+ override-dependencies = ["openai-codex-cli-bin==0.144.4"]
138
145
 
139
146
  constraint-dependencies = [
140
147
  # Fix known CVEs in transitive dependencies
@@ -1,3 +1,3 @@
1
1
  """coder_eval - A framework for evaluating AI coding agents."""
2
2
 
3
- __version__ = "0.8.6"
3
+ __version__ = "0.8.7rc11"
@@ -5,7 +5,9 @@ import contextlib
5
5
  import json
6
6
  import logging
7
7
  import os
8
+ import shlex
8
9
  import shutil
10
+ import tempfile
9
11
  import time
10
12
  from collections.abc import Callable
11
13
  from datetime import datetime
@@ -65,14 +67,6 @@ _CLAUDE_TO_CODEX_TOOL_MAP: dict[str, str] = {
65
67
  "Glob": "shell",
66
68
  }
67
69
 
68
- # Permission mode → sandbox mode mapping
69
- _PERMISSION_MODE_TO_SANDBOX: dict[str, str] = {
70
- "bypassPermissions": "full-access",
71
- "acceptEdits": "workspace-write",
72
- "default": "workspace-write",
73
- "plan": "read-only",
74
- }
75
-
76
70
  # Approval mode — the SAME for every permission mode (no per-mode mapping).
77
71
  #
78
72
  # The Codex SDK exposes exactly two approval modes:
@@ -88,9 +82,9 @@ _PERMISSION_MODE_TO_SANDBOX: dict[str, str] = {
88
82
  # escalations BEYOND the sandbox are refused.
89
83
  #
90
84
  # An eval harness never wants a reviewer that can flake, so EVERY permission mode
91
- # uses deny_all. The trust boundary is the sandbox (_PERMISSION_MODE_TO_SANDBOX),
92
- # which DOES vary by mode: `plan` stays read-only, `bypassPermissions` is
93
- # full-access (intended for isolated Docker runs).
85
+ # uses deny_all. The trust boundary is coder_eval's per-run sandbox — a docker
86
+ # container or an ephemeral tempdir — NOT Codex's in-process OS sandbox, which
87
+ # _build_thread_options always drops to full-access (rationale there).
94
88
  _CODEX_APPROVAL_MODE = "deny_all"
95
89
 
96
90
  # Provider id registered in thread config when CODEX_BASE_URL routes to a
@@ -215,6 +209,17 @@ def _message_uncached_input(m: AssistantMessage) -> int:
215
209
  # supported"), so this is a fixed constant, not an operator knob.
216
210
  _CODEX_WIRE_API = "responses"
217
211
 
212
+ # Login-shell profile files generated into the per-task HOME (see
213
+ # _setup_login_shell_home). ``.bash_profile`` is what ``bash -l`` reads;
214
+ # ``.profile`` covers ``sh``/``dash`` login shells. The zsh trio covers macOS,
215
+ # where zsh is the default shell: ``.zshenv`` runs in EVERY zsh, ``.zprofile``
216
+ # in login shells (AFTER /etc/zprofile, whose path_helper resets PATH), and
217
+ # ``.zshrc`` in interactive shells - including codex's shell snapshot, which
218
+ # sources it explicitly. zsh selects its dotfiles via $ZDOTDIR (fallback
219
+ # $HOME), so _build_codex_env points ZDOTDIR at the generated home.
220
+ _LOGIN_PROFILE_NAMES = (".bash_profile", ".profile", ".zshenv", ".zprofile", ".zshrc")
221
+ _ZSH_PROFILE_NAMES = frozenset({".zshenv", ".zprofile", ".zshrc"})
222
+
218
223
 
219
224
  def _get_item_root(notification: Any) -> Any:
220
225
  """Extract the typed item root from a Codex SDK notification.
@@ -649,6 +654,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
649
654
  self.thread: Any = None
650
655
  self.working_directory: Path | None = None
651
656
  self._env_path_prepend: list[str] = []
657
+ self._login_shell_home: Path | None = None
652
658
  # _state / _iteration / _iteration_was_incremented / pending_turn lifecycle
653
659
  # bookkeeping lives on the Agent base class (shared defaults + helpers).
654
660
  self._log = PrefixedAdapter(logger, {"prefix": instance_name})
@@ -677,6 +683,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
677
683
  """
678
684
  self.working_directory = Path(working_directory)
679
685
  self._env_path_prepend = list(env_path_prepend or [])
686
+ self._setup_login_shell_home()
680
687
  self._state = AgentState.WORKING
681
688
 
682
689
  try:
@@ -872,6 +879,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
872
879
  self._close_client()
873
880
  self.thread = None
874
881
  self._active_turn_handle = None
882
+ self._cleanup_login_shell_home()
875
883
  self._mark_stopped()
876
884
 
877
885
  async def kill(self) -> None:
@@ -887,6 +895,7 @@ class CodexAgent(Agent[CodexAgentConfig]):
887
895
  """
888
896
  self._interrupt_active_turn()
889
897
  self._close_client()
898
+ self._cleanup_login_shell_home()
890
899
 
891
900
  def _interrupt_active_turn(self) -> None:
892
901
  """Interrupt the in-flight Codex turn, if any (best-effort, idempotent)."""
@@ -1071,8 +1080,159 @@ class CodexAgent(Agent[CodexAgentConfig]):
1071
1080
  path_key = next((k for k in os.environ if k.upper() == "PATH"), "PATH")
1072
1081
  env[path_key] = os.pathsep.join([*self._env_path_prepend, os.environ.get(path_key, "")])
1073
1082
  self._log.debug(f"PATH prepend: {os.pathsep.join(self._env_path_prepend)}")
1083
+ if self._login_shell_home is not None:
1084
+ # Point login shells at the generated profile dir (see
1085
+ # _setup_login_shell_home) while pinning codex state (auth, rollout
1086
+ # sessions) to its real location — _codex_home() reads the same
1087
+ # resolution for sub-agent rollout recovery, so both sides agree.
1088
+ # HOME steers bash/sh; ZDOTDIR steers zsh (the macOS default
1089
+ # shell), which ignores HOME for dotfile selection when it is set.
1090
+ env["HOME"] = str(self._login_shell_home)
1091
+ env["ZDOTDIR"] = str(self._login_shell_home)
1092
+ env["CODEX_HOME"] = str(self._codex_home())
1074
1093
  return env if env else None
1075
1094
 
1095
+ @staticmethod
1096
+ def _login_shell_profiles_supported() -> bool:
1097
+ """Whether to generate login-shell profile shims (POSIX shells only)."""
1098
+ return os.name == "posix"
1099
+
1100
+ def _setup_login_shell_home(self) -> None:
1101
+ """Create a per-task HOME whose profiles restore the mock PATH prepend.
1102
+
1103
+ Codex issues every shell command through the user's default shell as a
1104
+ login shell: ``bash -lc`` on Linux, ``zsh -lc`` on macOS (its default
1105
+ shell; fish would need the same treatment here if codex ever picks
1106
+ it). A login shell re-sources the system profile chain -
1107
+ ``/etc/profile`` on Linux, ``/etc/zprofile``'s path_helper on macOS -
1108
+ which unconditionally RESETS PATH, silently dropping the mock-CLI
1109
+ prepend passed via the app-server environment, so bare commands
1110
+ resolve to the REAL CLIs (real-tenant contamination). The per-user
1111
+ dotfiles are sourced AFTER that chain, so a generated per-task HOME
1112
+ (wired up in ``_build_codex_env``; codex state stays in CODEX_HOME)
1113
+ gets the last word and re-prepends the mock dirs:
1114
+ ``.bash_profile``/``.profile`` for bash/sh (selected via env HOME) and
1115
+ ``.zshenv``/``.zprofile``/``.zshrc`` for zsh (selected via env
1116
+ ZDOTDIR; ``.zshrc`` also feeds codex's shell snapshot, which sources
1117
+ it explicitly). Per-task rather than the user's real dotfiles so
1118
+ parallel tasks with different mocks cannot collide. No-op without mock
1119
+ dirs or on non-POSIX hosts: Windows codex shells through PowerShell
1120
+ (``-NoProfile``) or ``cmd /c``, neither of which re-sources a profile
1121
+ chain that resets PATH, so the plain env prepend survives there as-is.
1122
+
1123
+ Bash uses the env HOME only to PICK the profile file; the generated
1124
+ profile's first act is to export the ORIGINAL home back, so the
1125
+ sourced user profile and the command body see the real ``$HOME``
1126
+ (git config, tool caches, ``$HOME``-relative sourcing keep working).
1127
+ Known residual gap: a NESTED bash/sh login shell inside a command
1128
+ re-reads the real profiles and loses the prepend again (nested zsh
1129
+ keeps it - ZDOTDIR stays exported).
1130
+ """
1131
+ self._cleanup_login_shell_home()
1132
+ if not (self._env_path_prepend and self._login_shell_profiles_supported()):
1133
+ return
1134
+ original_home = os.environ.get("HOME", "")
1135
+ # Where the user's REAL zsh dotfiles live: their own ZDOTDIR when set,
1136
+ # else their home (zsh's fallback).
1137
+ original_zdotdir = os.environ.get("ZDOTDIR", "") or original_home
1138
+ # The profile only ever executes under a POSIX shell, so the PATH
1139
+ # separator is ':' regardless of the host building it.
1140
+ quoted_prepend = shlex.quote(":".join(self._env_path_prepend))
1141
+ export_line = f'export PATH={quoted_prepend}:"$PATH"'
1142
+ # Track the dir BEFORE writing so a failed write can't orphan it —
1143
+ # the except below (and any later cleanup) always sees it.
1144
+ home = Path(tempfile.mkdtemp(prefix="coder-eval-codex-home-"))
1145
+ self._login_shell_home = home
1146
+ try:
1147
+ for name in _LOGIN_PROFILE_NAMES:
1148
+ content = self._login_profile_content(
1149
+ name,
1150
+ original_home,
1151
+ export_line,
1152
+ original_zdotdir=original_zdotdir,
1153
+ generated_home=str(home),
1154
+ )
1155
+ # newline="\n": the profile must stay LF-only no matter which host
1156
+ # builds it, or bash sees literal \r at end of line.
1157
+ (home / name).write_text(content, encoding="utf-8", newline="\n")
1158
+ except Exception:
1159
+ self._cleanup_login_shell_home()
1160
+ raise
1161
+ self._log.debug(f"Login-shell mock-PATH home: {home}")
1162
+
1163
+ @staticmethod
1164
+ def _login_profile_content(
1165
+ profile_name: str,
1166
+ original_home: str,
1167
+ export_line: str,
1168
+ *,
1169
+ original_zdotdir: str = "",
1170
+ generated_home: str = "",
1171
+ ) -> str:
1172
+ """One generated profile file: restore the ORIGINAL ``$HOME``, source
1173
+ the user's own counterpart file (so image/user setup isn't lost), then
1174
+ re-prepend the mock dirs.
1175
+
1176
+ The env HOME pointing at the generated dir exists ONLY so bash selects
1177
+ this file; exporting the original home back on the first line keeps
1178
+ every ``$HOME`` consumer (git, npm, the sourced profile's own
1179
+ ``$HOME/.bashrc`` references) on the real home.
1180
+
1181
+ ``.bash_profile`` mimics bash's first-found chain over the original
1182
+ home; the ``.profile`` twin (read by ``sh``/``dash`` login shells)
1183
+ sources only ``.profile`` — the bash-specific files may contain
1184
+ bashisms a POSIX shell would choke on.
1185
+
1186
+ The zsh files each source their exact counterpart from the user's real
1187
+ zsh dotfile dir (``original_zdotdir``) - zsh reads ALL of its startup
1188
+ files, not a first-found chain. ``.zshenv`` additionally re-pins
1189
+ ZDOTDIR to the generated home AFTER sourcing: the user's ``.zshenv``
1190
+ may redefine ZDOTDIR, which would steer the rest of the startup chain
1191
+ away from the generated ``.zprofile``/``.zshrc``. Each zsh file
1192
+ re-prepends because /etc/zprofile resets PATH BETWEEN ``.zshenv`` and
1193
+ ``.zprofile``, and a sourced user file may reset it again; a duplicate
1194
+ PATH entry is harmless, a lost prepend is contamination.
1195
+ """
1196
+ lines = [
1197
+ "# Generated by coder_eval (CodexAgent): the system profile chain resets",
1198
+ "# PATH in login shells, dropping the mock-CLI prepend - this restores it.",
1199
+ ]
1200
+ if original_home:
1201
+ orig = shlex.quote(original_home)
1202
+ lines.append(f"export HOME={orig}")
1203
+ if profile_name in _ZSH_PROFILE_NAMES:
1204
+ if original_zdotdir:
1205
+ origz = shlex.quote(original_zdotdir)
1206
+ lines += [
1207
+ f"if [ -r {origz}/{profile_name} ]; then . {origz}/{profile_name}",
1208
+ "fi",
1209
+ ]
1210
+ if profile_name == ".zshenv" and generated_home:
1211
+ lines.append(f"export ZDOTDIR={shlex.quote(generated_home)}")
1212
+ elif original_home:
1213
+ orig = shlex.quote(original_home)
1214
+ if profile_name == ".bash_profile":
1215
+ lines += [
1216
+ f"if [ -r {orig}/.bash_profile ]; then . {orig}/.bash_profile",
1217
+ f"elif [ -r {orig}/.bash_login ]; then . {orig}/.bash_login",
1218
+ f"elif [ -r {orig}/.profile ]; then . {orig}/.profile",
1219
+ "fi",
1220
+ ]
1221
+ else:
1222
+ lines += [
1223
+ f"if [ -r {orig}/.profile ]; then . {orig}/.profile",
1224
+ "fi",
1225
+ ]
1226
+ lines.append(export_line)
1227
+ return "\n".join(lines) + "\n"
1228
+
1229
+ def _cleanup_login_shell_home(self) -> None:
1230
+ """Remove the generated per-task HOME (best-effort, idempotent)."""
1231
+ home, self._login_shell_home = self._login_shell_home, None
1232
+ if home is None:
1233
+ return
1234
+ shutil.rmtree(home, ignore_errors=True)
1235
+
1076
1236
  def _build_thread_options(self) -> dict[str, Any]:
1077
1237
  """Build thread_start options from agent config.
1078
1238
 
@@ -1090,25 +1250,22 @@ class CodexAgent(Agent[CodexAgentConfig]):
1090
1250
  options["model"] = effective_model
1091
1251
  self._log.debug(f"Codex model pinned to {effective_model}")
1092
1252
 
1093
- # Map permission_mode to sandbox and approval_mode
1094
1253
  permission_mode = self.config.permission_mode.value
1095
- sandbox_mode_str = _PERMISSION_MODE_TO_SANDBOX.get(permission_mode, "workspace-write")
1096
1254
  approval_mode_str = _CODEX_APPROVAL_MODE
1097
1255
 
1098
- # Codex's read-only / workspace-write sandboxes are enforced by a Landlock
1099
- # helper that can't initialize inside the eval's docker container — its
1100
- # writes/execs then fail silently and the agent produces no artifacts
1101
- # (FAILURE with score 0, no loud error). When the harness already provides
1102
- # container isolation (docker driver, signalled by CODER_EVAL_IN_CONTAINER),
1103
- # the in-process sandbox is both redundant and broken, so fall back to
1104
- # full-access: the container IS the trust boundary. No-op on the host
1105
- # (tempdir/host runs), where Landlock works and the marker is unset.
1106
- if sandbox_mode_str != "full-access" and os.getenv("CODER_EVAL_IN_CONTAINER"):
1107
- self._log.warning(
1108
- f"Codex sandbox '{sandbox_mode_str}' can't initialize inside the eval container "
1109
- + "(Landlock unavailable); using 'full-access' — the container provides isolation."
1110
- )
1111
- sandbox_mode_str = "full-access"
1256
+ # Codex always runs full-access. coder_eval owns this run's isolation
1257
+ # boundary either way — a docker container (docker driver) or an ephemeral
1258
+ # per-task tempdir it creates and discards (tempdir driver); those are the
1259
+ # only two drivers — so Codex's own in-process OS sandbox (Landlock/seatbelt)
1260
+ # is always redundant. Worse, it actively breaks on the paths we rely on:
1261
+ # inside the container Landlock is unavailable, on constrained CI agents the
1262
+ # bwrap re-exec is denied ("bwrap: execvp .../codex: Permission denied"), and
1263
+ # on Windows there is no OS sandbox at all — in each case a read-only /
1264
+ # workspace-write run fails its writes/execs silently and scores 0 with no
1265
+ # loud error. Dropping to full-access matches Claude Code and Antigravity,
1266
+ # which run with no in-agent OS sandbox; hard isolation of untrusted actions
1267
+ # is the docker driver's job, and approval_mode stays deny_all regardless.
1268
+ sandbox_mode_str = "full-access"
1112
1269
 
1113
1270
  # Convert to Codex SDK enum values
1114
1271
  # Sandbox enum values use hyphens, ApprovalMode uses underscores