Repository navigation
fix(verifier): per-user config, outputs outside the workspace, and package caches in separate verifier sandboxes - #1188
Merged
Conversation
The verifier runs as root with HOME=/root, which is the agent's workspace in many tasks, so ~/.config/pip/pip.conf, ~/.pip/pip.conf, ~/.gitconfig and ~/.config/git/config there were whatever the agent left, in shared mode and in a separate verifier sandbox alike (the /root workspace crosses). VERIFIER_ENV now sets PIP_CONFIG_FILE=/dev/null (pip loads no config file) and GIT_CONFIG_GLOBAL=/dev/null (git 2.32+; /etc/gitconfig still applies), and drops PIP_NO_USER_CONFIG, which is not a pip option. A task that needs either config back sets it in its verifier env.
.cache/pip, .cache/uv and npm's _cacache, _npx and _logs below a captured root are recorded as package_cache exclusions instead of captured. With a /root workspace the harness's own installs fill them as root before the agent starts; on a FrontierPhysics ion-trap-design run they were 97% of the 745 MB the separate verifier received and the rubric review uploaded.
…erifier Only the workspace (sandbox.workdir, else the image WORKDIR) crossed, so a task whose agent writes graded files elsewhere scored 0 with no error: FrontierPhysics kinked-ladder-polymer-scattering (workspace /app, outputs in /root) went from 19/19 shared to 0/19 with --separate-verifier. --separate-verifier-include PATH (repeatable; SDK and config separate_verifier_include) captures each path beside the workspace into evidence/artifacts/ and lays it over the verifier image's copy at the same path. Relative paths, pseudo filesystems and roots such as /, /usr and /home are refused before any sandbox starts. config.json records verifier_include and the transfer inventory lists each path's status. The freeze also lists the regular files the agent phase wrote outside everything that crosses (system, scratch and provider trees, package caches and the agent's home skipped), as a log warning and under outside_workspace_writes in verifier-sandbox.json. Advisory only. Also escape [verifier] in the --separate-verifier help, which Rich markup swallowed.
The oracle path's own 'git config --global --add safe.directory' wrote /root/.gitconfig after the agent-phase clock started, and an oracle's .pyc files under the /oracle mount were listed too. Restart the clock after that harness step and skip the harness mounts (/oracle, /solution, /tests, /verifier).
…outside-workspace list A denylist task's egress proxy (/opt/benchflow-egress) is set up after the agent-phase clock starts and was listed as 30 files the separate verifier would miss. BenchFlow's own installs under /opt/benchflow* are harness state.
bingran-you
added a commit
that referenced
this pull request
Oct 16, 2026
Publish the verifier follow-ups from #1188: pip's and git's per-user config ignored under /root, --separate-verifier-include for outputs outside the workspace with a warning for files left behind, package-manager caches kept out of workspace evidence, and mcp 1.30.0. Set the public package version to 0.7.11.
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Follow-ups to #1185 (separate verifier sandboxes), found by end-to-end runs of 0.7.10 from PyPI on Daytona against FrontierPhysics tasks.
/root. The verifier runs as root withHOME=/root, which is the agent's workspace in many tasks, so~/.config/pip/pip.confor~/.gitconfigthere were whatever the agent left, in shared mode and in a separate verifier sandbox alike (the/rootworkspace crosses).VERIFIER_ENVnow setsPIP_CONFIG_FILE=/dev/nullandGIT_CONFIG_GLOBAL=/dev/null, and dropsPIP_NO_USER_CONFIG, which is not a pip option and did nothing.--separate-verifier-include PATHcarries outputs outside the workspace. Only the workspace crossed, so a task whose agent writes graded files elsewhere scored 0 in separate mode with no error. 14 of FrontierPhysics's 56 tasks do this (mostly a/appworkspace with/root/paper.pdf,/root/result.mdand CSVs). Each include path is captured beside the workspace intoevidence/artifacts/(the artifact sub-bundles main already had), hash-checked, and laid over the verifier image's copy. The freeze also lists files the agent phase wrote outside everything that crosses, as a warning and inverifier-sandbox.json, so a missing include does not pass silently./rootwere 97% of the 745 MB the separate verifier received (and the rubric review uploaded).mcp1.30.0 inuv.lockfor CVE-2026-59951, which failedpip-auditand, through it,main's release gate. Only the threemcplines change.Also escapes
[verifier]in the--separate-verifierhelp, which Rich markup swallowed.Behaviour changes
env.package_cacheexclusion reason; rubric reviews no longer receive pip/uv/npm caches.--separate-verifier-includeis opt-in; it is inert (with a warning) for a task whose verifier is shared.Real runs on Daytona
Built from this branch (editable install, fresh dependency resolve:
daytona 0.225.0,mcp 1.30.0), FrontierPhysics tasks at maineeb582d5, Azuregpt-5.6-terra. Every verifier ran in its own sandbox, distinct from the agent's.Per-user config. A harness check whose oracle writes
42to/root/answer.txtand leaves a gituser.nameand a piptimeoutin its/rootworkspace (the verifier's HOME). The verifier reports what git and pip see; the reward depends only on the answer.git config user.nameseen by the verifierleft-by-solverleft-by-solverOutputs outside the workspace (FrontierPhysics tasks with an
/appworkspace whose graded files go to/root; oracle, rubric review stripped):--separate-verifier--separate-verifier--separate-verifier-include /root/root(forward_check.npz,inversion_predictions.csv,report.pdf, ...)/rootcaptured (31 files)/root(LHX_mixing_energy_site_occupancy.csv,result.md,paper.pdf)/rootcaptured (393 files)Tasks whose graded files are all in the workspace are unchanged and the list stays empty: hole-bifurcation-ml-landscape 7/7 and multiplexing-ion-chain-qnet 13/13 in separate mode, as on 0.7.10 in both modes.
ion-trap-design (
/rootworkspace; compiles C extensions at grading time; rubric review with codex-acpgpt-5.6-terraxhigh):gpt-5.6-terraxhigh, t1gpt-5.6-terraxhigh, t2/root/.cache/uvand/root/.npm/_cacache. Here those arepackage_cacheexclusions and the C build in the verifier sandbox is clean./opt/benchflow-egressproxy files and an oracle's/oracle.pycfiles; both are skipped now, and every run on the final commit lists only real outputs.0.7.10 re-grade of published trials. As a check of the separate verifier itself, the 57 published ion-trap-design trials whose submitted
solution.json/trap.stlsurvive in FrontierPhysics's results dataset were re-graded with 0.7.10--separate-verifierfrom exactly those files. All 49 whose files are byte-identical to the original capture, and the 6 whosesolution.jsonwas re-serialized in the dataset (so its hash no longer matches the capture), get the published per-test outcome: 46 with bit-identical physics and geometry numbers, 3 hitting the 2400 s verifier limit as their published runs did.Tests
tests/test_verifier_user_config.py: realgitandpipread a planteduser.name/timeoutfrom a temporary HOME (control), and do not with the verifier env. The git tests fail onmain.tests/test_review_evidence.py: caches are excluded and recorded; look-alikes (.cache/matplotlib,.npmrc,.local/bin,results/cache/uv) are kept.tests/test_separate_verifier.py(+22): include-path validation, CLI/config/sharding plumbing, include bundles crossing and being laid over the image's copy, includes and the scan applying only in separate mode, the agent-phase clock, the scan's skip rules on a real tree, and the record field.pytest tests/: 6624 passed, 75 skipped, 11 deselected locally before the last two commits (the affected files pass after them).ruff check,ruff format --check,ty check src/and the CIpip-auditcommand pass locally.test,pip-audit,rollout-smoke,fixture-scenarios,parityandintegration-scopepass.