
在Vibe Coding盛行的当下,真正让人头疼的往往已经不是“AI 不会写代码”。
更常见的问题是:它明明只完成了 70%~80%,却非常自信地告诉你:Done。
让它重构一个模块,它可能改了主流程,却忘记边缘情况;让它修一个 Bug,它修好了眼前的报错,却没有跑完整测试;让它完成一个大型项目,前面几十分钟做得很认真,随着上下文越来越长,后面开始越来越敷衍。
这就是开源项目 unlazy 想解决的问题。
它不是让 AI“智商提高”,也不是再写一段“请你认真工作、不要偷懒”的 Prompt,而是尝试给 AI Coding Agent 增加一套类似软件工程 CI(持续集成) 的 完工纪律:不要告诉我你做完了,拿证据证明你做完了。
unlazy:https://github.com/Leonxlnx/unlazy
unlazy 解决的问题
传统的 Agent 往往以“生成更多 token”或“尽快结束对话”为导向,导致它们在面对大型任务时倾向于采取“最省力路径”——写占位符(TODO)、不做边缘情况测试、甚至直接幻觉出“校验已通过”的结论。
典型的失败模式:
Laziness / premature completion:多段任务只做一部分就宣布结束。Quantifying Laziness 在受控实验里看到:即使指令写得很细,模型仍经常漏章节、达不到长度要求。
Underthinking / overthinking:推理路径切来切去,或者把算力花在无用思考上。
长程质量崩坏:SlopCodeBench 让 15 个 coding agent 反复扩展自己的解。没有一个端到端做完任何题目;最好的也只过了 14.8% 的 checkpoint。结构侵蚀在 77% 的轨迹上上升,冗余在 75.5% 的轨迹上上升。过 checkpoint ≠ 任务完成。
unlazy 的核心机制
核心机制 1:深度树方法(Depth Tree Method),把大型任务真正拆到底
unlazy 提出了 Depth Tree 概念:
算力乘法效应:将大任务递归拆解为 $N$ 层子任务树。关键在于:每一个叶子节点(Leaf)都分配与整个大任务相同的完整时间预算(Time Budget)。如果树拆解得越深,Agent 在细节上投入的总思考与计算量就会呈指数级增长。
严格的文件所有权与隔离:多任务并行时,要求明确定义 OWNS: 路径,防止不同子任务对代码库产生竞态修改。
核心机制 2:可执行门禁与验收账本(Runnable Gates & Acceptance Ledger)
告别靠模型口头承诺“我做好了”的时代,unlazy 引入了基于代码判题官的约束:
先写门禁,后写代码:在动手之前,必须先在 GATES.md 中写下可验证的断言。
命令判定(Command Oracle):每个 Gate 都包含明确的 CHECK:(要执行的 Shell 命令)和 EXPECT:(预期输出正则)。
证据链(Evidence):只有命令行返回码为 0 且输出匹配预期,才能将任务标记为已完成。
unlazy还有几个设计很有借鉴意义:
Fresh-context Agent:
大型 AI Coding 项目还有一个很难解决的问题:Context Degradation,也就是:上下文越长,Agent 越容易开始犯糊涂。
因此 unlazy 在 tree 4+ 场景里引入了 Fresh-context Agent 作为解决方案:叶子不共享同一条长对话,而是各自开 Fresh Context。叶子不读兄弟叶子的聊天记录,只读合同和自己的验收账本。注意力隔离,而不是再加一层 prompt 咒语。
tree 4+ 时,把叶子从主会话里抽出来,用合同和账本重新对准,比继续往一条已经塞满的上下文里塞提示词,更贴近真实大型工程的协作方式。
Integration Gates:解决子模块正常,但一集成成完整系统,系统就无法正常运行的问题
Stop Hook:Claude Code 专有功能,禁止 AI 提前退出。Agent 想停时先问 unlazy,门禁或派发还没收干净就 不准结束。目前这种 Hard Enforcement 是 Claude Code 专属;Codex、Cursor 等仍然可以使用 SKILL.md、Gates 和相关 Node 脚本,只是没有同样的 Stop Hook 强制退出控制。
–reverify:强制AI 在代码更改后做传统软件工程的回归测试(Regression Test),解决 AI 最喜欢说的“刚才已经测过了”。
unlazy 本质上是在 AI Agent 上面加了一层传统软件工程中常用的CI(持续集成),可以看作AI Agent CI / QA Layer。
unlazy 的思路其实非常简单:不要通过 Prompt 要求 AI 更认真,而是让“不认真”在工程结构上无法隐藏。
Acceptance Gates 把“完成”变成可以验证的事实;
Depth Tree 把大型任务拆成真正可执行的工作单元;
Fresh Context 减少长上下文带来的注意力衰退;
Integration Gates 防止“每个模块都正常,但组合起来不能用”;
–reverify 防止旧测试结果被拿来证明新代码;
Claude Code Stop Hook 更进一步,让“验收没通过就宣布完成”变得机械上更加困难。
unlazy 值得所有Vibe Coding 爱好者在自己的项目中引入。