[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C11MDCTKJTY020E1A042JJ":3,"skill-same:01M6C11MDCTKJTY020E1A042JJ":88},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":50,"linkOnly":51,"markdownContent":52,"markdownBody":53,"frontMatter":54,"refName":64,"commitSha":65,"skillDirectory":66,"forksCount":67,"repositoryHtmlUrl":68,"repositoryHomepageUrl":69,"ownerHtmlUrl":70,"ownerBlogUrl":71,"ownerDescription":72,"updatedAt":73,"install":74,"resources":87},"01M6C11MDCTKJTY020E1A042JJ","ralph-memory",null,"Manage Al semantic memory entries — list, query, and clear lessons learned across loop iterations","jmagly\u002Faiwg","jmagly","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1159087?v=4","01M6C10AK8N2WCSQN11FYGTJWN","Joseph Magly","01M6C10AQ8A2RMED1Y1BSVY7NF",229,"MIT","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Faddons\u002Fagent-loop\u002Fskills\u002Fralph-memory\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],"memory","ralph","ralph memory","lessons","openclaw","semantic memory","learned","entries","efficiency","across","query","manage","list","write","read","haiku","hermes","text","loop","code","automation","2026-11-10 10:12:30",false,"---\nnamespace: aiwg\nname: ralph-memory\nplatforms: [all]\ndescription: Manage Al semantic memory entries — list, query, and clear lessons learned across loop iterations\ncommandHint:\n  argumentHint: \"\u003Clist|query|clear> [--loop-id \u003Cid>] [--query \u003Ctext>] [--since \u003Cdate>]\"\n  allowedTools: Read, Write\n  model: haiku\n  category: automation\n  platforms: [claude-code, hermes, openclaw]\n  modelRole: efficiency\n  modelTier: economy\n---\n\n\u003C!-- AIWG-SKILL-CALLOUT -->\n> **Skill access pattern (post-kernel-pivot, 2026.5+)**\n>\n> Skill names referenced in this document are AIWG skills, **not slash commands**. Most are not kernel-listed and cannot be invoked as `\u002Fskill-name` by the platform. Reach them via:\n>\n> ```bash\n> aiwg discover \"\u003Ccapability>\"\n> aiwg show skill \u003Cname> --body\n> ```\n>\n> Only kernel-listed skills (`aiwg-doctor`, `aiwg-refresh`, `aiwg-status`, `aiwg-help`, `use`, `steward`) are directly invokable as slash commands. See [skill-discovery rule](..\u002F..\u002F..\u002Faddons\u002Faiwg-utils\u002Frules\u002Fskill-discovery.md).\n\n\n# Al Memory\n\nInspect and manage the semantic memory that Al accumulates across loop iterations. Memory entries record lessons learned, failure patterns, and success patterns so that later iterations — and future loops on similar tasks — benefit from what earlier attempts discovered.\n\n## HITL authorization checkpoints\n\nBefore a removal confirmation below, apply\n[agent-loop authorization checkpoints](..\u002F..\u002Fdocs\u002Fhitl-authorization.md) and call\n`aiwg config authorization check --action-file \"$ACTION_FILE\" --target \"$TARGET_REPO\"`.\nOnly `auto-authorized` with a signed receipt skips a workflow prompt. Keep\nexisting prompts\u002Frefusals otherwise; platform prompts are never bypassed.\nMemory deletion without a complete rollback remains irreversible and requires review.\n\n## Natural Language Triggers\n\nUsers may say:\n- \"ralph memory\"\n- \"ralph memories\"\n- \"list ralph memory\"\n- \"query ralph memory\"\n- \"what has ralph learned\"\n- \"show ralph lessons\"\n- \"clear ralph memory\"\n\n## Parameters\n\n### Subcommand (required)\nOne of `list`, `query`, or `clear`.\n\n### --loop-id (optional)\nScope the operation to a specific loop's memory. If omitted, operates on the global memory store (`.aiwg\u002Fralph\u002Fmemory.json`).\n\n```\n\u002Fralph-memory list --loop-id abc123\n```\n\n### --query (optional, used with `query` subcommand)\nText to search for in memory entries. Matches against `lesson`, `pattern`, `context`, and `tags` fields.\n\n```\n\u002Fralph-memory query --query \"auth mocks\"\n```\n\n### --since (optional)\nFilter entries created on or after this date. Accepts ISO 8601 date (`2026-04-01`) or relative expressions (`7d`, `2w`).\n\n```\n\u002Fralph-memory list --since 7d\n```\n\n## Memory Entry Schema\n\nEach entry in `.aiwg\u002Fralph\u002Fmemory.json` follows this structure:\n\n```json\n{\n  \"id\": \"mem_a1b2c3\",\n  \"loopId\": \"abc123\",\n  \"iteration\": 2,\n  \"createdAt\": \"2026-04-01T10:42:00Z\",\n  \"type\": \"failure_pattern\",\n  \"lesson\": \"Auth mocks must be initialized inside beforeEach, not at module scope\",\n  \"context\": \"src\u002Fauth\u002Fauth.test.ts iteration 2 failure\",\n  \"tags\": [\"auth\", \"mocks\", \"jest\"],\n  \"confidence\": 0.9\n}\n```\n\n**Entry types**:\n- `lesson_learned` — General insight extracted from an iteration\n- `failure_pattern` — Recurring error pattern to avoid\n- `success_pattern` — Approach that worked and should be repeated\n\n## Behavior\n\n### `list` Subcommand\n\n1. Read the memory store (scoped to `--loop-id` if provided, otherwise global)\n2. Apply `--since` filter if provided\n3. Display a formatted table of all entries, sorted by `createdAt` descending\n\n**Output**:\n```\nAl Memory — 8 entries\n\n| ID       | Type            | Loop   | Iter | Lesson                                              | Date       |\n|----------|-----------------|--------|------|-----------------------------------------------------|------------|\n| mem_a1b2 | failure_pattern | abc123 | 2    | Auth mocks must be in beforeEach, not module scope  | 2026-04-01 |\n| mem_c3d4 | lesson_learned  | abc123 | 3    | Use jest.resetAllMocks() in afterEach               | 2026-04-01 |\n| mem_e5f6 | success_pattern | def456 | 5    | ESM imports require .js extension in TypeScript     | 2026-03-28 |\n| mem_g7h8 | failure_pattern | def456 | 2    | ts-node does not support isolatedModules by default | 2026-03-28 |\n...\n\nUse \u002Fralph-memory query --query \"\u003Ctext>\" to search.\n```\n\n**If no entries exist**:\n```\nNo memory entries found.\n\nAl accumulates memory as it runs loops. Start a loop:\n  \u002Fralph \"your task\" --completion \"criteria\"\n```\n\n### `query` Subcommand\n\n1. Read all memory entries (filtered by `--loop-id` and `--since` if provided)\n2. Score each entry against the `--query` text using substring and tag matching\n3. Return the top matches, ranked by relevance score descending\n\n**Output**:\n```\nAl Memory — query: \"auth mocks\"\n\n3 matching entries (ranked by relevance):\n\n1. [mem_a1b2] failure_pattern — confidence 0.90\n   Lesson: Auth mocks must be initialized inside beforeEach, not at module scope\n   Context: src\u002Fauth\u002Fauth.test.ts iteration 2\n   Tags: auth, mocks, jest\n   Loop: abc123, Iter: 2, Date: 2026-04-01\n\n2. [mem_c3d4] lesson_learned — confidence 0.80\n   Lesson: Use jest.resetAllMocks() in afterEach to prevent mock state leakage\n   Context: src\u002Fauth\u002Fauth.test.ts iteration 3\n   Tags: auth, jest, cleanup\n   Loop: abc123, Iter: 3, Date: 2026-04-01\n\n3. [mem_x9y0] failure_pattern — confidence 0.60\n   Lesson: Passport mock must stub req.user before middleware chain\n   Context: src\u002Fauth\u002Fmiddleware.test.ts\n   Tags: auth, passport, mocks\n   Loop: ghi789, Iter: 1, Date: 2026-03-25\n```\n\n**No matches**:\n```\nNo memory entries match \"auth mocks\".\n\nTry broader terms or list all entries:\n  \u002Fralph-memory list\n```\n\n### `clear` Subcommand\n\n1. If `--loop-id` is provided, delete only entries belonging to that loop\n2. Otherwise, prepare to clear the entire memory store\n3. Show a confirmation prompt before deleting\n\n**Confirmation prompt**:\n```\nThis will permanently delete 8 memory entries.\n\nEntries by loop:\n  abc123 — 3 entries (Fix auth tests, 2026-04-01)\n  def456 — 4 entries (ESM migration, 2026-03-28)\n  ghi789 — 1 entry  (Middleware fix, 2026-03-25)\n\nType 'yes' to confirm:\n```\n\n**After clearing**:\n```\nAl memory cleared. 8 entries deleted.\n\nMemory file reset: .aiwg\u002Fralph\u002Fmemory.json\n```\n\n**Loop-scoped clear**:\n```\nCleared 3 memory entries for loop abc123.\n\nRemaining entries: 5 (in other loops)\n```\n\n## Memory File Locations\n\n| Scope | Path |\n|-------|------|\n| Global (all loops) | `.aiwg\u002Fralph\u002Fmemory.json` |\n| External loop global | `.aiwg\u002Fralph-external\u002Fmemory.json` |\n| Per-loop (external) | `.aiwg\u002Fralph-external\u002Floops\u002F\u003Cid>.json` (embedded `learnings` field) |\n\n## Error Handling\n\n**Memory file missing**:\n```\nNo Al memory found at .aiwg\u002Fralph\u002Fmemory.json.\n\nAl has not accumulated any memory yet. Run a loop first:\n  \u002Fralph \"your task\" --completion \"criteria\"\n```\n\n**Corrupted memory file**:\n```\nMemory file is not valid JSON: .aiwg\u002Fralph\u002Fmemory.json\n\nOptions:\n1. Delete and start fresh: rm .aiwg\u002Fralph\u002Fmemory.json\n2. Inspect manually to repair\n```\n\n**Missing --query for query subcommand**:\n```\nError: --query is required for the 'query' subcommand.\n\nUsage:\n  \u002Fralph-memory query --query \"auth mocks\"\n  \u002Fralph-memory query --query \"typescript\" --since 7d\n```\n\n## Examples\n\n### Example 1: List all memory entries\n```\n\u002Fralph-memory list\n```\n**Response**: Table of all accumulated Al memory entries, newest first.\n\n### Example 2: List entries from the last week\n```\n\u002Fralph-memory list --since 7d\n```\n**Response**: Only entries created in the last 7 days.\n\n### Example 3: Query for relevant memories before starting a task\n```\n\u002Fralph-memory query --query \"typescript esm\"\n```\n**Response**: Top matching entries about TypeScript ESM, ranked by relevance.\n\n### Example 4: List memories from a specific loop\n```\n\u002Fralph-memory list --loop-id abc123\n```\n**Response**: Only entries generated during loop `abc123`.\n\n### Example 5: Clear memories from a completed loop\n```\n\u002Fralph-memory clear --loop-id abc123\n```\n**Response**: Prompts confirmation, then deletes the 3 entries for loop abc123.\n\n### Example 6: Full reset\n```\n\u002Fralph-memory clear\n```\n**Response**: Prompts confirmation listing all entries by loop, then deletes everything.\n\n## Related\n\n- `ralph` — Loop that generates memory entries\n- `ralph-external` — External loop with its own memory layer\n- `ralph-status` — Check loop status and iteration history\n- `ralph-reflect` — Deeper reflection and memory promotion\n\n## References\n\n- @$AIWG_ROOT\u002Fsrc\u002Fcli\u002Fhandlers\u002Fralph.ts — Al CLI handler\n- @$AIWG_ROOT\u002Ftools\u002Fralph-external\u002Fmemory-manager.mjs — Memory storage and retrieval\n- @$AIWG_ROOT\u002Ftools\u002Fralph-external\u002Flib\u002Fsemantic-memory.mjs — Semantic memory layer\n- @$AIWG_ROOT\u002Ftools\u002Fralph-external\u002Flib\u002Fmemory-retrieval.mjs — Memory query logic\n- @$AIWG_ROOT\u002Ftools\u002Fralph-external\u002Flib\u002Fmemory-promotion.mjs — Cross-task memory promotion\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Fagent-loop\u002FREADME.md — Al documentation\n\n## Storage Routing (#934, #967)\n\nThis skill's persistence flows through `resolveStorage('memory')`. On the default `fs` backend the agent-loop memory lives at `.aiwg\u002Fralph\u002Fmemory.json` (and `.aiwg\u002Fralph-external\u002Fmemory.json` for external loops). To redirect into Obsidian, Logseq, Fortemi, or another backend without changing this skill, configure `roots.memory` or `backends.memory` in `.aiwg\u002Fstorage.config` (#934).\n\nWhen this skill needs to read\u002Fwrite loop memory from a Bash step, prefer the storage-routed CLI:\n\n```bash\naiwg memory get ralph\u002Fmemory.json                # read global ralph memory\necho '{\"loop_id\":\"x\",\"learnings\":[]}' | aiwg memory put ralph\u002Fmemory.json\necho '{\"event\":\"learned\",\"ts\":\"...\"}' | aiwg memory append-log ralph\u002Flearning.jsonl\n```\n\nThe legacy direct-fs paths (`.aiwg\u002Fralph\u002Fmemory.json`) continue to work on the default `fs` backend — they're byte-identical to what the adapter writes — but only the adapter route honors `storage.config` redirection.\n","\u003C!-- AIWG-SKILL-CALLOUT -->\n> **Skill access pattern (post-kernel-pivot, 2026.5+)**\n>\n> Skill names referenced in this document are AIWG skills, **not slash commands**. Most are not kernel-listed and cannot be invoked as `\u002Fskill-name` by the platform. Reach them via:\n>\n> ```bash\n> aiwg discover \"\u003Ccapability>\"\n> aiwg show skill \u003Cname> --body\n> ```\n>\n> Only kernel-listed skills (`aiwg-doctor`, `aiwg-refresh`, `aiwg-status`, `aiwg-help`, `use`, `steward`) are directly invokable as slash commands. See [skill-discovery rule](..\u002F..\u002F..\u002Faddons\u002Faiwg-utils\u002Frules\u002Fskill-discovery.md).\n\n\n# Al Memory\n\nInspect and manage the semantic memory that Al accumulates across loop iterations. Memory entries record lessons learned, failure patterns, and success patterns so that later iterations — and future loops on similar tasks — benefit from what earlier attempts discovered.\n\n## HITL authorization checkpoints\n\nBefore a removal confirmation below, apply\n[agent-loop authorization checkpoints](..\u002F..\u002Fdocs\u002Fhitl-authorization.md) and call\n`aiwg config authorization check --action-file \"$ACTION_FILE\" --target \"$TARGET_REPO\"`.\nOnly `auto-authorized` with a signed receipt skips a workflow prompt. Keep\nexisting prompts\u002Frefusals otherwise; platform prompts are never bypassed.\nMemory deletion without a complete rollback remains irreversible and requires review.\n\n## Natural Language Triggers\n\nUsers may say:\n- \"ralph memory\"\n- \"ralph memories\"\n- \"list ralph memory\"\n- \"query ralph memory\"\n- \"what has ralph learned\"\n- \"show ralph lessons\"\n- \"clear ralph memory\"\n\n## Parameters\n\n### Subcommand (required)\nOne of `list`, `query`, or `clear`.\n\n### --loop-id (optional)\nScope the operation to a specific loop's memory. If omitted, operates on the global memory store (`.aiwg\u002Fralph\u002Fmemory.json`).\n\n```\n\u002Fralph-memory list --loop-id abc123\n```\n\n### --query (optional, used with `query` subcommand)\nText to search for in memory entries. Matches against `lesson`, `pattern`, `context`, and `tags` fields.\n\n```\n\u002Fralph-memory query --query \"auth mocks\"\n```\n\n### --since (optional)\nFilter entries created on or after this date. Accepts ISO 8601 date (`2026-04-01`) or relative expressions (`7d`, `2w`).\n\n```\n\u002Fralph-memory list --since 7d\n```\n\n## Memory Entry Schema\n\nEach entry in `.aiwg\u002Fralph\u002Fmemory.json` follows this structure:\n\n```json\n{\n  \"id\": \"mem_a1b2c3\",\n  \"loopId\": \"abc123\",\n  \"iteration\": 2,\n  \"createdAt\": \"2026-04-01T10:42:00Z\",\n  \"type\": \"failure_pattern\",\n  \"lesson\": \"Auth mocks must be initialized inside beforeEach, not at module scope\",\n  \"context\": \"src\u002Fauth\u002Fauth.test.ts iteration 2 failure\",\n  \"tags\": [\"auth\", \"mocks\", \"jest\"],\n  \"confidence\": 0.9\n}\n```\n\n**Entry types**:\n- `lesson_learned` — General insight extracted from an iteration\n- `failure_pattern` — Recurring error pattern to avoid\n- `success_pattern` — Approach that worked and should be repeated\n\n## Behavior\n\n### `list` Subcommand\n\n1. Read the memory store (scoped to `--loop-id` if provided, otherwise global)\n2. Apply `--since` filter if provided\n3. Display a formatted table of all entries, sorted by `createdAt` descending\n\n**Output**:\n```\nAl Memory — 8 entries\n\n| ID       | Type            | Loop   | Iter | Lesson                                              | Date       |\n|----------|-----------------|--------|------|-----------------------------------------------------|------------|\n| mem_a1b2 | failure_pattern | abc123 | 2    | Auth mocks must be in beforeEach, not module scope  | 2026-04-01 |\n| mem_c3d4 | lesson_learned  | abc123 | 3    | Use jest.resetAllMocks() in afterEach               | 2026-04-01 |\n| mem_e5f6 | success_pattern | def456 | 5    | ESM imports require .js extension in TypeScript     | 2026-03-28 |\n| mem_g7h8 | failure_pattern | def456 | 2    | ts-node does not support isolatedModules by default | 2026-03-28 |\n...\n\nUse \u002Fralph-memory query --query \"\u003Ctext>\" to search.\n```\n\n**If no entries exist**:\n```\nNo memory entries found.\n\nAl accumulates memory as it runs loops. Start a loop:\n  \u002Fralph \"your task\" --completion \"criteria\"\n```\n\n### `query` Subcommand\n\n1. Read all memory entries (filtered by `--loop-id` and `--since` if provided)\n2. Score each entry against the `--query` text using substring and tag matching\n3. Return the top matches, ranked by relevance score descending\n\n**Output**:\n```\nAl Memory — query: \"auth mocks\"\n\n3 matching entries (ranked by relevance):\n\n1. [mem_a1b2] failure_pattern — confidence 0.90\n   Lesson: Auth mocks must be initialized inside beforeEach, not at module scope\n   Context: src\u002Fauth\u002Fauth.test.ts iteration 2\n   Tags: auth, mocks, jest\n   Loop: abc123, Iter: 2, Date: 2026-04-01\n\n2. [mem_c3d4] lesson_learned — confidence 0.80\n   Lesson: Use jest.resetAllMocks() in afterEach to prevent mock state leakage\n   Context: src\u002Fauth\u002Fauth.test.ts iteration 3\n   Tags: auth, jest, cleanup\n   Loop: abc123, Iter: 3, Date: 2026-04-01\n\n3. [mem_x9y0] failure_pattern — confidence 0.60\n   Lesson: Passport mock must stub req.user before middleware chain\n   Context: src\u002Fauth\u002Fmiddleware.test.ts\n   Tags: auth, passport, mocks\n   Loop: ghi789, Iter: 1, Date: 2026-03-25\n```\n\n**No matches**:\n```\nNo memory entries match \"auth mocks\".\n\nTry broader terms or list all entries:\n  \u002Fralph-memory list\n```\n\n### `clear` Subcommand\n\n1. If `--loop-id` is provided, delete only entries belonging to that loop\n2. Otherwise, prepare to clear the entire memory store\n3. Show a confirmation prompt before deleting\n\n**Confirmation prompt**:\n```\nThis will permanently delete 8 memory entries.\n\nEntries by loop:\n  abc123 — 3 entries (Fix auth tests, 2026-04-01)\n  def456 — 4 entries (ESM migration, 2026-03-28)\n  ghi789 — 1 entry  (Middleware fix, 2026-03-25)\n\nType 'yes' to confirm:\n```\n\n**After clearing**:\n```\nAl memory cleared. 8 entries deleted.\n\nMemory file reset: .aiwg\u002Fralph\u002Fmemory.json\n```\n\n**Loop-scoped clear**:\n```\nCleared 3 memory entries for loop abc123.\n\nRemaining entries: 5 (in other loops)\n```\n\n## Memory File Locations\n\n| Scope | Path |\n|-------|------|\n| Global (all loops) | `.aiwg\u002Fralph\u002Fmemory.json` |\n| External loop global | `.aiwg\u002Fralph-external\u002Fmemory.json` |\n| Per-loop (external) | `.aiwg\u002Fralph-external\u002Floops\u002F\u003Cid>.json` (embedded `learnings` field) |\n\n## Error Handling\n\n**Memory file missing**:\n```\nNo Al memory found at .aiwg\u002Fralph\u002Fmemory.json.\n\nAl has not accumulated any memory yet. Run a loop first:\n  \u002Fralph \"your task\" --completion \"criteria\"\n```\n\n**Corrupted memory file**:\n```\nMemory file is not valid JSON: .aiwg\u002Fralph\u002Fmemory.json\n\nOptions:\n1. Delete and start fresh: rm .aiwg\u002Fralph\u002Fmemory.json\n2. Inspect manually to repair\n```\n\n**Missing --query for query subcommand**:\n```\nError: --query is required for the 'query' subcommand.\n\nUsage:\n  \u002Fralph-memory query --query \"auth mocks\"\n  \u002Fralph-memory query --query \"typescript\" --since 7d\n```\n\n## Examples\n\n### Example 1: List all memory entries\n```\n\u002Fralph-memory list\n```\n**Response**: Table of all accumulated Al memory entries, newest first.\n\n### Example 2: List entries from the last week\n```\n\u002Fralph-memory list --since 7d\n```\n**Response**: Only entries created in the last 7 days.\n\n### Example 3: Query for relevant memories before starting a task\n```\n\u002Fralph-memory query --query \"typescript esm\"\n```\n**Response**: Top matching entries about TypeScript ESM, ranked by relevance.\n\n### Example 4: List memories from a specific loop\n```\n\u002Fralph-memory list --loop-id abc123\n```\n**Response**: Only entries generated during loop `abc123`.\n\n### Example 5: Clear memories from a completed loop\n```\n\u002Fralph-memory clear --loop-id abc123\n```\n**Response**: Prompts confirmation, then deletes the 3 entries for loop abc123.\n\n### Example 6: Full reset\n```\n\u002Fralph-memory clear\n```\n**Response**: Prompts confirmation listing all entries by loop, then deletes everything.\n\n## Related\n\n- `ralph` — Loop that generates memory entries\n- `ralph-external` — External loop with its own memory layer\n- `ralph-status` — Check loop status and iteration history\n- `ralph-reflect` — Deeper reflection and memory promotion\n\n## References\n\n- @$AIWG_ROOT\u002Fsrc\u002Fcli\u002Fhandlers\u002Fralph.ts — Al CLI handler\n- @$AIWG_ROOT\u002Ftools\u002Fralph-external\u002Fmemory-manager.mjs — Memory storage and retrieval\n- @$AIWG_ROOT\u002Ftools\u002Fralph-external\u002Flib\u002Fsemantic-memory.mjs — Semantic memory layer\n- @$AIWG_ROOT\u002Ftools\u002Fralph-external\u002Flib\u002Fmemory-retrieval.mjs — Memory query logic\n- @$AIWG_ROOT\u002Ftools\u002Fralph-external\u002Flib\u002Fmemory-promotion.mjs — Cross-task memory promotion\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Fagent-loop\u002FREADME.md — Al documentation\n\n## Storage Routing (#934, #967)\n\nThis skill's persistence flows through `resolveStorage('memory')`. On the default `fs` backend the agent-loop memory lives at `.aiwg\u002Fralph\u002Fmemory.json` (and `.aiwg\u002Fralph-external\u002Fmemory.json` for external loops). To redirect into Obsidian, Logseq, Fortemi, or another backend without changing this skill, configure `roots.memory` or `backends.memory` in `.aiwg\u002Fstorage.config` (#934).\n\nWhen this skill needs to read\u002Fwrite loop memory from a Bash step, prefer the storage-routed CLI:\n\n```bash\naiwg memory get ralph\u002Fmemory.json                # read global ralph memory\necho '{\"loop_id\":\"x\",\"learnings\":[]}' | aiwg memory put ralph\u002Fmemory.json\necho '{\"event\":\"learned\",\"ts\":\"...\"}' | aiwg memory append-log ralph\u002Flearning.jsonl\n```\n\nThe legacy direct-fs paths (`.aiwg\u002Fralph\u002Fmemory.json`) continue to work on the default `fs` backend — they're byte-identical to what the adapter writes — but only the adapter route honors `storage.config` redirection.\n",{"name":5,"namespace":55,"platforms":56,"commandHint":58,"description":7},"aiwg",[57],"all",{"model":44,"category":49,"modelRole":37,"modelTier":59,"platforms":60,"allowedTools":62,"argumentHint":63},"economy",[61,45,33],"claude-code","Read, Write","\u003Clist|query|clear> [--loop-id \u003Cid>] [--query \u003Ctext>] [--since \u003Cdate>]","main","6754967c344ccb087a8de06972f55a41067b291b","agentic\u002Fcode\u002Faddons\u002Fagent-loop\u002Fskills\u002Fralph-memory",36,"https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg","https:\u002F\u002Faiwg.io","https:\u002F\u002Fgithub.com\u002Fjmagly","https:\u002F\u002Fintegrolabs.io","ml\u002Fai, industrial automation, safety\u002Fsecurity, ssi\r\n\r\nmagly.net\r\nintegrolabs.io\r\naiwg.io\r\nfortemi.com\r\npagenary.com\r\nbytecask.com","2026-11-12 00:33:10",{"source":8,"skillName":5,"commands":75,"prompt":85,"zipAvailable":86},[76,79,82],{"tool":77,"command":78},"npx","npx skills add jmagly\u002Faiwg --skill ralph-memory",{"tool":80,"command":81},"bunx","bunx skills add jmagly\u002Faiwg --skill ralph-memory",{"tool":83,"command":84},"pnpm","pnpm dlx skills add jmagly\u002Faiwg --skill ralph-memory","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Faddons\u002Fagent-loop\u002Fskills\u002Fralph-memory\u002FSKILL.md",true,[],[89,116,139,145,152,166],{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":96,"publishedAt":50},"01M70QA0BSYJ49EES9V4RE8QH1","host-hardening","Read-only system hardening baseline and plan-first host hardening recommendations for SSH, Docker bind addresses, firewall persistence, datastores, exporters and audit retention.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[95],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[97,98,99,43,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115],"host","host hardening","hardening","re","recommendations","remediation","plan","port","verification","Bash","access","only","retention","audit","never","firewall","bind","secrets","request",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":126,"publishedAt":50},"01M70PNT2Z4HMZPRBTAF6073NN","exposure-analysis","Read-only firewall analysis and effective host exposure reconstruction for Docker published ports, UFW bypass, stale rules, CDN scope, IPv6 asymmetry and external probe allowlists.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fforensics\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[122,125],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[127,128,129,43,130,104,131,132,106,133,97,134,108,135,136,111,112,137,138,42],"exposure analysis","analysis","unknown","credentials","collection","ufw","ports","internet","local","scope","reconstruction","operator",{"skillNo":140,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":144,"publishedAt":50},"01M70P8QATMPKA78E4FT5D2TNA","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[143],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[99,97,98,107,43,115,102,101,110,103,104,105,106,114,108,109,100,111,112,113],{"skillNo":146,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":151,"publishedAt":50},"01M70NMPVJ5H0JH131P60FW4R8","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fforensics-complete\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[149,150],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[128,127,111,130,104,131,106,129,97,134,108,135,136,43,112,133,132,137,138,42],{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":159,"publishedAt":50},"01M6CB4DDR0B4NNCFK7ZK7449H","fixture-skill","Exercise rule delivery.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frule-delivery\u002Fskills\u002Ffixture-skill\u002FSKILL.md",[158],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[160,161,162,163,164,165],"fixture skill","fixture","rule","delivery","true","exercise",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":173,"publishedAt":50},"01M6CB4AVK1W76MFMPP0JP32CJ","pi-local","Pi-local duplicate-precedence fixture.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fproviders\u002Fpi\u002Fproject\u002F.pi\u002Fskills\u002Fpi-local\u002FSKILL.md",[172],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[174,175,135,176,161],"pi","pi local","duplicate"]