Hide bundled harnesses from onboarding - #2233
Conversation
There was a problem hiding this comment.
I’m okay keeping the broader Install → Sign in → Ready redesign, moving preferred-harness selection to the defaults page, and auto-selecting when only one visible harness is ready, as long as these are treated as intentional onboarding UX changes rather than necessary fallout from hiding two harnesses. The centralized Claude/Codex onboarding allowlist is the right boundary. The latest commits also resolve the sign-in polling issue I found by clearing the wait state once the catalog reports Ready.
I’m requesting changes for the prerequisite regression, the lost acceptance coverage, and the save race below. I also left one boundary-test request and one non-blocking cleanup comment.
| ]); | ||
|
|
||
| React.useEffect(() => { | ||
| onHasDefaultRuntimeChange(selectedRuntimeId.length > 0); |
There was a problem hiding this comment.
🤖 Should Finish wait until the default harness save has succeeded? This state flips from the optimistic selected runtime, but the actual setGlobalAgentConfig save is queued asynchronously and errors are swallowed, so onboarding can complete with preferred_runtime still null or stale.
Updated by Codex 🤖
There was a problem hiding this comment.
🤖 Addressed in 75599d3. Finish now remains disabled while persistence is draining, awaits the latest coalesced save before completing, and keeps the user on the page with a retryable error if persistence fails. Added flush success/failure unit coverage and a delayed rapid-toggle E2E regression.
| const runtimeSaveChain = React.useRef<Promise<void>>(Promise.resolve()); | ||
|
|
||
| const persistHarnessSelection = React.useCallback( | ||
| const [readyRuntimeIds, setReadyRuntimeIds] = React.useState<string[]>([]); |
There was a problem hiding this comment.
🤖 Should this be seeded when the flow starts directly on the config page? reopenMachineConfig can mount MachineOnboardingFlow with initialPage="config", so Setup never reports ready IDs; this stays empty, the harness dropdown has no options, and Finish remains disabled until the user goes Back through setup.
Updated by Codex 🤖
There was a problem hiding this comment.
🤖 Addressed in 8a584a6. When the flow mounts directly on the config page without a Setup handoff, the defaults page now derives ready visible runtime IDs from the settled runtime catalog. The normal Setup handoff still takes precedence. Extended the existing first-community Back regression to verify the sole ready harness is selected and Finish is enabled.
wpfleger96
left a comment
There was a problem hiding this comment.
Re-reviewed the latest head 8a584a60e. The persistence race and direct-config reopening path are fixed with regression coverage; the focused onboarding suite restores the meaningful acceptance coverage; the existing Doctor smoke test pins Goose and Buzz Agent outside onboarding; and the PR summary now matches the Ready-pill UX. Accepting the Git Bash removal as the intentional product-scope decision described in the thread.
…cache * origin/main: feat(desktop): fuzzy emoji shortcode autocomplete (#1945) Revert "feat(relay): inventory unreachable Git objects" (#2275) feat(relay): inventory unreachable Git objects (#2264) Keep avatar preview visible during upload (#2237) fix(desktop): keep machine onboarding for unrecognized identities after reset (#2244) fix(managed-agents): stale harness pin shadows runtime edits; add Restart quick action (#2252) fix(desktop): surface model discovery failures in agent config UI (#2246) Hide bundled harnesses from onboarding (#2233) relay: add author_type label to buzz_events_stored_total (#2243) fix(justfile): use Hermit-pinned lefthook in hooks recipe (#2241) Refresh README screenshots (#2236) fix(acp): pace relay observer frames (6/s + 90/min, zero burst) (#2217) Restore npub copy option for private community joins (#2232) fix(desktop): align onboarding runtime auth (#2229) fix(desktop): survive degraded networks with rate-limit-aware relay client (#2197) fix(cli): retry transient relay failures and raise timeouts (#2196) feat(desktop): browse immutable repository tags (#2231) Update built-in agent avatars (#2215) cleanup old AI doc (#2227) chore(release): release Buzz Mobile version 0.4.11 (#2225)
* origin/main: (24 commits) feat(relay): log NIP-98 pubkey attribution on HTTP bridge requests (block#2206) fix(ci): don't rebuild relay tests on every run (block#2203) fix(desktop): refresh cached channel member names (block#2258) chore(release): release Buzz Desktop version 0.4.22 (block#2220) feat(desktop): fuzzy emoji shortcode autocomplete (block#1945) Revert "feat(relay): inventory unreachable Git objects" (block#2275) feat(relay): inventory unreachable Git objects (block#2264) Keep avatar preview visible during upload (block#2237) fix(desktop): keep machine onboarding for unrecognized identities after reset (block#2244) fix(managed-agents): stale harness pin shadows runtime edits; add Restart quick action (block#2252) fix(desktop): surface model discovery failures in agent config UI (block#2246) Hide bundled harnesses from onboarding (block#2233) relay: add author_type label to buzz_events_stored_total (block#2243) fix(justfile): use Hermit-pinned lefthook in hooks recipe (block#2241) Refresh README screenshots (block#2236) fix(acp): pace relay observer frames (6/s + 90/min, zero burst) (block#2217) Restore npub copy option for private community joins (block#2232) fix(desktop): align onboarding runtime auth (block#2229) fix(desktop): survive degraded networks with rate-limit-aware relay client (block#2197) fix(cli): retry transient relay failures and raise timeouts (block#2196) ...
> [!NOTE] > **Part 1 of a multi-PR onboarding rework.** This PR only restores the hidden harnesses, adjusts the card layout, and gates onboarding completion on valid config. A follow-up PR (stacked on this branch) restructures the flow: the harness page becomes a single-choice "pick your default harness" step, and install/sign-in/provider setup moves to the following page. Review this one on its own terms — the flow rework is intentionally not here. ## Summary - Restore **Goose** and **Buzz Agent** to onboarding harness selection, reverting the launch-only restriction from #2233 - The restore is the single centralized allowlist (`ONBOARDING_RUNTIME_ORDER` in `onboardingRuntimeSelection.ts`) that #2233 deliberately set up for this moment — setup cards, readiness handoff, and the defaults harness picker all derive from it - Lay the four harness cards out as a single row at `lg` and above (`lg:grid-cols-4`); below 1024px (including the app's 800px minimum window width) the grid is 2×2, and 1-up on narrow viewports - **Gate onboarding Finish on actual config validity** (review finding): the defaults page rendered provider/model/credential fields for provider-required harnesses but Finish only checked that a harness was selected — a fresh user picking Buzz Agent could persist a default that fails at first spawn. The Finish gate now consumes `AgentConfigFields`' existing `onValidityChange` signal. Baked build env and runtime-file config satisfy the gate, so internal builds and existing Goose users are never blocked - Update the unit + E2E specs that pinned the hidden behavior, plus two new E2E cases pinning the Finish gate (blocked-until-configured, and baked-env never blocked) - AGENTS.md rule 7 updated to document the completion gate ## Testing - `onboardingRuntimeSelection.test.mjs` — 4 passed - `pnpm typecheck` — clean - `pnpm exec playwright test tests/e2e/onboarding-agent-defaults.spec.ts --project=smoke` — 21 passed - `onboarding-docked-cta-screenshots.spec.ts` — 3 passed - Biome — clean ## Known cosmetic issue (deferred to PR 2) At the app's minimum window size (800×500) the 2×2 grid extends past the visible area and the footer CTA overlaps card space. Next still hit-tests correctly. PR 2 redesigns this page entirely (cards become a single-choice chooser with no inline setup), so this is deferred rather than patched twice. --------- Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Summary
Testing
pnpm typecheckpnpm build:e2epnpm exec playwright test tests/e2e/onboarding-agent-defaults.spec.ts --project=smoke— 15 passednode --import ./test-loader.mjs --experimental-strip-types --test src/features/onboarding/ui/onboardingRuntimeSelection.test.mjs— 4 passednode --import ./test-loader.mjs --experimental-strip-types --test src/features/onboarding/ui/saveCoalescer.test.mjs— 9 passedpnpm exec playwright test tests/e2e/onboarding-docked-cta-screenshots.spec.ts --project=smoke— 3 passed