Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
e785d9c
feat(v1): configurable agentic-judge grading policy, uploads, and rew…
mikasenghaas Jul 22, 2026
a0e106e
review: JudgeTaskConfig/ScoreConfig nesting, single prompt field, tra…
mikasenghaas Jul 23, 2026
6b5857d
feat(v1): shared-runtime agentic judge (on by default)
mikasenghaas Jul 23, 2026
10ed266
feat(v1): rubric-graded agentic judge; trace record is the only upload
mikasenghaas Jul 23, 2026
29c7333
feat(v1): seat replay — pin any env agent to a finished run's traces
mikasenghaas Jul 23, 2026
9a330c7
Revert "feat(v1): seat replay — pin any env agent to a finished run's…
mikasenghaas Jul 23, 2026
f73ae6c
Merge origin/main (runtime moved onto the agent, #2106)
mikasenghaas Jul 23, 2026
48c44c6
review: shared box only, full trace uploaded, terse module docstring
mikasenghaas Jul 23, 2026
7e3b7a2
chore: strip comments from the agentic-judge example config
mikasenghaas Jul 23, 2026
a0d1101
review: hardcode the trace upload path, grade_prompt -> build_prompt,…
mikasenghaas Jul 23, 2026
0f42abf
review: JudgeTask.files is public
mikasenghaas Jul 23, 2026
717c055
review: JudgeTask.from_trace takes the JudgeTaskConfig, not the env c…
mikasenghaas Jul 23, 2026
bf32c19
style: format
mikasenghaas Jul 23, 2026
ed4160e
review: from_trace needs only the trace — the solved task rides on it
mikasenghaas Jul 23, 2026
6b5ebe3
docs: module docstring matches the fixed trace path
mikasenghaas Jul 23, 2026
dfc23b2
fix: remove pre-existing files at upload paths before seeding the jud…
mikasenghaas Jul 23, 2026
ca25ca9
fix: duplicate criterion entries in the verdict fail instead of last-…
mikasenghaas Jul 23, 2026
63132a8
fix: align the judge's runtime config with the solver's
mikasenghaas Jul 23, 2026
68e2a63
feat: hint section for the judge prompt; workspace note warns the rec…
mikasenghaas Jul 23, 2026
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
19 changes: 4 additions & 15 deletions configs/agentic_judge.toml
Original file line number Diff line number Diff line change
@@ -1,14 +1,3 @@
# Any taskset graded by the bundled agentic judge — the multi-agent TOML shape:
# `env.id` pairs a reusable env with the taskset, and each agent is its own
# [env.<agent>] block (a partial override deep-merges into the agent's declared
# default; there is no run-level harness). The judge pins what makes it a
# different actor: a container runtime — it verifies the solver's attempt with
# real execution, never on the host — and, here, its own model off the run's.
#
# uv run eval @ configs/agentic_judge.toml --model <model>
#
# The judge writes {"score": 0-10, ...} to /tmp/verdict.json in its box; the env
# validates it strictly and records it on the solver's trace as the `judge` reward.
num_tasks = 2

[env]
Expand All @@ -18,10 +7,10 @@ id = "agentic-judge"
id = "gsm8k-v1"

[env.solver.harness]
id = "null"
id = "bash"

[env.solver.runtime]
type = "docker"

Comment thread
macroscopeapp[bot] marked this conversation as resolved.
[env.judge]
model = "z-ai/glm-5.2"

[env.judge.runtime]
type = "docker"
27 changes: 18 additions & 9 deletions tests/v1/test_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -392,23 +392,32 @@ async def test_env_id_best_of_n(run_v1, tmp_path):

@pytest.mark.e2e
async def test_env_id_agentic_judge(run_v1, tmp_path):
"""The agentic judge over the echo taskset (needs docker): the judge lands in
its own box with the graded transcript uploaded, investigates with real
execution, and its parsed verdict lands on the solver's trace under the spec's
reward key. Wiring, not taste: the judge followed the verdict-file contract's
output contract — the grade itself is the model's call."""
"""The agentic judge over the echo taskset (needs docker): the box is
provisioned once from the solver's runtime policy, the solver plays in it,
the judge lands in the SAME box with the graded trace uploaded,
investigates with real execution, and its parsed verdict
lands on the solver's trace under the spec's reward key. Wiring, not taste:
the judge followed the verdict-file contract — the grade itself is the
model's call. Exercises the config surface too: a policy-only prompt
override (the verdict contract is appended regardless) and
reward-composition weights."""
traces = await run_v1(
"echo-v1",
harness=None, # seats pin their own harness; there is no run-level one
env={
"id": "agentic-judge",
"solver": {"harness": {"id": "null"}},
# The judge reads the transcript and reasons before it writes the
# The solver owns the shared box, so the container is pinned here.
"solver": {"harness": {"id": "bash"}, "runtime": {"type": "docker"}},
# The judge reads the trace and reasons before it writes the
# verdict file; the shared 2048-token run cap truncates it mid-audit.
"judge": {
"runtime": {"type": "docker"},
"harness": {"id": "bash"},
"max_output_tokens": 8192,
},
"task": {
"prompt": "Check EMPIRICALLY that the agent echoed the word back.",
},
"score": {"task_weight": 0.5},
},
output_dir=tmp_path,
max_turns=10,
Expand All @@ -419,7 +428,7 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
(judge,) = [t for t in traces if t.agent_name == "judge"]
assert solver.ok and judge.ok
assert judge.trainable is False
assert solver.rewards["echoed"] == 1.0 # the task's own reward still runs
assert solver.rewards["echoed"] == 0.5 # the task's own reward, rescaled
assert isinstance(judge.info.get("verdict"), dict) # scraped off the box
assert 0.0 <= solver.rewards["judge"] <= 1.0

Expand Down
16 changes: 14 additions & 2 deletions verifiers/v1/envs/agentic_judge/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
from verifiers.v1.envs.agentic_judge.env import AgenticJudgeEnv, AgenticJudgeEnvConfig
from verifiers.v1.envs.agentic_judge.env import (
AgenticJudgeEnv,
AgenticJudgeEnvConfig,
Criterion,
JudgeTaskConfig,
ScoreConfig,
)

__all__ = ["AgenticJudgeEnv", "AgenticJudgeEnvConfig"]
__all__ = [
"AgenticJudgeEnv",
"AgenticJudgeEnvConfig",
"Criterion",
"JudgeTaskConfig",
"ScoreConfig",
]
Loading
Loading