Skip to content

Information Patterns

Information patterns control what agents know. Information is power—by carefully managing what information flows to agents, we can limit their ability to cause harm while still enabling them to be useful.

These patterns are particularly relevant for preventing data exfiltration, limiting attack surfaces, and maintaining operational security.


Restrict agent access to only the information required for the current task, minimizing exposure of sensitive data and limiting the agent’s ability to connect dots across domains.

Agents don’t need to know everything to do their jobs. By compartmentalizing information, we limit both the damage from a compromised agent and the agent’s ability to piece together sensitive pictures from disparate data points.

flowchart TB
    subgraph Compartments["INFORMATION COMPARTMENTS"]
        direction LR

        subgraph A["Compartment A<br/>(Customer)"]
            A1["• Names"]
            A2["• Emails"]
            A3["• Preferences"]
        end

        subgraph B["Compartment B<br/>(Financial)"]
            B1["• Revenue"]
            B2["• Costs"]
            B3["• Projections"]
        end

        subgraph C["Compartment C<br/>(Technical)"]
            C1["• Source code"]
            C2["• Architecture"]
            C3["• Credentials"]
        end
    end

    A --> Access
    B --> Access
    C --> Access

    Access["TASK-BASED ACCESS<br/>Customer support → A only<br/>Financial report → B only<br/>Code review → C only"]

    style A fill:#dbeafe,stroke:#2563eb
    style B fill:#d1fae5,stroke:#059669
    style C fill:#fef3c7,stroke:#d97706
flowchart TB
    Request["Data Request"] --> TaskCheck{"Request in task's<br/>allowed compartments?"}
    TaskCheck -->|"no"| Deny["DENIED<br/>(compartment mismatch)"]
    TaskCheck -->|"yes"| Filter["Filter to minimum<br/>required fields"]
    Filter --> Grant["GRANTED<br/>(filtered data only)"]
    Deny --> Log["Log attempt"]
    Grant --> Log

Task → Compartment mapping:

Task TypeAllowed Compartments
Customer supportCustomer
Financial reportFinancial
Code reviewTechnical
HR inquiryPersonnel
Executive summaryFinancial, Strategic

Minimum necessary principle: If specific fields are requested, return only those. If no fields specified, return summary only.

CompartmentContainsProtect From
CustomerPII, preferences, historyCompetitors, unauthorized staff
FinancialRevenue, costs, projectionsCompetitors, most staff
TechnicalCode, architecture, secretsAttackers, unauthorized devs
PersonnelCompensation, reviews, PIIOther employees
StrategicPlans, acquisitions, IPCompetitors, leakers
OperationalProcedures, passwords, accessAttackers

When legitimate needs arise to access data across compartments:

flowchart TB
    Request["Cross-Compartment Request"] --> Justify["Agent provides justification"]
    Justify --> Approval{"Elevated approval<br/>granted?"}
    Approval -->|"no"| Deny["DENIED"]
    Approval -->|"yes"| Synthetic["Create synthetic view"]
    Synthetic --> Filter["Filter to approved fields only"]
    Filter --> Anonymize["Anonymize sensitive data"]
    Anonymize --> Grant["GRANTED<br/>(time-limited access)"]
    Deny --> Log["Log attempt"]
    Grant --> Log

Key principles:

  • Always requires elevated approval — cross-compartment access is never automatic
  • Synthetic views — don’t expose raw data; create filtered, anonymized views
  • Time-limited — access expires via TTL, must re-request if needed longer
  • Extensive logging — every cross-compartment access is recorded

Benefits:

  • Limits blast radius of compromise
  • Prevents connecting sensitive dots
  • Creates clear data boundaries
  • Enables compartment-specific auditing

Costs:

  • Reduced flexibility for agents
  • Overhead of classification
  • May block legitimate uses

