Skip to content

Inhibition — Suppression


The Concept

Suppression is different from forgetting:

Operation API Effect Reversible?
Forget memory.forget(id) Tombstones the record — permanently excluded from all scans No
Suppress memory.suppress(id, reason) Adds to suppression set — excluded from recall results Yes

Tombstoning modifies the off-heap flags byte (bit 0 = 1). Suppression maintains a separate in-memory set — the underlying memory is untouched and can be un-suppressed later.


How It Works

flowchart TD
    subgraph "Suppress (Reversible)"
        S1["memory.suppress(id, reason)"] --> S2["Add to suppression set<br/><i>in-memory, auditable</i>"]
        S2 --> S3["Recall pathway filters<br/>suppressed IDs after scoring"]
        S3 --> S4["memory.unsuppress(id)<br/><i>restores to recall</i>"]
    end

    subgraph "Forget (Permanent)"
        F1["memory.forget(id)"] --> F2["Set tombstone flag<br/><i>off-heap bit flip</i>"]
        F2 --> F3["Scorer Phase 1 skips<br/>in ~1 CPU cycle"]
        F3 --> F4["Cannot be undone"]
    end

    style S4 fill:#2ecc71,color:white
    style F4 fill:#e74c3c,color:white

Performance difference: Tombstoned memories are skipped in Phase 1 of the scorer (~1 cycle). Suppressed memories go through the full 6-phase scoring engine in the Recall Pathway and are only filtered afterward. For bulk removal, forget() is more efficient.


Where It Fits in the Recall Pathway

Suppression is checked after the 6-phase scorer completes but before habituation:

flowchart TD
    SCORER["6-Phase Scorer<br/><i>produces scored candidates</i>"] --> SUPPRESS["Step 4: Suppression Filter<br/><b>Remove suppressed IDs</b>"]
    SUPPRESS --> HAB["Step 5a: Habituation<br/><i>attenuate repeated results</i>"]
    HAB --> GRAPH["Steps 5c–5e: Graph Augmentation"]
    GRAPH --> SORT["Final Sort → Top-K"]

    style SUPPRESS fill:#e74c3c,color:white
    style SORT fill:#00b894,color:white

Use Cases

1. User Redaction

User: "Please forget what I said about project X"
→ memory.suppress("project-x-conversation-1", "User requested redaction")
→ memory.suppress("project-x-conversation-2", "User requested redaction")

2. Context Switching

Agent switching to backend work:
→ memory.suppress("frontend-task-context", "Switching to backend work")

Later, switching back:
→ memory.unsuppress("frontend-task-context")

3. Stale Data Quarantine

Data source under validation:
→ memory.suppress(staleIds, "Source under validation — suppressed until confirmed")

4. A/B Testing Memory Strategies

Suppress certain memories to test agent performance without them:
→ experimentGroup.forEach(id → memory.suppress(id, "A/B test: control group"))

Next Steps