BenchFlow

Files BenchFlow reads and writes

You write two kinds of file for BenchFlow, a task's task.md header and a run config; every key they take is here, with its type and default. BenchFlow writes JSON documents for each job and trial; the ones with a schema file are here, with their top-level fields. Every file in a trial's folder, and every key of its result.json, is in Read the results.

Files you write

task.md

The header is YAML between two --- lines at the top of task.md; the instruction is below it. Each table below is one key's settings, with the type, default and description the code gives them. A key is optional unless the table says required, and a key the header doesn't know is refused. A key new since 0.9.2 has (0.10) after it when 0.10.0rc3 has it, or (unreleased) when no release has it yet.

KeyTypeDefaultDescription
schema_versiontext1.3
tasktable (task)Package information from the [task] section.
metadatamapping{}
verifiertable (verifier)
agenttable (agent)
sandboxtable (sandbox)
oracletable (oracle)Also read as solution.
sourcetext
rewardmapping{}Legacy task-level reward expression metadata.
multi_step_reward_strategymean | finalHow to derive one rollout reward from per-step verifier results. Used only by a task with steps, which runs on 0.10.0rc2.
stepslist of tables (steps[])0.9.2 reads this key but refuses to run a task that has it (multi-step tasks are not supported); multi-step tasks run on 0.10.0rc2.
artifactslist of text or tables (artifacts[])[]
preference (0.10)mapping{}How bench preferences pairs and ranks this task's outputs (protocol, randomize_sides, raters_per_pair, min_agreement; other keys are recorded). The run itself is unchanged. See docs/tasks/human-preferences.md.
agentstable: roles, each role by name (agents.roles.*)A multi-turn task's roles: which agent plays each.
sceneslist of tables (scenes[])A multi-turn task's scenes, run in order; each has its turns.
usertable (user)A simulated user that answers the agent; its persona is the body's ## user-persona section.
benchflowtable (benchflow)BenchFlow's own settings, read by the features that use them.

task

KeyTypeDefaultDescription
nametextrequiredPackage name in org/name format (e.g., 'benchflow/hello-world')
versiontext""Package version (task.toml schema 1.3 [task] field). Informational only; recorded, never interpreted. Absent from this model it was extra_forbidden, which made schema-1.3 tasks that set it unloadable.
descriptiontext""What the task asks, in a sentence or two, for people browsing tasks
authorslist of tables (task.authors[])[]List of package authors
keywordslist of text[]Tags that help people find and group the task

task.authors[]

KeyTypeDefaultDescription
nametextrequiredAuthor name
emailtextAuthor email address

verifier

KeyTypeDefaultDescription
typetest-script | llm-judgetest-scriptVerification method. In task.md, 0.9.2's bench check and bench run refuse llm-judge (no runnable verifier entrypoint); a verifier document grades with a model instead (LLM judge).
submission_fileslist of text[]Explicit verifier-recovery contract (submission-files-v1): the absolute paths of the task's submission files, at most 8, literal (no globs), outside /dev, /logs, /proc, /solution, /sys and /tests. Only these regular files are captured and restored; never a whole directory.
workspace_recoverybooleanfalseAllow verifier-only recovery from captured workspace after transport failure. The task author guarantees all solver changes needed for scoring are inside the workspace and a fresh task image/setup reproduces all other dependencies; no mutable external state.
timeout_secnumber (> 0)600.0Wall-clock budget in seconds for verifier execution. Omitting the field inherits this default; zero, negative, and non-finite budgets are rejected at validation time.
envmapping of names to text{}
collect (0.10)list of tables (verifier.collect[])[]Commands run in compose services after the agent's turn and before artifact collection (task.toml [[verifier.collect]]).
required_toolslist of textComplete list of PATH program names whose availability or lookup can affect grading, including subprocesses and later-created helpers. Required when any image PATH entry is omitted by hardening. Every name must already resolve in the trusted verifier PATH; use absolute paths for uploaded/generated helpers. [] declares no required PATH tools.
optional_toolslist of text[]PATH program names used only for optional probes. The task author guarantees that every use tolerates the program being unavailable without changing grading. Refusals of any other program invalidate every reward.
reward_range[number, number]Declared [lo, hi] reward contract for this task. Omitted (None) keeps BenchFlow's strict canonical [0.0, 1.0]. A declared range may only WIDEN the canonical range (lo <= 0.0, hi >= 1.0, lo < hi, both finite) so 0 ('did nothing') and 1 ('solved') stay meaningful for every task; e.g. safety-floor benchmarks declare reward_range = [-1.0, 1.0] to score deliberate violations below doing nothing. Applies to the test-script reward contract (reward.txt / reward.json scalar reward, numeric metrics, aggregate results) and the final reward canonicalization gate; LLM-judge rubric scores stay [0, 1].
usertext or integerAccount (name or numeric id) the verifier's commands run under.
network_modeno-network | public | allowlist | denylistOptional verifier-specific network policy override.
allowed_hostslist of textHostnames reachable when network_mode='allowlist'.
sandbox_modeshared | separateWhether the verifier runs in the agent sandbox ('shared') or a dedicated verifier sandbox ('separate').
sandboxtable, the keys of sandboxOptional separate verifier sandbox configuration.
servicetextmainCompose service the test-script verifier runs in. Defaults to 'main' (the agent container). Multi-container (vulhub-style) tasks set this to a target/database service so test.sh can inspect target-side state (RCE markers, DB modifications) rather than only the agent's workspace. The agent's anti-tamper hardening only applies to 'main'; deliberately vulnerable target containers are intentionally not hardened. See #248.
judgetable (verifier.judge)LLM-judge configuration (used when type == 'llm-judge'). Read only with type: llm-judge, which 0.9.2 refuses in task.md (LLM judge).
memorytable (verifier.memory)Memory-space scoring fixtures.
hardeningtable (verifier.hardening)Per-task verifier hardening opt-outs.
pytest_pluginslist of text[]pytest11 plugin names to allow under PYTEST_DISABLE_PLUGIN_AUTOLOAD=1. Container-side auto-discovery handles most cases; this is the explicit fallback for plugins that discovery cannot see (e.g. ctrf, playwright).
pytest_plugin_releaseslist of text[]Pinned PyPI releases (name==version, e.g. pytest-asyncio==0.24.0) of the pytest plugins test.sh installs itself. The plugin guard loads such a plugin from the agent-writable trees or uvx's cache only when its installed files are that release's wheel, byte for byte, as PyPI publishes it; pytest-json-ctrf needs no entry.