Risks:

  • Misclassification of data
  • Too-coarse compartments
  • Agent might infer from partial data
  1. Classify at source: Tag data when created, not when accessed
  2. Default to restricted: Unknown data goes to most restricted compartment
  3. Audit access patterns: Look for suspicious cross-compartment requests
  4. Review boundaries: Compartments should evolve with organization
  • Chinese Wall: Hard barriers between compartments
  • Selective Amnesia: Forget data after use
  • Air Gap: Physical compartmentalization

Create impenetrable information barriers between domains, preventing any data flow across the barrier regardless of authorization level.

Some information must never mix. In finance, analysts who know about Company A’s acquisition plans cannot advise on Company B’s stock. The Chinese Wall (Brewer-Nash model) enforces these absolute barriers.

flowchart LR
    subgraph CompanyA["Company A Domain"]
        DataA["📊 Company A Dataset<br/>• Financials<br/>• Strategy<br/>• Operations"]
        AgentA["🤖 Agent (accessed A)<br/>❌ Can NEVER access B"]
        DataA --> AgentA
    end

    subgraph TheWall["🧱 WALL"]
        W["Permanent<br/>Barrier"]
    end

    subgraph CompanyB["Company B Domain"]
        DataB["📊 Company B Dataset<br/>• Financials<br/>• Strategy<br/>• Operations"]
        AgentB["🤖 Agent (accessed B)<br/>❌ Can NEVER access A"]
        DataB --> AgentB
    end

    CompanyA ~~~ TheWall ~~~ CompanyB

    Note["⚠️ Once an agent accesses one side, it is permanently barred from the other"]

    style CompanyA fill:#dbeafe,stroke:#2563eb
    style CompanyB fill:#d1fae5,stroke:#059669
    style TheWall fill:#374151,stroke:#1f2937
    style W fill:#4b5563,stroke:#374151,color:#fff
    style AgentA fill:#fee2e2,stroke:#dc2626
    style AgentB fill:#fee2e2,stroke:#dc2626

The enforcer tracks which datasets each agent has accessed, and permanently blocks access to conflicting datasets:

flowchart TB
    Request["Access Request:<br/>Agent → Dataset X"] --> Check{"Has agent accessed<br/>any conflicting dataset?"}
    Check -->|"no"| Grant["GRANTED"]
    Grant --> Record["Record access<br/>(irreversible)"]
    Check -->|"yes"| Block["BLOCKED<br/>Chinese Wall violation"]

    subgraph History["Agent Access History"]
        H1["Agent A: {Dataset 1, Dataset 3}"]
        H2["Agent B: {Dataset 2}"]
        H3["Agent C: (none yet)"]
    end

Key operations:

OperationBehavior
Register conflict classDefine mutually exclusive datasets (e.g., “Competing Banks” = {Bank A, Bank B})
Check accessIf agent accessed any dataset in a conflict class, deny access to all others in that class
Record accessPermanently add dataset to agent’s history (cannot be undone)
Get accessibleReturn all datasets minus those blocked by previous access

Irreversibility is the key feature: Once an agent accesses one side of the wall, it can never access the other.

Conflict ClassDatasetsRationale
Competing banksBank A data, Bank B dataPrevent insider trading
Legal adversariesPlaintiff data, Defendant dataAttorney-client privilege
M&A partiesAcquirer data, Target dataPrevent information leakage
Competing bidsBid A details, Bid B detailsProcurement fairness

Agents may try to circumvent the wall through indirect means. Monitor for:

