Guide
Submit a GitHub repository with your harness server (serve.py),
submission.yaml, and artifacts/ from a dev-set run. We evaluate your harness and
model on the hidden test set.
How to enter
Copy a sample
The competition repository includes working samples, the validation kit, and the dev set. Copy a sample into its own git repository (for example,
../my-harness).Check it
Run
python -m kit check ../my-harnessto test your container and smoke task, theneval/run.pyto run the dev set and writeartifacts/. Both require Docker.Submit
Before your first submission, sign in with GitHub and register on this site. Commit your code and
artifacts/together, push to GitHub, and select your repository on the submission page. You get 3 scored submissions (one active evaluation at a time).
Your repository
submission.yaml entry name, model_api, and your install and serve commands serve.py WebSocket server started by serve for each task harness.py your agent loop, or a wrapper around an existing agent .env API keys, if needed (private repository only) artifacts/ dev-set outputs and manifest written by eval/run.py
This layout matches the pi-opus sample. Smaller entries like minimal
keep the entire loop in serve.py.
submission.yaml
name: my-harness # display name on the leaderboard
model_api: google-cloud/claude-opus-5-5 # see Models below
install: >- # runs once at image build time (as root, with internet)
uv venv --python 3.12 /opt/harness/venv
&& uv pip install --python /opt/harness/venv/bin/python -r {src}/requirements.txt
serve: /opt/harness/venv/bin/python {src}/serve.py # starts your server on $PORT
env: # non-sensitive settings, quoted as strings (optional)
LOG_LEVEL: "info"
{src} expands to /opt/harness/src and {port} to
$PORT. Only /opt/harness is kept after the build step, and runtime package downloads are
blocked.
Models
| model_api | Served by | In .env |
|---|---|---|
google-cloud/ | Google sponsored models | None |
openai/ | OpenAI, on your account | OPENAI_ |
anthropic/ | Anthropic, on your account | ANTHROPIC_ |
gemini/ | Google AI Studio, on your account | GEMINI_ |
openai-compatible/ + model_base_url | Your own server, at an
https:// address on a public DNS name | MODEL_ |
Available Google sponsored models:
google-cloud/gemini-4-argon: Gemini 4 Argongoogle-cloud/gemini-3.8-flash: Gemini 3.8 Flashgoogle-cloud/gemini-3.1-pro-preview: Gemini 3.1 Pro (preview)google-cloud/claude-opus-5-5: Claude Opus 5.5google-cloud/gpt-oss-120b: gpt-oss 120Bgoogle-cloud/qwen3-coder-480b: Qwen3 Coder 480B A35Bgoogle-cloud/qwen3-next-80b: Qwen3-Next 80B A3B Instructgoogle-cloud/deepseek-v3.2: DeepSeek-V3.2google-cloud/kimi-k2-thinking: Kimi K2 Thinkinggoogle-cloud/minimax-m2: MiniMax M2google-cloud/glm-5.2: GLM 5.2google-cloud/gemma-4-26b: Gemma 4 26B A4Bgoogle-cloud/llama-4-maverick: Llama 4 Maverick 17B 128E
.env
OPENAI_API_KEY=sk-...
- Put
.envat the repository root with oneNAME=valueline per variable. - Add the API key your model provider requires (none for
google-cloudmodels). - Only commit
.envto a private repository with the GitHub App installed. Public repositories with a.envfile are rejected. - If
.envis gitignored, stage it withgit add -f .env.
Dev-set artifacts
Commit artifacts/ in the same commit as the harness code that generated it. eval/run.py
writes and hashes this folder automatically; do not edit it by hand.
uv run python eval/run.py ../my-harness # runs the dev set, writes ../my-harness/artifacts/ uv run python -m kit artifacts ../my-harness # checks the folder with the server's rules uv run python eval/run.py --artifacts ../my-harness # grades the folder as the server does (calls only the judge) git -C ../my-harness add -A && git -C ../my-harness commit -m "dev artifacts" # everything: the manifest records the harness
After you submit:
- We build your harness and run the smoke task. Failures here do not use a slot.
- We grade your artifacts to compute your dev score. Missing or unusable tasks score 0.
- We run your harness on a few sampled dev tasks to verify reproducibility.
- Your harness runs three times on the hidden test set, all at once, to set your leaderboard rank.
The submission page checks artifacts/ before queueing (Git LFS is not supported, and at least one dev
task must have usable outputs). See docs/artifacts.md for full validation rules.
What your server receives
| Variable | Value |
|---|---|
PORT | TCP port your WebSocket server listens on |
MODEL_API, MODEL_NAME | Your model_api string and the model name to pass in API requests |
MODEL_BASE_URL, MODEL_API_KEY | OpenAI-compatible base URL and key, set for every model
(also mirrored as OPENAI_BASE_URL and OPENAI_API_KEY) |
ANTHROPIC_, ANTHROPIC_ | Native Anthropic endpoint and key (for Claude models) |
GOOGLE_GEMINI_, GEMINI_API_KEY | Native Gemini endpoint and key (for Gemini models) |
Your env and .env | Passed through unchanged |
How a task runs
For each task, the evaluator starts your harness in an isolated container (read-only root filesystem, uid 1000,
2 CPUs, 4 GB RAM) and connects to 0.0.0.0:$PORT
over a WebSocket. Your harness queries the model and sends WebSocket requests to run commands, read and write files,
and call MCP tools inside the task container, ending with a done message.
Your container
Your harness
servelistens on0.0.0.0:$PORT- 2 CPUs, 4 GB RAM, read-only
/opt/harness - runs your loop or an existing agent via
taskbridge.py
- The evaluator sends your harness:
taskprompt, workdir, time limits, MCP servers - Your harness sends the evaluator:
execread_filewrite_filehttpshell commands, file I/O, MCP tool calls - The evaluator answers your harness with:
resultcommand output or file data for each request - Your harness ends the task with:
doneyour closing summary, passed to the graders
Managed by us
The evaluator
- one WebSocket session per task
- enforces time and resource limits
- In the task's container, the evaluator: executes each request as the task user
- Back from the task's container: returns command output and file contents
Task container no network
The task
- project files in
workdir bashshell as the task user- local MCP app servers when needed (mail, calendar, docs)
Via egress proxy only
Your model
model_api: Google sponsored model, your own API key, or self-hosted server- only your model endpoint is reachable; web search and outside APIs are blocked
After the task finishes
The graders
- automated verification scripts on deliverable files
- LLM rubric judge reviewing deliverables and your closing summary
Bring an existing agent
To wrap an existing CLI agent without writing a WebSocket client, use taskbridge.py from the sample
submissions. It runs a local HTTP relay so your subprocess agent can execute commands, read and write files, and
call MCP tools inside the task container.
- Pi
task-tools.tstaskbridge.py(local relay)- WebSocket
- evaluator
- task container
See pi-opus, hermes-opus, and agy-gemini in the competition repository for working examples.
Requirements
- Ship as one commit
- Commit
submission.yaml, your harness code, and theartifacts/folder generated from it. Keep API keys in.envinside a private repository. - Build once
installruns once at build time with internet access. Only/opt/harnessis kept (up to 2 GiB compressed); runtime package downloads are blocked.- Listen in time
- Accept a WebSocket connection on
0.0.0.0:$PORTwithin 120 seconds of startup. - Act through the protocol
- Exchange UTF-8 JSON frames up to 16 MiB (up to 8 concurrent requests). File reads and writes use base64.
- Reach only your model
- Outbound traffic goes through
HTTPS_PROXY, which permits only your declared model endpoint. - Deliver, then say done
- Write all requested files to the exact paths in the prompt and send your summary in
donebefore the task timeout.
Rules
- Submit from a public GitHub repository, or from a private repository on your account with the GitHub App installed.
- Committed
artifacts/must come directly from running the submitted harness without manual edits. - Do not hard-code answers or detect specific tasks. Organizers audit top-ranking repositories.
- Do not log or retain prompts or files from evaluation tasks.
Scoring
- Each test run is scored as the mean across all test tasks on a 0 to 1 scale (ungraded tasks count as 0).
- Your harness runs three times on the hidden test set, all at once, and your test score is the mean of the three runs. Earlier submissions win ties. Your dev score comes from your committed
artifacts/and does not affect leaderboard rank. - Every submission made during the competition period (see the Official rules) completes all its test runs before standings are finalized.
- A test run in which no task could be graded runs again automatically, and the runs already scored are kept.
- Evaluator faults are retried automatically while keeping any completed runs. Build failures, smoke-test failures, and evaluator faults never use a submission slot.
- With your own API key or model server, you pay for every model call the evaluation server makes: the smoke task, the reproduction check on a few dev tasks, and the hidden test set three times, including any task or run repeated after a fault on our side. Your rate limits or server must sustain about 36 tasks at once. Errors or timeouts from your key or server count against your score.