# Client-contract codes

Negative codes the dashboard and shared client recognize and turn into specific UX flows. These are stable contracts: do not change their meaning.

### `-90` No card on file

**Severity:** warning · **Category:** billing

A paid action was attempted with no payment method on file.

**Common causes**

- Account has no Stripe default_source

**Resolution**

1. Client opens the "Add a card" modal and retries on success

**Auto-fix:** notify_user · **User-actionable:** yes · **Related:** `-91`, `-92`, `-93`

**Source:** account_module billing check ~2277; client shared/utils.js:631 (NewCard.vue)

### `-91` Past-due invoices

**Severity:** warning · **Category:** billing

The account has a past-due balance; payload carries topup + open_invoices.

**Common causes**

- Unpaid past-due balance

**Resolution**

1. Client opens the "Pay Past Due" modal (open_invoices, topup) and retries on success

**Auto-fix:** notify_user · **User-actionable:** yes · **Related:** `-90`, `-92`, `-93`

**Source:** account_module billing check ~2285; client shared/utils.js:632 (PayPastDue.vue)

### `-92` Negative balance

**Severity:** warning · **Category:** billing

The account balance is in the negative; the full balance is requested as topup.

**Common causes**

- Balance below zero

**Resolution**

1. Top up the account balance and retry

**Auto-fix:** notify_user · **User-actionable:** yes · **Related:** `-90`, `-91`, `-93`

**Source:** account_module billing check ~2303

### `-93` Topup required

**Severity:** warning · **Category:** billing

Not enough balance for the action; payload carries the required topup amount.

**Common causes**

- Insufficient balance for the requested charge

**Resolution**

1. Client opens the "Topup Required" modal (amount) and retries on success

**Auto-fix:** notify_user · **User-actionable:** yes · **Related:** `-90`, `-91`, `-92`

**Source:** account_module billing check ~2311; client shared/utils.js:640 (TopupRequired.vue)

### `-401` Auth required (client redirect)

**Severity:** error · **HTTP:** 401 · **Category:** auth

Token invalid/expired or missing. The client redirects to the login page.

**Common causes**

- gtp_token missing/expired
- invalid_session / invalid_token
- google_token_invalid

**Resolution**

1. Client redirects to /dashboard/login with redirect_url
2. Re-authenticate

**Auto-fix:** none · **User-actionable:** yes · **Related:** `401`

**Source:** session_module/ai_module (various); client store/index.js:94 + shared/utils.js:599

### `-764` File/path already exists

**Severity:** warning · **Category:** drive

An upload/create hit a duplicate; payload lists the conflicting files (.duplicates).

**Common causes**

- File or folder with the same name already exists

**Resolution**

1. Client shows a conflict dialog (replace / keep both)

**Auto-fix:** none · **User-actionable:** yes · **Related:** `-762`

**Source:** drive_module ~1368-1472; client UploadFilesModal.vue:96 / Tab_drive.vue:1731

### `-999` Timeout / upstream unresponsive

**Severity:** error · **Category:** timeout

An operation (e.g. avatar generation) timed out or the upstream was unresponsive.

**Common causes**

- Upstream/AI service slow or down
- Job exceeded its timeout

**Resolution**

1. Client auto-retries with backoff (max 2)
2. Then shows a "service unresponsive" message

**Auto-fix:** retry · **User-actionable:** no · **Related:** `502`, `provider_outage`

**Source:** jobs_module/rpi_module timeout; client Onboarding.vue:1039
