Omniscio documentation
Browse all documentation
  1. Getting Started13
  2. Sessions & Agents115
  3. Inbox & Notifications59
  4. Projects & Tasks95
  5. Automation & Scheduling75
  6. Knowledge & Memory26
  7. AI Features60
  8. Integrations100
  9. Plugins & Marketplace33
  10. Cloud & Teams56
  11. Settings & Customization58
  12. Account & Billing28
  13. Troubleshooting84
  14. CLI & API Reference22
  15. Legal & Policies4
  16. Uncategorised22

Consumer Terms Gate

What happens when an account must accept updated Consumer Terms and Privacy Policy at claude.ai before the API will serve it: instead of retrying forever, the session stops cleanly, says exactly what is wrong, and that account is kept out of the pool so other sessions are unaffected. Covers the four-step fix and why the detection is deliberately narrow.

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 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, 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 page, and the other state an account can be parked in, a rate limit, is covered by account relogin.

Last verified 2026-09-23