- tags
- [Claude Code, 知识管理, 记忆, Agent, 工程]
- created
- 2026-04-17
- updated
- 2026-04-17
- sources
- [raw/notes/claude-code-memory-system-s09-2026.md, raw/notes/claude-code-memory-session-evidence-2026.md]
定义¶
Claude Code 跨会话记忆系统的存储边界设计。核心原则:只有跨会话仍成立、且当前代码里推不出来的信息,才值得进入 memory。 与 auto-dream(定期整合清理)互补——Auto Memory 管"该不该存",Auto Dream 管"存了之后如何不腐烂"。
核心论点¶
memory 不是"更长一点的上下文窗口",更不是"什么都记下来"。如果什么都存,会出现两个问题:
- memory 变成垃圾堆,越存越乱
- agent 开始依赖过时记忆,而不是读取当前真实状态
反向定义比正向定义更重要:先立"什么不该存"的边界,memory 才能从"帮助系统长期变聪明"避免变成"帮助系统长期产生幻觉"。
四类记忆类型¶
| 类型 | 内容 | 典型例子 |
|---|---|---|
| user | 用户长期偏好 | 喜欢什么代码风格、回答详略、工具链偏好 |
| feedback | 用户明确纠正或验证过的判断 | "不要这样改"、"这个判断之前错过"、被认可的非显然做法 |
| project | 不易从代码推出的项目约定/背景 | 设计决定来自合规要求、某目录暂时不能动的真实原因 |
| reference | 外部资源指针 | 问题单看板、监控面板 URL、资料库位置 |
不该存进 memory 的东西¶
| 不要存 | 原因 | 应去哪里 |
|---|---|---|
| 文件结构、函数签名、目录布局 | 重新读代码即可 | 代码本身 |
| 当前任务进度 | 时效极短 | task / plan |
| 临时分支名、当前 PR 号 | 很快过时 | git / 项目管理工具 |
| 修 bug 的具体代码细节 | 代码和提交记录是权威 | git log / blame |
| 密钥、密码、凭证 | 安全风险 | 密码管理器 / 环境变量 |
关键判断:即使用户主动说"帮我记住 PR 列表/当前分支",也不应直接存——应追问"这里面真正值得长期留下的、非显然的信息是什么"。
数据结构¶
单条 memory 文件¶
每条 memory 一个独立 markdown 文件,frontmatter + 正文:
---
name: prefer_tabs
description: User prefers tabs for indentation
type: user
---
The user explicitly prefers tabs over spaces when editing source files.
索引 MEMORY.md¶
# Memory Index
- prefer_tabs: User prefers tabs for indentation [user]
- avoid_mock_heavy_tests: User dislikes mock-heavy tests [feedback]
索引只记"有哪些 memory 可用",不重复正文内容。这与 llm-wiki-pattern 的"索引页 + 详情页"结构同源。
memory / task / plan / CLAUDE.md 的边界¶
四种持久化机制各司其职:
| 机制 | 时效 | 内容 |
|---|---|---|
| task | 当前会话 | 工作分解、依赖、进度 |
| plan | 当前会话 | 这一轮怎么做的过程性安排 |
| memory | 跨会话 | 长期偏好、纠错、不易推出的项目背景 |
| CLAUDE.md | 长期项目级 | 稳定的系统/项目级规则 |
简单判断法: - 只对这次任务有用 → task / plan - 以后很多会话可能都还会用 → memory - 长期系统级或项目级固定说明 → CLAUDE.md
高完成度版的 6 条边界¶
教学最小版讲清"该存什么/不该存什么"即可。但落到真实工作平台,还需要 6 条边界:
1. 作用域分层:private vs team¶
- user 几乎总是 private
- feedback 默认 private,明确是团队规则才升 team
- project 和 reference 通常更偏 team
价值:不把个人偏好误写成团队规范,不把团队规范锁在某个人的私有记忆里。
2. 同时保存正反馈,不只存纠错¶
feedback 不只来自负反馈,也来自被验证的正反馈("这种不明显的做法用户已经认可")。只存纠错的系统会越来越保守,却不一定越来越聪明。
3. 用户要求存的,也未必该存¶
PR 列表、分支名、今天改的文件、当前子任务——即使用户说"帮我记住",也应追问真正长期有价值的非显然信息是什么。
4. memory 会漂移,回答前先核对当前状态¶
memory 记的是"曾经成立过的事实",不是永久真理。用 memory 当方向提示,不当替代当前观察。 冲突时优先相信你刚观察到的真实状态。
5. 用户说"忽略 memory"时按空处理¶
不是"嘴上忽略心里继续用",而是这一轮真的按 memory 为空来工作。
6. 推荐具体路径/函数/外部资源前要再验证¶
memory 适合记"哪个目录是入口"这类方向;但在真的说"去改 src/auth.py"之前,要核对一次。命名、路径、系统入口、外部链接都会变。
原则:memory 先告诉我去哪里验证;验证完,再给用户结论。
与相关概念的关系¶
- 与 auto-dream:互补关系。Auto Memory 是"写入边界"(什么该存),Auto Dream 是"长期维护"(存了之后如何整合、去重、修剪)。两者共同构成 Claude Code 的四层记忆体系
- 与 sentino-memex:对照样本。Auto Memory 是 LLM-in-the-loop(让 LLM 决定记什么,少而精,控流入);Memex 是 LLM-as-extractor(流水线提取一切靠衰减保鲜,多而衰减,控保鲜)。两套设计哲学正好分别覆盖单用户低频场景 vs 多用户高频 SaaS 场景
- 与 harness-engineering:memory 是 Harness Environment 层的核心组件之一。"记忆选 Markdown 而非向量数据库"的设计选择,正是因为 markdown 透明可编辑、原生 Git、与文件系统总线天然集成
- 与 agent-runtime-architecture:在七层模型 Layer 3 Query Loop 中,memory 通过
prefetchMemoryAndSkills()在流式执行空隙被预取,是"预取优化"四类 runtime 机制之一 - 与 llm-wiki-pattern:边界判断逻辑同构——LLM Wiki 区分 raw(原始素材,不可变)vs wiki(编译后的知识层);memory 区分"当前可推导(不存)"vs"跨会话仍成立(存)"
- 与 知识复利:知识要复利,前提是写入边界严格。否则错误也会被复利
运行时实证(来自真实 session.json)¶
教学版描述的边界在 Claude Code runtime 里有具体落地:
存储路径¶
~/.claude/projects/<encoded-cwd>/memory/(cwd 路径用 - 替换 /)。项目级隔离:切换 cwd 就切换记忆库,同一台机器上不同项目互不污染。
实际 frontmatter 比教学版多一个字段¶
---
name: Sentino 创业公司
description: ...
type: user
originSessionId: 8cf290da-6662-4a95-9023-21b44c501f3b
---
originSessionId 让每条 memory 可追溯创建来源——这是 auto-dream 整合时去重/合并的潜在依据。
第 4 条边界"memory 会漂移"是 runtime 强制提醒¶
读取 3 天前的 memory 时,tool_result 自动注入:
<system-reminder>
This memory is 3 days old. Memories are point-in-time observations,
not live state — claims about code behavior or file:line citations
may be outdated. Verify against current code before asserting as fact.
</system-reminder>
不是建议,是有运行时机制注入的强制提醒。这一条边界在产品里被钉得最死。
写入新 memory 前的工作流¶
- Read 相关已有 memory(先判断有没有可更新的)
- 不存在 → Write 新文件(frontmatter + Why + How to apply)
- Read MEMORY.md
- Edit MEMORY.md 在合适位置插入索引(不是 append 末尾)
实证了"不写重复 memory,先检查能否更新已有"原则的实际执行路径。
memory 文件走普通文件系统机制¶
每次 Write/Edit memory,都被 file-history-snapshot 跟踪,与源代码文件共享同一套版本/回滚。这印证 harness-engineering "记忆选 Markdown 而非向量数据库"的架构理由——透明可编辑、原生 Git、与文件系统总线天然集成。
当前未实现/未观察到¶
- s09 提到的"作用域分层(private/team)"在当前 Claude Code 里未见实现——所有记忆都是 cwd 级 private
- reference 类型本次 session 未触发,但其他三类(user/feedback/project)都在实战中出现
一句话记住¶
memory 保存的是"以后还可能有价值、但当前代码里不容易直接重新看出来"的信息。
相关概念¶
- auto-dream — Auto Dream:定期整合修剪机制,与 Auto Memory 互补
- sentino-memex — 对照样本:流水线提取式记忆,控保鲜而非控流入
- google-memory-bank — 反方向托管对照:单姿态 LLM-in-the-loop(Auto Memory)vs 两种姿态并列(Memory Bank GenerateMemories + CreateMemory),Memory Bank 的 CreateMemory 接近 Auto Memory 路线
- harness-engineering — Memory 是 Harness Environment 层的核心组件
- agent-runtime-architecture — Memory 通过 prefetchMemoryAndSkills 进入 Query Loop
- llm-wiki-pattern — 同构的"该存什么/如何不腐烂"问题域
- 知识复利 — 写入边界是知识复利的前提
- 人机协作 — memory 是 Claude 维护、人类审核的协作产物