Skip to content

feat(evaluator): run sequential judges in the shared case runtime - #315

Merged
zpzjzj merged 3 commits into
mainfrom
feat/docker-judge-snapshots
Oct 20, 2026
Merged

zpzjzj merged 3 commits into
mainfrom
feat/docker-judge-snapshots

Conversation

@zpzjzj

@zpzjzj zpzjzj commented Oct 13, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Run the evaluated Agent once, then execute named judges sequentially in the same case runtime (none, Docker or OpenSandbox). Each Agent judge starts a fresh session; timeouts, verdicts and archived materials remain separate by judge ID. Remove judge Snapshot/fork support and retain normal case cleanup.

Filesystem mutations, installed tools, services, volumes, environment and network policy remain shared. Later judges still run after an earlier judge FAIL/ERROR; case cancellation skips pending members. Separate sessions do not provide filesystem or external-service isolation.

Changes and scope

  • Keep shared sequential judge orchestration, all_required aggregation and per-judge artifacts together with their runtime tests. Independent engine provisioning and provider routing are supplied by main via feat(judge): support independent judge engine configuration #314.
  • Include the three OpenSandbox E2E files and bilingual verification documentation previously reviewed in test(runtime): verify sequential judges in a shared OpenSandbox #316. That PR is superseded by this one; no separate OpenSandbox implementation PR remains.
  • Cover shared filesystem/dependencies, fresh session IDs, material readback, script FAIL / later judges PASS / aggregate FAIL, independent OpenCode provider configuration, and default-provider routing readback.

Dependencies

Based on main at 6d121cb02970e355fe5ea00c55a215f09a8542b1, including #314's independent-engine/provider support and #323's bounded GoReleaser build concurrency. The PR contains only shared-runtime orchestration, Snapshot removal, consolidated regressions/documentation, and the OpenCode judge connection-order fix. #316 is closed and its tests/docs are included here.

Part of #308. Filesystem-isolation-specific acceptance remains outside this shared-runtime design, so #308 stays open.

Validation

  • After rebasing onto main with fix(ci): bound GoReleaser build concurrency on self-hosted runners #323, local make fmt verify test build e2e test-action passed on 83583ba4dffd0c138d727b5e8336f22e2ab83095, including race tests, plugin tests and Skill regression scripts. E2E-tag lint passed with zero findings. The real OpenCode 1.14.24 loopback HTTP order regression also passed in both directions. All standard CI checks passed for this exact SHA: CI, Extended CI, CodeQL, docs, and release tooling.
  • Standard CI covers build/race tests, lint, Linux E2E, Windows E2E, Docker integration, CodeQL, documentation and release-tool checks. Service/model-gated cases are compiled but skip without explicit flags and credentials; these skips are not live verification.
  • Historical live validation of the imported implementation and test assertions (assertion helper extraction and lint cleanup preserve the original test coverage): shared-runtime OpenSandbox fixtures passed against two tenant configurations; real OpenCode 1.14.24 default-provider configuration readback passed; the real qwen3.8-max endpoint control passed with two distinct judge sessions and cleanup confirmed.
  • Native OpenAI model invocation remains unverified: direct api.openai.com connectivity timed out from the test sandbox. No native-model success or service-egress isolation is claimed.

The writing-evals guide includes reproduction commands for the shared environment, real provider calls and configuration-only readback.

Follow-up: OpenCode judge connection ordering

Fixed the review regression where a legacy judge.model member could reuse the preceding independent OpenCode judge's endpoint. Every OpenCode Agent judge now reapplies its resolved provider connection before invocation; independent-engine install/preflight and shared runtime/fresh-session behavior are retained.

  • Regular race tests cover native/custom providers, explicit/default runner endpoints, legacy-alone, independent → legacy, and legacy → independent → legacy, including custom key binding and preservation of MCP/unrelated providers. The affected order cases fail before the fix and pass after it.
  • A gated local CLI E2E uses OpenCode 1.14.24 and two loopback HTTP recorders. Before: independent → legacy routes B → B. After: B → A; reverse order remains A → B. It uses fixture keys and fixed HTTP 400 responses, so this proves HTTP routing, not successful model grading.
  • Local make fmt verify test build e2e test-action, including race tests, passed. E2E-tag lint passed with zero issues. All standard CI checks passed for 83583ba after rebase onto main with fix(ci): bound GoReleaser build concurrency on self-hosted runners #323 (runs linked above); live-service/model-gated skips are not counted as service validation.

Reproduce the local HTTP test with SKILL_UP_OPENCODE_ORDER_E2E=1 go test -count=1 -tags e2e -run '^TestOpenCodeJudgeConnectionOrder$' -v ./e2e and OpenCode installed.

@zpzjzj
zpzjzj marked this pull request as ready for review October 13, 2026 07:38
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-13T07:44:55.544167Z 3796e6e Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@zpzjzj
zpzjzj force-pushed the feat/docker-judge-snapshots branch from 3796e6e to 7bed79b Compare October 13, 2026 09:50
@zpzjzj zpzjzj changed the title feat(runtime): isolate Docker judges with filesystem snapshots feat(evaluator): run sequential judges in the shared case runtime Oct 13, 2026
@zpzjzj
zpzjzj force-pushed the feat/docker-judge-snapshots branch from 7bed79b to f3aa2b8 Compare October 14, 2026 02:33
@zpzjzj
zpzjzj force-pushed the feat/docker-judge-snapshots branch 2 times, most recently from 13df20f to 918952a Compare October 16, 2026 03:05

@JHWang-1997 JHWang-1997 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reproduced an order-dependent P2 regression in shared-runtime judging: a legacy OpenCode judge can retain the preceding independent judge’s endpoint instead of its resolved runner connection. Verified actual HTTP request routing with OpenCode 1.14.24; the same reproduction routes correctly on base 87f86b5. Details and reproduction are in the inline comment.

Comment thread internal/evaluator/multi_judge.go

@JHWang-1997 JHWang-1997 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@zpzjzj
zpzjzj force-pushed the feat/docker-judge-snapshots branch from fb6981c to 83583ba Compare October 20, 2026 02:40
@zpzjzj
zpzjzj added this pull request to the merge queue Oct 20, 2026
Merged via the queue into main with commit de025e6 Oct 20, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants