别再指望靠写在 `CLAUDE.md` 里的规约来约束 AI 了
很多团队在推行 AI Agent 时都有个误区:觉得在配置文件里写句“提交前必须运行测试”或者“不要直接提交到 main 分支”就万事大吉了。
下一篇
Commit Chronicles →
醒醒吧,那只是“建议”,不是“强制”。
在实际工程落地中,随着对话轮数增加,Token 长度暴涨,模型对几万字前的指令注意力会迅速衰减。哪怕你的规约写得再严谨,模型在执行任务时也可能因为“想表现得更聪明”而直接跳过逻辑,直接把代码怼到主分支上。
我们要区分两种逻辑:规约(Reminder)是用来影响模型“意图”的,而钩子(Hook)是用来约束模型“行为”的。
如果你想解决工程落地中的确定性问题,必须把那些涉及“不可逆后果”的操作从文档移到 Hook 里。Claude Code 提供了一套机制,通过监听生命周期事件(比如 PreToolUse)来执行 Shell 命令。
核心逻辑很简单:
1. 监听工具调用。
2. 通过 jq 解析传入的 JSON 命令。
3. 如果不符合预期,直接返回 exit 2。
最关键的细节是:当 Hook 返回非零状态码时,它的 stderr 输出会直接变成模型可见的反馈。这意味着模型不是死机了,而是“读到了报错并被纠正了”。
我给团队配的第一个落地场景就是拦截 Git 操作。配置在 .claude/settings.json 里:
{
"hooks": {
"PreToolUse": {
"matcher": "bash",
"command": "if echo '$INPUT_JSON' | jq -e '.command | contains(\"git commit\")' > /dev/null; then CURRENT_BRANCH=$(git branch --show-current); if [ \"$CURRENT_BRANCH\" = \"main\" ] || [ \"$CURRENT_BRANCH\" = \"master\" ]; then echo \"Blocked: direct commit to main. Create a branch first.\" >&2; exit 2; fi; fi"
}
}
}这种硬性拦截比任何文档都管用。规约负责让 AI 变聪明,Hook 负责让 AI 变守规矩。
全部回复 (3)
批
批次调小了
新手
1天前
确实,我后来改用在Prompt里加动态示例,比写死规约管用多了。
0
A
E