<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tony Casey</title>
    <description>The latest articles on DEV Community by Tony Casey (@tonycasey).</description>
    <link>https://dev.to/tonycasey</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3709862%2Fa5f2d178-c2c6-4777-ac38-6f6c45707b37.png</url>
      <title>DEV Community: Tony Casey</title>
      <link>https://dev.to/tonycasey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tonycasey"/>
    <language>en</language>
    <item>
      <title>Why Ralph Wiggum Needs Lisa</title>
      <dc:creator>Tony Casey</dc:creator>
      <pubDate>Tue, 13 Jan 2026 21:51:04 +0000</pubDate>
      <link>https://dev.to/tonycasey/why-ralph-wiggum-needs-lisa-23nm</link>
      <guid>https://dev.to/tonycasey/why-ralph-wiggum-needs-lisa-23nm</guid>
      <description>&lt;h1&gt;
  
  
  Building Persistent Memory for Autonomous AI Agents
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;How we built knowledge graph-powered memory for Claude Code that actually persists&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Nobody's Talking About
&lt;/h2&gt;

&lt;p&gt;Ralph Wiggum changed everything for Claude Code users.&lt;/p&gt;

&lt;p&gt;For the first time, you could set Claude loose on your codebase and let it work autonomously for hours. Teams shipped entire repositories overnight. One team famously ran a 3-month loop that built a complete programming language.&lt;/p&gt;

&lt;p&gt;But there's a problem.&lt;/p&gt;

&lt;p&gt;Every morning, Ralph forgets everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Groundhog Day Problem
&lt;/h3&gt;

&lt;p&gt;Picture this: You run Ralph for 8 hours. He refactors your entire API layer, discovers patterns, makes architectural decisions, and learns your preferences.&lt;/p&gt;

&lt;p&gt;You close the terminal.&lt;/p&gt;

&lt;p&gt;The next morning, you start a new session.&lt;/p&gt;

&lt;p&gt;Ralph: "Hi! What should we work on?"&lt;/p&gt;

&lt;p&gt;You: "Remember yesterday when you—"&lt;/p&gt;

&lt;p&gt;Ralph: "Yesterday?"&lt;/p&gt;

&lt;p&gt;This is the &lt;strong&gt;Groundhog Day Problem&lt;/strong&gt; of autonomous AI agents. They can run forever, but they can't remember anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Existing Solutions Don't Work
&lt;/h2&gt;

&lt;p&gt;You might think: "Just save the conversation history!"&lt;/p&gt;

&lt;p&gt;We tried that. It doesn't work. Here's why:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Context Window Limits
&lt;/h3&gt;

&lt;p&gt;Claude's context window is large (200K tokens), but not infinite. An 8-hour Ralph session generates millions of tokens. You can't fit that in a context window.&lt;/p&gt;

&lt;p&gt;Even if you could, it's inefficient. Claude doesn't need to re-read every line of every conversation. It needs structured knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Text Embeddings Aren't Enough
&lt;/h3&gt;

&lt;p&gt;Many memory solutions use vector embeddings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chunk the conversation&lt;/li&gt;
&lt;li&gt;Embed each chunk&lt;/li&gt;
&lt;li&gt;Retrieve similar chunks when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This works for semantic search, but fails for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Temporal reasoning&lt;/strong&gt;: "What changed between yesterday and today?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relationship queries&lt;/strong&gt;: "How does Module A relate to Module B?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision tracking&lt;/strong&gt;: "Why did we choose approach X over Y?"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. The Lost Context Problem
&lt;/h3&gt;

&lt;p&gt;Even with embeddings, you lose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Causal relationships&lt;/li&gt;
&lt;li&gt;Decision rationale&lt;/li&gt;
&lt;li&gt;Pattern evolution over time&lt;/li&gt;
&lt;li&gt;Cross-project learning&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution: Knowledge Graphs + Skills
&lt;/h2&gt;

&lt;p&gt;Lisa takes a different approach. Instead of saving everything, we build &lt;strong&gt;structured knowledge&lt;/strong&gt; using Graphiti's knowledge graph engine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture Overview
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│                     Claude Code                          │
│                   (Ralph Wiggum)                         │
└──────────────┬──────────────────────────────────────────┘
               │
               │ Session events (hooks)
               │
┌──────────────▼──────────────────────────────────────────┐
│                    Lisa (Skills Layer)                   │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐              │
│  │  Memory  │  │  Tasks   │  │  Prompt  │   ...         │
│  │  Skill   │  │  Skill   │  │  Skill   │              │
│  └──────────┘  └──────────┘  └──────────┘              │
└──────────────┬──────────────────────────────────────────┘
               │
               │ MCP Protocol
               │
