Skip to content

fix(goose): say a provider isn't set up instead of offering placeholder models - #1543

Merged
salman1993 merged 6 commits into
mainfrom
opus/goose-unconfigured-provider
Oct 23, 2026
Merged

salman1993 merged 6 commits into
mainfrom
opus/goose-unconfigured-provider

Conversation

@salman1993

@salman1993 salman1993 commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Problem

goose reports a provider it can't reach, such as Databricks without DATABRICKS_HOST, as configured: false, but still lists its static catalog. GooseSetup.models() returned that catalog, so the model picker in New agent and the Goose default picker looked healthy. They showed two placeholder models and gave no hint that the provider wasn't set up. Baxen hit this.

Change

  • models() throws for a listed provider that is missing a required field with no default, or that signs in but isn't signed in. The message names each missing field by its form label and its key, as in "Databricks AI Gateway isn't set up in goose. Add Host (DATABRICKS_HOST) in Edit configuration, or run goose configure." A signed-out provider gets "… Run goose configure to sign in."
    • goose also reports Ollama as not configured when OLLAMA_HOST is unset, even though Ollama runs on its localhost default. Because that field has a default, Ollama is not treated as missing a field, and it keeps its models.
  • CreateModel and DefaultControl already show read errors through ModelDiscoveryRecovery, which has a "Try again" button. The error keeps the cached provider list, so cards and controls on a provider that isn't set up don't start goose again on every read.
  • In CreateModel, "Try again" rechecks goose, which re-reads the provider list and defaults as well as the models, and shows pending right away. After someone fixes setup outside Buzz with goose configure, the inherited default the picker shows then matches the model that actually runs.
  • In Settings' Harness defaults, "Try again" re-reads only the models. The control shows only when the default provider is set up, and a recheck that ended in attention would replace it and lose keyboard focus.
  • picks(), which feeds the runtime and huddle model lists, skips a provider that isn't set up and offers only the agent's current model. It does not throw, so one agent that isn't set up can't break the huddle composer's choices for the other agents.

Testing

  • Full vitest run: 11,342 passed. tsc and biome are clean.
  • New and updated tests in setup.test.ts and tabs.test.tsx. They fail on main and pass with this change.
  • tabs.test.tsx covers retry through the Harness defaults host: focus stays on the recovered picker when a recheck would have needed attention. It also covers retry showing pending without waiting for the recheck. Both fail on the previous head and pass now.
  • Not yet tried in the running app.

🤖 Generated with Claude Code

@salman1993
salman1993 marked this pull request as ready for review October 22, 2026 16:55
@salman1993
salman1993 requested a review from a team as a code owner October 22, 2026 16:55
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-22T17:01:27.651344Z 47b4cda Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 47b4cdacb7

ℹ️ 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".

Comment thread src/bundled/goose/setup.ts Outdated
Comment on lines +477 to +479
return provider.configured
? []
: provider.keys.filter((key) => key.required && !key.default);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Treat default-backed providers as ready throughout the UI

When goose reports Ollama as configured: false but supplies a default for every required field, this helper now lets models() and picks() use it, but the rest of the Goose integration still tests provider.configured directly. In particular, check() leaves readiness at attention, ProviderFields disables model selection, and AgentSettingsHost refuses to complete a harness migration unless readiness becomes ready; consequently a provider this change considers runnable still appears unconfigured and cannot be selected when migrating an agent. Promote this default-backed state into the shared readiness/configured predicate and use it consistently.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🤖 Not addressing this in this PR. On main, check(), ProviderFields and the migration gate already use provider.configured directly. For Ollama without OLLAMA_HOST, this PR doesn't change any of them. It only stops models() and picks() from showing placeholder models for a provider that can't run, and keeps Ollama's models as they are on main. Making default-backed providers count as ready also changes the "Set up Goose" attention badge and migration readiness. That's a separate product change, so it should be its own PR.

Comment thread src/bundled/goose/setup.ts Outdated

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) reviews.

No actionable source defects found. Source assessment: 9/10 for minimalness, elegance, and correctness. The change reuses GooseSetup and ModelDiscoveryRecovery, guards cache invalidation by promise identity, preserves default-backed providers, and refreshes inherited defaults on New agent retry. Reviewed all four changed files and supported callers, including failure/retry focus and process cleanup.

Optional wording improvement: setup.ts:270–273 names raw configuration keys, while the Edit configuration fields use keyLabel() (tabs.tsx:656–659). Consider showing the friendly field label alongside the raw key so the recovery instruction matches the dialog.

Validation limits: source only; no tests, builds, or app execution. New coverage uses the existing service and mounted-component test layers; no browser cases were added or removed. The author’s fail-before/pass-after and full-suite reports were not reproduced. A limited check-run snapshot at 17:03 UTC showed failures in Chromium 3/9 and WebKit 4/12 and other jobs still running; causes were not investigated, so this is not a CI-green or runtime-readiness assessment. Native Goose provider metadata was assessed from client types/fixtures, not independently verified upstream. Rendered themes, sizing, accessibility, real provider recovery, and human acceptance remain unverified. Public PR description and commit messages inspected; no attached images or evident disclosure issue found.

