不知道你经历过这个场景没?
接了一个新客户,需要提供一份法律服务报价方案。
时间紧,你用AI辅助起草,里面涉及了几个关键法条作为服务依据。
做完之后,你有个习惯,发出去之前最后核查一遍。这一查,发现AI引用的某条条文措辞有偏差——不是现行版本的原文,是它"理解性地概括"出来的,还模仿得像模像样。
你心里一凉。这是新客户,报价方案里出现错误法条,直接发过去,客户大概率觉得你不专业,单子就黄了。
本来用AI是为了降本增效,结果差点因为AI搞丢重要客户。
这不是Claude不聪明,是你没给它规则。 它不知道引用法条要逐字核准,除非每次都告诉它。而且即便说了,它也可能在某次任务繁忙时"自己判断一下差不多就行了"。
Hooks解决的就是这个问题。
一、先说一个概念:Harness Engineering
在讲Hooks之前,想先说说一个词——Harness Engineering,暂且翻作"驾驭工程"。
把Claude想象成一匹很聪明但没有固定纪律的马。你可以告诉它你是谁(CLAUDE.md)、你的工作习惯(Memory)、要用什么流程处理任务(Skill)。这些都是引导,Claude可以照做,也可以"理解性地偏离"。
Harness Engineering要解决的问题是: 把这套引导设计成一个有约束力的框架,让Claude无法绕过你的规则 。
这四种机制的差距,放一起看就清楚了:
Hooks是这里面唯一真正强制性的一层。
CLAUDE.md告诉Claude"你应该这样做",Hooks告诉系统"不管Claude有没有记住,这个动作必须发生"。两者要配合用——CLAUDE.md管思维方向,Hooks管关键节点的强制动作。合起来,才算是完整的harness。
二、Hooks是什么
原理很简单:在Claude调用某个工具的 之前 或 之后 ,自动触发你预先设定好的动作,这个机制是硬编码的必选项,不是软性约束的可选项。
比如: - Claude要修改文件——修改之后,自动git commit留痕 - Claude要输出引用了法条的内容——输出之后,自动调用北大法宝核验条文
这些动作不经过Claude的"判断",直接由系统执行。你不用每次在对话里提醒它,因为规则写死在配置文件里了。
理解Hooks需要搞清楚四件事。
触发时机。 PreToolUse 是Claude调用工具之前,可以拦截审查; PostToolUse 是工具调用之后,可以补充动作或记录日志。类比一下:PreToolUse是出发前检查装备,PostToolUse是回来后交接汇报。
触发条件。 可以精确指定某个工具,比如只在Claude"写文件"时触发;也可以用 * 匹配所有工具调用。
触发动作。 执行的是一段系统命令,比如git commit、调用MCP工具、发出通知。退出结果决定后续:正常退出则Claude继续;返回错误则Claude收到提示但可以继续;强制中断则该操作无法进行。
配置位置: 全局Hook写在 ~/.claude/settings.json ,对所有项目生效;案件级Hook写在案件文件夹的 .claude/settings.json ,只对该案件生效。
操作方式: 在对话框输入 /update-config ,告诉Claude要配置什么规则,它帮你写进配置文件。
三、实战一:引用法条,自动北大法宝核验
这就是我开头那个差点出事的场景。解法是这样的:
确认北大法宝MCP已配置好(参考 法律人学Claude|第七期:给Claude装上"外挂"——CLI与MCP工具使用指南 )
在对话框输入 /update-config ,点击Add a hook
告诉Claude:"每次你输出包含法条引用的内容后,必须调用北大法宝MCP工具核验该条文的现行有效版本。如果条文内容有出入,在回复末尾注明差异"
Claude生成配置写入 settings.json ,重启Claude Code
测试:让Claude分析一份合同违约条款,看是否自动触发核验
效果是这样的:Claude在回复末尾会自动出现"已通过北大法宝核验,条文内容准确",或者"注意:该条文已于XX年修订,现行版本为……"。
不需要你每次提醒,这是系统行为。
四、实战二:修改文书,强制git commit留档
第十期讲了git的基本操作,但靠律师自己每次手动提交,实际很难坚持。Hooks可以把这件事变成强制行为。
确认案件文件夹已完成 git init (参考 法律人学Claude|第十期:被AI改乱的文档如何自救?——Git工具的使用 )
输入 /update-config
告诉Claude:"每次你修改或新建 .md 、 .docx 、 .txt 格式的法律文书文件之后,必须立即执行git add和git commit,commit信息包含当前时间和你做了什么改动的简短描述"
保存配置,重启Claude Code
测试:让Claude修改一份代理词,看修改完后终端是否出现git commit提示
还可以让Claude自动生成语义化的commit描述,比如"修改第二部分事实陈述——补充违约时间节点",比干巴巴的时间戳好看得多。也可以配置:git commit失败时直接中断修改并提示律师先执行 git init ,省得改了半天没留档。
关键就是:Claude改坏了? git checkout ,秒回上一版。不依赖律师自己记得备份,因为它根本没机会跳过这步。
五、四层叠起来
回到harness这个框架。
CLAUDE.md是岗位手册,定义Claude在这个工作区里的角色和基本规则。 (参考: 法律人学Claude|第四期:你的项目助理—CLAUDE.md使用指南 )
Memory是它对你这个人的长期了解,换案件文件夹也带着走。 (参考: 法律人学Claude|第六期:不做8秒记忆的金鱼——优化记忆Memory )
Skill是专用工具包,复杂任务一键触发。(参考: 法律人学Claude|第五期:让Claude用上次抛App——Skills初解 、 法律人学Claude|第九期:给自己定制一个审合同Skill——Skill详解 )
Hooks是最硬的那一层,关键操作节点,强制执行,绕不过去。
四层搭好,Claude就不只是个聊天工具了,是一个在你设计的规则框架里运转的工作系统。
常见问题
Q:Hooks配置后不生效? A: 先检查 settings.json 的格式是否正确(可以让Claude帮你验证),然后重启Claude Code。JSON格式里一个多余的逗号就会导致配置失效,这个坑挺常见的。
Q: 北大法宝MCP没有响应? A: 回到第七期,检查MCP工具是否正确安装和配置。Hooks调用的是你已经配置好的工具,工具本身没装好,Hook触发了也没用。
Q: git commit失败提示"not a git repository"? A: 先在案件文件夹里执行 git init ,再重新触发。参考第十期。
Q: 如何临时关掉某个Hook? A: 在 settings.json 里找到对应Hook配置,加一个 "enabled": false 字段,或直接删掉这段配置。不用删整个文件。
Q: CLAUDE.md里写了规则,还需要Hooks吗? A: 两者不替代。CLAUDE.md是引导,Claude理解后照做,但有时会"自己判断"。Hooks是强制触发,Claude无法跳过。重要的、不能有遗漏的步骤,用Hooks;日常的风格偏好和工作规则,CLAUDE.md就够了。
往期回顾
法律人学Claude|第一期:桌面版已经很好用了,为什么我还是力推 VSCode 插件版?
法律人学Claude|第二期:半小时装好 VSCode + Claude Code
法律人学Claude|第三期:让Claude更高效读懂你的文件
法律人学Claude|第四期:你的项目助理—CLAUDE.md使用指南
法律人学Claude|第五期:让Claude用上次抛App——Skills初解
法律人学Claude|第六期:不做8秒记忆的金鱼——优化记忆Memory
法律人学Claude|第七期:给Claude装上"外挂"——CLI与MCP工具使用指南
法律人学Claude|第八期:法律人的文档革命——你必须学会Markdown
法律人学Claude|第九期:给自己定制一个审合同Skill——Skill详解
法律人学Claude|第十期:被AI改乱的文档如何自救?——Git工具的使用
对了,我建了一个交流群,有想 进群 的伙伴可以 加我 。