Repository navigation
feat(goose): save a Thinking level and match the Claude/Codex profile - #1250
Conversation
goose agents can now keep a Thinking level. The levels come from the config options of a goose session on the agent's provider and model. The level is applied with session/set_config_option thinking_effort, and a session that had a level set is reopened when the agent goes back to goose's own default. The goose Settings tab now uses the split Identity/Runtime layout that Claude and Codex use. Identity is a grouped card with Harness, Provider, Model and Thinking. Provider keys, the workspace and sessions are under Runtime. The agent type row is renamed to "Harness", and goose's "Model provider" is now "Provider". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Salman Mohammed <smohammed@squareup.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: beebcaa806
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| live.fingerprint !== this.options.fingerprint() || | ||
| Boolean(live.session.effort && !this.options.choice().effort) |
There was a problem hiding this comment.
Reopen before running a queued default-effort turn
When the owner clears Thinking while a session is busy, reconfigure() leaves the live session open; if another message specifying a different per-message model arrives before the first turn finishes, send() queues it instead of steering it. select() cannot unset the session's previous chosen.effort, so that queued next turn runs at the old explicit level even though the saved setting now says to use goose's default. Ensure a pending default reset makes queued turns wait for a reopened session.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
🤖 Leaving this as is, deliberately. The race is real but narrow: Thinking has to be cleared mid-turn, and a message has to be queued rather than steered, which only happens when it asks for a different model or arrives as the turn ends. At worst one turn runs at the previous level, and the session closes once it falls idle.
The settings that need a new session (workspace, instructions, scope, team, name in fingerprint()) already work this way: a busy session keeps running its queued turns and closes when it next falls idle, as reconfigure() documents. Making queued turns wait for a reopened session would add machinery, and if we want it, it should cover those settings too, in a separate change.
| const [listing, reload] = useRead(() => setup.providers(), "providers"); | ||
| const id = choice.provider || listing.value?.defaults.provider; | ||
| const provider = listing.value?.providers.find((item) => item.id === id); |
There was a problem hiding this comment.
Restore provider discovery error recovery in Runtime
In the new Runtime section, when setup.providers() rejects—for example because goose transiently fails to start—listing.status is ignored and provider remains undefined, so all provider key/sign-in UI silently disappears while only Test connection remains, with no error or retry action. The previous ProviderFields path surfaced the failure and a Try again button; restore equivalent scoped recovery here as required by the states guidance in src/shared/design-system/DESIGN.md:220-228.
AGENTS.md reference: AGENTS.md:L46-L51
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
🤖 Fixed in 300748a. When goose cannot list providers, ProviderSetup now shows the error next to a Try again button that reads the list again, the same pattern ProviderKeys uses. The new test "says in Settings when goose cannot list providers, and tries again" covers it. It fails without the fix.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Salman Mohammed <smohammed@squareup.com>
The Runtime section dropped the provider's keys without a word when goose failed to list providers. It now shows the error and Try again, as the combined view did before the split. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Salman Mohammed <smohammed@squareup.com>
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Approval submitted at the user's direction for commit 300748a.
Review: the documentation-only delta at 08ea6b4 introduced no new actionable findings. The latest delta adds the missing Runtime provider-discovery error and retry UI, with a regression test; source inspection confirms the error state exposes the existing reload action.
Remaining findings from the earlier review: queued Default reset can miss the next turn, and effort-discovery RPC/process lifetime remains unbounded. This approval does not assert those issues are resolved.
Validation: prior independent static, security and integration source checks; latest delta inspected, new test not run. Browser/native workflows remain unverified because permitted web startup requires Keychain access and Goose registration requires Tauri.
Main fails typecheck since #1250 made effort required and #1185 added this fixture without it. Same one-line fix as in #1257 and #1260. Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Signed-off-by: Logan Johnson <loganj@squareup.com>
…ui-polish * buzz-app/main: test(agents): fix main typecheck — add effort to Goose fixture (#1262) fix(messages): reject unclaimed file and link drops app-wide (#1075) feat(channels): create and read system channels (#965) Refine message layout and bubble reading widths (#1218) feat(goose): save a Thinking level and match the Claude/Codex profile (#1250) Signed-off-by: Taylor Ho <taylorkmho@gmail.com>

Summary
goose agents can now save a Thinking level, as Claude Code can since #1089. goose itself supplies the levels: each one comes from the
thought_levelconfig option of a goose session opened on the agent's provider and model. Nothing is hardcoded in Buzz.The goose agent profile also now matches Claude Code and Codex.
Thinking level
GooseSetup.efforts(choice)gets the levels from a short-lived session with no tools. It sendssession/new, thenset_config_option modelwhen a model is set, then deletes the session. The result is cached per provider and model, and the cache is cleared when a provider is saved.GooseSession.select()setsthinking_effortafter the provider and model. goose keeps the level across model and provider changes.stale()insessions.ts).GOOSE_THINKING_EFFORT.Profile layout and labels
splitSettings, the same as Claude and Codex.Testing
tsc,biome lintanddesign:checkare clean.setup.test.ts: theefforts()read, cache, and cleanup.sessions.test.ts: the level is applied, and the session reopens on the default.runtime.test.ts: the level is part of the agent's choice.tabs.test.tsx: saving a level, an unavailable level, and the Identity/Runtime split.goose.live.test.ts: a live thinking-level test passed against goose-acp 1.50.buzz-review-completed
🤖 Generated with Claude Code