┌──────────────▼──────────────────────────────────────────┐
│            Graphiti MCP Server                           │
│    (Knowledge Graph Engine)                              │
│                                                           │
│  ┌─────────────────────────────────────────────────┐   │
│  │  Nodes: Entities (files, modules, decisions)    │   │
│  │  Edges: Relationships (modified, depends_on)    │   │
│  │  Facts: Timestamped knowledge                   │   │
│  │  Episodes: Conversation context                 │   │
│  └─────────────────────────────────────────────────┘   │
└──────────────┬──────────────────────────────────────────┘
               │
               │ Storage
               │
┌──────────────▼──────────────────────────────────────────┐
│         Neo4j (Local Docker or Zep Cloud)                │
└──────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Event Capture (Hooks)
&lt;/h4&gt;

&lt;p&gt;Lisa uses Claude Code's hook system to capture events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// session-start.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onSessionStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Load relevant memories for this project&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;memories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;searchFacts&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;group_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;projectContext&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You have these memories: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;memories&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// user-prompt-submit.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onPromptSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Store the prompt as an episode&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEpisode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;group_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;projectId&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// session-stop.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onSessionStop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Extract and store learnings from this session&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;learnings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extractLearnings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transcript&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addFacts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;learnings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Knowledge Extraction (Graphiti)
&lt;/h4&gt;

&lt;p&gt;When you close a session, Lisa sends the transcript to Graphiti, which:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extracts entities&lt;/strong&gt;: files, functions, modules, people, concepts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identifies relationships&lt;/strong&gt;: modified, depends_on, implements, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creates facts&lt;/strong&gt;: timestamped assertions ("File X was modified to fix bug Y")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links episodes&lt;/strong&gt;: connects conversations to facts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nodes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"uuid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/api/users.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"uuid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tony"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"person"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"uuid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RESTful architecture"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"concept"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"edges"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tony"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/api/users.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MODIFIED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tony refactored users.ts to follow RESTful patterns"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-11T10:30:00Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Queryable Memory (Skills)
&lt;/h4&gt;

&lt;p&gt;Next session, Claude can query this knowledge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; lisa, what did we decide about the API architecture?

👧 Recent decision: You refactored the API to follow RESTful patterns.

   Specifically:
   - users.ts now uses resource-based endpoints
   - Moved from RPC-style to REST
   - Rationale: Better caching, clearer semantics

   Related files: users.ts, posts.ts, comments.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't search. It's &lt;strong&gt;reasoning over a knowledge graph&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills: Extensible Memory Modules
&lt;/h3&gt;

&lt;p&gt;Lisa uses a "skills" architecture. Each skill is a specialized memory module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.agents/skills/
├── memory/          # Core knowledge graph persistence
│   ├── scripts/memory.js
│   └── SKILL.md
├── tasks/           # Task tracking across sessions
│   ├── scripts/tasks.js
│   └── SKILL.md
├── prompt/          # Prompt history and patterns
│   ├── scripts/prompt.js
│   └── SKILL.md
└── lisa/            # Meta-skill for orchestration
    ├── scripts/storage.js
    └── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each skill:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handles a specific type of memory&lt;/li&gt;
&lt;li&gt;Uses Graphiti MCP under the hood&lt;/li&gt;
&lt;li&gt;Can be invoked with natural language&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: The &lt;code&gt;tasks&lt;/code&gt; skill&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; lisa, add task: refactor authentication

👧 Task added: &lt;span class="s2"&gt;"Refactor authentication"&lt;/span&gt;
   Status: todo
   Added to group: my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; lisa, what tasks are pending?

👧 Tasks:
   1. &lt;span class="o"&gt;[&lt;/span&gt;todo] Refactor authentication
   2. &lt;span class="o"&gt;[&lt;/span&gt;doing] Update API docs
   3. &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; Fix login bug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tasks persist across sessions, projects, and even months.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ralph + Lisa Stack
&lt;/h2&gt;

&lt;p&gt;Here's where it gets powerful. Combine Ralph (autonomous execution) with Lisa (persistent memory):&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 1: Ralph Learns
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start Ralph with a goal&lt;/span&gt;
ralph &lt;span class="nt"&gt;--goal&lt;/span&gt; &lt;span class="s2"&gt;"Refactor the API layer to follow RESTful principles"&lt;/span&gt;

