Skip to content

Setup offers Codex (#396) - #406

Merged
JacobStephens2 merged 3 commits into
issue-136from
issue-396
Oct 5, 2026
Merged

JacobStephens2 merged 3 commits into
issue-136from
issue-396

Conversation

@JacobStephens2

Copy link
Copy Markdown
Owner

Summary

Setup now offers Codex. Its Model and Effort questions show Codex's catalog and are checked against it, the same way a Run checks them.

 ask_harness
-  harness.unavailable()           # codex: "not supported yet"
+  harness.installed()             # only "not installed" is refused
   default = first installed       # claude when both, codex when only it
   Claude → ask_claude             # test call, as before
+  Codex  → Catalog::read()        # codex debug models
+           ├─ fails → say why; harness settings stay as they are
+           └─ ask_codex
+                say "Codex's Models: gpt-6.1-sol (GPT-6.1-Sol), …"
+                ask Model  until catalog.settle(model) ok    # unknown → asked again, choices shown
+                say "Efforts gpt-5.5 supports: low, medium, high, xhigh"
+                ask Effort until catalog.settle(model, effort) ok
+                write the slugs and Efforts as Codex names them

In harness.rs, Catalog is now public, with read, listed, efforts and settle. Choice::check_codex reads the catalog through it too, so a Run and Setup can't disagree about a Model or Effort.

Evidence

  • Before: Harness … claude or codex (not supported yet) [claude]: codex → codex is not supported yet: Codex sessions come in a later thirdshift.
    After: these new tests in tests/setup.rs fail on origin/issue-136 (they time out waiting for Model for codex) and pass here:
    • codex_is_offered_with_its_models_and_the_chosen_models_efforts: codex, gpt-5.5, high are written as default = "codex", model = "gpt-5.5", effort = "high".
    • with_only_codex_installed_codex_is_the_default_answer: the prompt is claude (not installed) or codex [codex].
    • a_codex_display_name_and_capitalised_effort_are_written_as_codex_names_them: GPT-6.1-Sol, Max are written as gpt-6.1-sol, max.
    • an_unknown_codex_model_or_unsupported_effort_is_asked_again_with_the_choices: gpt-7 gets choose one of gpt-6.1-sol, gpt-6-luna, gpt-5.5, and max on gpt-5.5 gets choose one of low, medium, high, xhigh.
    • the_codex_model_and_effort_default_to_the_current_ones_as_codex_names_them
    • when_codexs_catalog_cant_be_read_the_harness_is_left_as_it_was
  • cargo test: every binary is green. cargo clippy --all-targets -D warnings and cargo fmt --check are clean.

Merge Danger

Door: two-way

Only the interactive Setup questions changed. The User config's format is the same.

Blast Radius: Setup

Someone with codex installed now gets Codex's Model and Effort questions if they choose it. A Run's Codex errors also read slightly differently: codex debug models failed, so Codex's Models can't be read: ….

Unaddressed findings

Standards

  • Catalog is now public with four methods (interface widening). Skipped: Setup has to list the Models and Efforts, not just check them. Keeping CatalogModel private and returning choices keeps the surface small.
  • Catalog::read runs codex itself (dependency created rather than accepted). Skipped: parse is still the seam the unit tests use, and the integration tests use the fake codex.
  • listed() formats slug (Display name) in the domain type (Feature Envy). Skipped: formatting there keeps CatalogModel private. Otherwise its fields would have to be exposed.
  • Per-Harness match in ask_harness repeats the one in Choice::check (Repeated Switches). Skipped: one asks and the other checks, and with two Harnesses a trait would be speculative.
  • ask_claude/ask_codex loops share an ask → validate → retry shape (Duplicated Code). Skipped: Claude re-asks both settings together after one test call, while Codex re-asks each on its own. A shared helper would hide that difference.
  • CODEX_MODEL/CODEX_EFFORT sit beside MODEL/EFFORT in the tests. Skipped: renaming MODEL/EFFORT would touch dozens of unrelated tests.

Spec

  • Hidden Models are accepted but not listed. No change: the spec asks for answers to be checked "as a Run checks them", and a Run accepts them.
  • With no Model, the Effort question lists every Model's levels. No change: this matches how a Run settles an Effort without a Model.
  • gpt-5.5 (GPT-5.5) repeats itself when the names differ only in case. No change: the spec asks for "slug and display name".

Closes #396

🤖 Generated with Claude Code

JacobStephens2 and others added 3 commits October 5, 2026 01:44
With codex on PATH, Setup accepts it as the Harness, and it's the default
answer when it's the only one installed. For Codex, Setup lists the Models
codex debug models offers, by slug and display name, then the Efforts the
chosen Model supports. Each answer is matched as a Run matches it and
written as Codex names it; one the catalog doesn't have is asked again,
with the valid choices.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When codex debug models fails, Setup says so and leaves the harness
settings as they are, rather than asking the Harness again, which with
only codex installed could never end. The catalog's errors no longer
speak of checking, as Setup reads it to list the choices, and locals in
ask_harness and Catalog::efforts get names that say what they hold.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@JacobStephens2
JacobStephens2 merged commit 5f56c05 into issue-136 Oct 5, 2026
13 checks passed
@JacobStephens2
JacobStephens2 deleted the issue-396 branch October 5, 2026 06:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant