Scaling Agentic RL: 365,000 Environments for SWE, Terminal, and Search Prime Intellect has integrated 23 agentic tasksets into a unified API, providing approximately 365,000 tasks for software engineering, terminal, and search domains, ready for reinforcement learning training on its infrastructure. The tasksets include roughly 198,000 software engineering tasks across 20+ languages, 28,600 terminal tasks, and 137,600 search tasks, all normalized behind a single taskset API with standardized runtime and sandbox hooks. The company has also prebuilt around 135,000 open-source task images in its Prime image registry, which it claims is the largest such catalog hosted by any sandbox provider. Scaling Agentic RL: 365,000+ Environments for SWE, Terminal, and Search Scaling Agentic RL: 365,000+ Environments for SWE, Terminal, and Search The open research ecosystem has produced many great datasets for the three main agentic domains - software engineering, terminal use, and web research - but every one of them ships with its own harness, its own image conventions, its own grading scripts, and its own failure modes. 23 tasksets behind one taskset API We integrated them all. We ship first-party integrations for 23 agentic tasksets behind one taskset API, unified runtime/sandbox hooks, and one command: ~198,000 software engineering tasks across 20+ languages , ~28,600 terminal tasks , and ~137,600 search tasks - ~365,000 tasks in total, ready for evals and RL training on Prime Intellect infrastructure, with validated and cleaned dataset re-uploads where the originals needed fixing. uv pip install "git+https://github.com/PrimeIntellect-ai/research-environments.git subdirectory=environments/swe/scaleswe v1" Example running ScaleSWE in Codex harness on Prime Sandboxes: uv run eval scaleswe-v1 --harness.id codex --harness.runtime.type prime -n 3 What makes that single command possible is verifiers v1 https://www.primeintellect.ai/blog/verifiers-v1 , which decomposes an environment into three independent layers: a taskset, a harness, and a runtime. This post is the taskset piece of that story. One contract, three domains Each upstream taskset made reasonable choices for its own harness - and those choices don't compose. SWE-bench applies test patches inside a generated eval script; R2E-Gym bakes tests into the image and compares against expected outputs; search benchmarks each invent their own judge. If you want to train one agent across all of them, you need those lifecycles normalized without breaking each taskset's own scoring semantics. Our integrations keep every taskset's original grading path - upstream log parsers, upstream report generation, upstream test commands - and normalize everything around it: One API. Every taskset loads from a typed config dataset, split, filters , provisions a sandbox from the task's image, and scores with the taskset's own logic. Adding filter fn or swapping splits works the same everywhere. One image registry. Task images live in our own Prime image registry, co-located with the sandboxes - ~135,000 prebuilt open-source task images, to our knowledge the largest such catalog hosted by any sandbox provider. No flags, no namespace mapping, and no Docker Hub rate limits at rollout time - the ones you would otherwise hit immediately when running a thousand concurrent rollouts against Docker Hub. You can also pre-build and upload your own images prime images push or copy existing ones straight from Docker Hub prime images transfer-bulk . One integrity standard. During a rollout the agent lives inside the same sandbox as the grading machinery, so anything readable in the container is fair game for a reward hack. Every integration therefore withholds grading material - test patches, expected outputs, grading scripts - until scoring time. Some original authors chose to keep it visible: R2E-Gym ships its grading tests readable inside the image at /r2e tests , and Multi-SWE's containers carry the grading shell scripts and test.patch readable under /home . That is a fine choice for their attach-at-eval harnesses, but not for a live RL sandbox, so our integrations hide these artifacts and restore them only for scoring. One validation bar. Before a dataset earns a spot as default, we run gold-patch and no-op validation against it and re-upload cleaned versions with the exclusions preserved for transparency - the next section covers how. A common shape for a taskset is a data schema plus a handful of hooks: python import verifiers.v1 as vf class MyTaskData vf.TaskData : base commit: str state the sandbox resets to test patch: str grading material - withheld until scoring gold patch: str reference fix - used only by validate class MyTask vf.Task MyTaskData : async def setup self, runtime: vf.Runtime : ... prepare the repo inside the task's image async def finalize self, trace: vf.Trace, runtime: vf.Runtime : ... capture the agent's diff into the trace for posterity @vf.reward async def solved self, runtime: vf.Runtime - float: ... restore tests, apply test patch, run the upstream grading path async def apply gold patch self, runtime: vf.Runtime : ... apply the reference fix async def validate self, runtime: vf.Runtime - bool: ... gold patch must score 1.0; not calling validate must not class MyTaskset vf.Taskset MyTask, vf.TasksetConfig : def load self - list MyTask : ... dataset, split, filter fn - tasks pinned to images We constantly evaluate or train on these tasksets internally, which continuously validates their interplay with our sandbox infrastructure, and we update the datasets, images, and integrations on a regular basis. Validated re-uploads A taskset row is only useful if it can produce a clean reward signal: gold patch applied → tests pass; no patch → tests fail. A surprising fraction of open agentic task data fails this precondition - broken images, network-dependent tests, drifted expected outputs, and tasks solvable without touching the code at all. So we validated. For each dataset we ran the gold patch through the full scoring path in fresh sandboxes, retried failures up to 10× to separate flaky from deterministically broken, ran independent second passes to catch noisy rows, and ran multiple no-edit passes to drop tasks that score 1.0 without any fix. The results are re-uploaded in the SWE RL collection https://huggingface.co/collections/PrimeIntellect/swe-rl with the dropped rows persisted, so you can audit every exclusion: R2E-Gym-Subset-Verified : 4,522 of 4,578 rows pass 10×-retry gold validation; the 56 drops are mostly network/timing-sensitive aiohttp / tornado tests. SWE-Lego-Real-Data-Verified : 4,323 of 4,432 rows, same methodology. Multi-SWE-RL-Verified : 2,232 rows surviving two gold-patch passes plus a no-edit filter that caught tasks gradeable as solved with zero edits. SWE-rebench-V2-Filtered-Verified : 6,275 rows from 32,079 raw - language-level drops for wholesale-broken images, two independent gold passes with flaky rows removed, and problem statements scrubbed of inline GitHub issue/PR references. SWE-Bench-Verified-Quick : 468 of 500 Verified instances, dropping the slowest examples for quick online-evals. The tooling behind these passes ships with verifiers https://github.com/PrimeIntellect-ai/verifiers , so you can reproduce them yourself. uv run validate