Models and presets

How the harness picks a model for each role from its runtimes and tag registry, the default tags per role, model pins, the six shipped presets and the conductor's model and effort

This page says how a run's roles get their models and what the shipped presets change. File:line citations are in parentheses; "not checked" means the code read for this page does not settle it. The key tables are on harness.json, not repeated here.

01runtimes#

The work runtimes are claude, codex and grok (RuntimeNames; RegistryRuntimes). A registry entry on any other runtime is refused. DetectRuntimes asks each one's probe whether it can start, and a runtime with no probe is reported "no readiness probe". What each probe checks: not checked.

internal/runtime/ollama.go and internal/runtime/anthropic.go are provider adapters (OllamaProvider at, AnthropicProvider at). They are not in RuntimeNames, so a run's roles cannot use them. Where they are used instead: not checked.

02the registry#

Every model the instance can run is a registry entry: a runtime, a model id, tags and a rank (ModelEntry). The tags are a fixed list: reasoning, code, review, creative, fast, cheap and long-context. Any other tag is refused. A higher rank wins, and the order of the entries breaks a tie.

The shipped pool is six entries (DefaultRegistry). An instance changes it with the model_registry key, see model_registry (RegistryConfig):

The result is validated, and a bad registry fails closed.

03role tags#

Each role asks the registry for the models carrying all of its tags. The defaults are DefaultRoleTags. The role_tags key changes them, see role_tags.

role default tags
intake code,fast
plan reasoning
work code
review review
close fast,cheap

Roles are picked in the order intake, plan, work, review, close, so review is picked after work (roleOrder).

04presets#

A preset is a named set of quality knobs a ticket run launches with. It turns quality dials only: nothing in a preset removes the human gate, the checks, the completion proof or the land. A preset names no model unless a role is pinned; each role is matched by its tags inside the preset's level.

A level is a rank band in the registry plus an effort. floor is the lowest rank a match may have, prefer says whether the strongest (highest, the default) or the cheapest (lowest) entry in the band wins, and effort is one of low, medium, high, max. Effort is passed only to claude and codex. An effort asked of any other runtime is recorded as not applied.

DefaultPresets ships six:

preset level role_tags routes (challenge, review, second_review) max_revise_loops budgets limits
quick floor 0, lowest, effort low plan asks code off, off, off 1 200000 output tokens, 10 searches; max_asks 1 every role: 4 MiB output, 30m deadline
balanced floor 0, highest none off, off, off 2 none none
thorough floor 70, highest, effort high none auto, auto, auto 2 1000000 output tokens, 40 searches every role: 16 MiB output, 60m deadline
max floor 70, highest, effort max none auto, auto, auto 3 4000000 output tokens, 100 searches every role: 32 MiB output, 90m deadline
lean floor 0, lowest none off, off, off 2 none none
heavy floor 0, lowest work asks code,reasoning off, off, off 2 none none

05the conductor's model and effort#

The conductor's chats are moved with two desk tools:

The conductor's default effort is the conductor_effort key in desk.json, see desk.json.