为了让 AI 老实写代码,我给它套了四层枷锁

发布时间:2026/9/30 9:54:29
为了让 AI 老实写代码,我给它套了四层枷锁
我最开始用 AI 写代码是完全没立规矩的——它写得又快又像样我就放手让它写。然后很快被现实教育了它能在一个for循环里查数据库一个列表接口悄无声息打出几十条 SQL代码里魔法值满天飞if (status 3)、timeout 5000这种数字到处裸奔谁也说不清 3 是什么、5000 从哪来命名、分层、异常处理各写各的一个项目看着像五个人同时提交的。功能确实跑得通但那代码我都不敢细看。就是被这些具体的烂代码逼到份上我才反应过来得给它立规矩了。中途我还天真地以为是模型不够强换了个更贵的——结果一样它只是把不守规矩的方式升级得更体面了。这篇记录我是怎么一层层给 AI 上枷锁的先写规则再定流程中间也去拜读过业界那几套很成熟的 SDD 框架最后才想明白一件事——只要约束还停留在说的层面它就一定有办法绕过去。真正的转折是我把规矩从提示词里搬到了磁盘上——而且我特意做得很小、很轻复制进项目当天就能用不用先学一套方法论。第一层写规则先治代码写得太烂最先加的规矩很朴素建个规则文件就是现在AGENTS.md那类东西把最扎眼的几个坑一条条写死。而且一开始全是编码规范——因为逼我动手的就是前面那些脏代码- 禁止在循环里做数据库 / 远程调用批量场景走批量接口。 - 不许出现魔法值状态码、阈值一律提成常量或枚举。 - 命名、分层、异常处理跟随项目既有约定不许自创风格。有用吗真有用。N1、魔法值这种一眼扎眼的问题它开始主动避开了交付的东西终于像个懂行的人写的。尝到甜头后我又往这个文件里补了些行为约束不许擅自扩需求、不许乱改稳定代码、模糊就先问越权乱改的毛病也压下去不少。但很快发现新的问题代码质量上去了过程还是乱的。我让它改个东西它上来闷头一顿输出改完我才发现它理解的需求跟我要的根本不是一回事方向从第一步就歪了。规则能约束写成什么样约束不了它到底有没有跟你想一块儿去。第二层定流程逼它先对齐再动手于是我加了流程核心就一句话别急着写先把认知和需求跟我对齐。具体要求 AI动手前先把它理解的目标、范围、不确定的点列出来向我提问把模糊的地方摊开然后由它制定计划、由我来审——计划没通过不许碰代码。这一步的价值比规则大得多。因为它把事后返工变成了事前拦截很多脑补和扩需求在提问那一步就暴露了我一句话就能摁回去。相当长一段时间我觉得这套够用了。直到我开始让它干更大、更跨模块的活。问题来了计划它确实出了但出在聊天记录里。一个任务聊到第 30 轮早期的对齐结论、中途改过的决定全埋在滚动窗口里它自己都开始记混前后矛盾。更烦的是换个会话、换个工具之前所有对齐全部清零。流程解决了要不要对齐但没解决对齐的东西存哪、下次还算不算数。第三层业界早有这套东西只是对我太重了顺着这个痛点搜我发现先对齐、把决策落成文件这事业界早有名字叫SDDSpec-Driven Development规范驱动开发也有一批很成熟的实现OpenSpec、spec-kit 这些。它们的核心主张跟我自己摸出来的方向完全一致把一次改动落成磁盘上的规范工件别散在聊天里。看到这儿我挺服气——说明我大方向蒙对了。但真上手我卡住了。这些框架都很完整完整到一上来就是一整套命令、目录、schema、模板、还有一堆 skills我得先花半天搞懂它怎么转才敢往项目里放。我承认它们强可对我这种就想赶紧把活干完的人光那一大坨文件清单就够我头大的。我要的其实特别朴素文件少到一眼看完、不用装一堆东西、不用先学一套方法论、复制进项目当天就能用。于是我退回到自己的需求上大方向照搬业界验证过的但落地成一个我能直接上手的小版本。第四层可就算有了工件它还是能绕过去真正让我下决心自己造轮子的是这么个体验文件是建了可 AI 照样会**“假装走流程”**。说好让它先出计划、我点头再动手结果它文档刚生成我还没看转头就改起代码来了更常见的是它压根不理这套看到需求直接开写你事后追问计划呢、工件呢它才回头补一份让它自己核对实现跟规格里有没有对不上的地方它也能敷衍回一句已核对没问题实际根本没逐条比。我盯着这事想了很久才想通根子在哪这些约束说到底还是停在话和文档上靠的是 AI愿意配合。我无意去说哪个框架不好——人家本来也没承诺替你物理拦住什么它们给的是秩序让流程更清楚。可秩序不等于强制只要没有任何东西会因为 AI 跳过某一步而当场报错失败一个能读写你文件系统的 Agent就能大摇大摆地走过去。一句话软约束只能约束愿意配合的人对一个能跳过步骤、自己给自己盖章的 Agent等于没约束。我要的是把没对齐、没批准就想改代码变成一个会当场失败的动作。转折把门禁从话变成脚本想明白这点解法其实就一个方向——别让约束停在文字上让它变成一个会失败的东西。我做的东西很小小到有点拿不出手就四份文件加一个校验脚本。四份文件是——CLARIFY.md这次有哪些还没答的问题、SPEC.md到底做什么、怎么算验收、以及审批状态、PLAN.md拆成哪些任务、动哪些文件、progress.md执行留痕只增不改。那个脚本干的事也朴素把能不能开始改代码交给它的返回码说了算而不是 AI 的自觉。它会真的去读磁盘上这四份文件逐条卡# 编码前必须跑不过就不许动代码 .\scripts\check-change.ps1 -ChangeId order-refund-flow-001 -RequireApproved它校验的就三件事但每一件都戳在之前 AI 爱钻的空子上四件套齐不齐——想跳过建工件直接干文件不存在报错。SPEC.md是不是真approved——状态得是approved而且approvedBy、approvedAt不能是空的、不能是占位符。你想自己填格式和占位符检测会拦你一手逼这个审批动作至少留下可追溯的痕迹。CLARIFY.md还有没有没答的阻塞问题——只要有一行同时命中阻塞和待答复直接判定不通过specgate check: FAILED - CLARIFY contains an unanswered blocking question这么一改性质就变了。之前是AI 你觉得你遵守了就行现在是你要么把工件填到能通过校验要么就别想往下走。它没法靠一句口头承诺糊弄过去因为糊弄不过一个会返回非零退出码的脚本。这里插个真实的小坑如果你也自己在 Windows 上写这种校验脚本PowerShell 5.1 读没有 BOM 的 .ps1 会按 GBK 解码你源码里写的中文匹配串会乱码导致门禁直接失效、还以为是逻辑错了。我最后是把待填写“阻塞”待答复这些中文判断词全用 Unicode 码点拼出来让脚本源码保持纯 ASCII才稳。但我没骗自己这依然不是万能锁写到这儿得说点诚实的不然就成了吹自己工具了。这套门禁是纵深防御不是沙箱。只要 AI 跟你用的是同一个文件读写权限它就总有办法干脆不跑脚本直接改代码把校验脚本本身改成永远返回 OK改了PLAN.md清单之外的文件事后回填 progress伪造执行记录。这些我在会话内确实根除不了。所以我对这套东西的定位很清楚它不是物理拦住而是抬高作弊成本 留下能对账的证据链。真正的硬约束来自权限圈之外——比如接进 CI 做 required check、开分支保护、要真人 review让 AI 没有合并权比如 git 历史对账提交时间和approvedAt对不上、实际 diff 和 PLAN 清单对不上一翻一个准。门禁能保证的是AI 改的每一处代码要么留下了合规的审批痕迹要么就跟它对不上账。至于它有没有越权交给圈外机制和事后审计去判。至少它再也没办法一边破坏规矩、一边装得跟什么都没发生一样。回头看这四层一路走下来其实是有条明线的每一层都在补上一层漏掉的东西层次解决什么没解决什么规则文件代码写成什么样过程乱、方向歪流程提问计划审核事前对齐认知结论存聊天里会忘、会清零业界 SDD 框架决策落成磁盘工件对我太重、要先学且仍靠自觉能绕过脚本门禁让合规变成一个会失败的东西同权限下的逃逸得靠 CI / 人审兜底如果你也在被AI 不听话折磨我的体会是先别急着换更强的模型模型再强也只是把不守规矩藏得更深。真正管用的是把你心里那条必须怎样的线从跟它说清楚一步步变成它绕不过去的东西。能写成脚本的约束就别只写在提示词里。这套我自己用的骨架开源在这儿四份文件模板、一个校验脚本、一份 AGENTS 总线没了。不用装环境、不用学命令复制进你项目当天就能用嫌管得宽就自己删两条——它本来就是我按自己的毛病攒的你尽管改成合你手的形状。地址放这儿https://gitee.com/hero520/specgate。也特别想听听——你们都是怎么治 AI 不守规矩这毛病的尤其同样被一堆文件劝退过的人评论区聊聊。