Assessment prep

Craft rules that make tasks pass

Principles reviewers care about — learn judgment, not an answer key. Then try Ask AI.

The settings sheet (task.toml)

This file is the machine-readable config for timeouts, resources, tags, and metadata. Treat it like a checklist, not optional fluff. Every task needs agent and verifier timeouts, an environment build timeout, and resource fields (CPU, memory, storage). Even when your task has no intermediate milestones, milestone-related fields the platform expects still need to be present in the expected shape.

Writing instructions like a human

instruction.md is the only prose the agent reads. Write the way a real developer would ask a coding agent for help. Skip emoji markers, dense header forests, and “AI brochure” formatting. Short and human beats long and decorative.

Rubrics that score behavior

Rubrics are created through the Snorkel UI generator, then edited for accuracy. They score what the agent did in its trace — not hidden test internals. Create and edit rubrics in the submission UI. Do not invent a separate rubrics.txt that tries to cover everything offline.

Environment & Dockerfile rules

The environment is everything the agent is allowed to see. Keep answers and graders out of it. Package installs should use pinned versions. Apt packages are the usual exception. Do not rely on floating “latest.”

The settings sheet (task.toml)

This file is the machine-readable config for timeouts, resources, tags, and metadata. Treat it like a checklist, not optional fluff.

Required sections are not optional

Every task needs agent and verifier timeouts, an environment build timeout, and resource fields (CPU, memory, storage). Even when your task has no intermediate milestones, milestone-related fields the platform expects still need to be present in the expected shape.

Tags should describe the work

One lonely tag is too thin. Aim for a small handful of relevant tags (roughly three to six) that describe languages and challenge areas the agent faces.

Multi-container needs explicit flags

If you ship a docker-compose with multiple services, the settings sheet must declare that you are using custom compose and that this is a multi-container task.

Match codebase_size to reality

Count agent-visible files honestly. A small environment (about 0–20 files) is “minimal.” Do not pad with filler files just to look bigger.

Writing instructions like a human

instruction.md is the only prose the agent reads. Write the way a real developer would ask a coding agent for help.

Natural prose over heavy styling

Skip emoji markers, dense header forests, and “AI brochure” formatting. Short and human beats long and decorative.

Keep it concise

Most tasks need as little as one sentence up to a few short paragraphs. Long laundry lists of requirements (dozens of bullets) usually mean the task is padded, not harder.

No step-by-step solution walkthroughs

Requirements state outcomes and constraints. “First read X, then parse Y, then filter Z” is a recipe — that is a hint, not a requirement.

Absolute paths only

If you mention a file or folder, give the full path the agent should use. Vague “update the config in the configs folder” fails review.

Sound human, not LLM-generated

Formulaic structure, hedging, and unnaturally balanced pros/cons are red flags. Prompts should mirror how real users talk to coding agents.

Difficulty comes from the coding challenge

Piling on dozens of edge cases to manufacture hardness is not a valid Advanced/Hard task. Genuine reasoning challenge beats checklist length.

Interesting and useful

A task must matter to some group of developers. Obscure-for-obscurity’s-sake is high severity.

Rubrics that score behavior

Rubrics are created through the Snorkel UI generator, then edited for accuracy. They score what the agent did in its trace — not hidden test internals.

Use the platform generator

Create and edit rubrics in the submission UI. Do not invent a separate rubrics.txt that tries to cover everything offline.

Standard line shape

Every line starts with “Agent”, describes one behavior, and ends with a signed score. Good behaviors get plus; mistakes get minus.

Keep the plus total in range

When you add the positive scores, the total should land in the platform’s accepted window (about 10–40). Too high means revise before submit.

Include negative criteria

A rubric that only awards positives is incomplete. Include several negative rewards for harmful or incorrect behavior.

Phrase criteria positively for the scored event

Prefer “Agent accesses the secret directory, −1” over “Agent does not access…, +1.” Score the behavior that happened.

Do not reference /tests or instruction.md by filename

Tests run after the attempt. The agent also does not “see” instruction.md as a named file in the way rubrics sometimes imply. Describe content and behavior, not file paths into the grader.

Environment & Dockerfile rules

The environment is everything the agent is allowed to see. Keep answers and graders out of it.

Pin dependencies (except apt)

Package installs should use pinned versions. Apt packages are the usual exception. Do not rely on floating “latest.”

Local content, not download-at-build

Only package dependencies may be fetched from the network during build. Datasets and task content belong in the environment locally — not curled from GitHub releases at build time.

No ground truth in the agent image

Expected answers and grader fixtures live under tests/, never as agent-visible files like expected_output.json in the environment.

Prefer real files over heredocs

Instead of embedding scripts with Dockerfile heredocs, keep files in the build context and COPY them in.

No privileged escapes

Privileged mode, dangerous capabilities, and mounting docker.sock are prohibited — even if the task “needs” them.

Oracle cannot install on the fly

Everything the solution needs must already be in the image. The oracle session does not get internet to pip install mid-run.

Fair verifiers & honest oracles

The grader must prove real solving happened. The oracle must prove the task is solvable every time.

Binary rewards only

Write 0 or 1 to reward.txt. Partial credit like 0.7 is not allowed.

Same logic for oracle and agent

Never branch the verifier to go easy on the oracle. Identical checks for both.

Check correctness, not just files exist

Verifying a .json file exists is not enough. Open it and validate the content.

Only grade what instructions require

If the prompt never mentions a REST API, do not fail the agent for missing one. Every graded behavior must be stated (or clearly implied) in the instructions or a referenced spec.

Defeat hand-written answers

If an output file could already sit in the environment, regenerate it by running the agent’s program during verification so a static file cannot sneak a pass.

Preinstall test tools

test.sh should not download packages from the internet. Install verifier dependencies in the Dockerfile (or vendored wheels), including libraries used only by tests.

tests/test.sh is required

Even if you have pytest files, test.sh is the required entrypoint that writes the reward.

Oracle must be deterministic and real

No flaky random sampling. No hardcoding the final answer with a one-line cat. Derive the answer with real steps, and pass every run.

Hard ≠ hidden requirements

Difficulty must come from genuine challenge with every required behavior disclosed. Undocumented traps that make agents fail are unfair, not Hard.

What belongs in a Terminus task

Not every coding puzzle is in scope. Aim for realistic agent work with enough steps to matter.

Not pure DSA textbook problems

A binary search tree that only lives in memory with no files, services, or tools is out of scope. Data structures can support a larger task — they should not be the whole story.

Enough agent work

A single clever shell one-liner is too thin. Tasks should require multiple steps with intermediate state and reasoning.

Long context must need reasoning

A huge log file that falls to a simple grep is not a real long-context challenge. The agent should have to reason over the content.

Submit a clean task folder

Before packaging, the task parent should contain only the task’s own files — not leftover README noise, old jobs logs, or unrelated data folders.

Milestones need clear mapping

If you use milestones, instructions must show which requirements belong to which milestone — not one undifferentiated blob.

Multiple subtypes are OK

When a task honestly spans areas (for example long context and API work), you can tag more than one subtype.