---
title: "Incognito and PII Filtering for Every Agent"
slug: "incognito-pii-filtering-agent-privacy"
date: "2026-10-13"
tag: "Application"
summary: "Every agent on the platform now has a Privacy tab with two sub-tabs: PII Filtering, which detects thirteen categories of personal information and allows, redacts, masks or blocks them before the model sees a message, and Incognito, which decides whether conversations with that agent are written to chat history and memory at all."
author: "ibl.ai Engineering"
repo: "iblai/vibe"
linkedin: |
  Every AI agent on ibl.ai now has a Privacy tab that can redact, mask or block thirteen kinds of personal information before the model ever sees a message.

  That is the first of two sub-tabs. The second is Incognito: whether conversations with this agent are written to chat history and memory at all.

  Both shipped in the iblai/vibe toolkit on October 12, 2026.

  The design detail worth studying is that Incognito is not one switch. Four tiers resolve it — the organization's gate, the agent's policy, the person's own profile default, and the single conversation in front of them.

  An agent can be set to Always Incognito, so no conversation with it is written to chat history or memory, for anyone. It can be set to Never Incognito, where people who normally keep chats private are saved anonymously instead. Or it can leave the choice to the person.

  One endpoint resolves all four and answers which tier won and whether the user may still change it, so a chat header can show an honest locked state rather than a toggle that silently does nothing.

  PII filtering is the other half: thirteen entity types from SSN and credit card to passport, driver's license and medical license, four actions, and an optional second pass over the agent's own responses on the way out.

  Privacy controls that live in the model vendor's console are promises. On ibl.ai they run inside your perimeter, because you own all the code and the data.

  #iblai #AgenticAI #EnterpriseAI #AIGovernance #DataPrivacy #PII
---

**Every agent on ibl.ai now carries a Privacy tab with two sub-tabs — PII Filtering, which detects thirteen categories of personal information and allows, redacts, masks or blocks them before the model sees the message, and Incognito, which decides whether conversations with that agent reach chat history and memory at all — on a platform where you own all the code and the data.**

The platform shipped Incognito into the OS interface (`iblai-os-spa` 0.163.0) and the SDK (`@iblai/web-containers` 1.37.0–1.38.0) the week before, recorded in the [October 9 platform update](/updates/platform-update-2026-10-09).

