* fix(validator): keep inference transcripts serializable
Inference transcripts are built from sandbox output, which the validator
does not trust. A non-finite float there (written by the sandbox as
Infinity or NaN) made the episode artifact fail to serialize, and one
unreadable line (an over-long integer, deep nesting, invalid UTF-8 or a
mistyped field) made transcript loading fail for every episode in the run.
- Map non-finite floats in transcripts to null.
- Skip only the output line that cannot be read or sanitized.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(validator): report runs whose completion cannot be recorded as failed
- When Backend rejects a SUCCESS report with a non-transient error, report
the run FAILED ("Completion rejected by Backend (HTTP <status>)") instead
of leaving it to expire. The detail stays in the validator log.
- When a failure report cannot be sent because its sandbox metadata does
not serialize (e.g. usage counters that sum to inf), send it once
without the metadata.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(validator): report a queued success that Backend refuses as failed
A SUCCESS report that first hit a transient error was retried from the
local queue, where a later non-transient refusal was dropped, leaving the
run to expire. Report it FAILED there too, as _complete_run does. Only an
HTTP refusal is reported: an unparsed response may mean the completion
landed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>