Repository navigation
Conversation
Signed-off-by: Abhishree <athittenaman@nvidia.com>
Signed-off-by: Abhishree <athittenaman@nvidia.com>
Signed-off-by: Abhishree <athittenaman@nvidia.com>
Signed-off-by: Abhishree <athittenaman@nvidia.com>
Two GDPVal tasks have 220-660 MiB reference files, above the 128 MiB cap, so their seeds always failed and were retried as transient errors. Use a separate 1 GiB per-file cap and an idle-read timeout, bound connection retries, retry 429/5xx a few times, and return a terminal 413 for oversize files. Signed-off-by: Abhishree <athittenaman@nvidia.com>
A subdirectory, link, unsafe name, or more than 100 files in /workspace/output made the export return 503, which counts as a retryable infra failure, so the task was dropped from the score and re-run on resume. Judges read only top-level regular files, so export those, record skipped entries in finish_params.json, and raise the export cap to 1 GiB (two gold deliverables exceed 128 MiB). Signed-off-by: Abhishree <athittenaman@nvidia.com>
Raising 503 on an invalid judge verdict sent the row to the failure sidecar without its export, so judge-only ELO could not score it and a resume re-ran the agent while the seeded judge choice repeated. Return the verdict: rubric aggregation already excludes invalid rows and reports them. Signed-off-by: Abhishree <athittenaman@nvidia.com>
A missing reference or exhausted retries surfaced as a bare aiohttp error, which the middleware turns into a generic 500, so EnvironmentServer re-ran the episode. Return 424 for a non-retryable HTTP status and 503 after the last attempt, and let the download loop own retries (one try per request() call), so the worst case is four bounded attempts. Signed-off-by: Abhishree <athittenaman@nvidia.com>
Sandbox sessions return an invalid judge verdict with a placeholder 0.0 so its export stays available for re-judging. The GDPVal rubric mean skips it, but gym eval profile and trainers only skip rows with mask_sample, so they counted it as a real zero. Set mask_sample on these verdicts. Also set failure_reason and failure_kind (judge_unparseable for an unscorable reply, judge_failed when there is no judge result, verifier_error for a missing rubric), which Gym expects on masked rows. This is safe: rollout collection sends a row to the failures sidecar only when it carries _ng_failure_class, and resume treats every rollouts.jsonl row as done; neither reads failure_kind or mask_sample. So the row stays in rollouts.jsonl with its deliverables_dir and a resume does not re-run the agent. Signed-off-by: Abhishree <athittenaman@nvidia.com>
Every attempt either returns after a complete write or raises, but nothing enforced that after the loop. A fall-through would let seeding stage whatever bytes sit at the shared scratch path: a partial body or the previous reference. Raise a retryable 503 instead, and test that a body cut off on every attempt is never staged. Signed-off-by: Abhishree <athittenaman@nvidia.com>
The 1 GiB export cap exists because the gold answer for task 75401f7c is a video of about 278 MiB. Assert the cap still admits it, as the reference cap test does for the largest reference file. Signed-off-by: Abhishree <athittenaman@nvidia.com>
The export listing printed [] when /workspace/output was missing or a symlink, so the marker read as "the model saved nothing". The listing now reports whether the directory was usable, and the export records it in finish_params.json "skipped". A listing that is malformed, or lists entries for an unusable directory, is still a 503. Signed-off-by: Abhishree <athittenaman@nvidia.com>
The model decides how many output entries are skipped, so finish_params.json and the warning could grow without limit; transport routing already ignores markers over 16 MiB. Keep the first 100 skipped entries and record the total in skipped_count. Signed-off-by: Abhishree <athittenaman@nvidia.com>
A failed copy left task_<id>/repeat_<n>.partial, which starts with repeat_, so judge-only scoring listed it as an attempt and could judge a partial export. Stage copies in <output>/.staging/ and remove it at the end. Signed-off-by: Abhishree <athittenaman@nvidia.com>
A row whose deliverables_dir had no finish_params.json was counted as a plain skip, so a moved, deleted or unmounted export silently became a missing task in judge-only ELO. Report those rows as export_without_marker and exit non-zero listing their task ids; rows with no deliverables_dir stay a plain skip. The summary now lists task ids per outcome. Signed-off-by: Abhishree <athittenaman@nvidia.com>
Document libreoffice_command, the sandbox export rules, and how to score sandbox-session exports with judge-only multi-stage ELO (cache_sandbox_deliverables, readiness timeout, -i, dataset_path). Note that a judge overlay must follow --config benchmarks/gdpval/config.yaml, because --benchmark is appended after every --config, and fix the Kimi example that used the wrong order. Replace stale Stirrup-only and rubric-only wording. Signed-off-by: Abhishree <athittenaman@nvidia.com>
The rubric scorers re-raise permanent judge errors (413, context window), and any bug in grading raises too. /verify then failed, so the row reached the failures sidecar without deliverables_dir, the cache adapter never saw the export, and judge-only ELO scored the task as missing. Catch errors from grading only (export failures still fail /verify) and return the same masked placeholder as an invalid verdict: judge_failed for judge errors, verifier_error otherwise, retryable unless the judge error is permanent. Cancellation still propagates. Signed-off-by: Abhishree <athittenaman@nvidia.com>
Removing either check left the suite green. Test that a libreoffice_command whose probe output is not a PDF fails the startup check, and that a file whose size changed between listing and copy fails the export without writing a marker. Signed-off-by: Abhishree <athittenaman@nvidia.com>
The startup probe converted only in the temp directory, so a container command without a bind for deliverables_root passed and then failed on every export, falling back to text. Also probe in a temp directory under deliverables_root when it is set. Each probe is now one in-place LibreOffice run, like the first attempt of a real conversion: convert_to_pdf retries an xlsx from a temp-directory copy, which would hide the missing bind. Signed-off-by: Abhishree <athittenaman@nvidia.com>
Every status below 500 except 408 and 429 was terminal, including 425 (which the Environment Server retries) and the status 0 that aiohttp reports for some malformed responses. Make only 4xx terminal, excluding 408, 425 and 429. Signed-off-by: Abhishree <athittenaman@nvidia.com>
An export made before the server wrote finish_params.json has no marker, so the cache build fails on it. Say so in the error, next to the moved or unmounted export case. Signed-off-by: Abhishree <athittenaman@nvidia.com>
The model decides how many entries /workspace/output holds, and the listing printed all of them for the server to parse. Print at most 10,000 (sorted) and report the rest as unlisted; the export counts them in skipped_count, since it keeps at most 100 files anyway. Signed-off-by: Abhishree <athittenaman@nvidia.com>
The Kimi and MiniMax multi-stage overlay headers ran --benchmark gdpval --config <overlay>. The CLI appends --benchmark after every --config, so the benchmark config won: gym env resolve shows the frontier panel replacing both overlays' judge, and the MiniMax overlay falling back to rubric mode. Load the benchmark with --config before the overlay instead. In the server README, say that a missing output directory is still judged as an empty submission, and cover raised judging errors and the listing limit. Signed-off-by: Abhishree <athittenaman@nvidia.com>
This was referenced Oct 14, 2026
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.
What does this PR do?
Stacked on yaoyu-33#8 (Pi in GDPval task sandboxes), which is stacked on NVIDIA-NeMo#3626. This PR fixes what
blocked a full 220-task Pi × GDPval run on HSG. It also adds a way to score sandbox-session runs with the GDPval-AA v2
multistage ELO:
gym eval run --no-servecannot drive multistage.Fixes, grouped by problem:
(
29edfc233).start. There is now a 1 GiB per-file cap with bounded download retries. A missing file fails the task with a terminal
424 and an oversized one with a terminal 413, instead of an endlessly retried 500. 408, 425, 429, 5xx and malformed
responses are retried (
ef48c21ee,6fe5f612a,65274f632,802476d34)./workspace/outputfailed theepisode as an infrastructure error, which dropped the task from the score. The export now copies the top-level
regular files (all the judge reads). Everything else is recorded in
finish_params.jsonunderskipped: the first100 entries plus a count. A missing or symlinked output directory is recorded too, and the in-sandbox listing is
capped at 10,000 entries. The export cap is now 1 GiB, because two gold deliverables exceed 128 MiB (
abdec3d38,925b786fe,e18f1f5bc,12f0d65b1,75aaa5eeb).finish_params.jsonmarker, so comparison mode judges the exportinstead of reporting it missing (
6020761bf).never reached the ELO.
(Claude on Bedrock, "Input is too long").
mask_sample,failure_kind,failure_reason) that keepsdeliverables_dir.The rubric mean and
gym eval profileexclude it, and judge-only scoring re-judges the export (f54d81898,7290f2abb,22f6dede0).libreoffice_command, for example to run it throughthe GDP image with
apptainer exec. The startup probe checks that the command can seedeliverables_rootas well asTMPDIR (
24e59f9c1,93e6cbb6a).Adds:
resources_servers/gdpval/cache_sandbox_deliverables.pycopies sandbox exports into thetask_<id>/repeat_<n>layout that judge-only scoring reads. Multistage ELO then runs as a second, judge-only pass. The cache build stages
copies outside the task directories, and it fails, naming the tasks, when an export has no marker (
eee1fd325,4183b4b2a,9fccc683c,57ff3ca01).libreoffice_command(42c0f2ddd,8c0c43579).They also give the config-order rule for overriding the judge panel: pass
--config benchmarks/gdpval/config.yamlbefore your overlay instead of using
--benchmark gdpval. The CLI appends--benchmarkafter every--config, sothe benchmark's judge settings silently replace yours. The headers of the Kimi and MiniMax judge overlays showed the
wrong order and are fixed.
Related:
Validation
NEMO_GYM_EXTRA_ROOTS=$PWD resources_servers/gdpval/.venv/bin/python -m pytest resources_servers/gdpval/tests -q:655 passed, 3 skipped, 4 failed.
test_judge_panel.pyand are the same ata35bc005e: the openai SDK rejects a StarletteTestClientas itshttp_client.select_measured; cancellation still propagates;%PDFcheck.pre-commit run --files <changed files>: all hooks pass with no changes.ruff checkandruff format --checkareclean.
follow-ups.
Rollouts
220-task Pi × GDPval on HSG:
concurrency 16.
f54d81898, across two chained 2-hour jobs with one automatic resume. The later commitsare covered by unit tests.
ladder.
22f6dede0fixes.partial_completionfloors: 0.9 / 0.3 / 1 for stage 1 and 0.95 / 0.5 / 1 for the final stage. Availability-only reference repair. The Codex run (#1) used the same settings.comparison/eval_elo)partial_completionat 98.2% coverage; it is not degraded and has no imputed losses. Stage 1 (45 tasks × 18 references) gave 1194.8. The 4 omitted tasks are alltransport_ineligible: their deliverables are larger than every judge's attachment limit.Compatibility and benchmark impact
libreoffice_commanddefaults to unset.finish_params.jsonfrom sandbox exports gainsskippedandskipped_count. Its readers only check that the fileexists.
/verifywith a 500 or 503. Thiscovers invalid verdicts, raised judge errors, and inline comparison failures. Score such runs with the judge-only
pass from the cache.
multistage protocol.
truncation_recovery. A call that spends the whole output budget on reasoningends the episode.
copies.
--benchmarkafter--config) has no test.Checklist
git commit -s) (so the DCO check passes).