Memory有记忆的同事
Day 03 你认识了 Memory——今天把它推到生产级。
user / feedback / project / reference 四种类型各管一摊;MEMORY.md 是索引、单个文件是事实、
[[name]] 是链接。读写时机有讲究,过期清理有节奏。
Hook、Skill、Plan、Task 各有职责——Memory 只记录非显然、
会长期有用的事。
思维导图
FIG M — DAY 12 KNOWLEDGE MAP · MEMORY PRODUCTION GUIDE
四种记忆类型
四种类型不是"标签"——它们对应四种本质不同的信息。 记错类型不只是分类乱,会导致 Claude 在错的时机用错的方式调用记忆。 下面是每种类型的定义、写法标准、典型示例和反例。
用户身份与背景
关于你是谁、做什么、知道什么的事实。让 Claude 把回答的深度、术语和类比调到适合你的层级。
用户对 Claude 行为的纠正或认可
"不要 X / 要 Y" 与 "那次 X 是对的" 都算。纠正与确认都要存——只存纠正会让 Claude 越来越保守。
进行中的工作、决策与背景
从 git / 代码读不出来的状态信息——发布日期、停滞原因、stakeholder 决策。容易过期,要勤更新。日期一律存绝对值("周四" → 2026-05-21)。
外部系统的指针
"X 信息在哪儿找"。Linear 项目、Grafana dashboard、Notion 页面、Slack 频道。本身不存信息——只存位置。
写法铁律:feedback 与 project 必须带 Why + How
feedback 与 project 是最容易腐烂的两类——
没有上下文的规则未来无法判断是否还成立。统一写成三段式:
## 主体规则或事实 集成测试必须连真实数据库,不用 mock **Why**: 2026-Q1 mock 测试通过但 prod 迁移挂了, 造成 4 小时 outage(INC-2398) **How to apply**: 看到 test 文件含 vi.mock('../db') 立刻警示; 集成测试用 testcontainers 起真实 pg
存储结构
Memory 存在 ~/.claude/projects/<project>/memory/——
不在项目目录、不进 git。
结构是索引 + 事实文件 + 链接三层。
典型目录结构
# ~/.claude/projects/-Users-minimax-myproject/memory/ memory/ ├── MEMORY.md # 索引(总览,加载到 context) ├── user_role.md # type=user ├── user_preferences.md # type=user ├── feedback_testing.md # type=feedback ├── feedback_pr_size.md # type=feedback ├── project_q2_freeze.md # type=project ├── project_auth_rewrite.md # type=project ├── reference_oncall.md # type=reference └── reference_linear.md # type=reference
单个 memory 文件结构
# feedback_testing.md --- name: feedback-testing description: 集成测试必须连真实数据库,不允许 mock —— 决策点关键 metadata: type: feedback --- 集成测试必须连真实数据库,不用 mock。 **Why**: 2026-Q1 mock 测试通过但 prod 迁移挂了,造成 4 小时 outage(INC-2398)。 Mock 与真实 schema 漂移过大,无法及时发现。 **How to apply**: 看到 vi.mock('../db') / jest.mock('@/db') 立刻警示;集成测试统一用 testcontainers 起真实 pg。 相关:[[project-migration-strategy]]、[[reference-incident-db]]
MEMORY.md 索引规则
# MEMORY.md 是索引,不是内容容器 # 永远只放一行一条 — 单行 <150 字符 # 不带 frontmatter ## User - [Role](user_role.md) — Go 10y / 新手 React / 偏好后端类比 - [Preferences](user_preferences.md) — 终端用 ghostty / 编辑器用 vscode ## Feedback - [Testing](feedback_testing.md) — 集成测试不用 mock(INC-2398) - [PR Size](feedback_pr_size.md) — 重构 PR 偏好单个 bundled 而非多个小 PR ## Project - [Q2 Freeze](project_q2_freeze.md) — 2026-03-05 起 mobile release 冻结 - [Auth Rewrite](project_auth_rewrite.md) — 合规驱动 / 不是技术债 ## Reference - [Oncall](reference_oncall.md) — grafana.internal/d/api-latency - [Linear](reference_linear.md) — pipeline bug 在 INGEST 项目
[[name]] 链接机制
FIG 02 · [[NAME]] LINKS — 实链 + TODO 占位链 串成知识网
链接用 slug,不用路径
[[feedback-testing]] 而不是 [[feedback_testing.md]]。slug 来自 frontmatter 的 name: 字段。
TODO 链接允许
链到一个还没写的 memory 是合法的——它标记了"未来值得记录的话题"。比格式错误更有价值。
按主题组织,不按时间
不要 2026-05-19-notes.md 这类时间命名——按主题语义命名(testing、deployment)才便于检索。
frontmatter 与内容同步
修改了 memory 主体时,记得更新 description——它决定未来 Claude 怎么判断这条记忆是否相关。
读写时机与生命周期
记忆系统的难度不在怎么写——而在何时写、何时读、何时不用。 下面是一套实战可用的判断标准。
何时该自动写入
✓ 用户主动告知身份/偏好
"我是 Go 工程师"、"我喜欢简洁回答"——这是 user 类型的金矿。
✓ 用户纠正了 Claude
"不要那么做"、"用 X 不要 Y"——立即记成 feedback,附 Why。
✓ 用户认可了非显然的选择
"对,这样写是对的"——这是 confirmation,和纠正一样重要。
✓ 学到外部资源位置
"看 Linear 的 INGEST"、"Grafana board 在 X"——存 reference。
何时不该写入
✗ 代码模式、架构、文件路径
这些读代码更准——存了 memory 反而会因代码改了而过期。
✗ git 历史可查的信息
谁改了什么、什么时候——git log 永远是真理源。
✗ 当前对话的临时上下文
"我正在调试 X"是当下状态,不是长期记忆——用 Plan/Task 即可。
✗ CLAUDE.md 里已经有的内容
项目规范已在 CLAUDE.md——再存 memory 是冗余,反而难维护。
读取与陈旧检测
FIG 03 · READ FLOW — RETRIEVE · VERIFY · APPLY · UPDATE
陈旧处理三档
仍然有效
memory 描述的事实在代码 / 仓库 / 外部系统中仍能验证——直接用。
部分过期
主要规则仍成立,但细节漂移了——用 Edit 修正后继续用,保留 Why。
完全失效
事实已不存在(项目结束、人员调动、文件删除)——直接删除文件并清理 MEMORY.md 引用。
"忽略 memory" 指令处理
# 用户说: "这次先不用 memory" / "暂时忽略你记住的内容" 行为约定: - ✗ 不要应用任何 memory 中的事实 - ✗ 不要在回答中引用或对比 memory - ✓ 当前对话视为"零记忆"状态 - ✓ 仍可以读 memory 文件作为研究,但不作为约束 为什么需要: - 用户在做 prototype / spike,不希望被既有约束限制 - 调试时怀疑 memory 是错误信息源 - 想体验"清洁状态"下 Claude 的表现
与其他系统的边界
Memory 不孤立——它和 CLAUDE.md、Skills、Plan、Task 都涉及"持久化"。 划清边界是 Memory 用对的前提:选错系统比不存还糟。
五个持久化系统的对比
| 系统 | 保存什么 | 生命期 | 共享范围 |
|---|---|---|---|
| CLAUDE.md | 团队级项目规范、技术约定 | 项目存活期 | 团队(git 提交) |
| Memory | 个人偏好、对 Claude 的反馈、项目背景 | 跨会话长期 | 仅自己(不进 git) |
| Skills | 可复用的命令 / 工作流 | 长期 | 个人或团队(按位置) |
| Plan | 当前任务的实施方案 | 单次任务 | 会话内 |
| Task / TodoWrite | 当前会话内的步骤拆解 | 会话内 | 会话内 |
决策树:信息该存哪儿?
FIG 04 · DECISION TREE — WHERE DOES THIS BELONG?
边界判断三句话
团队规范 → CLAUDE.md
所有人都该遵守的约定。Git 共享、Code Review 把关。
个人偏好 / 反馈 → Memory
只关于你与 Claude 的协作方式。不影响别人。
可执行流程 → Skill
哪怕只你一个人用——封装成 /命令 比每次写指令省事。
操作与维护
Memory 不维护就会腐烂——MEMORY.md 越长、重复越多、过期条目越多, 读它的 Claude 行为就越混乱。 下面是维护 Memory 的日常操作与定期保养。
核心命令
| 命令 | 作用 | 使用频率 |
|---|---|---|
| /memory | 查看 MEMORY.md 索引 + 所有 memory 文件清单 | 每次开始新任务前 |
| /memory edit <name> | 用编辑器打开指定 memory 文件 | 需要修正陈旧条目时 |
| /memory rm <name> | 删除指定 memory 文件 + 清理 MEMORY.md 引用 | 项目结束 / 决策推翻时 |
| 记住:... | 自然语言要求 Claude 保存某事 | 对话中随时 |
| 忘掉关于 X 的内容 | 自然语言要求 Claude 删除相关条目 | 对话中随时 |
| 这次先忽略 memory | 本轮对话不应用任何已存记忆 | spike / prototype 模式 |
定期保养清单
查看 MEMORY.md 行数
用 wc -l MEMORY.md——超过 100 行就要考虑合并 / 删除冗余条目。索引太长 Claude 会读不全。
清理 project 类
project 类型最容易腐烂——deadline 过了、决策推翻了、人员变了。每周 grep type: project 走一遍。
验证 reference 链接
外部 URL 会失效、Linear 项目会改名——每月点一遍 reference 类的链接,挂掉的就修。
对照 CLAUDE.md 去重
季度回顾:把已经写进 CLAUDE.md 的规范从 Memory 里删掉。规则的家应该是 CLAUDE.md,memory 只补充未规范化的偏好。
反模式预警
把 memory 当日记
"今天做了 X / Y / Z"——memory 不是 changelog,这种内容只会越积越多。日志该写 git commit。
同一信息存多份
memory 里有"用 Vitest"、CLAUDE.md 里也有"用 Vitest"——双份维护负担。规则只该有一个家。
memory 当作 prompt 模板
把可复用流程写进 memory——它会在每次对话被读取,占 context。这种用法应该是 Skill。
纠正不写 Why
只存"不要 X"——未来 Claude 看到边缘场景不知道能不能破例。永远附 Why + How to apply。
Labs
四个递进的动手实验——从写一条标准 memory 到完成季度保养。 预计 40 分钟,全部在你日常使用的项目里完成。
写一条标准 feedback memory
选一个你最近纠正过 Claude 的场景——告诉 Claude "记住" 并写成标准三段式(主规则 + Why + How to apply)。用 /memory 检查文件内容,确认 frontmatter 与 MEMORY.md 索引都正确。
构建 user 与 reference 各一条
明确告诉 Claude 你的角色(user)和一个外部信息位置(reference,如 Linear/Notion/Grafana 链接)。再让 Claude 在下一次回答时主动用到这两条 memory——观察 description 写法对触发概率的影响。
陈旧检测与重写
故意在 memory 里写一条"已过期"信息(比如"v2.0 计划 2025-12-31 发布"——日期已过)。开新会话让 Claude 引用这条 memory,观察它如何验证陈旧 + 自动修正 / 删除。
季度保养实战
对当前项目的 memory 做一次完整保养:(1) wc -l MEMORY.md 看长度;(2) 找出 3 条最老的 memory 验证陈旧性;(3) 把 1-2 条规则从 memory 迁到 CLAUDE.md;(4) 删掉所有空 TODO 链接。
常见问题
Q · 01 Memory 和 CLAUDE.md 的边界到底怎么划? +
一句话区分:团队都该遵守的规范进 CLAUDE.md;只跟你这一个人/这个项目阶段相关的进 Memory。
典型案例:项目"所有 API 用 zod 校验"——团队公约,进 CLAUDE.md。"你不喜欢 Claude 主动加 try/catch"——个人偏好,进 Memory。"2026-Q2 mobile release 冻结期"——项目阶段性事实,进 Memory 的 project 类。
判断不出来时,问一句"团队新人 clone 仓库后是否需要立刻知道这件事"——需要就 CLAUDE.md,不需要就 Memory。
Q · 02 为什么 Memory 不进 git?团队不该共享纠正反馈吗? +
Memory 是"我和 Claude"的私人笔记——里面有大量"我习惯这样"、"我不喜欢那样"的个人偏好。强行共享会出现两个问题:(1) 不同人的偏好打架,Claude 不知道听谁的;(2) 这些偏好对别人没用、还占别人的 context。
团队级共享的规范有更合适的家:CLAUDE.md 共享规则;Skills 共享流程;Hooks 共享强制策略。Memory 留给真正属于个人的部分。
Q · 03 MEMORY.md 越长 Claude 加载越慢吗? +
不是慢的问题——是读不全。MEMORY.md 在每次会话启动时被加载进 system context,超过约 200 行后后面的会被截断。截断的部分等于 Claude 永远不知道它存在。
所以铁律是:每条索引单行 <150 字符,内容放在被链接的文件里、用 description 字段提示要不要打开。索引就是索引,不要把内容塞进去。
Q · 04 Claude 自动写的 memory 经常不准——怎么办? +
三个层面解决:(1) 在 CLAUDE.md 里加一条 meta 规则——"写 memory 必须用三段式(规则+Why+How)",触发严格写法;(2) 每次说"记住"时明确指定类型——"记成 feedback,Why 是 X";(3) 定期做 Lab 04 的季度保养,把 Claude 写错的及时修正。
另一个杀手锏:用具体场景纠正反而比抽象指令有效。比如发现 Claude 把"今天修了 login bug"存成 memory——立刻指出"这种属于 git 历史,不该进 memory",一次纠正能管很久。
Q · 05 不同项目能共享 user 类 memory 吗? +
Memory 默认按项目隔离——一个项目 dir 对应一个 memory 目录。但 user 类(你的角色、终极偏好)确实跨项目通用。
两种处理方式:(1) 放到 ~/.claude/CLAUDE.md 全局指令文件——这是 Claude Code 唯一支持"跨项目偏好"的官方位置;(2) 软链 user_*.md——在多个项目 memory 目录里 ln -s ~/.claude/global/user_role.md user_role.md。方式 1 简单可靠,方式 2 灵活但易碎。优先用方式 1。
Q · 06 Memory 会让 Claude 产生"AI 偏见"吗? +
会——特别是只存纠正、不存确认时。Claude 看到一堆"不要 X / 不要 Y / 不要 Z"会变得越来越保守,什么都不敢做。
解决方案:纠正与确认成对存——每次发现 Claude 做对了"非显然的选择"(一次性 bundled PR 而不是拆 5 个、一次性大重构而不是小修小补),也明确告诉它"对,这种场景就该这么做",存成 feedback。这条 memory 会成为未来 Claude 的"defensible action"——它有底气重复正确选择,而不是事事请示。
复习题
- 请说出 user / feedback / project / reference 四种类型各自保存什么——并各举一个 good 与 bad 示例。
feedback与project类必须包含 Why 和 How to apply——为什么不能只写主规则?- MEMORY.md 是什么?为什么不能把 memory 内容直接写进 MEMORY.md?
- 给定一条信息,如何判断它该进 CLAUDE.md / Memory / Skill / Plan / Task 中的哪个?请描述判断流程。
- Memory 的"陈旧检测"分三档——FRESH / PARTIAL / DEAD,请说出各自的处理动作。
自检清单
- 能说出 user / feedback / project / reference 四种类型的定义与典型示例
- 写 feedback / project 类时能自然带上 Why 与 How to apply 两段
- 理解 MEMORY.md 作为索引、单文件作为事实、
[[name]]作为链接的三层结构 - 能列出"何时该写 / 何时不该写"各 4 条标准
- 掌握读取 → 验证 → 应用 → 更新四步生命周期,知道如何处理陈旧记忆
- 能用决策树正确把信息分配到 CLAUDE.md / Memory / Skill / Plan / Task
- 会用
/memory//memory edit//memory rm维护记忆 - 建立了"weekly / monthly / quarterly"三档保养节奏
延伸阅读
Claude Code — Memory Reference
官方 Memory 完整文档:四种类型定义、frontmatter 字段、MEMORY.md 索引规则、读写时机最佳实践。
CLAUDE.md 写作指南
Day 03 对应的延伸阅读:CLAUDE.md 三层叠加、与 Memory 的边界、init 命令生成模板。
Long-term context patterns
社区总结的长期记忆模式集合:feedback 三段式、project 时序管理、reference URL 失效检测。
Day 13 预告
MCP 服务器 — 让 Claude 操作外部世界
今天让 Claude 记住你——明天教它动手。
MCP(Model Context Protocol)打通 Claude 与外部系统:直接查 Postgres、读 GitHub PR、发 Slack 消息、看 Grafana 监控。
.claude/.mcp.json 一句配置,所有公司内的工具都成为 Claude 的"延伸"。