Docs
Harbor Task format
How to lay out a Task folder so Amber can validate and run it as part of a private Benchmark.
A private Benchmark is a set of Tasks in Harbor's Task format. You upload one or more Task folders as a .tar.gz, .tar or .zip (up to 100 MB compressed, 1 GB and 50,000 files unpacked, 1,000 Tasks), and Amber validates them before they can be used.
#Folder layout
Each Task is a folder:
my-task/
├── task.toml # metadata and limits
├── instruction.md # the Instruction given to the Agent
├── environment/
│ └── Dockerfile # builds the Environment the Agent works in
├── solution/
│ └── solve.sh # a reference solution
└── tests/
└── test.sh # the Verifier
Upload a folder that contains several Task folders to create a Benchmark with several Tasks. Every folder with a task.toml is a Task. If task.toml has a [task] section, its name is org/name and the Task is called by the part after the slash; otherwise by its folder's name. Names use letters, digits, ., _ and -, and are unique in an upload.
#What an archive may hold
Uploads are untrusted, so Amber unpacks them with strict rules and rejects the whole archive if any entry breaks one:
- only files and folders: no symbolic or hard links, devices or other special files, and no encrypted zip entries;
- relative paths with forward slashes: no absolute paths, no
.., no backslashes; - every
COPYandADDin a Dockerfile reads from inside the Dockerfile's own folder (environment/), never from outside the Task folder.
And each Task's task.toml must not:
- fill an
envvalue ([environment.env],[solution.env],[verifier.env], a step's or a separate Verifier Environment's) from the machine running it with${VAR}or${VAR:-default}: give literal values; - ask for GPUs or TPUs (
gpus,gpu_types,tpu); - ask for more than one sandbox has: 4
cpus, 8192memory_mband 10240storage_mb.
A Task that breaks one fails its format check; the rest of the upload goes on.
File permissions are kept only as far as "executable or not".
#The Verifier
tests/test.sh runs after the Agent finishes, inside the same Environment. It inspects the end state and writes a Reward between 0 and 1. Write the check against the outcome (a file exists, a test suite passes, a service responds) and not against how the Agent got there.
#Validation
Uploading runs validation, and every check must pass for a Task to be included:
- The format is valid.
- The Environment builds.
- The
oracleAgent, which runs the Task's own solution, gets a Reward of 1. - The
nopAgent, which does nothing, gets a Reward of 0.
Validation runs are billed to your Wallet: one oracle and one nop Trial per Task, which call no Model, so you pay for the Environments' time. Amber shows a Quote first. Your Tasks are your own, so a validation Trial whose Environment doesn't build or whose Verifier crashes or times out is charged and fails that Task, and a validation Trial is stopped after 1.5 times the sandbox time its Quote expected. Failures are reported per Task, and you can exclude failing Tasks and publish the rest. Publishing creates a new private Benchmark Version.
An upload that is checked but never validated keeps its Tasks for 7 days; one that was validated but not published keeps them for 30 days.
#Good Tasks
- One clear outcome. The Instruction says what to achieve, not how.
- Deterministic checks. The Verifier gives the same Reward for the same end state.
- No network. While the Agent works (and while the
oracleAgent runs your solution), Environments have no network access except the Amber model proxy and the hosts you list when you upload (the network allowlist). Bake dependencies into the image. - Hard to game. A
nopAgent must get a Reward of 0, so the starting state must not already satisfy the check.
#Privacy
A private Benchmark belongs to one Workspace. It is never visible outside it, in the catalog, in search, or in errors. Uploaded Tasks are untrusted code and run only in isolated sandboxes. You can restrict which Providers your private Benchmarks may be sent to in your Workspace's provider policy.