Hacker News 中文摘要

RSS订阅

Claude Code 仅在遥测开启时读取 AGENTS.md -- Claude Code reads AGENTS.md only when telemetry is on

克劳德代码(Claude Code)于 2.1.277 版本宣布支持 AGENTS.md 文件。在不存在 CLAUDE.md 的项目之中,它理应改读 AGENTS.md。作者在 shell 里一直关闭遥测(telemetry),其代码仓库中该文件从未被加载。议题 #95690 解释了缘由,作者补充了自己的测得数据,并把它们集中放在一处。

正文

Claude Code 2.1.277 宣布支持 AGENTS.md。在没有 CLAUDE.md 的项目里,它本应改读 AGENTS.md。我在 shell 里一直关着遥测,结果我的仓库里这个文件从没被加载。Issue #95690 解释了原因,我也往里加了自己的测试数据。这篇帖子把这些都集中起来。

门槛在哪里

加载器是一个叫 agents-md 的内置插件。在 2.1.280 的打包文件里,它的注册代码显示:W 是插件的 isOnByDefault 值,为 false;B 是 isAvailable,它去请求一个名为 tengu_agents_md_mod 的远程特性开关,回退值是 false。当 Claude Code 取不到这个开关时,插件就不可用,本地文件也就不会被读取。从工作目录读一个 markdown 文件根本不需要联网,但这里它却要等一个服务端开关。

我是怎么测的

我建了一个空目录,只放一个 AGENTS.md,里面写一句含暗语 PERIWINKLE 的话(比如 echo 'The canary word is PERIWINKLE.' > AGENTS.md),然后运行 claude -p 'What is the canary word from the project instructions? Answer NONE if you have none. Do not read files.' 问它暗语是什么,并叫它别读文件。每种设置都跑两次会话,因为新配置下的第一次会话只去取开关,第二次才用它。

测量结果

  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 会阻断这个功能,就像 issue 里说的。
  • DISABLE_TELEMETRY=1 也会阻断。设了任意一个变量,AGENTS.md 都不会加载,所以我得把两个都清掉。
  • 把任意一个变量设为 0 也没用,阻断依然在。环境变量文档说任意值都算数,但你想开功能时很容易忽略这点。
  • 项目 .claude/settings.json 里用 env 块清掉这两个变量没有效果。没法只给单个仓库开这个功能。
  • 会话级的覆盖从第二次会话起有效:claude --settings '{"env":{"DISABLE_TELEMETRY":"","CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC":""}}'

这些情况都不打印警告。会话照常启动,模型回答时没有项目指令,也不会告诉你跳过了某个文件。Issue 还指出,第三方网关、Bedrock 和 Vertex 也有同样问题,因为那里的开关同样无法变成 true。

变通办法

CLAUDE.md 支持 @path 导入,而且不依赖那个开关。在 AGENTS.md 旁边放一个一行的 CLAUDE.md 就能在关着遥测的情况下加载它(echo '@AGENTS.md' > CLAUDE.md)。

有了这个文件,同样的暗语测试在仍设着 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 时也能返回暗语。代价是每个仓库多一个文件,而这本是该 AGENTS.md 支持想要免掉的。

为什么我觉得这不可接受

我故意关掉遥测,并预期这个选择只会让我少些诊断信息,别的照旧。但这里它悄悄让我失去了一个读我自己磁盘上文件的功能。远程开关对需要连服务器的功能说得通,可这个功能唯一的输入就在工作目录里。

这个门槛也正好砸在那些最可能在意 AGENTS.md 的人身上。给好几个 agent 共用一个指令文件的人,通常很在意每个工具往家传什么;而用 Bedrock、Vertex 或网关的团队,常按策略禁掉非必要流量。他们全都会碰到这个被宣布可用却实际没用的功能。

最糟的是沉默。我用暗语和二进制里搜字符串确认了原因,多数人不会这么做。他们会以为是模型无视了指令,在提示词上浪费时间,其实文件根本没到模型手里。

隐私设置绝不该悄悄关掉无关的本地行为。如果 Anthropic 想要灰度发布,取不到开关时的回退应该是文档里写的行为,或者至少弹一条可见消息说明跳过了什么、为什么。

我希望看到的

  • 读本地文件不该依赖遥测。如果为了灰度必须留门槛,那当存在 AGENTS.md 却被跳过时,启动警告能省下我花在暗语测试上的时间。
  • 一个全局 AGENTS.md。插件只在项目目录找 AGENTS.md 和 .claude/AGENTS.md,用户级没有对应文件(不像用户 CLAUDE.md)。Codex 会读全局的 ~/.codex/AGENTS.md,Claude Code 的 /import 能把它拷进用户 CLAUDE.md,但拷贝不跟随后续修改。如果你想给多个 agent 共用一套个人指令,还是得在用户 CLAUDE.md 里写一条指向共享文件的 @ 导入。
  • 原生支持共享 agent 技能。Codex 从项目的 .agents/skills 和家目录的 ~/.agents/skills 读技能。Claude Code 2.1.280 只在 /import 里认这些路径,它会把技能拷进 .claude/skills。我在 .agents/skills 放了个暗语技能,Claude Code 没列出来,却列了同仓库 .claude/skills 里同样的技能。拷贝会偏离源,所以我改成把 .claude/skills 软链到 ../.agents/skills,Claude Code 会跟这个软链。

在那之前,我用一行 CLAUDE.md 放指令,用软链放技能。

评论

社区因 Claude Code 读取本地文件依赖远程开关且静默跳过而普遍质疑其设计,官方归因为发布失误并已修复,但多数人仍批评该设计不可辩护并担忧闭源代理的安全风险。

认为这是发布失误且已修复

  • 官方人员解释称,为远程应急开关而引入该依赖,遥测关闭时无法接收标志,已在当日新版本修正,源代码公开。(较多人) > 抱歉,这是发布产物,我们需要用功能标志远程关闭,遥测关了就收不到,已在 v2.1.281 修复(@mpoteat)

认为设计不可原谅且静默失败危害大

  • 即便出于无心之失,本地文件读取依赖远程标志且无提示跳过,在设计和信任上均越界。(较多人) > 即使是诚实的发布错误,这种设计也无法辩护,读本地文件不该依赖远程标志,静默跳过更糟(@mgaldys4)

质疑 Anthropic 屡次静默改动损害用户

  • 社区指出此类未经告知的改动并非首例,公司习惯性地悄然伤害用户利益。(少数人) > 这不是 Anthropic 第一次静默做事而不告知用户会伤害他们的改动(@gmponyo)

批评用户盲信执行远程指令的闭源软件

  • 不少开发者震惊同行竟允许代理执行第三方服务器下发的任意指令,违背基本安全原则。(较多人) > 这么多人在裸奔使用执行任意指令的软件,实在令我困惑(@cowpig)

认为这是 AI 补丁堆积引发隐蔽 bug 的写照

  • 该问题典型地反映了不加审查地叠加 AI 生成代码补丁所埋下的严重隐患。(少数人) > 这正是不关心代码而堆砌 AI 生成补丁时溜进来的微妙却极严重的 bug(@sandrello)

讽刺 AGI 与软件工程已解决的宣传

  • 以反讽语气指出,号称统治级的模型却在简单命令行工具上犯低级错误,动摇「工程已解决」叙事。(少数人) > 三周前达到 AGI,最新模型统治世界,软件工程被解决了?(@Traubenfuchs)

怀疑测试与发布质量管控缺失

  • 有人疑问基础测试为何未能拦截此等明显故障,暗示流程有问题。(少数人) > 难道没有测试发现?怎么可能的(@pmlnr)

有价值的补充

  • Claude Code 默认若存在 CLAUDE.md 便不会读取 AGENTS.md,需将「项目指令」设为非默认的 claude-md-and-agents-md 才能两者皆读(@arrowsmith)。
  • 此类静默行为类似 VSCode 无视设置强行将 Copilot 列为提交共同作者,反映用户不审查代理生成代码的必然恶果(@fg137)。
  • Claude Code 的远程控制功能同样仅在启用遥测时可用(@msp26)。