Reviewed head: 47b4cda
Base / merge base: 3d23acb

This COMMENT is advisory source feedback, not an approval or merge authorization.

@salman1993

Copy link
Copy Markdown
Contributor Author

🤖 @wesbillman Applied your wording suggestion in a57efe9. The message now names each field by its Edit configuration label and its key, for example "Add Host (DATABRICKS_HOST) in Edit configuration, or run goose configure." The red browser journeys are the settings.spec.mjs catalog-scroll test, which also fails on main. #1551 fixes it.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated follow-up source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) reviews.

No actionable defects found in the follow-up since 47b4cda. Source assessment: 9/10 for minimalness, elegance, and correctness. The earlier optional label suggestion is addressed: recovery names the same field labels as Edit configuration, with the configuration keys alongside them. The signed-out-provider fix reuses the existing provider metadata and recovery UI; models() rejects with setup guidance, while picks() preserves the current model without offering the unusable catalog. Default-backed providers remain supported. Inspected the three-file follow-up and its supported callers, cache invalidation, lifecycle, and error/retry focus behavior.

Validation limits: source only; no tests, builds, app launches, or live Goose execution. The added service test covers the signed-out case and current-model fallback; mounted-component assertions were updated for the labels. No browser cases were added or removed. The author’s test counts and fail-before/pass-after claims were not reproduced. A single current-head CI snapshot at 17:26 UTC showed work still running/queued, successful completed checks, and skipped Windows/browser-flake lanes; this does not establish CI completion. Native provider metadata/auth semantics, rendered accessibility/themes, runtime performance, and human acceptance remain unverified. Public PR description and all three commit messages inspected; no attached images or evident disclosure issue found.

Reviewed head: a57efe9
Base / merge base: 3d23acb

This COMMENT is advisory source feedback, not approval or merge authorization.

salman1993 and others added 3 commits October 22, 2026 13:46
…er models

goose lists a provider it can't reach (Databricks without DATABRICKS_HOST)
as `configured: false` with its static catalog. The model pickers showed
that catalog as if it were usable. `models()` now throws an error naming
the missing keys, which the pickers show with Try again, and `picks()`
offers only the model the agent names.

Co-authored-by: Opus <f038cc09b32a776e7d95b65c267e9d851777ee2b6cdbd46a48edba01b1d10ebd@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Salman Mohammed <smohammed@squareup.com>
…retry

goose lists Ollama as not configured without OLLAMA_HOST, though it runs
on localhost's default. Only a required field without a default now
counts as missing. Try again in the New agent model field also re-reads
goose's defaults, so the inherited default shown matches what runs.

Co-authored-by: Opus <f038cc09b32a776e7d95b65c267e9d851777ee2b6cdbd46a48edba01b1d10ebd@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Salman Mohammed <smohammed@squareup.com>
…m does

A provider that only signs in has no fields to miss, so it offered its
catalog while signed out. It now asks to sign in with goose configure.
The message names each field by its form label and key, as
"Host (DATABRICKS_HOST)".

Co-authored-by: Opus <f038cc09b32a776e7d95b65c267e9d851777ee2b6cdbd46a48edba01b1d10ebd@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Salman Mohammed <smohammed@squareup.com>
@salman1993
salman1993 force-pushed the opus/goose-unconfigured-provider branch from a57efe9 to 533c0f1 Compare October 22, 2026 17:47

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated follow-up source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) coverage.

No new actionable findings in this rebase/integration review. Source assessment: 9/10. The three feature commits are patch-identical to the previously reviewed revision a57efe9; the endpoint tree changed through upstream integration. We checked the changed integration surface and the provider/model discovery callers, cache invalidation, runtime fallback, and retry behavior. The shared recovery control retains focus during loading/error and returns it on success only while it still owns focus.

Reviewed head: 533c0f1. Target base: 6dd1d4d. Merge-base: 0f7dd73. The PR feature diff is four Goose files; newer unread changes on the target branch are not removals introduced by this PR. The public description and three commit messages were inspected; no attached images or evident disclosure issue.

Validation limits: source only; no tests, builds, app launches, or PR code executed. Added service and mounted-component coverage was inspected, not run; the reported fail-then-pass evidence was not reproduced. No browser cases are added or removed by this feature patch. A single hosted-check snapshot at 17:58 UTC showed completed checks passing, three WebKit shards still running, and Windows native/browser flake checks skipped. Native provider authentication, rendered accessibility, performance, and human acceptance remain unverified. This COMMENT is not an approval or merge authorization.