&lt;span class="c"&gt;# Ralph runs for 6 hours:&lt;/span&gt;
&lt;span class="c"&gt;# - Analyzes current code&lt;/span&gt;
&lt;span class="c"&gt;# - Identifies non-RESTful patterns&lt;/span&gt;
&lt;span class="c"&gt;# - Refactors endpoints&lt;/span&gt;
&lt;span class="c"&gt;# - Updates tests&lt;/span&gt;
&lt;span class="c"&gt;# - Makes 47 commits&lt;/span&gt;

&lt;span class="c"&gt;# Meanwhile, Lisa is watching:&lt;/span&gt;
&lt;span class="c"&gt;# - Captures architectural decisions&lt;/span&gt;
&lt;span class="c"&gt;# - Stores refactoring patterns&lt;/span&gt;
&lt;span class="c"&gt;# - Tracks file relationships&lt;/span&gt;
&lt;span class="c"&gt;# - Records test updates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Day 2: Ralph Remembers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start a new Ralph session&lt;/span&gt;
ralph &lt;span class="nt"&gt;--goal&lt;/span&gt; &lt;span class="s2"&gt;"Add new /products endpoint"&lt;/span&gt;

&lt;span class="c"&gt;# Lisa loads memories:&lt;/span&gt;
&lt;span class="c"&gt;# "Yesterday you refactored to RESTful patterns.&lt;/span&gt;
&lt;span class="c"&gt;#  Users endpoint uses: GET /users, POST /users, GET /users/:id&lt;/span&gt;
&lt;span class="c"&gt;#  You preferred Joi for validation.&lt;/span&gt;
&lt;span class="c"&gt;#  Tests follow AAA pattern."&lt;/span&gt;

&lt;span class="c"&gt;# Ralph uses this context:&lt;/span&gt;
&lt;span class="c"&gt;# - Creates /products with same pattern&lt;/span&gt;
&lt;span class="c"&gt;# - Uses Joi validation (without being told)&lt;/span&gt;
&lt;span class="c"&gt;# - Follows AAA test pattern&lt;/span&gt;
&lt;span class="c"&gt;# - Stays consistent with Day 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Ralph doesn't just loop. Ralph &lt;strong&gt;learns&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multi-Day Features
&lt;/h3&gt;

&lt;p&gt;Break a large feature across multiple sessions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Day 1: &lt;span class="s2"&gt;"Design the authentication system"&lt;/span&gt;
Day 2: &lt;span class="s2"&gt;"Implement JWT tokens"&lt;/span&gt;
Day 3: &lt;span class="s2"&gt;"Add refresh token rotation"&lt;/span&gt;
Day 4: &lt;span class="s2"&gt;"Write integration tests"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each day builds on previous decisions without re-explanation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Team Memory
&lt;/h3&gt;

&lt;p&gt;Share knowledge across team members:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Alice's session&lt;/span&gt;
alice&amp;gt; &lt;span class="s2"&gt;"We decided to use PostgreSQL for user data"&lt;/span&gt;

&lt;span class="c"&gt;# Bob's session (next day)&lt;/span&gt;
bob&amp;gt; &lt;span class="s2"&gt;"What database should I use for orders?"&lt;/span&gt;
lisa&amp;gt; &lt;span class="s2"&gt;"You're using PostgreSQL for user data. Use the same for orders."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Project Templates
&lt;/h3&gt;

&lt;p&gt;Lisa learns your preferences:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# After several projects:&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Start a new API project"&lt;/span&gt;

lisa&amp;gt; &lt;span class="s2"&gt;"Creating Express project with:
       - TypeScript (you always use this)
       - Joi validation (your preference)
       - Jest for tests (95% coverage target)
       - PostgreSQL (your standard)

       Based on your last 3 projects."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Bug Pattern Recognition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Week 1: Fix a null pointer bug&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Fixed NPE in users.ts by adding null check"&lt;/span&gt;

&lt;span class="c"&gt;# Week 3: Similar code, similar bug&lt;/span&gt;
lisa&amp;gt; &lt;span class="s2"&gt;"Warning: This looks like the null pointer pattern from users.ts.
       Consider adding the same null check."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Technical Deep Dive: Graphiti Integration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Graphiti?
&lt;/h3&gt;

&lt;p&gt;We evaluated several memory backends:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plain text files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple&lt;/td&gt;
&lt;td&gt;No querying, no relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vector embeddings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Good for similarity&lt;/td&gt;
&lt;td&gt;No temporal reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQL database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Queryable&lt;/td&gt;
&lt;td&gt;Rigid schema, poor for graphs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Graphiti&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Knowledge graphs, temporal reasoning, MCP protocol&lt;/td&gt;
&lt;td&gt;Requires Neo4j&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Graphiti won because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Graphs&lt;/strong&gt;: Natural fit for code relationships&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal Reasoning&lt;/strong&gt;: Tracks changes over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Protocol&lt;/strong&gt;: Standard integration with Claude Code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise Ready&lt;/strong&gt;: Battle-tested by Zep&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  MCP Integration
&lt;/h3&gt;

