On your own machine
Export the environment and run it against any Harbor agent, or feed it to a Harbor-compatible trainer:--limit 3 to the export for a smoke run. Rewards land in Harbor’s jobs directory; Harbor prints the mean.
Each task becomes a directory: the prompt in instruction.md (with a line telling the agent to write its final answer to /app/answer.md), a task.toml, a small Dockerfile, a verifier in tests/, and solution/solve.sh, which writes the recorded answer so -a oracle checks the verifier before you spend on a model. Judge and rubric tasks are graded with the same independent judge the Belvedir Runner uses. Two deterministic verifier kinds are available for tasks you author: code runs the task’s own verify(answer, state) function, and state_diff compares the files under /app/state to the task’s golden files (a task’s setup.state files are placed there before the agent runs). Both run under Harbor only, and state_diff tasks need an agent that edits files in the container (OpenCode, Pi, Claude Code, and similar); the default Belvedir agent only writes an answer.
The judge’s key is never in the export: task.toml reads JUDGE_API_KEY from your environment, so harbor run asks to confirm host access (-y skips the prompt). Harbor imports a custom agent (-a module:Class) inside its own interpreter, so point PYTHONPATH at the harness-harbor clone as above; the oracle and Harbor’s built-in agents need only Harbor itself. The belvedir-harbor package is not on PyPI, so there is no pip install for it.
From Belvedir
Pick Belvedir Runner on Harbor as the harness when generating an environment (preselected on hosted Belvedir;--preset harbor-runner from the CLI). Each task runs in its own container, the run appears on My Benchmarks like any other, and the model calls are traced into your project. To score a production agent that is a service rather than a model, set BELVEDIR_AGENT_URL (and optionally BELVEDIR_AGENT_TOKEN) on the harness: the runner posts each task as JSON and grades whatever your service returns.
Managed workspace or your own Modal account
The task containers run in one of two places. The same applies to the Harbor-format suites on the Benchmarks page:- Belvedir’s managed workspace is the default on hosted Belvedir: leave
MODAL_TOKEN_ID/MODAL_TOKEN_SECRETblank on the harness. Managed runs use the catalog’s Harbor driver as shipped, so the harness must keep the driver’s install and run commands unchanged, and its env may only carry the variables the driver reads:MODEL,MODEL_API_BASE,MODEL_API_KEY,MODEL_LABEL,JUDGE_MODEL,JUDGE_API_BASE,JUDGE_API_KEY,HARBOR_DATASET,HARBOR_AGENT,HARBOR_N_TASKS,HARBOR_CONCURRENCY,HARBOR_TASK_NAMES,HARBOR_MODEL,MODAL_TOKEN_ID,MODAL_TOKEN_SECRET,BELVEDIR_AGENT_URL,BELVEDIR_AGENT_TOKEN,OPENROUTER_API_KEY.HARBOR_AGENTmust be a plain Harbor agent name (terminus-2,claude-code,belvedir; not amodule:Classimport path),HARBOR_CONCURRENCYis 1 to 4,HARBOR_N_TASKSis blank or 1 to 50, the harness uses CPU compute, and your organization must have credits or pay as you go on. A launch that fails one of these conditions is refused with a message naming the variable or condition. - Your own Modal account: set
MODAL_TOKEN_IDandMODAL_TOKEN_SECRETon the harness (--envfrom the CLI) and the same harness runs there, with none of the managed-workspace limits and any edits to the driver you like.