
1. 为什么 CLAUDE.md 写满规则Agent 还是当没看见你大概率遇到过这个场景项目根目录的 CLAUDE.md 从编码规范写到提交格式.claude/rules/按目录拆了七八条MCP 挂了三个skill 配了两个。结果 Agent 该用any还是用any该写测试还是不写提交信息照样一句 fix bug。先给结论写了规矩 ≠ 听了规矩。从「你写文件」到「Agent 照做」中间隔着四道关——关联、加载、读到、遵守。任意一环断掉表现都是「规矩没生效」但排查方式完全不同。这篇就按这四层拆每层给你可复制的模板和验证动作最后用 TaoToken 统一通道做对照复现确认到底是哪一层掉了链子。先说清楚这套东西是什么、适合谁。CLAUDE.md 是 Claude Code 的项目级上下文文件AGENTS.md 是 Codex 侧的对应物两者本质都是「塞进上下文窗口的建议书」不是强制配置。.claude/rules/是按文件路径触发的细分规则skill 是懒加载的能力包MCP 是外部工具接入。适合谁适合已经在用 Claude Code / Codex 做真实项目、被「规则不生效」折磨过的开发者。如果你还没写过 CLAUDE.md这篇也能当分层模板直接抄。四层卡点用一句话概括文件放对位置叫关联这次会话真拼进窗口叫加载模型当前这步真纳入判断叫读到照着做了叫遵守。前三层是软约束第四层想拿到确定性得靠权限和 hook 这种硬拦截。下面逐层拆。2. TaoToken 前置把 endpoint 统一到一条通道做对照复现排查「规则不生效」最怕变量太多模型换了、通道换了、Key 换了你根本不知道是规则的问题还是环境的问题。所以第二步先把接入通道固定下来用 TaoToken 统一 Key 和 API 通道让后面每一层的验证都可复现。TaoToken 在这里的角色很简单它是一个统一的模型 API 接入层把不同模型的调用收敛到一套 Base URL Key 上。你可以在官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 了解整体能力API 入口是 https://taotoken.net/api这个不加 UTM。对排查场景来说它的价值是「对照复现」——同一份 CLAUDE.md同一套规则只换通道就能判断问题出在规则层还是环境层。具体要拿三样东西Base URL、API Key、Model ID。Key 在控制台生成地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。模型对话调试入口 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。注意这里只做通道统一不涉及任何网络层操作。所有配置都是标准的 Base URL Key Model ID 三件套和你在任何 API 平台做的事一样。为什么排查前要先固定通道因为「规则不生效」有一类假象是环境导致的Key 失效、endpoint 写错、模型 ID 拼错Agent 报的错看起来像「没读规则」实际是请求根本没成功。先把通道跑通后面四层排查才有干净的基线。如果你要做长期编码或 Agent 任务可以顺带看下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。3. 可复制配置CLAUDE.md 分层模板 settings.json 片段这一节给可直接抄的东西。先讲分层思路再给完整片段。分层原则把「永远要遵守的」和「按路径触发的」分开。根目录 CLAUDE.md 只放全局铁律控制在 200 行以内避免被截断细分规则丢进.claude/rules/按路径触发skill 的 description 当成简历写把「什么时候用」写死。先看根目录 CLAUDE.md 模板# 项目约定 ## 技术栈 - 语言TypeScript 5.x禁止 any - 框架React 18 Vite - 测试Vitest新函数必须带单测 ## 提交规范 - 格式type(scope): subject - type 仅限 feat/fix/refactor/test/docs ## 禁止事项 - 不修改 package.json 的依赖版本 - 不删除已有测试用例 - 不在 src/legacy 下新增文件再看.claude/rules/的路径规则比如src/api/目录专属--- paths: - src/api/**/*.ts --- # API 层规则 - 所有请求必须走 request.ts 封装 - 错误必须 throw禁止吞异常 - 返回值必须有类型定义然后是 settings.json这是硬约束所在路径是.claude/settings.json{ permissions: { deny: [ Bash(rm -rf *), Edit(package.json), Write(src/legacy/**) ], ask: [ Bash(git push *) ], allow: [ Bash(npm run test:*), Read(**) ] }, hooks: { PreToolUse: [ { matcher: Edit, hooks: [ { type: command, command: node .claude/hooks/check-any.js } ] } ] } }如果你用 Codex对应的是~/.codex/auth.json和 AGENTS.md。auth.json 里放通道信息AGENTS.md 放规则。三件套必须写全缺一个都会导致请求失败被误判成「规则没生效」{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: 你的ModelID }提示AGENTS.md 有 32KB 上限代码里叫 AGENTS_MD_MAX_BYTES超了直接截断不报警。写完用wc -c AGENTS.md量一下别让正文被砍。skill 的 description 模板把触发条件写死--- name: db-migration description: 当需要新增或修改数据库表结构、编写 migration 文件时使用。触发词migration、建表、改字段、schema。 --- # 数据库迁移规范 正文步骤...这套配置的核心是软规则进 CLAUDE.md硬约束进 settings.json。前者给模型看后者替你拦动作。4. 验证请求用 /context 和实际请求确认规则真进了上下文配置写完不算完得验证。分静态和动态两层。静态检查Claude Code 里跑/context看当前上下文到底装了什么。输出类似Context Usage System prompt: 4.4k (0.4%) Memory files: 18.9k (1.9%) Skills: 11.1k (1.1%) Messages: 110.5k (11.1%) Free space: 813.9k (81.4%)Memory files 那行就是你的 CLAUDE.md 和 rules 占的量。如果显示 0说明第一层「关联」就断了——文件没放对位置。如果数值明显偏小可能是被截断了。动态检查发一个真实请求看 Agent 实际调了什么。比如你 deny 了Edit(package.json)就让 Agent 去改 package.json它应该被拦下来。这一步验证的是第四层「遵守」——权限是硬约束不经过模型意愿。用 TaoToken 通道做对照复现时先确认请求本身是通的。可以用模型对话页发一条测试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。如果这里都报错那问题在通道不在规则。一个完整的验证流程# 1. 确认文件位置 ls -la CLAUDE.md .claude/rules/ .claude/settings.json # 2. 量 AGENTS.md 大小Codex 用户 wc -c AGENTS.md # 3. 在 Claude Code 里跑 /context # 4. 触发一次被 deny 的操作看是否被拦 # 让 Agent 执行修改 package.json 的版本号实测下来大部分「规则不生效」卡在第一层和第三层要么文件没被关联要么 skill 的 description 没把正文路由进来。第四层反而是最好确认的因为权限拦截有明确报错。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节对照真实报错逐个定位属于哪一层。401 Unauthorized通道层问题不是规则层。Key 错了或没带上。检查 auth.json / 环境变量里的 api_key确认和 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 里生成的一致。这类错误经常被误判成「Agent 不听话」其实是请求根本没成功。local proxy failed本地代理配置问题。检查 Base URL 是否写成了https://taotoken.net/api注意结尾不要多加斜杠或路径。这个报错和规则无关纯粹是 endpoint 拼写。reading choices 相关报错通常是响应结构解析失败多半是 Model ID 写错或通道返回了非预期格式。回到三件套核对Base URL、Key、Model ID 是否都写全。缺任何一个都会走到这一步。OAuth 相关报错Codex 侧登录态问题。检查~/.codex/auth.json是否完整字段名是否和文档一致。OAuth 失败时 Agent 可能表现为「静默不执行」看起来像没读规则实际是认证没过。排查顺序建议固定成先确认请求通通道层→ 再确认文件被关联第一层→ 再确认进了上下文第二层→ 再确认被路由第三层→ 最后确认被遵守第四层。别一上来就改 CLAUDE.md那是最容易白费功夫的地方。注意如果 CC Switch、Cline MCP、Codex auth.json 里任何一个出现了三件套Base URL Key Model ID必须写全缺一个都会导致请求失败被误判成规则问题。6. 把规则真正落地软硬结合 统一通道回到开头那只猫。贴告示没用装门禁才有用。CLAUDE.md 是告示settings.json 的权限和 hook 是门禁。你要做的不是写更多规矩而是确保规矩真的进了上下文而且进了之后出不来。具体动作收敛成三条第一根目录 CLAUDE.md 控制在 200 行内细分规则丢.claude/rules/按路径触发第二skill 的 description 把触发条件写死别让正文进不来第三想要确定性的约束全部下沉到 permissions 和 PreToolUse hook别指望模型自觉。通道层用 TaoToken 统一是为了让排查有干净基线。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 长期编码任务可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。Claude Code 相关接入参考 https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-codeutm_campaignrewrite 。最后留一个我踩过的坑别在 CLAUDE.md 里写「务必」「绝不」这种词就以为稳了context 是建议不是强制。真正让 Agent 出不去的方法是权限里 deny 掉那个动作。软的不行来硬的建议不行上权限。