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 supports two label sets depending on deployment context. Both use the same four-tier ordered hierarchy.

Enterprise Labels

LevelRankDescriptionExamples
RESTRICTED4 (highest)Most sensitive data requiring maximum protectionM&A documents, board materials, PII
CONFIDENTIAL3Business-sensitive informationCRM data, financials, HRIS records
INTERNAL2Company-wide data not meant for external sharingInternal wikis, team documents, internal tooling
PUBLIC1 (lowest)Safe for external sharingMarketing materials, public documentation

Personal Labels

LevelRankDescriptionExamples
SENSITIVE4 (highest)Highest-protection personal dataBank accounts, medical records, legal documents
PRIVATE3Personal business mattersPersonal finances, contracts, tax records
PERSONAL2General personal informationPersonal notes, contacts, calendars
PUBLIC1 (lowest)Safe for anyone to seePublic information, general web content

TIP

The two label sets map directly to each other by rank. RESTRICTED corresponds to SENSITIVE, CONFIDENTIAL to PRIVATE, and so on. Personal tier uses personal labels; enterprise tier uses enterprise labels.

The No Write-Down Rule

The single most important security invariant in Triggerfish:

DANGER

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.

RESTRICTED    -->  RESTRICTED only
CONFIDENTIAL  -->  CONFIDENTIAL or RESTRICTED
INTERNAL      -->  INTERNAL, CONFIDENTIAL, or RESTRICTED
PUBLIC        -->  Anywhere

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
CONFIDENTIALINTERNALCONFIDENTIALYes
CONFIDENTIALEXTERNALPUBLICNo
RESTRICTEDINTERNALRESTRICTEDYes

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:

UNTRUSTED  -->  CLASSIFIED  (after admin/user review)
UNTRUSTED  -->  BLOCKED     (explicitly prohibited)
CLASSIFIED -->  BLOCKED     (admin revokes)
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

Released under the MIT License.