本页判断标准

它跑完一次验收之后,git status --short 的输出是空的吗?

答「不是空的」,说明 tools 里留了写类工具或 Bash。删掉它们,只留 Read, Grep, Glob,再让它跑一次。

限权靠 tools 允许列表

子智能体的权限来自 tools 这一行:写哪些工具,它就只能用哪些。不写 tools 等于不限制,这是验收角色最容易出问题的地方。

tools 写法它能做什么代价
tools: Read, Grep, Glob读文件、搜代码、列文件;改不了文件,也跑不了命令只做静态复核,跑不了测试,动态问题得另有人验
在上面加 Bash还能跑任意命令命令本身能改文件、能提交,等于间接放开了写
不写 tools用得到全部工具,包括 Write、Edit等于没有限制,不能用来做验收
建文件在仓库里建 .claude/agents/verifier.md,文件名即角色名。
写前置元数据name 与文件名一致;description 写明什么时候交过来;tools 只留 Read, Grep, Glob。
写正文只写检查项与报告格式,不写「顺手改一下」这类动作。
验证只读让它跑一次验收,再跑 git status --short;有改动就说明权限没收住,回去删掉 Bash 或写类工具。
可以这么做 用只读子智能体做验收与复核:查数据范围读写、查有没有跳过无依据分支、按统一格式回报。它跑完,用 git status 确认仓库没被动过。
不要这么做 给验收角色留 Write 或 Bash;把数据范围、密钥规则只写在子智能体里;用子智能体代替人做最终合并决定。

边界:子智能体解决的是「换一个上下文、限一套工具」,解决不了「不该做的事被拦住」。拦不住的交给 钩子,硬约束写在 CLAUDE.md。

子智能体在三个工具里的字段

三处目录同名不同父,限权字段完全不一样:Claude Code 和 TraeCode 用工具允许列表,Cursor 用一个 readonly: true 开关。迁子智能体之前先在这张表里对一遍。

项Claude CodeCursorTraeCode
项目位置.claude/agents/*.md.cursor/agents/*.md.trae/agents/*.md
个人位置~/.claude/agents/无对等位置~/.trae-cn/agents/
限制权限tools: Read, Grep, Glob(不写 Write/Edit/Bash)readonly: truetools: Read, Grep, Glob 加 disallowedTools: Write, Edit, Bash
模型无对等字段model: inherit 沿用当前对话的模型不写 model 时用对话里当前选的模型
名称约束name 与文件名一致无对等说明name 只能用字母、数字、连字符,≤50 字符;name 与 description 必填
怎么被叫到由 description 决定;对话里也可输入 @ 点名由 description 决定由 description 决定;也可在提示里直接说「使用 verifier 检查这次改动」

本课只建两个只读角色,都放项目目录。tools 用逗号分隔,中间的空格可有可无,但工具名要和实际工具名一致。写错的名字等于没写——配完让它跑一次验收,再用 git status --short 看它有没有改文件:改得动,就说明哪个工具名写多了。

两个只读角色

两份都用 tools: Read, Grep, Glob,验收时既不能改文件,也不能跑命令。第一份查数据范围,第二份查改动是否越出 README 写明的范围。抄过去后改角色名与检查项。

.claude/agents/verifier.md

只读子智能体。tools 里没有写类工具与 Bash,所以它只能看,不能动。每次验收后跑 git status --short 复核。

---
name: verifier
description: 验收数据范围。在改完查询、上传或检索之后使用。只读,不改文件。
tools: Read, Grep, Glob
---

用两个所属范围的账号各看一次。
当前所属范围的数据能读到。
其他所属范围的数据读不到,且与记录不存在无法从响应区分。
没有命中时返回无依据,不出现材料中没有的句子。
只报告看到的请求、SQL 或接口结果,不改代码。
回报格式:检查项 / 结论(通过或未通过)/ 证据(文件:行)。

若发现某一步需要改代码,只写出建议,不执行修改。

.claude/agents/spec-reviewer.md

第二个只读角色,判据指向 README.md 的「当前阶段」。能用 @spec-reviewer 点名它,它也会在改到范围相关文件时被叫到。

---
name: spec-reviewer
description: 核对这次改动是否越出 README 写明的范围。在合并请求合并前使用。只读,不改文件。
tools: Read, Grep, Glob
---

对照 README.md 的「当前阶段」一节,逐条判断改动属于范围内还是范围外。
列出本次改动涉及的目录。
指出任何「顺便加上」的角色、存储或接口。
不修改任何文件;结论只写「范围内」或「越界,应停」。

回报格式:条目 / 判断 / 依据的小节标题。

两个角色都只读,所以它们的结论必须由人复核并决定是否合并。子智能体给出的是证据,不是通过与否的最终判断——合并决定仍在 合并与审查 里做。

子智能体越权或不被叫到的四种现象

前两种是权限没收住,后两种是没被叫到或结论不可靠。按「现象 → 原因 → 修法」对号入座,改完让它再跑一次验收,并用 git status --short 确认。

现象原因修法
验收子智能体跑完,git status 里多出改动tools 里写了 Edit/Write,或写了 Bash 而命令能改文件tools 只留 Read, Grep, Glob,删掉 Bash 与写类工具;每次验收后用 git status --short 确认没有改动
建了 verifier.md,助手从没把工作交给它description 写成「验收的子智能体」,没说在什么任务后用改成「在改完查询、上传或检索之后使用」;验证时也可在对话里输入 @verifier 点名
子智能体回报「其他范围读不到」,但其实没人切换过账号只读子智能体只能看代码,不会真的换账号登录、发请求把「用两个所属范围各看一次」写进 CLAUDE.md 与可执行规约,由人或接口测试执行;子智能体只做静态复核
只在 verifier.md 里写了「不许读 .env」,别的对话照读子智能体不是每次会话都加载,约束不跟着走硬约束写 CLAUDE.md,并用 钩子 拦住读取;不放子智能体里
对应知识点 这一页只是 子智能体 在 Claude Code 里的落地写法。通用规则看 子智能体(第一层 · 能力);不需要独立上下文的步骤写 技能;需要人点名的写 命令。