structurehillclimb

Concepts

The hierarchy the UI and the on-disk metadata use.

The UI and on-disk metadata use this hierarchy, coarse to fine:

Run
└── Search
    └── Candidate
        └── Trial
            └── Replicate
  • Problem: reusable definition under problems/<id>/.
  • Run: one invocation of hillclimb. A single-problem run contains one search; a suite run contains one search per suite entry.
  • Search: one search worker (engine process) exploring one problem.
  • Candidate: an immutable code artifact produced by an operator. Any change to the code — however small — is a new candidate with a new id.
  • Trial: one parameter set of a candidate's code (params). A candidate that declares no tunable parameters has exactly one trial; a tuned candidate has several, and its score is the best trial's.
  • Replicate: one seeded execution of a trial. A trial's score is the median of its replicates, so seed variance is measured, never climbed.

hillclimb watch opens on the Runs screen. Metadata carries schema_version: 2; directories from the pre-v2 flat layout are ignored.

The four operators

Agents take turns as operators: draft a new approach, debug one that crashed, improve the best scorer so far, ensemble the survivors at the end. Every new candidate runs through your verifier, and the best solution.py is kept in the search's best/ folder.

hillclimb archive
archive tree
progress

one circle per candidate, filled by score and ringed by what the search did with it — the spine the policy walked, the scored-and-left, the failed — with the best starred and its lineage drawn bold

Candidate statuses

Candidate statuses separate correctness from executability: passing means the verifier and tests succeeded, failing means the verifier succeeded and the suite completed with failing tests, and buggy means execution crashed, timed out, or broke the evaluation contract. Failing and buggy candidates may be debugged, but only passing candidates can rank, tune, reach holdout, or ship.

Search states

running (fresh heartbeat + live pid) · parked (rate limit; resume later) · stopped (user stop/kill) · done · failed (see last_error) · crashed (derived: stale heartbeat or dead pid) · unknown (no status.json yet).

Exit code 2 from run/resume means the search parked or was stopped — resume it.