Skip to content

Memories System

claude-ops bot edited this page Apr 14, 2026 · 2 revisions

Memories System

Persistent context about people, projects, and your communication style — extracted locally, never uploaded.

Version Model Cadence Cost Privacy

Important

Memory files live entirely on your machine at ~/.claude/plugins/data/ops-ops-marketplace/memories/. They are plain markdown. Anthropic's API is called only to run the extraction — the same API call any Claude Code session makes. No separate upload, no separate logging. See Privacy and Security.


How extraction works

flowchart LR
    subgraph Local[Your machine]
        W[wacli SQLite<br/>WhatsApp messages]
        G[gog cache<br/>Gmail threads]
        M[memories/<br/>markdown files]
    end

    D[ops-daemon] -->|every 30 min| E[memory-extractor<br/>Haiku 4.5]
    W --> E
    G --> E
    E -->|structured markdown| M

    M -->|runtime context| S1[/ops:inbox]
    M -->|runtime context| S2[/ops:comms]
    M -->|runtime context| S3[/ops:go]
    M -->|runtime context| S4[/ops:yolo]

    classDef local fill:#22c55e,color:#fff,stroke:#15803d
    classDef daemon fill:#6366f1,color:#fff,stroke:#4338ca
    classDef skill fill:#8b5cf6,color:#fff,stroke:#6d28d9
    class W,G,M local
    class D,E daemon
    class S1,S2,S3,S4 skill
Loading
  1. ops-daemon schedules the memory-extractor service every 30 minutes
  2. The extractor reads only local files: wacli's SQLite DB and gog's cache
  3. It calls Claude Haiku 4.5 to summarize new content into structured profiles
  4. Profiles are merged (never overwritten) into existing markdown files
  5. Skills load the relevant files at runtime via their Runtime Context block

Tip

Merging means context accumulates over time. The profile for a contact you've been talking to for six months is richer than a contact you just started emailing.


Trigger conditions

The extractor runs when any of these are true:

Trigger Condition
Time 30+ minutes since last run
Volume message_count in ~/.wacli/.health grew by >5 since last run
Manual /ops:doctor --run-memory-extractor

File layout

~/.claude/plugins/data/ops-ops-marketplace/memories/
├── preferences.md                    # Your communication style
├── contacts/
│   ├── john-smith.md                 # Per-contact profile
│   ├── alice-cooper.md
│   └── ...
└── projects/
    ├── my-app.md                     # Per-project context
    └── ...

Contact profile · memories/contacts/<name>.md

# John Smith

## Contact Info
- WhatsApp: +15551234567
- Email: john@acme.com
- Company: Acme Corp

## Communication Preferences
- Prefers WhatsApp over email
- Responds quickly in the morning (PST)
- Informal tone — uses first names, short messages

## Context
- CEO of Acme Corp — potential enterprise customer
- Last conversation: pricing discussion 2026-04-10
- Waiting on: proposal we sent 2026-04-11

## Topics
- my-app integration
- enterprise pricing
- Q2 budget approval

User preferences · memories/preferences.md

# Communication Preferences

## Style
- Short, direct messages — no filler
- Never start with "Hope you're well"
- Sign off with first name only

## Defaults
- Primary channel: WhatsApp
- Calendar timezone: America/New_York
- Working hours: 8am–7pm ET

Project context · memories/projects/<alias>.md

# my-app

## Status
- Phase 6.2 in progress — push notifications backend
- Dev branch: feature/push-notifications
- Last deploy: 2026-04-12 14:30 UTC

## Key Contacts
- Alice (QA): alice@example.com
- Bob (backend): bob@example.com

How skills consume memories

Every skill has a Runtime Context block at the top of its SKILL.md that loads memory files via ! shell injection before the model reads the skill body:

!MEMORIES_DIR="$CLAUDE_PLUGIN_ROOT/../data/memories"
!cat "$MEMORIES_DIR/preferences.md" 2>/dev/null || echo "No preferences found"
!ls "$MEMORIES_DIR/contacts/" 2>/dev/null | head -20

ops-inbox and ops-comms perform a contact lookup before drafting any reply:

sequenceDiagram
    autonumber
    participant S as /ops:inbox
    participant M as memories/contacts/
    participant P as memories/projects/
    participant D as Draft reply

    S->>M: read contacts/<sender>.md
    M-->>S: style · topics · history
    S->>P: read projects/*.md if topic matches
    P-->>S: project context
    S->>D: Draft in contact's expected tone + topic
    D-->>S: Match language · match register · stay on-topic
Loading

Note

Skills never send without explicit user confirmation. Memory-aware drafting just means the first draft is already in your voice — you don't have to rewrite it.


Manual memory management

All files are plain markdown. You own them. Edit/delete/add anything:

# View all contact profiles
ls ~/.claude/plugins/data/ops-ops-marketplace/memories/contacts/

# Edit a contact profile (any editor)
$EDITOR ~/.claude/plugins/data/ops-ops-marketplace/memories/contacts/john-smith.md

# Remove a contact from memory
rm ~/.claude/plugins/data/ops-ops-marketplace/memories/contacts/ex-boss.md

# Force an extraction run right now
/ops:doctor --run-memory-extractor

# Nuke all memories and start fresh
rm -rf ~/.claude/plugins/data/ops-ops-marketplace/memories/

Caution

If you edit a file by hand, the next extractor run will merge new observations into your edits. It never overwrites but it does append. If you want a hand-curated profile that the extractor leaves alone, add <!-- extractor:skip --> as the first line — the extractor honors that directive.


Cost per run

Component Volume Cost
Input tokens (30 min of messages) ~5–15k ~$0.001–0.004
Output tokens (profile merges) ~1–3k ~$0.001–0.003
Total per run < $0.01
Monthly (48 runs/day × 30) ~$3–10

Haiku 4.5 is ~20× cheaper than Sonnet and ~100× cheaper than Opus. The extractor is tuned to do just the pattern-matching work that Haiku is good at — nothing that needs deeper reasoning.


Privacy properties

Important

Memory files never leave your machine. They are written, read, and edited entirely on local disk.

Property Status
Files stored locally only Yes — ~/.claude/plugins/data/…/memories/
Uploaded anywhere No
Shared with other users No
Survives plugin reinstall Yes (they live in the plugin data dir, not the cache dir)
Removed by /ops:uninstall Yes — the uninstaller deletes the whole memories/ tree
Gitignored Yes (via the plugin data dir, which is never in any repo)
Readable only by you File mode 600 (umask 077 when the extractor writes)

What does go to Anthropic: the Haiku API call itself, same as any Claude Code session. Message content is transiently processed by the extractor prompt, then the structured markdown result is written to disk. No additional telemetry.

See Privacy and Security for the full transparency report.


See also

Clone this wiki locally