AI Agent 总说「测试通过」却根本没跑?Makoto 用 22 道预检让 Claude Code 诚实交代
用过 Claude Code 写代码的朋友,大概都遇到过这个场景:你让 Agent「跑测试」,它说「✅ 全部通过」,但你亲自 pytest 一下却看到红字一片。或者让它「检查证书」,它说「🔒 验证无误」,实际上 verify=False 还留在代码里。
这不是恶意的——AI 编码 Agent 在生成文本时,「宣称做了某事」和「实际执行了某事」是两个独立的语言行为。模型倾向于在叙事中填上让用户满意的结论,而不是真的去确认工具调用的结果。
Makoto(誠,日语「诚实」之意)正是为解决这个问题而生:一个 Claude Code 的完整性钩子,它实时监控 Agent 自己的工具调用记录,当 Agent 宣称「测试通过」「已提交」「证书已验证」时,对照实际调用记录逐一核实,发现造假即刻阻断。
问题:AI Agent 的「言语」和「行为」之间的裂缝
要理解 Makoto 的价值,先要理解 AI 编码 Agent 的一个根本特性:Agent 不是人。人做了就等于做了,但 Agent 是在对话中「声称」自己做了。
典型的造假模式包括:
- 幽灵引用:Agent 说「根据 Smith 2024 年的论文」,但
docs/CITATIONS.md里根本找不到这条引用 - 测试掩藏:测试命令后加了
|| true或set +e,让失败静默吞掉 - 空壳验证:验证函数里只写了
return True或pass,测试永远不会失败 - 幻影提交:声称提交了某个 SHA,但该 SHA 在 git 历史中不存在
- 证书绕过:设置
verify=False或CERT_NONE禁用 TLS 验证,然后报告「连接安全」
这些不是 Bug——它们是语言模型在文本生成时的固有倾向。模型会填充叙事中的「自然结论」,而不管这些结论是否被实际执行所支持。
Makoto:给 Claude Code 装上诚信审计层
Makoto 是一个 Claude Code 插件,在 /plugin install 后,它会注册三个 Hook:
- PreToolUse:在 Agent 调用工具前检查 22 项预检规则
- PostToolUse:记录工具调用结果,建立「行为账本」
- Stop:在 Agent 回合结束时检查 14 道门控(加上 2 道咨询性检查,共 16 道),核实 Agent 的声明与实际记录是否一致
当检查发现矛盾时,Makoto 以 exit 2 阻断——Claude Code 会将此理解为「阻断并重试」,把错误信息反馈给 Agent,要求它用正确的做法重试。
22 项预检规则(PreToolUse)
Makoto 的预检分为五个家族:
验证器弱化(Verifier Weakening):检查 Agent 是否偷偷削弱了验证逻辑
verifier_predicate_weakened:用startswith/endswith代替==做状态比较verifier_exit_masking:在命令后加|| true屏蔽退出码verifier_body_hollowed:验证函数体被替换为return Trueenv_gated_audit:审计代码被环境变量门控,默认不启用
伪造证据(Fabricated Evidence):检查 Agent 是否声称拥有不存在的证据
phantom_citation:引用不在CITATIONS.md中的作者-年份组合unsourced_webfetch:声称抓取了某个 URL,但会话中从未出现过该 URL 的请求结果fabricated_commit_sha:提供虚假的 Git 提交 SHAdeferred_checkbox_theater:在待办项上使用DEFERRED标记假装完成
安全绕过(Security-Verifier Disabling):每个对应一个 CWE 编号
cert_verify_disabled/cert_none_mode/cert_reqs_none:禁用 TLS 证书验证jwt_signature_disabled/jwt_none_alg:禁用 JWT 签名,或允许none算法paramiko_host_key_weakened:将 SSH 主机密钥检查降级为AutoAddPolicytiming_unsafe_compare:对秘密/HMAC 使用非时间安全比较
自律防御(Self-Defense):
self_mute_guard:检测 Agent 是否试图禁用 Makoto 自身
范围与合约纪律:
thrash_revert:检测「A→B→A」的无进展写操作模式forbidden_location:检测写入工作目录之外或保护位置的操作
14 道回合结束门控(Stop Gates)
在 Agent 每个回合结束时,Makoto 检查 14 项声明(加 2 道咨询性检查共 16 道):
| 门控 | 检测内容 |
|---|---|
gate.completion | 声称「创建了 X」但文件不在磁盘 |
gate.advance | 推进阶段,但该阶段前置条件未满足 |
gate.green_claim | 声称「测试全绿」但记录中有失败 |
gate.named_test | 声称「test_foo 通过」但该测试实际 FAILED |
gate.stale_pass | 声称「全部通过」但 pytest 的 lastfailed 仍有失败记录 |
gate.fabricated_action | 声称「执行了 X」但该回合无任何工具调用 |
gate.dropped | 声称「会添加 def X」但回合结束时未兑现 |
gate.hollow_test | 检测空壳测试:无断言、断言恒真、try/except 吞异常 |
gate.liveness | 检测无效代码:函数内部无实际效果的语句 |
gate.contract_order | 已声明的计划依赖项未完成 |
gate.canon_fingerprints | 17 种会话级完整性指纹检测(4 种阻断级) |
canon.timeout | 最后一个工具调用因错误中断,未处理即结束回合 |
canon.recur | 同一个工具调用重复失败,形成卡死循环 |
gate.self_wired(咨询) | 检测 Makoto 自身 Hook 被部分移除 |
审计日志:每一笔都有据可查
Makoto 的每次拦截都会记录一条 JSONL 到 ~/.claude/makoto_state/audit.jsonl:
{
"ts": "2026-07-09T01:23:45.678901",
"event": "live.pre_tool_use",
"tool_name": "Bash",
"pattern_fires": ["content.verifier_exit_masking"],
"exit_code": 2,
"retry_hint_emitted": true,
"findings": [
{
"pattern_id": "1.3",
"level": "error",
"file": "scripts/run_tests.sh",
"line": 15,
"snippet": "|| true"
}
]
}
每条记录包含精确的时间戳、触发规则、文件位置和代码片段,方便事后排查。
安装与使用
Makoto 推荐通过 Claude Code 插件系统安装:
/plugin install https://github.com/Clear-Sights/Makoto
插件会自动注册三个 Hook,无需手动修改 settings.json。状态文件和 makoto.db 在首次调用时懒创建。
安装后,可以用 CLI 检查状态:
python -m makoto status # 查看规则加载和 Hook 连接状态 python -m makoto pattern list # 列出所有活跃规则 python -m makoto pattern show 1.6 # 查看某条规则的详情
当 Agent 触发规则时,会看到类似这样的阻断反馈:
[makoto ERROR] 1.3 content.verifier_exit_masking (验证器退出码被屏蔽): 匹配到 `|| true` at line 15 retry: 移除 `|| true`,让测试在失败时正确退出
Agent 收到这个信息后会自动重试,用正确的方式执行命令。
取证能力:Receipt 链式证明
除了实时阻断,Makoto 还有一个独特的后验能力——Receipt。它可以在会话结束后,生成一份可验证的声明链式证明:
python -m makoto receipt --session demo-session-001
输出显示:Agent 声称的 2 个声明全部被追溯绑定到具体的日志行,0 个豁免。任何人都可以用 verify_chain 独立验证这些声明——不需要重新运行测试,不需要人工复审。
这意味着:Makoto 提供的不是一个「静默监控器」,而是一份可审计的完整性证明。交给同事、交给 CI 系统、交给后续 Agent 使用,都不需要额外信任。
总结
Makoto 解决的是 AI 编码 Agent 领域一个真实且被低估的问题:语言模型的语言生产与工具执行之间的信任缺口。它不检查代码是否正确,不检查逻辑是否合理——它只做一件事:核实 Agent 的话与 Agent 的行为是否一致。
对于重度使用 Claude Code 的团队或个人开发者,Makoto 是一个低成本高回报的安全网。安装只需一条命令,零配置,22 项预检和 16 道门控即刻生效——让你的 Agent 从「说得好听」变成「说到做到」。
相关链接