<owner>/<name>@<version>. It is what an agent practises against. The platform stores it, decides
who may reference it, and serves it — it never writes what runs inside it.
Layout
tasks.jsonl
One JSON object per line:train | eval
default:"train"
Which half of the taskset this row belongs to. Declared per row.The platform sets which half a job sees from the operation itself, so a training job cannot be
handed the held-out tasks and an evaluation cannot ask for the training ones. An evaluation against
a split the environment never declared is refused rather than quietly served the training tasks —
that is the one failure this field exists to prevent, and it is the one that looks like a good
score.
manifest.json
string
required
Always
forge/environment/v1.nemo-gym | openenv | openenv-remote | openenv-image
required
How a trainer reaches this environment. See below.
object
required
{"kind": "rubric|plugin|endpoint", "ref": "..."} — what decides whether a task was completed.
See verifiers.array
What the agent may call: a name, an endpoint, and a JSON Schema for the arguments.
object
{"plugin": "<owner>/<name>", "version": "...", "entrypoint": "module:ClassName", "digest": "..."}.
Required for nemo-gym. The code belongs to a kind: environment plugin; the platform writes at
most a two-line shim that imports it.bool
default:"false"
True when the harness runs model-generated code. A job that needs one, on a deployment with no
sandbox provider configured, is refused — it does not fall back to running the code in the
training container.
string
default:"other"
NeMo Gym’s metrics-grouping category. Required and validated for
nemo-gym, meaningless elsewhere.
One of math, coding, agent, knowledge, instruction_following, long_context, safety,
games, translation, e2e, rlhf, other.string
The OCI image for an
openenv environment. Resolved as a pinned runtime artifact like every other
image; never pulled ad hoc.url
Required for
openenv-remote, and forbidden for everything else. Where the service already runs.The four protocols
Three of them are routes a job can actually take, and they differ in who runs the server.- openenv — the platform serves it
- nemo-gym — the framework runs it
- openenv-remote — somebody else runs it
- openenv-image — not runnable here
Turn-level. The platform runs the environment server from the taskset it holds, and the trainer
drives the episode itself through openenv-core’s client:
reset, step, state.Used by TRL, SkyRL, Unsloth and Axolotl. No harness needed — the trainer already owns the loop.The harness
The code that drives a model through an environment, supplied as akind: environment plugin.
Needed for the materialised route, where the framework imports and runs it. Not needed for the
served turn-level route, where the trainer drives the episode itself.
plugin.yaml
harness.digest in the manifest pins the harness package the environment was authored against.
Leave it empty when a team ships the harness alongside the environment; set it when the two are
versioned apart and a mismatched harness would score differently. It is verified at submission,
never at rollout.
Push and reference
<owner>/<name> or bare name
required
A bare name goes into your own namespace.
string
required
Immutable once pushed.
flag
Only applies when the environment is first created.
Confirm it worked
Next
Verifiers
The three ways a task’s completion is decided, and their exact contracts.
Rubrics
Write the standard a judge scores against.