- A provider carries the reason it isn't set up (`needs`), built with it;
  `models()` and `picks()` read it instead of recomputing it.
- `models()` no longer drops the cached listing when it throws, so cards
  and controls on a provider that isn't set up stop respawning goose.
  Retry refreshes through `setup.check()`, as Settings' Try again does.
- Tests set providers up through the fake's saved fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Salman Mohammed <smohammed@squareup.com>

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 Star Lord’s automated follow-up source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) reviews.

One P3 finding is attached inline: preserve focus when the new Retry setup check replaces the Harness defaults control with its attention action. Source assessment: 8/10 until that recovery transition is repaired. The provider-needs calculation, explicit cache refresh and current-model fallback otherwise retain the intended behavior.

Optional follow-ups:

  • In CreateModel (tabs.tsx:1086–1090), include the setup.check() phase in pending feedback. models.status remains error until check resolves and refresh runs, so a slow retry appears idle during the native round trip. Concurrent checks are deduplicated; this is feedback polish.
  • Update the PR description’s statement that a models error clears the cached listing. The current revision deliberately retains it and refreshes through check() on Retry.

Reviewed head: 6c39e21
Target base: 6dd1d4d
Merge-base: 0f7dd73

This follow-up covers the three-file delta since previously reviewed 533c0f1 and its supported callers. Public PR description and four commit messages inspected; no attached images or evident sensitive disclosure.

Validation: immutable source/diff, relevant product/design guidance, and whitespace checks only. Existing service and mounted-component tests were inspected; no browser cases were added or removed. No tests, builds, apps or PR code were executed, and the author’s test results were not reproduced. One hosted-check snapshot at 20:57 UTC showed 26 successful, two skipped, seven running and one failed Vitest flake check; its annotations only report exit code 1, so cause and eventual CI outcome remain unverified. Native provider behavior, rendered focus/accessibility, themes/layout, measured performance and human acceptance remain unverified. This COMMENT is advisory feedback, not approval or merge authorization.

Comment thread src/bundled/goose/tabs.tsx Outdated
- Harness defaults' Try again re-reads models again instead of rechecking
  goose. It shows only while ready, so its provider is set up; a recheck
  that settled on attention made the host replace the control and drop
  keyboard focus.
- New agent's Try again refreshes while the recheck runs, so it shows
  pending at once instead of after goose answers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Salman Mohammed <smohammed@squareup.com>

@johnmatthewtennant johnmatthewtennant left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 Reviewed exact head adcca38c3bf11cfa1ebcdb6371d1bff81707e2b7 with the completed review fanout and a cross-check of existing discussion. No correctness blockers found.

The full Vitest suite passed. Live Goose configuration recovery and native desktop acceptance were not exercised. CI required is red after the Rust/tool-integration job was cancelled; this approval does not establish merge readiness.

…ed-provider

Signed-off-by: Salman Mohammed <smohammed@squareup.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@salman1993
salman1993 merged commit f4e9577 into main Oct 23, 2026
68 of 71 checks passed
@salman1993
salman1993 deleted the opus/goose-unconfigured-provider branch October 23, 2026 23:27
joelrobotham pushed a commit to joelrobotham/buzz-app that referenced this pull request Oct 24, 2026
…ocus

* origin/main: (35 commits)
  fix(goose): say a provider isn't set up instead of offering placeholder models (block#1543)
  fix(agent-activity): note under a message when its agent was stopped (block#1544)
  feat(messages): show whose agent wrote a message (block#1502)
  feat(agents): put main agent choice in the card's actions menu (block#1530)
  fix(relay): let live dev connections save config artifacts (block#1583)
  feat(builderlab): let local agents create, deploy, share and open Builderlab apps (block#1340)
  Unify chat and channel access, tidy the Solo chat menu (block#1446)
  fix(todos): render nested TODOs with collapsible hierarchy and Markdown (block#1483)
  fix(agents): Allow agents to propose updates to agents (block#1478)
  fix(composer): prevent plugins from updating the recipient on a WIP draft message (block#1497)
  fix(agents): can't delete an agent belonging to an archived channel (block#1560)
  Bump tokio to 1.53.3 for RUSTSEC-2026-0386 (block#1581)
  Unify attachment cards with neutral icon tiles (block#1548)
  Polish edit context, channel join and profile actions (block#1545)
  fix(claude-code): keep context across channel threads (block#1516)
  fix(builderlab): let Create agent cancel a pending browser sign-in (block#1526)
  test(sidebar-filters): start the focus journey on General (block#1555)
  Add opt-in native MCP for macOS tests (block#1528)
  Show unreads for channels after access changes (block#1550)
  Deliver artifact changes through shared live routes (block#1480)
  ...

Signed-off-by: user-kWN3CIVowEvEo3RM <joelrobotham+bbprod@gmail.com>

# Conflicts:
#	tests/browser/github-body.spec.mjs
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.

3 participants