Repository navigation
Antigravity shows "Needs attention: Google account access is not checked yet" after a server process restart, even when already signed in #10110
Description
Before submitting
- I searched existing issues and did not find a duplicate.
- I included enough detail to reproduce or investigate the problem.
Area
apps/server (provider/antigravity)
What happened
Antigravity continuously shows "Needs attention · Antigravity is installed. Google account access is not checked yet." As soon as I press "Sign in with Google" it works, but I've had to do this repeatedly, at random intervals, on two separate always-on installs (a desktop app talking to a local server, and a t3 serve daemon on a remote VPS), while the server stays up the whole time from my perspective.
Diagnosis
- The message is the
AUTH_UNCHECKED_MESSAGEconstant (apps/server/src/provider/Layers/AntigravityProvider.ts:36-38), used as the fallbackmessageincheckProvider(same file, ~lines 197-204) wheneverauth.statusis neitherauthenticatednorunauthenticated, alongsidestatus: "warning". - The web UI's
getProviderSummary(apps/web/src/components/settings/providerStatus.ts:57-63) renders anystatus === "warning"as "Needs attention" and just displaysprovider.messageas the detail line. Theauth.status === "unknown"condition is decided entirely server-side — the client is a faithful mirror, not where the bug lives. auth.statusstarts as"unknown"in the provider's initial in-memory state (AntigravityProvider.ts:147, built via a freshSubscriptionRef.makeat:158). It is written to"authenticated"in exactly one place (AntigravityProvider.ts:281, insideonSessionStarted), reached by two callers: a real ACP chat session starting (AntigravityDriver.ts:304), or completion of an interactive Google sign-in (AntigravityAuth.ts:282→AntigravityDriver.ts:228→onSessionStarted).- The periodic background health-check probe (
checkProvider,AntigravityProvider.ts:168-232) only callsruntime.initialize()(wired inAntigravityDriver.ts:257-273), never.start(), and only readsdraft.auth.status(:197) — it can never itself set or restoreauthenticated. - No provider auth state is persisted anywhere (no DB row, no file, no IPC field) across a server process restart:
makeAntigravityProvideralways builds a freshSubscriptionRef(AntigravityProvider.ts:158), and the service launcher's handoff payload carries only{protocol, childVersion, update}(serviceLauncher.ts:400-404) — no runtime state. - On the daemon install,
service-launcher.mjsperforms zero-downtime updates by spawning a brand-newt3 servechild and terminating the old one (#handleUpdateRequest/#beginTrial,serviceLauncher.ts~lines 453-509,#spawnChild~lines 405-408) — a genuinely fresh Node process. Confirmed live: the launcher had been running 20h55m while its currentt3 servechild was only 34 minutes old, with three different nightly runtimes present under the runtime directory within the same 24-hour window. - On the desktop install, the server runs as an Electron-managed child process instead of under
service-launcher.mjs; the restart mechanism differs, but the same underlying defect applies — any restart of that process rebuilds the Antigravity provider from scratch withauth.status: "unknown". - Because nightly builds ship every few hours, this happens often. Antigravity then shows "Needs attention" until a new session or sign-in click runs
onSessionStartedagain — which appears to work instantly only because the underlyingantigravityCLI already holds valid cached Google credentials; the click is not performing a real re-authentication. continueThreadsAfterServerUpdate(consumed byreconcileProviderSessions,serverRuntimeStartup.ts:470-484) can incidentally resume a session across a restart and heal this side effect, which plausibly explains why the symptom is intermittent rather than guaranteed on every single restart.- Ruled out: the "Provider health check interval" setting. Disabling it entirely (set to
0) on one install did not stop the symptom from recurring, consistent with the probe never being able to setauthenticatedin the first place.
Steps to reproduce
- Enable the Antigravity provider (oauth-personal), sign in, and use it once so status shows "Authenticated".
- Trigger a server process restart: on a
t3 servedaemon install this happens automatically via the service launcher's zero-downtime update handoff whenever a newer nightly is available; it can also be forced by restarting thet3 serveprocess directly. - Without starting a new Antigravity session, open Settings → Providers. Antigravity shows "Needs attention — Antigravity is installed. Google account access is not checked yet." despite Google sign-in still being valid.
- Click "Sign in with Google" (or start any task using Antigravity) — status returns to "Authenticated" instantly, until the next restart.
Version or commit
0.0.39-nightly.20260905.1286 (reproduced on two separate installs on this same version)
Environment
macOS 25.6.0 arm64 (T3 Code desktop app) and a Linux VPS running t3 serve under service-launcher.mjs. Node v26.0.0.
Logs or stack traces
$ ps -o pid,etime,cmd -p <service-launcher-pid>
PID ELAPSED CMD
<pid> 20:55:12 node .../service-launcher.mjs
$ ps -o pid,etime,cmd -p <t3-serve-pid>
PID ELAPSED CMD
<pid> 34:19 node .../t3/dist/bin.mjs serve
(the actual server process is ~35x younger than its own supervisor, despite the machine and supervisor never having gone down; three separate nightly runtimes were present under the runtime directory within the same 24 hours)
Related issues
#9650 (Antigravity health checks leave large _MEI folders) confirms the same "disposable per-interval ACP probe" design elsewhere in this provider. Different symptom, not a duplicate.
Workaround
None available at the config level. The provider-health-check-interval setting does not affect this — confirmed by disabling it entirely on one install without the symptom stopping. No reliable user-side workaround beyond re-clicking sign-in after it flaps.
Filed by
claude (opus-5) via t3 triage
Activity
juliusmarminge commentedon Sep 5, 2026
Triage
Confirmed. This is a real UX bug, but the restart-unknown state is already an intentional Antigravity design — chat was patched for it, Settings was not.
What is going on
makeAntigravityProvideralways starts with in-memoryauth.status: "unknown". The only write to"authenticated"isonSessionStarted(a real ACP session, interactive Google sign-in, or Refresh provider status /refreshModels). The periodic health probe only callsruntime.initialize()and never restores auth. That is test-locked (treats initialize as installation proof, not account or model discovery) and called out in the provider (Health uses initialize only).A successful probe therefore publishes
status: "warning"+AUTH_UNCHECKED_MESSAGE. SettingsgetProviderSummaryrenders any warning as Needs attention. Provider setup also shows Sign in with Google whenever auth is not"authenticated". Onboarding uses the same summary and treats warning as attention.The on-disk provider status cache does remember a previous
authenticatedsnapshot at boot, butmergeProviderSnapshotlets the live unknown snapshot overwrite auth/status/message (it only special-cases models). That merged unknown row is then written back to the cache.warning+unknownis load-bearing for model retention (isPendingAntigravityAuthentication); do not flip the probe toreadywithout updating that merge.Service-launcher zero-downtime nightly updates (and Electron child restarts) replace the Node process, so this comes back often even when the supervisor/machine never went down. While the process stays up,
checkProviderpreservesauthenticated— the health-check interval is not the flap.continueThreadsAfterServerUpdatecan hide it by starting a session.Already shipped
#9647 (
fix(web): resume Antigravity threads without repeated sign-in) already treats this as “not a failure”:auth.unknownwarning+unknownThat PR did not update Settings / setup / onboarding. This issue is that leftover.
Not a duplicate of #9650 (same disposable
initialize()probe, different Windows temp-disk symptom). That issue is also why the periodic probe must not start a full session.Workaround
Refresh provider status in Settings (not the health-check interval). That RPC passes
refreshModels: true, which for Antigravity runsstart()and restores Authenticated the same way a new session does. Re-clicking Sign in with Google looks instant because the CLI already has cached Google credentials.Suggested fix
Do not make the periodic health probe call
start().Smallest change: apply the same
installed && warning && auth.unknownpredicate fromProviderStatusBannerto Settings (getProviderSummary, setup CTA) and onboarding readiness, so unchecked auth is not Needs attention / a fake re-login. Keep confirmedunauthenticatedand install/startup errors.Optional later: restore last-known auth from the status cache (or a cheap
acp_token.jsonpresence check) if the card should again say Authenticated after restart without a session.Surfaces
unknownAccepting as a bug.