Repository navigation
fix(providers): a Google Cloud Code / Antigravity 403 VALIDATION_REQUIRED no longer permanently bans the connection - #14848
Conversation
…IRED no longer permanently bans the connection "verify your account to continue" was listed in ACCOUNT_DEACTIVATED_SIGNALS, so a single transient occurrence parked a healthy, fully-quota'd account in the terminal `banned` state (permanent: true, 1-year cooldown, never auto-recovers). Measured on a live deployment: one Antigravity connection returned 33 of these 403s inside 10 minutes and stayed `active`, while a sibling holding 100 % of its quota on all 17 windows was banned by exactly one — the only difference being which attempt happened to be served. Because `accountDeactivated` is evaluated before the cloud-code 403 branch, keeping the phrase there also made that recoverable branch unreachable for this wording, so the project-route recovery added for Gemini Code Assist (cheaper-inference#868, cheaper-inference#6452) could never run for it. cheaper-inference#14282 hit the same phrase and declared it out of scope. The phrase now lives in a new non-terminal ACCOUNT_VERIFICATION_REQUIRED_SIGNALS table and classifies as recoverable PROJECT_ROUTE_ERROR, checked after accountDeactivated so a real ban phrase still wins, and before the generic 403 -> FORBIDDEN fall-through so a non-cloud-code provider is not banned on its first occurrence. classifyFakeSuccessBody follows the same rule. The table sits in errorClassifier.ts rather than accountFallback.ts because the latter is frozen at 2517 lines by config/quality/file-size-baseline.json. Genuine Antigravity ban wording still terminalizes, and a body carrying both still bans (regression-guarded in tests).
|
Real-world confirmation of the premise, from the affected deployment. The Antigravity account this PR is about was banned by a single That is the direct test of the claim this PR makes: the condition is operator-actionable and recoverable, not a dead account. A genuinely ToS-disabled account cannot be recovered by verifying in a browser. Under the old behaviour that same account would have stayed parked for a year ( Post-fix state on that deployment: 40 connections, all Operator note (may be worth documenting): a terminal Happy to help land this however is most useful:
|
3a2678f
into
cheaper-inference:release/v3.8.51
…ge wave (#15052) Base-red drain after the 2026-09-28/29 release-drain wave: one production defect (compression preview fuzzy toggle was a no-op since #14983), three intentional contract changes propagated (#14848, #13548, #13487 inventory site), two cross-test state leaks fixed with a refusal-memory reset. Each red reproduced on the tip and green with the fix.
…IRED no longer permanently bans the connection Port of upstream 3a2678f (cheaper-inference#14848). "Verify your account to continue" (Cloud Code 403 VALIDATION_REQUIRED) was in ACCOUNT_DEACTIVATED_SIGNALS, so a single occurrence parked the connection as `banned` with a 1-year permanent cooldown. It is a transient, operator-actionable prompt and now classifies as the recoverable PROJECT_ROUTE_ERROR. Fork adaptation: upstream's errorClassifier conflict hunks also carried features the fork does not have (geo-block, Cloudflare 1010/challenge, Anthropic/Grok 403 refusals, fake-success body classifier); only the verification signal and its 403 branch are ported. The test's end-to-end cases use the fork's resolveTerminalConnectionStatus in src/sse/services/auth.ts (now exported) instead of upstream's authTerminalStatus.ts module. (cherry picked from commit 3a2678f) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
A Google Cloud Code / Antigravity
403 VALIDATION_REQUIRED("Verify your account tocontinue") no longer permanently bans the connection.
verify your account to continuewas listed inACCOUNT_DEACTIVATED_SIGNALS, so a singletransient occurrence parked a healthy, fully-quota'd account in the terminal
bannedstate(
permanent: true, 1-year cooldown, never auto-recovers). Measured on a live deployment:one Antigravity connection returned 33 of these 403s inside 10 minutes and stayed
active,while a sibling connection holding 100 % of its quota on all 17 windows was banned by exactly
one — the only difference being which attempt happened to be served.
There is a second, compounding defect.
accountDeactivatedis evaluated before thecloud-code 403 branch in
classifyProviderError, so keeping this phrase in the ban list alsomade that recoverable branch unreachable for this wording — the project-route recovery added
for Gemini Code Assist could never run for it.
The phrase now lives in a new non-terminal
ACCOUNT_VERIFICATION_REQUIRED_SIGNALStable andclassifies as recoverable
PROJECT_ROUTE_ERROR. It is checked afteraccountDeactivatedso a body carrying a real ban phrase still wins, and before the generic 403 →
FORBIDDENfall-through so a non-cloud-code provider is not banned on its first occurrence.
classifyFakeSuccessBodyfollows the same rule, otherwise the phrase would now fall throughto
nullthere since it leftACCOUNT_DEACTIVATED_SIGNALS.The table sits in
errorClassifier.tsrather thanaccountFallback.tsbecause the latter isfrozen at 2517 lines (shrink-only) by
config/quality/file-size-baseline.json.Related Issues
address Google
403 VALIDATION_REQUIRED('Verify your account'), which is a separate,account-side condition." This PR addresses exactly that leftover.
VALIDATION_REQUIREDdoes not appear anywhere in the source tree today.Validation
npm run lint— not run in full;eslinton the changed files passes cleanupstream/release/v3.8.51typecheck:coreexit 0,check-file-size0,check-complexity0,check:changelog-integrityOK (against the correct base — see Reviewer Notes)Tests Added Or Updated
tests/unit/antigravity-verify-account-403-not-a-ban.test.ts(10 cases)Coverage Notes
Changes
open-sse/services/accountFallback.tsandopen-sse/services/errorClassifier.ts,covered by the new suite above plus the existing
tests/unit/errorclassifier-antigravity-403.test.tsandtests/unit/account-fallback-service.test.ts.The new suite is proved to fail pre-fix by mutation: restoring the phrase to
ACCOUNT_DEACTIVATED_SIGNALSproduces 6 failures / 4 passes, and the 4 that stay greenare deliberately the real-ban regression guards — i.e. the suite fails on the fix's own
assertions while continuing to assert that genuine Antigravity ban wording
(
this service has been disabled in this account for violation) still terminalizes, and thata body carrying both still bans.
Reviewer Notes
1 —
check:changelog-integrityand the base ref. Locally this gate appears to fail with"11 bullet(s) present in
origin/release/v3.8.50-local-unifiedare MISSING". That is anartifact of
resolveBaseRef(), whose local fallback picks the highestorigin/release/v*.My clone's
originis a fork whose newest release branch is a different lineage carryingfork-only features (
theoldllm, absent from this tree), so those 11 bullets were never inthis branch. Against the ref this branch was actually cut from:
No reconciliation record was added, because nothing was eaten.
2 — i18n mirrors are left stale, deliberately.
docs/security/BAN_DETECTION.mdis updatedbut its 66 locale mirrors are not regenerated: no translation backend is configured here
(
OMNIROUTE_TRANSLATION_API_URL; the local gateway answers 401).npm run i18n:checkwilltherefore report this doc as drifted. Note that
upstream/release/v3.8.51already ships 8drifted core-set docs (COMPRESSION_GUIDE, AGENTBRIDGE, DOCKER_GUIDE, ENVIRONMENT,
FEATURE_FLAGS, FREE_TIERS, AUTO-COMBO, ROUTE_GUARD_TIERS), so this follows existing practice
rather than introducing it. Refresh with:
(Passing
--files=scopes it to exactly the 66 BAN_DETECTION mirrors — verified by dry run.Hand-editing
.i18n-state.jsonwas rejected: it is the exact false-PASS anti-patterndocumented at
check-translation-drift.mjs:30-34.)3 — Behavioural delta worth a second pair of eyes. A provider that returns this wording
now gets a recoverable error and stays in rotation instead of being parked for a year. That is
the intent, but it does mean such a connection will be retried rather than sidelined; if
upstream would rather it be retried with a backoff instead, that is a small follow-up.