skip to content
Replays

Deferred Harness Model Selection

Harnesses Choose When Unpinned

Gantry stops forcing a main model unless the operator pins one.

Gantry milestones

0 milestones 3 tasks

2 plan 3 execute 3 review

47m 22s total 12m 36s per task

This run changed model selection from an implicit Gantry choice into an explicit contract. Heavy planning, building, and review work may now leave the main model absent so the selected harness can use its own configuration, while cheap utility work still receives a concrete small model from Gantry. The cut moved from configuration shape, to invocation behavior, to documentation, which kept the risky semantic change separate from the prose that explained it.

How this walkthrough is structured

Feature

What did the run build and ship?

Gantry now records absent main models as deferral, omits model flags for unpinned heavy work, and documents small-model defaults separately.

Build

How did Gantry structure the work?

The run held a cross-harness behavior change by landing the data shape first, proving invocation semantics next, and only then rewriting the public contract.

Optional Main Model Config

2 agents 14m 48s wall time

The live domain and harness configuration still distinguish a pinned main model from no main model, and agent tags carry no model when Gantry defers to the harness. The small-model field remains concrete in the resolved harness information, so utility work does not inherit the absence used by heavy stages. Some tests from the original commit were later moved or removed, but the optional value still appears in the core types and display paths.

This first sprint carried the foundation: the main model setting had to become optional without making utility stages ambiguous. That was small enough for a fresh agent because it centered on shared configuration, persisted run state, and consumers that previously assumed a concrete value. Its gate and review stayed green, which fits a boundary where the system shape changed before any harness invocation policy depended on it.

Harness Model Flag Behavior

2 agents 10m 32s wall time

Each harness implementation now checks the per-call model and the configured main model before adding its model flag, otherwise leaving the argv without that option. The role resolver also returns no per-call model for heavy roles when no pin exists, while utility roles still resolve the small model they will pass. Targeted assertions for omission, inclusion, and utility small-model handling remain in the harness and run tests, though the original sprint test files have since been reorganized.

The second sprint turned the optional field into command-line behavior for every registered harness. It was the sharpest boundary because each CLI has its own flag shape, yet the rule was uniform: pass a model only for a per-call value or an explicit pin. The run facts show extra gate confirmation after review rather than a repair cycle, which reads as the system rechecking the same behavior after reviewer attention.

Document Deferral Policy

2 agents 12m 36s wall time

The current harness guide says main work is harness-selected unless pinned and lists small-model defaults separately. The configuration reference exposes model deferral as the default for harness main models, and individual harness pages describe what happens when their environment variables are unset. Source comments in the harness modules now match that contract, including the rule that an absent main model means no model flag is emitted.

The final sprint was scoped to explanation after the behavior already existed. Its brief asked for user-facing docs and harness comments to stop describing Gantry as always choosing a main model, while preserving the special notes for Claude aliases and the OpenCode small default. Like the previous sprint, review was followed by another clean gate, so the documentation landed with the same behavioral suite still backing it.