Agent Memory
Owner-aware project continuity for agents. Keep project truth, durable decisions, and an explicit owner operating profile available across sessions and models, with evidence links, lifecycle controls, and review before inferred information becomes canonical.
Packaging note
Included Memory comes with the Free account. Solo and higher plans increase the hosted memory capacity according to the current platform-plan table; there is no separate “memory pack” entitlement in this contract. Check the pricing page for current limits.
Verified with snipara-companion 3.6.13: Reviewable Memory Hygiene
Agent Memory now includes read-only hygiene diagnostics and reviewable cleanup candidates so teams can catch low-signal automation receipts, stale memories, duplicates, and active superseded categories before they pollute future recalls.
Overview
Memory is a product capability with multiple callers. Hosted MCP exposes the inline retrieval path; Companion supplies local memory/workflow helpers, and Orchestrator supplies specialist coordination tools. Plan limits also differ between the Web and MCP surfaces, so use the active caller's contract rather than copying a quota from another page.
Agent Memory enables your AI agents to persist useful information across sessions. It is not a generic store for complete conversation history. Snipara keeps compact, reviewed facts, decisions, preferences, and operating constraints at the correct owner scope so future agents inherit approved project context instead of replaying every chat or rediscovering it.
Durable Memory
Reviewed decisions, learnings, preferences, and reusable facts that should influence future behavior across sessions.
Execution Memory
Runtime traces, checkpoints, files, commands, and session context used for resume, replay, and historical inspection. It is continuity state, not approved long-term memory.
The strongest coding-agent setups use both layers together: execution memory keeps the agent aligned with its workflow state and recent runtime trace, while reviewed memory prevents it from reopening settled engineering decisions.
When an agent needs that operational layer in one hosted fetch, use snipara_resume_context. It packages execution-memory with latest handoff, What Changed, active decisions, and an optional task-scoped work brief instead of exposing execution-memory alone.
Owner-aware project continuity
The durable bootstrap starts from two explicit profile layers. The newest active project/client profile is reserved as the project anchor; additional tenant profiles can still appear as ordinary critical memory when budget allows. A personal owner operating profile describes how the authenticated owner wants agents to communicate, decide, verify, and collaborate. These profiles complement reviewed decisions; they do not replace source documents or become a hidden personality model.
Project scope · profiles
Product and repository constraints
Client constraints, business model, technology, security boundaries, UX preferences, and project-specific do/don't rules.
Use snipara_tenant_profile_create and snipara_tenant_profile_get.
User scope
Explicit owner operating profile
Stable preferences for language, communication, decisions, autonomy, risk, evidence, product principles, boundaries, and ways of working. The profile follows its owner across projects.
Use snipara_owner_profile_get and snipara_owner_profile_update.
Update the owner profile explicitly
snipara_owner_profile_update(
profile={
"preferred_language": "French",
"communication_style": "Direct, concise, evidence-first",
"decision_style": "Show tradeoffs, then recommend one path",
"autonomy_preference": "Execute agreed work end to end",
"risk_tolerance": "Conservative for production and data",
"evidence_preferences": "Tests plus live production proof",
"product_principles": ["Ship only what the product can prove"],
"non_negotiables": ["Never store secrets in memory"],
"working_preferences": ["Commit substantial phases separately"]
},
evidence_refs=["decision-receipt-123"]
)Updates patch only the supplied fields by default. Pass replace=true when the supplied object should replace the canonical profile. Integrator client keys also pass a stable external_user_id, which is mapped to an isolated end-user owner.
Explicit beats inferred
An inferred trait or automatically extracted preference remains a pending review candidate. Review can accept it as ordinary durable memory, but it never silently replaces the canonical owner profile; only an explicit owner-profile update does that.
At session start, snipara_session_memories applies deterministic precedence: project profile → owner profile → active decisions → other durable memory → daily carryover. The project slot uses the newest active project/client profile, while additional tenant profiles can use the remaining critical budget. Profile content is bounded by the bootstrap token budgets and protected from generic compaction rules, so an old but active owner profile is not dropped merely because newer daily notes exist.
Mem0 vs Snipara
If you only need personal or per-agent memory, Mem0 is the closer comparison. Snipara can also store agent and user-scoped memory, but its differentiator for coding teams is governed project, team, and repo memory with evidence, review, invalidation, and lifecycle control.
Mem0
Personal or agent memory
- Best fit for one user, one agent, one assistant, or one personal workflow.
- Good for preferences, habits, recurring instructions, and lightweight carryover.
- Usually optimized for convenience, not repo governance or source authority.
- Less suited to reviewed engineering memory shared across a team.
Snipara
Project, team, and repo memory
- Built for shared engineering context across users, sessions, branches, and models.
- Links memories back to evidence such as PRs, reviews, docs, chunks, and files.
- Applies lifecycle controls like review, invalidation, supersession, and TTL.
- Lets future agents recall approved repo truth instead of repeating old mistakes.
In short: Mem0 is usually where you keep what one agent or user should remember. Snipara combines an explicit owner profile with the governed truth the project should keep teaching every future agent.
GitHub to Durable Recall
Coding-agent memory should not jump straight from a pull request to a permanent recall. Snipara treats GitHub as evidence first, then promotes selected repo truth into durable memory only after governance and lifecycle checks.
Step 01
GitHub
Pull requests, commits, reviews, Actions summaries, files, paths, and line references stay as source artifacts first.
Step 02
Evidence
Snipara preserves URLs, SHAs, authorship, paths, and risk context so the source can still be inspected later.
Step 03
Candidate Memory
Only selected repo facts become candidates, with confidence, suggested TTL, and scope metadata attached.
Step 04
Review
Policy or a human reviewer can approve, reject, invalidate, or supersede the candidate before it affects future recalls.
Step 05
Durable Recall
Approved memory becomes reusable project context that future agents can recall semantically with evidence still linked.
Memory Scope Policy
Choose the narrowest durable owner before writing memory. Raw specs, RFPs, diagrams, and client files stay in context; memory stores compact decisions, preferences, learnings, and reusable state.
Snipara stores agent memory on the reviewed memory model by default. Agent, project, team, and user scopes are owner boundaries, not labels: agent memories require an agent identifier, user memories stay personal to one authenticated or integrator-mapped user, team memories stay with the team, and project memories stay with the active project.
| Scope | Owner | Use for | Required identifier |
|---|---|---|---|
agent | One named agent or agent role | Reusable behavior, checklists, and process learnings that should follow one agent. | agent_id |
project | One project, client, mandate, or RFP/BID workspace | Durable decisions, assumptions, constraints, and validated learnings for one active project. | projectId |
team | A workspace or delivery team | Reviewed standards, playbook rules, reusable lessons, and durable team preferences. | teamId |
user | One end user across projects | Personal preferences and reusable working style for one person. | external_user_id |
Key Features
- Semantic Storage — Memories are embedded for similarity search
- Source-Linked Evidence — Attach docs, chunks, PRs, issues, and URLs to critical memories
- Lifecycle Controls — Invalidate or supersede stale memories through hosted MCP or companion without losing history
- Verification — Re-check whether a memory is still backed by valid evidence
- Review Queue — Route automated memory writes to an inbox before recall
- Transcript Import API — Preview and bootstrap durable memory from transcripts or notes
- Automation-Safe Capture — Use novelty checks and task commits instead of raw note dumping
- Confidence Decay — Memories lose relevance over time unless reinforced
- Type Classification — Categorize as facts, preferences, decisions, etc.
- TTL Support — Set expiration times for temporary memories
- Metadata Filtering — Filter recalls by type, category, or custom tags
Capture & Review Flow
Not every memory should become durable immediately. Snipara supports a reviewable workflow so teams can automate capture without polluting future recalls.
| Mode | What happens to automated writes |
|---|---|
AUTO | High-confidence project memories can be approved only when an explicit project policy permits it and records an approval receipt; automation-derived, low-confidence, and non-project scoped candidates still go to review. |
INBOX | Automated sources such as commit hooks and transcript imports become PENDING until reviewed in the dashboard. |
The authenticated web endpoint POST /api/agents/memory/import previews durable candidates from a session transcript or retrospective and imports them into the review inbox. Use scope: "PROJECT" (the default) for shared project memory or scope: "USER" for memory owned by the authenticated user.
For local human resolution, use snipara-companion Decision Requests: workflow decisions lists pending questions, workflow decide records the reviewer receipt, and memory reviews --emit-decisions turns hosted memory review candidates into the same review channel.
GitHub Evidence Memory
GitHub can become memory only through a governed path. Snipara first treats repository artifacts as evidence: issues, pull requests, review comments, commits, Actions summaries, and linked files keep their GitHub URLs, SHAs, paths, and line numbers where available.
The next layer proposes selected evidence as memory candidates. Those candidates keep source links, risk flags, confidence, and suggested TTLs. They are not durable recall material until policy or a reviewer approves them.
Before and After: one sourced memory prevents the wrong edit
The value is not abstract. A reviewed memory can stop an agent from repeating a stale repo assumption before it edits the wrong file or reopens a closed decision.
Before durable recall
The agent follows a stale assumption
- An agent receives a task to update auth policy enforcement and finds an older path like
api/auth.ts. - It assumes auth still lives there, patches the wrong layer, and duplicates middleware behavior.
- Tests fail later, or worse, the repo now has two competing auth paths to unwind.
After durable recall
The agent recalls reviewed repo truth first
Recalled memory
Decision: Auth middleware moved from api/auth.ts to core/security.ts.
Reason: Centralize policy checks and audit logging in one layer.
Evidence: PR #184, review thread, commit SHA, and file path preserved on the memory record.
- The agent recalls the approved memory before editing.
- It opens the correct file, updates the actual auth layer, and keeps the change scoped.
- It avoids a wrong edit because the memory is sourced, reviewed, and still active.
Safe wording
GitHub sync gives agents source-grounded repository context today. The reviewed-memory workflow promotes only selected GitHub evidence into reviewed memory, with policy checks, human review where needed, and source links preserved for later verification.
MCP Tools
snipara_remember
Store a new memory with optional metadata.
snipara_remember({ text: "User prefers dark mode in all applications", type: "preference", category: "ui", scope: "project", // Omit ttl_days when no automatic expiry is needed})Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
text | string | Yes | The memory content to store (alias: content for backward compatibility) |
type | string | No | Classification: "fact", "decision", "learning", "preference", "todo", "context" |
category | string | No | Custom category for filtering (e.g., "auth", "ui") |
scope | string | No | Visibility: "agent", "project", "team", "user". Default "project" |
ttl_days | number | No | Positive integer time-to-live in days. Omit it for no automatic expiry. |
document_refs | string[] | No | Referenced document paths |
related_to | string[] | No | IDs of related memories |
snipara_remember_if_novel
Store a memory only if it is sufficiently different from existing memories. This is the safest write path for automation and commit hooks.
snipara_remember_if_novel({ text: "Use Vaultbrix SSH before rolling out Prisma-backed backend releases", type: "decision", category: "deploy", novelty_threshold: 0.92})Typical use: commit hooks, session summaries, and workflow automations that should skip near-duplicate memories.
snipara_remember_bulk
Store multiple memories in a single call for efficient batch operations.
snipara_remember_bulk({ memories: [ { text: "User prefers TypeScript", type: "preference" }, { text: "API uses JWT auth", type: "fact", category: "auth" }, { text: "Deploy to staging first", type: "decision", ttl_days: 30 } ]})Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
memories | array | Yes | Array of memory objects (max 50). Each object can have: text, type, category, scope, ttl_days |
Response
{ "created": 3, "failed": 0, "memory_ids": ["mem_abc", "mem_def", "mem_ghi"], "failures": null, "message": "Stored 3 memories successfully"}Batch Efficiency
Use snipara_remember_bulk to send up to 50 memory objects in one MCP call. Inspect both created and failures; individual rows can fail while other rows are stored.
snipara_end_of_task_commit
Persist durable outcomes from a task. Prefer the structured why block when the decision and its rationale are available; summary remains the heuristic fallback for older clients and unstructured handoffs.
snipara_end_of_task_commit({ task: "Harden webhook delivery", why: { decision: "Use the durable queue for webhook delivery.", rationale: "Deploys can interrupt synchronous delivery.", alternatives: ["Synchronous delivery"], constraints: ["At-least-once delivery"], observed_outcome: "Retries now survive deploys." }, outcome: "completed", files_touched: ["apps/web/src/lib/webhooks.ts"]})A structured block becomes one atomic PENDING memory and, when it contains a decision, one ProjectDecision DRAFT. It requires a resolved human owner and is never split by summary heuristics. Use dry_run: true to preview it without writing. Unknown top-level or nested parameters are rejected before any write.
Summary-based task commits use project scope by default. With an integrator client key, provide external_user_id to store the extracted memories in that isolated end-user namespace. Structured Why Capture remains project-governed and uses that resolved identity as its human owner; this tool intentionally has no separate scope argument.
snipara_recall
Retrieve memories relevant to a query using semantic search.
Use snipara_recall for durable decisions, learnings, preferences, and carryover. Do not use it as a substitute for source documents. For specs, PDFs, client files, and shared playbooks, start with Project Intelligence Inputs and use snipara_context_query or snipara_shared_context.
On projects where Outcome Loop recall reranking is enabled, recall may include an outcome_loop_rerank block and per-memory outcome_evidence. That ranking signal is based on sample-aware OutcomeStats posterior evidence, not raw Memory.evidenceScore. It is a gated memory recall treatment. Context/chunk retrieval uses a separate opt-in outcome rerank path backed by persisted OutcomeEvidenceStats for chunk targets, live fallback for missing stats, bounded boost-only movement, and a top-relevance exploration floor.
snipara_recall({ query: "What are the user's UI preferences?", limit: 5, type: "preference", min_relevance: 0.5})Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Natural language query for semantic search |
limit | number | No | Maximum memories to return, default 5 |
type | string | No | Filter by memory type |
category | string | No | Filter by category |
min_relevance | number | No | Minimum relevance score (0-1), default 0.5 |
scope | string | No | Filter by scope: "agent", "project", "team", "user" |
Response
{ "memories": [ { "memory_id": "mem_abc123", "content": "User prefers dark mode in all applications", "type": "preference", "category": "ui", "confidence": 0.92, "relevance": 0.87, "created_at": "2025-01-20T10:30:00Z", "last_accessed_at": "2025-01-23T14:15:00Z", "access_count": 0, "status": "active", "review_status": "approved" } ], "warnings": [], "total_searched": 24, "query": "What are the user's UI preferences?", "timing_ms": 42}Confidence values in recall responses are ranking and lifecycle signals, not calibrated advisor-grade probability claims.
snipara_memories
List all memories with optional filters (no semantic search).
snipara_memories({ type: "decision", limit: 20, offset: 0})snipara_forget
Delete specific memories by ID or filter.
// Delete by IDsnipara_forget({ memory_id: "mem_abc123" })// Delete all memories of a typesnipara_forget({ type: "todo" })Memory Lifecycle Tools
Use reviewed memory lifecycle tools when you need memory that can be traced back to evidence and updated safely over time instead of being hard-deleted.
snipara_memory_attach_source
Attach evidence to a memory, such as a document chunk, PR, issue, commit, or URL.
snipara_memory_attach_source({ memory_id: "mem_abc123", evidence_type: "CHUNK", chunk_id: "chunk_456", snippet: "OAuth callback validates state before token exchange", weight: 1.0})Use this for fact, decision, and learning memories that should stay grounded in project evidence.
snipara_get_chunk
Retrieve the full content for a referenced chunk when you need to inspect the exact source behind a memory or a query result.
snipara_get_chunk({ chunk_id: "chunk_456"})snipara_memory_verify
Verify whether a memory still has valid supporting evidence.
snipara_memory_verify({ memory_id: "mem_abc123", mark_stale_if_missing: true}){ "memory_id": "mem_v2_abc123", "verified": true, "total_evidence": 2, "valid_evidence": 2, "invalid_evidence": 0, "evidence_score": 1.0, "status": "ACTIVE"}snipara_memory_invalidate
Mark a memory as invalid when it is no longer true. This preserves the audit trail better than deleting it outright.
snipara_memory_invalidate({ memory_id: "mem_abc123", invalidated_at: "2026-04-10T14:30:00Z", reason: "Legacy OAuth flow replaced by PKCE-only flow"})snipara_memory_supersede
Replace an outdated memory with a newer one while keeping the relationship explicit.
snipara_memory_supersede({ old_memory_id: "mem_old_auth", new_memory_id: "mem_new_auth", reason: "Authorization server configuration changed"})From a terminal workflow, the companion equivalents are snipara-companion memory invalidate <memory-id> and snipara-companion memory supersede <old-memory-id> <new-memory-id>. These commands call the hosted lifecycle tools and keep mutation separate from read-only hygiene commands such as memory audit and memory compact.
Recommended Pattern
For durable project knowledge: snipara_remember → snipara_memory_attach_source → snipara_memory_verify. When reality changes, prefer snipara_memory_supersede or snipara_memory_invalidate over snipara_forget.
Memory Hygiene Tools
Memory hygiene tools help teams review active memory quality without deleting useful history. Use them before and after cleanup workflows, especially when automation writes memories on behalf of agents.
snipara_memory_health
Inspect active memory counts, top categories, compaction settings, and known hygiene anomalies. This tool is read-only.
snipara_memory_health({ sample_limit: 5})Hygiene reasons include document upload receipts, trivial decomposition receipts, execution-plan receipts, and active categories that still contain :superseded.
snipara_memory_clean_candidates
Return a bounded review packet for cleanup. It groups candidates into noise, possible stale rows, duplicate groups, category anomalies, and memories that need human review.
snipara_memory_clean_candidates({ limit_per_bucket: 10})This tool does not mutate memory. Follow up with snipara_memory_invalidate, snipara_memory_supersede, or snipara_memory_compact after reviewing the candidates.
snipara_memory_duplicate_candidates
Return duplicate and supersession candidates only, for workflows that do not need the full hygiene review packet.
snipara_memory_duplicate_candidates({ limit: 20})Cleanup Safety
Prefer review-first cleanup: diagnose with snipara_memory_health, inspect candidates, then explicitly invalidate or supersede selected memory IDs. Avoid hard deletion unless you intentionally want to remove the audit trail.
Decision Log Tools
Use decision tools when a memory is not enough and you need a structured, ADR-style record with rationale, alternatives, and a supersession chain.
snipara_decision_create
Create a formal technical or architectural decision record.
snipara_decision_create({ title: "Use Redis for background job deduplication", owner: "platform-team", scope: "backend", impact: "HIGH", context: "Workers need a shared dedupe layer across deploys", decision: "Adopt Redis SETNX-based deduplication", rationale: "Faster operational rollout than queue-layer rewrite", alternatives: ["Postgres advisory locks", "Kafka compaction"], tags: ["jobs", "reliability", "redis"]})snipara_decision_query
Search decisions by free text, scope, impact, status, or tags.
snipara_decision_query({ query: "redis deduplication", scope: "backend", impact: "HIGH", include_superseded: false, limit: 10})snipara_decision_supersede
Replace an existing decision with a new one while preserving the evolution chain between both records.
snipara_decision_supersede({ old_decision_id: "DEC-014", title: "Move job deduplication to queue middleware", owner: "platform-team", scope: "backend", impact: "HIGH", context: "Redis hot key pressure increased with traffic growth", decision: "Shift deduplication into queue middleware", rationale: "Reduces operational hotspots and centralizes policy"})Confidence Decay
Memories naturally lose confidence over time unless they are accessed or reinforced. This prevents stale information from dominating recalls.
Confidence Decay Formulanew_confidence = base_confidence * (0.99 ^ days_since_reference)Example: 0.9 confidence, 1% daily decay, 7 days0.9 * (0.99 ^ 7) = 0.84Reinforcement
A successful snipara_recallupdates the memory's last-access timestamp, so subsequent decay is measured from that reference. Writing the same content is not a reinforcement operation: snipara_remember_if_novel may skip it as a duplicate or return reconciliation guidance.
Memory Types
| Type | Use Case | Example |
|---|---|---|
fact | Objective information | "The API uses OAuth 2.0 for authentication" |
preference | User preferences | "User prefers TypeScript over JavaScript" |
decision | Past decisions made | "Decided to use PostgreSQL instead of MySQL" |
learning | Lessons learned during work | "The API rate limits at 100 req/min" |
todo | Tasks and reminders | "Need to add error handling to checkout flow" |
context | Session context for continuity | "Completed auth module, next: API endpoints" |
Best Practices
Do
Store specific, actionable information that will be useful across sessions.
Don't
Store entire conversations or large code blocks — use Snipara Context for document storage.
Guidelines
- Be specific— "User prefers tabs over spaces" not "User has code style preferences"
- Use appropriate types — Helps with filtering and organization
- Set TTL for temporary info — Prevent memory bloat
- Attach evidence for critical memories — Facts and decisions should be verifiable
- Invalidate or supersede stale knowledge — Keep history instead of deleting everything
- Let confidence decay work— Don't manually set confidence to 1.0
- Use duplicate-aware writes — Prefer
snipara_remember_if_novelwhen automation should skip duplicates or request reconciliation
Current Packaging
| Plan | Scope | Capacity | Notes |
|---|---|---|---|
| Free | Agent, project, user | 500 memories + 1 swarm | 2 agents per swarm |
| Solo | Agent, project, user | 1,500 memories + 2 swarms | 3 agents per swarm |
| Pro | Agent, project, user | 10,000 memories + 8 swarms | 8 agents per swarm |
| Team | Agent, project, team, user | 25,000 memories + 20 swarms | 15 agents per swarm |
| Enterprise | Agent, project, team, user | Unlimited memories and swarms (fair use) | 50 agents per swarm |