Skip to content

v1: model Harbor artifacts as durable outputs, not only grading transport #2189

Description

@hallerite

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:

  1. Result archival — preserving rollout outputs for inspection and downstream use.
  2. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions