Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions docs/source/reference/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,11 @@ supports that capability. Docker validation uses two containers concurrently
during the fresh-container replay. Both use the same immutable image and are
removed even if a check fails.

The runtime level implements startup, reward, observation, state, network policy,
seed forwarding, determinism and emitted trajectory record checks. Other applicable
Level 2 checks appear as `SKIP`; they make
The 12 implemented runtime checks cover startup, rewards, observation schemas,
state continuity, network policy, seed forwarding, determinism, emitted trajectory
records, tool and task discovery, rubric introspection and reward attribution.
Four checks remain unimplemented: host containment, resource bounds, episode
isolation and oracle containment. Applicable unimplemented checks appear as `SKIP`; they make
the result `WARN`, which exits zero and does not mean Level 2 is complete.
`FAIL` exits 1, unsupported package formats exit 2, and internal or policy errors
exit 3. `--level semantic`
Expand All @@ -68,7 +70,9 @@ the subject's namespace and from a control container; a probe counts only when
the control reaches the sink, and a denial that is not proven is a `SKIP`.
`--local` explicitly selects this default package mode and rejects a remote URL.
Explicitly unsupported session telemetry yields a `SKIP` naming `session_telemetry`;
authorization refusals and malformed telemetry remain failures. Seed control
authorization refusals and malformed telemetry remain failures. Explicitly unsupported
`tools/list` similarly skips with `tool_discovery` named. Internal discovery errors
and malformed responses remain failures, even for an empty declared tool set. Seed control
reports observed forwarding to reset, separately from empirical determinism.
The declared `episode_timeout_s` bounds each episode; a reset or judged step may use
its remaining budget. Original and replay collection share a 300-second deadline
Expand Down
26 changes: 26 additions & 0 deletions rfcs/008-environment-auto-validation.md
Original file line number Diff line number Diff line change
Expand Up @@ -660,6 +660,11 @@ evaluation flags. Unevaluated gated children never reuse an earlier score.
Stock container aggregation is named explicitly; custom rubrics may supply
`validation_config()` to expose public JSON configuration. Arbitrary attributes
and `state_dict()` are never serialized as configuration.
Attribution compares each numeric step reward with its freshly evaluated root
score. Null non-terminal rewards have no emitted score to compare; their records
must still have the correct identity, unchanged configuration, and valid evaluated
aggregation. An entirely unscored episode is incomplete rather than passing
attribution. Terminal null rewards remain invalid.

The subject server also emits a bounded record of the reset/step/state request
and response envelopes it executed. The validator captures the wire separately
Expand All @@ -668,6 +673,27 @@ limited to 100 steps/202 operations and 8 MiB, and marks truncation explicitly.
Missing configuration, attribution or records cannot be inferred from other
successful operations. This transport introduces no new passing grader by itself.

#### Declaration and rubric evidence (PR6)

The validator discovers MCP tools over the authenticated replay connection before
reset and compares their names with the declaration, including an explicitly empty
set. Task discovery queries split names and authoritative per-split counts, then
reads at most two individual tasks per split. Preview length is never treated as
the dataset size. Requests share the collection deadline and bounded response
budgets; unavailable or malformed discovery cannot become an empty passing set.
The task namespace comes from the server's single `/list_environments` entry,
independently of the package name. Omitted tool/count declarations stay unknown;
explicit `[]`/`{}` declarations assert zero tools/splits. A declared task API
without declared counts leaves count accuracy incomplete.

Rubric checks require the declared tree and explicit public configuration, then
compare every observed step reward with its fresh root score and named child
attribution. Built-in weighted, sequential and gated aggregation is checked using
its published configuration. Unknown custom aggregation remains incomplete.
Optional task and rubric checks are selected only when declared. `discovery.json`
retains raw discovery results, availability and sanitized errors alongside session
telemetry; ordinary discovery responses never enter the episode trajectory.

Applicability predicates must distinguish empty declared sets from absent
capabilities. Missing subject features, missing provider support and checks whose
implementation has not shipped are distinct outcomes. Independent graders must
Expand Down
2 changes: 1 addition & 1 deletion src/openenv/core/env_server/http_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -1258,7 +1258,7 @@ async def call_mcp_style_step(action: Action) -> Observation:
request_id=request_id,
)
return JsonRpcResponse.error_response(
JsonRpcErrorCode.INTERNAL_ERROR,
JsonRpcErrorCode.METHOD_NOT_FOUND,
"Environment does not support MCP",
request_id=request_id,
)
Expand Down
Loading
Loading