Skip to content

The Claude model is a required deployment setting; no literal default anywhere - #409

Merged
renmengye merged 14 commits into
mainfrom
feat/claude-model-required
Sep 19, 2026
Merged

renmengye merged 14 commits into
mainfrom
feat/claude-model-required

Conversation

@renmengye

Copy link
Copy Markdown
Member

Why

The owner's rule: no Claude model is hard-coded anywhere. PR #408 made the default configurable but kept "claude-opus-5" as the fallback. This removes the fallback: the model for Claude-backed roles is a required deployment setting.

What

  • default_claude_model() returns OUTERLOOP_CLAUDE_MODEL or raises ClaudeModelUnset with a message naming the line to add. No Claude model literal remains under src/outerloop (a test scans the package).
  • CLI defaults resolve after parsing (attempt author --model, steward --model), so an explicit --model never trips the error; a missing setting becomes a clean parser.error, and the wake path releases its lease first.
  • outerloop start refuses at preflight (also --dry-run) when a Claude role is configured without the setting: a claude author without OUTERLOOP_AUTHOR_MODEL, a claude panel lens without an explicit model, or the steward. The message names the roles and the exact line.
  • outerloop init records the model: --claude-model, else the shell's value, else a required prompt.
  • The tick lanes log "author misconfigured" / "panel misconfigured" / "stewardship not launched" with the same message instead of claiming work; the review and verify agent CLIs surface a clear skip.
  • Workflows: the verify and advisory-review reusable workflows no longer carry a literal input default; every agent job passes the OUTERLOOP_CLAUDE_MODEL Actions variable to the CLI (organization variable created in outerloop-science and agentic-learning-ai-lab, value claude-opus-5, visible to all repos). Operator-ordered edit of .github/.
  • Docs (install: configuration, quick start, Vertex section) and CHANGELOG under Unreleased with a Breaking line.

Deployments

OUTERLOOP_CLAUDE_MODEL is already set on Torch (claude-opus-5), cluster0 (claude-opus-5) and Alpha (claude-opus-4-8), so the merge changes no behavior there.

Tests

tests/test_default_claude_model.py (unset raises; stripped read; author and steward CLIs with explicit --model; refusal exit codes; panel lens paths; review/verify agent surfacing; tick lane messages; package scan), tests/test_start.py preflight refusal and resolution, tests/test_init.py flag > shell > prompt. Full gate: ruff, format, mypy clean; 1829 passed, 2 skipped.

🤖 Generated with Claude Code

renmengye and others added 7 commits September 18, 2026 08:36
default_claude_model() returns OUTERLOOP_CLAUDE_MODEL or raises
ClaudeModelUnset with the line to add; the literal model name is gone from
the package. The author and steward CLIs take --model with no parser
default and resolve it after parsing (an explicit --model needs no env);
a codex fleet resolves through fleet_author_model and gets the codex
diagnosis, not this one. The wake path releases its lease before refusing,
the panel turns the error into its usual panel-entry error, the tick's
author, panel and steward preflights name the missing setting instead of
claiming an issue, and the review/verify agents skip with the reason.

Tests run as a configured deployment (conftest sets claude-test-model)
and a scan keeps literal Claude model names out of src/outerloop.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
missing_claude_model reads the settings the way the tick will (shell over
.env, presence kept for the OUTERLOOP_PANEL off-switch) and names the
roles that need OUTERLOOP_CLAUDE_MODEL: a claude author without its own
OUTERLOOP_AUTHOR_MODEL, a claude panel lens without an explicit model,
and a provisioned steward lane. The message names the line to add;
--dry-run reports it too.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…, else a required prompt

The full setup insists on it (every Claude role reads OUTERLOOP_CLAUDE_MODEL
and the default panel runs Claude judges); --yes without either refuses
with the fix named. The focused --github-app run writes it only when
given, like the author config, and hints at the line otherwise.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
install.md (configuration, quick start, Vertex) and the CHANGELOG say the
built-in default is gone and deployments add the line; the manual review
bench's model input says the claude backend requires one (input or
OUTERLOOP_CLAUDE_MODEL) — text only, at the operator's order.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…aude model set)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ns variable; no literal default

Operator-ordered: the verify and advisory-review reusable workflows carried
claude-opus-5 as a workflow input default. The input now has no default and
every agent job passes the organization or repository variable
OUTERLOOP_CLAUDE_MODEL to the CLI, which reads it when the input is empty.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 1 — reviewed head 784e4033 — reviewer summarizer:hermes/gpt-5.6-terra over coverage+credentials+deployment+general+lifecycle+prose.

terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.

Verdict: 3 blocking, 1 advisory.

4 findings attached to the lines below.

