Task anatomy · field dictionary

Every required file — and what each field means

Use this as your cheat sheet for structure. If someone asks “what does number_of_milestones mean?” — it’s here. Learn the meanings; don’t memorize an answer key.

Folder structure

my-task/   (or tasks/<track>/<slug>/)
├── task.toml                 ✅ REQUIRED — metadata + timeouts + resources
├── instruction.md            ✅ REQUIRED — only prose the agent reads
├── environment/              ✅ REQUIRED — agent-visible world
│   ├── Dockerfile            ✅ REQUIRED (single-container) — digest-pinned base
│   ├── .dockerignore         ✅ REQUIRED — must exclude solution/ and tests/
│   ├── docker-compose.yaml   ⚪ optional — multi-container only (+ flags in toml)
│   └── app/, data/, docs…    ⚪ optional — starter code / specs the agent may see
├── solution/
│   └── solve.sh              ✅ REQUIRED — oracle; must earn reward 1 every run
└── tests/
    ├── test.sh               ✅ REQUIRED — ALWAYS the verifier entrypoint
    └── test_outputs.py       ✅ REQUIRED in practice — pytest assertions

Special paths at runtime (Harbor mounts these):
  /logs/verifier/   ← reward.txt lives here
  /logs/agent/      ← agent logs
  /oracle/          ← solution copied here when oracle runs
  /tests/           ← tests copied here at verify time (not in agent image)

Always required

  • task.toml, instruction.md
  • environment/Dockerfile + .dockerignore
  • solution/solve.sh
  • tests/test.sh (+ pytest checks)

Do not put in the zip parent

  • Extra README / jobs/ logs / unrelated data/
  • difficulty.md / explanation.md (explanations live on Snorkel)
  • rubrics.txt covering everything offline — use the UI generator
  • Ground-truth expected_output.json inside environment/

task.toml — every field explained

Edition 2 uses version = "2.0". Required sections: [metadata], [verifier], [agent], [environment]. Do not add a top-level [task] table for this project’s policy.

Annotated example (Edition 2 shape)

version = "2.0"

[metadata]
author_name = "anonymous"          # who wrote it (anonymous OK)
author_email = "anonymous"         # contact (anonymous OK)
difficulty = "unknown"             # keep unknown until real trials
category = "security"              # must be an allowed active category
subcategories = ["tool_specific"] # or [] if none fit
number_of_milestones = 0           # 0 for normal tasks — still required
codebase_size = "minimal"          # minimal | small | large
languages = ["bash"]               # agent/oracle languages
tags = ["openssl", "certs", "cli"] # 3–6 keywords
expert_time_estimate_min = 45
junior_time_estimate_min = 120

[verifier]
timeout_sec = 450.0                # how long tests may run

[agent]
timeout_sec = 900.0                # how long the agent may run

[environment]
build_timeout_sec = 600.0          # docker build budget
cpus = 2
memory_mb = 4096
storage_mb = 10240
allow_internet = false             # almost always false
[metadata] — who / what / how hard (all required for Edition 2)
Field / pieceWhat it meansHow to fill it
author_nameWho wrote the taskUse anonymous (project standard) unless told otherwise
author_emailContact emailUse anonymous (project standard)
difficultyDeclared difficulty before/after trialsBefore evals: unknown. Allowed: unknown | easy | medium | hard
categoryPrimary task categoryMust be an active category (e.g. security, machine-learning). Banned here: debugging, software-engineering, data-processing
subcategoriesOptional subtypes the task also fitsArray. Can be empty []. Examples: long_context, tool_specific, api_integration, db_interaction, ui_building. Multiple OK when true
number_of_milestonesHow many milestone steps the task hasUse 0 if it is a normal (non-milestone) task. Still required even when there are no milestones
codebase_sizeHow big the agent-visible environment isminimal ≈ 0–20 files · small ≈ 20+ · large ≈ 200+. Count files in environment the agent operates on — not files the agent creates. Be honest; don’t pad
languagesLanguages the agent writes / oracle usesArray, e.g. ["bash"], ["r"], ["minizinc"]. Describe agent-facing solution language, not verifier Python helpers
tagsFree-form keywords for tools/topicsRequired count: about 3–6. One tag alone is not enough. For tool/api/db subtypes, include the specific tool name
expert_time_estimate_minMinutes an expert would needInteger minutes — your estimate for a careful expert
junior_time_estimate_minMinutes a junior would needInteger minutes — usually higher than expert
[verifier] / [agent] / [environment] — run limits & resources
Field / pieceWhat it meansHow to fill it
[verifier].timeout_secMax seconds test.sh may runRequired. Platform cap commonly 1800. Often ≥ agent timeout
[agent].timeout_secMax seconds the agent may workRequired. Platform cap commonly 1800
[environment].build_timeout_secMax seconds to build the Docker imageRequired
cpusCPU cores for the sandboxRequired integer, e.g. 2
memory_mbRAM in megabytesRequired, e.g. 4096
storage_mbDisk budget in megabytesRequired, e.g. 10240
allow_internetCan the agent reach the network at runtime?Required. Almost always false — bake deps into the image
gpus / gpu_typesGPU allocationOptional — only if the task truly needs a GPU
docker_flagsExtra docker run flagsOptional — never use privileged / dangerous caps
workdirShared working directoryMilestone tasks only — omit on standard tasks
custom_docker_composeTask uses compose fileSet true if environment/docker-compose.yaml exists
is_multi_containerMore than one serviceSet true with custom_docker_compose when compose defines multiple services — both flags together

instruction.md — what each rule means

Not a TOML file — it’s free prose. Still has hard rules reviewers and the assessment care about.

Instruction principles (treat like fields)
Field / pieceWhat it meansHow to fill it
AudienceWho reads it?Only the AI agent. It does not see task.toml, tests/, or solution/
StyleHow should it sound?Like a real engineer prompting a coding agent — natural, maybe imperfect. Not a heavy markdown brochure
LengthHow long?Concise: roughly one sentence up to a few short paragraphs. Dozens of requirement bullets usually means padded, not harder
Well-specifiedWhat must be clear?Every behavior tests grade must be stated (or clearly implied via a referenced spec)
Absolute pathsHow to mention files?Always full paths (e.g. /app/config/settings.json). Relative “in the configs folder” fails
No hints / recipesWhat is forbidden?Step-by-step “first do X then Y” solution walks, answer values, grader secrets
InterestingWhy does it exist?Must be useful/interesting to some developers — not obscure for obscurity’s sake
Specs in environment/Can I add docs?Yes — as realistic contracts/schemas. Not as a second instruction.md to dodge length limits, and not as a solution guide

environment/ — Dockerfile pieces explained

Dockerfile directives & policy
Field / pieceWhat it meansHow to fill it
FROM …@sha256:…Base image for a build stageEvery FROM must be digest-pinned. Final stage should be a canonical approved image
WORKDIRDefault directory in the containerUsually /app — where the agent works
RUN apt-get … tmux asciinemaInstall runtime toolstmux + asciinema are required by the agent runtime — missing them breaks agent runs
RUN pip/npm install …==versionApp dependenciesPin versions. Apt package version pins are the usual exception
COPY app/ /app/Ship starter files into the imageCopy only agent-visible content from environment/ build context
COPY . .Copy everythingFORBIDDEN — leaks tests/ and solution/
CMD / USER / --platformStartup / user / arch lockFORBIDDEN — Harbor controls entrypoint; verifier needs root; don’t lock arch
.dockerignoreFiles excluded from build contextMust list solution/, tests/, plus caches (.git, node_modules, __pycache__, …)
docker-compose.yamlMulti-service stackOptional. If present with 2+ services → set custom_docker_compose=true AND is_multi_container=true
Size limitsHow big can environment be?About ≤100 MiB total, ≤50 MiB per file (policy)
Network at buildMay Dockerfile download data?Only package dependencies. Task datasets/content must be stored locally in environment/

solution/solve.sh — oracle fields of meaning

What the oracle is responsible for
Field / pieceWhat it meansHow to fill it
RoleWhat is it?Reference solution Harbor runs with --agent oracle. Copied to /oracle/ at runtime
Reward contractWhat score?Must produce reward 1 every single run (deterministic)
MethodHow should it solve?Real steps that derive the answer — not echo/cat a hardcoded final file
DependenciesCan it install packages?No internet / no pip install mid-run. Everything preinstalled in the image
FlakinessRandom / timing?Forbidden — must pass consistently
chmod +xExecutable bitScript should be executable (or invoked via bash explicitly)

tests/ — verifier pieces explained

test.sh + pytest + reward
Field / pieceWhat it meansHow to fill it
tests/test.shVerifier entrypointAlways required — even if you also have test_outputs.py. Platform expects this name
test_outputs.py (test_*.py)Actual assertionsPython pytest. Recompute correctness; don’t only check “file exists”
/logs/verifier/reward.txtThe grade fileMust write binary 0 or 1. Always write it — even when tests crash
Partial scores0.7 for 7/10?Not allowed — binary only
Identical logicOracle vs agentSame checks — no “if oracle then relax” branches
Instruction alignmentWhat may tests check?Only requirements stated (or clearly implied) in instruction.md / referenced specs
Hidden instancesExtra datasetsOptional hardening: re-run agent program on secret data (disclose that it happens, not the data)
set -e / heredocsShell pitfallsForbidden in test.sh — can skip reward write or break runners
Network in test.shDownload jq / pip?Forbidden — preinstall in Dockerfile or vendored wheels
Reward-writing tailFormattingDon’t restyle — platform pattern-matches the reward write

Golden contracts

  1. Oracle run → reward 1
  2. Nop run → reward 0
  3. Reward file always written
harbor run -p <task> -a oracle   # expect 1
harbor run -p <task> -a nop      # expect 0

Rubric — not a Harbor file, but assessment-critical

Created in the Snorkel UI (generate, then edit). Not a required file inside the task zip.

Rubric line anatomy
Field / pieceWhat it meansHow to fill it
WhereCreate/edit locationSubmission UI rubric generator — keep Generate rubrics enabled
Line shapeHow each criterion looksStarts with “Agent …”, then a signed score. Example: Agent writes tests for edge cases, +2
Positive scoresGood behaviorsUse explicit + (+1,+2,+3,+5). Sum of all positives must be between 10 and 40
Negative scoresBad behaviorsAt least 3 negative criteria (−1/−2/−3/−5) for harmful or incorrect behavior
PhrasingPositive vs negative wordingScore the event that happened: prefer “Agent accesses /secret, −1” over “Agent does not access…, +1”
No /tests referencesWhy?Tests run after the attempt — rubrics grade the agent trace, not pytest results
No instruction.md / task.toml by filenameWhy?Agent doesn’t “know” those filenames the way authors do — describe content/behavior instead
One big rubrics.txt for milestonesOK?No — handle rubrics through the UI, not a single offline document for all milestones