Hillclimbing on verifiable rewards.
Use Claude Code and Codex to autonomously search for python programs that optimize a score you define.
Website · Docs · Quickstart · CLI reference · Blog · Discord
Give hillclimb a problem — a folder whose verifier scores a solution.py —
and a budget. It runs Claude Code, Codex or pi as operators that draft, debug
and improve solutions, scores every candidate through your verifier, and keeps
the best.
The harness is fixed. The climber — what to try next and how each attempt is prompted — is a block you can swap, edit and share, so two methods can be compared on the same problem under the same budget.
Quickstart
pip install hillclimb
hillclimb connect claude # or codex, pi; add --agent dummy to any run for no LLM at all
hillclimb init # hillclimb.yaml, problems/, runs/ in this folder
hillclimb problem get heilbronn-11 # the verifier is the problem; description.md is the brief
hillclimb verify heilbronn-11 # score the floor solution
hillclimb run heilbronn-11 --budget 10m
hillclimb watch # live coding agents and scores (also: chart, tree)
hillclimb stop --all
The best solution lands in runs/<run-id>/searches/heilbronn-11/best/.
The walkthrough goes through each step.
Climbers
A climber is one block of config, in a run spec or as the folder's default in
hillclimb.yaml:
climber:
selector_policy: map-elites # which candidate to build on next
operator_policy: greedy # which operator to use on it
operators: [draft, debug, improve, crossover.py:Crossover]
tuner: optuna
params: {num_drafts: 5}
Every slot takes a prebuilt module, a .py file of your own, or
package.module:Class. Presets: greedy, openevolve, gepa. Or compose in
Python:
from hillclimb import Budget, Climber, Problem
from hillclimb.policies import Greedy
from hillclimb.selectors import MapElites
problem = Problem("heilbronn-11")
budget = Budget(wall_clock="10m", evaluations=40)
climber = Climber(selector_policy=MapElites(num_drafts=5), operator_policy=Greedy())
climber.search(problem, budget=budget)
climber.best, climber.history, climber.to_frame()
climber.start(...) opens the same search to drive by hand, one climber.step() at a
time, and Problem(name, score=my_function, ...) defines a problem from a scoring function.
Runnable scripts are in examples/.
Compare two head to head:
hillclimb run heilbronn-11 --climber greedy --climber openevolve --parallel-searches 2
hillclimb experiment report <run-id>
Example problems
Exact, noise-free construction problems, each with its best known value as the
target line. hillclimb problem list shows the full catalog.
| Family | Instances | Score |
|---|---|---|
| Circle packing | circle-packing, circle-packing-32 |
sum of radii ↑ |
| Heilbronn triangles | heilbronn-11, -14, -17, heilbronn-convex-13 |
smallest triangle ↑ |
| Low-autocorrelation sequences | labs-40, labs-60 |
sidelobe energy ↓ |
| Tammes / Thomson | tammes-30, -50, thomson-50, -100 |
min angle ↑ / energy ↓ |
| Autocorrelation inequalities | autocorr-1, autocorr-3, erdos-overlap |
the constant ↓ |
| Kissing configuration | kissing-11 |
points ↑ |
| Golomb rulers | golomb-20, golomb-27 |
length ↓ |
| TSP / knapsack | tsp-200, mknap-100-5, mknap-250-10 |
tour ↓ / value ↑ |
Define your own: hillclimb problem new my-problem writes a small problem that already runs, for you to edit into yours. Kaggle (MLE-bench) and Einstein Arena
come in as benchmark problems.
Learn more
Website →What hillclimb is for, the terminal views you watch a climb in, and the modules a climber is built from. |
Problems →Every example problem with its verifier, its best known value and who found it, plus the verifier contract. |
CLI reference →Every |
Blogposts →Starting with Hillclimbing on verifiable rewards: from Cauchy's gradient descent to LLMs searching over programs. |
Questions, results, ideas: join the Discord.
License
Metadata
Release files for hillclimb 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hillclimb-0.7.0.tar.gz | 637.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hillclimb-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.5 MB
Release files / hillclimb-0.7.0.tar.gz
| Download URL | hillclimb-0.7.0.tar.gz |
|---|---|
| Size | 637.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c38e431cae745a7a9acccd6adb878e217f78b34cf25d6e9c0d020343acca3658
|
|
BLAKE2b-256 checksum How to use checksums |
5b1277d4c190909fe0c58d263587669b84e3b4aa150f4ff8b3379471e066fc31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Release files / hillclimb-0.7.0-py3-none-any.whl
| Download URL | hillclimb-0.7.0-py3-none-any.whl |
|---|---|
| Size | 833.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
34a445b9b577f1b8c86c4c2e558cb02edb8baa56a2179640c0cac72d6ee8f6d8
|
|
BLAKE2b-256 checksum How to use checksums |
35159a0374f3df32227517fe1f459b62233a7ed6cf3eea5b0fc60a99043658d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|