Repository navigation
The Claude model is a required deployment setting; no literal default anywhere - #409
Conversation
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>
There was a problem hiding this comment.
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.
…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>
…uired # Conflicts: # CHANGELOG.md
There was a problem hiding this comment.
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).
…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>
There was a problem hiding this comment.
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>
There was a problem hiding this comment.
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.
…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>
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()returnsOUTERLOOP_CLAUDE_MODELor raisesClaudeModelUnsetwith a message naming the line to add. No Claude model literal remains undersrc/outerloop(a test scans the package).attemptauthor--model,steward --model), so an explicit--modelnever trips the error; a missing setting becomes a cleanparser.error, and the wake path releases its lease first.outerloop startrefuses at preflight (also--dry-run) when a Claude role is configured without the setting: a claude author withoutOUTERLOOP_AUTHOR_MODEL, a claude panel lens without an explicit model, or the steward. The message names the roles and the exact line.outerloop initrecords the model:--claude-model, else the shell's value, else a required prompt.OUTERLOOP_CLAUDE_MODELActions variable to the CLI (organization variable created inouterloop-scienceandagentic-learning-ai-lab, valueclaude-opus-5, visible to all repos). Operator-ordered edit of.github/.Deployments
OUTERLOOP_CLAUDE_MODELis 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.pypreflight refusal and resolution,tests/test_init.pyflag > shell > prompt. Full gate: ruff, format, mypy clean; 1829 passed, 2 skipped.🤖 Generated with Claude Code