Viaknox 开源 story-gate v0.9,用独立校验门禁检查 AI 编码是否真正完成
Building Production Grade Products
Viaknox 开源 story-gate v0.9,为每个用户故事设置 READY、CHECKPOINTS、DONE、ACCEPTANCE 四道门禁,只有通过测试或录制运行才算完成,且由独立评审而非写代码的模型打分。
如果你用 AI 构建过足够久,你一定见过这一幕:智能体打开一个拉取请求,自己写测试,盖上“完成”的章……但明显还有问题。
在我们的演示中——你可以在公开仓库里查看——故事非常简单:订单满 10 件或以上可享 10% 折扣。AI 写了代码,写了测试,并自信地宣布胜利。而恰好 10 件的订单仍然支付了全价。
解决办法不是“用更大的模型”。而是一条规则:除非 AI 展示出每个验收标准都有效的证据,否则故事就不算完成——而且该证据必须由编写代码的 AI 之外的某个东西来检查。
这就是 story-gate 所做的!它免费、开源,并且已经在我们构建技术栈中。
当 AI 说“完成”时,实际发生了什么?
这不是假设。这是公开仓库中的一次分阶段演示。
故事:订单满 10 件或以上可享 10% 折扣。
智能体写了:if qty > 10:
它测试了 9 件和 12 件。两者都通过了。它把故事标记为完成。
这个 bug 只是一个字符。> 而不是 >=。在恰好 10 件——每件四美元——时,客户支付了 40.00 而不是 36.00。AI 对自己工作运行的每一项检查都说“看起来不错”。
story-gate 在 GitHub 上针对真实代码重新运行了该故事的场景。拉取请求 #5 返回:“DONE 门禁失败……恰好 10 件获得折扣(输出不匹配)。”
独立评判器给“实现符合验收标准”的评分为 1 分中的 0.04。合并被阻止。
智能体在拉取请求 #6 中修复了它:更改了一个字符,为恰好 10 件添加了测试,并写下了教训——测试故事中提到的确切边界。每个场景都通过了。一个人批准了它。
| 拉取请求 #5 | 拉取请求 #6 | |
|---|---|---|
| AI 说 | “完成” | “完成” |
| 它自己的单元测试 | 通过 | 通过 |
| story-gate 运行“恰好 10 件” | 总额错误 | 总额正确 |
| 合并 | 被阻止 | 在有人批准后允许 |
两个 PR。都说“完成”。只有一个真正完成了!
为什么规格和清单救不了你?
我们是通过艰难的方式学到这一点的——用 AI 构建我们自己的产品。
像 GitHub 的 Spec Kit、OpenSpec 和 BMAD 这样的规格工具包非常适合规划。它们帮助 AI 在构建之前思考。但它们只是引导;它们不强制执行。当代码与计划不匹配时,没有什么能阻止合并。
我们第一次真正的失败不是糟糕的代码——而是单薄的故事。像“折扣有效”或“用户可以保存设置”这样的验收标准听起来不错……但完全无法测试。AI 总是可以声称它达到了一个模糊的目标。这就是劣质内容通过的方式——那些演示效果很好但在边缘处崩溃的功能。
生产就绪工具包在发布前检查整个产品。但到了发布日,数百个小故事已经合并了。如果每一个都是凭 AI 的一面之词“完成”的,那么就绪检查就变成了一场后期消防演习。
治理必须在工作流内部运行——而不是在终点线。story-gate 在最小的尺度上应用了这个理念:每个故事,每一天。
“证明”到底意味着什么?
证明意味着针对验收标准的证据。不是感觉。不是信心。不是“测试通过了”。实际证据:每个目标都有一个通过的测试和一次记录的运行。
证明并不意味着无 bug 的代码。story-gate 只检查故事所要求的内容。如果故事是错的或缺少某些东西,门禁会愉快地证明错误的东西。
这就是关键所在。它迫使你在开始前就直面那个难题——当这件事完成时,究竟必须满足哪些条件?如果你写不出来,那这个故事就还没准备好。
在 AI 构建之前、构建期间和构建之后,分别要检查什么?
story-gate 为每个故事设置了四道关卡:
- READY(就绪):计划清晰,每条验收标准都有对应的测试。你会得到一份简明的英文摘要。
- CHECKPOINTS(检查点):工作按计划推进,没有范围蔓延。你能看到完成百分比以及任何偏差。
- DONE(完成):测试通过,且 AI 真实运行过该功能。GitHub 会重新运行这些测试(需要真实设备的运行会被标记为“reported”,由你自行核查)。你会得到一份单页验证报告。
- ACCEPTANCE(验收):由人工批准。没有你,任何东西都不会合并(在 GitHub 强制执行分支规则的地方:公共仓库和付费计划)。
有三个设计选择很重要:
- AI 从不给自己的作品打分。由独立的评判者对每项检查评分——绝不是写代码的那个模型。(在可选的、无评判者的“客观模式”下,只检查测试、结构和可追溯性。)
- 勾选的复选框不是证据。只有通过的测试或记录下来的运行才算数。报告会展示哪些是已验证的、哪些只是声称的。
- AI 不能批准自己。它以自己的 GitHub 登录身份工作。它不能合并自己的 PR。检查失败会阻止合并(在公共仓库和付费 GitHub 计划上,GitHub 会强制执行分支规则)。
story-gate 并非旨在取代你的工具。它与你的工具并存。保留你的 spec kit。story-gate 会读取其场景,并对照它们检查代码。
这是给谁用的?
如果你是创始人或 CTO,正在用 Claude Code、Cursor、Codex、Gemini CLI、Hermes 或 VS Code agents 构建——并且靠 vibe-coding 一路做功能——那你一定懂这种痛!
AI 很快。AI 很自信。难的是判断“完成”是否真的完成了!
story-gate 就是为你打造的。它迫使你在构建前理清思路,在构建后展示真实证据,并让 AI 保持诚实。你不需要读每一行代码。你只需读一份单页报告,然后点击 Approve。
周末随便做的小项目可以跳过它。任何重要的事情都用它。这些检查每个故事会增加几分钟,外加每次检查通过 OpenRouter 进行一次小的评判调用。
我们对自己的标准
我们公开我们所用的东西。story-gate 源自我们自己的构建过程,我们正把它应用到每一个 Viaknox 产品上。
这还是个试点。v0.9 已在 Linux、macOS 和 Windows 上签署并测试,但在 1.0 之前命令可能会变。本文中的演示是编排好的——不是一整年的生产数据。
我们的标准很简单:如果一个故事无法为其验收标准提供证据,那它就不算完成。这同样适用于我们自己的代码。
两分钟试一下
你可以在不碰自己项目的情况下,看 story-gate 抓出一个 bug。story-gate try 会在临时文件夹里构建一个一次性的示例,包含一个故事和一个真实的 bug,并打开验证页面。无需 GitHub。无需评判密钥。无需网络。
Mac 或 Linux:
curl -LsSf https://raw.githubusercontent.com/SathiaAI/story-gate/v0.9.0/install.sh -o /tmp/story-gate-install.sh && sh /tmp/story-gate-install.sh然后打开一个新终端(这样它才能找到 story-gate)并运行:
story-gate tryWindows(PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/SathiaAI/story-gate/v0.9.0/install.ps1 | iex"
story-gate try如果你想的话,可以先读一下安装脚本——它很短。
然后告诉我们哪里出问题了。我们想知道它漏掉的 bug、那些感觉像噪音的检查,以及让你忍不住骂人的安装步骤。→ 加入 GitHub 上的 story-gate 讨论
来源:Hacker News · viaknox.com