&lt;p&gt;Lisa communicates with Graphiti via the Model Context Protocol (MCP):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/mcp.ts - Simplified&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;McpClient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;searchFacts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;groupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;search_facts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;group_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;groupId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;max_facts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;addEpisode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;groupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;add_episode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;group_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;groupId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard protocol (not vendor-locked)&lt;/li&gt;
&lt;li&gt;Multiple backend support (local Docker, Zep Cloud)&lt;/li&gt;
&lt;li&gt;Future-proof architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Storage Modes
&lt;/h3&gt;

&lt;p&gt;Lisa supports two storage modes:&lt;/p&gt;

&lt;h4&gt;
  
  
  Local Mode (Docker)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.graphiti.yml&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;neo4j&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;neo4j:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7474:7474"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7687:7687"&lt;/span&gt;

  &lt;span class="na"&gt;graphiti&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zepai/knowledge-graph-mcp:standalone&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NEO4J_URI=bolt://neo4j:7687&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full control&lt;/li&gt;
&lt;li&gt;Private data&lt;/li&gt;
&lt;li&gt;No API costs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires Docker&lt;/li&gt;
&lt;li&gt;Manual updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Zep Cloud Mode
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .agents/.env&lt;/span&gt;
&lt;span class="nv"&gt;GRAPHITI_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.getzep.com
&lt;span class="nv"&gt;GRAPHITI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key-here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero setup&lt;/li&gt;
&lt;li&gt;Managed updates&lt;/li&gt;
&lt;li&gt;Team sharing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires account&lt;/li&gt;
&lt;li&gt;Data leaves localhost&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cache Fallback
&lt;/h3&gt;

&lt;p&gt;If Graphiti is unavailable, Lisa falls back to local cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;facts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;searchFacts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Cache the result&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;writeCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;memory.log&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;facts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;facts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Return cached result&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;readCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;memory.log&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures Lisa works even offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Token Efficiency
&lt;/h3&gt;

&lt;p&gt;Instead of stuffing the full conversation history into every prompt, Lisa:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Queries relevant facts: ~500 tokens&lt;/li&gt;
&lt;li&gt;Injects into system prompt&lt;/li&gt;
&lt;li&gt;Claude reasons over knowledge, not raw logs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 10x reduction in context usage&lt;/p&gt;

&lt;h3&gt;
  
  
  Query Speed
&lt;/h3&gt;

&lt;p&gt;Graphiti queries are fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple fact lookup: &amp;lt;50ms&lt;/li&gt;
&lt;li&gt;Complex graph traversal: &amp;lt;200ms&lt;/li&gt;
&lt;li&gt;Full project search: &amp;lt;500ms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fast enough for real-time usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage Scaling
&lt;/h3&gt;

&lt;p&gt;Neo4j scales to billions of nodes. Unless you're storing every keystroke, you'll never hit limits.&lt;/p&gt;

&lt;p&gt;Typical usage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 session = 10-50 facts&lt;/li&gt;
&lt;li&gt;100 sessions = 5,000 facts&lt;/li&gt;
&lt;li&gt;Storage: &amp;lt;1 MB&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Not Everything Deserves Memory
&lt;/h3&gt;

&lt;p&gt;Early versions tried to remember everything. Bad idea.&lt;/p&gt;

&lt;p&gt;Noise drowns signal. Now we filter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Architectural decisions&lt;/li&gt;
&lt;li&gt;✅ Bug patterns&lt;/li&gt;
&lt;li&gt;✅ User preferences&lt;/li&gt;
&lt;li&gt;❌ Routine operations&lt;/li&gt;
&lt;li&gt;❌ Transient state&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Timestamps Are Critical
&lt;/h3&gt;

&lt;p&gt;Without timestamps, you can't answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What changed since yesterday?"&lt;/li&gt;
&lt;li&gt;"When did we decide X?"&lt;/li&gt;
&lt;li&gt;"What was the sequence?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every fact needs &lt;code&gt;valid_at&lt;/code&gt; and &lt;code&gt;created_at&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Group IDs Enable Multi-Project
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;group_id&lt;/code&gt; to separate projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;group_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;project-alpha&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;// Work project&lt;/span&gt;
&lt;span class="nx"&gt;group_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;project-beta&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;   &lt;span class="c1"&gt;// Side project&lt;/span&gt;
&lt;span class="nx"&gt;group_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;shared&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;         &lt;span class="c1"&gt;// Team knowledge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents cross-contamination.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Skills Beat Monoliths
&lt;/h3&gt;