Attack TypeDescriptionDetection Approach
Inference AttackQuery about topics related to blocked dataTopic extraction: does query discuss blocked dataset’s domain?
Proxy Attack”What did the agent who saw Company B say about…”Pattern matching for indirect references to blocked sources
Aggregation AttackCombine many allowed queries to reconstruct blocked infoTrack query history; flag suspicious combinations
flowchart TB
    Query["Incoming Query"] --> Inference{"Topics overlap<br/>with blocked data?"}
    Inference -->|"yes"| Block1["BLOCK: Inference attempt"]
    Inference -->|"no"| Proxy{"References blocked<br/>data indirectly?"}
    Proxy -->|"yes"| Block2["BLOCK: Proxy attempt"]
    Proxy -->|"no"| Aggregation{"Part of suspicious<br/>query pattern?"}
    Aggregation -->|"yes"| Block3["BLOCK: Aggregation risk"]
    Aggregation -->|"no"| Allow["ALLOW"]

    style Block1 fill:#fee2e2,stroke:#dc2626
    style Block2 fill:#fee2e2,stroke:#dc2626
    style Block3 fill:#fee2e2,stroke:#dc2626
    style Allow fill:#d1fae5,stroke:#059669

Benefits:

  • Absolute protection for conflicts of interest
  • Simple rule: once crossed, permanent
  • Clear audit trail of wall state
  • Regulatory compliance

Costs:

  • Agents become specialized/limited
  • May need many agent instances
  • Cannot be undone without new agent

Risks:

  • Agents might try inference attacks
  • Agent pools might be exhausted
  • Legitimate cross-domain needs blocked
  • Need-to-Know: More flexible compartmentalization
  • Air Gap: Physical separation
  • Bulkhead Isolation: Failure containment, not information

Deliberately forget sensitive information after it’s been used, preventing future misuse or exfiltration while still enabling the immediate task.

Some information should be used once and forgotten—like a password for a one-time operation, or customer data for a single support ticket. Selective amnesia ensures the agent doesn’t accumulate sensitive data over time.

flowchart TB
    subgraph Amnesia["SELECTIVE AMNESIA"]
        T0["T0: Task Received<br/>Context includes: Customer SSN for verification"]
        T0 --> T1
        T1["T1: Task Processing<br/>Agent verifies: SSN matches records ✓"]
        T1 --> T2
        T2["T2: Amnesia Triggered<br/>• SSN removed from context<br/>• Only 'verified: true' retained<br/>• Cannot recover original SSN"]
        T2 --> T3
        T3["T3: Task Continues<br/>Agent continues with verified status, no sensitive data"]
    end

    style T0 fill:#fee2e2,stroke:#dc2626
    style T1 fill:#fef3c7,stroke:#d97706
    style T2 fill:#dbeafe,stroke:#2563eb
    style T3 fill:#d1fae5,stroke:#059669

The manager wraps sensitive data in handles that track retention policy and ensure proper forgetting:

flowchart LR
    subgraph Handle["Sensitive Data Handle"]
        Data["Raw Data<br/>(SSN, password, etc.)"]
        Policy["Retention Policy"]
        Sanitizer["Sanitizer Function"]
    end

    Handle --> UseOnce["Use Once"]
    UseOnce --> Sanitize["Sanitize Result"]
    Sanitize --> Forget["Forget Original"]
    Forget --> Return["Return sanitized<br/>result only"]

Core operations:

OperationPurpose
Create ephemeral accessWrap data with retention policy and sanitizer
Use and forgetAccess data once, sanitize result, then delete original
Task end cleanupForget all task-scoped data when task completes

Data type → Sanitized result:

Data TypeWhat’s Returned After Use
SSN{verified: true/false}
Password{authenticated: true/false}
Credit card{last_four: "1234", valid: true/false}
Medical{category: "cardiology"} (no details)
Salary{range: "100k-150k"} (not exact amount)
PolicyWhen Data is ForgottenUse Case
ImmediateRight after single usePasswords, SSNs
Task EndWhen task completesCustomer data for support ticket
Time LimitedAfter TTL expiresSession tokens
ExplicitWhen explicitly triggeredCached data
CheckpointAt defined checkpointsMulti-step sensitive operations

Simply deleting data isn’t enough—it may persist in memory, swap, or logs. Proper scrubbing requires:

SCRUB PROTOCOL:
1. Overwrite sensitive data with zeros/random bytes before deletion
2. Remove all references from context/state
3. Trigger garbage collection
4. Verify data is gone from:
- Active memory
- Swap/page files
- Log files and caches

