outcome.* events.
The task directory
A task directory is the open Harbor / Terminal-Bench lineage format: an instruction, a config, an environment reference, and a verifier that writes a reward file.task.toml declares the environment and the verifier:
instruction.md is the authoritative drive and accepts 1–4,096 characters,
the same bound as the Outcome description it becomes. For Terminal-Bench
compatibility, prompt.md is used only when instruction.md does not exist;
an unreadable instruction.md is an error rather than permission to select the
fallback. Every selected task file must be a regular, fatal-UTF-8 file no larger
than 1,048,576 bytes; symlinks and other non-regular entries are rejected. Both
eval task and eval experiment use this same loader. Experiment discovery
ignores a candidate only when its task.toml is genuinely absent: a symlink,
FIFO, directory, oversized file, or invalid byte stream is a visible error and
stops the experiment before any Session is created. The verifier contract is a
bounded, non-empty argv whose members are all non-empty strings — never a shell
string. The live execution slice will run it in the session sandbox after the
agent settles and read its reward from
/logs/verifier/reward.txt (a float in 0–1) or
/logs/verifier/reward.json ({ "reward": 0.0 }).
Compile a task into graded-Session inputs
checkfu eval task <dir> reads the directory, validates it, and compiles it
into the ordinary Checkfu resources one isolated graded Session needs:
\n and \t); any remaining
raw DEL/C1, Unicode line/paragraph, or D97 bidirectional control is normalized
to a four-hex-digit \uXXXX escape. Escaping changes presentation without
changing the compiled value. The compiled Outcome definition contains the
description, rubric, and iteration-budget fields of a future
user.define_outcome drive; a live caller additionally supplies event framing
and attribution. This command does not create a Session; the live
verifier-backed slice owns one-task/one-Session execution and minted-identity
isolation.
Pass --json to read the same complete compiled resources as one terminal-safe
machine document. A JSON parser reconstructs the exact original values:
checkfu eval (Blueprint plan evaluation, which
judges an authoring project’s plan and cannot authorize promotion). The two
instruments are never conflated.
Compare harnesses under controlled conditions
checkfu eval experiment <dir> can run the same task set against multiple
published AgentDefinitions. Give every lane a stable label, repeat the sample
enough times to expose variance, and request the machine report:
tasks × lanes × repetitions) so a broad directory or typo
cannot silently create an unbounded bill.
The report does not trust that preflight snapshot after work begins. It reads
every run.created.execution_pins and model.routed event and fails control
equivalence if a Session used a different AgentVersion, harness profile, model
model routing profile revision, realized model/tier, harness driver, SandboxProfile/image, or
plane policy. Unpinned and @latest harness references are resolved to the
current profile version before the first sample, and that resolved profile and
immutable release digest must remain constant across every sample in the lane;
both coordinates are included in the report.
Per lane it reports pass rate and population variance for iteration count,
tokens, active latency, tool calls, retries, tool failures, compactions, and
recoveries. Optional cost dimensions also report observed and missing sample
counts; missing measurements remain unknown and are never scored as zero. A
JSON report is emitted even when a sample fails; the command exits zero only
when every Outcome is satisfied and runtime controls remained equivalent.
The task directories can mix coding and operational tasks. This experiment
currently uses the ordinary Outcome grader described above: it does not claim
to run the task’s retained verifier or realize its environment until the live
verifier-backed ROADMAP slice lands.
Observe one production harness release
Controlled experiments answer whether two harness lanes differ under frozen inputs. After a release has real traffic,checkfu eval observe answers a
narrower question: what behavior did one exact harness release exhibit across
an explicit set of existing Sessions?
How the verifier reward is intended to become a verdict
Verifier-not-judge is the intended posture, matching how Checkfu proves its own claims: the verifier program — not a model judge — will decide whether the work satisfied the task. The platform-free reconciliation mapping below is built and tested, but the live grading chokepoint does not yet run the task verifier or read its reward. Once that ROADMAP slice lands, a settled Run with an active Outcome will reconcile the reward as follows:- A reward at or above
pass_threshold(default1.0) settles the Outcome satisfied. - A lower reward produces needs_revision, driving the grade-and-revise loop until the iteration budget exhausts, at which point the chokepoint converts the terminal max_iterations_reached.
Honest gaps in this version
Two design questions the plan records as open are answered at the honest floor rather than silently:- SandboxProfile realization. A task names a base SandboxProfile by
image. A task Dockerfile is read, preserved in full in both output modes, and recorded as an unrealizedimage_buildgap — v1 does not content-hash it into a derived image, so the surface says exactly what it can run. - Live execution. This surface compiles and validates a task directory into
the resources a graded Session needs. The existing
eval experimentcommand can drive those Outcome fields through public Session APIs, but it does not realize the task SandboxProfile or execute the task verifier. The customer-eval ROADMAP item retains ownership of that complete verifier-backed loop: realizing the SandboxProfile, driving one isolated Session against a target, running the verifier in the sandbox, reconciling its reward through the Outcome chokepoint, writing a run manifest under.local/, exporting the format in reverse, and documenting the result. No server-side eval entity exists: an “eval run” is a client-side composition whose results are projections of session events, and retained manifests are local artifacts.