配了三个月 Claude Code,今天才发现它的 Write 工具悄悄变安全规则了——旧版模型还在,新版已经直接写了
写过三个月 Claude Code,今天才发现它的 Write 工具在 v2.1.228 变了一个你可能没注意的规则:较新的模型现在可以覆盖你没有在这个会话里读过的文件,而旧版模型依然要求先读再写。
这件事值得你停下来检查一下你现在跑的是哪个模型。
Write 工具之前为什么要先读
原来的逻辑很简单:Claude 要写一个文件,它得先读一下。读过了,写的时候才知道自己在改什么。这是一个朴素的安全检查——确认 Claude 真的「看到」了这个文件,才允许它覆盖。
没有先读,Write 工具会报错,不让你动那个文件。
这个规则从 Claude Code 上线第一天就有了。你可能已经习惯了:每次让它写配置,它先读一遍,再问你确认。读-改-确认,这套流程三年了,没人觉得有问题。
v2.1.228 把这件事悄悄变了
2026 年 8 月 11 日发布的 v2.1.228,Write 工具的行为改了:较新的模型现在可以直接覆盖一个没有在这个会话里读过的文件,和 Edit 工具的行为一致了。
旧版模型(Claude Opus 4.6、Claude Haiku 4.5 和更老的版本)依然要求先读再写,这个保护还在。
变的是新版模型。Read-before-write 这个限制,对新版模型放开了。
这不是 bug,这是刻意设计的
Anthropic 把这个变化包进了一个带日期的工具集 bundle:betaAgentToolset20260401。这个 bundle 里有自己的 Bash、Read、Write、Edit、Glob、Grep 工具,Anthropic 按模型版本决定启用哪个版本的工具规则。
也就是说,同一个 Claude Code 版本,在你切换不同模型的时候,可能跑的是两套不同的 Write 工具规则。
这件事值得你停下来检查一下你现在跑的是哪个模型。
你可能已经在用新版规则了
如果你现在用的是 Opus 5、Sonnet 5 或者更新的模型,Write 工具的行为已经变了:它不需要先读,就能直接覆盖一个文件。
这意味着什么?
意味着你原来靠「Write 会先读」这条规则建立的安全假设,现在对新版模型已经不成立了。
比如你有一个工作流是这样的:让 Claude 写配置文件,你期望它先读一遍现有的配置,确认自己在改什么,再写入。如果它没读过,写入就失败。
对旧版模型,这个保护还在。对新版模型,这个保护已经没了。
你的 pipeline 是不是在用新版模型?
现在的问题不是「应不应该变」,而是「你的 pipeline 知不知道变了」。
如果你在用 MCP 协议或者自定义的 Agent 编排层,里面可能有这个假设:「写之前必须有读」。现在这个假设对新版模型已经失效了。
你需要检查两件事
第一,你现在跑的是什么模型。运行 /model 可以看到当前会话用的模型版本。如果你在用 Opus 5 / Sonnet 5 或者更新的模型,Write 工具的行为已经是新版规则了。
第二,你的自动化流程里有没有依赖「Write 不会覆盖未读文件」这条规则。如果有,你需要在上游加显式的检查——Read 操作或者 PreToolUse hook——来代替原来那个隐含的护栏。
Anthropic 在官方文档里也说了:显式的门控——在你的编排层里做写前读取断言,或者通过操作员定义的工具限制——依然是正确的做法。原来的 read-first 要求本来就不是安全门,它只是一个隐含的行为。现在这个行为变了,显式的门控就更必要了。
值得注意的还有 Skill 的安全加固
同一天发布的另一个变化也值得关注:Skills 从 claude.ai 同步过来之后,现在被限制在更小的作用域里。它们不能替换本地命令,不能运行 ! 命令,不能展开 @ 文件引用。
这意味着如果你有自动化依赖 Skill 内容里的 ! 命令执行,这个路径已经被堵上了。如果你有旧的 Skill 依赖这个行为,需要改掉。
下一步是什么
打开 Claude Code,运行 /model,确认你现在跑的是什么版本。如果你在用新版模型,review 一下你的自动化 pipeline——特别是那些依赖 Write 工具 read-first 规则的脚本和 hook。
这个变化不大,但它改了一个你可能已经当成安全默认值在用的隐含行为。知道它变了,比不知道要好。
评论区
登录后可评论。