Skip to content

Commit 6ad5aac

Browse files
committed
fix: isolate repeatability grader evidence
1 parent 0d461e5 commit 6ad5aac

2 files changed

Lines changed: 50 additions & 10 deletions

File tree

‎src/openenv/validation/graders/runtime/repeatability.py‎

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,12 @@ def run(self, subject):
110110
def check(self, subject, evidence):
111111
problems = []
112112
original_seed = None
113-
for index, sample in enumerate(
114-
[evidence] + [replay.evidence for replay in evidence.replays]
115-
):
113+
samples = [(0, evidence)] + [
114+
(index, replay.evidence)
115+
for index, replay in enumerate(evidence.replays, 1)
116+
if replay.scope == "seed"
117+
]
118+
for index, sample in samples:
116119
if sample.failure_reason or sample.telemetry_error:
117120
problems.append(f"replay {index}: reset or telemetry collection failed")
118121
continue
@@ -129,7 +132,7 @@ def check(self, subject, evidence):
129132
continue
130133
if index == 0:
131134
original_seed = seed
132-
elif evidence.replays[index - 1].scope == "seed" and seed == original_seed:
135+
elif seed == original_seed:
133136
problems.append(f"replay {index}: scheduled seed was not changed")
134137
observed = _telemetry(sample).get("seed")
135138
if (
@@ -213,11 +216,13 @@ def _grade(self, subject, evidence):
213216
}
214217
for index, sample in enumerate(samples):
215218
if sample.failure_reason:
216-
return (
217-
CheckStatus.FAIL,
218-
[f"replay {index}: collection failed"],
219-
measured,
220-
)
219+
if index == 0:
220+
return (
221+
CheckStatus.FAIL,
222+
[f"replay {index}: collection failed"],
223+
measured,
224+
)
225+
continue
221226
if not any(row.operation == "step" for row in sample.exchanges):
222227
return (
223228
CheckStatus.SKIP,
@@ -229,7 +234,9 @@ def _grade(self, subject, evidence):
229234
)
230235
judged = subject.manifest.capabilities.llm_judged
231236
required = JUDGED_REPLAYS if judged else 3
232-
if len(samples) < required or {row.scope for row in replays} != {
237+
if measured["completed_replays"] < required or {
238+
row.scope for row in replays
239+
} != {
233240
"session",
234241
"container",
235242
}:

‎tests/test_validation/test_runtime_repeatability.py‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,20 @@ def test_different_seed_schedule_is_required_but_output_need_not_differ(tmp_path
124124
)
125125

126126

127+
def test_seed_control_ignores_unrelated_replay_failure(tmp_path):
128+
subject = subject_with_replays(tmp_path)
129+
replays = list(subject.runtime_evidence.replays)
130+
replays[0] = replace(
131+
replays[0],
132+
evidence=replace(
133+
replays[0].evidence, failure_reason="step failed (TimeoutError)"
134+
),
135+
)
136+
evidence = replace(subject.runtime_evidence, replays=tuple(replays))
137+
result = SeedControlGrader().run(replace(subject, runtime_evidence=evidence))
138+
assert result.status is CheckStatus.PASS
139+
140+
127141
@pytest.mark.parametrize(
128142
"field,value", [("trajectory", None), ("schema_version", True)]
129143
)
@@ -201,6 +215,25 @@ def test_partial_judged_sample_is_incomplete(tmp_path):
201215
assert result.measured["completed_replays"] == 19
202216

203217

218+
def test_failed_replay_is_incomplete(tmp_path):
219+
subject = subject_with_replays(tmp_path)
220+
replays = list(subject.runtime_evidence.replays)
221+
replays[1] = replace(
222+
replays[1],
223+
evidence=replace(
224+
replays[1].evidence, failure_reason="step failed (TimeoutError)"
225+
),
226+
)
227+
evidence = replace(
228+
subject.runtime_evidence,
229+
replays=tuple(replays),
230+
replay_failure_reason="fresh container replay failed (RuntimeError)",
231+
)
232+
result = EpisodeDeterminismGrader().run(replace(subject, runtime_evidence=evidence))
233+
assert result.status is CheckStatus.SKIP
234+
assert result.measured["completed_replays"] == 2
235+
236+
204237
@pytest.mark.parametrize(
205238
"low,bound,status", [(0.5, 0.1, CheckStatus.PASS), (0.0, 0.2, CheckStatus.FAIL)]
206239
)

0 commit comments

Comments
 (0)