Skip to content

Classification System

The data classification system is the foundation of Triggerfish's security model. Every piece of data that enters, moves through, or leaves the system carries a classification label. These labels determine where data can flow -- and more importantly, where it cannot.

Classification Levels

Triggerfish uses a single four-tier ordered hierarchy for all deployments.

LevelRankDescriptionExamples
RESTRICTED4 (highest)Most sensitive data requiring maximum protectionM&A documents, board materials, PII, bank accounts, medical records
CONFIDENTIAL3Business-sensitive or personal-sensitive informationCRM data, financials, HR records, contracts, tax records
INTERNAL2Not meant for external sharingInternal wikis, team documents, personal notes, contacts
PUBLIC1 (lowest)Safe for anyone to seeMarketing materials, public documentation, general web content

The No Write-Down Rule

The single most important security invariant in Triggerfish:

Data can only flow to channels or recipients at equal or higher

classification. This is a fixed rule -- it cannot be configured, overridden, or disabled. The LLM cannot influence this decision. :::

Classification hierarchy: PUBLIC → INTERNAL → CONFIDENTIAL → RESTRICTED. Data flows upward only.

This means:

  • A response containing CONFIDENTIAL data cannot be sent to a PUBLIC channel
  • A session tainted at RESTRICTED cannot output to any channel below RESTRICTED
  • There is no admin override, no enterprise escape hatch, and no LLM workaround

Effective Classification

Channels and recipients both carry classification levels. When data is about to leave the system, the effective classification of the destination determines what can be sent:

EFFECTIVE_CLASSIFICATION = min(channel_classification, recipient_classification)

The effective classification is the lower of the two. This means a high-classification channel with a low-classification recipient is still treated as low-classification.

ChannelRecipientEffectiveCan receive CONFIDENTIAL data?
INTERNALINTERNALINTERNALNo (CONFIDENTIAL > INTERNAL)
INTERNALEXTERNALPUBLICNo
CONFIDENTIALINTERNALINTERNALNo (CONFIDENTIAL > INTERNAL)
CONFIDENTIALEXTERNALPUBLICNo
RESTRICTEDINTERNALINTERNALNo (CONFIDENTIAL > INTERNAL)

Channel Classification Rules

Each channel type has specific rules for determining its classification level.

Email

  • Domain matching: @company.com messages are classified as INTERNAL
  • Admin configures which domains are internal
  • Unknown or external domains default to EXTERNAL
  • External recipients reduce effective classification to PUBLIC

Slack / Teams

  • Workspace membership: Members of the same workspace/tenant are INTERNAL
  • Slack Connect external users are classified as EXTERNAL
  • Guest users are classified as EXTERNAL
  • Classification derived from platform API, not from LLM interpretation

WhatsApp / Telegram / iMessage

  • Enterprise: Phone numbers matched against HR directory sync determine internal vs. external
  • Personal: All recipients default to EXTERNAL
  • Users can mark trusted contacts, but this does not change the classification math -- it changes the recipient classification

WebChat

  • WebChat visitors are always classified as PUBLIC (visitors are never verified as owner)
  • WebChat is intended for public-facing interactions

CLI

  • The CLI channel runs locally and is classified based on the authenticated user
  • Direct terminal access is typically INTERNAL or higher

Recipient Classification Sources

Enterprise

  • Directory sync (Okta, Azure AD, Google Workspace) automatically populates recipient classifications
  • All directory members are classified as INTERNAL
  • External guests and vendors are classified as EXTERNAL
  • Admins can override per-contact or per-domain

Personal

  • Default: All recipients are EXTERNAL
  • Users reclassify trusted contacts through in-flow prompts or the companion app
  • Reclassification is explicit and logged

Channel States

Every channel progresses through a state machine before it can carry data:

Channel state machine: UNTRUSTED → CLASSIFIED or BLOCKED
StateCan receive data?Can send data into agent context?Description
UNTRUSTEDNoNoDefault for new/unknown channels. Completely isolated.
CLASSIFIEDYes (within policy)Yes (with classification)Reviewed and assigned a classification level.
BLOCKEDNoNoExplicitly prohibited by admin or user.

SECURITY New channels always land in the UNTRUSTED state. They

cannot receive any data from the agent and cannot send data into the agent context. The channel remains completely isolated until an admin (enterprise) or the user (personal) explicitly classifies it. :::

How Classification Interacts with Other Systems

Classification is not a standalone feature -- it drives decisions across the entire platform:

SystemHow classification is used
Session taintAccessing classified data escalates the session to that level
Policy hooksPRE_OUTPUT compares session taint against destination classification
MCP GatewayMCP server responses carry classification that taints the session
Data lineageEvery lineage record includes the classification level and reason
NotificationsNotification content is subject to the same classification rules
Agent delegationCallee agent's classification ceiling must meet caller's taint
Plugin sandboxPlugin SDK auto-classifies all emitted data