Verdict: request changes. Blocking: pinned Claude resumes resolve the fleet model before loading their persisted model; steward .env configuration is omitted from model preflight; GitHub App setup can erase an existing required Claude model. Non-blocking: whitespace-only --claude-model values produce a config that later cannot run. Deduplicated agreement: coverage+deployment identified the whitespace-model defect, and general+lifecycle identified the steward-preflight defect. Rejected findings: none.

Comment thread src/outerloop/attempt.py Outdated
Comment thread src/outerloop/cli.py
Comment thread src/outerloop/init.py Outdated
Comment thread src/outerloop/init.py
@renmengye renmengye mentioned this pull request Sep 18, 2026
5 tasks done
renmengye and others added 3 commits September 18, 2026 11:14
…rides the tick env; init strips --claude-model

Round 1 of the advisory review: a --resume wake resolved the fleet's
model before loading its record, so a pinned Claude run failed on a
deployment without the setting; OUTERLOOP_STEWARD_KEY_FILE was in neither
TICK_ENV_KEYS nor the deploy forwarding, so a steward configured only in
.env was invisible to the start preflight; a whitespace-only
--claude-model passed the required check.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… lines, order, unmanaged keys

Round 1 (blocking): the focused run rewrote .env through render_env and
dropped the Claude model line when it was not in the shell. It now seeds
every unmanaged setting from the existing file and, when rewriting a
file that exists, edits it in place: managed values replaced where they
stand, dropped keys removed, new keys appended, everything else kept
verbatim. Changelog entries restored under Unreleased after the 0.2.0
release moved the section.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@renmengye renmengye added the outerloop:review re-request the advisory review label Sep 18, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 1 — reviewed head 26cb551e — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.

Verdict: nothing blocking — 1 advisory note.

1 finding attached to the lines below.

Full test suite passed (1843 passed, 2 skipped).

Comment thread src/outerloop/attempt.py
…ckend

Round 2: a parked claude record without a saved model, under a codex
fleet, ignored the model the operator typed and reached for the
deployment's Claude setting. resume_author() now takes the operator's
explicit model first, then the fleet model under a claude fleet, then
the shared default.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@renmengye renmengye added outerloop:review re-request the advisory review and removed outerloop:review re-request the advisory review labels Sep 18, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2 — reviewed head 3f99895a — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.

Verdict: 1 blocking, 0 advisory.

Release the wake lease when panel setup fails. A parked wake with a pinned author model but an unnamed Claude panel and no OUTERLOOP_CLAUDE_MODEL reaches this new ValueError path, and parser.error exits before the finally at line 4834 so its transferred lease remains until the TTL. (src/outerloop/attempt.py:4764; high confidence)

A failed panel setup in a parked wake leaves its transferred lease behind until it expires.

… model; a lens on another backend names its model

No judge runs on a model nobody chose. parse_lenses() takes the author's
backend as the default for a lens that names none, so a codex deployment
gets codex judges and a claude deployment claude judges. A lens without a
model inherits the author's model on the author's backend; on any other
backend it must be written kind:backend:<model>, and outerloop start
refuses otherwise (missing_panel_model). OUTERLOOP_CLAUDE_MODEL is asked
for only when a Claude role is actually configured.

Round 3: a --resume wake whose panel setup failed exited through
parser.error without releasing the run's lease; it releases first now.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@renmengye renmengye added outerloop:review re-request the advisory review and removed outerloop:review re-request the advisory review labels Sep 18, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 3 — reviewed head 237f2e43 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.

Verdict: 3 blocking, 0 advisory.

3 findings attached to the lines below.

Claude panel resolution and tick preflight disagree for resumed runs and explicit author models.

Comment thread src/outerloop/attempt.py Outdated
Comment thread src/outerloop/tick.py
Comment thread src/outerloop/tick.py Outdated
…rked run's author

Round 4: the inherit-or-name rule lived only in the climb, so the tick
preflight rejected a bare claude lens that would inherit the author's
model, accepted a model-less lens on another backend that the climb then
refused (stranding the claim), and the wake resolved lenses against the
fleet's author instead of the record's. panel.resolve_lenses() now owns
the rule; the climb, the wake (with the record's backend and model), the
tick preflight and the start preflight all call it, and parity tests
cover the three scenarios.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@renmengye renmengye added outerloop:review re-request the advisory review and removed outerloop:review re-request the advisory review labels Sep 19, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 4 — reviewed head c992d4a6 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.

Verdict: no defects found.

@renmengye
renmengye merged commit 692ffc4 into main Sep 19, 2026
5 checks passed
@renmengye
renmengye deleted the feat/claude-model-required branch September 19, 2026 02:14
@renmengye renmengye mentioned this pull request Sep 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

outerloop:review re-request the advisory review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant