Skip to main content
CID222 Docs

Chat and detection problems

What a user sees when content is rejected, masked or flagged, when their AI access is locked, when a role refuses the chat, and when a file will not go through.

  • Version: 0.4
  • Role: admin_user, normal_user
  • Type: troubleshooting

This is the page to hand a user who says "the AI stopped working for me". Almost every case is one of five, and they are distinguishable from the response alone before anyone opens a dashboard.

Tell the five apart first

What the user seesWhat it isRunbook
Names or numbers replaced by placeholders; the message refused with a filter namedA content decisionContent was rejected, masked or flagged
The stream ends at once with a lock noticeThe user's AI access is lockedA user's AI access is locked
"This role does not use the chat"A role refusal, by designA role or licence refuses the action
An error naming a provider, a model or a credentialNothing reached the modelThe request never reached the model
A file is refused, or its analysis failsAn upload limit or a serviceA file will not go through
"Please try again later"A rate limitRate limits

Content decisions

Content was rejected, masked or flagged

A decision is not an error: the request was read, something matched, and the configured action was applied. Every decision writes a detection naming the engine, the label, the confidence and the action — so the conversation should start from that record, not from the user's paraphrase.

When several rules match one message the strongest action wins: REJECT over MASK over FLAG. A rule set to FLAG therefore still produces a rejection when something else on the same message rejects.

Note

Masking can be reversible: where PII_MAP_ENCRYPTION_KEY is set, the per-session map is stored as AES-256-GCM ciphertext and the response is unmasked for the user. Unset, maps are never written and responses stay masked — which is a configuration choice, not a fault.

Runbookchat

A message is rejected, masked or flagged by the content policy

You might see: Document rejected due to policy violation · my prompt came back with names replaced by placeholders · the assistant refused an ordinary business question · a customer record was masked and the model could not answer

Before you start

Checks

  1. 1

    Find the request in the detection record

    expected · One detection explains the outcome.

  2. 2

    Read which engine produced the match

    expected · You can name the engine.

  3. 3

    Read the filter that fired and the action it carries

    expected · The action matches what the user experienced.

  4. 4

    Decide whether the match was correct

    expected · The matched span really is what the rule is for.

Locks

A user's AI access is locked

Repeated jailbreak and prompt-injection detections fill a sliding window, which opens one per-user review by the risk analyst. A lock verdict from that review ends the user's chat turns immediately with a user_locked event.

Two properties matter when handling the user's complaint. A verdict the analyst could not tie back to specific detections is downgraded from a lock to a warning, so a lock that survived has evidence behind it. And the unlock path is deliberately narrow: one pending request per lock, three requests an hour, and a decided request is final.

Runbookaccess

A user's AI access is locked and they cannot chat

You might see: user_locked · the chat stream ends immediately with a lock notice · Your AI access is not locked · An unlock request is already pending for this lock

Before you start

Checks

  1. 1

    Read whether the user actually holds an active lock

    expected · One active lock exists for that user.

  2. 2

    Read the review that produced the lock

    expected · The review explains the lock in terms of specific detections.

  3. 3

    For a user who cannot file an unlock request, read the state of the existing one

    expected · Either no request is pending, or the pending one is waiting for a reviewer.

  4. 4

    After an unlock, confirm the lock is gone rather than only appearing gone

    expected · The message goes through.

Note

A lock cleared in the dashboard can still refuse the very next turn: the active lock is read through a short Redis cache. Have the user wait and send one more message before escalating.

Refusals

A role or licence refuses the action

ROLE_NOT_FOR_CHAT is not a fault — an auditor reviews the estate rather than adding traffic to it. READ_ONLY_ROLE is the demo account working as designed: it reads everything and mutates nothing. Both are rendered through ordinary error surfaces, which is what makes them look broken.

Runbookaccess

The product refuses an action with 402, 403 or 423

You might see: READ_ONLY_ROLE · This is a read-only demo account (viewer role) — actions and changes are disabled. · ROLE_NOT_FOR_CHAT · FEATURE_NOT_LICENSED

Checks

  1. 1

    Read the machine-readable code in the error body, not the sentence

    expected · You can name the code.

  2. 2

    For a 423, check whether first-boot setup ever completed

    diagnostics · appliance.setupComplete = true

  3. 3

    For a 402, read the licence state

    diagnostics · appliance.license.state = "active|trial"

  4. 4

    For FEATURE_NOT_LICENSED, read which tier is installed and whether the feature is in it

    diagnostics · appliance.license.tier

  5. 5

    For a 403 naming a role, read what the account's role may do

    expected · The role holds the page or capability the action needs.

Nothing reached the model

The request never reached the model

An error naming a provider, a model or a credential means the gateway never got as far as sending anything. No detection is written, because nothing was decided.

Runbookchat

A chat request fails before the model is reached

You might see: Provider 'openai' not found · Model 'gpt-4o' not found · Model 'gpt-4o' is not active · Model not found for provider

Before you start

Checks

  1. 1

    Check that the provider and model catalogue is populated at all

    expected · Providers and models are listed.

  2. 2

    Read whether the model the caller named exists and is active

    expected · The model is listed and active.

  3. 3

    Check that a credential resolves for this caller and provider

    expected · One active credential resolves.

  4. 4

    Test the credential that resolves

    expected · The test succeeds.

Files

A file will not go through

Three separate limits refuse a file: the format (macro-enabled spreadsheets cannot be safely redacted and are refused rather than partially handled), the size, and the document parser being disabled or behind its circuit breaker.

A chunked or resumable upload is refused rather than passed through, because no path buffers across requests and an uninspected upload is the thing inspection exists to prevent.

Runbookperformance

A file is refused, or its analysis fails

You might see: No file uploaded (expected multipart field "file") · Image size exceeds maximum allowed size of 10MB · Unsupported file type. Upload a PDF, DOCX or TXT. · legacy and macro-enabled spreadsheet formats cannot be safely redacted

Before you start

Checks

  1. 1

    Read whether the format is one the product accepts at all

    expected · The format is accepted on that surface.

  2. 2

    Read the size limit for that surface

    expected · The file is under the limit named in the message.

  3. 3

    Check whether the client was doing a chunked or resumable upload

    diagnostics · posture.resumableUploadPolicy = "block"

  4. 4

    Read whether document analysis is switched on for this deployment

    expected · The service is enabled.

  5. 5

    Read the document parser's own health

    diagnostics · services[document-parser].healthy = true

What to collect before escalating

  • The detection id from All Detections, not the text of the message — the record already holds the matched span, and the text may not leave the estate.
  • The exact response the user saw, including any code.
  • The time and the user, so the gateway log and the event log can be correlated.

Last updated on