所属专题簇:记忆与上下文算法深挖
建议前读:07. QueryEngine 与上下文
readFileState、context memoize cache 和 partial view 到底只是性能优化,还是 Claude Code 长会话治理的一部分?
它们不只是优化。Claude Code 用 readFileState 跟踪“模型到底看过哪个文件视图”,用 context cache 固定跨轮注入内容,再通过 cache invalidation 和 partial view 标记维持上下文一致性与安全边界。
这一章解释文件读取状态、上下文缓存与 partial view 如何共同构成 Claude Code 的会话记忆卫生机制。
readFileState记录的不是“磁盘上有什么”,而是“模型看过什么视图”。- partial view 表示模型看过的是处理后的文件视图,不等于磁盘原文。
- context cache 的清理是显式的,尤其在 cache breaking injection 场景下。
- 文件状态缓存:src/utils/fileStateCache.ts
- 上下文缓存:src/context.ts
- QueryEngine 文件状态持有:src/QueryEngine.ts
- partial view 相关逻辑:src/utils/claudemd.ts
flowchart TD
A["磁盘文件"] --> B["Read / auto-injection"]
B --> C["readFileState"]
C --> D["content + timestamp + offset/limit + isPartialView"]
D --> E["QueryEngine 跨轮共享"]
E --> F["去重 / 变更检测 / memory path 汇总"]
G["getSystemContext / getUserContext memoize"] --> H["会话级固定上下文"]
I["systemPromptInjection 变化"] --> J["clear caches"]
J --> G
src/utils/fileStateCache.ts 里 FileState 至少包含:
contenttimestampoffsetlimitisPartialView
特别是 isPartialView 的注释很关键:如果 auto-injection 只让模型看到 stripped / truncated 版本,那么 Edit/Write 仍然要求显式 Read。也就是说,这不是纯性能缓存,而是模型视图的记录。
同一注释明确举了 partial view 的来源:
- stripped HTML comments
- stripped frontmatter
- truncated
MEMORY.md
这说明 Claude Code 明确知道“模型看到的并不是磁盘全文”,因此后续编辑权限不能假装它已经完整读过该文件。
readFileState是成员变量- 通过
readFileCache注入 - 跨
submitMessage()持续存在
这表明 Claude Code 不是每轮都忘记“模型之前读过什么文件”,而是在维护一份跨轮文件认知状态。
src/context.ts 里 getSystemContext 和 getUserContext 都是 memoize 的,注释还明确说:
- context is prepended to each conversation
- cached for the duration of the conversation
所以这里缓存的不是某个函数结果,而是“这次会话的固定上下文切片”。
同一文件中的 setSystemPromptInjection() 会:
- 更新
systemPromptInjection - 立即清空
getUserContext.cache - 立即清空
getSystemContext.cache
这说明 Anthropic 已经意识到 context cache 不是“永远安全可复用”,而是在某些 debug / cache-break 路径下必须强制失效。
getMemoryFilesFromReadFileState() 之类逻辑说明:
- 自动注入或读过的 memory 文件,会被纳入 path 汇总
- readFileState 不只服务 Read tool,也服务 memory 装配与 dedup
这让它更像“会话文件知识库”,而不是工具内部缓存。
很多上下文系统的问题,不在“怎么读文件”,而在:
- 模型到底看过什么
- 它看的是原文还是变形视图
- 下一轮还能不能假设之前读过的视图仍然有效
Claude Code 在这层给出了明确回答,这也是它比普通 CLI agent 更工程化的地方。
readFileState是模型视图状态,不只是 I/O cache。- partial view 是 Claude Code 在自动注入和安全边界之间做的显式标记。
- context cache 与 cache invalidation 共同构成会话级上下文卫生机制。