你的团队已经在生产环境跑Claude Code了。它能做什么,你大概说得清。但上周二下午3点,它到底干了什么——执行了哪些Bash命令、针对哪个仓库、返回什么退出码——这个问题能答上来的人不多。

PostToolUse钩子就是用来填这个坑的。奇怪的是,官方文档只用两段话带过它。

打开网易新闻 查看精彩图片

上一篇我们把PreToolUse钩子比作一道闸门:在工具调用前运行,决定Claude Code能不能继续。PostToolUse是这套机制的后半段。它在调用完成后触发,唯一能做的事就是记录。下面所有内容都围绕这个前提展开——一旦忘了这一点,钩子就不再是审计日志,而是 liabilities。

打开网易新闻 查看精彩图片

PreToolUse回答"应不应该发生",PostToolUse回答"刚才发生了什么"。对于合规工作,后者才是关键。SOC 2的CC6.1和CC7.2控制项要求团队提供"过去90天内特权操作员的完整操作记录"。Claude Code在agentic模式下,按任何合理的解读都是跑在工程师机器上的特权操作员。拿"我们会查模型的会话记录"应付审计师,行不通。

官方文档给了两段话和一个JSON schema,够让钩子跑起来,不够让它过合规审查。以下是我们往Claude Code Max里塞的版本,针对过去几个月在同类代码里见过的失效模式做了加固。

打开网易新闻 查看精彩图片

核心逻辑很简单:把每次工具调用以JSON行格式追加到日志。时间戳用UTC ISO-8601——六周后读日志时,没人想猜时区。工具名、命令内容、退出码全部结构化存储,按日期分文件。脚本开头设了set -uo pipefailcode>,空输入直接退出,避免在管道里把错误吞掉。

这个钩子不做过滤,不做聚合,不做实时告警。它只是确保:当审计师要那90天的记录时,你能拿得出来。