verifier.collect[]

KeyTypeDefaultDescription
commandtextrequired
servicetextmain
timeout_secnumber (> 0)60.0
usertext or integer

verifier.judge

KeyTypeDefaultDescription
modeltextclaude-sonnet-5-5Judge model identifier. Provider is routed from the prefix (claude-* / gpt-* / gemini-*). 0.9.2 defaults to claude-sonnet-4-6.
rubric_pathtexttests/rubric.tomlPath to the rubric file, relative to the task directory. Both rubric.toml (native) and rubric.json (Harvey LAB style) are supported.
input_dirtext/appDirectory inside the sandbox holding the agent's deliverables. Its contents are downloaded and shown to the judge.
input_typedeliverablesdeliverablesWhat the judge evaluates. Only 'deliverables' (agent output files) is supported; trajectory judging is not available at verify time.
contexttext""Optional extra context passed to the judge prompt (defaults to the task instruction when empty).

verifier.memory

KeyTypeDefaultDescription
expected_skillslist of textSkill pack names the task expects the agent to add/update/remove. None means no answer key was supplied; [] means no skill should change.

verifier.hardening

KeyTypeDefaultDescription
cleanup_conftestsbooleantrue
cleanup_gitbooleantrue

agent

KeyTypeDefaultDescription
prompt_prefixtextOptional run-specific policy text prepended to each resolved task prompt. Intended for generic harness constraints such as benchmark integrity rules; must not contain task-specific solution content.
timeout_secnumber (> 0)Wall-clock budget in seconds for the agent harness. Omitting the field gives the agent no limit of its own: the rollout's whole deadline bounds it (as in 0.7.11) unless the caller passes a timeout; zero, negative, and non-finite budgets are rejected at validation time, matching verifier.timeout_sec.
token_budget (0.10)integer (> 0)The most tokens a trial's model calls may use, input (cached included) plus output, subagents' calls included. BenchFlow's model proxy refuses the next call once they are spent and the agent is stopped (benchflow.trial_budget). A run's --token-budget replaces it.
turn_budget (0.10)integer (> 0)The most model calls (turns) a trial may make through BenchFlow's model proxy, subagents' and side calls included; the proxy refuses the next one and the agent is stopped. A run's --turn-budget replaces it.
usertext or integerAccount (name or numeric id) the agent's commands run under.
network_modeno-network | public | allowlist | denylistOptional agent-specific network policy override.
allowed_hostslist of textHostnames reachable when network_mode='allowlist'.

sandbox

KeyTypeDefaultDescription
network_modeno-network | public | allowlist | denylistpublicNetwork access policy for this environment.
allowed_hostslist of textHostnames reachable when network_mode='allowlist'.
blocked_urlslist of textURL prefixes the agent cannot reach when network_mode='denylist'; scheme optional, query ignored
blocked_hostslist of textHostnames (and their subdomains) the agent cannot reach when network_mode='denylist'
build_timeout_secnumber600.0
docker_imagetextPrebuilt image name; legacy SkillsBench tasks may use image. Also read as image.
oslinux | windowslinuxOperating system the task's container runs.
cpusinteger1
memory_mbinteger2048
storage_mbinteger10240
gpusinteger (>= 0)0
gpu_typeslist of textAcceptable GPU types. Modal accepts one entry, e.g. ['H100']; omit for any type when gpus is positive.
mcp_serverslist of tables (sandbox.mcp_servers[])[]
envmapping of names to text{}Variables set in the sandbox, read from the host when the trial starts. A value can name a host variable as ${VAR}, or as ${VAR:-default} to fall back to a default.
tputable (sandbox.tpu)Optional TPU accelerator request.
skills_dirtextPath to skills directory in the sandbox.
healthchecktable (sandbox.healthcheck)Healthcheck to run after environment start.
workdirtextDefault working directory for command execution.
setup_commandslist of tables (sandbox.setup_commands[])[]Commands run after sandbox services start and before the agent is installed. Useful for benchmark-native workspace/database seeding.
bugswarm_image_tagtextBugSwarm image tag used by build-repair benchmark tasks.
allow_cloud_metadatabooleanfalseLet the agent reach the cloud metadata endpoints under an open network: no block, and the trial records the opt-out. Without it the agent starts only once the block is proven on.
require_cloud_metadata_blockbooleanfalseRefuse an agent that runs as root on a sandbox provider without BenchFlow's metadata helper (Daytona, Modal, AgentCore, Apple), where it otherwise runs under the provider's own metadata policy.
allow_internetbooleantrueDeprecated compatibility field; use network_mode instead.
memorytext
storagetext

sandbox.mcp_servers[]

KeyTypeDefaultDescription
nametextrequired
transportstdio | sse | streamable-httpsse
urltext
commandtext
argslist of text[]
cwdtext
envmapping of names to text{}
headersmapping of names to text{}
toolslist of text
include_tagslist of text
exclude_tagslist of text

sandbox.tpu

KeyTypeDefaultDescription
typetext (at least 1 long)required
topologytextrequired

sandbox.healthcheck

KeyTypeDefaultDescription
commandtextrequired
interval_secnumber5.0
timeout_secnumber30.0
start_period_secnumber0.0
start_interval_secnumber5.0
retriesinteger3