Implementation considerations:

  • Language-dependent: High-level languages like Python make this difficult due to string immutability and garbage collection
  • Platform libraries: Use established libraries like zeroize (Rust), SecureString (.NET), or sodium_memzero (libsodium)
  • Defense in depth: Encrypt sensitive data so scrubbing the key is sufficient
  • Verification: Audit that scrubbing actually worked (memory inspection tools)

Benefits:

  • Limits data accumulation over time
  • Reduces exfiltration risk
  • Supports data minimization requirements
  • Clear retention rules

Costs:

  • Must re-fetch data if needed again
  • Complexity of sanitization
  • May not be perfect (memory artifacts)

Risks:

  • Agent might copy data before amnesia
  • Sanitizers might leak information
  • System crashes might prevent amnesia
  1. Defense in depth: Combine with encryption, access controls
  2. Audit amnesia events: Track what was forgotten when
  3. Test sanitizers: Ensure they don’t leak sensitive info
  4. Handle failures: What if amnesia fails mid-operation?
  • Data Shelf Life: Time-based access expiration
  • Capability Sunset: Similar for permissions
  • Need-to-Know: Controls initial access

Create complete physical or logical separation between systems, ensuring no possible data flow between them through any channel.

For the most sensitive operations, network isolation isn’t enough. Air gaps ensure that even a completely compromised agent in one environment cannot affect or learn from another.

flowchart LR
    subgraph Isolated["ISOLATED ENVIRONMENT"]
        IsoProps["• No network connection<br/>• No shared storage<br/>• No shared memory<br/>• No covert channels"]
        SensAgent["Sensitive Agent<br/>- Model weights<br/>- Critical data<br/>- Dangerous ops"]
        Transfer["Data transfer via:<br/>• Physical media only<br/>• Human review required"]
    end

    Gap["AIR GAP<br/>(No electronic<br/>connection)"]

    subgraph Normal["NORMAL ENVIRONMENT"]
        NormProps["• Network access<br/>• Standard agents<br/>• User interaction"]
    end

    Isolated -.->|"Physical media + human review"| Gap
    Gap -.-> Normal

    style Isolated fill:#fee2e2,stroke:#dc2626
    style Normal fill:#d1fae5,stroke:#059669
    style Gap fill:#374151,stroke:#374151,color:#fff
LevelIsolation TypeData Transfer Protocol
LogicalSoftware isolation onlyEncrypted queue with inspection
NetworkNo network connectivityUSB with malware scanning
PhysicalSeparate hardwarePhysical media with human review
FaradayRF shielded roomPaper printout with manual entry

Physical transfer protocol:

flowchart TB
    Write["1. Write data to<br/>physical media"] --> Review["2. Create human<br/>review ticket"]
    Review --> Carry["3. Human physically<br/>carries media"]
    Carry --> Approve{"4. Reviewer<br/>approves?"}
    Approve -->|"no"| Destroy["Destroy media"]
    Approve -->|"yes"| Log["Log transfer<br/>(hash, reviewer, timestamp)"]
    Log --> Success["Transfer complete"]

Key principle: The stricter protocol always wins. If transferring between Physical and Network environments, use the Physical protocol.

Even with physical separation, data can leak through side channels. Audit for:

Channel TypeRiskMitigation
TimingShared clock enables timing-based encodingSeparate clocks, add jitter
PowerPower fluctuations encode dataSeparate power supplies
AcousticSound patterns leak informationSound isolation, white noise
RFElectromagnetic emissionsFaraday cage
StorageShared disk/memoryStrictly separate storage

Monitor outputs for encoding attempts:

  • Steganography — hidden data in images or documents
  • Unusual patterns — suspicious repetition or structure
  • Timing patterns — delays that might encode bits

If any suspicion is detected, quarantine the output for human review before allowing transfer.

