速读#
大模型(LLM)编程在社区中正呈现剧烈的两极分化:一极是宣扬“一句话生成全栈应用”的 Vibe Coding(凭感觉编码),另一极则是真实中大型工程中 Agent 频繁出现的代码退化、注意力衰减、幻觉编造与架构崩塌。
大模型本质上是一个“基于概率分布的补全机器”,天生具备谄媚假设、缺乏全局物理边界、倾向散弹枪式修 Bug 等工程绝症。要让 AI 真正进入工业级软件生产流水线,唯一可行的解法不是祈祷模型变得更聪明,而是用严苛的软件工程外骨骼对其进行物理约束——建立基于“需求极限拷打、抛弃型原型、唯一真实源 Spec、垂直切片上下文沙箱、TDD 刚性门禁与 6 步根因诊断”的 Spec-Driven Agentic Engineering(契约驱动 Agent 工程) 全生命周期。
1. 范式转移:从 Vibe Coding 到 Spec-Driven 契约工程#
| 维度 | Vibe Coding(凭感觉编码) | Spec-Driven(契约驱动工程) |
|---|---|---|
| 需求输入 | 一两句草率提示词,隐藏大量未明确假设 | 极限质询(grill-me),穷举边界与异常分支 |
| 设计收敛 | 边想边写,直接生成几百行单体代码 | 唯一真实源 Spec,先定数据不变式与类型契约 |
| 任务执行 | 单会话全局轰炸,引发注意力非线性衰减 | 垂直切片(to-tickets),沙箱隔离上下文与文件范围 |
| 质量门禁 | 依赖肉眼抽查或 Agent 自行宣称“已搞定” | TDD 刚性红绿循环,测试未红严禁写业务实现 |
| 缺陷修复 | 散弹枪式盲修,修一个语法错引出三个回归 | 6 步根因诊断(RCA),最小复现并永久固化为单测 |
1.1 大模型的四大工程绝症#
在缺乏外部工程外骨骼约束时,Agent 必然会在中大型代码库中遭遇以下四种崩溃:
- 谄媚与盲目假设(Sycophancy & Ungrounded Assumptions)
模型天生具备“讨好型人格”,面对漏洞百出的草率需求不会主动质疑,而是用幻觉补全逻辑,输出看似跑得通但脱离真实业务边界的代码。 - 上下文退化(Context Rot & Attention Degradation)
长对话中注意力呈非线性衰减。试图在一个长会话中做完整套系统的 Agent,通常在 5 轮交互后就开始忘记命名规范、破坏分层契约。 - 无护栏放水(Unguarded Drift)
缺乏刚性断言契约时,模型倾向于只编写 Happy Path,忽略边界溢出、异常捕获、网络抖动与并发竞争。 - 散弹枪式盲修(Shotgun Debugging)
遇到报错时,模型本能地“胡乱修改几行代码碰运气”,修好一个浅层语法错,引出三个隐蔽的跨模块架构级逻辑回归。
2. 全景流水线与六大阶段#
整条链路将传统软件工程的契约严谨性与 AI Agent 的高吞吐执行力深度咬合,形成 6 步标准作业规程(SOP):

2.1 全景流程与阶段门禁矩阵#
整条流水线在每个关键交接点均设立了刚性阻断门禁,防止上游的不确定性污染下游执行:
| 阶段 | 核心 Skill | 主要输入 / 输出 | 质量门禁与准出条件 |
|---|---|---|---|
| Stage 1 | grill-me (需求质询) | 原始诉求 边界澄清记录、更新 CONTEXT.md | 消除所有隐性分歧,完成领域概念对齐 |
| Stage 2 | prototype (探路验证) | 高危未知点 独立 scratch/poc.ts | 仅做技术可行性摸底,产物必须就地抛弃 |
| Stage 3 | to-spec (契约固化) | 质询共识 结构化系统规格书 (SPEC-xxx.md) | 【门禁 1】人类架构师审查签批,作为 SSOT |
| Stage 4 | to-tickets (垂直切片) | 系统 Spec 有向无环任务图 (Task DAG) | 【门禁 2】审查上下文沙箱范围(改动文件 ) |
| Stage 5 | tdd (测试驱动) | 单 Ticket 沙箱 单元测试 + 业务代码 + 原子 Commit | 【门禁 3】红绿重构法庭,自动化测试 100% 通过 |
| Stage 6 | diagnose (根因诊断) | 集成异常 最小失败复现 + 防御性测试补丁 | 严禁散弹枪盲修,必须建立可复现测试证据链 |
3. 六大核心 Skill 的底层机制与实现#
3.1 grill-me / grill-with-docs:从“迎合型助手”到“杠精架构师”#
- 机制反转:彻底剥夺 Agent 的代码编写权限,强行将 System Prompt 设定为“具备攻击性的 Principal Architect”。
常规迎合型 Prompt
用户:“我要加个收藏功能。”
Agent:“好的,这是完整的收藏表结构和 Controller 代码……”(直接放水,留下一堆未定义的边界漏洞)
grill-me 架构师反向质询
用户:“我要加个收藏功能。”
Agent(Principal Architect):
- 量级与性能:收藏的数据量级预期是多少?是否需要支持千万级离线导出或游标分页?
- 级联生命周期:用户注销账号或被封禁时,被收藏实体的引用关系如何级联处理?是否支持软删除恢复?
- 并发与幂等:网络抖动下客户端连续狂点,去重策略与服务端的幂等键(Idempotency Key)如何设计?
- 复用与抽象:查阅已有代码库发现已存在
tag_system,为什么不复用现有的多对多标签抽象?
- 状态化演进 (
grill-with-docs):
质询不仅停留在口头,而是同步解析并更新仓库内的CONTEXT.md(统一领域名词/术语表)和ADR/(架构决策记录)。在进入下一阶段前,所有隐性分歧必须显性化为文字契约。
3.2 prototype:抛弃型探路 Spike(Throwaway PoC)#
- 核心原则:不进入主代码树,不写完整测试,不追求架构优雅。
- 应用场景:第三方未经验证的 SDK 兼容性测试、WebAssembly 性能临界摸底、复杂交互手感验证。
- 交付约束:产出一个独立单文件(如
scratch/poc.ts或单 HTML 页面)以及一份spike_findings.md。核心结论直接回灌至 Spec。验证完毕后立即丢弃原型代码,防止“临时代码永久上线”。
3.3 to-prd / to-spec:铸造系统唯一真实源(Single Source of Truth)#
- 核心作用:将散落的对话共识收敛为可执行的工业级规范。
<!-- 标准 Spec 结构契约示例 --># SPEC-042: 分布式任务调度器重构
## 1. 契约边界 (Boundary & Invariants)- **不变式 (Invariant)**: 同一 JobID 在任意时刻至多被 1 个 Worker 消费 (At-most-once)。- **SLA 契约**: 调度延迟 P99 < 50ms; 失败重试上限 3 次,指数退避基数 2s。
## 2. API 契约与 Schema (Type-level Strictness)- 严禁使用 any / loose object; 所有 I/O 必须定义 Zod Schema 或 Protobuf。
## 3. 破坏性影响与降级方案 (Blast Radius)- 旧版 Redis 队列迁移策略:双写校验 -> 灰度读取 -> 数据下线。3.4 to-issues / to-tickets:上下文沙箱化与垂直切片(Vertical Slicing)#
- 垂直切片原则(Vertical Slice Architecture):每个 Ticket 必须贯穿完整的“接口-逻辑-存储”,形成一个端到端可独立验证的最小闭环。严禁按“前端、后端、数据库”等横向层级拆分任务。
- 上下文沙箱隔离(Context Sandboxing):
- 输入隔离:每个 Ticket 只注入与本任务严格相关的 Spec 章节与局部代码片段;
- 输出隔离:严格限制 Ticket 修改的文件集合(Allowed Files Scope )。
# Ticket 元数据沙箱契约示例ticket: id: "TKT-108" title: "实现支付超时自动取消状态机" scope: allowed_files: - src/order/state_machine.ts - tests/order/state.test.ts forbidden_files: - src/payment/** dependencies: blocked_by: ["TKT-106"] definition_of_done: - "编写 5 组状态流转单测(含异常回滚与超时并发分支),覆盖率 100%" - "终端运行 npm run test:order 必须全绿" - "严禁引入外部未声明的第三方库依赖"3.5 tdd:红绿重构与确定性法庭#
TDD 流程构建了不可逾越的机器法庭,彻底杜绝 Agent 偷工减料与断言放水:

- Phase 1: Red(编写测试 · 强制失败验证):先写单测,运行必须明确报错(防止假绿测试或无意义断言)。
- Phase 2: Green(编写实现 · 最小代码跑通):编写刚好满足测试用例的业务代码,驱动终端全绿。
- Phase 3: Refactor(架构重构 · 消除坏味道):在绿灯保护下清理冗余、优化命名与类型定义。
- Phase 4: Done(质量门禁 · 原子交付):自动化测试套件 100% 通过,输出单任务原子 Commit。
3.6 diagnose / diagnosing-bugs:根因分析 6 步法#
当系统在集成测试或运行期爆发隐蔽缺陷时,严禁直接让 Agent 修改业务代码,必须进入标准 6 步诊断法:

| 步骤 | 阶段定义 | 核心操作规程 | 交付物/门禁 |
|---|---|---|---|
| Step 1 | Reproduce(捕获与复现) | 收集异常堆栈、环境变量、脏数据快照,建立稳定触发条件。 | 可复现的环境/脚本 |
| Step 2 | Minimise(最小化隔离) | 剥离所有无关外部依赖,将问题缩减为 10 行以内的最小失败用例。 | Minimal Repro Case |
| Step 3 | Hypothesise(根因假说) | 基于调用链路与状态机推导根本原因,提出 2 个以上互斥假说。 | RCA 假说推导记录 |
| Step 4 | Instrument(探针插桩) | 插入结构化日志与断言探针,验证并证伪假说,锁定病灶行。 | 探针日志证据链 |
| Step 5 | Fix(精准修复) | 实施外科手术式精准修改,严禁过度重构周边无关逻辑。 | 针对性补丁 Diff |
| Step 6 | Regression(回归防御) | 将步骤 2 的最小复现用例永久转为单元回归测试,确保免疫。 | 新增持久化单测 |
4. 工业化落地路线与避坑指南#
4.1 警惕三类反模式(Anti-Patterns)#
1. 测试剧场反模式(Test Theater)#
- 现象:Agent 声称测试全绿,但代码上线即崩。
- 根因:Agent 编写了大量
expect(true).toBe(true)、假 Mock 或无意义的浅层断言。 - 解法:在门禁中加入**变异测试(Mutation Testing)**或人工审查测试用例中的 Assert 真实覆盖度。
2. 仪式感过载反模式(Process Bloat)#
- 现象:改一个文案、调一个样式,也要跑一遍
grill-me -> to-prd -> tdd。 - 解法:实施分级路由机制(Fast-Track):
- L3(重载架构):完整 6 步(大型特性/复杂分布式重构);
- L2(常规迭代):
grill-meto-issuestdd; - L1(局部微调):直接原子变更 + 自动化 CI 校验。
3. 上下文串供反模式(Context Leaking)#
- 现象:在一个长会话中依次执行 Ticket 1 Ticket 5。
- 根因:会话历史中的过往错误和中间调试垃圾严重污染了 Agent 的注意力窗口。
- 解法:Ticket 级会话焚毁机制(One-Session-Per-Ticket)。每完成一个 Ticket,立即销毁当前 Agent 上下文,新建空白环境并仅注入下一个 Ticket 的必要依赖。
5. 模式对比与工程收益#
| 对比维度 | 传统 Vibe Coding 模式 | Spec-Driven 闭环模式 | 工程机制解析 |
|---|---|---|---|
| 代码首次可用度 | 频繁陷入“看似完成实则漏边界”的返工 | 单次 Ticket 闭环收敛 | 需求在 grill-me 阶段已被极限推演,无隐藏假设 |
| 跨模块逻辑回归 | 散弹枪式盲修,修一个坏三个 | 受 TDD 与 6 步 RCA 固化保护 | 每个历史缺陷均转为永久单测防御,免疫同类故障 |
| Token 消耗曲线 | 会话拉长导致消耗指数级爆炸 | 线性恒定(O(1) 上下文) | 上下文沙箱与 Ticket 级会话焚毁消除历史垃圾 |
| 团队资产沉淀 | 仅残存难以维护的散乱代码 | 完备的 ADR、Spec 文档与单测资产 | 人类掌控架构蓝图,AI 负责高吞吐实现 |
6. 结语:重塑 AI 时代的工程师价值#
这套流水线的本质在于:它宣告了“打字型程序员”的黄昏,开启了“系统架构师与质量评审官”的黄金时代。
顶尖工程师的核心护城河,不再体现在写基础样板代码的速度,而体现在:
- 能否在
grill-me阶段洞察最隐蔽的业务边界与系统失效模式; - 能否在
to-prd阶段设计出高内聚、低耦合、强类型约束的领域模型; - 能否在
to-issues阶段完成精准的上下文沙箱切分与依赖编排。
把不确定的业务探索留给人类架构思考,把确定性的实现交给测试护栏,让 AI 真正成为工业级软件交付的高效外骨骼。
