Scoring recovery: results
Run on 2026-10-28 with inspect-ai 0.3.283 and the mock model. The raw outcomes are in e1.json, e2.json and e3.json. An earlier, uncommitted run on 0.3.285 gave the same outcomes.
E3: score() on samples whose scorer raised
score() is the Python function behind inspect score. Four samples, and the judge raises on samples 2 and 3 (fail_on_error=False).
| Step | Accuracy | Scored samples | Samples 2 and 3 |
|---|---|---|---|
| eval | 1.0 | 2 | errored, no score |
score(..., action="overwrite") with a working judge |
1.0 | 4 | scored C, still errored |
| the same, with the judge failing on sample 2 | n/a | n/a | score() raised RuntimeError, nothing returned |
E2: re-judging only grader_failed samples
Six samples. The judge logs the answer as metadata["evidence"], then fails on samples 2, 3 and 5 with Score.unscored(reason="grader_failed"). Samples 3 and 5 hold the only wrong answers, so the outage hides both of them by construction. True accuracy is 4 of 6, 0.667.
| Step | Accuracy | Stderr | Scored | Unscored |
|---|---|---|---|---|
| eval, during the outage | 1.000 | 0.000 | 3 | 3 |
| after re-judging samples 2, 3 and 5 from the logged evidence | 0.667 | 0.211 | 6 | 0 |
Sample 2’s Score.history after a write and a re-read:
| Entry | Value | Reason | Author |
|---|---|---|---|
| original | nan |
grader_failed |
none |
| edit | C |
UNCHANGED |
scoring-recovery |
The edit set reason=None, and the current score’s reason reads None, but the history entry shows UNCHANGED. ScoreEdit(reason=None).model_dump(exclude_none=True) drops reason, and it reloads with its default, "UNCHANGED". The evidence in metadata survived the edit.
E1: checkpoint resume for scoring, Docker sandbox
A react() agent writes ~/answer.txt (42) and starts a web server on port 8000. The scorer reads the file, probes the server and raises on its first call. Checkpointing uses TurnInterval(every=1) and retention="retain". In every first attempt, the checkpoint files have triggers turn and agent_complete.
| Run | How the sample was retried | Resume recorded | New model calls | Replayed model calls | Scorer’s second call saw | Outcome |
|---|---|---|---|---|---|---|
| A | in-run retry_on_error=1 |
none | 2 | 0 | file 42, server up, new container |
C |
| B | eval_retry(log) |
none | 1 | 0 | no second call | ValueError |
| C | eval_retry(log, checkpoint=same_config) |
resume_for_scoring |
0 | 2 | file 42, server down, new container |
C |
- A. The retry re-ran the agent, which wrote the file and started the server again. Both of the retry’s checkpoint writes failed with
EgressVerificationError: sandbox egress ckpt-00003 -> ... is only accepted while the destination repo is uninitialized. The retry wrote to the same restic repository as the first attempt. - B. The retry re-ran the agent. Its first model call failed with
ValueError("output must be an instance of ModelOutput; got <class 'dict'> ..."): the mock model was rebuilt from the log, but its scripted outputs came back as dicts. - C. The sample resumed with an info event
{"event": "resume", "attempt": "resume_for_scoring"}. The two model calls in its log are the first attempt’s, replayed inside aprior_runspan. - D.
score(c1_log, sandbox_judge())on run C’s first, errored log, with the scorer that reads the sandbox, raisedProcessLookupError: No sandbox environment has been provided for the current sample or task. Re-scoring from a log has no sandbox.