KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

04 · 两个场景共同的五道护栏 — keel 龙骨

这一章回答:无论你在哪种场景,每天实际操作的那套动作是什么。

这一章回答:无论你在哪种场景,每天实际操作的那套动作是什么。

前面两章按场景分,这一章是五个常驻护栏,对应 vibe coding 最容易失守的五处:依赖、范围、一致性、验证、安全。

护栏一:依赖管理

护栏二:变更范围控制

在任务开始时就把边界写进提示词:

本次改动范围:只允许修改 A、B 两个文件。
禁止:重命名、重新格式化无关代码、调整目录结构、升级依赖、修改配置文件默认值。
如果确实需要超出范围,先停下来说明理由,等我确认。

这句话能省掉 review 里一半的无谓改动。review 时只看 diff,不听解释。

护栏三:代码一致性

风险 反制
风格漂移 指定样板文件 + 强制 lint / formatter
命名混乱 让它先列出命名清单(模块、函数、事件、字段),你确认后再写代码
注释语言、日志格式不统一 在 AGENTS.md 里写死示例
会话久了开始跑偏 定期让它重述当前约定;约定变化立刻回写 AGENTS.md
新旧实现并存 改完让它 grep 一遍旧实现的地方,确认没有留下双重逻辑

护栏四:验证

自下而上的四层,缺哪层补哪层:

  1. 能构建 / 能启动:最便宜的一道闸门,挡住语法与依赖错误。
  2. 项目自带校验:内容校验、发布卫生检查、路由生成脚本等。AI 不知道它们存在——你要把"跑一遍校验"写进验收。
  3. 主链路手工验证:一条你能亲眼看到结果的路径(页面能开、接口有返回、命令行有输出)。
  4. 自动化测试:关键逻辑单测 + 一个覆盖主流程的冒烟用例。

关键原则:让 AI 把验证输出贴给你,而不是让它说"已完成"。 它说完成和你看到绿色输出,是两件事。

由此推出一条组织级做法:CI 是规格的执行守卫。 定义了"什么是对的"(Spec、约定、lint 规则)之后,必须有一条自动化管线持续执行它。没有门禁的规格只是一纸空文——这也是为什么"本地一切正常但线上出错"这类问题会反复发生:缺的不是更聪明的模型,是一道跑在真实环境里的闸门。

在 review 环节,推荐三层过滤:

层 负责 产出
AI 自检 格式、明显缺陷、与 Spec 的一致性 先看它自己的检查清单
AI review 过滤大量低价值问题(命名、重复、遗漏边界) 机器稳定处理的部分
人工 review 业务语义、架构判断、安全深度审计 人不可替代的部分

这样安排的效果是:AI 处理量,人处理判断。 review 时间下降,但质量反而更高。

护栏五:安全校验

为什么这一栏不能省:LLM 生成带漏洞代码的比例,在不同基准下测得 9.8% 到 42.1%;到 2026 年初,生产仓库中由 AI 引入且尚未修复的问题已累积到六位数。 这些数字在不同口径下差异很大,但它们共同指向一件事:AI 生成代码的安全性不能靠假设,只能靠检查。

一道通吃的验收清单

交付前逐条打勾:

  1. 改动文件清单是否在约定范围内?
  2. 依赖有没有新增或升级?有就说明原因。
  3. lint / 构建过了吗?
  4. 项目自带的校验脚本过了吗?
  5. 主链路手工跑通了吗?
  6. 失败路径有没有处理(超时、空值、权限、依赖不可用)?
  7. 日志和错误信息里有没有敏感数据?
  8. 如果要回滚,回滚点在哪?

动手:可观察结果

把这五道护栏落到你的项目里,产出:

产出 判断标准
一条"验收命令" 一条命令同时覆盖 lint + 构建 + 项目自带校验 + 冒烟
CI 配置 每次 PR 自动执行上面那条命令,失败不可合并
AGENTS.md 更新 五道护栏写进去,成为常驻上下文
一次失败演练 故意提交一个违反 lint 的改动,确认 CI 拦住了

完成标志:你可以在不看 AI 输出的情况下,靠一条命令判断这次改动能不能合。

故障注入

注入方式 观察
删掉 lock 文件重新安装依赖 看多少次会因为上游版本变化而失败
让 AI 修 bug 时不给范围句 数 diff 里有多少无关文件
在 CI 里关掉 lint 步骤 一周后统计代码风格漂移的规模
故意让某个外部依赖超时 看有没有优雅降级,还是直接 500
把密钥硬编码进配置文件提交一次 验证 .gitignore 与扫描是否真的拦得住(在练习仓库做,别在生产仓库)

自测题

  1. 为什么"CI 是规格的执行守卫"?没有 CI 的 SDD 缺了什么?
  2. 三层 review 中,为什么人工层应该聚焦在业务语义、架构判断和安全,而不是格式?
  3. 你的项目里,那条"验收命令"是什么?如果现在说不出来,这周先把什麼补上?
  4. 变更范围限制句里,为什么"禁止重命名和重新格式化"要单独写出来?
  5. 举一个 AI 可能引入的敏感信息泄露场景,以及你会用哪道工序拦住它。

进入 keel 阅读