Use CaseGap LevelRationale
Model trainingPhysicalPrevent data poisoning
Key generationFaradayPrevent key leakage
Sensitive analysisNetworkPrevent exfiltration
Backup systemsPhysicalPrevent ransomware
Voting systemsPhysicalPrevent manipulation

Benefits:

  • Maximum protection from network attacks
  • Defeats most exfiltration techniques
  • Clear security boundary
  • Required for highest security levels

Costs:

  • Very difficult to use
  • Slow data transfer
  • Expensive to maintain
  • Reduces operational flexibility

Risks:

  • Covert channels might still exist
  • Human error in transfer protocol
  • Maintenance access could bridge gap
  • Chinese Wall: Information barriers
  • Capability Airlock: Entry/exit procedures
  • Bulkhead Isolation: Failure containment

Automatically expire data access based on time, ensuring information doesn’t remain accessible indefinitely and forcing periodic re-justification.

Access needs change over time. What was needed yesterday might be dangerous to retain today. Data shelf life ensures that access naturally expires, requiring active renewal rather than passive retention.

flowchart TB
    subgraph ShelfLife["DATA SHELF LIFE"]
        T0["T0: Access Granted<br/>Customer dataset<br/>Shelf life: 24 hours<br/>Status: ACTIVE"]
        T0 --> T20
        T20["T0 + 20 hours<br/>Remaining: 4 hours<br/>Status: EXPIRING SOON"]
        T20 --> T24
        T24["T0 + 24 hours<br/>Status: EXPIRED<br/>Must re-request with new justification"]
    end

    style T0 fill:#d1fae5,stroke:#059669
    style T20 fill:#fef3c7,stroke:#d97706
    style T24 fill:#fee2e2,stroke:#dc2626
flowchart TB
    Grant["Grant Access<br/>(with shelf life)"] --> Track["Track: agent, data, expiration"]
    Track --> Check{"On each access:<br/>Still valid?"}
    Check -->|"expired"| Remove["Remove access<br/>Trigger amnesia"]
    Check -->|"valid"| Allow["Allow access"]
    Check -->|"expiring soon"| Renew{"Renewal<br/>requested?"}
    Renew -->|"no"| Expire["Let expire"]
    Renew -->|"yes"| ValidRenewal{"New justification?<br/>Under max renewals?"}
    ValidRenewal -->|"yes"| Extend["Extend access"]
    ValidRenewal -->|"no"| Deny["Deny renewal"]

Default shelf lives by data type:

Data TypeShelf Life
Customer PII4 hours
Financial8 hours
Operational1 day
Public30 days

Renewal rules:

  • Maximum 3 renewals per access grant
  • Must provide new justification for each renewal (prevents rubber-stamping)
  • After max renewals, must request fresh access with full approval process

Background enforcement: Every minute, scan for expired access, log expirations, and trigger amnesia for any cached data.

Data TypeTypical Shelf LifeRenewal Policy
Credentials1 hourNo renewal, must re-fetch
Customer PII4 hours1 renewal with new justification
Financial data8 hours2 renewals, manager approval
Operational data24 hours3 renewals
Reference data7 daysUnlimited renewals
Public data30 daysAuto-renew

Agents receive warnings as access expiration approaches:

Time RemainingUrgencyMessage
≤ 1 hourLow”Access expiring in 1 hour”
≤ 30 minutesMedium”Access expiring in 30 minutes”
≤ 5 minutesHigh”Access expiring in 5 minutes”

This gives agents opportunity to either complete their task or request renewal before losing access.

Benefits:

  • Forces periodic justification review
  • Prevents indefinite data retention
  • Creates natural audit points
  • Supports compliance requirements

Costs:

  • Operational overhead for renewals
  • Might interrupt time-sensitive tasks
  • Requires access management infrastructure

Risks:

  • Agents might hoard data before expiration
  • Renewal might become rubber-stamp
  • Edge cases at expiration time
  • Selective Amnesia: Active forgetting
  • Capability Sunset: Similar for permissions
  • Need-to-Know: Initial access control

See also: