coleam00/Archon · error
Subscription login failed to start.
Error message
Subscription login failed to start.
What it means
Generic failure in startOAuth (oauth-bridge.ts:388): the login chain rejected before producing a URL/user-code and the failure was not classified as port-busy. The bridge throws session.detail (the sanitized, truncated underlying error) or this fallback string when detail is missing. It signals the subscription login could not even begin.
Source
Thrown at packages/core/src/credentials/oauth-bridge.ts:388
});
// Wait for the first callback so the URL / user-code is available to return.
await Promise.race([session.firstSignal.promise, sleep(START_FIRST_SIGNAL_MS)]);
// An early login() failure → throw (route returns 500, CLI prints the message)
// rather than returning a misleading { mode:'manual', url:undefined } (I1).
if (session.status === 'error') {
sessions.delete(sessionId);
if (session.portBusy) {
// Retryable: the cancel above releases the port as soon as the previous
// login unwinds (microtasks for pi flows), so "retry shortly" is honest
// advice — and a restart always clears it (#1963).
throw new OAuthCallbackPortBusyError(
`A previous '${provider}' login attempt is still holding the OAuth callback port. ` +
'Wait a few seconds and retry; if it persists, restart the Archon server.'
);
}
throw new Error(session.detail ?? 'Subscription login failed to start.');
}
// Superseded (or cancelled) while still waiting for the first signal — the
// session is already gone from the map, so a 200 here would hand back a
// url-less session the first poll immediately reports as "not found".
// Throw the honest answer instead (S4).
if (!sessions.has(sessionId)) {
throw new Error('Login attempt was superseded by a newer one. Retry to start a fresh login.');
}
return {
sessionId,
mode: externalMode(session),
url: session.url,
userCode: session.userCode,
verificationUri: session.verificationUri,
expiresIn: Math.round(SESSION_TTL_MS / 1000),
};View on GitHub (pinned to 0773b97458)
Solutions
- Inspect the thrown message — if it equals this fallback, check server logs (oauth_bridge.login_failed warn) for the sanitized underlying error.
- Verify network/proxy access to the provider's OAuth endpoints.
- Retry the login; if consistent, check provider configuration and package versions.
- Restart the Archon server to clear any stuck in-flight login state.
Defensive patterns
Strategy: try-catch
Validate before calling
// Pre-check basic reachability of the provider auth endpoint before starting a login
const ok = await fetch('https://anthropic.com', { method: 'HEAD' }).then(r => r.ok).catch(() => false);
if (!ok) throw new Error('Network unreachable; fix connectivity before login.'); Try / catch
try {
await startOAuth(userId, providerId);
} catch (e) {
const msg = e instanceof Error ? e.message : '';
if (msg === 'Subscription login failed to start.' || !msg) {
// Detail was missing: consult server logs (oauth_bridge.login_failed)
getLog().error({ userId, providerId }, 'subscription_login_failed_opaque');
}
throw e;
} Prevention
- Ensure server logs are collected — the underlying sanitized error lands in the oauth_bridge.login_failed warn entry.
- Verify outbound access to provider OAuth endpoints before prompting users to log in.
- Keep the bridge and provider packages current; many startup failures are version-related.
When it happens
Trigger: Calling startOAuth when the underlying pi login() (or the openai manual flow) rejects before the first auth callback — e.g. network failure reaching the authorization endpoint, provider misconfiguration, or any early error without session.detail set.
Common situations: Corporate proxy or DNS blocking the provider's auth endpoint; expired/invalid provider configuration; pi-ai login throwing on startup; offline environment; the rare case where the underlying error message was empty or sanitized to nothing.
Related errors
- OpenAI token ${operation} request timed out.
- OpenAI token ${operation} request failed: ${error instanceof
- OpenAI token ${operation} returned a non-JSON response (HTTP
- Failed to clone ${owner}/${repo}: ${unknownMsg}
- Failed to clone ${owner}/${repo}: ${'message' in cloneResult
AI-assisted analysis of coleam00/Archon@0773b97458 (2026-09-01).
Data as JSON: /api/errors/97c07f6ad27e227c.
Report an issue: GitHub.