<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>记忆注入 on BenLab的技术笔记</title>
        <link>http://benlab.cn/tags/%E8%AE%B0%E5%BF%86%E6%B3%A8%E5%85%A5/</link>
        <description>Recent content in 记忆注入 on BenLab的技术笔记</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Fri, 08 May 2026 06:00:00 +0000</lastBuildDate><atom:link href="http://benlab.cn/tags/%E8%AE%B0%E5%BF%86%E6%B3%A8%E5%85%A5/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>claude-mem 源码分析：记忆如何在对话中体现</title>
            <link>http://benlab.cn/posts/claude-mem/06-memory-in-action/</link>
            <pubDate>Fri, 08 May 2026 06:00:00 +0000</pubDate>
            <guid>http://benlab.cn/posts/claude-mem/06-memory-in-action/</guid>
            <description>&lt;h1 id=&#34;06--记忆如何在对话中体现&#34;&gt;&lt;a href=&#34;#06--%e8%ae%b0%e5%bf%86%e5%a6%82%e4%bd%95%e5%9c%a8%e5%af%b9%e8%af%9d%e4%b8%ad%e4%bd%93%e7%8e%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;06 — 记忆如何在对话中体现&#xA;&lt;/h1&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;核心问题：claude-mem 装好后，我在正常对话时&amp;quot;记忆&amp;quot;究竟是怎么发挥作用的？它怎么知道何时搜索、搜什么、如何注入到上下文里？&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;两条完全独立的路径&#34;&gt;&lt;a href=&#34;#%e4%b8%a4%e6%9d%a1%e5%ae%8c%e5%85%a8%e7%8b%ac%e7%ab%8b%e7%9a%84%e8%b7%af%e5%be%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;两条完全独立的路径&#xA;&lt;/h2&gt;&lt;p&gt;记忆在对话中通过&lt;strong&gt;两条机制&lt;/strong&gt;体现，分工明确：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;          &lt;th&gt;路径一：自动注入&lt;/th&gt;&#xA;          &lt;th&gt;路径二：主动搜索&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;触发者&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Claude Code Hook 机制（机器触发）&lt;/td&gt;&#xA;          &lt;td&gt;Claude 自己（LLM 判断后调用 MCP 工具）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;时机&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;会话开始时，一次性&lt;/td&gt;&#xA;          &lt;td&gt;对话中途，按需多次&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;内容&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;近期会话摘要 + 项目相关 observations&lt;/td&gt;&#xA;          &lt;td&gt;精准历史记录（由搜索词决定）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Claude 的角色&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;被动接收（醒来时记忆已在上下文里）&lt;/td&gt;&#xA;          &lt;td&gt;主动调用 MCP 工具&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;数据密度&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;有限（避免撑爆 context window）&lt;/td&gt;&#xA;          &lt;td&gt;3 层递进：索引 → 时间线 → 全文&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;路径一自动注入你不感知claude-也不选择&#34;&gt;&lt;a href=&#34;#%e8%b7%af%e5%be%84%e4%b8%80%e8%87%aa%e5%8a%a8%e6%b3%a8%e5%85%a5%e4%bd%a0%e4%b8%8d%e6%84%9f%e7%9f%a5claude-%e4%b9%9f%e4%b8%8d%e9%80%89%e6%8b%a9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;路径一：自动注入（你不感知，Claude 也不选择）&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;触发时机&lt;/strong&gt;：每次 Claude Code 开始新会话（&lt;code&gt;claude&lt;/code&gt; 启动），或 &lt;code&gt;/clear&lt;/code&gt;、&lt;code&gt;/compact&lt;/code&gt; 之后。&lt;/p&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;sequenceDiagram&#xA;    participant CC as Claude Code&#xA;    participant Hook as SessionStart Hook&#xA;    participant Bun as bun-runner.js&#xA;    participant Worker as Worker HTTP API&#xA;    participant DB as SQLite / Chroma&#xA;&#xA;    CC-&gt;&gt;Hook: 会话启动，触发 SessionStart&#xA;    Hook-&gt;&gt;Bun: bun-runner.js worker-service.cjs hook claude-code context&#xA;    Bun-&gt;&gt;Worker: GET /api/context/inject?projects=...&#xA;    Worker-&gt;&gt;DB: 查 session_summaries（最近 10 条）&#xA;    Worker-&gt;&gt;DB: 查 observations（最近 50 条，按项目过滤）&#xA;    DB--&gt;&gt;Worker: 返回摘要 + observations&#xA;    Worker--&gt;&gt;Bun: 返回格式化的 context 文本&#xA;    Bun--&gt;&gt;CC: stdout JSON：&lt;br/&gt;{&#34;hookSpecificOutput&#34;:{&#34;additionalContext&#34;:&#34;...&#34;}}&#xA;    CC-&gt;&gt;CC: 把 additionalContext 塞进系统提示头部&#xA;    Note over CC: Claude 醒来时，历史记忆已经在上下文里&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;关键点&lt;/strong&gt;：Claude 不需要&amp;quot;决定&amp;quot;搜不搜，记忆已经在那里了。你看到 Claude 说&amp;quot;上次我们在做 X&amp;quot;，就是这条路径的效果。&lt;/p&gt;&#xA;&lt;p&gt;注入的内容来自 &lt;code&gt;src/services/context/ContextBuilder.ts&lt;/code&gt; 的 &lt;code&gt;generateContext()&lt;/code&gt; 函数，它从 &lt;code&gt;ContextConfigLoader&lt;/code&gt; 读取限额配置，然后调用 &lt;code&gt;ObservationCompiler&lt;/code&gt; 拼装输出。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;路径二主动搜索claude-被教会的行为&#34;&gt;&lt;a href=&#34;#%e8%b7%af%e5%be%84%e4%ba%8c%e4%b8%bb%e5%8a%a8%e6%90%9c%e7%b4%a2claude-%e8%a2%ab%e6%95%99%e4%bc%9a%e7%9a%84%e8%a1%8c%e4%b8%ba&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;路径二：主动搜索（Claude 被&amp;quot;教会&amp;quot;的行为）&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;触发时机&lt;/strong&gt;：你问了涉及历史的问题（&amp;ldquo;上周那个 bug 怎么解决的&amp;rdquo;、&amp;ldquo;之前的方案是什么&amp;rdquo;）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;为什么 Claude 会主动搜索&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;安装时注册了 &lt;code&gt;mem-search&lt;/code&gt; MCP 技能。其中的 &lt;code&gt;__IMPORTANT&lt;/code&gt; 元工具描述本身就是一段&lt;strong&gt;指令文本&lt;/strong&gt;，注入进 Claude 的工具列表说明里：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;当用户询问过去的工作、历史决策、之前的代码时，&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;必须先用 search → timeline → get_observations 三层工作流，&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;不要直接回答——先查。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;💡 Tip&lt;/strong&gt; 这是一个&amp;quot;prompt injection via tool description&amp;quot;技巧&#xA;MCP 工具描述字段对 Claude 来说和系统提示的效力等同。&lt;code&gt;__IMPORTANT&lt;/code&gt; 工具的 description 就是工作流规范本身——架构设计即使用规范，API 即文档，无需额外指导。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;搜索结果进入上下文的方式，是 MCP 工具调用的标准返回值路径，不走 hook 注入。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;记忆里存的是什么&#34;&gt;&lt;a href=&#34;#%e8%ae%b0%e5%bf%86%e9%87%8c%e5%ad%98%e7%9a%84%e6%98%af%e4%bb%80%e4%b9%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;记忆里存的是什么&#xA;&lt;/h2&gt;&lt;p&gt;三类数据，层级递进：&lt;/p&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;graph TD&#xA;    subgraph DB[&#34;SQLite 数据库&#34;]&#xA;        OBS[&#34;observations 表&lt;br/&gt;（颗粒度：单次工具调用）&#34;]&#xA;        SUM[&#34;session_summaries 表&lt;br/&gt;（颗粒度：整个会话）&#34;]&#xA;        PROM[&#34;user_prompts 表&lt;br/&gt;（颗粒度：用户每次提问）&#34;]&#xA;    end&#xA;&#xA;    PostTool[&#34;PostToolUse Hook&lt;br/&gt;（每次工具调用后）&#34;] --&gt;|&#34;原始 tool_input + tool_output&#34;| AI1[&#34;AI 压缩\nbuildObservationPrompt&#34;]&#xA;    AI1 --&gt;|&#34;XML 结构化摘要&#34;| OBS&#xA;&#xA;    StopHook[&#34;Stop Hook&lt;br/&gt;（会话结束时）&#34;] --&gt;|&#34;last_assistant_message&#34;| AI2[&#34;AI 摘要\nbuildSummaryPrompt&#34;]&#xA;    AI2 --&gt;|&#34;五段式结构化摘要&#34;| SUM&#xA;&#xA;    UserPrompt[&#34;UserPromptSubmit Hook&#34;] --&gt;|&#34;用户输入文本&#34;| PROM&#xA;&#xA;    style OBS fill:#dae8fc,stroke:#6c8ebf&#xA;    style SUM fill:#d5e8d4,stroke:#82b366&#xA;    style PROM fill:#fff2cc,stroke:#d6b656&lt;/pre&gt;&lt;h3 id=&#34;observations--工具调用的语义提炼&#34;&gt;&lt;a href=&#34;#observations--%e5%b7%a5%e5%85%b7%e8%b0%83%e7%94%a8%e7%9a%84%e8%af%ad%e4%b9%89%e6%8f%90%e7%82%bc&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Observations — 工具调用的语义提炼&#xA;&lt;/h3&gt;&lt;p&gt;每次 PostToolUse 后，原始的 &lt;code&gt;{tool_name, tool_input, tool_output}&lt;/code&gt; 被发给 AI 压缩，产出结构化 XML：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;observation&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;type&amp;gt;&lt;/span&gt;discovery | change | bugfix | decision ...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/type&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;发现了 X&lt;span class=&#34;nt&#34;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;subtitle&amp;gt;&lt;/span&gt;在 Y 文件里&lt;span class=&#34;nt&#34;&gt;&amp;lt;/subtitle&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;facts&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;fact&amp;gt;&lt;/span&gt;具体事实1&lt;span class=&#34;nt&#34;&gt;&amp;lt;/fact&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;fact&amp;gt;&lt;/span&gt;具体事实2&lt;span class=&#34;nt&#34;&gt;&amp;lt;/fact&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/facts&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;narrative&amp;gt;&lt;/span&gt;更完整的叙述（可选的详细描述）&lt;span class=&#34;nt&#34;&gt;&amp;lt;/narrative&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;concepts&amp;gt;&amp;lt;concept&amp;gt;&lt;/span&gt;auth&lt;span class=&#34;nt&#34;&gt;&amp;lt;/concept&amp;gt;&amp;lt;/concepts&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;files_read&amp;gt;&amp;lt;file&amp;gt;&lt;/span&gt;src/xxx.ts&lt;span class=&#34;nt&#34;&gt;&amp;lt;/file&amp;gt;&amp;lt;/files_read&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;files_modified&amp;gt;&amp;lt;file&amp;gt;&lt;/span&gt;src/yyy.ts&lt;span class=&#34;nt&#34;&gt;&amp;lt;/file&amp;gt;&amp;lt;/files_modified&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/observation&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;存的不是原始对话&lt;/strong&gt;，是 AI 从工具调用里提炼的&lt;strong&gt;语义摘要&lt;/strong&gt;。代码见 &lt;code&gt;src/sdk/prompts.ts&lt;/code&gt; 的 &lt;code&gt;buildObservationPrompt()&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;session-summaries--会话级五段式摘要&#34;&gt;&lt;a href=&#34;#session-summaries--%e4%bc%9a%e8%af%9d%e7%ba%a7%e4%ba%94%e6%ae%b5%e5%bc%8f%e6%91%98%e8%a6%81&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Session Summaries — 会话级五段式摘要&#xA;&lt;/h3&gt;&lt;p&gt;Stop Hook 触发后，&lt;code&gt;buildSummaryPrompt()&lt;/code&gt; 把最后一条 assistant 消息喂给 AI，产出五段式摘要，存入 &lt;code&gt;session_summaries&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;字段&lt;/th&gt;&#xA;          &lt;th&gt;含义&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;request&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;这次会话用户要做什么&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;investigated&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;调查了哪些模块/文件&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;learned&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;关键发现（这是下次最有价值的字段）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;completed&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;完成了什么&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;next_steps&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;下次应该继续做什么&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;没有完整的 user/assistant 对话历史&lt;/strong&gt;，只有这五个字段的提炼。&lt;/p&gt;&#xA;&lt;h3 id=&#34;user-prompts--轻量问题记录&#34;&gt;&lt;a href=&#34;#user-prompts--%e8%bd%bb%e9%87%8f%e9%97%ae%e9%a2%98%e8%ae%b0%e5%bd%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;User Prompts — 轻量问题记录&#xA;&lt;/h3&gt;&lt;p&gt;只存用户每次输入的问题文本，用于 timeline 展示，不存 assistant 回答。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;记忆会不会失控膨胀&#34;&gt;&lt;a href=&#34;#%e8%ae%b0%e5%bf%86%e4%bc%9a%e4%b8%8d%e4%bc%9a%e5%a4%b1%e6%8e%a7%e8%86%a8%e8%83%80&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;记忆会不会失控膨胀？&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;注入时有硬上限&lt;/strong&gt;，从 &lt;code&gt;src/shared/SettingsDefaultsManager.ts&lt;/code&gt; 的默认值读出：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CLAUDE_MEM_CONTEXT_OBSERVATIONS   = 50   # 注入最多 50 条 observations&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CLAUDE_MEM_CONTEXT_SESSION_COUNT  = 10   # 会话摘要最多 10 条&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CLAUDE_MEM_CONTEXT_FULL_COUNT     = 0    # 默认只注入摘要，不注全文 narrative&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CLAUDE_MEM_SEMANTIC_INJECT        = false # 语义注入默认关闭&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ObservationCompiler.ts&lt;/code&gt; 里的查询永远带 &lt;code&gt;LIMIT&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;observations&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;WHERE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;project&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;ORDER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;BY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;created_at_epoch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DESC&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;LIMIT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;-- = totalObservationCount = 50&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：注入到 Claude 上下文里的记忆是&lt;strong&gt;有界窗口&lt;/strong&gt;，不随使用时间线性增长。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;⚠️ Warning&lt;/strong&gt; 数据库本身不会自动清理&#xA;SQLite 里的历史数据会一直积累（磁盘慢涨），但这不影响注入效率——每次只取最近 N 条。目前代码里没有自动 TTL 或定期清理机制。这是一个有意为之的取舍：&lt;strong&gt;存储廉价，查询有上限，永久保留而不主动清理&lt;/strong&gt;。如果在意磁盘，需要手动管理 &lt;code&gt;~/.claude-mem/claude-mem.db&lt;/code&gt;。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;不想被记忆的内容怎么处理&#34;&gt;&lt;a href=&#34;#%e4%b8%8d%e6%83%b3%e8%a2%ab%e8%ae%b0%e5%bf%86%e7%9a%84%e5%86%85%e5%ae%b9%e6%80%8e%e4%b9%88%e5%a4%84%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;不想被记忆的内容怎么处理&#xA;&lt;/h2&gt;&lt;h3 id=&#34;方法一private-标签&#34;&gt;&lt;a href=&#34;#%e6%96%b9%e6%b3%95%e4%b8%80private-%e6%a0%87%e7%ad%be&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;方法一：&lt;code&gt;&amp;lt;private&amp;gt;&lt;/code&gt; 标签&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;private&amp;gt;这段内容不会被存入记忆&amp;lt;/private&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;在 hook 层（最靠近用户输入处）就被剥离，不进 Worker，不进 DB。见 &lt;code&gt;src/utils/tag-stripping.ts&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;方法二项目排除&#34;&gt;&lt;a href=&#34;#%e6%96%b9%e6%b3%95%e4%ba%8c%e9%a1%b9%e7%9b%ae%e6%8e%92%e9%99%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;方法二：项目排除&#xA;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;summarize.ts&lt;/code&gt; 开头有项目过滤判断：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// src/cli/handlers/summarize.ts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cwd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;shouldTrackProject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cwd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;suppressOutput&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// 整个会话都不被记录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;某些目录（个人文档、敏感项目）可以配置排除，Stop hook 遇到这些目录直接跳过，不生成任何摘要。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;核心收获&#34;&gt;&lt;a href=&#34;#%e6%a0%b8%e5%bf%83%e6%94%b6%e8%8e%b7&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;核心收获&#xA;&lt;/h2&gt;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;记忆体现有两套机制，不要混淆&lt;/strong&gt;：自动注入（session start 时塞进去，被动接收）和主动搜索（MCP 工具调用，Claude 主动发起）。前者无感，后者可观测（你能看到 Claude 在调用 search/timeline/get_observations）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;存的不是聊天记录，是语义提炼&lt;/strong&gt;：observations 是工具调用的 AI 摘要，summaries 是会话的五段式结构化总结。原始对话内容不被持久化。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;上下文窗口里的记忆是有界的&lt;/strong&gt;：默认最多 50 observations + 10 session summaries，不会随使用时间膨胀。注入的 token 量由配置控制，可以调整。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;private&amp;gt;&lt;/code&gt; 标签是边缘防线&lt;/strong&gt;：在数据产生的最源头就被切断，是隐私保护的正确姿势。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</description>
        </item></channel>
</rss>
