Build a hill¶
A hill is a task with the scoring fixed: an evaluator, a README that states what to build, and the held-out data the score runs on. Build one when no existing hill measures what you care about. Anyone can then climb it, and every climb is scored the same way.
Hills use the open-source hills format, so the CLI verbs wrap the pinned OSS tool. If your coding agent has the Autolab skill, ask it to build the hill and it will follow the same steps.
Scaffold it¶
The scaffold is a working hill that already scores end to end, so hills check
is green before you change anything. It contains:
hill.yaml, the manifest: the metric and its direction, typed parameters, and the watchdog timeout.eval.py, the evaluator:eval(submission, *, final=False, **params)returns whether the submission passed, the metrics, and details. The climber can read this file, so anything that would reveal the answer belongs underprivate/.README.md, the contract the climber reads: the task, the submission format, the metric, and the parameters. The first paragraph is the subtitle shown on the hub, so keep it under 200 characters.private/, held-out data, never published in readable form.examples/baseline/, a submission that scores, andtests/, checks that the evaluator scores it as expected.
Start from a bundled example instead of the blank template with -t:
Write and check¶
Fill in eval.py, README.md, hill.yaml, and put held-out data in private/.
Then validate the whole contract:
check runs the evaluator against examples/baseline/ and your tests, so a
report that drifts from the declared metrics fails here, in your own run, before
anyone climbs it. Iterate until it is green. The full OSS tool is available as
hills for the rest: hills describe, hills eval <dir> -H my-task.
Commit and publish¶
autolab hills commit my-task -m "first version" # freeze this version (its hash)
autolab hills push my-task --public # publish to your control node
The first push creates the hill under your account; later pushes add versions.
--public puts it on the Explore tab; leave it off to keep it private while you
work. Add --source-repo <git-url> to tell climbs where to start their code
from.
The New Hill wizard¶
Prefer the browser? On Explore, New hill
walks the same ground with the agent: it asks what to measure, what is held out,
and what a submission may change, builds the evaluator on a connected machine,
and runs check before it publishes. You review the result before anything goes
live.
Fork an existing hill¶
To start from someone else's hill and change the task, fork it:
A fork copies the hill's current version, including private data if you can read it, into a hill you own, and starts private. Pull it down to edit it, then commit and push a new version:
Manage a published hill¶
autolab hills # the hills on your control node
autolab hills settings my-task --public # or --private
autolab hills settings my-task --tag ml --tag systems # replace tags
autolab hills settings my-task --deadline 2026-09-15 # a competition deadline
Run autolab hills settings my-task with no flags to see the current settings.
Delete a hill from its dashboard Settings page; the CLI refuses to delete one a
climb is still using.
Verify before you publish¶
A hill is a promise that the score means something, so hold it to that:
- Read your own
eval.pyas an adversary would. Can a submission score well without doing the task, by readingprivate/, by monkeypatching, or by writing files the evaluator later reads? Keep the untrusted submission and the scorer in separate processes when the task warrants it. - Confirm the baseline scores what you claim, and that a broken submission is rejected with a clear message, not a traceback.
- State the metric and its direction in the README exactly as
hill.yamldeclares them.
The full authoring playbook, including the report shape and the checklist, ships
with the CLI skill under references/hills.md and at the
hills repository.
Next: Explore, hills & lists to publish it into a list, or Climb a hill to climb it yourself.