diff --git a/.changeset/auth-legacy-credentials-fallback.md b/.changeset/auth-legacy-credentials-fallback.md
new file mode 100644
index 0000000..32b8a6c
--- /dev/null
+++ b/.changeset/auth-legacy-credentials-fallback.md
@@ -0,0 +1,5 @@
+---
+"@googleworkspace/cli": patch
+---
+
+Fix auth deadlock when legacy credentials.enc exists without accounts.json: resolve_account now falls back gracefully instead of bailing, and login warns when email fetch fails
diff --git a/src/auth.rs b/src/auth.rs
index d895f26..579b39a 100644
--- a/src/auth.rs
+++ b/src/auth.rs
@@ -94,7 +94,8 @@ pub async fn get_token(scopes: &[&str], account: Option<&str>) -> anyhow::Result
/// Resolve which account to use:
/// 1. Explicit `account` parameter takes priority.
/// 2. Fall back to `accounts.json` default.
-/// 3. If no registry exists but legacy `credentials.enc` exists, fail with upgrade message.
+/// 3. If no registry exists but legacy `credentials.enc` exists, return None with a note
+/// (caller will use the legacy file directly).
/// 4. If nothing exists, return None (will fall through to standard error).
fn resolve_account(account: Option<&str>) -> anyhow::Result