&lt;p&gt;The skills architecture allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Independent development&lt;/li&gt;
&lt;li&gt;Community contributions&lt;/li&gt;
&lt;li&gt;Gradual learning curve&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Much better than one giant "memory" blob.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future: What's Next
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Week 2-3: Ralph Integration Plugin
&lt;/h3&gt;

&lt;p&gt;Official plugin for Ralph Wiggum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @lisa/ralph-integration

&lt;span class="c"&gt;# Automatic memory capture during Ralph loops&lt;/span&gt;
&lt;span class="c"&gt;# Zero configuration needed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Month 2: Team Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Shared memory pools&lt;/li&gt;
&lt;li&gt;Permission controls&lt;/li&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Month 3: Advanced Query
&lt;/h3&gt;

&lt;p&gt;Natural language queries over knowledge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Show me all API endpoints modified in the last week
   that depend on the auth module and have failing tests"&lt;/span&gt;

lisa&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;Graphical output with relationships]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Long-term: Cross-Agent Memory
&lt;/h3&gt;

&lt;p&gt;Imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; stores code patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; stores decisions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; stores preferences&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lisa&lt;/strong&gt; unifies them all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One memory graph. All your tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Lisa&lt;/span&gt;
npx lisa init

&lt;span class="c"&gt;# Choose local or cloud&lt;/span&gt;
? Storage mode: Local &lt;span class="o"&gt;(&lt;/span&gt;Docker&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Lisa sets up everything&lt;/span&gt;
✓ Docker Compose configured
✓ Graphiti MCP installed
✓ Skills deployed
✓ Hooks configured

&lt;span class="c"&gt;# Start using it&lt;/span&gt;
npx lisa

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; lisa, remember that I prefer TypeScript over JavaScript

👧 Got it! I&lt;span class="s1"&gt;'ll remember you prefer TypeScript.

&amp;gt; lisa, what do you know about me?

👧 Recent memories:
   - You prefer TypeScript over JavaScript
   - You'&lt;/span&gt;re working on the &lt;span class="s1"&gt;'lisa'&lt;/span&gt; project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Integration with Ralph
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install both&lt;/span&gt;
npx lisa init
npx @anthropic-ai/claude-code &lt;span class="nb"&gt;install &lt;/span&gt;ralph-wiggum

&lt;span class="c"&gt;# Run Ralph&lt;/span&gt;
ralph &lt;span class="nt"&gt;--goal&lt;/span&gt; &lt;span class="s2"&gt;"Your goal here"&lt;/span&gt;

&lt;span class="c"&gt;# Lisa captures everything automatically&lt;/span&gt;
&lt;span class="c"&gt;# Next session: Ralph remembers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Ralph Wiggum proved that autonomous AI agents can code for hours.&lt;/p&gt;

&lt;p&gt;Lisa proves they can remember what they learned.&lt;/p&gt;

&lt;p&gt;Together, they're not just tools. They're a platform for AI agents that actually get smarter over time.&lt;/p&gt;

&lt;p&gt;The Simpsons accidentally gave us the perfect metaphor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ralph runs wild and breaks things&lt;/strong&gt; (autonomous loops)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lisa remembers everything and makes it better&lt;/strong&gt; (persistent memory)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop repeating yourself. Lisa's listening.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try Lisa:&lt;/strong&gt; &lt;a href="https://github.com/TonyCasey/lisa" rel="noopener noreferrer"&gt;https://github.com/TonyCasey/lisa&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Discussions:&lt;/strong&gt; &lt;a href="https://github.com/TonyCasey/lisa/discussions" rel="noopener noreferrer"&gt;https://github.com/TonyCasey/lisa/discussions&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Contributing:&lt;/strong&gt; See CONTRIBUTING.md&lt;/p&gt;

&lt;p&gt;Built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/getzep/graphiti" rel="noopener noreferrer"&gt;Graphiti&lt;/a&gt; - Knowledge graph engine&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://claude.com/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; - AI coding assistant&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://neo4j.com" rel="noopener noreferrer"&gt;Neo4j&lt;/a&gt; - Graph database&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://modelcontextprotocol.org" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; - Model Context Protocol&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If you found this useful, star the repo and share your experience. What would you build with an AI agent that never forgets?&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  AI #MachineLearning #ClaudeCode #KnowledgeGraphs #DeveloperTools
&lt;/h1&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
