diff --git a/ui/src/components/account/shared/account-surface-card.tsx b/ui/src/components/account/shared/account-surface-card.tsx
index 3d91d71f..783f3054 100644
--- a/ui/src/components/account/shared/account-surface-card.tsx
+++ b/ui/src/components/account/shared/account-surface-card.tsx
@@ -59,6 +59,19 @@ function getCompactAudienceBadgeLabel(audience: 'business' | 'personal' | 'unkno
return '?';
}
+function resolveEffectiveTier(
+ tier: AccountTier | undefined,
+ quota: UnifiedQuotaResult | undefined
+): AccountTier | undefined {
+ if (quota && 'entitlement' in quota) {
+ const entitlementTier = quota.entitlement?.normalizedTier;
+ if (entitlementTier && entitlementTier !== 'unknown') {
+ return entitlementTier;
+ }
+ }
+ return tier;
+}
+
export function AccountSurfaceCard({
mode,
provider,
@@ -85,13 +98,14 @@ export function AccountSurfaceCard({
const identity = getAccountIdentityPresentation(accountId, email, tokenFile);
const title = displayEmail || identity.email || accountId;
const normalizedProvider = provider.toLowerCase();
+ const effectiveTier = resolveEffectiveTier(tier, quota);
const showTierBadge =
(normalizedProvider === 'agy' ||
normalizedProvider === 'antigravity' ||
normalizedProvider === 'gemini') &&
- tier &&
- tier !== 'unknown' &&
- tier !== 'free';
+ effectiveTier &&
+ effectiveTier !== 'unknown' &&
+ effectiveTier !== 'free';
const isCompact = mode === 'compact';
const defaultCompactMetaBadges = (
<>
@@ -99,10 +113,10 @@ export function AccountSurfaceCard({
- {tier}
+ {effectiveTier}
)}
{identity.audienceLabel && (
@@ -145,12 +159,12 @@ export function AccountSurfaceCard({
- {tier === 'ultra' ? 'U' : 'P'}
+ {effectiveTier === 'ultra' ? 'U' : 'P'}
)}
diff --git a/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx b/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx
new file mode 100644
index 00000000..6a0a823e
--- /dev/null
+++ b/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx
@@ -0,0 +1,49 @@
+import { render, screen } from '@tests/setup/test-utils';
+import { describe, expect, it } from 'vitest';
+import { AccountSurfaceCard } from '@/components/account/shared/account-surface-card';
+import type { GeminiCliQuotaResult } from '@/lib/api-client';
+
+function createGeminiQuotaResult(
+ overrides: Partial = {}
+): GeminiCliQuotaResult {
+ return {
+ success: true,
+ buckets: [],
+ projectId: 'project-123',
+ tierLabel: 'Pro',
+ tierId: 'g1-pro-tier',
+ creditBalance: 12,
+ entitlement: {
+ normalizedTier: 'pro',
+ rawTierId: 'g1-pro-tier',
+ rawTierLabel: 'Pro',
+ source: 'runtime_api',
+ confidence: 'high',
+ accessState: 'entitled',
+ capacityState: 'available',
+ lastVerifiedAt: Date.now(),
+ notes: null,
+ },
+ lastUpdated: Date.now(),
+ ...overrides,
+ };
+}
+
+describe('AccountSurfaceCard', () => {
+ it('prefers live quota entitlement tier over a stale account tier for Gemini badges', () => {
+ render(
+
+ );
+
+ expect(screen.getByText('pro')).toBeInTheDocument();
+ });
+});