feat(tasks): add LiveOIBench — olympiad C++ problems with subtask scoring - #121
Merged
Conversation
21 tasks
ethan-scitix
force-pushed
the
liveoibench
branch
from
September 11, 2026 07:21
4eee8f0 to
f864e54
Compare
ethan-scitix
marked this pull request as ready for review
September 11, 2026 08:49
…ring 403 informatics-olympiad problems from 72 contests across 14 olympiads (2023-2025), graded in C++ with IOI-style subtask partial credit and ranked against the contests' real human contestants. This is the first benchmark here whose grading needs a compiler. Every other code benchmark posts to the vendored code-evaluator, which ran Python, JS and TS only; LiveOIBench is C++-first (the paper measures C++, and reports Python ~9 points lower on a USACO subset), so the port has two halves: * `vendor/code-evaluator` gains `source="liveoibench"` — g++ compile, then one child per test case under RLIMIT_CPU / RLIMIT_AS at the problem's own limits with upstream's explicit 20% buffer, plus its CPU poller and its output comparison. Compilation is bounded where upstream's is not, every test always runs (subtask scoring needs the whole verdict vector), and the response carries `case_verdicts` + `case_names` so the caller maps verdicts onto subtasks by the names the server used rather than re-deriving an ordering. * `sieval/community/liveoibench/` ports the prompt, extraction (vendored byte-identical), subtask scoring and human ranking from the Apache-2.0 upstream at 7759e3b8. Scope is the 380 `batch` problems. The 23 interactive ones need an interactor process the evaluator does not run, so the dataset filters them out rather than scoring them zero — which means these numbers are NOT comparable to the paper's 403-problem table. The 5 script-judged problems run `evaluate.sh` shipped as data and are excluded with them. No checker path exists, and that is fidelity rather than a shortcut: the published dataset materializes no `checkers/` directory, so upstream's own judge compares outputs directly on this data and the 36 min-score subtasks (of 3700) collapse onto the all-or-nothing rule. The 33.5 GB test corpus ships as three single-row-group parquets, so no cheap per-problem read exists; `scripts/materialize_liveoibench_tests.py` unpacks it once into upstream's own layout, and the loader refuses to run until it has, naming the command. The evaluator then reads test directories off disk — inlining would move the whole corpus over HTTP once per rollout. Upstream samples n=8 and reports the best candidate; the task defaults to n=1 and reproduces best-of-n at whatever n it is given. No published number is claimed: no run has been aligned, and the task ships with no alignment card. Verified against g++ 14.2: unit tests for prompt, scoring, ranking, dataset and task (64 new, 5856 total green), the evaluator's verdict vectors for correct / partial / TLE / MLE / compile-error / float-tolerance / grader-linked submissions, and a full end-to-end run of dataset -> prompt -> real g++ over HTTP -> subtask scores -> human percentile. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Review of the benchmark found four divergences in the ranking and aggregation
half, all of which move numbers the paper can be compared against, and two of
which were documented as not existing.
* **USACO never joined the contestant table.** The contest id was derived as
`{competition}-{year}-{round}`, but the published table keys USACO by division
(`USACO-2023-December_Contest-platinum` / `-combined`). Of the 61 contest ids
the 380 batch problems derive, 11 were absent from the 72-row table -- 132
problems, 35% of the scored set, silently dropped from `human_percentile`,
`medal_rate` and `gold_rate` behind a count-only warning. Upstream's routing is
ported instead: `build_problem_to_contest_map` reads the authoritative mapping
out of the contestant row's own `problems` column (where the division split is
the only place it is stated), and `resolve_contest_id` walks upstream's
fallback ladder, CCO rename included. All 380 batch problems are listed by
exactly one contest row, so the join is now total.
* **`Recalculated_Total` is in the published data.** The module claimed no
contest carried it; 10 of 72 do, and upstream prefers it over the per-task sum
wherever it exists. The two differ for 20-83% of contestants on each of those
contests, and the resulting percentiles differ on four: at a model total of a
quarter of the maximum, CEOI-2023 read 75.0 where upstream reads 37.5. The
branch is ported, dropping unparseable rows as upstream's `.dropna()` does
rather than zeroing them, along with the Canadian Computing Olympiad rank
re-derivation nested inside it (unreachable on this release, ported for the
same reason the `min-score` branch is).
* **`relative_score` was problem-weighted**, where upstream means inside a
contest and then across contests. Measured over the 380 scored problems: 72
contests sized 1 to 10, the largest being JOI-2023-JOI_spring at 10, then
eleven USACO rounds at 9 each -- so the two weightings are not
interchangeable. This is the task's `score_key`.
* **`pass_rate` meant the opposite of upstream's.** What was reported as
`pass_rate` is upstream's `tests_passed_pct` (fraction of test cases) and what
was reported as `ace_rate` is upstream's `pass_rate` (fraction of problems
fully solved). Both now carry upstream's names, so the report can be read
against `{model}_contest.json` without a translation table.
Two contests-with-no-contestants paths came out of the same pass: a contest that
publishes cutoffs and an empty ranking still earns its medal (upstream's
`df.empty` branch -- every USACO row in the release is this shape), while a
USACO `-combined` contest reports neither medal nor percentile, because upstream
scores it from promotion thresholds that live in its repository rather than in
the dataset. NaN cutoff cells now read as "no cutoff" instead of as a cutoff
nothing can clear.
Robustness, from the same review:
* The evaluator raised `RuntimeError: coroutine raised StopIteration` on a suite
with no test case -- it looked for a first failure among no results. It now
refuses the suite by name, and the task turns an empty verdict vector into a
`NonRetriableSampleError` that names the directory instead of scoring every
subtask at zero.
* Materialization was not atomic. An interrupted 33.5 GB unpack left a partial
directory that both the script's own skip check and the loader's
`require_tests` guard read as complete. Cases now land in a sibling
`tests.partial` and are renamed over the target in one step.
* The per-request HTTP deadline was a bare float, which httpx also applies to
the wait for a free connection. These deadlines span 150s to half an hour, so
a small problem queued behind large ones could fail on the pool without being
graded; `pool=None` decouples them.
* The test directory is read once per sample from a worker thread rather than
once per rollout on the event loop.
* `pyarrow` is declared: it was imported directly by the dataset and only
reached the environment as a transitive of `datasets`. Lock re-resolved with
`--update-reuse`; the only change is the content hash.
`reference_impl.notes` gains the aggregation rule, the USACO ranking situation,
and the three IATI problems that link against a grader whose header the prompt
never shows -- an unavoidable 0 that upstream shares and that would otherwise
read as model failure.
Verified: 5875 tests pass (18 new), ruff and ty clean, preflight 25/25 with no
warnings. Each fix was reverse-mutated at its new site and every one of the 11
mutants was caught. The C++ path was re-checked against g++ 14.2 for the empty,
partial and compile-error cases. Contest and problem counts above were measured
against the pinned dataset revisions.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
…s liveoibench `Dockerfile.multipl-e`, which landed on main alongside the table-driven language support, was byte-identical to `Dockerfile.cpp` apart from its extra toolchains: same base, same workdir, same requirements, same `COPY app/`, same CMD and port. The only question was whether its `apt-get install g++` covers what the liveoibench `-static` link needs without naming `libstdc++-*-dev` and `libc6-dev` the way `Dockerfile.cpp` did. It does, and this was measured inside the real base rather than reasoned about. On the current `python:3.10-slim` (Debian 13.6), `g++` alone brings in `libc6-dev 2.41` and `libstdc++-14-dev`; `libstdc++.a` and `libc.a` both resolve; and the judge's exact command line -- `g++ -std=gnu++17 -Wall -O2 -pipe -static -g` -- builds and runs a `bits/stdc++.h` program. Debian's `g++` metapackage depends on the versioned compiler, which depends on the matching `libstdc++-N-dev`, which depends on `libc6-dev`, so the two explicit packages were never adding anything. Worse, they had started to drift: `Dockerfile.cpp` pinned `libstdc++-12-dev` while the base has since moved to gcc 14, so it installed a dev tree the compiler no longer uses. A second image to build, deploy and keep current, for nothing. `Dockerfile.multipl-e`'s toolchain comment now records that g++ has a second consumer -- `source="liveoibench"` reaches a different C++ path (`exec_cpp.py`: per test case, `-static`, under the problem's own RLIMIT_CPU/RLIMIT_AS) than the `cpp` row in `exec_lang.LANGUAGES` -- so a later edit does not drop the compiler on the grounds that MultiPL-E is the only caller. `VENDORED.md` and `examples/liveoibench.yaml` name the surviving image. Preflight 25/25, no warnings. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Review of the rebased branch. Nothing in the port's arithmetic moved: the
extractor is still byte-identical to upstream below its provenance header,
and `score_contest` still agrees with upstream's pandas `compute_human_metrics`
on every contest of the published table (360 contest x score-level pairs, zero
mismatches). `sieval/community/liveoibench/` is untouched by this commit.
* **`status` is `experimental`, not `stable`.** In-tree the word means one
thing -- faithful port, published anchor unverified or unreachable -- and this
is that: no model has been run, the paper's table is over 403 problems where
this scores 380, and upstream publishes no model outputs (no
`submission_results/`, no results CSV, no solutions repo) to anchor the grader
against instead, so the quotebench route of anchoring at zero model cost is
not available either. `agieval` is the precedent in the other direction: a
full 7,272-row run and still `experimental`, because a clean run is not an
anchor. The reason now ships in `reference_impl.notes` rather than living only
in the PR description, which is not published.
* **A failed sample no longer enters the human comparison.** It was placed in
its contest at score 0 under its real task name, which matched that problem's
human column -- so the model's total lost the points *and* the human totals
gained a column for a problem that was never graded. Upstream re-totals the
humans over exactly the tasks the model was *scored* on and never writes a
problem result for a failure. Failed samples still count at zero in
`relative_score` and `pass_rate`, where the denominator is every requested
sample. A contest whose problems all failed now reports no percentile instead
of a percentile of zero.
* **An empty rollout list is refused by name.** `next(r for r in rollouts ...)`
over no rollouts raised `StopIteration` out of a coroutine, which Python
re-raises as a bare "coroutine raised StopIteration" naming neither the sample
nor the cause -- the same failure shape the evaluator's own empty-suite guard
was added to avoid, one layer up.
* **A task-name collision inside one contest is announced.** Keying the model's
scores by task name is what matches a human column; two problems sharing a
name would collapse into one entry and quietly drop the other from both the
model total and the matched columns. No published contest does this (0 of 72),
so it says so rather than scoring a smaller contest.
* **A NULL `subtasks` cell stays absent** instead of being coerced to `"{}"`,
which passed the loader's own broken-join check and only surfaced per sample
at grading time. The "no test parquet found" guard now tracks whether a file
was read rather than whether any rubric was: those are two different failures
and the second was reporting the first's message.
* `LiveOIBenchDatasetSample` declares the three columns it passes through but
never reads (`id`, `setup_script`, `evaluation_script`); `VENDORED.md` states
the trust boundary `test_dir` assumes, and why the two CPU fields are 0.0 on
this source rather than missing.
Verified: 7,417 unit tests pass (5 new), each fix reverse-mutated at its own
site and all 5 mutants caught. ruff, ty and preflight (25/25, no warnings) all
clean. Lock re-resolved with `--update-reuse`; the only change is the content
hash.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
ethan-scitix
force-pushed
the
liveoibench
branch
from
September 11, 2026 11:20
0f97e8c to
97ae210
Compare
The review pass left its own argument in the code. Facts stay, the arguing goes — it belongs in the commit messages that made the change, not in a docstring a future reader has to walk past. `reference_impl.notes` loses the `experimental` case-making (which upstream directories are absent, how quotebench anchored instead) and keeps the two things that decide anything: no published number has been reproduced, and 380-vs-403 is why the paper's table is not the anchor. The `status` comment drops its agieval citation, `_cutoff` and `_human_metrics` lose a restated clause each, and the NULL-rubric, task-name-collision, empty-rollout and `test_dir` notes each say once what they had been saying twice. Nothing load-bearing is dropped: the scope caveat, every divergence from upstream, and the measured counts a future reader would re-verify against are all still there. 41 lines in, 65 out. Verified: 88 LiveOIBench tests and the full 7417 still pass, ruff, ty and preflight (25/25) clean, `meta/index.json` regenerated for the notes edit. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
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.
Type
Summary
7759e3b8, Apache-2.0.code-evaluator, which ran Python/JS/TS only. LiveOIBench is C++-first (the paper measures C++ and reports Python ~9 points lower on a USACO subset), sovendor/code-evaluatorgainssource="liveoibench":g++compile, then one child per test case underRLIMIT_CPU/RLIMIT_ASat the problem's own limits with upstream's explicit 20% buffer, plus its CPU poller and its output comparison.task_type != "batch", so the 23 interactive problems (needing an interactor process the evaluator does not run) are excluded rather than scored zero, which would understate every model invisibly. The 5 script-judged problems runevaluate.shshipped as data — the pathsieval/tasks/CLAUDE.mdforbids — and are all interactive, so the same filter covers them. These numbers are therefore not comparable to the paper's 403-problem table, whichreport.json'sn_problemsand the task'sreference_impl.notesboth say.checkers/directory, so upstream's own judge compares outputs directly on this data and the 36min-scoresubtasks (of 3700) collapse onto the all-or-nothing rule. The branch is still ported, so a release that does ship checkers is not silently mis-scored.scripts/materialize_liveoibench_tests.pyunpacks it once into upstream's own{competition}/{year}/{round}/{task}/testslayout (an existing$LIVEOIBENCH_ROOT/datatree is reusable viatests_root=), and the loader refuses to run until it has, naming the command. The evaluator then reads test directories off disk — inlining would move the whole corpus over HTTP once per rollout (~140 MB per problem).n=1and reproduces best-of-n at whatevernit is given.Review fixes (commits 2–3)
A review of the first commit found four divergences in the human-ranking and
aggregation half — the part that produces the numbers a paper is compared
against. Two of them were documented as not existing. All are fixed here, with
counts measured against the pinned dataset revisions.
{competition}-{year}-{round}; the published table keys USACO by division (USACO-2023-December_Contest-platinum/-combined). Of the 61 contest ids the 380 batch problems derive, 11 were absent from the 72-row table — 132 problems, 35% of the scored set, silently dropped fromhuman_percentile/medal_rate/gold_ratebehind a count-only warning. Upstream's routing is ported instead:build_problem_to_contest_mapreads the authoritative mapping out of each contestant row's ownproblemscolumn (the only place the split is stated), andresolve_contest_idwalks upstream's fallback ladder, CCO rename included. All 380 now join.Recalculated_Totalis in the published data. The module claimed no contest carried it; 10 of 72 do, and upstream prefers it over the per-task sum wherever it exists. The two differ for 20–83% of contestants on each, and the resulting percentile differs on four contests — at a model total of a quarter of the maximum, CEOI-2023 read 75.0 where upstream reads 37.5. Ported, dropping unparseable rows as upstream's.dropna()does rather than zeroing them, along with the Canadian Computing Olympiad rank re-derivation nested inside it.relative_scorewas problem-weighted, where upstream means inside a contest and then across contests. Measured over the 380 scored problems: 72 contests sized 1–10, the largest being JOI-2023-JOI_spring at 10, then eleven USACO rounds at 9 each — so the two are not interchangeable. This is the task'sscore_key.pass_ratemeant the opposite of upstream's. What was reported aspass_rateis upstream'stests_passed_pct(fraction of test cases); what was reported asace_rateis upstream'spass_rate(fraction of problems fully solved). Both now carry upstream's names, soreport.jsonreads against{model}_contest.jsonwithout a translation table.Two contests-with-no-contestants paths came out of the same pass: a contest
publishing cutoffs and an empty ranking still earns its medal (upstream's
df.emptybranch — every USACO row in the release is that shape), while aUSACO
-combinedcontest reports neither, because upstream scores it frompromotion thresholds that live in its repository rather than in the dataset. NaN
cutoff cells now read as "no cutoff" instead of as a cutoff nothing can clear.
Robustness, from the same review:
RuntimeError: coroutine raised StopIterationon a suite with no test case — it looked for a first failure among no results. It now refuses the suite by name, and the task turns an empty verdict vector into aNonRetriableSampleErrornaming the directory instead of scoring every subtask at zero.require_testsguard read as complete. Cases now land in a siblingtests.partialand are renamed over the target in one step.pool=Nonedecouples them.pyarrowis declared: imported directly by the dataset, it only reached the environment as a transitive ofdatasets. Re-locked with--update-reuse; the only change is the content hash.docker/Dockerfile.cppremoved.Dockerfile.multipl-e(which landed on main meanwhile) is byte-identical apart from its extra toolchains, and itsapt-get install g++already covers the-staticlink. Measured in the real base rather than assumed: on the currentpython:3.10-slim(Debian 13.6)g++alone bringslibc6-dev 2.41+libstdc++-14-dev, both static archives resolve, and the judge's exact command line builds and runs abits/stdc++.hprogram. The deleted file had also drifted — it pinnedlibstdc++-12-devwhile the base moved to gcc 14.Review fixes (commits 4–5)
Rebased onto
a0ba68de(Ag-LiveCodeBench-X, #123), which touched the same twovendored files. Both conflicts were "both added" — a new
elif sample.sourcearm and new optional fields on the flat response model — and both arms are kept
whole.
sieval/community/liveoibench/is untouched by this commit, so theport's arithmetic is unchanged.
statusis nowexperimental, notstable. In-tree the word means one thing — faithful port, published anchor unverified or unreachable — and that is exactly this task: no model has been run; the paper's table is over 403 problems where this scores 380; and upstream publishes no model outputs (nosubmission_results/, no results CSV, no solutions repo), so the QuoteBench route of anchoring the grader at zero model cost is not available either.agievalis the precedent in the other direction — a full 7,272-row run, stillexperimental, because a clean run is not an anchor. The reasoning now ships inreference_impl.notesinstead of living only here, since a PR description is not published.relative_scoreandpass_rate, where the denominator is every requested sample; a contest whose problems all failed now reports no percentile rather than a percentile of zero.next(r for r in rollouts ...)over no rollouts raisedStopIterationout of a coroutine — re-raised by Python as a bare "coroutine raised StopIteration" naming neither the sample nor the cause. The same failure shape the evaluator's empty-suite guard exists to avoid, one layer up.subtaskscell stays absent instead of being coerced to"{}", which passed the loader's own broken-join check and only surfaced per sample at grading time. The "no test parquet found" guard now tracks whether a file was read rather than whether any rubric was — two different failures, the second reporting the first's message.LiveOIBenchDatasetSampledeclares the three columns it passes through but never reads (id,setup_script,evaluation_script).VENDORED.mdstates the trust boundarytest_dirassumes (a client-named host path, so: in-cluster callers, mounted corpus, service not exposed — otherwise run withinline_tests=True), andserver.pyrecords why the two CPU fields are0.0on this source rather than missing.Commit 5 then trims the prose those two review passes accumulated — 41 lines in,
65 out. The arguing came out (which upstream directories are absent, how
QuoteBench anchored instead, an
agievalcitation); the scope caveat, everydivergence from upstream, and the measured counts a reader would re-verify
against all stayed.
Related Issues
None.
Test Plan
Automated
ruff check && ruff format --check)ty check) — must be run without explicit paths; an explicit path overrides thesieval/community+vendorexcludes and surfaces upstream's ownresponse: any, which is kept byte-identical on purpose.python scripts/check_preflight.py— 25/25 pass, zero warnings.scripts/sync_meta_index.pyandscripts/sync_package_stubs.py --checkboth clean (the PostToolUse hooks do not fire on a rebase).DIRTYbefore the rebase, so GitHub executed no checks at all on the previous head.Manual
g++14.2, asserting the verdict vector for each shape that decides a score: all-correct, partial ([True, True, False]), TLE (killed at the buffered CPU limit), MLE, compile error (all-False, not a skipped rollout), single-number float tolerance at1e-6, a grader-linked submission (grader.cpp+{task}.hcompiled with the solution), and a suite with zero cases. Directory mode and inline mode produce identical verdicts; a.inwith no.outis a loud error.score_contestvsgenerate_rankings.compute_human_metricsacross 360 (contest × score-level) pairs: zero mismatches in percentile or medal, andbuild_problem_to_contest_mapreturns an identical 403-entry map.g++over HTTP → subtask scores → report. A fully-solvable problem scored 100/100; a problem with one unreachable subtask scored 40/100 with subtask 2 at zero; best-of-n picked the 100-point rollout over a 40-point one.7759e3b8:code_extractor.pyis byte-identical below its provenance header (diff is 0 lines);interprete_task_resultandtotal_pointsmatch line for line;prompts.pymatchesprocess_dataset._write_promptexactly, guard and float rendering included.Recalculated_Totalon exactly 10 of 72, 22 USACO rows with cutoffs but empty rankings, 17/403 satisfying the prompt's grader block, 41 shipping a grader bundle, all 5 script-judged problems interactive, andcc-by-4.0on all three HF repos.No model has been run, so there is no score-comparison table and the task
ships with no alignment card. That is what
status="experimental"records, andit is the ship state this PR is asking for rather than an outstanding item.
Running it
Not merge blockers — this is what a first real run needs:
vendor/code-evaluator/docker/Dockerfile.multipl-eand deploy it (the base image has no toolchain, and every submission fails identically without one).sieval dataset download liveoibench(33.5 GB) thenpython scripts/materialize_liveoibench_tests.py.examples/liveoibench.yamlatn=8against a model the paper reports. Expect the 380-vs-403 problem-set difference to show up as a gap even on a faithful port — say which set was run next to any number.human_percentilecovers only the contests that publish a contestant list, which excludes all of USACO;n_contests_rankedandn_contests_medalledinreport.jsonsay how many each metric was computed over.An aligned run at
n=8is also what promotes the task tostable.Checklist
Required (all PRs)
type(scope): description)Ethan <[email protected]>, one correctly-formedCo-Authored-Bytrailer)AI-Generated Code - <model> (<provider>)in module docstringcore/docker/Dockerfile.cppis the only deletion; every reference to it (VENDORED.md,examples/liveoibench.yaml) was updated in the same commit, andDockerfile.multipl-e's toolchain comment now records its second consumer so a later edit cannot drop g++ on the grounds that MultiPL-E is the only caller.If: New or Modified Benchmark
experimentalport: no model has been run, which is exactly what that status means here and matches every other unanchored port in the tree.hf:sources are revision-pinned and resolve (check_datasetspasses; all three repos confirmed ungated,cc-by-4.0, SHAs read off the HF API). The 33.5 GB download itself was not run; the loader was exercised end-to-end against locally written parquet files of the published schema, and the problem/contestant parquets (920 KB / 559 KB) were downloaded at their pinned revisions to verify the joins and counts quoted above.__init__.py(lazy export;get_task_class("liveoibench_0shot_gen")resolves, asserted in tests)If: community/ Changes
code_extractor.pyis byte-identical below its provenance header.prompts.py/scoring.py/rankings.pyare adaptations: upstream reads a reconstructed problem directory and a pandas DataFrame, these read the parquet fields and the JSON rows those were written from; the arithmetic and the assembled strings are unchanged, including the limits rendering as the floats the parquet carries (2048.0, not2048). Upstream's misspelledinterprete_task_resultis kept so the two can be diffed.rankings.pyalso portsnormalize_contest_identifier,build_problem_to_contest_mapand the contest-routing block ofgroup_problems_by_contest.Vendored evaluator (
vendor/code-evaluator)Patch documented in
VENDORED.md, to be landed inscitix/code-evaluatorand re-vendored. Four choices worth a reviewer's attention:timeout, default 60 s) where upstream'ssubprocess.runhas none — a submission whose template expansion never terminates would otherwise wedge the judge.StopIterationout of a coroutine.case_verdicts+case_namesare returned so the client maps verdicts onto subtasks by the names the server used. The alternative — the client re-deriving the directory ordering — is a second copy of a rule that agrees until one side changes.exec_cpp.pyis not the same C++ path as thecpprow inexec_lang.LANGUAGES, and the two are not merge candidates: that one is direct-run (one program, one all-or-nothing verdict), this one compiles against the problem's own grader and runs one child per official test case under that problem's limits, returning the whole verdict vector — the only shape IOI subtask scoring can be computed from. They share no code and are reached by differentsourcevalues. The test model is still namedLiveCodeBenchTestthough two sources now share it; renaming would widen the diff against upstream without changing the wire format.🤖 Generated with Claude Code