把agent缩减到9个,给CLAUDE.md瘦身之后,Compacting conversation...出现的间隔明显变长了。同样的任务,比以前撑得久多了。开心。

然后我在请求新功能,看着控制台。测试跑了。30个case,全部通过。但Claude又在提成功的测试。有种说不出的怪异感。

问了Claude。“刚才成功的测试你为什么又提?“Claude解释了工具这个概念。Claude执行终端命令或读文件时,那些都是"工具调用”。而每次执行工具,其结果会整个堆进对话上下文。npm test结果30行、Hugo构建日志180行,全部。测试全通过了没什么好看的,却读了全部30个。修构建错误时需要的只是最后5行,却加载了全部180行。

漏水的桶不止一个。

曰:当遵循hooks

搜索中发现了Claude Code的hooks。PreToolUse——在Claude执行工具之前介入的脚本。可以在Bash命令执行前加工输出,也可以在读取工具调用前拦截。

可以为守护my precious立戒律了。

第一戒:成功之物不可观

30个测试全部通过,没必要再读一遍。做了一个hook,只筛选失败的case显示,其余丢弃。(让Claude做的。)

1
filtered_cmd="$cmd 2>&1 | grep -A 10 -E '(FAIL|ERROR|✕|FAILED)' | head -150"

之前Claude看了全部30个测试结果,现在只看失败的。全部通过的话读取量为0。消除了100%的无用读取。

第二戒:非错误不可上传

Hugo构建日志180行、Docker构建80行——找错误不需要全部上传。同样的逻辑,做了只筛选ERRORWARNfailed的hook。

1
2
# Hugo
filtered_cmd="$cmd 2>&1 | grep -E '(ERROR|WARN|error|failed|Fatal)' | head -30"

180行变成了5行。削减了97%。Docker也从80行变成了10行左右。

第三戒:无用之物不可读

有个不再使用的archive文件夹。Claude在文件探索中没有理由打开这个文件夹。做了一个hook拦截Read工具调用,路径包含_archive就拒绝。

1
2
3
if [[ "$file_path" == *"/_archive/"* ]]; then
  # deny
fi

简单但有效。

不过话说回来

体感确实有了。Compacting conversation...出现的频率降低了。跑一次构建上下文也轻了很多。3个hook挡住了Claude读无用信息。

但那是"体感”。不知道具体减少了多少。感觉今天比昨天好,但没法吹自己减了多少!跟EP.1中"拆agent应该能减少"的无根据信仰有什么区别?

不测量就不算改善。是时候做定量测量了。

本系列其他文章


参考