The screens and the four-tier resolution landed in the [`iblai/vibe`](https://github.com/iblai/vibe) toolkit on **October 8, 2026** and shipped in **v2.12.0 on October 12, 2026**.

PII filtering itself is older: the agent Privacy tab was first documented in the toolkit on **May 25, 2026** (v1.2.0), then with three actions rather than four.

## What happens to a Social Security number typed into a chat?

Whatever the agent's administrator decided. PII filtering is a per-agent capability with its own switch at the top of the sub-tab: *"Automatically find and hide personal information — names, emails, phone numbers and more — in messages before the agent sees them."*

Filtering runs on the way in, before the text reaches the model. An **Also filter AI responses** toggle runs the same detection over the agent's output on the way out.

<a href="/images/updates/incognito-pii-filtering-agent-privacy-pii-filtering.webp" target="_blank" rel="nofollow noopener noreferrer"><img src="/images/updates/incognito-pii-filtering-agent-privacy-pii-filtering.webp" alt="The PII Filtering sub-tab of an agent's Privacy tab in ibl.ai, showing the pill switcher between PII Filtering and Incognito, the capability toggle switched on, a When PII is detected dropdown set to Redact, thirteen entity-type chips including Person, Email, Phone, SSN, Credit Card, Passport and Medical License under the hint Using defaults, and an Also filter AI responses toggle switched off." width="1440" height="805" loading="lazy" decoding="async" style="display:block; max-width:1440px; width:100%; height:auto; margin:1.5rem auto;" /></a>

**When PII is detected** offers four actions, each with its own on-screen description:

<table style="width:100%; border-collapse:collapse; margin:1.5rem 0; font-size:0.95rem;">
  <thead>
    <tr style="background:#f5f5f0; border-bottom:2px solid #2175C5;">
      <th style="text-align:left; padding:0.75rem; color:#5f6368;">Action</th>
      <th style="text-align:left; padding:0.75rem; color:#5f6368;">What reaches the model</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>Allow</strong></td>
      <td style="padding:0.75rem;">The message, untouched. Detection still runs, for monitoring or auditing without altering what people write.</td>
    </tr>
    <tr style="background:#f0f9ff; border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>Redact</strong> (default)</td>
      <td style="padding:0.75rem;">The value replaced with its type — <code>Email [EMAIL_ADDRESS]</code>.</td>
    </tr>
    <tr style="border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>Mask</strong></td>
      <td style="padding:0.75rem;">The value hidden behind asterisks.</td>
    </tr>
    <tr style="border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>Block</strong></td>
      <td style="padding:0.75rem;">Nothing. The message is rejected and the block message you wrote is shown to the person instead.</td>
    </tr>
  </tbody>
</table>

Choosing **Block** reveals a **Block Message** field, so the refusal is your institution's wording rather than a generic error.

<a href="/images/updates/incognito-pii-filtering-agent-privacy-block-message.webp" target="_blank" rel="nofollow noopener noreferrer"><img src="/images/updates/incognito-pii-filtering-agent-privacy-block-message.webp" alt="The When PII is detected dropdown set to Block, with the helper line the message is rejected and your block message is shown to the user, above a Block Message textarea holding the default wording: your message contains sensitive personal information and cannot be processed, please remove any personal data and try again." width="1440" height="393" loading="lazy" decoding="async" style="display:block; max-width:1440px; width:100%; height:auto; margin:1.5rem auto;" /></a>

**Entity Types** is a row of thirteen chips — Person, Email, Phone, SSN, Credit Card, Location, Date / Time, Passport, Driver's License, IP Address, IBAN, Medical License and Bank Number. Select none and the hint reads *"Using defaults."*

## Who decides whether a conversation is saved at all?

Four tiers do, and the Incognito sub-tab is one of them. Incognito keeps a conversation out of chat history and memory; the question of who may turn it on is answered in this order, highest first.

<table style="width:100%; border-collapse:collapse; margin:1.5rem 0; font-size:0.95rem;">
  <thead>
    <tr style="background:#f5f5f0; border-bottom:2px solid #2175C5;">
      <th style="text-align:left; padding:0.75rem; color:#5f6368;">Tier</th>
      <th style="text-align:left; padding:0.75rem; color:#5f6368;">Who sets it</th>
      <th style="text-align:left; padding:0.75rem; color:#5f6368;">Where</th>
    </tr>
  </thead>
  <tbody>
    <tr style="background:#f0f9ff; border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>Agent policy</strong></td>
      <td style="padding:0.75rem;">Agent administrator</td>
      <td style="padding:0.75rem;">Agent → Privacy → Incognito</td>
    </tr>
    <tr style="border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>Organization gate</strong></td>
      <td style="padding:0.75rem;">Administrator</td>
      <td style="padding:0.75rem;">Account → Advanced → <em>Allow users to control chat privacy</em></td>
    </tr>
    <tr style="border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>This conversation</strong></td>
      <td style="padding:0.75rem;">The person chatting</td>
      <td style="padding:0.75rem;">The Incognito toggle in the chat header</td>
    </tr>
    <tr style="border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>User default</strong></td>
      <td style="padding:0.75rem;">Each person</td>
      <td style="padding:0.75rem;">Profile → Privacy</td>
    </tr>
  </tbody>
</table>

The agent tier is three radio cards. **Users Decide** leaves it to the person. **Always Incognito** makes every conversation with that agent incognito, for anyone, and locks the header pill on.

**Never Incognito** removes the toggle for that agent — and people whose own default is Incognito are saved **anonymously** instead, rather than silently losing the protection they chose.

<a href="/images/updates/incognito-pii-filtering-agent-privacy-incognito-policy.webp" target="_blank" rel="nofollow noopener noreferrer"><img src="/images/updates/incognito-pii-filtering-agent-privacy-incognito-policy.webp" alt="The Incognito sub-tab of an agent's Privacy tab in ibl.ai, introduced by the line Incognito keeps a conversation out of chat history and memory, choose how it works for this agent, above three radio cards: Users Decide (selected), Always Incognito, and Never Incognito, each describing what it does to conversations with that agent." width="1440" height="679" loading="lazy" decoding="async" style="display:block; max-width:1440px; width:100%; height:auto; margin:1.5rem auto;" /></a>

One control writes both underlying flags in a single save, so the contradictory "always *and* never" pair cannot be configured from this screen at all.

## How does an application know which tier won?

It asks. Over the platform's REST API, one endpoint resolves all four tiers for a given organization, user, agent and session, and answers three things: the resolved `mode`, the `source` that decided it, and whether the result is locked.

The three modes are **normal**, **anonymized** and **disabled** — and disabled is Incognito. That resolved answer is what lets a chat header render an honest locked state with a tooltip explaining which tier decided, instead of a toggle that quietly does nothing.

Saving an Incognito card also refreshes that resolution and the agent's public settings, so an open chat's pill locks, unlocks or disappears without a reload.

## What does Incognito actually withhold?

The message text. No chat-history row is written for an incognito turn and nothing from it feeds memory — and a chat *started* in Incognito is created with no owner at all, so the guarantee rests on a missing ownership record rather than a flag someone can flip back.

Each turn is still recorded against the user for usage, so an incognito conversation still counts against consumption. What Incognito withholds is the history row and the memory write.

Turning Incognito on mid-conversation is the one action that asks first, because it is the one that is easy to misread — the earlier messages do not disappear.

<a href="/images/updates/incognito-pii-filtering-agent-privacy-chat-dialog.webp" target="_blank" rel="nofollow noopener noreferrer"><img src="/images/updates/incognito-pii-filtering-agent-privacy-chat-dialog.webp" alt="The Enable Incognito for this chat dialog in ibl.ai, explaining that from here on new messages in this conversation will not be saved and the assistant stops using earlier messages, that earlier messages stay saved in history, and that Incognito can be turned off again anytime, with Cancel and Enable Incognito buttons." width="1016" height="440" loading="lazy" decoding="async" style="display:block; max-width:1016px; width:100%; height:auto; margin:1.5rem auto;" /></a>

Turning it back off, and either direction on a chat with no messages yet, act immediately with a toast.

Once an ownerless incognito chat holds messages it can never be converted back: the toggle locks, and its tooltip points the person to a new chat.

## Can a person set their own default rather than per chat?

Yes. The **Privacy** tab of each person's own profile sets a default Incognito setting across three options — **Normal**, **Anonymized** and **Incognito** — with the platform's own description of each on screen.

Anonymized is the middle ground that is easy to miss: conversations are still saved for context, but stripped of the identifying account information.

<a href="/images/updates/incognito-pii-filtering-agent-privacy-profile-default.webp" target="_blank" rel="nofollow noopener noreferrer"><img src="/images/updates/incognito-pii-filtering-agent-privacy-profile-default.webp" alt="The Privacy tab of a user profile in ibl.ai, headed Default Incognito Setting, with three cards: Normal (selected), Anonymized, and Incognito, each describing how conversations with AI agents are recorded under that choice." width="1440" height="654" loading="lazy" decoding="async" style="display:block; max-width:1440px; width:100%; height:auto; margin:1.5rem auto;" /></a>

That tab is the successor to the Default Private Mode panel covered in [User Profile and Organization Settings](/updates/profile-and-organization-settings) — same place in the profile, renamed, and now one tier of four rather than a standalone preference.

## What happened to Private Mode?

It is called Incognito now, on every surface: the chat toggle, the agent's Privacy tab, the profile tab, the toasts and the dialog. The agent-level switch also moved — it used to sit among the capabilities on the Settings tab and is now the Incognito sub-tab beside PII Filtering.

Three underlying wire fields keep their older names — `disable_chathistory`, `disable_privacy_mode` and `chat_privacy_mode` — so nothing built against the API breaks on the rename.

That is the kind of detail a platform you host yourself can afford to get right, because the upgrade is yours to schedule.

## Which of these can an administrator lock down?

All of them, field by field. With role-based access control enabled, **seven** fields on this tab carry independent permissions — the PII capability switch, the action, the block message, the entity list, the response filter, and the two Incognito flags.

A field someone may read but not write renders disabled rather than hidden, and when nothing on the tab is readable it shows a single notice instead. Members typically see Incognito read-only and no PII Filtering at all.

Underneath the agent's own policy sits the organization gate in **Account → Advanced**. With it off, user control disappears everywhere — no Incognito sub-tab, no profile Privacy tab, no chat toggle.

Unless an agent's policy already decided, the resolver then answers `normal` and names the organization as the tier that decided.

## What does this change for a regulated buyer?

It moves two decisions a compliance team actually gets asked about — *what personal data reaches the model* and *what gets retained* — out of a model vendor's console and onto screens inside a deployment you control.

Both are per agent, which matters more than it sounds. An intake agent handling applicant records and an internal research agent do not need the same retention posture, and a single organization-wide switch forces the stricter one onto both.

The PII filtering panel is documented in [Agent Settings: Privacy](/docs/os/agent-settings/privacy). Both sub-tabs ship as the `iblai-vibe-agent-privacy` skill in [`iblai/vibe`](https://github.com/iblai/vibe), with the chat toggle in `iblai-vibe-incognito` — **68 releases** from v1.2.0 on May 25, 2026 through v2.12.0 on October 12, 2026.

Apps built with [Agentic Vibe](/product/agentic-vibe) mount the same components; [Agentic OS](/product/agentic-os) runs them today.

1.6M+ users across 400+ organizations run the platform this way, including NVIDIA, MIT, and Syracuse University.

## Want to see agent-level privacy controls on your own stack?

We can walk your privacy and security teams through PII filtering, Incognito policy and the four tiers that resolve it, on infrastructure you own. [Book a 30-minute demo](https://cal.com/iblai/30min) or [talk to the ibl.ai team](/contact) — ibl.ai is family-owned and operated from New York, NY.
