[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-mem0-memory-triage":3,"mdc-wb94yo-key":43,"related-org-mem0-memory-triage":1867,"related-repo-mem0-memory-triage":2019},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":38,"sourceUrl":41,"mdContent":42},"memory-triage","triage and store durable memories","Persistent long-term memory protocol powered by mem0. Evaluate conversations for durable facts worth storing via memory_add. Handles identity, preferences, decisions, configurations, rules, projects, and relationships. Loaded by the openclaw-mem0 plugin when skills mode is active.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"mem0","Mem0","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmem0.png","mem0ai",[13,17],{"name":14,"slug":15,"type":16},"Memory","memory","tag",{"name":18,"slug":19,"type":16},"Agents","agents",60691,"https:\u002F\u002Fgithub.com\u002Fmem0ai\u002Fmem0","2026-07-13T06:13:47.285591",null,7066,[19,26,27,28,29,30,31,32,33,15,34,35,36,37],"ai","ai-agents","application","chatbots","chatgpt","genai","llm","long-term-memory","memory-management","python","rag","state-management",{"repoUrl":21,"stars":20,"forks":24,"topics":39,"description":40},[19,26,27,28,29,30,31,32,33,15,34,35,36,37],"Universal memory layer for AI Agents","https:\u002F\u002Fgithub.com\u002Fmem0ai\u002Fmem0\u002Ftree\u002FHEAD\u002Fintegrations\u002Fopenclaw\u002Fskills\u002Fmemory-triage","---\nname: memory-triage\ndescription: >\n  Persistent long-term memory protocol powered by mem0.\n  Evaluate conversations for durable facts worth storing via memory_add.\n  Handles identity, preferences, decisions, configurations, rules,\n  projects, and relationships. Loaded by the openclaw-mem0 plugin when skills mode is active.\nuser-invocable: false\nmetadata:\n  {\"openclaw\": {\"always\": false, \"injected\": true, \"emoji\": \"🧠\", \"requires\": {\"env\": [\"MEM0_API_KEY\", \"OPENAI_API_KEY\", \"ANTHROPIC_API_KEY\"], \"bins\": []}}}\n---\n\n# Memory Protocol\n\nYou have persistent long-term memory powered by mem0. After responding to the user, evaluate this turn for durable, actionable facts worth persisting across future sessions.\n\nYour primary role is to extract relevant pieces of information from the conversation and organize them into distinct, manageable facts. This allows for easy retrieval and personalization in future interactions.\n\n**The core question**: \"Would a new agent — with no prior context — benefit from knowing this?\" If no → do nothing. Most turns produce zero memory operations. That is correct and expected.\n\n## Available Tools\n\n### memory_search\nSemantic search across stored memories.\n- `query` (required): search query\n- `limit`: max results (default: configured topK)\n- `userId`, `agentId`: scope overrides\n- `scope`: `\"all\"` (default), `\"session\"`, or `\"long-term\"`\n- `categories`: filter by category array\n- `filters`: advanced filter object\n\n### memory_add\nStore new facts in long-term memory.\n- `facts` (required): array of facts to store — ALL must share the same category\n- `text`: alternative single-fact string\n- `category`: `\"identity\"`, `\"preference\"`, `\"decision\"`, `\"rule\"`, `\"project\"`, `\"configuration\"`, `\"technical\"`, `\"relationship\"`\n- `importance`: 0.0–1.0 (omit for category default)\n- `userId`, `agentId`: scope overrides\n- `metadata`: additional key-value metadata\n- `longTerm`: true (default) for persistent, false for session-scoped\n\n### memory_get\nRetrieve a single memory by ID.\n- `memoryId` (required): the memory ID\n\n### memory_list\nList all stored memories for a user or agent.\n- `userId`, `agentId`: scope overrides\n- `scope`: `\"all\"` (default), `\"session\"`, or `\"long-term\"`\n\n### memory_update\nUpdate an existing memory's text in place. Atomic and preserves edit history.\n- `memoryId` (required): the memory ID to update\n- `text` (required): the new text (replaces old)\n\n### memory_delete\nDelete memories by ID, query, or bulk.\n- `memoryId`: specific memory ID to delete\n- `query`: search query to find and delete matching memories\n- `all`: delete ALL memories (requires `confirm: true`)\n- `confirm`: safety gate for bulk operations\n- `userId`, `agentId`: scope overrides\n\n### memory_event_list\nList recent background processing events (platform mode only).\n\n### memory_event_status\nGet status of a specific background event.\n- `event_id` (required): the event ID to check\n\n## Decision Gate\n\nEvery candidate fact must pass ALL four gates:\n\n**Gate 1 — FUTURE UTILITY**: Would this matter to a new agent days or weeks from now?\n  - Pass: identity, configurations, standing rules, preferences with rationale, decisions, project milestones, relationships, important personal details\n  - Fail: tool outputs, status checks, one-time commands, transient state, small talk, generic responses → SKIP\n\n**Gate 2 — NOVELTY**: Check your recalled memories below — is this already known?\n  - Already known and unchanged → SKIP\n  - Known but materially changed → UPDATE (find old → update in place)\n  - Genuinely new → proceed\n  - **Material difference test**: Only UPDATE if new information adds real context, details, or changes meaning. Cosmetic differences (synonyms, rephrasing, punctuation) are NOT updates. \"Loves daily walks\" vs \"enjoys daily walks\" = no material change = SKIP.\n\n**Gate 3 — FACTUAL**: Is this a concrete, actionable fact — not a vague statement or question?\n  - Pass: specific names, configs, choices with rationale, deadlines, system states, plans, preferences\n  - Fail: vague impressions, questions, small talk, acknowledgments, generic assistant responses (\"Sure, I can help\") → SKIP\n\n**Gate 4 — SAFE**: Does this contain ANY credential, secret, or token?\n  - Scan for known credential prefixes, auth tokens, webhook URLs with tokens, pairing codes, long alphanumeric strings in config\u002Fenv context, and key-value assignment patterns. The plugin injects the full pattern list at runtime.\n  - ANY match → NEVER STORE the value. Instead, store that the credential was configured:\n    - WRONG: \"User's API key is [redacted]\"\n    - RIGHT: \"API key was configured for the service (as of 2026-03-30)\"\n  - When in doubt → SKIP. No exceptions.\n\nAll four gates must pass. If any fails → do nothing.\n\n## What to Extract (Priority Order)\n\n### 1. Configuration & System State (importance: 0.95 | permanent)\nTools\u002Fservices configured, installed, or removed (with versions\u002Fdates). Model assignments for agents. Cron schedules, automation pipelines, deployment configs. Architecture decisions. Specific identifiers: file paths, sheet IDs, channel IDs, machine specs.\n```\n\"User's Tailscale machine 'mac' (IP 100.71.135.41) is configured under beau@rizedigital.io (as of 2026-02-20)\"\n\"User's executive orchestrator agent Quin runs on Claude Opus, heartbeat every 10 min\"\n```\n\n### 2. Standing Rules & Policies (importance: 0.90 | permanent)\nExplicit user directives about behavior. Workflow policies. Security constraints, permission boundaries. Always capture the reason.\n```\n\"User rule: never create accounts without explicit user consent. Reason: security policy\"\n\"User rule: each agent must review model selection before completing a task\"\n```\n\n### 3. Identity & Demographics (importance: 0.95 | permanent)\nName, location, timezone, language preferences. Occupation, employer, job role, industry. Keep related facts together in a single memory.\n```\n\"User is Chris, senior platform engineer at Mem0, based in EST timezone\"\n```\n\n### 4. Preferences & Opinions (importance: 0.85 | permanent)\nCommunication style, tool preferences, technology opinions. Always capture the WHY when stated. Preserve the user's exact words for feelings and opinions.\n```\n\"User prefers Cursor over VS Code for AI-assisted coding because of inline completions\"\n\"User prefers terse responses with no trailing summaries\"\n```\n\n### 5. Goals, Projects & Milestones (importance: 0.75 | expires: 90 days)\nActive projects with name, description, current status. Completed milestones with dates. Deadlines, roadmaps, progress.\n```\n\"As of 2026-03-30, user is building agentic memory architecture for OpenClaw. Status: active development, team demo planned early April\"\n\"ElevenLabs voice integration fully configured as of 2026-02-20\"\n```\n\n### 6. Technical Context (importance: 0.80 | permanent)\nTech stack, development environment, agent ecosystem structure (names, roles, relationships). Skill levels.\n```\n\"User's stack: Python\u002FDjango backend, Next.js 15 frontend, PostgreSQL with pgvector, deployed on EKS\"\n```\n\n### 7. Relationships & People (importance: 0.75 | permanent)\nNames and roles of people mentioned. Team structure, key contacts.\n```\n\"Deshraj owns the frontend, Taranjeet owns the backend platform at Mem0\"\n```\n\n### 8. Decisions & Lessons (importance: 0.80 | permanent)\nImportant decisions made with reasoning. Lessons learned. Strategies that worked or failed.\n```\n\"As of 2026-03-30, user decided to use infer=false for all skill-based memory storage — agent extracts, mem0 stores directly without re-extraction\"\n```\n\n## CRITICAL: Memory Completeness and Self-Containment\n\nEach memory you store must be a **self-contained, independently understandable fact**. This is the single most important quality rule.\n\n### Entity-Based Grouping\n\n**ALWAYS group all information about the same entity, concept, event, or subject into a SINGLE unified memory.** If multiple pieces of information refer to the same entity (e.g., a conference, a project, a person, a system), they MUST be combined into one comprehensive memory.\n\n**DO NOT split requirements, specifications, or details about the same entity across multiple memory_add calls.** Even if information is phrased differently (\"Budget for X\", \"X requires Y\", \"X needs Z\"), if they all refer to the same entity, combine ALL into ONE call.\n\n**WRONG** — fragmented into separate facts:\n```\nmemory_add(facts: [\"Conference requires at least 4 breakout rooms\", \"Conference requires vegan options\", \"Conference requires parking\"], category: \"project\")\n```\n\n**CORRECT** — grouped into one self-contained fact:\n```\nmemory_add(facts: [\"Conference requires at least 4 breakout rooms for 30-40 people each, robust vegan and vegetarian options with allergen-free alternatives, parking for at least 100 vehicles, venue within walking distance of transit\"], category: \"project\")\n```\n\n**WRONG** — same entity split into separate facts:\n```\nmemory_add(facts: [\"Budget is $150-175 per person for TechForward event\", \"TechForward event requires strong WiFi\", \"TechForward event requires hybrid capabilities\"], category: \"project\")\n```\n\n**CORRECT** — combined into one fact about TechForward:\n```\nmemory_add(facts: [\"TechForward event has a budget of $150-175 per person per day including venue rental, standard AV setup, and catering. Requires strong WiFi and hybrid event capabilities for remote attendees.\"], category: \"project\")\n```\n\n**Only create separate memories when information refers to genuinely different entities, concepts, or unrelated topics** (e.g., \"TechForward event\" vs \"Marketing campaign\" are separate).\n\n### No Pronouns — Use Specific Names\n\nDO NOT create memories that rely on pronouns (they, them, he, she, it). Always use specific names and entities.\n\n- **WRONG**: \"They work at Google\" and \"They live in San Francisco\"\n- **CORRECT**: \"John works at Google and lives in San Francisco\"\n\n### No Inference\n\nDo not infer unstated attributes (gender, age, ethnicity, beliefs) from names or context.\n- **WRONG**: \"Kiran's sister visited him last week\"\n- **CORRECT**: \"Kiran's sister visited last week\"\n\n### No Assistant Attribution\n\nDo not store characterizations from assistant messages (e.g., \"user seems excited\") unless the user explicitly confirmed them.\n\n## How to Store\n\nUse `memory_add` with the `facts` array. All facts in one call MUST share the same category because category determines retention policy (TTL, immutability).\n\n```\nmemory_add(\n  facts: [\"fact one in third person\", \"fact two in third person\"],\n  category: \"identity\"\n)\n```\n\nIf a turn produces facts in different categories, make one call per category:\n\n```\nmemory_add(facts: [\"User is Alex, senior engineer at Stripe, PST timezone\"], category: \"identity\")\nmemory_add(facts: [\"As of 2026-04-01, user decided to migrate from Postgres to CockroachDB\"], category: \"decision\")\n```\n\nCategories: `identity`, `configuration`, `rule`, `preference`, `decision`, `technical`, `relationship`, `project`\n\n### Storage Principles\n\n**15-50 WORDS per fact**: Each fact should be 1-2 sentences. If combining would exceed this, consolidate into key facts rather than creating a paragraph. Distill rather than append.\n\n**OUTCOMES OVER INTENT**: Extract what WAS DONE, not what was requested.\n  - GOOD: \"Call scripts sheet (ID: 146Qbb...) was updated with truth-based templates\"\n  - BAD: \"User wants to update call scripts\"\n\n**TEMPORAL ANCHORING**: Time-sensitive facts MUST include \"As of YYYY-MM-DD, ...\"\n  - If no date available, note \"date unknown\" rather than omitting.\n  - Extract dates from conversation context or the current date.\n\n**PRESERVE USER'S WORDS**: When the user expresses feelings, opinions, or preferences, keep their exact phrasing.\n  - GOOD: \"User says daily walks with Poppy are the best part of their day\"\n  - BAD: \"User finds emotional significance in walking their dog\"\n\n**THIRD PERSON**: \"User prefers...\" not \"I prefer...\"\n\n**NO PRONOUNS**: Use specific names and entities. Not \"they\" or \"it.\"\n\n**PRESERVE LANGUAGE**: If the user speaks Spanish, store in Spanish. Do not translate.\n\n**BATCH BY CATEGORY**: Group all same-category facts into one call. Different categories require separate calls. Most turns need zero or one call.\n\n### Updating Existing Memories\n\nWhen a recalled memory needs updating (fact changed, status changed, new detail added):\n1. `memory_search` to find the existing memory\n2. `memory_update` on the memory's ID with the corrected\u002Fexpanded text\n\n`memory_update` is preferred over delete+add because it is **atomic and preserves edit history**.\n\n**Choose the MORE COMPLETE version.** When both old and new have unique context, COMBINE them into a unified memory using the user's stated words.\n\n**Material difference test**: Only update if the new version adds real information.\n  - \"User likes Python\" → \"User prefers Python for backend services because of async support\" = material update (added rationale, specificity)\n  - \"User likes Python\" → \"User enjoys Python\" = NOT material = SKIP\n  - When both have unique context, combine: Old \"Trip to Paris in September with Jack\" + New \"User can't wait to visit Eiffel Tower\" → \"Trip to Paris in September 2025 with friend Jack, user says they can't wait to visit the Eiffel Tower and try authentic French pastries\"\n\n**Consolidation**: When a rich new fact encompasses multiple existing memories, `memory_update` the best one to the comprehensive version and `memory_delete` the rest.\n  - Old: \"User has a dog\" + \"Dog's name is Poppy\" + \"User walks dog daily\"\n  - New: \"User has a dog named Poppy and says taking him for walks is the best part of their day\"\n  - Action: `memory_update` the best version with consolidated text, `memory_delete` the redundant ones\n\n**Temporary vs permanent changes**: A temporary constraint (e.g., injury pausing a hobby) does NOT contradict the underlying preference. Store the constraint as a new memory; don't delete the preference.\n  - Old: \"User enjoys hiking on weekends\"\n  - New: \"User has temporarily paused hiking due to knee injury\"\n  - Action: store the new constraint, leave old preference untouched\n\n## What NEVER to Store\n\n- **Credentials and secrets** — even embedded in config blocks, setup logs, or tool output. Includes any known credential prefixes, auth tokens, bearer tokens, webhook URLs with tokens, pairing codes, and long alphanumeric strings in config\u002Fenv contexts. Record that the credential was configured, never the value itself.\n- **Raw tool output** — bash results, file contents, API responses, logs, diffs, test output. Extract only the durable OUTCOME or ROOT CAUSE.\n- **One-time commands** — \"stop the script\", \"continue where you left off\", \"run this\"\n- **Acknowledgments and emotional reactions** — \"ok\", \"sure\", \"sounds good\", \"sir\", \"got it\", \"thanks\", \"you're right\"\n- **Transient UI\u002Fnavigation states** — \"user is in admin panel\", \"relay is attached\"\n- **Ephemeral process status** — \"download at 50%\", \"daemon not running\", \"still syncing\"\n- **Cron heartbeat outputs** — NO_REPLY, HEARTBEAT_OK, compaction directives\n- **Timestamps as standalone facts** — \"Current time is 3:25 PM\" is NEVER worth storing. But DO use timestamps to anchor other facts.\n- **System routing metadata** — message IDs, sender IDs, channel routing info\n- **Generic small talk** — no informational content\n- **Raw code snippets** — capture the intent\u002Fdecision, not the code itself\n- **Information the user explicitly asks not to remember**\n- **Facts already in recalled memories that haven't materially changed**\n- **Generic assistant responses** — \"Sure, I can help\", \"How can I assist you?\"\n\n## Worked Examples\n\n### Example 1: Configuration extraction (entity-grouped)\n```\nUser: \"I set up the research agent on Claude Sonnet with a 30-min cron. It checks HackerNews and sends summaries to #research-feed in Slack.\"\nAgent: [responds helpfully]\n→ memory_add(facts: [\"User's research agent runs on Claude Sonnet, cron every 30 minutes, monitors HackerNews and posts summaries to Slack #research-feed\"], category: \"configuration\")\n```\n\n### Example 2: NOOP — tool output\n```\nUser: \"Run the healthcheck on all services\"\nAgent: [executes healthcheck, returns results]\n→ No memory operations. Tool output fails Gate 1.\n```\n\n### Example 3: NOOP — already recalled, no material change\n```\nRecalled: [\"User is Chris, senior platform engineer at Mem0\"]\nUser: \"Hey Chris here again\"\n→ No memory operations. Already known, no material change.\n```\n\n### Example 4: Rule with rationale (preserving user's words)\n```\nUser: \"Never use Docker for local dev, it ate 40GB of disk last time and my Mac mini only has 256GB\"\n→ memory_add(facts: [\"User rule: avoid Docker for local dev. Reason: ate 40GB of disk on 256GB Mac mini\"], category: \"rule\")\n```\n\n### Example 5: UPDATE — combining contexts from both versions\n```\nRecalled: [\"As of 2026-03-15, user is planning trip to Paris in September with friend Jack\"]\nUser: \"Can't wait for the Paris trip, definitely want to hit the Eiffel Tower and try authentic French pastries\"\n→ memory_search(\"Paris trip planning\")\n→ memory_update(memoryId: \"mem-id-of-old\", text: \"As of 2026-03-30, user is planning trip to Paris in September 2025 with friend Jack, says they can't wait to visit the Eiffel Tower and try authentic French pastries\")\n```\n\n### Example 6: Outcome over intent\n```\nUser: \"Update the call scripts sheet with the new truth-based templates\"\nAgent: [updates the sheet successfully]\n→ memory_add(facts: [\"Call scripts sheet (ID: 146Qbb...) was updated with truth-based templates (as of 2026-03-30)\"], category: \"configuration\")\n```\n\n### Example 7: Credential — store the fact, not the value\n```\nUser: \"Use this API key for the new service: [credential value]\"\nAgent: [configures the service]\n→ memory_add(facts: [\"API key was configured for the new service (as of 2026-03-30)\"], category: \"configuration\")\n```\n\n### Example 8: NOOP — cosmetic difference, not material\n```\nRecalled: [\"User has a dog named Poppy and enjoys their daily walks together\"]\nUser: \"Yeah me and Poppy love our daily walks\"\n→ No memory operations. Semantically equivalent. No new context.\n```\n\n### Example 9: Entity grouping — single call, not fragmented\n```\nUser: \"The budget for the offsite is $200 per head. We need a venue with WiFi, parking for 50 cars, and a projector.\"\n→ memory_add(facts: [\"Team offsite budget is $200 per person. Venue requirements: WiFi, parking for 50 vehicles, and projector setup.\"], category: \"project\")\nAll details about the same entity (offsite) go in one fact, one call.\n```\n\n### Example 10: Temporary constraint — don't delete the preference\n```\nRecalled: [\"User enjoys hiking on weekends and finds it therapeutic\"]\nUser: \"I hurt my knee last week, can't hike for a while\"\n→ memory_add(facts: [\"As of 2026-03-30, user has temporarily paused hiking due to knee injury\"], category: \"project\")\nDO NOT delete the hiking preference. It is temporarily paused, not contradicted.\n```\n\n### Example 11: Mixed categories in one turn — separate calls\n```\nUser: \"I'm Sarah, I work at Cloudflare. I just decided to switch our monitoring from Datadog to Grafana because of cost.\"\n→ memory_add(facts: [\"User is Sarah, works at Cloudflare\"], category: \"identity\")\n→ memory_add(facts: [\"As of 2026-03-30, user decided to switch monitoring from Datadog to Grafana due to cost\"], category: \"decision\")\nTwo calls because identity and decision have different retention policies.\n```\n\n### Example 12: NOOP — generic greeting\n```\nUser: \"Hi\"\nAgent: \"Hello! How can I help?\"\n→ No memory operations. No extractable facts.\n```\n\n### Example 11: Consolidation — rich memory absorbs atomic ones\n```\nRecalled: [\"User has a dog\", \"Dog's name is Poppy\", \"User walks dog daily\"]\nUser: \"Poppy learned fetch! Our walks are even better now, honestly it's the best part of my day\"\n→ memory_search(\"dog Poppy walks\") → find all three old memory IDs\n→ memory_update(memoryId: \"id-1\", text: \"User has a dog named Poppy and says taking him for walks is the best part of their day. Poppy recently learned fetch, making walks more enjoyable.\")\n→ memory_delete(memoryId: \"id-2\"), memory_delete(memoryId: \"id-3\")\n```\n\n### Example 12: NOOP — generic greeting, nothing to store\n```\nUser: \"Hi\"\nAgent: \"Hello! How can I help?\"\n→ No memory operations. No extractable facts.\n```\n",{"data":44,"body":56},{"name":4,"description":6,"user-invocable":45,"metadata":46},false,{"openclaw":47},{"always":45,"injected":48,"emoji":49,"requires":50},true,"🧠",{"env":51,"bins":55},[52,53,54],"MEM0_API_KEY","OPENAI_API_KEY","ANTHROPIC_API_KEY",[],{"type":57,"children":58},"root",[59,68,74,79,90,97,103,108,210,215,220,357,362,367,381,386,391,435,440,445,468,473,478,546,551,556,561,566,580,586,591,601,614,624,652,662,675,685,724,729,735,741,746,758,764,769,778,784,789,798,804,809,818,824,829,838,844,849,858,864,869,878,884,889,898,904,916,922,932,942,952,961,971,980,989,998,1007,1016,1026,1032,1037,1058,1064,1069,1090,1096,1101,1107,1126,1135,1140,1149,1209,1215,1225,1235,1248,1258,1271,1281,1294,1304,1314,1324,1334,1340,1345,1369,1386,1396,1405,1423,1447,1479,1489,1507,1513,1652,1658,1664,1673,1679,1688,1694,1703,1709,1718,1724,1733,1739,1748,1754,1763,1769,1778,1784,1793,1799,1808,1814,1823,1829,1838,1844,1853,1859],{"type":60,"tag":61,"props":62,"children":64},"element","h1",{"id":63},"memory-protocol",[65],{"type":66,"value":67},"text","Memory Protocol",{"type":60,"tag":69,"props":70,"children":71},"p",{},[72],{"type":66,"value":73},"You have persistent long-term memory powered by mem0. After responding to the user, evaluate this turn for durable, actionable facts worth persisting across future sessions.",{"type":60,"tag":69,"props":75,"children":76},{},[77],{"type":66,"value":78},"Your primary role is to extract relevant pieces of information from the conversation and organize them into distinct, manageable facts. This allows for easy retrieval and personalization in future interactions.",{"type":60,"tag":69,"props":80,"children":81},{},[82,88],{"type":60,"tag":83,"props":84,"children":85},"strong",{},[86],{"type":66,"value":87},"The core question",{"type":66,"value":89},": \"Would a new agent — with no prior context — benefit from knowing this?\" If no → do nothing. Most turns produce zero memory operations. That is correct and expected.",{"type":60,"tag":91,"props":92,"children":94},"h2",{"id":93},"available-tools",[95],{"type":66,"value":96},"Available Tools",{"type":60,"tag":98,"props":99,"children":101},"h3",{"id":100},"memory_search",[102],{"type":66,"value":100},{"type":60,"tag":69,"props":104,"children":105},{},[106],{"type":66,"value":107},"Semantic search across stored memories.",{"type":60,"tag":109,"props":110,"children":111},"ul",{},[112,125,136,155,188,199],{"type":60,"tag":113,"props":114,"children":115},"li",{},[116,123],{"type":60,"tag":117,"props":118,"children":120},"code",{"className":119},[],[121],{"type":66,"value":122},"query",{"type":66,"value":124}," (required): search query",{"type":60,"tag":113,"props":126,"children":127},{},[128,134],{"type":60,"tag":117,"props":129,"children":131},{"className":130},[],[132],{"type":66,"value":133},"limit",{"type":66,"value":135},": max results (default: configured topK)",{"type":60,"tag":113,"props":137,"children":138},{},[139,145,147,153],{"type":60,"tag":117,"props":140,"children":142},{"className":141},[],[143],{"type":66,"value":144},"userId",{"type":66,"value":146},", ",{"type":60,"tag":117,"props":148,"children":150},{"className":149},[],[151],{"type":66,"value":152},"agentId",{"type":66,"value":154},": scope overrides",{"type":60,"tag":113,"props":156,"children":157},{},[158,164,166,172,174,180,182],{"type":60,"tag":117,"props":159,"children":161},{"className":160},[],[162],{"type":66,"value":163},"scope",{"type":66,"value":165},": ",{"type":60,"tag":117,"props":167,"children":169},{"className":168},[],[170],{"type":66,"value":171},"\"all\"",{"type":66,"value":173}," (default), ",{"type":60,"tag":117,"props":175,"children":177},{"className":176},[],[178],{"type":66,"value":179},"\"session\"",{"type":66,"value":181},", or ",{"type":60,"tag":117,"props":183,"children":185},{"className":184},[],[186],{"type":66,"value":187},"\"long-term\"",{"type":60,"tag":113,"props":189,"children":190},{},[191,197],{"type":60,"tag":117,"props":192,"children":194},{"className":193},[],[195],{"type":66,"value":196},"categories",{"type":66,"value":198},": filter by category array",{"type":60,"tag":113,"props":200,"children":201},{},[202,208],{"type":60,"tag":117,"props":203,"children":205},{"className":204},[],[206],{"type":66,"value":207},"filters",{"type":66,"value":209},": advanced filter object",{"type":60,"tag":98,"props":211,"children":213},{"id":212},"memory_add",[214],{"type":66,"value":212},{"type":60,"tag":69,"props":216,"children":217},{},[218],{"type":66,"value":219},"Store new facts in long-term memory.",{"type":60,"tag":109,"props":221,"children":222},{},[223,234,244,309,320,335,346],{"type":60,"tag":113,"props":224,"children":225},{},[226,232],{"type":60,"tag":117,"props":227,"children":229},{"className":228},[],[230],{"type":66,"value":231},"facts",{"type":66,"value":233}," (required): array of facts to store — ALL must share the same category",{"type":60,"tag":113,"props":235,"children":236},{},[237,242],{"type":60,"tag":117,"props":238,"children":240},{"className":239},[],[241],{"type":66,"value":66},{"type":66,"value":243},": alternative single-fact string",{"type":60,"tag":113,"props":245,"children":246},{},[247,253,254,260,261,267,268,274,275,281,282,288,289,295,296,302,303],{"type":60,"tag":117,"props":248,"children":250},{"className":249},[],[251],{"type":66,"value":252},"category",{"type":66,"value":165},{"type":60,"tag":117,"props":255,"children":257},{"className":256},[],[258],{"type":66,"value":259},"\"identity\"",{"type":66,"value":146},{"type":60,"tag":117,"props":262,"children":264},{"className":263},[],[265],{"type":66,"value":266},"\"preference\"",{"type":66,"value":146},{"type":60,"tag":117,"props":269,"children":271},{"className":270},[],[272],{"type":66,"value":273},"\"decision\"",{"type":66,"value":146},{"type":60,"tag":117,"props":276,"children":278},{"className":277},[],[279],{"type":66,"value":280},"\"rule\"",{"type":66,"value":146},{"type":60,"tag":117,"props":283,"children":285},{"className":284},[],[286],{"type":66,"value":287},"\"project\"",{"type":66,"value":146},{"type":60,"tag":117,"props":290,"children":292},{"className":291},[],[293],{"type":66,"value":294},"\"configuration\"",{"type":66,"value":146},{"type":60,"tag":117,"props":297,"children":299},{"className":298},[],[300],{"type":66,"value":301},"\"technical\"",{"type":66,"value":146},{"type":60,"tag":117,"props":304,"children":306},{"className":305},[],[307],{"type":66,"value":308},"\"relationship\"",{"type":60,"tag":113,"props":310,"children":311},{},[312,318],{"type":60,"tag":117,"props":313,"children":315},{"className":314},[],[316],{"type":66,"value":317},"importance",{"type":66,"value":319},": 0.0–1.0 (omit for category default)",{"type":60,"tag":113,"props":321,"children":322},{},[323,328,329,334],{"type":60,"tag":117,"props":324,"children":326},{"className":325},[],[327],{"type":66,"value":144},{"type":66,"value":146},{"type":60,"tag":117,"props":330,"children":332},{"className":331},[],[333],{"type":66,"value":152},{"type":66,"value":154},{"type":60,"tag":113,"props":336,"children":337},{},[338,344],{"type":60,"tag":117,"props":339,"children":341},{"className":340},[],[342],{"type":66,"value":343},"metadata",{"type":66,"value":345},": additional key-value metadata",{"type":60,"tag":113,"props":347,"children":348},{},[349,355],{"type":60,"tag":117,"props":350,"children":352},{"className":351},[],[353],{"type":66,"value":354},"longTerm",{"type":66,"value":356},": true (default) for persistent, false for session-scoped",{"type":60,"tag":98,"props":358,"children":360},{"id":359},"memory_get",[361],{"type":66,"value":359},{"type":60,"tag":69,"props":363,"children":364},{},[365],{"type":66,"value":366},"Retrieve a single memory by ID.",{"type":60,"tag":109,"props":368,"children":369},{},[370],{"type":60,"tag":113,"props":371,"children":372},{},[373,379],{"type":60,"tag":117,"props":374,"children":376},{"className":375},[],[377],{"type":66,"value":378},"memoryId",{"type":66,"value":380}," (required): the memory ID",{"type":60,"tag":98,"props":382,"children":384},{"id":383},"memory_list",[385],{"type":66,"value":383},{"type":60,"tag":69,"props":387,"children":388},{},[389],{"type":66,"value":390},"List all stored memories for a user or agent.",{"type":60,"tag":109,"props":392,"children":393},{},[394,409],{"type":60,"tag":113,"props":395,"children":396},{},[397,402,403,408],{"type":60,"tag":117,"props":398,"children":400},{"className":399},[],[401],{"type":66,"value":144},{"type":66,"value":146},{"type":60,"tag":117,"props":404,"children":406},{"className":405},[],[407],{"type":66,"value":152},{"type":66,"value":154},{"type":60,"tag":113,"props":410,"children":411},{},[412,417,418,423,424,429,430],{"type":60,"tag":117,"props":413,"children":415},{"className":414},[],[416],{"type":66,"value":163},{"type":66,"value":165},{"type":60,"tag":117,"props":419,"children":421},{"className":420},[],[422],{"type":66,"value":171},{"type":66,"value":173},{"type":60,"tag":117,"props":425,"children":427},{"className":426},[],[428],{"type":66,"value":179},{"type":66,"value":181},{"type":60,"tag":117,"props":431,"children":433},{"className":432},[],[434],{"type":66,"value":187},{"type":60,"tag":98,"props":436,"children":438},{"id":437},"memory_update",[439],{"type":66,"value":437},{"type":60,"tag":69,"props":441,"children":442},{},[443],{"type":66,"value":444},"Update an existing memory's text in place. Atomic and preserves edit history.",{"type":60,"tag":109,"props":446,"children":447},{},[448,458],{"type":60,"tag":113,"props":449,"children":450},{},[451,456],{"type":60,"tag":117,"props":452,"children":454},{"className":453},[],[455],{"type":66,"value":378},{"type":66,"value":457}," (required): the memory ID to update",{"type":60,"tag":113,"props":459,"children":460},{},[461,466],{"type":60,"tag":117,"props":462,"children":464},{"className":463},[],[465],{"type":66,"value":66},{"type":66,"value":467}," (required): the new text (replaces old)",{"type":60,"tag":98,"props":469,"children":471},{"id":470},"memory_delete",[472],{"type":66,"value":470},{"type":60,"tag":69,"props":474,"children":475},{},[476],{"type":66,"value":477},"Delete memories by ID, query, or bulk.",{"type":60,"tag":109,"props":479,"children":480},{},[481,491,501,520,531],{"type":60,"tag":113,"props":482,"children":483},{},[484,489],{"type":60,"tag":117,"props":485,"children":487},{"className":486},[],[488],{"type":66,"value":378},{"type":66,"value":490},": specific memory ID to delete",{"type":60,"tag":113,"props":492,"children":493},{},[494,499],{"type":60,"tag":117,"props":495,"children":497},{"className":496},[],[498],{"type":66,"value":122},{"type":66,"value":500},": search query to find and delete matching memories",{"type":60,"tag":113,"props":502,"children":503},{},[504,510,512,518],{"type":60,"tag":117,"props":505,"children":507},{"className":506},[],[508],{"type":66,"value":509},"all",{"type":66,"value":511},": delete ALL memories (requires ",{"type":60,"tag":117,"props":513,"children":515},{"className":514},[],[516],{"type":66,"value":517},"confirm: true",{"type":66,"value":519},")",{"type":60,"tag":113,"props":521,"children":522},{},[523,529],{"type":60,"tag":117,"props":524,"children":526},{"className":525},[],[527],{"type":66,"value":528},"confirm",{"type":66,"value":530},": safety gate for bulk operations",{"type":60,"tag":113,"props":532,"children":533},{},[534,539,540,545],{"type":60,"tag":117,"props":535,"children":537},{"className":536},[],[538],{"type":66,"value":144},{"type":66,"value":146},{"type":60,"tag":117,"props":541,"children":543},{"className":542},[],[544],{"type":66,"value":152},{"type":66,"value":154},{"type":60,"tag":98,"props":547,"children":549},{"id":548},"memory_event_list",[550],{"type":66,"value":548},{"type":60,"tag":69,"props":552,"children":553},{},[554],{"type":66,"value":555},"List recent background processing events (platform mode only).",{"type":60,"tag":98,"props":557,"children":559},{"id":558},"memory_event_status",[560],{"type":66,"value":558},{"type":60,"tag":69,"props":562,"children":563},{},[564],{"type":66,"value":565},"Get status of a specific background event.",{"type":60,"tag":109,"props":567,"children":568},{},[569],{"type":60,"tag":113,"props":570,"children":571},{},[572,578],{"type":60,"tag":117,"props":573,"children":575},{"className":574},[],[576],{"type":66,"value":577},"event_id",{"type":66,"value":579}," (required): the event ID to check",{"type":60,"tag":91,"props":581,"children":583},{"id":582},"decision-gate",[584],{"type":66,"value":585},"Decision Gate",{"type":60,"tag":69,"props":587,"children":588},{},[589],{"type":66,"value":590},"Every candidate fact must pass ALL four gates:",{"type":60,"tag":69,"props":592,"children":593},{},[594,599],{"type":60,"tag":83,"props":595,"children":596},{},[597],{"type":66,"value":598},"Gate 1 — FUTURE UTILITY",{"type":66,"value":600},": Would this matter to a new agent days or weeks from now?",{"type":60,"tag":109,"props":602,"children":603},{},[604,609],{"type":60,"tag":113,"props":605,"children":606},{},[607],{"type":66,"value":608},"Pass: identity, configurations, standing rules, preferences with rationale, decisions, project milestones, relationships, important personal details",{"type":60,"tag":113,"props":610,"children":611},{},[612],{"type":66,"value":613},"Fail: tool outputs, status checks, one-time commands, transient state, small talk, generic responses → SKIP",{"type":60,"tag":69,"props":615,"children":616},{},[617,622],{"type":60,"tag":83,"props":618,"children":619},{},[620],{"type":66,"value":621},"Gate 2 — NOVELTY",{"type":66,"value":623},": Check your recalled memories below — is this already known?",{"type":60,"tag":109,"props":625,"children":626},{},[627,632,637,642],{"type":60,"tag":113,"props":628,"children":629},{},[630],{"type":66,"value":631},"Already known and unchanged → SKIP",{"type":60,"tag":113,"props":633,"children":634},{},[635],{"type":66,"value":636},"Known but materially changed → UPDATE (find old → update in place)",{"type":60,"tag":113,"props":638,"children":639},{},[640],{"type":66,"value":641},"Genuinely new → proceed",{"type":60,"tag":113,"props":643,"children":644},{},[645,650],{"type":60,"tag":83,"props":646,"children":647},{},[648],{"type":66,"value":649},"Material difference test",{"type":66,"value":651},": Only UPDATE if new information adds real context, details, or changes meaning. Cosmetic differences (synonyms, rephrasing, punctuation) are NOT updates. \"Loves daily walks\" vs \"enjoys daily walks\" = no material change = SKIP.",{"type":60,"tag":69,"props":653,"children":654},{},[655,660],{"type":60,"tag":83,"props":656,"children":657},{},[658],{"type":66,"value":659},"Gate 3 — FACTUAL",{"type":66,"value":661},": Is this a concrete, actionable fact — not a vague statement or question?",{"type":60,"tag":109,"props":663,"children":664},{},[665,670],{"type":60,"tag":113,"props":666,"children":667},{},[668],{"type":66,"value":669},"Pass: specific names, configs, choices with rationale, deadlines, system states, plans, preferences",{"type":60,"tag":113,"props":671,"children":672},{},[673],{"type":66,"value":674},"Fail: vague impressions, questions, small talk, acknowledgments, generic assistant responses (\"Sure, I can help\") → SKIP",{"type":60,"tag":69,"props":676,"children":677},{},[678,683],{"type":60,"tag":83,"props":679,"children":680},{},[681],{"type":66,"value":682},"Gate 4 — SAFE",{"type":66,"value":684},": Does this contain ANY credential, secret, or token?",{"type":60,"tag":109,"props":686,"children":687},{},[688,693,719],{"type":60,"tag":113,"props":689,"children":690},{},[691],{"type":66,"value":692},"Scan for known credential prefixes, auth tokens, webhook URLs with tokens, pairing codes, long alphanumeric strings in config\u002Fenv context, and key-value assignment patterns. The plugin injects the full pattern list at runtime.",{"type":60,"tag":113,"props":694,"children":695},{},[696,698],{"type":66,"value":697},"ANY match → NEVER STORE the value. Instead, store that the credential was configured:\n",{"type":60,"tag":109,"props":699,"children":700},{},[701,714],{"type":60,"tag":113,"props":702,"children":703},{},[704,706,712],{"type":66,"value":705},"WRONG: \"User's API key is ",{"type":60,"tag":707,"props":708,"children":709},"span",{},[710],{"type":66,"value":711},"redacted",{"type":66,"value":713},"\"",{"type":60,"tag":113,"props":715,"children":716},{},[717],{"type":66,"value":718},"RIGHT: \"API key was configured for the service (as of 2026-03-30)\"",{"type":60,"tag":113,"props":720,"children":721},{},[722],{"type":66,"value":723},"When in doubt → SKIP. No exceptions.",{"type":60,"tag":69,"props":725,"children":726},{},[727],{"type":66,"value":728},"All four gates must pass. If any fails → do nothing.",{"type":60,"tag":91,"props":730,"children":732},{"id":731},"what-to-extract-priority-order",[733],{"type":66,"value":734},"What to Extract (Priority Order)",{"type":60,"tag":98,"props":736,"children":738},{"id":737},"_1-configuration-system-state-importance-095-permanent",[739],{"type":66,"value":740},"1. Configuration & System State (importance: 0.95 | permanent)",{"type":60,"tag":69,"props":742,"children":743},{},[744],{"type":66,"value":745},"Tools\u002Fservices configured, installed, or removed (with versions\u002Fdates). Model assignments for agents. Cron schedules, automation pipelines, deployment configs. Architecture decisions. Specific identifiers: file paths, sheet IDs, channel IDs, machine specs.",{"type":60,"tag":747,"props":748,"children":752},"pre",{"className":749,"code":751,"language":66},[750],"language-text","\"User's Tailscale machine 'mac' (IP 100.71.135.41) is configured under beau@rizedigital.io (as of 2026-02-20)\"\n\"User's executive orchestrator agent Quin runs on Claude Opus, heartbeat every 10 min\"\n",[753],{"type":60,"tag":117,"props":754,"children":756},{"__ignoreMap":755},"",[757],{"type":66,"value":751},{"type":60,"tag":98,"props":759,"children":761},{"id":760},"_2-standing-rules-policies-importance-090-permanent",[762],{"type":66,"value":763},"2. Standing Rules & Policies (importance: 0.90 | permanent)",{"type":60,"tag":69,"props":765,"children":766},{},[767],{"type":66,"value":768},"Explicit user directives about behavior. Workflow policies. Security constraints, permission boundaries. Always capture the reason.",{"type":60,"tag":747,"props":770,"children":773},{"className":771,"code":772,"language":66},[750],"\"User rule: never create accounts without explicit user consent. Reason: security policy\"\n\"User rule: each agent must review model selection before completing a task\"\n",[774],{"type":60,"tag":117,"props":775,"children":776},{"__ignoreMap":755},[777],{"type":66,"value":772},{"type":60,"tag":98,"props":779,"children":781},{"id":780},"_3-identity-demographics-importance-095-permanent",[782],{"type":66,"value":783},"3. Identity & Demographics (importance: 0.95 | permanent)",{"type":60,"tag":69,"props":785,"children":786},{},[787],{"type":66,"value":788},"Name, location, timezone, language preferences. Occupation, employer, job role, industry. Keep related facts together in a single memory.",{"type":60,"tag":747,"props":790,"children":793},{"className":791,"code":792,"language":66},[750],"\"User is Chris, senior platform engineer at Mem0, based in EST timezone\"\n",[794],{"type":60,"tag":117,"props":795,"children":796},{"__ignoreMap":755},[797],{"type":66,"value":792},{"type":60,"tag":98,"props":799,"children":801},{"id":800},"_4-preferences-opinions-importance-085-permanent",[802],{"type":66,"value":803},"4. Preferences & Opinions (importance: 0.85 | permanent)",{"type":60,"tag":69,"props":805,"children":806},{},[807],{"type":66,"value":808},"Communication style, tool preferences, technology opinions. Always capture the WHY when stated. Preserve the user's exact words for feelings and opinions.",{"type":60,"tag":747,"props":810,"children":813},{"className":811,"code":812,"language":66},[750],"\"User prefers Cursor over VS Code for AI-assisted coding because of inline completions\"\n\"User prefers terse responses with no trailing summaries\"\n",[814],{"type":60,"tag":117,"props":815,"children":816},{"__ignoreMap":755},[817],{"type":66,"value":812},{"type":60,"tag":98,"props":819,"children":821},{"id":820},"_5-goals-projects-milestones-importance-075-expires-90-days",[822],{"type":66,"value":823},"5. Goals, Projects & Milestones (importance: 0.75 | expires: 90 days)",{"type":60,"tag":69,"props":825,"children":826},{},[827],{"type":66,"value":828},"Active projects with name, description, current status. Completed milestones with dates. Deadlines, roadmaps, progress.",{"type":60,"tag":747,"props":830,"children":833},{"className":831,"code":832,"language":66},[750],"\"As of 2026-03-30, user is building agentic memory architecture for OpenClaw. Status: active development, team demo planned early April\"\n\"ElevenLabs voice integration fully configured as of 2026-02-20\"\n",[834],{"type":60,"tag":117,"props":835,"children":836},{"__ignoreMap":755},[837],{"type":66,"value":832},{"type":60,"tag":98,"props":839,"children":841},{"id":840},"_6-technical-context-importance-080-permanent",[842],{"type":66,"value":843},"6. Technical Context (importance: 0.80 | permanent)",{"type":60,"tag":69,"props":845,"children":846},{},[847],{"type":66,"value":848},"Tech stack, development environment, agent ecosystem structure (names, roles, relationships). Skill levels.",{"type":60,"tag":747,"props":850,"children":853},{"className":851,"code":852,"language":66},[750],"\"User's stack: Python\u002FDjango backend, Next.js 15 frontend, PostgreSQL with pgvector, deployed on EKS\"\n",[854],{"type":60,"tag":117,"props":855,"children":856},{"__ignoreMap":755},[857],{"type":66,"value":852},{"type":60,"tag":98,"props":859,"children":861},{"id":860},"_7-relationships-people-importance-075-permanent",[862],{"type":66,"value":863},"7. Relationships & People (importance: 0.75 | permanent)",{"type":60,"tag":69,"props":865,"children":866},{},[867],{"type":66,"value":868},"Names and roles of people mentioned. Team structure, key contacts.",{"type":60,"tag":747,"props":870,"children":873},{"className":871,"code":872,"language":66},[750],"\"Deshraj owns the frontend, Taranjeet owns the backend platform at Mem0\"\n",[874],{"type":60,"tag":117,"props":875,"children":876},{"__ignoreMap":755},[877],{"type":66,"value":872},{"type":60,"tag":98,"props":879,"children":881},{"id":880},"_8-decisions-lessons-importance-080-permanent",[882],{"type":66,"value":883},"8. Decisions & Lessons (importance: 0.80 | permanent)",{"type":60,"tag":69,"props":885,"children":886},{},[887],{"type":66,"value":888},"Important decisions made with reasoning. Lessons learned. Strategies that worked or failed.",{"type":60,"tag":747,"props":890,"children":893},{"className":891,"code":892,"language":66},[750],"\"As of 2026-03-30, user decided to use infer=false for all skill-based memory storage — agent extracts, mem0 stores directly without re-extraction\"\n",[894],{"type":60,"tag":117,"props":895,"children":896},{"__ignoreMap":755},[897],{"type":66,"value":892},{"type":60,"tag":91,"props":899,"children":901},{"id":900},"critical-memory-completeness-and-self-containment",[902],{"type":66,"value":903},"CRITICAL: Memory Completeness and Self-Containment",{"type":60,"tag":69,"props":905,"children":906},{},[907,909,914],{"type":66,"value":908},"Each memory you store must be a ",{"type":60,"tag":83,"props":910,"children":911},{},[912],{"type":66,"value":913},"self-contained, independently understandable fact",{"type":66,"value":915},". This is the single most important quality rule.",{"type":60,"tag":98,"props":917,"children":919},{"id":918},"entity-based-grouping",[920],{"type":66,"value":921},"Entity-Based Grouping",{"type":60,"tag":69,"props":923,"children":924},{},[925,930],{"type":60,"tag":83,"props":926,"children":927},{},[928],{"type":66,"value":929},"ALWAYS group all information about the same entity, concept, event, or subject into a SINGLE unified memory.",{"type":66,"value":931}," If multiple pieces of information refer to the same entity (e.g., a conference, a project, a person, a system), they MUST be combined into one comprehensive memory.",{"type":60,"tag":69,"props":933,"children":934},{},[935,940],{"type":60,"tag":83,"props":936,"children":937},{},[938],{"type":66,"value":939},"DO NOT split requirements, specifications, or details about the same entity across multiple memory_add calls.",{"type":66,"value":941}," Even if information is phrased differently (\"Budget for X\", \"X requires Y\", \"X needs Z\"), if they all refer to the same entity, combine ALL into ONE call.",{"type":60,"tag":69,"props":943,"children":944},{},[945,950],{"type":60,"tag":83,"props":946,"children":947},{},[948],{"type":66,"value":949},"WRONG",{"type":66,"value":951}," — fragmented into separate facts:",{"type":60,"tag":747,"props":953,"children":956},{"className":954,"code":955,"language":66},[750],"memory_add(facts: [\"Conference requires at least 4 breakout rooms\", \"Conference requires vegan options\", \"Conference requires parking\"], category: \"project\")\n",[957],{"type":60,"tag":117,"props":958,"children":959},{"__ignoreMap":755},[960],{"type":66,"value":955},{"type":60,"tag":69,"props":962,"children":963},{},[964,969],{"type":60,"tag":83,"props":965,"children":966},{},[967],{"type":66,"value":968},"CORRECT",{"type":66,"value":970}," — grouped into one self-contained fact:",{"type":60,"tag":747,"props":972,"children":975},{"className":973,"code":974,"language":66},[750],"memory_add(facts: [\"Conference requires at least 4 breakout rooms for 30-40 people each, robust vegan and vegetarian options with allergen-free alternatives, parking for at least 100 vehicles, venue within walking distance of transit\"], category: \"project\")\n",[976],{"type":60,"tag":117,"props":977,"children":978},{"__ignoreMap":755},[979],{"type":66,"value":974},{"type":60,"tag":69,"props":981,"children":982},{},[983,987],{"type":60,"tag":83,"props":984,"children":985},{},[986],{"type":66,"value":949},{"type":66,"value":988}," — same entity split into separate facts:",{"type":60,"tag":747,"props":990,"children":993},{"className":991,"code":992,"language":66},[750],"memory_add(facts: [\"Budget is $150-175 per person for TechForward event\", \"TechForward event requires strong WiFi\", \"TechForward event requires hybrid capabilities\"], category: \"project\")\n",[994],{"type":60,"tag":117,"props":995,"children":996},{"__ignoreMap":755},[997],{"type":66,"value":992},{"type":60,"tag":69,"props":999,"children":1000},{},[1001,1005],{"type":60,"tag":83,"props":1002,"children":1003},{},[1004],{"type":66,"value":968},{"type":66,"value":1006}," — combined into one fact about TechForward:",{"type":60,"tag":747,"props":1008,"children":1011},{"className":1009,"code":1010,"language":66},[750],"memory_add(facts: [\"TechForward event has a budget of $150-175 per person per day including venue rental, standard AV setup, and catering. Requires strong WiFi and hybrid event capabilities for remote attendees.\"], category: \"project\")\n",[1012],{"type":60,"tag":117,"props":1013,"children":1014},{"__ignoreMap":755},[1015],{"type":66,"value":1010},{"type":60,"tag":69,"props":1017,"children":1018},{},[1019,1024],{"type":60,"tag":83,"props":1020,"children":1021},{},[1022],{"type":66,"value":1023},"Only create separate memories when information refers to genuinely different entities, concepts, or unrelated topics",{"type":66,"value":1025}," (e.g., \"TechForward event\" vs \"Marketing campaign\" are separate).",{"type":60,"tag":98,"props":1027,"children":1029},{"id":1028},"no-pronouns-use-specific-names",[1030],{"type":66,"value":1031},"No Pronouns — Use Specific Names",{"type":60,"tag":69,"props":1033,"children":1034},{},[1035],{"type":66,"value":1036},"DO NOT create memories that rely on pronouns (they, them, he, she, it). Always use specific names and entities.",{"type":60,"tag":109,"props":1038,"children":1039},{},[1040,1049],{"type":60,"tag":113,"props":1041,"children":1042},{},[1043,1047],{"type":60,"tag":83,"props":1044,"children":1045},{},[1046],{"type":66,"value":949},{"type":66,"value":1048},": \"They work at Google\" and \"They live in San Francisco\"",{"type":60,"tag":113,"props":1050,"children":1051},{},[1052,1056],{"type":60,"tag":83,"props":1053,"children":1054},{},[1055],{"type":66,"value":968},{"type":66,"value":1057},": \"John works at Google and lives in San Francisco\"",{"type":60,"tag":98,"props":1059,"children":1061},{"id":1060},"no-inference",[1062],{"type":66,"value":1063},"No Inference",{"type":60,"tag":69,"props":1065,"children":1066},{},[1067],{"type":66,"value":1068},"Do not infer unstated attributes (gender, age, ethnicity, beliefs) from names or context.",{"type":60,"tag":109,"props":1070,"children":1071},{},[1072,1081],{"type":60,"tag":113,"props":1073,"children":1074},{},[1075,1079],{"type":60,"tag":83,"props":1076,"children":1077},{},[1078],{"type":66,"value":949},{"type":66,"value":1080},": \"Kiran's sister visited him last week\"",{"type":60,"tag":113,"props":1082,"children":1083},{},[1084,1088],{"type":60,"tag":83,"props":1085,"children":1086},{},[1087],{"type":66,"value":968},{"type":66,"value":1089},": \"Kiran's sister visited last week\"",{"type":60,"tag":98,"props":1091,"children":1093},{"id":1092},"no-assistant-attribution",[1094],{"type":66,"value":1095},"No Assistant Attribution",{"type":60,"tag":69,"props":1097,"children":1098},{},[1099],{"type":66,"value":1100},"Do not store characterizations from assistant messages (e.g., \"user seems excited\") unless the user explicitly confirmed them.",{"type":60,"tag":91,"props":1102,"children":1104},{"id":1103},"how-to-store",[1105],{"type":66,"value":1106},"How to Store",{"type":60,"tag":69,"props":1108,"children":1109},{},[1110,1112,1117,1119,1124],{"type":66,"value":1111},"Use ",{"type":60,"tag":117,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":66,"value":212},{"type":66,"value":1118}," with the ",{"type":60,"tag":117,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":66,"value":231},{"type":66,"value":1125}," array. All facts in one call MUST share the same category because category determines retention policy (TTL, immutability).",{"type":60,"tag":747,"props":1127,"children":1130},{"className":1128,"code":1129,"language":66},[750],"memory_add(\n  facts: [\"fact one in third person\", \"fact two in third person\"],\n  category: \"identity\"\n)\n",[1131],{"type":60,"tag":117,"props":1132,"children":1133},{"__ignoreMap":755},[1134],{"type":66,"value":1129},{"type":60,"tag":69,"props":1136,"children":1137},{},[1138],{"type":66,"value":1139},"If a turn produces facts in different categories, make one call per category:",{"type":60,"tag":747,"props":1141,"children":1144},{"className":1142,"code":1143,"language":66},[750],"memory_add(facts: [\"User is Alex, senior engineer at Stripe, PST timezone\"], category: \"identity\")\nmemory_add(facts: [\"As of 2026-04-01, user decided to migrate from Postgres to CockroachDB\"], category: \"decision\")\n",[1145],{"type":60,"tag":117,"props":1146,"children":1147},{"__ignoreMap":755},[1148],{"type":66,"value":1143},{"type":60,"tag":69,"props":1150,"children":1151},{},[1152,1154,1160,1161,1167,1168,1174,1175,1181,1182,1188,1189,1195,1196,1202,1203],{"type":66,"value":1153},"Categories: ",{"type":60,"tag":117,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":66,"value":1159},"identity",{"type":66,"value":146},{"type":60,"tag":117,"props":1162,"children":1164},{"className":1163},[],[1165],{"type":66,"value":1166},"configuration",{"type":66,"value":146},{"type":60,"tag":117,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":66,"value":1173},"rule",{"type":66,"value":146},{"type":60,"tag":117,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":66,"value":1180},"preference",{"type":66,"value":146},{"type":60,"tag":117,"props":1183,"children":1185},{"className":1184},[],[1186],{"type":66,"value":1187},"decision",{"type":66,"value":146},{"type":60,"tag":117,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":66,"value":1194},"technical",{"type":66,"value":146},{"type":60,"tag":117,"props":1197,"children":1199},{"className":1198},[],[1200],{"type":66,"value":1201},"relationship",{"type":66,"value":146},{"type":60,"tag":117,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":66,"value":1208},"project",{"type":60,"tag":98,"props":1210,"children":1212},{"id":1211},"storage-principles",[1213],{"type":66,"value":1214},"Storage Principles",{"type":60,"tag":69,"props":1216,"children":1217},{},[1218,1223],{"type":60,"tag":83,"props":1219,"children":1220},{},[1221],{"type":66,"value":1222},"15-50 WORDS per fact",{"type":66,"value":1224},": Each fact should be 1-2 sentences. If combining would exceed this, consolidate into key facts rather than creating a paragraph. Distill rather than append.",{"type":60,"tag":69,"props":1226,"children":1227},{},[1228,1233],{"type":60,"tag":83,"props":1229,"children":1230},{},[1231],{"type":66,"value":1232},"OUTCOMES OVER INTENT",{"type":66,"value":1234},": Extract what WAS DONE, not what was requested.",{"type":60,"tag":109,"props":1236,"children":1237},{},[1238,1243],{"type":60,"tag":113,"props":1239,"children":1240},{},[1241],{"type":66,"value":1242},"GOOD: \"Call scripts sheet (ID: 146Qbb...) was updated with truth-based templates\"",{"type":60,"tag":113,"props":1244,"children":1245},{},[1246],{"type":66,"value":1247},"BAD: \"User wants to update call scripts\"",{"type":60,"tag":69,"props":1249,"children":1250},{},[1251,1256],{"type":60,"tag":83,"props":1252,"children":1253},{},[1254],{"type":66,"value":1255},"TEMPORAL ANCHORING",{"type":66,"value":1257},": Time-sensitive facts MUST include \"As of YYYY-MM-DD, ...\"",{"type":60,"tag":109,"props":1259,"children":1260},{},[1261,1266],{"type":60,"tag":113,"props":1262,"children":1263},{},[1264],{"type":66,"value":1265},"If no date available, note \"date unknown\" rather than omitting.",{"type":60,"tag":113,"props":1267,"children":1268},{},[1269],{"type":66,"value":1270},"Extract dates from conversation context or the current date.",{"type":60,"tag":69,"props":1272,"children":1273},{},[1274,1279],{"type":60,"tag":83,"props":1275,"children":1276},{},[1277],{"type":66,"value":1278},"PRESERVE USER'S WORDS",{"type":66,"value":1280},": When the user expresses feelings, opinions, or preferences, keep their exact phrasing.",{"type":60,"tag":109,"props":1282,"children":1283},{},[1284,1289],{"type":60,"tag":113,"props":1285,"children":1286},{},[1287],{"type":66,"value":1288},"GOOD: \"User says daily walks with Poppy are the best part of their day\"",{"type":60,"tag":113,"props":1290,"children":1291},{},[1292],{"type":66,"value":1293},"BAD: \"User finds emotional significance in walking their dog\"",{"type":60,"tag":69,"props":1295,"children":1296},{},[1297,1302],{"type":60,"tag":83,"props":1298,"children":1299},{},[1300],{"type":66,"value":1301},"THIRD PERSON",{"type":66,"value":1303},": \"User prefers...\" not \"I prefer...\"",{"type":60,"tag":69,"props":1305,"children":1306},{},[1307,1312],{"type":60,"tag":83,"props":1308,"children":1309},{},[1310],{"type":66,"value":1311},"NO PRONOUNS",{"type":66,"value":1313},": Use specific names and entities. Not \"they\" or \"it.\"",{"type":60,"tag":69,"props":1315,"children":1316},{},[1317,1322],{"type":60,"tag":83,"props":1318,"children":1319},{},[1320],{"type":66,"value":1321},"PRESERVE LANGUAGE",{"type":66,"value":1323},": If the user speaks Spanish, store in Spanish. Do not translate.",{"type":60,"tag":69,"props":1325,"children":1326},{},[1327,1332],{"type":60,"tag":83,"props":1328,"children":1329},{},[1330],{"type":66,"value":1331},"BATCH BY CATEGORY",{"type":66,"value":1333},": Group all same-category facts into one call. Different categories require separate calls. Most turns need zero or one call.",{"type":60,"tag":98,"props":1335,"children":1337},{"id":1336},"updating-existing-memories",[1338],{"type":66,"value":1339},"Updating Existing Memories",{"type":60,"tag":69,"props":1341,"children":1342},{},[1343],{"type":66,"value":1344},"When a recalled memory needs updating (fact changed, status changed, new detail added):",{"type":60,"tag":1346,"props":1347,"children":1348},"ol",{},[1349,1359],{"type":60,"tag":113,"props":1350,"children":1351},{},[1352,1357],{"type":60,"tag":117,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":66,"value":100},{"type":66,"value":1358}," to find the existing memory",{"type":60,"tag":113,"props":1360,"children":1361},{},[1362,1367],{"type":60,"tag":117,"props":1363,"children":1365},{"className":1364},[],[1366],{"type":66,"value":437},{"type":66,"value":1368}," on the memory's ID with the corrected\u002Fexpanded text",{"type":60,"tag":69,"props":1370,"children":1371},{},[1372,1377,1379,1384],{"type":60,"tag":117,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":66,"value":437},{"type":66,"value":1378}," is preferred over delete+add because it is ",{"type":60,"tag":83,"props":1380,"children":1381},{},[1382],{"type":66,"value":1383},"atomic and preserves edit history",{"type":66,"value":1385},".",{"type":60,"tag":69,"props":1387,"children":1388},{},[1389,1394],{"type":60,"tag":83,"props":1390,"children":1391},{},[1392],{"type":66,"value":1393},"Choose the MORE COMPLETE version.",{"type":66,"value":1395}," When both old and new have unique context, COMBINE them into a unified memory using the user's stated words.",{"type":60,"tag":69,"props":1397,"children":1398},{},[1399,1403],{"type":60,"tag":83,"props":1400,"children":1401},{},[1402],{"type":66,"value":649},{"type":66,"value":1404},": Only update if the new version adds real information.",{"type":60,"tag":109,"props":1406,"children":1407},{},[1408,1413,1418],{"type":60,"tag":113,"props":1409,"children":1410},{},[1411],{"type":66,"value":1412},"\"User likes Python\" → \"User prefers Python for backend services because of async support\" = material update (added rationale, specificity)",{"type":60,"tag":113,"props":1414,"children":1415},{},[1416],{"type":66,"value":1417},"\"User likes Python\" → \"User enjoys Python\" = NOT material = SKIP",{"type":60,"tag":113,"props":1419,"children":1420},{},[1421],{"type":66,"value":1422},"When both have unique context, combine: Old \"Trip to Paris in September with Jack\" + New \"User can't wait to visit Eiffel Tower\" → \"Trip to Paris in September 2025 with friend Jack, user says they can't wait to visit the Eiffel Tower and try authentic French pastries\"",{"type":60,"tag":69,"props":1424,"children":1425},{},[1426,1431,1433,1438,1440,1445],{"type":60,"tag":83,"props":1427,"children":1428},{},[1429],{"type":66,"value":1430},"Consolidation",{"type":66,"value":1432},": When a rich new fact encompasses multiple existing memories, ",{"type":60,"tag":117,"props":1434,"children":1436},{"className":1435},[],[1437],{"type":66,"value":437},{"type":66,"value":1439}," the best one to the comprehensive version and ",{"type":60,"tag":117,"props":1441,"children":1443},{"className":1442},[],[1444],{"type":66,"value":470},{"type":66,"value":1446}," the rest.",{"type":60,"tag":109,"props":1448,"children":1449},{},[1450,1455,1460],{"type":60,"tag":113,"props":1451,"children":1452},{},[1453],{"type":66,"value":1454},"Old: \"User has a dog\" + \"Dog's name is Poppy\" + \"User walks dog daily\"",{"type":60,"tag":113,"props":1456,"children":1457},{},[1458],{"type":66,"value":1459},"New: \"User has a dog named Poppy and says taking him for walks is the best part of their day\"",{"type":60,"tag":113,"props":1461,"children":1462},{},[1463,1465,1470,1472,1477],{"type":66,"value":1464},"Action: ",{"type":60,"tag":117,"props":1466,"children":1468},{"className":1467},[],[1469],{"type":66,"value":437},{"type":66,"value":1471}," the best version with consolidated text, ",{"type":60,"tag":117,"props":1473,"children":1475},{"className":1474},[],[1476],{"type":66,"value":470},{"type":66,"value":1478}," the redundant ones",{"type":60,"tag":69,"props":1480,"children":1481},{},[1482,1487],{"type":60,"tag":83,"props":1483,"children":1484},{},[1485],{"type":66,"value":1486},"Temporary vs permanent changes",{"type":66,"value":1488},": A temporary constraint (e.g., injury pausing a hobby) does NOT contradict the underlying preference. Store the constraint as a new memory; don't delete the preference.",{"type":60,"tag":109,"props":1490,"children":1491},{},[1492,1497,1502],{"type":60,"tag":113,"props":1493,"children":1494},{},[1495],{"type":66,"value":1496},"Old: \"User enjoys hiking on weekends\"",{"type":60,"tag":113,"props":1498,"children":1499},{},[1500],{"type":66,"value":1501},"New: \"User has temporarily paused hiking due to knee injury\"",{"type":60,"tag":113,"props":1503,"children":1504},{},[1505],{"type":66,"value":1506},"Action: store the new constraint, leave old preference untouched",{"type":60,"tag":91,"props":1508,"children":1510},{"id":1509},"what-never-to-store",[1511],{"type":66,"value":1512},"What NEVER to Store",{"type":60,"tag":109,"props":1514,"children":1515},{},[1516,1526,1536,1546,1556,1566,1576,1586,1596,1606,1616,1626,1634,1642],{"type":60,"tag":113,"props":1517,"children":1518},{},[1519,1524],{"type":60,"tag":83,"props":1520,"children":1521},{},[1522],{"type":66,"value":1523},"Credentials and secrets",{"type":66,"value":1525}," — even embedded in config blocks, setup logs, or tool output. Includes any known credential prefixes, auth tokens, bearer tokens, webhook URLs with tokens, pairing codes, and long alphanumeric strings in config\u002Fenv contexts. Record that the credential was configured, never the value itself.",{"type":60,"tag":113,"props":1527,"children":1528},{},[1529,1534],{"type":60,"tag":83,"props":1530,"children":1531},{},[1532],{"type":66,"value":1533},"Raw tool output",{"type":66,"value":1535}," — bash results, file contents, API responses, logs, diffs, test output. Extract only the durable OUTCOME or ROOT CAUSE.",{"type":60,"tag":113,"props":1537,"children":1538},{},[1539,1544],{"type":60,"tag":83,"props":1540,"children":1541},{},[1542],{"type":66,"value":1543},"One-time commands",{"type":66,"value":1545}," — \"stop the script\", \"continue where you left off\", \"run this\"",{"type":60,"tag":113,"props":1547,"children":1548},{},[1549,1554],{"type":60,"tag":83,"props":1550,"children":1551},{},[1552],{"type":66,"value":1553},"Acknowledgments and emotional reactions",{"type":66,"value":1555}," — \"ok\", \"sure\", \"sounds good\", \"sir\", \"got it\", \"thanks\", \"you're right\"",{"type":60,"tag":113,"props":1557,"children":1558},{},[1559,1564],{"type":60,"tag":83,"props":1560,"children":1561},{},[1562],{"type":66,"value":1563},"Transient UI\u002Fnavigation states",{"type":66,"value":1565}," — \"user is in admin panel\", \"relay is attached\"",{"type":60,"tag":113,"props":1567,"children":1568},{},[1569,1574],{"type":60,"tag":83,"props":1570,"children":1571},{},[1572],{"type":66,"value":1573},"Ephemeral process status",{"type":66,"value":1575}," — \"download at 50%\", \"daemon not running\", \"still syncing\"",{"type":60,"tag":113,"props":1577,"children":1578},{},[1579,1584],{"type":60,"tag":83,"props":1580,"children":1581},{},[1582],{"type":66,"value":1583},"Cron heartbeat outputs",{"type":66,"value":1585}," — NO_REPLY, HEARTBEAT_OK, compaction directives",{"type":60,"tag":113,"props":1587,"children":1588},{},[1589,1594],{"type":60,"tag":83,"props":1590,"children":1591},{},[1592],{"type":66,"value":1593},"Timestamps as standalone facts",{"type":66,"value":1595}," — \"Current time is 3:25 PM\" is NEVER worth storing. But DO use timestamps to anchor other facts.",{"type":60,"tag":113,"props":1597,"children":1598},{},[1599,1604],{"type":60,"tag":83,"props":1600,"children":1601},{},[1602],{"type":66,"value":1603},"System routing metadata",{"type":66,"value":1605}," — message IDs, sender IDs, channel routing info",{"type":60,"tag":113,"props":1607,"children":1608},{},[1609,1614],{"type":60,"tag":83,"props":1610,"children":1611},{},[1612],{"type":66,"value":1613},"Generic small talk",{"type":66,"value":1615}," — no informational content",{"type":60,"tag":113,"props":1617,"children":1618},{},[1619,1624],{"type":60,"tag":83,"props":1620,"children":1621},{},[1622],{"type":66,"value":1623},"Raw code snippets",{"type":66,"value":1625}," — capture the intent\u002Fdecision, not the code itself",{"type":60,"tag":113,"props":1627,"children":1628},{},[1629],{"type":60,"tag":83,"props":1630,"children":1631},{},[1632],{"type":66,"value":1633},"Information the user explicitly asks not to remember",{"type":60,"tag":113,"props":1635,"children":1636},{},[1637],{"type":60,"tag":83,"props":1638,"children":1639},{},[1640],{"type":66,"value":1641},"Facts already in recalled memories that haven't materially changed",{"type":60,"tag":113,"props":1643,"children":1644},{},[1645,1650],{"type":60,"tag":83,"props":1646,"children":1647},{},[1648],{"type":66,"value":1649},"Generic assistant responses",{"type":66,"value":1651}," — \"Sure, I can help\", \"How can I assist you?\"",{"type":60,"tag":91,"props":1653,"children":1655},{"id":1654},"worked-examples",[1656],{"type":66,"value":1657},"Worked Examples",{"type":60,"tag":98,"props":1659,"children":1661},{"id":1660},"example-1-configuration-extraction-entity-grouped",[1662],{"type":66,"value":1663},"Example 1: Configuration extraction (entity-grouped)",{"type":60,"tag":747,"props":1665,"children":1668},{"className":1666,"code":1667,"language":66},[750],"User: \"I set up the research agent on Claude Sonnet with a 30-min cron. It checks HackerNews and sends summaries to #research-feed in Slack.\"\nAgent: [responds helpfully]\n→ memory_add(facts: [\"User's research agent runs on Claude Sonnet, cron every 30 minutes, monitors HackerNews and posts summaries to Slack #research-feed\"], category: \"configuration\")\n",[1669],{"type":60,"tag":117,"props":1670,"children":1671},{"__ignoreMap":755},[1672],{"type":66,"value":1667},{"type":60,"tag":98,"props":1674,"children":1676},{"id":1675},"example-2-noop-tool-output",[1677],{"type":66,"value":1678},"Example 2: NOOP — tool output",{"type":60,"tag":747,"props":1680,"children":1683},{"className":1681,"code":1682,"language":66},[750],"User: \"Run the healthcheck on all services\"\nAgent: [executes healthcheck, returns results]\n→ No memory operations. Tool output fails Gate 1.\n",[1684],{"type":60,"tag":117,"props":1685,"children":1686},{"__ignoreMap":755},[1687],{"type":66,"value":1682},{"type":60,"tag":98,"props":1689,"children":1691},{"id":1690},"example-3-noop-already-recalled-no-material-change",[1692],{"type":66,"value":1693},"Example 3: NOOP — already recalled, no material change",{"type":60,"tag":747,"props":1695,"children":1698},{"className":1696,"code":1697,"language":66},[750],"Recalled: [\"User is Chris, senior platform engineer at Mem0\"]\nUser: \"Hey Chris here again\"\n→ No memory operations. Already known, no material change.\n",[1699],{"type":60,"tag":117,"props":1700,"children":1701},{"__ignoreMap":755},[1702],{"type":66,"value":1697},{"type":60,"tag":98,"props":1704,"children":1706},{"id":1705},"example-4-rule-with-rationale-preserving-users-words",[1707],{"type":66,"value":1708},"Example 4: Rule with rationale (preserving user's words)",{"type":60,"tag":747,"props":1710,"children":1713},{"className":1711,"code":1712,"language":66},[750],"User: \"Never use Docker for local dev, it ate 40GB of disk last time and my Mac mini only has 256GB\"\n→ memory_add(facts: [\"User rule: avoid Docker for local dev. Reason: ate 40GB of disk on 256GB Mac mini\"], category: \"rule\")\n",[1714],{"type":60,"tag":117,"props":1715,"children":1716},{"__ignoreMap":755},[1717],{"type":66,"value":1712},{"type":60,"tag":98,"props":1719,"children":1721},{"id":1720},"example-5-update-combining-contexts-from-both-versions",[1722],{"type":66,"value":1723},"Example 5: UPDATE — combining contexts from both versions",{"type":60,"tag":747,"props":1725,"children":1728},{"className":1726,"code":1727,"language":66},[750],"Recalled: [\"As of 2026-03-15, user is planning trip to Paris in September with friend Jack\"]\nUser: \"Can't wait for the Paris trip, definitely want to hit the Eiffel Tower and try authentic French pastries\"\n→ memory_search(\"Paris trip planning\")\n→ memory_update(memoryId: \"mem-id-of-old\", text: \"As of 2026-03-30, user is planning trip to Paris in September 2025 with friend Jack, says they can't wait to visit the Eiffel Tower and try authentic French pastries\")\n",[1729],{"type":60,"tag":117,"props":1730,"children":1731},{"__ignoreMap":755},[1732],{"type":66,"value":1727},{"type":60,"tag":98,"props":1734,"children":1736},{"id":1735},"example-6-outcome-over-intent",[1737],{"type":66,"value":1738},"Example 6: Outcome over intent",{"type":60,"tag":747,"props":1740,"children":1743},{"className":1741,"code":1742,"language":66},[750],"User: \"Update the call scripts sheet with the new truth-based templates\"\nAgent: [updates the sheet successfully]\n→ memory_add(facts: [\"Call scripts sheet (ID: 146Qbb...) was updated with truth-based templates (as of 2026-03-30)\"], category: \"configuration\")\n",[1744],{"type":60,"tag":117,"props":1745,"children":1746},{"__ignoreMap":755},[1747],{"type":66,"value":1742},{"type":60,"tag":98,"props":1749,"children":1751},{"id":1750},"example-7-credential-store-the-fact-not-the-value",[1752],{"type":66,"value":1753},"Example 7: Credential — store the fact, not the value",{"type":60,"tag":747,"props":1755,"children":1758},{"className":1756,"code":1757,"language":66},[750],"User: \"Use this API key for the new service: [credential value]\"\nAgent: [configures the service]\n→ memory_add(facts: [\"API key was configured for the new service (as of 2026-03-30)\"], category: \"configuration\")\n",[1759],{"type":60,"tag":117,"props":1760,"children":1761},{"__ignoreMap":755},[1762],{"type":66,"value":1757},{"type":60,"tag":98,"props":1764,"children":1766},{"id":1765},"example-8-noop-cosmetic-difference-not-material",[1767],{"type":66,"value":1768},"Example 8: NOOP — cosmetic difference, not material",{"type":60,"tag":747,"props":1770,"children":1773},{"className":1771,"code":1772,"language":66},[750],"Recalled: [\"User has a dog named Poppy and enjoys their daily walks together\"]\nUser: \"Yeah me and Poppy love our daily walks\"\n→ No memory operations. Semantically equivalent. No new context.\n",[1774],{"type":60,"tag":117,"props":1775,"children":1776},{"__ignoreMap":755},[1777],{"type":66,"value":1772},{"type":60,"tag":98,"props":1779,"children":1781},{"id":1780},"example-9-entity-grouping-single-call-not-fragmented",[1782],{"type":66,"value":1783},"Example 9: Entity grouping — single call, not fragmented",{"type":60,"tag":747,"props":1785,"children":1788},{"className":1786,"code":1787,"language":66},[750],"User: \"The budget for the offsite is $200 per head. We need a venue with WiFi, parking for 50 cars, and a projector.\"\n→ memory_add(facts: [\"Team offsite budget is $200 per person. Venue requirements: WiFi, parking for 50 vehicles, and projector setup.\"], category: \"project\")\nAll details about the same entity (offsite) go in one fact, one call.\n",[1789],{"type":60,"tag":117,"props":1790,"children":1791},{"__ignoreMap":755},[1792],{"type":66,"value":1787},{"type":60,"tag":98,"props":1794,"children":1796},{"id":1795},"example-10-temporary-constraint-dont-delete-the-preference",[1797],{"type":66,"value":1798},"Example 10: Temporary constraint — don't delete the preference",{"type":60,"tag":747,"props":1800,"children":1803},{"className":1801,"code":1802,"language":66},[750],"Recalled: [\"User enjoys hiking on weekends and finds it therapeutic\"]\nUser: \"I hurt my knee last week, can't hike for a while\"\n→ memory_add(facts: [\"As of 2026-03-30, user has temporarily paused hiking due to knee injury\"], category: \"project\")\nDO NOT delete the hiking preference. It is temporarily paused, not contradicted.\n",[1804],{"type":60,"tag":117,"props":1805,"children":1806},{"__ignoreMap":755},[1807],{"type":66,"value":1802},{"type":60,"tag":98,"props":1809,"children":1811},{"id":1810},"example-11-mixed-categories-in-one-turn-separate-calls",[1812],{"type":66,"value":1813},"Example 11: Mixed categories in one turn — separate calls",{"type":60,"tag":747,"props":1815,"children":1818},{"className":1816,"code":1817,"language":66},[750],"User: \"I'm Sarah, I work at Cloudflare. I just decided to switch our monitoring from Datadog to Grafana because of cost.\"\n→ memory_add(facts: [\"User is Sarah, works at Cloudflare\"], category: \"identity\")\n→ memory_add(facts: [\"As of 2026-03-30, user decided to switch monitoring from Datadog to Grafana due to cost\"], category: \"decision\")\nTwo calls because identity and decision have different retention policies.\n",[1819],{"type":60,"tag":117,"props":1820,"children":1821},{"__ignoreMap":755},[1822],{"type":66,"value":1817},{"type":60,"tag":98,"props":1824,"children":1826},{"id":1825},"example-12-noop-generic-greeting",[1827],{"type":66,"value":1828},"Example 12: NOOP — generic greeting",{"type":60,"tag":747,"props":1830,"children":1833},{"className":1831,"code":1832,"language":66},[750],"User: \"Hi\"\nAgent: \"Hello! How can I help?\"\n→ No memory operations. No extractable facts.\n",[1834],{"type":60,"tag":117,"props":1835,"children":1836},{"__ignoreMap":755},[1837],{"type":66,"value":1832},{"type":60,"tag":98,"props":1839,"children":1841},{"id":1840},"example-11-consolidation-rich-memory-absorbs-atomic-ones",[1842],{"type":66,"value":1843},"Example 11: Consolidation — rich memory absorbs atomic ones",{"type":60,"tag":747,"props":1845,"children":1848},{"className":1846,"code":1847,"language":66},[750],"Recalled: [\"User has a dog\", \"Dog's name is Poppy\", \"User walks dog daily\"]\nUser: \"Poppy learned fetch! Our walks are even better now, honestly it's the best part of my day\"\n→ memory_search(\"dog Poppy walks\") → find all three old memory IDs\n→ memory_update(memoryId: \"id-1\", text: \"User has a dog named Poppy and says taking him for walks is the best part of their day. Poppy recently learned fetch, making walks more enjoyable.\")\n→ memory_delete(memoryId: \"id-2\"), memory_delete(memoryId: \"id-3\")\n",[1849],{"type":60,"tag":117,"props":1850,"children":1851},{"__ignoreMap":755},[1852],{"type":66,"value":1847},{"type":60,"tag":98,"props":1854,"children":1856},{"id":1855},"example-12-noop-generic-greeting-nothing-to-store",[1857],{"type":66,"value":1858},"Example 12: NOOP — generic greeting, nothing to store",{"type":60,"tag":747,"props":1860,"children":1862},{"className":1861,"code":1832,"language":66},[750],[1863],{"type":60,"tag":117,"props":1864,"children":1865},{"__ignoreMap":755},[1866],{"type":66,"value":1832},{"items":1868,"total":2018},[1869,1881,1893,1907,1921,1935,1947,1956,1967,1981,1993,2003],{"slug":1870,"name":1870,"fn":1871,"description":1872,"org":1873,"tags":1874,"stars":20,"repoUrl":21,"updatedAt":1880},"context-loader","load project context from Mem0","Searches and injects relevant memories into context before starting work on a task. Use when beginning a new task, switching context, or when project history, past decisions, or coding conventions need to be loaded.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1875,1876,1879],{"name":18,"slug":19,"type":16},{"name":1877,"slug":1878,"type":16},"Context","context",{"name":14,"slug":15,"type":16},"2026-07-13T06:13:15.682218",{"slug":1882,"name":1882,"fn":1883,"description":1884,"org":1885,"tags":1886,"stars":20,"repoUrl":21,"updatedAt":1892},"dream","consolidate and prune stored memories","Consolidates stored memories by merging duplicates, resolving contradictions, and pruning stale entries. Use when memory count is high, search results feel noisy or repetitive, or periodic cleanup is needed to maintain memory quality.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1887,1888,1891],{"name":18,"slug":19,"type":16},{"name":1889,"slug":1890,"type":16},"Data Cleaning","data-cleaning",{"name":14,"slug":15,"type":16},"2026-07-13T06:12:54.000421",{"slug":1894,"name":1894,"fn":1895,"description":1896,"org":1897,"tags":1898,"stars":20,"repoUrl":21,"updatedAt":1906},"export","export project memories to Markdown files","Exports all project memories to a portable Markdown file for backup or migration. Use when backing up memories, migrating to another project, sharing memory state with teammates, or archiving before cleanup.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1899,1902,1903],{"name":1900,"slug":1901,"type":16},"Backup","backup",{"name":14,"slug":15,"type":16},{"name":1904,"slug":1905,"type":16},"Migration","migration","2026-07-13T06:13:05.091831",{"slug":1908,"name":1908,"fn":1909,"description":1910,"org":1911,"tags":1912,"stars":20,"repoUrl":21,"updatedAt":1920},"forget","delete outdated or incorrect memories","Deletes memories by search query or memory ID with confirmation before removal. Use when removing outdated decisions, incorrect memories, sensitive data, or cleaning up after experiments. Also handles undo of recent additions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1913,1916,1917],{"name":1914,"slug":1915,"type":16},"Maintenance","maintenance",{"name":14,"slug":15,"type":16},{"name":1918,"slug":1919,"type":16},"Privacy","privacy","2026-07-13T06:13:00.862899",{"slug":1922,"name":1922,"fn":1923,"description":1924,"org":1925,"tags":1926,"stars":20,"repoUrl":21,"updatedAt":1934},"health","diagnose Mem0 connectivity and health","Diagnoses mem0 connectivity, API key validity, and memory read\u002Fwrite functionality. Use when memory operations fail, searches return empty, add_memory errors occur, MCP connection drops, or to verify the plugin is working correctly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1927,1930,1931],{"name":1928,"slug":1929,"type":16},"Debugging","debugging",{"name":14,"slug":15,"type":16},{"name":1932,"slug":1933,"type":16},"Monitoring","monitoring","2026-07-13T06:13:06.569475",{"slug":1936,"name":1936,"fn":1937,"description":1938,"org":1939,"tags":1940,"stars":20,"repoUrl":21,"updatedAt":1946},"import","import project memories from Markdown files","Imports memories from an exported Markdown file or MEMORY.md into the current project. Use when migrating from another project, restoring from backup, importing Claude Code native MEMORY.md content, or setting up a new project with existing knowledge.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1941,1944,1945],{"name":1942,"slug":1943,"type":16},"Markdown","markdown",{"name":14,"slug":15,"type":16},{"name":1904,"slug":1905,"type":16},"2026-07-13T06:12:59.389494",{"slug":1948,"name":1948,"fn":1949,"description":1950,"org":1951,"tags":1952,"stars":20,"repoUrl":21,"updatedAt":1955},"list-projects","list projects with stored memories","Lists all projects with stored memories for the current user, showing memory counts and last activity dates. Use when checking which projects have memories, comparing memory distribution across repos, or finding a specific project scope.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1953,1954],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},"2026-07-13T06:13:27.80043",{"slug":8,"name":8,"fn":1957,"description":1958,"org":1959,"tags":1960,"stars":20,"repoUrl":21,"updatedAt":1966},"add persistent memory to AI applications","Mem0 Platform SDK for adding persistent memory to AI applications. TRIGGER when: user mentions \"mem0\", \"MemoryClient\", \"memory layer\", \"remember user preferences\", \"persistent context\", \"personalization\", or needs to add long-term memory to chatbots, agents, or AI apps. Covers Python SDK (mem0ai), TypeScript SDK (mem0ai), and framework integrations (LangChain, CrewAI, OpenAI Agents SDK, Pipecat, LlamaIndex, AutoGen, LangGraph). Also covers the open-source self-hosted Memory class. This is the DEFAULT mem0 skill for ambiguous queries. DO NOT TRIGGER when: user asks about CLI commands, terminal usage, or shell scripts (use mem0-cli), or Vercel AI SDK \u002F @mem0\u002Fvercel-ai-provider \u002F createMem0 (use mem0-vercel-ai-sdk).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1961,1962,1965],{"name":18,"slug":19,"type":16},{"name":1963,"slug":1964,"type":16},"AI Infrastructure","ai-infrastructure",{"name":14,"slug":15,"type":16},"2026-07-13T06:12:42.552904",{"slug":1968,"name":1968,"fn":1969,"description":1970,"org":1971,"tags":1972,"stars":20,"repoUrl":21,"updatedAt":1980},"mem0-cli","manage Mem0 memory via command line","Mem0 CLI -- the command-line interface for mem0 memory operations. TRIGGER when: user mentions \"mem0 cli\", \"mem0 command line\", \"@mem0\u002Fcli\", \"mem0-cli\", \"pip install mem0-cli\", \"npm install -g @mem0\u002Fcli\", or is running mem0 commands in a terminal\u002Fshell (mem0 add, mem0 search, mem0 list, mem0 get, mem0 init, mem0 config, mem0 import). Also triggers when query includes CLI flags like --user-id, --output, --json, --agent, or describes bash\u002Fzsh\u002Fterminal\u002Fshell usage. DO NOT TRIGGER when: user asks about programmatic SDK integration in Python\u002FTS code (use mem0 skill), or Vercel AI SDK provider (use mem0-vercel-ai-sdk skill).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1973,1976,1979],{"name":1974,"slug":1975,"type":16},"Automation","automation",{"name":1977,"slug":1978,"type":16},"CLI","cli",{"name":14,"slug":15,"type":16},"2026-07-13T06:12:48.46494",{"slug":1982,"name":1982,"fn":1983,"description":1984,"org":1985,"tags":1986,"stars":20,"repoUrl":21,"updatedAt":1992},"mem0-integrate","integrate Mem0 into repositories","Integrate Mem0 into an existing repository using a goal-driven, TDD pipeline. Detects the repo's language automatically and asks the user to pick between Mem0 Platform (managed) and Mem0 Open Source (self-hosted). Writes failing tests before any implementation. Produces a local feature branch plus `.mem0-integration\u002F` artifacts consumed by the paired verification skill. TRIGGER when: user says \"integrate mem0\", \"add mem0 to this repo\", \"wire mem0 into \u003Crepo>\", or asks how to add memory to an existing project. DO NOT TRIGGER when: the user wants general SDK usage (use skill:mem0), CLI usage (use skill:mem0-cli), or Vercel AI SDK (use skill:mem0-vercel-ai-sdk). After success, invoke skill:mem0-test-integration to verify in the same workspace (loose coupling).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1987,1988,1991],{"name":18,"slug":19,"type":16},{"name":1989,"slug":1990,"type":16},"API Development","api-development",{"name":14,"slug":15,"type":16},"2026-07-13T06:12:46.60755",{"slug":1994,"name":1994,"fn":1995,"description":1996,"org":1997,"tags":1998,"stars":20,"repoUrl":21,"updatedAt":2002},"mem0-oss-to-platform","migrate Mem0 projects to platform","Plan and then execute a migration of a project from the mem0 open-source \u002F self-hosted SDK (the local `Memory` class) to the mem0 Platform \u002F hosted \u002F managed SDK (the `MemoryClient` class). Use this whenever a developer wants to move, switch, or migrate their mem0 usage off OSS\u002Fself-hosted to the hosted API — e.g. \"migrate my mem0 setup to the platform\", \"switch from self-hosted mem0 to MemoryClient\", \"use my mem0 API key instead of a local Qdrant\", \"move mem0 to the cloud\u002Fhosted\u002Fmanaged service\", or \"replace my local mem0 vector store + embedder config with the platform\". Applies to Python (`from mem0 import Memory` → `from mem0 import MemoryClient`) and TypeScript\u002FJavaScript (`import { Memory } from \"mem0ai\u002Foss\"` → `import MemoryClient from \"mem0ai\"`). Trigger even when the user doesn't say the word \"migrate\" but clearly wants their existing mem0 integration to run against the hosted platform. It first produces a reviewable migration plan, then executes it after the developer approves. Strictly scoped to the mem0 integration — it does not refactor, restructure, or \"improve\" any unrelated code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1999,2000,2001],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":1904,"slug":1905,"type":16},"2026-07-13T06:12:43.848266",{"slug":2004,"name":2004,"fn":2005,"description":2006,"org":2007,"tags":2008,"stars":20,"repoUrl":21,"updatedAt":2017},"mem0-test-integration","verify Mem0 integration tests","Verify a Mem0 integration produced by \u002Fmem0-integrate. Runs in the same workspace on the same branch (loose coupling) — installs dependencies, runs the repo's native test suite, then exercises a real end-to-end smoke flow against the user's API key. Produces a scorecard. TRIGGER when: user has just run \u002Fmem0-integrate and says \"verify\", \"test the integration\", \"run \u002Fmem0-test-integration\", or when a .mem0-integration\u002F directory exists and tests have not been run yet on the current branch. DO NOT TRIGGER when: the user wants to run general project tests (defer to the repo's native test command), or when no prior \u002Fmem0-integrate run exists in the current branch (ask them to run \u002Fmem0-integrate first). This skill ONLY catches compile and runtime bugs by design. Logical integration errors — wrong data stored, wrong time retrieved, wrong user scoping — are on the human reviewer.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2009,2010,2011,2014],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":2012,"slug":2013,"type":16},"QA","qa",{"name":2015,"slug":2016,"type":16},"Testing","testing","2026-07-13T06:12:50.669701",23,{"items":2020,"total":2018},[2021,2027,2033,2039,2045,2051,2057],{"slug":1870,"name":1870,"fn":1871,"description":1872,"org":2022,"tags":2023,"stars":20,"repoUrl":21,"updatedAt":1880},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2024,2025,2026],{"name":18,"slug":19,"type":16},{"name":1877,"slug":1878,"type":16},{"name":14,"slug":15,"type":16},{"slug":1882,"name":1882,"fn":1883,"description":1884,"org":2028,"tags":2029,"stars":20,"repoUrl":21,"updatedAt":1892},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2030,2031,2032],{"name":18,"slug":19,"type":16},{"name":1889,"slug":1890,"type":16},{"name":14,"slug":15,"type":16},{"slug":1894,"name":1894,"fn":1895,"description":1896,"org":2034,"tags":2035,"stars":20,"repoUrl":21,"updatedAt":1906},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2036,2037,2038],{"name":1900,"slug":1901,"type":16},{"name":14,"slug":15,"type":16},{"name":1904,"slug":1905,"type":16},{"slug":1908,"name":1908,"fn":1909,"description":1910,"org":2040,"tags":2041,"stars":20,"repoUrl":21,"updatedAt":1920},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2042,2043,2044],{"name":1914,"slug":1915,"type":16},{"name":14,"slug":15,"type":16},{"name":1918,"slug":1919,"type":16},{"slug":1922,"name":1922,"fn":1923,"description":1924,"org":2046,"tags":2047,"stars":20,"repoUrl":21,"updatedAt":1934},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2048,2049,2050],{"name":1928,"slug":1929,"type":16},{"name":14,"slug":15,"type":16},{"name":1932,"slug":1933,"type":16},{"slug":1936,"name":1936,"fn":1937,"description":1938,"org":2052,"tags":2053,"stars":20,"repoUrl":21,"updatedAt":1946},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2054,2055,2056],{"name":1942,"slug":1943,"type":16},{"name":14,"slug":15,"type":16},{"name":1904,"slug":1905,"type":16},{"slug":1948,"name":1948,"fn":1949,"description":1950,"org":2058,"tags":2059,"stars":20,"repoUrl":21,"updatedAt":1955},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2060,2061],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16}]