programbench_env
Agentic program reconstruction from an opaque reference binary. The agent writes source and a compile script, which is compiled and run against the official hidden pytest branches in a sandbox; reward is the fraction of non-ignored tests that pass, with anti-cheat rejecting binary-wrap submissions.
Taskset
- Source: Official ProgramBench task/test metadata (the
programbenchPyPI package), with README/binary blobs from the gated PrimeIntellect/programbench-processed dataset - Size: 200 tasks across C/C++/Go/Rust/Haskell/Java
Notes
- Requires a container runtime and an
HF_TOKENwith access to the gatedPrimeIntellect/programbench-processeddataset. Each task uses its canonical publicprogrambench/<instance>:task_cleanroomimage; override it with--env.taskset.image. - No ProgramBench tasks, binaries, or test archives are vendored: task/test metadata comes from the
programbenchPyPI package, binary blobs from the HF dataset, and hidden test archives from the official ProgramBench test dataset — all downloaded on demand. The bundled PyPI fixturetestorg__calculatoris excluded so the default taskset is exactly the 200-task benchmark.
Security
The reference binary is staged root-owned and non-readable: /workspace/binary is a client for a root-owned unix-socket daemon that runs the real binary and proxies stdin/stdout/stderr/exit code — runnable, not readable. Reference invocations are capped at 10 seconds so interactive or non-terminating binaries cannot stall a rollout. Scoring also rejects any submission whose compiled executable is byte-identical (sha256) to the reference binary.
Changelog
- 2026-08-31: Validate the complete default 200-task metadata join before yielding task records on demand.
- 2026-08-27: Use each task's canonical ProgramBench cleanroom image instead of the nonexistent shared toolchain image, install its missing scoring plugins, download test blobs through ProgramBench's instance snapshot, and cap reference probes at 10 seconds.
- 2026-07-10: Ported to the task-centric verifiers API: rewards and lifecycle hooks live on the
Task(aTaskDatarow + behavior split), and task-facing config knobs (judges, tool/user placement, scoring parameters) moved from--env.taskset.*to--env.taskset.task.*. Requiresverifiers>=0.2.0and Python>=3.11. The bundled multi-mode agent harness, non-root agent user, and DNS network-lockdown of the v0 environment are dropped in favour of the built-in v1 harnesses (select with--env.agent.harness.id); the daemon proxy and sha256 binary-wrap rejection anti-cheat are preserved.