Skip to content

fix(coding-agent): default GitHub Copilot to GPT-6.1 Sol after GitHub's model deprecations - #3815

Merged
flora131 merged 2 commits into
mainfrom
fix/ai-tests-copilot-deprecations
Oct 21, 2026
Merged

flora131 merged 2 commits into
mainfrom
fix/ai-tests-copilot-deprecations

Conversation

@flora131

@flora131 flora131 commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

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/ai typecheck errors and ten coding-agent test failures, on main and 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:

    Was Now Where
    gpt-5.4, gpt-5.5 gpt-6.1-sol Copilot policy-fallback restore, base-URL overrides, tool-call ID handoff
    gpt-5-mini gpt-6-luna Responses compat, tool-result images, stream thinking tests
    claude-opus-4.7 claude-opus-4.8 Copilot adaptive-thinking overrides
    claude-opus-4.7-fast claude-opus-5-fast fast-ID entitlement test
  • sdk-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 openai provider 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.
  • The root unit suite failed 30 tests in 17 storage, journal and builtin-bundle files in my local worktree. The same files fail with this change stashed, so it's a stale local build; CI builds from scratch.
  • The first CI run also hit a timeout in 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

RetriggerView in GreptileConfidence Score: 5/5

No blocking issues were identified. The default-model fallback remains intact.

Summary

Updates Copilot model references after older models were deprecated.

  • GitHub Copilot logins now default to GPT-6.1 Sol.
  • AI tests now use Copilot models still in the catalog.
  • Coding-agent model tests use current Copilot model IDs.

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

… 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>
greptile-apps[bot]
greptile-apps Bot previously approved these changes Oct 21, 2026
…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
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 flora131 changed the title test(ai): stop referencing GitHub Copilot models models.dev now marks deprecated fix(coding-agent): default GitHub Copilot to GPT-6.1 Sol after GitHub's model deprecations Oct 21, 2026
@flora131
flora131 merged commit 35bee21 into main Oct 21, 2026
17 checks passed
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>
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.

1 participant