---
title: Consumer Terms Gate
---

# Consumer Terms Gate

## What it is

When Anthropic updates its Consumer Terms & Privacy Policy, every account must accept the new terms at claude.ai before the API will serve requests. Until accepted, the API returns a specific 400 error. Omniscio detects this error automatically — instead of retrying in a loop, it stops the session cleanly, tells you exactly what happened, and keeps the gated account out of the session pool so other sessions aren't affected.

You'll see this as a session that transitions to "Needs You" with a message like: _"The Anthropic account you@example.com needs to accept updated Terms & Privacy Policy. Open claude.ai, sign in, accept the terms, then Continue this session."_ An inbox card also appears with the same guidance (its button offers a Restart Omniscio path).

## Where to find it

You do not go looking for this — it comes to you. The session that hit the gate turns amber in the sidebar with the word "Needs You" and carries the explanation in its chat, and the same wording also arrives as a card in your inbox. The card's button offers to restart the app for you, which is the last step of the fix.

## How it behaves

### How to fix it

1. Open [claude.ai](https://claude.ai) in a browser
2. Sign in with the account shown in the error message
3. Accept the updated terms when prompted
4. Restart Omniscio — the account re-enters the pool automatically

No settings change is needed. The gated state is in-memory only, so restarting Omniscio clears it once the terms are accepted.

### How it works

The Claude CLI wraps API errors as "synthetic placeholder" events — assistant messages with `model: "<synthetic>"` and zero output tokens. Normally, Omniscio's placeholder-stuck watchdog auto-replays these as empty turns. But the Consumer-Terms 400 can never succeed via replay (it's a server-side gate), so the watchdog would loop until it exhausts retries, then show a misleading generic error.

The fix adds a guard that fires before the retry counter:

1. **Detection:** `isConsumerTermsGate400` matches the specific error text ("consumer terms" + "accept them in claude.ai") in the synthetic event. A turn flag (`turnHadConsumerTermsGate`) carries the detection forward.
2. **Terminal sink:** `fireAccountNeedsTerms` kills the CLI, emits a clear system message, and transitions the session to `needs_you` / `recovery_failed`. No auto-replay, no cross-account fallback.
3. **Pool exclusion:** The account is flagged in-memory. The load-balancer and pre-spawn picker skip it via `needsTermsAcceptance` on `AccountWithUsage`, so new sessions land on other accounts.
4. **Inbox card:** One deduped alert per gated account explains what to do.

The detection is intentionally narrow — only the specific Consumer-Terms text matches. Generic 400 errors fall through to the existing placeholder-stuck path (fail-open).

## For agents

### Where it lives in code

- `src/shared/providers/provider-models.ts` — `isConsumerTermsGate400` detection predicate (pure, renderer-safe)
- `src/main/process/recovery-sinks.ts` — `fireAccountNeedsTerms` terminal sink
- `src/main/process/ndjson-event-handlers.ts` — detection in `tryFilterPlaceholderEvent`, clear-on-healthy-turn
- `src/main/process/ndjson-placeholder-recovery.ts` — guard before retry counter
- `src/main/process/ndjson-types.ts` — the `turnHadConsumerTermsGate` turn flag on `StreamSession` (initialised in `stream-session-factory.ts`, reset in `process-manager.ts`)
- `src/shared/account-pool.ts` — `needsTermsAcceptance` field + capacity guards
- `src/main/services/rate-limit-recovery-service.ts` — in-memory gated-accounts set
- `src/main/services/auth/terms-gate-alert.ts` — inbox alert module
- `src/main/process/account-selection.ts` — pre-spawn picker wiring

## Related

The nearest neighbour in behaviour is [aborted response recovery](aborted-response-recovery.md), which uses the same shape — a specific synthetic event detected and routed to a terminal sink rather than replayed. The pool exclusion rides on the account model described on the [account pool](account-pool.md) page, and the other state an account can be parked in, a rate limit, is covered by [account relogin](account-relogin.md).

- [Account Terms Gate Contract](../../.claude/memory/contracts/account-terms-gate-contract.md)
- [Aborted Response Recovery](aborted-response-recovery.md) — similar pattern (synthetic event detection + terminal sink)
