Context
#2144 adds artifact collection/restoration for isolated grading and imports Harbor's artifacts and [[verifier.collect]] task fields.
The current implementation uses artifacts only as an in-process transport channel:
HarborTask.finalize() runs collect hooks and archives /logs/artifacts/ plus declared paths for every Harbor rollout.
- The tar bytes are stored in
trace.state.artifacts, which is excluded from trace serialization.
- Isolated
agentic-judge restores those bytes into the fresh judge sandbox.
- Single-agent and shared-judge runs still archive the files, but nothing consumes or persists the bytes.
Current code: Harbor collection, transient state, isolated restore.
Harbor semantics
Harbor describes artifacts as durable trial outputs: collected files are written under <trial_dir>/artifacts/, accompanied by a manifest.json, and exposed in the results viewer. With a separate verifier, those same artifacts are additionally restored into the verifier at their original source paths.
Harbor collection is best-effort and records failures in the manifest rather than failing the trial. Its destination field controls host-side placement without changing verifier-side restoration.
References:
Problem
We currently conflate two responsibilities:
- Result archival — preserving rollout outputs for inspection and downstream use.
- Grading transport — moving selected files into an isolated verifier sandbox.
Consequences include:
- shared and single-agent Harbor rollouts pay archive/network/memory costs for bytes that are then unused;
- artifacts are not durably available in eval output or a viewer;
- the grading-transport 32 MB cap and strict failure behavior also define the imported Harbor artifact surface;
destination has no effect because there is no host-side artifact directory;
- transient artifact bytes remain attached to live trace objects unless explicitly released.
Follow-up scope
Do not block #2144 on resolving the full artifact-storage model. Treat its transport-only behavior as an interim implementation and decide the durable artifact contract separately.
A follow-up design should consider:
- a host-side/eval-output artifact sink with a manifest and per-source status;
- streaming or downloading artifacts to disk rather than retaining every payload in
Trace.state;
- durable collection for shared and single-agent runs without redundant grader upload;
- reusing collected outputs as the source for isolated-verifier restoration;
- separate policies for archival failures versus required grading-input failures;
- whether transport limits differ from archival limits;
- support for Harbor's
destination, service provenance, collisions, and best-effort behavior;
- explicit cleanup of any transient transport buffers;
- lifecycle ordering: collect hooks, artifact capture, task scoring, and verifier execution.
Done when
- The durable artifact contract is documented independently of grading topology.
- Shared, single-agent, and isolated modes have intentional, tested behavior.
- Artifact outputs can be inspected after an eval without relying on live trace state.
- Isolated grading can restore required inputs without retaining unused payloads for every rollout.
Context
#2144 adds artifact collection/restoration for isolated grading and imports Harbor's
artifactsand[[verifier.collect]]task fields.The current implementation uses artifacts only as an in-process transport channel:
HarborTask.finalize()runs collect hooks and archives/logs/artifacts/plus declared paths for every Harbor rollout.trace.state.artifacts, which is excluded from trace serialization.agentic-judgerestores those bytes into the fresh judge sandbox.Current code: Harbor collection, transient state, isolated restore.
Harbor semantics
Harbor describes artifacts as durable trial outputs: collected files are written under
<trial_dir>/artifacts/, accompanied by amanifest.json, and exposed in the results viewer. With a separate verifier, those same artifacts are additionally restored into the verifier at their original source paths.Harbor collection is best-effort and records failures in the manifest rather than failing the trial. Its
destinationfield controls host-side placement without changing verifier-side restoration.References:
Problem
We currently conflate two responsibilities:
Consequences include:
destinationhas no effect because there is no host-side artifact directory;Follow-up scope
Do not block #2144 on resolving the full artifact-storage model. Treat its transport-only behavior as an interim implementation and decide the durable artifact contract separately.
A follow-up design should consider:
Trace.state;destination, service provenance, collisions, and best-effort behavior;Done when