Repository navigation
fix(coding-agent): default GitHub Copilot to GPT-6.1 Sol after GitHub's model deprecations - #3815
Merged
Merged
Conversation
… deprecated
Since about 04:40Z on 2026-10-21, models.dev marks ten GitHub Copilot models
deprecated, and the generated catalog drops them. Five packages/ai tests passed
those IDs to the catalog-typed getModel("github-copilot", ...), so every fresh
build failed `npm run check` with eight TS2345 errors, on main and on every
branch.
Each test now uses the nearest current Copilot model with the same API and the
same image and reasoning support: claude-opus-4.7 -> claude-opus-4.8,
gpt-5-mini -> gpt-5.4-nano, gpt-5.5 -> gpt-5.6-sol. The tests cover API
behaviour, not those models, so their assertions are unchanged. OpenAI-provider
references to gpt-5-mini and gpt-5.5 still resolve and are untouched.
Assistant-model: Claude Opus 5.5
Assistant-workflow: inline
Assistant-duration: 15m converged, estimated 20m
Assistant-verification: bun typecheck failed before and passed after: packages/ai typecheck on origin/main 7f41ca8 with a freshly generated catalog (8 TS2345 errors -> 0)
Assistant-verification: vitest packages/ai passed: the 5 affected files (61 passed; 3 live-provider files skipped without a Copilot token)
Assistant-verification: npm run check passed: biome, typecheck, shrinkwrap
Co-authored-by: Norin Lavaee <nlavaee@umich.edu>
…4's deprecation GitHub deprecated GPT-5.4, GPT-5.5, GPT-5.4 mini, GPT-5 mini and other Copilot models on 2026-10-19, and models.dev dropped them from the generated catalog. The Copilot default was GPT-5.4, so a Copilot login had no usable default and the "built-in chat providers have defaults in their generated catalogs" test failed, along with nine other coding-agent tests that looked up the removed models by ID. The default is now GPT-6.1 Sol, GitHub's suggested replacement for GPT-5.4 (github.blog changelog, 2026-10-19). Copilot CLI itself starts in Auto and no longer has a fixed default to follow. Tests follow GitHub's table: gpt-5.4/gpt-5.5 -> gpt-6.1-sol, gpt-5-mini -> gpt-6-luna. The previous commit's packages/ai swaps are realigned to it. The fast-ID entitlement test uses claude-opus-5-fast in place of claude-opus-4.7-fast. The extended-retention case that needs a listed OpenAI ID keeps it on a Copilot model fixture, as that test already does for dated IDs, without claiming GPT-6 retention support. Assistant-model: Claude Opus 5.5 Assistant-workflow: inline Assistant-duration: 1h 5m converged, estimated 20m Assistant-verification: vitest coding-agent failed before and passed after: fast-model-variants, model-resolver-initial, sdk-cache-retention, model-registry-base-url-overrides (10 failing -> 0 against a freshly generated catalog) Assistant-verification: npm run test --workspace=@bastani/atomic passed: 745 files, 6559 tests Assistant-verification: vitest packages/ai passed: 190 files, 1970 tests Assistant-verification: npm run check passed: biome, typecheck, shrinkwrap Assistant-verification: vitest unit failed: 30 tests in 17 storage/journal/builtin-bundle files, failing identically with this change stashed (stale build in this worktree); CI builds from scratch User-preference: use the model GitHub designates as the replacement when a provider default is deprecated Co-authored-by: Norin Lavaee <nlavaee@umich.edu>
greptile-apps
Bot
dismissed
their stale review
October 21, 2026 04:59
Dismissed because a newer commit was pushed; Greptile will re-review the current head.
flora131
added a commit
that referenced
this pull request
Oct 21, 2026
…e caller timed out A refresh's caller stops waiting after OAUTH_REFRESH_TIMEOUT_MS (request auth after REQUEST_AUTH_PREPARATION_TIMEOUT_MS, 15 s), while the token exchange, its commit and the late persist kept running untracked. A process that then exited through process.exit (RPC shutdown, which the interactive engine and subagent runners use; `atomic auth`; package commands; the interactive and print-mode signal handlers) dropped a rotation the provider had already completed, leaving the replaced refresh token in auth.json, and the next process got invalid_grant. With a token endpoint that never answered, `atomic -p` did not exit at all: the exchange, which Atomic no longer aborts, kept the event loop alive (still running 176 s after its request failed). - pi-ai tracks every started token exchange until its commit or late persist settles. New export drainPendingOAuthRotations(timeoutMs = OAUTH_SHUTDOWN_DRAIN_MS) waits for them, at most OAUTH_SHUTDOWN_DRAIN_MS (3 s), resolves true when none is left and false when the bound passes, and never rejects. Abrupt termination (SIGKILL, a crash, power loss) is out of scope and documented at the constant: /login <provider> recovers. - AgentSessionRuntime.dispose(), which interactive quit and signals, RPC shutdown and print mode (end and SIGTERM/SIGHUP) all run before exiting, drains within the bound measured from the start of disposal, so an interactive engine stays inside the host's 5 s ENGINE_SHUTDOWN_GRACE_MS. `atomic auth` and package commands drain before their process.exit. After print mode, an exchange still running past the drain is hung, so the process exits instead of waiting on it. - Not covered on purpose: crash and dead-terminal exits (uncaughtCrash, emergencyTerminalExit, handleFatalRuntimeError), a repeated signal during RPC shutdown, startup-error exits before a runtime exists, and SIGINT in print and RPC mode, which Atomic does not handle. `atomic config` and `atomic mcp` end by natural exit. - Docs: the extension API reference, custom-provider OAuth guide and the ExtensionOAuthConfig.refreshToken JSDoc no longer describe a 60-second rotation timeout signal. The signal is never aborted on a timeout, a late result is saved, a normal exit waits briefly, and refreshers must not add their own abort. providers.md (Token Refresh) and sdk.md (runtime.dispose) describe the exit wait and the /login recovery. Assistant-workflow: goal (run c69320d9-174e-43d4-bab7-e8841600cd91) Assistant-model: Claude Opus 5.5 Assistant-verification: npx vitest --run test/auth-storage-oauth-rotation-recovery.test.ts -t "graceful shutdown|hung token exchange" (packages/coding-agent) against af26e9d66 sources (dist rebuilt, OAUTH_SHUTDOWN_DRAIN_MS pinned to 3000 in the test for that run only) failed: 2 of 2 (real `atomic --mode rpc` child, stdin closed after "Request authentication timed out", stored 'fake-refresh-1' while the server had rotated to 'fake-refresh-2'; `atomic -p` still running 18000 ms after its request failed) Assistant-verification: npx vitest --run test/oauth-shutdown-drain.test.ts (packages/ai) against af26e9d66 sources failed: 2 of 2 (drainPendingOAuthRotations is not a function) Assistant-verification: the same tests passed after the fix on 3 consecutive runs: packages/coding-agent recovery and provider-lock-wait files 8 of 8; packages/ai oauth-shutdown-drain, models-runtime, anthropic-oauth, oauth-refresh-built-in-providers and kimi-coding-oauth 80 of 80 Assistant-verification: multi-process harness `bun run run.ts timeout` (LINGER_MS=0, child exits through drainPendingOAuthRotations as Atomic's exit paths do) CONSISTENT: late rotation persisted, later process got fake-refresh-2; EXIT_PATH=abrupt control (immediate process.exit, the documented SIGKILL/crash limit) ROTATION LOST with later invalid_grant Assistant-verification: npm run check steps passed on the pinned 18:59 catalog (restored from the main checkout after the worktree's catalog was found regenerated at 21:54): biome check --error-on-warnings (3,532 files, 8 pre-existing infos), build:offline, pi-ai typecheck (448 files), alias-pi-ai, root bun typecheck (2,818 files), @bastani/atomic typecheck (825 and 832 files), check:shrinkwrap Assistant-verification: npm run test:unit passed: 959 files, 11224 tests (24 skipped); an earlier run failed 2 tests in test/unit/interactive-engine-extension-default-fallback.test.ts with "(project settings) Lock file is already being held" (repo-root cwd shared with parallel tests), which passed alone twice and in the full rerun Assistant-verification: npm run test --workspace=@bastani/atomic passed: 745 files, 6547 tests (52 skipped) Assistant-verification: npm run test --workspace=@bastani/pi-ai passed: 192 files, 1991 tests (863 skipped) Assistant-verification: rebased onto origin/main 2e217d5 (includes #3815 and #3816); one conflict in packages/coding-agent/CHANGELOG.md resolved by keeping main's Unreleased entries and appending this branch's under the single ### Fixed Assistant-verification: npm run build passed (live models.dev catalog generated 2026-10-21T05:52:31Z) Assistant-verification: after the rebase, npm run test:unit passed: 961 files, 11237 tests (24 skipped) Assistant-verification: after the rebase, npm run test --workspace=@bastani/atomic passed: 747 files, 6567 tests (52 skipped) Assistant-verification: npm run check passed after rebase onto origin/main 48f6fe2 (#3819 Together drift fix): biome 3,539 files, typecheck 448/2,823/825/832 files, shrinkwrap up to date, live models.dev catalog Assistant-verification: vitest suites passed after rebase: npm run test:unit 961 files 11237 tests (24 skipped); npm run test --workspace=@bastani/atomic 747 files 6567 tests (52 skipped); npm run test --workspace=@bastani/pi-ai 192 files 1991 tests (863 skipped) Assistant-duration: 3h53m converged, estimated 3h Co-authored-by: Norin Lavaee <nlavaee@umich.edu>
This was referenced Oct 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
On 2026-10-19 GitHub deprecated several Copilot models (changelog), and models.dev dropped them from the generated model catalog at about 04:40Z on 2026-10-21. The GitHub Copilot default model in Atomic was one of them (GPT-5.4), so a Copilot login had no usable default. Tests that looked up the removed models also broke every fresh build: eight
packages/aitypecheck errors and ten coding-agent test failures, onmainand on every branch. This PR moves the default to GPT-6.1 Sol and points the tests at current models.Changes
Default:
model-resolver-defaults.ts:"github-copilot": "gpt-5.4"→"gpt-6.1-sol". That is GitHub's suggested replacement for GPT-5.4. Copilot CLI now starts in Auto, so there was no fixed CLI default to follow.Tests, following GitHub's replacement table where it has one:
gpt-5.4,gpt-5.5gpt-6.1-solgpt-5-minigpt-6-lunaclaude-opus-4.7claude-opus-4.8claude-opus-4.7-fastclaude-opus-5-fastsdk-cache-retention.test.ts: the "supported" Copilot case needs an ID on OpenAI's extended-retention list. It now uses{ ...getModel("github-copilot", "gpt-6.1-sol"), id: "gpt-5.4" }, the same override pattern that test already uses for dated IDs. The PR doesn't add GPT-6 models to the retention list, since their retention support is OpenAI's to state.packages/coding-agent/CHANGELOG.md: Fixed entry for the new default.No assertion was weakened. References under the
openaiprovider still resolve and are untouched.Notes
npm run check, the full coding-agent suite (745 files, 6559 tests) and the packages/ai suite (190 files, 1970 tests) pass against a freshly generated catalog.test/integration/task-pause-stage-completion.test.ts, the same test that timed out on fix(workflows): bound auto-stage model routing so stages cannot stall in model-resolution #3810's first run. It is unrelated to this change and is being tracked separately.Assistant-model: Claude Opus 5.5
Assistant-workflow: inline
Assistant-duration: 1h 5m converged, estimated 20m
Assistant-verification: bun typecheck failed before and passed after: packages/ai on origin/main 7f41ca8 with a fresh catalog (8 TS2345 -> 0)
Assistant-verification: vitest coding-agent failed before and passed after: 10 failing Copilot tests -> 0
Assistant-verification: npm run test --workspace=@bastani/atomic passed: 745 files, 6559 tests
Assistant-verification: vitest packages/ai passed: 190 files, 1970 tests
Assistant-verification: npm run check passed: biome, typecheck, shrinkwrap
Assistant-verification: vitest unit failed: 30 tests in 17 storage/journal/builtin-bundle files, identical with this change stashed (stale local build)
User-preference: use the model GitHub designates as the replacement when a provider default is deprecated
User-preference: loop each PR until CI is green and Greptile has no feedback, then merge
Co-authored-by: Norin Lavaee nlavaee@umich.edu


Confidence Score: 5/5
No blocking issues were identified. The default-model fallback remains intact.Summary
Updates Copilot model references after older models were deprecated.
No actionable issues were found. Live-provider calls were not exercised.
flora131 acknowledged that future deprecations can break hardcoded model IDs again and deferred that broader change to keep this unblocking fix minimal.
Reviews (2) · Last reviewed commit: "fix(coding-agent): default GitHub Copilo..." · Reviewed by Greptile