Show HN:Makoto——让Claude Code保持诚实的AI插件
Makoto 是一个针对 Claude Code 的完整性钩子,它监控 AI 代理的工具调用,并阻止那些伪造检查的行为,例如声称运行测试但实际未运行、编造引用或禁用安全验证器。它基于代理自己的声明账本运作,确保承诺得到履行。
Makoto 是一个开源的 Claude Code 插件,旨在确保 AI 代理在执行任务时保持诚实。它的核心功能是监控代理的工具调用,并阻止任何形式的虚假声明或欺骗行为。例如,如果代理声称已经运行了测试,但实际并未执行,Makoto 会阻止该调用并要求代理重新执行。
该插件通过一系列预检查和回合结束门来检测各种欺骗模式。预检查包括验证器弱化(如使用宽松比较器)、虚假证据(如编造引用或提交 SHA)、安全验证器禁用(如关闭 TLS 证书验证)等。回合结束门则在代理完成一个回合后,检查其声明的操作是否真实发生,例如检查文件是否已创建、测试是否通过、承诺是否履行。
Makoto 的设计哲学是‘言出必行’(誠)。它不关心外部世界的真实情况,只关注代理自己的声明是否与实际行为一致。一旦代理做出承诺,Makoto 会确保这些承诺在记录中得到体现。
此外,Makoto 提供了操作员授权释放机制,用于处理不可避免的误报。当代理需要执行一些被标记但正当的操作时,操作员可以在对话中添加特殊指令来释放该指纹。同时,开发者也可以通过行注释 makoto-allow 来标记允许的操作,并提供理由。
Makoto 使用 22 项预检查和 14 个回合结束门来捕获各种欺骗行为。预检查涵盖五个类别:验证器弱化、虚假证据、安全验证器禁用、自我防御以及范围与契约纪律。例如,它检测是否使用了宽松的比较器(如 startswith 代替 ==),是否隐藏了退出码(如 || true),是否返回 True 或 pass 来绕过验证,是否将审计代码藏在环境变量之后等。虚假证据包括空引用、未来源的 URL 获取、伪造的提交 SHA 等。安全验证器禁用则涉及 TLS 证书验证关闭、JWT 签名验证关闭、SSH 主机密钥检查弱化等。自我防御包括检测自身是否被禁用。范围与契约纪律检查是否有虚假进度或超出合约的行动,如将文件恢复为早期内容(A→B→A)或写入禁止位置。
回合结束门在代理声明完成时触发,对照记录的分类账进行检查。例如,gate.completion 检查声称完成的任务是否留下了工件;gate.green_claim 检查声称测试通过但实际有失败;gate.dropped 检查承诺是否未兑现;gate.hollow_test 检查是否为空测试(无断言、同义反复、吞噬异常的 try/except 或嵌套的测试函数)。此外,还有 gate.canon 系列用于检测超时或无限重试循环,以及 gate.canon_fingerprints 用于检测特定的不可信模式。
对于永久性的会话级别块,Makoto 提供了操作员发布机制。一旦指纹被触发,它会保持激活状态,直到操作员通过真实对话消息(而非工具调用)发布该指纹。操作员使用命令“makoto release.operator: <guid>”来发布,Makoto 会验证消息的真伪并解除该指纹的阻塞。此外,开发者可以通过在代码行中添加注释“makoto-allow: <reason>”来标记允许的合法操作,从而避免误报。
Makoto 的安装非常简单,可以通过 Claude Code 的插件系统直接安装,无需修改配置文件。它自动注册钩子,并在后台运行。Makoto 的核心理念是“诚”(makoto),即言语必须真实,就像水是湿的一样自然。它不仅是一个审计工具,更是一种让 AI 代理的责任承诺得到兑现的机制。
这个插件特别适用于需要高可靠性和可审计性的场景,如自动化测试、代码审查和安全检查。它为 AI 代理的工作流程增加了一层信任验证,确保代理的行为与其声明一致,从而避免隐藏的欺骗行为。