[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GVCWHG3AGKRNNX5XREX3KE":3,"skill-same:01M6GVCWHG3AGKRNNX5XREX3KE":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":52,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":54,"install":55,"resources":68},"01M6GVCWHG3AGKRNNX5XREX3KE","plur-memory",null,"Persistent learning for AI agents. Open engram format. Your agent learns from corrections, remembers across sessions, and transfers knowledge across domains.","plur-ai\u002Fplur","plur-ai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F269585694?v=4","01M6GVC90NFRW2T6QVB5PTDD20","01M6GVC95NND4PFJE616S26BM2",315,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fskills\u002Fplur-memory\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35],"memory","plur memory","ai agents","sessions","productivity","open","learning","knowledge","format","engram","across","domains","transfers","2026-11-10 10:12:30",false,"---\nname: plur-memory\ndescription: Persistent learning for AI agents. Open engram format. Your agent learns from corrections, remembers across sessions, and transfers knowledge across domains.\nversion: 0.23.0\nmetadata:\n  hermes:\n    tags: [memory, learning, knowledge, engrams]\n    category: productivity\n    requires_toolsets: []\n---\n\n# PLUR Memory\n\nPersistent memory for AI agents. Corrections, preferences, and patterns are stored as **engrams** that strengthen with use and decay when irrelevant. The system gets smarter the longer you use it.\n\n## When to Use\n\nUse PLUR to recall relevant knowledge, learn durable corrections and close a memory session. Automatic injection depends on the installed editor adapter; an MCP connection alone does not install hooks.\n\n## Discover the MCP tools\n\nThe default **lean** profile exposes core tools directly, including `plur_session_start`, `plur_session_end`, `plur_learn`, `plur_recall`, `plur_feedback`, `plur_forget`, `plur_status` and `plur_doctor`. Less-common operations are actions on `plur_admin`:\n\n```json\n{ \"action\": \"help\" }\n```\n\nSend that object to `plur_admin` to get current action names and argument schemas. For example, call `plur_admin` with `{ \"action\": \"plur_inject\", \"args\": { \"task\": \"the current task\" } }`. Destructive tools stay direct and cannot be dispatched through `plur_admin`. With `PLUR_TOOL_PROFILE=full`, operations are exposed by their own names instead.\n\nNative integrations such as Hermes have their own tool surface. Use the names and schemas the current client exposes; the [Hermes skill](https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fpackages\u002Fhermes\u002Fplur_hermes\u002Fskills\u002Fplur-memory.SKILL.md) describes its native plugin.\n\n## Memory Lifecycle\n\n- Start an MCP memory session with `plur_session_start`; keep its session ID for later calls.\n- With an editor adapter installed, relevant engrams are injected automatically.\n- End the session with `plur_session_end` and a concise summary.\n- When you discover something worth remembering → call `plur_learn` with a clear statement\n- When corrected by the user → call `plur_learn` immediately with the correction\n- When an injected engram was helpful → call `plur_feedback` with signal \"positive\"\n- When an injected engram was wrong or stale → call `plur_feedback` with signal \"negative\"\n- When a memory is no longer true → call `plur_forget` with the engram ID\n\n## The Learning Protocol\n\nEnd your responses with a learning section when you discover reusable insights:\n\n```\n---\n? I learned:\n- Insight one (min 10 characters)\n- Insight two\n```\n\nAdapters that support self-report learning can capture this format. MCP alone does not harvest response text; use `plur_learn` for an explicit save, and check its result.\n\n## The Memory Line\n\nEnd every reply with one short line: `Memory — recalled N · used: ENG-…, ENG-… · written: ENG-…` (recalled as a count; used and written as ids only, no statements), or `Memory — none`. Only count\u002Flist ids you actually saw this turn; never invent an id. Give details only if the user asks.\n\n## Getting Started\n\nOn first install, PLUR has zero engrams — injection returns empty. This is expected.\n\nYour first 5 sessions are the bootstrap period. Actively learn:\n- Call `plur_learn` for every correction the user makes\n- Call `plur_learn` for stated preferences (\"always use X\", \"never do Y\")\n- Call `plur_learn` for discovered patterns and conventions\n\nRecall becomes useful as relevant knowledge accumulates; there is no fixed engram-count threshold. For a pack, call `plur_admin` with `{ \"action\": \"plur_packs_preview\", \"args\": { \"source\": \"\u002Fpath\u002Fto\u002Fpack\" } }`, review the contents, then install with action `plur_packs_install` and the same `source`. Use a directory or HTTPS archive URL, not a bare pack name.\n\n## Meta-Engram Extraction\n\nIn MCP, `plur_extract_meta` runs the extraction pipeline using a configured LLM endpoint. In the lean profile, discover its schema through `plur_admin` help, then dispatch `{ \"action\": \"plur_extract_meta\", \"args\": { ... } }` with the required endpoint and API-key arguments. `dry_run: true` previews without saving. This operation can send selected memory to that endpoint; use it only for an authorized destination and task. It is not the native Hermes conversational pipeline.\n\nRead existing results through the `plur_meta_engrams` admin action. Meta-engrams describe principles that transfer across domains.\n\n## What NOT to Learn\n\n- Trivial facts (\"the user said hello\")\n- Things already in the codebase (file paths, function names — those change)\n- Session-specific state (\"we're working on X right now\")\n- Anything you're not confident about\n\n## What to Learn\n\n- Corrections: \"The API returns snake_case, not camelCase\"\n- Preferences: \"User prefers TypeScript over JavaScript\"\n- Patterns: \"This codebase uses repository pattern for data access\"\n- Decisions: \"We chose PostgreSQL for ACID compliance\"\n- Conventions: \"Always run lint before committing\"\n\n## Near-Duplicate Protocol\n\nA `plur_learn` response may carry a `dedup` field reporting engrams close to what you just wrote. Convention, not a gate — the engine will not stop you, and nothing else will notice a reworded restatement.\n\n### 1. Read `dedup.mode` first\n\n- `cosine` — similarity ran locally, and `near_duplicates` lists what it found.\n- `hash-only` — **only** the exact-hash check ran: no candidates, no embedder, or dedup disabled. This means \"not identical\", **not** \"not a duplicate\".\n- `llm` — semantic classification. `plur_learn_batch` only; it never appears on a single `plur_learn`.\n\n**A missing `dedup` field is ambiguous and you cannot resolve it from the response.** It is omitted both when similarity ran and found nothing close, and when similarity never ran at all. Absence is therefore not evidence that your write is unique.\n\n### 2. Resolve the ids to statements\n\nCurrent MCP near-duplicate entries include the neighbour's statement preview. Read that text before deciding. For more context, dispatch `plur_similarity_search` through `plur_admin` with `{ \"query\": \"the statement you just wrote\" }`; it returns matching statements and scopes. Inspect the live schema if your client runs an older version.\n\nSkipping this step means deciding on a number alone, which the next point explains is not enough.\n\n### 3. Judge on content — `score` orders the list, it does not decide\n\n**Do not use a similarity threshold as a decision boundary.** The measurements behind #878 are the reason:\n\n| Pair | Score |\n|---|---|\n| the real #854 duplicate, as actually written | 0.8339 |\n| \"always rebase\" vs \"never rebase\" — opposite meanings | 0.8826 |\n\nA genuine duplicate scored *below* two statements that contradict each other. Any fixed cut-off puts the founding case on the wrong side. Treat `score` as the order to inspect in, then read the statements and decide whether they assert the same fact.\n\nFor reference, the engine records a `dedup_near_duplicate` history event above `NEAR_DUPLICATE_OBSERVATION_FLOOR = 0.75` — that is what it considers notable enough to log, not a threshold for you to act on.\n\n### 4. If it is the same fact, use one recipe\n\nWhether you are restating or correcting, the sequence is the same:\n\n```\nplur_forget({ \"id\": \"\u003Cnew-id>\" })\nplur_learn({ \"statement\": \"\u003Cstatement>\", \"supersedes\": [\"\u003Coriginal-id>\"] })\n```\n\n**Do not try to attach `supersedes` by re-learning the same statement.** That path hits exact content-hash dedup, which increments `write_count` and appends a source — it never writes `relations`. The edge is applied only when a *new* engram is created. So re-learning silently does nothing, and if you then forget the original you are left with a superseded fact archived and no record of what replaced it: worse than leaving it alone.\n\nRetiring first is what makes the re-learn work — retired engrams are excluded from hash dedup (#107), so the second call creates a fresh engram and the edge lands on it.\n\nIf the two statements are genuinely distinct, the write stands and there is nothing to do.\n","# PLUR Memory\n\nPersistent memory for AI agents. Corrections, preferences, and patterns are stored as **engrams** that strengthen with use and decay when irrelevant. The system gets smarter the longer you use it.\n\n## When to Use\n\nUse PLUR to recall relevant knowledge, learn durable corrections and close a memory session. Automatic injection depends on the installed editor adapter; an MCP connection alone does not install hooks.\n\n## Discover the MCP tools\n\nThe default **lean** profile exposes core tools directly, including `plur_session_start`, `plur_session_end`, `plur_learn`, `plur_recall`, `plur_feedback`, `plur_forget`, `plur_status` and `plur_doctor`. Less-common operations are actions on `plur_admin`:\n\n```json\n{ \"action\": \"help\" }\n```\n\nSend that object to `plur_admin` to get current action names and argument schemas. For example, call `plur_admin` with `{ \"action\": \"plur_inject\", \"args\": { \"task\": \"the current task\" } }`. Destructive tools stay direct and cannot be dispatched through `plur_admin`. With `PLUR_TOOL_PROFILE=full`, operations are exposed by their own names instead.\n\nNative integrations such as Hermes have their own tool surface. Use the names and schemas the current client exposes; the [Hermes skill](https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fpackages\u002Fhermes\u002Fplur_hermes\u002Fskills\u002Fplur-memory.SKILL.md) describes its native plugin.\n\n## Memory Lifecycle\n\n- Start an MCP memory session with `plur_session_start`; keep its session ID for later calls.\n- With an editor adapter installed, relevant engrams are injected automatically.\n- End the session with `plur_session_end` and a concise summary.\n- When you discover something worth remembering → call `plur_learn` with a clear statement\n- When corrected by the user → call `plur_learn` immediately with the correction\n- When an injected engram was helpful → call `plur_feedback` with signal \"positive\"\n- When an injected engram was wrong or stale → call `plur_feedback` with signal \"negative\"\n- When a memory is no longer true → call `plur_forget` with the engram ID\n\n## The Learning Protocol\n\nEnd your responses with a learning section when you discover reusable insights:\n\n```\n---\n? I learned:\n- Insight one (min 10 characters)\n- Insight two\n```\n\nAdapters that support self-report learning can capture this format. MCP alone does not harvest response text; use `plur_learn` for an explicit save, and check its result.\n\n## The Memory Line\n\nEnd every reply with one short line: `Memory — recalled N · used: ENG-…, ENG-… · written: ENG-…` (recalled as a count; used and written as ids only, no statements), or `Memory — none`. Only count\u002Flist ids you actually saw this turn; never invent an id. Give details only if the user asks.\n\n## Getting Started\n\nOn first install, PLUR has zero engrams — injection returns empty. This is expected.\n\nYour first 5 sessions are the bootstrap period. Actively learn:\n- Call `plur_learn` for every correction the user makes\n- Call `plur_learn` for stated preferences (\"always use X\", \"never do Y\")\n- Call `plur_learn` for discovered patterns and conventions\n\nRecall becomes useful as relevant knowledge accumulates; there is no fixed engram-count threshold. For a pack, call `plur_admin` with `{ \"action\": \"plur_packs_preview\", \"args\": { \"source\": \"\u002Fpath\u002Fto\u002Fpack\" } }`, review the contents, then install with action `plur_packs_install` and the same `source`. Use a directory or HTTPS archive URL, not a bare pack name.\n\n## Meta-Engram Extraction\n\nIn MCP, `plur_extract_meta` runs the extraction pipeline using a configured LLM endpoint. In the lean profile, discover its schema through `plur_admin` help, then dispatch `{ \"action\": \"plur_extract_meta\", \"args\": { ... } }` with the required endpoint and API-key arguments. `dry_run: true` previews without saving. This operation can send selected memory to that endpoint; use it only for an authorized destination and task. It is not the native Hermes conversational pipeline.\n\nRead existing results through the `plur_meta_engrams` admin action. Meta-engrams describe principles that transfer across domains.\n\n## What NOT to Learn\n\n- Trivial facts (\"the user said hello\")\n- Things already in the codebase (file paths, function names — those change)\n- Session-specific state (\"we're working on X right now\")\n- Anything you're not confident about\n\n## What to Learn\n\n- Corrections: \"The API returns snake_case, not camelCase\"\n- Preferences: \"User prefers TypeScript over JavaScript\"\n- Patterns: \"This codebase uses repository pattern for data access\"\n- Decisions: \"We chose PostgreSQL for ACID compliance\"\n- Conventions: \"Always run lint before committing\"\n\n## Near-Duplicate Protocol\n\nA `plur_learn` response may carry a `dedup` field reporting engrams close to what you just wrote. Convention, not a gate — the engine will not stop you, and nothing else will notice a reworded restatement.\n\n### 1. Read `dedup.mode` first\n\n- `cosine` — similarity ran locally, and `near_duplicates` lists what it found.\n- `hash-only` — **only** the exact-hash check ran: no candidates, no embedder, or dedup disabled. This means \"not identical\", **not** \"not a duplicate\".\n- `llm` — semantic classification. `plur_learn_batch` only; it never appears on a single `plur_learn`.\n\n**A missing `dedup` field is ambiguous and you cannot resolve it from the response.** It is omitted both when similarity ran and found nothing close, and when similarity never ran at all. Absence is therefore not evidence that your write is unique.\n\n### 2. Resolve the ids to statements\n\nCurrent MCP near-duplicate entries include the neighbour's statement preview. Read that text before deciding. For more context, dispatch `plur_similarity_search` through `plur_admin` with `{ \"query\": \"the statement you just wrote\" }`; it returns matching statements and scopes. Inspect the live schema if your client runs an older version.\n\nSkipping this step means deciding on a number alone, which the next point explains is not enough.\n\n### 3. Judge on content — `score` orders the list, it does not decide\n\n**Do not use a similarity threshold as a decision boundary.** The measurements behind #878 are the reason:\n\n| Pair | Score |\n|---|---|\n| the real #854 duplicate, as actually written | 0.8339 |\n| \"always rebase\" vs \"never rebase\" — opposite meanings | 0.8826 |\n\nA genuine duplicate scored *below* two statements that contradict each other. Any fixed cut-off puts the founding case on the wrong side. Treat `score` as the order to inspect in, then read the statements and decide whether they assert the same fact.\n\nFor reference, the engine records a `dedup_near_duplicate` history event above `NEAR_DUPLICATE_OBSERVATION_FLOOR = 0.75` — that is what it considers notable enough to log, not a threshold for you to act on.\n\n### 4. If it is the same fact, use one recipe\n\nWhether you are restating or correcting, the sequence is the same:\n\n```\nplur_forget({ \"id\": \"\u003Cnew-id>\" })\nplur_learn({ \"statement\": \"\u003Cstatement>\", \"supersedes\": [\"\u003Coriginal-id>\"] })\n```\n\n**Do not try to attach `supersedes` by re-learning the same statement.** That path hits exact content-hash dedup, which increments `write_count` and appends a source — it never writes `relations`. The edge is applied only when a *new* engram is created. So re-learning silently does nothing, and if you then forget the original you are left with a superseded fact archived and no record of what replaced it: worse than leaving it alone.\n\nRetiring first is what makes the re-learn work — retired engrams are excluded from hash dedup (#107), so the second call creates a fresh engram and the edge lands on it.\n\nIf the two statements are genuinely distinct, the write stands and there is nothing to do.\n",{"name":5,"version":41,"metadata":42,"description":7},"0.23.0",{"hermes":43},{"tags":44,"category":27,"requires_toolsets":46},[23,29,30,45],"engrams",[],"main","a5db3818a300216143be45fcf6412b2cb0277f2a","skills\u002Fplur-memory",40,"https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur","https:\u002F\u002Fplur.ai","https:\u002F\u002Fgithub.com\u002Fplur-ai","2026-11-15 02:05:34",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add plur-ai\u002Fplur --skill plur-memory",{"tool":61,"command":62},"bunx","bunx skills add plur-ai\u002Fplur --skill plur-memory",{"tool":64,"command":65},"pnpm","pnpm dlx skills add plur-ai\u002Fplur --skill plur-memory","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fskills\u002Fplur-memory\u002FSKILL.md",true,[],[70,90,98,105,114,122],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":74,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":36},"01M6GVF0ZED4JCJTZJETTW9V3Q","with-provenance","A conformance vector.","CC-BY-4.0","https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fspec\u002Fvectors\u002Fpacks\u002Fwith-provenance\u002FSKILL.md",[],[78,79,80,81,82,83,84,85,86,87,88,89],"provenance","with provenance","with","conformance","pool","true","match","migration","local","spec","deploy","vector",{"skillNo":91,"name":92,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":74,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":36},"01M6GVEXWE52C4340F3BMS9H6Z","with-integrity","https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fspec\u002Fvectors\u002Fpacks\u002Fwith-integrity\u002FSKILL.md",[],[96,80,97,85,87,88,89,86,84,82,81],"integrity","with integrity",{"skillNo":99,"name":100,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":74,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":36},"01M6GVETQ4HWBC5J0907G5V45N","with-integrity-v2","https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fspec\u002Fvectors\u002Fpacks\u002Fwith-integrity-v2\u002FSKILL.md",[],[80,96,104,84,82,81,89,86,87,88,85],"with integrity v2",{"skillNo":106,"name":107,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":74,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":36},"01M6GVEQ67HMX6RN7XMBHWJ18W","unknown-root-field","https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fspec\u002Fvectors\u002Fpacks\u002Funknown-root-field\u002FSKILL.md",[],[111,112,87,88,89,85,113,86,84,82,81],"unknown root field","root","do",{"skillNo":115,"name":116,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":74,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":36},"01M6GVEM247VAGH21Z5VME0XZS","unknown-metadata-field","https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fspec\u002Fvectors\u002Fpacks\u002Funknown-metadata-field\u002FSKILL.md",[],[120,121,81,87,88,89,113,86,84],"unknown metadata field","metadata",{"skillNo":123,"name":124,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":74,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":36},"01M6GVEH04JDN3DDRZZDQD1D6W","private-engram-shipped","https:\u002F\u002Fgithub.com\u002Fplur-ai\u002Fplur\u002Fblob\u002Fmain\u002Fspec\u002Fvectors\u002Fpacks\u002Fprivate-engram-shipped\u002FSKILL.md",[],[128,32,88,89,85,86,84,82,81,87],"private engram shipped"]