sandbox.setup_commands[]

KeyTypeDefaultDescription
commandtext (at least 1 long)required
timeout_secnumber (> 0)600.0
cwdtext
envmapping of names to text{}
usertext or integer
servicetextmain
host_locktext
capture_dirtextOptional absolute sandbox directory to archive after the command succeeds. The archive is written to capture_dir_b64_env.
capture_dir_b64_envtextHost environment variable to update with a base64 tar.gz archive of capture_dir after the command succeeds.
capture_dir_b64_env_file_vartextOptional host environment variable whose value is a dotenv file path. When set, capture_dir_b64_env is also upserted there.

oracle

KeyTypeDefaultDescription
envmapping of names to text{}
timeout_secnumber

steps[]

KeyTypeDefaultDescription
nametextrequired
agenttable, the keys of agent
verifiertable, the keys of verifier
min_rewardnumber or mapping of names to numbers
healthchecktable, the keys of sandbox.healthcheck
artifactslist of text or tables, the keys of artifacts[][]

artifacts[]

KeyTypeDefaultDescription
sourcetextrequired
destinationtext
excludelist of text[]
service (0.10)textThe compose service to collect this artifact from (the task.toml format's sidecar artifacts): None or 'main' is the agent's own container; any other names a service of the task's compose file, needs a sandbox that runs compose services and an absolute source, and is read from that service's own filesystem.

agents.roles.*

Each role of agents.roles, under its name.

KeyTypeDescription
agenttextRequired.
modeltext
reasoning_efforttext
envmapping of names to text
timeout_secintegerNone = inherit from task config
idle_timeout_secinteger
skills_dirtext or path
capabilitieslist of texte.g. ["tool-use", "agent-as-tool", "loop"]

scenes[]

KeyTypeDescription
nametext
roleslist of role names
turnslist of turns
skills_dirtext or path

scenes[].turns[]

A turn is a table, or the name of the role that takes it.

KeyTypeDescription
roletextRequired.
prompttextNone = expand from the task prompt

user

The keys BenchFlow reads: model, private_facts, stop_rule.

benchflow

The keys BenchFlow reads: compat, environment, evidence, nudges, prompt, teams, verifier.

Run config

bench run --config FILE reads a whole run from a YAML file of these keys. It needs tasks_dir or source; a flag given beside it wins over its key; sandbox is read as environment; and a key not in this table is refused, with the closest one. The flag column names the flag that sets the same thing, and the help is that flag's. A key new since 0.9.2 has (0.10) after it when 0.10.0rc3 has it, or (unreleased) when no release has it yet.

KeyFlagDefaultHelp
accept_deviations (0.10)--accept-deviations (0.10)Why this run differs from its task set's run-reference.toml (a strict one refuses the run without it); kept in run-card.json.
agent--agentclaude-agent-acpAgent: claude, codex, gemini, … (bench agents), oracle (the task's reference solution) or nop (does nothing)
agent_env--agent-env{}Agent env var (KEY=VALUE)
agent_env_keys[]
agent_idle_timeout--agent-idle-timeout600Abort a prompt when the agent is silent this long: seconds, or 90s, 10m, 1h; 0, none or null turns it off and leaves the task's wall-clock timeout (default: 10m, 30m at effort xhigh or max)
agent_idle_timeout_sec--agent-idle-timeout600Abort a prompt when the agent is silent this long: seconds, or 90s, 10m, 1h; 0, none or null turns it off and leaves the task's wall-clock timeout (default: 10m, 30m at effort xhigh or max)
allow_cloud_metadata--allow-cloud-metadatafalseLet the agent reach the cloud metadata endpoints under an open network (no block; each trial records the opt-out). Without it, or the task's allow_cloud_metadata = true, the agent starts only once the block is proven on
base_image_override--base-image-overrideRewrite task Dockerfile FROM images on the runtime task copy. Use only for reproducing runs whose base image moved namespaces.
budget--max-cost-usd, --max-sandbox-seconds, --max-tokens, --max-rolloutsA table of max_cost_usd, max_sandbox_seconds, max_tokens, max_rollouts.
build_concurrency--build-concurrencyMax concurrent docker image builds. Defaults to --concurrency. Set lower (e.g. 8) when --concurrency is high to avoid overwhelming the docker daemon with parallel builds.
checkpoint_keep--checkpoint-keep3Keep at most this many checkpoints per trial (default 3, or a run config's checkpoint_keep); the oldest is deleted.
checkpoints--checkpointsKeep a sandbox snapshot after these prompts: every-prompt or prompt:N[,M]. Later bench branch --from-checkpoint <trial> forks from one. Docker, or Daytona direct; each is a full filesystem image. See docs/train/environment.md
codex_apps_policy--codex-apps-policyCodex account Apps: disabled (scored-task default) or inherit (explicit opt-in).
concurrency--concurrency4Trials running at a time. On Docker a job also prepares up to --warm-pool sandboxes ahead (default 1 when this is 2 or more)
config_override--config-overrideDeep-merge a config patch into each task's resolved config for this run. Inline JSON/YAML/TOML or an @file ref, e.g. --config-override '{"agent":{"timeout_sec":120}}'. Varies one knob (budget, skills, stopping rules) while the tasks, agent, model and environment stay fixed; recorded by content hash for replay.
context_root--context-rootRepo/build-context root used to stage Dockerfile COPY sources for monorepo-authored local tasks.
dataset_name
dataset_task_digests{}
dataset_version
environment--sandboxdockerSandbox: docker, remote-docker, daytona, modal, apple-container, or agentcore
environment_manifest--environment-manifestEnvironment-plane manifest applied to every rollout: a path to an environment.toml, OR a 'name@version' registry spec resolved via $BENCHFLOW_ENV_REGISTRY when set, else the built-in registry shipped with benchflow (env0@prod, env0@outage). The manifest-declared stateful environment is provisioned, gated on readiness, and torn down.
exclude--exclude[]Skip these task names; repeatable (e.g. --exclude quantum-numerical-simulation)
extra_instruction--extra-instructionText appended to every task prompt (prompt ablations; recorded per rollout)
freeze_workspace--freeze-workspacefalseSave each trial's final workspace and declared artifacts (evidence/, with a manifest) before the verifier runs, so bench regrade can re-score it with a changed verifier.
fresh_install--fresh-installfalseInstall the model proxy and the agent in every trial instead of starting from their cached image layers (same as BENCHFLOW_FRESH_INSTALL=1)
harness--harnessacpHow the agent runs: acp (default, its ACP adapter) or native (its own CLI in headless JSON mode; claude-agent-acp and codex-acp)
include--include[]Only run these task names; repeatable (e.g. --include jax-computing-basics --include data-to-d3)
integrity--integrityoffoff, audit (record what the agent did and check it against the task) or strict (audit, and the verifier in a separate sandbox). The verdict is in integrity/claim_verdict.json; rewards never change.
job_modeparallel-independent
jobs_dir--jobs-dirjobsOutput directory (default jobs); a plain run resumes its latest job
keep_sandbox (0.10)--keep-sandbox (0.10)neverKeep a trial's sandbox: on-failure, always or never (default). bench sandbox attach <trial> opens a shell in it; bench sandbox release <trial> deletes it.
loop_strategy--loop-strategyHarness loop strategy, e.g. 'verify-retry:k=3,feedback=names', 'self-review:k=3', or 'single-shot' (default). verify-retry re-prompts with filtered soft-verifier feedback; self-review re-prompts the agent to critique its OWN work (no verifier signal); both loop until the soft verifier passes or k retries are spent.
max_retries--retry-attempts2Retries per task after a retryable failure (overrides the default of 2)
model--modelModel id for the agent, e.g. claude-haiku-5-5 (none for oracle and nop)
n_tasks--n-tasksRun at most N tasks after --include/--exclude: the first N, or a seeded random sample with --sample-seed
prompts--promptPrompt(s) to send (default: the task prompt: the task.md body, or instruction.md for older tasks)
reasoning_effort--reasoning-effortAgent reasoning/thinking effort when the agent exposes one (e.g. max)
retry--retry-attemptsA table of max_retries, retry_on_install, retry_on_pipe, retry_on_acp, retry_on_idle_timeout, retry_on_infra, retry_on_verifier_infra, retry_on_api_error, wait_multiplier, min_wait_sec, max_wait_sec, exclude_categories.
retry_from_checkpoint--retry-from-checkpointon-failure, on-timeout, or both: when a trial fails or times out, fork one retry from its last --checkpoints snapshot, verified the same way. The trial's reward is kept; the retry's is reported next to it (result.json retry block, summary checkpoint_retries).
retry_prompt--retry-promptPrompt for the retry, replacing the prompts after the checkpoint (the default). '@instruction' is the task instruction, '@verifier_feedback' the failed trial's reward and verifier output tail.
retry_resume_session--retry-resume-sessionfalseThe retry resumes the failed trial's conversation at the checkpoint (ACP session/load; Claude Code) instead of a fresh session.
reviewer--reviewer-agent, --reviewer-model, --reviewer-reasoning-effort, --reviewer-sandbox, --reviewer-timeout-sec, --reviewer-idle-timeout, --reviewer-storage-mb (0.10), --reviewer-memory-mb (0.10), --reviewer-setup-timeout (0.10), --reviewer-evidence-timeout (0.10), --reviewer-concurrency, --reviewer-image, --reviewer-agent-env, --reviewer-open-networkA table of agent, model, reasoning_effort, environment, timeout_sec, idle_timeout_sec, storage_mb, memory_mb, setup_timeout_sec, evidence_timeout_sec, concurrency, image, agent_env, open_network.
sample_seed--sample-seedSeed for the --n-tasks random sample
sandbox_locked_paths
sandbox_setup_timeout--sandbox-setup-timeout120Timeout (seconds) for sandbox user setup inside the environment (default: 120; keeps the file's value with --config).
sandbox_user--sandbox-useragentSandbox user (null for root)
seeds--seedsSeeded rollouts: run every task once per seed, e.g. 0-4 or 0,3,7 (tasks in a task format that writes seeded variants, such as embodied tasks). summary.json gets pass@k and variance per task.
self_gen_no_internet--self-gen-no-internetfalseDisable web tools for the self-generated run
separate_verifier--separate-verifierfalseRun each verifier in a fresh sandbox built from the verifier image that receives only the frozen workspace, declared artifacts and /logs/artifacts, as if every task set [verifier].sandbox_mode = 'separate'. Docker, remote-docker, Daytona and Modal.
separate_verifier_include--separate-verifier-include[]A path outside the workspace that a separate verifier sandbox receives too, at the same path, for tasks whose agent writes graded files there (e.g. /root when the workspace is /app). Repeatable.
skill_creator_dir--skill-creator-dirPath to skill-creator or a skills root containing it
skill_mode--skill-modeno-skillSkill mode: no-skill, with-skill, or self-gen
skills_dir--skills-dirSkills directory to deploy
skip_installfalse
source--source-path, --source-ref, --source-repoA GitHub folder, a table of path, ref, repo.
source_provenance
tasks_dir--tasks-dirLocal tasks directory
timeout_multiplier--timeout-multiplierScale every task's agent time budget (task.md agent.timeout_sec), e.g. 2.0
token_budget (0.10)--token-budget (0.10)Per-trial budget in tokens (input, cached included, plus output), subagents' calls included: BenchFlow's model proxy refuses the next model call once it is spent, the agent is stopped and its work graded. Replaces a task's [agent] token_budget
turn_budget (0.10)--turn-budget (0.10)Per-trial budget in turns, one turn being one model call through BenchFlow's model proxy (subagents' and side calls included); enforced like --token-budget. Replaces a task's [agent] turn_budget
usage_proxyNo longer supported: a config with it is refused. Use usage_tracking.
usage_proxy_advertised_base_urlNo longer supported: a config with it is refused. Use usage_tracking.
usage_proxy_bind_hostNo longer supported: a config with it is refused. Use usage_tracking.
usage_proxy_portNo longer supported: a config with it is refused. Use usage_tracking.
usage_proxy_urlNo longer supported: a config with it is refused. Use usage_tracking.
usage_tracking--usage-trackingTelemetry-enforcement policy: auto, required, or off. The LiteLLM proxy is always used for routable agents (usage, cost, and llm_trajectory.jsonl are always captured); this flag only controls whether trusted telemetry is required.
verifier_sandbox--verifier-sandboxtasktask (default: each task's own choice) or separate: every verifier in a fresh sandbox with only the workspace and the declared artifacts; a task that cannot run there refuses the run.
warm_pool--warm-poolDocker: how many sandboxes to prepare ahead of their trial's turn, beyond the --concurrency running ones (0 to --concurrency; default 1, or 0 when --concurrency is 1)

YAML job config

A run config with agents: and datasets: (or a tasks: list) is a YAML job config: it runs every agent on every dataset, n_attempts times each. Its top-level keys: agent_idle_timeout, agent_idle_timeout_sec, agent_setup_timeout_multiplier, agent_timeout_multiplier, agents, allow_cloud_metadata, base_image_override, codex_apps_policy, context_root, datasets, environment, environment_build_timeout_multiplier, exclude, exclude_tasks, excludes, extra_instruction_paths, extra_instructions, fresh_install, harness, include, include_tasks, includes, integrity, job_name, jobs_dir, metrics, n_attempts, n_concurrent_trials, orchestrator, quiet, reasoning_effort, reviewer, sandbox_locked_paths, sandbox_setup_timeout, sandbox_user, self_gen_no_internet, separate_verifier, separate_verifier_include, skill_creator_dir, skill_mode, skills_dir, tasks, timeout_multiplier, usage_proxy, usage_proxy_advertised_base_url, usage_proxy_bind_host, usage_proxy_port, usage_proxy_url, usage_tracking, verifier_sandbox, verifier_timeout_multiplier. An agent entry takes concurrency_group, env, harness, model_name, n_concurrent, name, reasoning_effort, skip_install; a dataset entry exclude_task_names, n_tasks, path, task_names. A setting BenchFlow can't honour exactly is refused when the file loads, unless it holds its default:

KeyInstead
install_onlyBenchFlow has no install-only run; drop it
debugdrop it; the job folder keeps each trial's logs
retryBenchFlow never retries trials from a YAML job config; drop it, or run the folder with bench run --retry-attempts N
verifierBenchFlow runs each task's verifier as task.md (or task.toml) sets it; drop it, or change the task
user_agentBenchFlow has no simulated user for a YAML job config; drop it
artifactsdrop it; the job folder keeps the agent's logs and trajectory
source_jobsre-grade a job with bench regrade <job folder>; drop it

Files BenchFlow writes

The JSON documents BenchFlow writes, one section per schema file in schemas/, with each document's top-level fields. A schema or field new since 0.9.2 has (0.10) after it when 0.10.0rc3 has it, or (unreleased) when no release has it yet.

benchflow-assessment-event.v1.schema.json (0.10)

One append-only event for a hash-bound blinded pairwise assessment

Identifier: https://benchflow.ai/schemas/benchflow-assessment-event.v1.schema.json. File: schemas/benchflow-assessment-event.v1.schema.json.

FieldTypeRequiredDescription
schema_versionconstant "benchflow.assessment-event.v1"yes
assessment_idstringyes
event_idstringyes
event_seqintegeryes
created_atstringyes
kindone of "assessment.created", "compute.released", "assignment.issued", "review.submitted", "review.corrected", "review.retracted", "label.reduced", "label.consumed", "label.withdrawn"yes
actorobjectyes
idempotency_keystringyes
expected_previous_event_sha256object (optionalDigest)yes
previous_event_sha256object (optionalDigest)yes
payloadobjectyes
event_sha256object (digest)yes

benchflow-assessment-label.v1.schema.json (0.10)

The deterministic label an assessment sidecar's events reduce to

Identifier: https://benchflow.ai/schemas/benchflow-assessment-label.v1.schema.json. File: schemas/benchflow-assessment-label.v1.schema.json.

FieldTypeRequiredDescription
schema_versionconstant "benchflow.assessment-label.v1"yes
assessment_idstringyes
label_idstringyes
revisionintegeryes
statusone of "ready", "withheld", "withdrawn", "stale"yes
stateone of "answered", "retracted", "label_ready", "consumed", "withheld", "withdrawn_for_future_use"yes
consumablebooleanyes
resolvedbooleanyes
unresolved_revisionsarray of objectyes
task_digeststringyes
presentationobjectyes
attemptsobjectyes
rubricobjectyes
judge_protocolobjectyes
collectorobjectyes
reviewer_subjectstringyes
sourceobjectyes
revisionsarray of objectyes
event_chainobjectyes
reducerconstant {"id": "benchflow.assessment.reduce", "version": "1"}yes
valueone of 1, 0, 0.5no
withheld_reasonone of "human_abstention", "answer_retracted"no

benchflow-branch-child-row.v2.schema.json

BenchFlow branch-tree child row (children.jsonl)

One child of one fork: the shared prefix, this child's continuation and its reward, value and advantage.

Identifier: https://benchflow.ai/schemas/benchflow-branch-child-row.v2.schema.json. File: schemas/benchflow-branch-child-row.v2.schema.json.

FieldTypeRequiredDescription
advantagenumber or nullyesreward - value.
agentstring or nullno
childobjectyes
continuationobject (messages)yes
depthintegeryes1 for a fork of the trial, 2 for a fork inside a child…
fork_idstringyes
fork_kindone of "fork", "retry"no
fork_statusstring or nullno
kindconstant "branch_child"yes
messagesobject (messages)yesprefix + continuation, ready for apply_chat_template.
modelstring or nullno
parent_childstring or nullnoNode id of the child whose fork this is (nested), else null.
parent_nodestring or nullno
prefixobject (messages)yes
prefix_completebooleanyesFalse when the trial started from a kept checkpoint whose source conversation could not be found, so the prefix lacks it.
prefix_sourceobject or nullnoFor a trial started from a kept checkpoint: the source trial, checkpoint and number of events prepended.
schema_versionconstant 2yes
sessionobject (session)yes
siblingsintegerno
taskstring or nullno
tool_namesone of "agent", "inferred", "mixed", nullnoWhether tool names came from the agent or were inferred from the calls.
toolsobject (tools)yes
trialstringyesTrial folder name.
valuenumber or nullyesMean reward of the fork's children.
value_stderrnumber or nullno

benchflow-branch-pair-row.v2.schema.json

BenchFlow branch-tree pair row (pairs.jsonl)

Two siblings of one fork with different rewards, in prompt/chosen/rejected form for preference training.

Identifier: https://benchflow.ai/schemas/benchflow-branch-pair-row.v2.schema.json. File: schemas/benchflow-branch-pair-row.v2.schema.json.

FieldTypeRequiredDescription
agentstring or nullno
chosenobject (messages)yes
chosen_labelstring or nullno
chosen_rewardnumberyes
depthintegerno1 for a fork of the trial, 2 for a fork inside a child…
fork_idstringyes
kindconstant "branch_pair"yes
marginnumberyes
modelstring or nullno
parent_nodestring or nullno
prefix_completebooleannoFalse when the trial started from a kept checkpoint whose source conversation could not be found, so the prefix lacks it.
promptobject (messages)yesThe shared prefix plus, when same_request, the shared user turn.
rejectedobject (messages)yes
rejected_labelstring or nullno
rejected_rewardnumberyes
same_requestbooleanyesBoth siblings were asked the same thing; only these are exported unless --pairs-any-request is given.
schema_versionconstant 2yes
sessionobject (session)no
taskstring or nullno
toolsobject (tools)yes
trialstringyesTrial folder name.

benchflow-comparison.v1.schema.json

ComparisonExport

Identifier: https://benchflow.ai/schemas/benchflow-comparison.v1.schema.json. File: schemas/benchflow-comparison.v1.schema.json.

FieldTypeRequiredDescription
aobject (ComparisonSideExport)yes
a_pairedobject (DenominatorsExport) or nullnoside A over the tasks both sides ran (1.1)
bobject (ComparisonSideExport)yes
b_pairedobject (DenominatorsExport) or nullno
byarray of stringnoextra pairing keys besides task (1.1)
caveatsarray of stringyes
include_controlsbooleanyes
kindstringno
mismatchesarray of object (SettingMismatchExport)yes
rowsarray of object (ComparisonRowExport)yes
schema_minorintegernooptional fields added within schema_version; see the changelog
schema_versionintegerno
summaryobject (ComparisonSummaryExport)yes
varyarray of stringyes

benchflow-comparison.v2.schema.json

ComparisonExport

Identifier: https://benchflow.ai/schemas/benchflow-comparison.v2.schema.json. File: schemas/benchflow-comparison.v2.schema.json.

FieldTypeRequiredDescription
aobject (ComparisonSideExport)yes
a_pairedobject (DenominatorsExport) or nullnoside A over the tasks both sides ran (1.1)
bobject (ComparisonSideExport)yes
b_pairedobject (DenominatorsExport) or nullno
byarray of stringnoextra pairing keys besides task (1.1)
caveatsarray of stringyes
include_controlsbooleanyes
kindstringno
mismatchesarray of object (SettingMismatchExport)yes
rowsarray of object (ComparisonRowExport)yes
schema_minorintegernooptional fields added within schema_version; see the changelog
schema_versionintegerno
scoring (0.10)object or nullnothe scoring rule's figures for each side on the tasks both ran, the gap b - a with its 95% interval paired by task, its warnings, and each side's mixed settings (2.1)
summaryobject (ComparisonSummaryExport)yes
varyarray of stringyes

benchflow-job.v1.schema.json

JobExport

Identifier: https://benchflow.ai/schemas/benchflow-job.v1.schema.json. File: schemas/benchflow-job.v1.schema.json.

FieldTypeRequiredDescription
cost_usdnumber or nullyes
denominatorsobject (DenominatorsExport)yesagent runs; controls left out
denominators_with_controlsobject (DenominatorsExport)yes
error_categoriesobjectnoagent runs that errored, by error_category (1.1)
groupsarray of object (GroupExport)noagent-run denominators per agent and model (1.1)
interruptedarray of object (InterruptedExport)noattempt folders that never wrote result.json (1.1)
job_kindstringyes
kindstringno
pathstringyes
schema_minorintegernooptional fields added within schema_version; see the changelog
schema_versionintegerno
solve_ratesobject (SolveRatesExport) or nullnoagent runs; default ks and success rule
summaryobject or nullnothe job's summary.json
timing_totalsobjectnoseconds per timing phase, summed over agent runs (1.1)
trialsarray of object (TrialExport)yes

benchflow-job.v2.schema.json

JobExport

Identifier: https://benchflow.ai/schemas/benchflow-job.v2.schema.json. File: schemas/benchflow-job.v2.schema.json.

FieldTypeRequiredDescription
cost_usdnumber or nullyes
denominatorsobject (DenominatorsExport)yesagent runs; controls left out, unless every trial is one
denominators_with_controlsobject (DenominatorsExport)yes
error_categoriesobjectnoagent runs that errored, by error_category (1.1)
groupsarray of object (GroupExport)noagent-run denominators per agent and model (1.1)
interruptedarray of object (InterruptedExport)noattempt folders that never wrote result.json (1.1)
job_kindstringyes
kindstringno
pathstringyes
schema_minorintegernooptional fields added within schema_version; see the changelog
schema_versionintegerno
scoring (0.10)object or nullnothe scoring rule's figures over every trial and the trials split by setting, as summary.json's scoring block (2.1)
solve_ratesobject (SolveRatesExport) or nullnoagent runs (controls left out, unless every trial is one); default ks and success rule
summaryobject or nullnothe job's summary.json
timing_totalsobjectnoseconds per timing phase, summed over agent runs (1.1)
trialsarray of object (TrialExport)yes

benchflow-model-call.v1.schema.json (0.10)

One model call (trajectory/model-calls.jsonl)

Identifier: https://benchflow.ai/schemas/benchflow-model-call.v1.schema.json. File: schemas/benchflow-model-call.v1.schema.json.

FieldTypeRequiredDescription
cache_read_tokensinteger or nullyes
cache_write_tokensinteger or nullyes
cost_usdnumber or nullyes
duration_msnumber or nullyes
effortstring or nullyes
finish_reasonstring or nullyes
http_statusinteger or nullyes
indexintegeryes
input_tokensinteger or nullyes
max_output_tokensinteger or nullyes
model_requestedstring or nullyes
model_servedstring or nullyes
output_tokensinteger or nullyes
purposestring or nullyes
reasoning_tokensinteger or nullyes
refusedboolean or nullyes
routestring or nullyes
schemaconstant "benchflow.model-call.v1"yes
sourceone of "proxy", "claude-code-otel", "claude-code-session-log", "codex-session-log"yes
started_atstring or nullyes
subagentboolean or nullyes
temperaturenumber or nullyes
thinkingboolean or nullyes
top_pnumber or nullyes
truncatedboolean or nullyes

benchflow-model-call.v2.schema.json (0.10)

One model call (trajectory/model-calls.jsonl)

Identifier: https://benchflow.ai/schemas/benchflow-model-call.v2.schema.json. File: schemas/benchflow-model-call.v2.schema.json.

FieldTypeRequiredDescription
cache_read_tokensinteger or nullyes
cache_write_tokensinteger or nullyes
cost_usdnumber or nullyes
duration_msnumber or nullyes
effortstring or nullyes
finish_reasonstring or nullyes
http_statusinteger or nullyes
indexintegeryes
input_tokensinteger or nullyes
max_output_tokensinteger or nullyes
model_requestedstring or nullyes
model_servedstring or nullyes
output_tokensinteger or nullyes
purposestring or nullyes
reasoning_tokensinteger or nullyes
refusedboolean or nullyes
routestring or nullyes
schemaconstant "benchflow.model-call.v2"yes
seedinteger or nullyes
sourceone of "proxy", "claude-code-otel", "claude-code-session-log", "codex-session-log"yes
started_atstring or nullyes
subagentboolean or nullyes
temperaturenumber or nullyes
thinkingboolean or nullyes
toolsinteger or nullyes
top_pnumber or nullyes
truncatedboolean or nullyes

benchflow-model-calls.v1.schema.json (0.10)

A trial's model calls, totalled (model-calls.json)

Identifier: https://benchflow.ai/schemas/benchflow-model-calls.v1.schema.json. File: schemas/benchflow-model-calls.v1.schema.json.

FieldTypeRequiredDescription
agent_effortobjectno
agent_retriesinteger or nullno
callsintegeryes
cost_usdnumber or nullno
effortobjectno
finish_reasonsobjectno
first_agent_toolsobject or nullno
first_call_atstring or nullno
http_errorsinteger or nullno
http_status_countsobjectno
input_filesobject or nullno
last_agent_callobject or nullno
max_output_tokensobjectno
model_time_msnumber or nullno
models_requestedobjectno
models_servedobjectno
purposesobjectno
refused_callsinteger or nullno
schemaconstant "benchflow.model-calls.v1"yes
sourcestring or array or nullyes
sourcesobjectyes
thinkingobjectno
tokensobjectyes
truncated_callsinteger or nullno
truncation_ratenumber or nullno
upstream_attemptsinteger or nullno
upstream_errorsinteger or nullno
upstream_retriesinteger or nullno

benchflow-rollout-stream.v1.schema.json

One finished rollout from bench train stream / stream_rollouts

One JSON line per finished rollout. reward is null for an unscored rollout, never 0. calls holds the gateway's token capture (benchflow.token_capture.v1) per model call; sequences (one per conversation) are present only when every call is complete and each prompt extends the previous prompt and sampled tokens of its conversation (token-in/token-out).

Identifier: https://benchflow.ai/schemas/benchflow-rollout-stream.v1.schema.json. File: schemas/benchflow-rollout-stream.v1.schema.json.

FieldTypeRequiredDescription
schema_versionconstant "benchflow.rollout-stream.v1"yes
jobstringyesJob folder name.
rolloutstringyesRollout folder name.
rollout_pathstringyesRollout folder relative to the job folder.
taskstring or nullyes
agentstring or nullyes
modelstring or nullyes
group_idstringyesStable id of the group, e.g. 'task=hello|agent=claude-agent-acp|model=vllm/policy|job=2026-01-01__12-00-00'.
groupobjectyesThe grouping key (task, agent, model by default).
rewardnumber or nullyes
scoredbooleanyes
outcomeone of "passed", "failed", "errored", "verifier_errored"yes
errorstring or nullyes
finished_atstring or nullyes
token_captureobjectyes
callsarray of objectyes
sequencesarray of objectyesOne merged token stream per conversation of the rollout (agent loop, helper calls, subagents), only when the rollout is training-grade; empty otherwise.
advantagenumber or nullyesGRPO advantage over the group's scored rollouts (group_size only); null otherwise.
group_completeboolean or nullyesgroup_size only: true when the group filled; false on a withheld record whose group was still short when the stream ended.
replacesstring or nullnorollout_path of the earlier attempt of the same trial that this rollout replaces (an Evaluation's retry or resume re-run); that attempt is not a sample.
retriedbooleannogroup_size only: true when a later attempt replaced this rollout before its group formed; it joins no group.
withheld (0.10)stringnogroup_size only, and only on a record the stream withheld: why its group may not reach the trainer (short, unscored, no model calls: a member's run never reached the model, or tokens: some members lack the token sequence the others have). The stream itself never yields such a record.

benchflow-run-summary.v1.schema.json

RunSummaryExport

The result of one bench eval run (--summary-out), for CI.

Identifier: https://benchflow.ai/schemas/benchflow-run-summary.v1.schema.json. File: schemas/benchflow-run-summary.v1.schema.json.

FieldTypeRequiredDescription
budgetobject or nullnosummary.json's budget block when the job had a budget cap (caps, spent, stopped, reason, cancelled, not_started)
erroredintegeryes
exit_codeintegeryesthe process exit code of the run
failedintegeryes
gateobject (GateExport)yes
job_dirstring or nullyes
job_namestringyes
kindstringno
mean_rewardnumber or nullyes
pass_ratenumberyespassed / total
passedintegeryes
ranintegeryestasks run by this invocation
reusedintegeryesfinished tasks reused from an earlier run (resume)
schema_versionintegerno
timed_outintegeryestrials whose agent timed out (scored or not)
totalintegeryes
verifier_erroredintegeryes

benchflow-run-summary.v2.schema.json

RunSummaryExport

The result of one bench eval run (--summary-out), for CI.

Identifier: https://benchflow.ai/schemas/benchflow-run-summary.v2.schema.json. File: schemas/benchflow-run-summary.v2.schema.json.

FieldTypeRequiredDescription
budgetobject or nullnosummary.json's budget block when the job had a budget cap (caps, spent, stopped, reason, cancelled, not_started)
erroredintegeryes
exit_codeintegeryesthe process exit code of the run
failedintegeryes
gateobject (GateExport)yes
interruptedintegernoof not_run, the tasks whose trial had started when it stopped
job_dirstring or nullyes
job_namestringyes
kindstringno
mean_rewardnumber or nullyesover every trial, an unscored one counting 0 (2.0)
mean_reward_scored_onlynumber or nullnoover scored trials only, as mean_reward was in 1.x (2.0)
not_runintegernoplanned tasks a budget, a usage limit or a stop kept from finishing; not in total, counted as not passed by --fail-under
pass_ratenumberyespassed / total
passedintegeryes
ranintegeryestasks run by this invocation
reusedintegeryesfinished tasks reused from an earlier run (resume)
schema_versionintegerno
stoppedbooleannothe run was stopped (Ctrl-C, SIGTERM): the counts are over the trials that finished first, and no gate was applied
timed_outintegeryestrials whose agent timed out (scored or not)
totalintegeryes
verifier_erroredintegeryes

benchflow-training-signal.v1.schema.json

Training-signal fields of a bench train convert row

Fields added by --reward-vector and --group-advantage to prime-sft and trl-sft rows. Other row fields are described by the trainer format. Unscored rollouts have a null reward_vector and a null advantage, never 0.

Identifier: https://benchflow.ai/schemas/benchflow-training-signal.v1.schema.json. File: schemas/benchflow-training-signal.v1.schema.json.

FieldTypeRequiredDescription
reward_vectornull or objectno
advantagenumber or nullno
advantage_vectornull or array of number or nullno
groupobjectno

benchflow-trial.v1.schema.json

TrialExport

Identifier: https://benchflow.ai/schemas/benchflow-trial.v1.schema.json. File: schemas/benchflow-trial.v1.schema.json.

FieldTypeRequiredDescription
agentstringyes
agent_namestringyes
assessmentstringyes
attemptsintegernorollouts this trial took: 1, plus each retry (or resume re-run) of its task in an Evaluation job (1.3)
checkpointsarray of objectyes
controlstring or nullyescontrol runs check the task, not an agent
duration_secnumber or nullyes
errorstring or nullyes
error_categorystring or nullyes
executionstringyesintegration_failed (1.2): the agent did nothing because its integration broke; see integration_failure
finished_atstring or nullyes
forksarray of object (ForkExport)yes
integration_failureobject or nullnowhy the agent did nothing useful when its integration broke: cause (agent_auth, agent_install, truncated_trajectory, empty_trajectory, immediate_exit, no_activity), evidence, evidence_source, activity counts, reward_withheld; detected: 'on read' for results written before 1.2 (1.2)
kindstringno
modelstring or nullyes
n_promptsintegeryes
n_tool_callsintegeryes
passedbooleanyes
pathstringyestrial folder, or the results.jsonl file
reviewobject (ReviewExport) or nullyes
rewardnumber or nullyesrewards.reward; null when unscored
rewardsobject or nullyes
rollout_namestringyes
rowinteger or nullnorow index for a results.jsonl trial
rubric_reviewsarray of object (RubricReviewRecordExport)noevery rubric review of the trial: scoring revisions oldest first, then detached audits (added in 1.1)
sandboxobject (SandboxExport) or nullnosandbox.json, written when the sandbox was created (1.1)
schema_minorintegernooptional fields added within schema_version; see the changelog
schema_versionintegerno
score_outcomestringyes
scoringobject or nullnothe automatic reviewer's gate verdict
settingsobjectyeswhat bf.compare checks; see SETTINGS
sourcestringyes
started_atstring or nullyesISO 8601, local time as recorded
task_namestringyes
timingobjectyes
trajectoryarray of object or nullnoACP events; null when not included in the export
usageobject (UsageExport)yes
verifierobject (VerifierExport) or nullyes
verifier_errorstring or nullyes
verifier_error_categorystring or nullyes
View as Markdown