质量门控体系

📑 目录

这是「GSD 全景代码解析」专题的第 47 篇。

第 19 篇 中,我们初步接触了 GSD 的质量门控体系,了解了门控如何嵌入各个工作流。在 第 32 篇 中,我们解析了 gates.md 的四大门控类型和 gate-prompts.md 的 Prompt 模板。但这些内容分散在不同章节,尚未形成统一的体系视角。

本文将站在体系高度,完整梳理 GSD 的质量门控架构:从四大 Gate 类型的设计哲学,到 gate-prompts.md 的 Prompt-as-Code 实践;从检查点(Checkpoint)的触发机制,到门控如何与钩子系统、Agent 验证共同构成 Defense in Depth 的纵深防御矩阵。理解这套体系,就理解了 GSD 如何在无人监督的自主执行中守住质量底线。


一、质量门控体系概述

1.1 门控不是可选项,是基础设施

在传统的 AI 辅助编程工具中,质量检查往往是"锦上添花"——有则更好,没有也行。GSD 采取了截然相反的态度:门控是工作流的基础设施,不是可选插件

这一设计源于 GSD 的核心假设:当 Agent 获得文件系统的写入权限、Git 仓库的提交权限、乃至生产环境的部署权限时,任何质量缺陷的代价都会被放大。一个没有门控的自主 Agent,等同于一辆没有刹车的自动驾驶汽车。

GSD 的门控体系由三个核心组件构成:

flowchart TD
    subgraph "门控基础设施"
        A[gates.md
门控规则定义] B[gate-prompts.md
LLM 交互模板] C[checkpoints.md
检查点触发机制] end subgraph "执行层" D[工作流编排器] E[门控评估 Agent] F[检查点触发器] end subgraph "防御层" G[钩子系统
运行时监控] H[Agent 自验证
执行时校验] end A --> D B --> E C --> F D --> E F --> E E --> G E --> H

1.2 门控的两种语义

在 GSD 的术语体系中,"门控"有两层语义,初学者容易混淆:

语义定义对应文档典型读者
Gate(门控类型)四种 canonical 决策模式:Confirm/Quality/Safety/Transitiongates.md工作流设计者
Quality Gate(质量门控实例)嵌入工作流的具体检查点,如"代码审查门控"checkpoints.md + 工作流文件执行时 Agent

简单来说:gates.md 定义了"门有哪几种",checkpoints.md 定义了"哪里需要设门"。两者配合,才构成完整的门控体系。

1.3 门控的决策结果

无论哪种门控类型,评估后的决策结果都统一为三种状态:

结果含义后续行为
PASS(通过)所有条件满足,可以继续记录日志,推进工作流
BLOCK(阻塞)条件未满足,但可以修复返回改进指引,等待修复后重试
REJECT(拒绝)条件严重不满足,或存在不可逆风险中止或回滚,必要时升级给人类

这三种状态与 第 39 篇 中 Phase Runner 的错误处理策略(Retry / Escalate / Abort)形成映射关系,确保门控决策能够被执行层正确消化。


二、四大 Gate 类型详解

gates.md(约 8KB)精确定义了四种 canonical gate types。这四种类型不是随意划分,而是覆盖了软件开发中所有关键的决策场景:从"要不要做"到"做得好不好",从"安不安全"到"能不能进入下一阶段"。

2.1 Confirm Gate:确认门控

核心问题:这个操作是否应该执行?

Confirm Gate 是最"保守"的门控——它不对质量做判断,只要求明确授权。其决策逻辑极为严格:

## Confirm Gate

**目的**:在不可逆操作前获取明确授权
**决策逻辑**- 呈现当前操作的完整上下文
- 列出所有潜在风险
- 等待用户明确的 "yes/confirm/approve" 响应
- 任何其他响应都视为拒绝

**典型场景**- 删除生产数据库
- 部署到生产环境
- 执行大额资金操作
- 修改关键配置文件(如 payment gateway 凭证)

Confirm Gate 的设计哲学是"不信任,要确认"(Don’t Trust, Confirm)。即使 Agent 有 99% 的把握某个操作是正确的,只要该操作属于 Confirm Gate 的管辖范围,就必须停下来等待人类拍板。

第 16 篇 中,我们见到了一个典型的 Confirm Gate 实例——Ready? Gate:在生成 PROJECT.md 之前,Agent 会暂停并询问用户"我们是否已充分理解需求?",用户回答 "Keep exploring" 则继续深入,回答 "Ready" 则进入正式规划。这个设计确保了项目初始化不是草率的,而是充分共识后的产物。

2.2 Quality Gate:质量门控

核心问题:产出物是否达到了预设的质量标准?

Quality Gate 是 GSD 中使用最频繁的门控类型。它不依赖人类判断,而是通过量化指标自动做出决策:

## Quality Gate

**目的**:确保工作产出满足最低质量要求
**决策逻辑**1. 收集质量指标(测试覆盖率、代码复杂度、lint 分数等)
2. 与门控阈值对比
3. 全部达标 → 通过
4. 任一未达标 → 阻塞并返回改进建议

**可配置阈值**- `min_test_coverage: 80%`
- `max_cyclomatic_complexity: 10`
- `max_file_size: 500`
- `no_lint_errors: true`

Quality Gate 的关键设计是**"标准前置"**:质量标准不是在验证时才临时制定的,而是在 PLAN.mdgates.md 中预先定义好的。这种设计避免了"标准漂移"——如果 Verifier 在验证时自行解释什么是"足够好",不同运行之间就会产生不一致的判定。

第 25 篇 中,我们看到 gsd-code-reviewer 的审查判定与 gates.md 中的质量门控阈值深度联动:

# gates.md 中与代码审查相关的配置

quality_gate:
  code_review:
    min_coverage: 80
    max_complexity: 10
    no_critical_issues: true
    max_review_rounds: 3

Code Reviewer 不会说"这段代码看起来不错",而是会说"测试覆盖率 85% ≥ 阈值 80%,通过;圈复杂度 12 > 阈值 10,阻塞"。这种量化语言消除了主观性,使质量判定可重复、可审计。

2.3 Safety Gate:安全门控

核心问题:这个操作会对系统造成不可逆伤害吗?

Safety Gate 评估的是风险等级,而非绝对的安全性。它承认"零风险"在工程实践中是不现实的,于是采用分级策略:

## Safety Gate

**目的**:防止对系统造成不可逆伤害
**决策逻辑**1. 识别操作的风险等级(Low/Medium/High/Critical)
2. 自动处理 Low/Medium 风险
3. High 风险需要额外的确认步骤
4. Critical 风险必须人工审批

**风险评级因素**- 影响范围(单文件 / 模块 / 系统)
- 可逆性(可回滚 / 部分回滚 / 不可逆)
- 数据敏感性(公开 / 内部 / 敏感 / 机密)

Safety Gate 的风险评级矩阵是一个三维决策空间:

影响范围可逆性数据敏感性风险等级处理策略
单文件可回滚公开Low自动通过
模块部分回滚内部Medium自动通过,记录日志
系统不可逆敏感High触发 Confirm Gate
系统不可逆机密Critical必须人工审批

第 27 篇 中,gsd-security-auditor 在执行安全审查时就是 Safety Gate 的具体执行者。它不会阻止所有"可能有问题"的代码,而是根据风险等级决定是自动修复、标记警告还是暂停工作流等待人工介入。

2.4 Transition Gate:转换门控

核心问题:当前阶段真的完成了吗?可以进入下一阶段了吗?

Transition Gate 控制的是阶段间转换。它与 Quality Gate 的区别在于:Quality Gate 检查"做得好不好",Transition Gate 检查"能不能走"。

## Transition Gate

**目的**:确保阶段转换的前提条件全部满足
**决策逻辑**1. 检查源阶段的完成状态
2. 验证目标阶段的准入条件
3. 检查阶段间数据传递的完整性
4. 确认所有必要 Agent 已加载

**典型转换**- plan → execute:计划已批准且资源已分配
- execute → verify:实现已完成且自测通过
- verify → done:所有质量检查通过

Transition Gate 的一个关键设计是数据完整性检查。在 plan → execute 转换时,Transition Gate 不仅检查 PLAN.md 是否存在,还会验证:

  • PLAN.md 中引用的所有外部文件是否可访问
  • STATE.md 中的阶段标记是否与当前状态一致
  • 目标阶段需要的 Agent(如 gsd-executor)是否在上下文中可用

这种检查防止了"带着残缺计划进入执行"或"在没有 Verifier 的情况下进入验证"等结构性错误。

2.5 四大 Gate 的对比与选择

维度Confirm GateQuality GateSafety GateTransition Gate
核心问题该不该做?做得好不好?安不安全?能进入下一步吗?
决策依据人类授权量化指标风险等级前置条件清单
自动/手动必须人工全自动分级自动全自动
失败行为拒绝阻塞+改进建议按等级处理阻断转换
典型位置破坏性操作前审查节点安全敏感操作阶段边界
对应 Agent工作流编排器Verifier / Code ReviewerSecurity AuditorPhase Runner

三、gate-prompts.md 设计

3.1 Prompt-as-Code 理念

如果说 gates.md 是门控的"逻辑层",那么 gate-prompts.md 就是门控的"表示层"。它定义了门控系统如何与 LLM 交互——不是通过硬编码的字符串拼接,而是通过可版本控制、可热更新、可审计的 Prompt 模板。

## Gate Prompt 结构

每个门控类型对应一个 Prompt 模板:

### Confirm Gate Prompt
```
你正在评估一个需要用户确认的操作。

操作描述:{{operation_description}}
潜在风险:{{risks}}
影响范围:{{impact_scope}}

请生成一个清晰、完整的确认请求,包含:
1. 操作摘要
2. 具体风险清单
3. 确认指令(明确告知用户如何确认或拒绝)

注意:用户必须明确说 "yes" 或 "confirm" 才能通过。
```

### Quality Gate Prompt
```
你正在执行质量检查。

检查项:{{check_items}}
实际指标:{{actual_metrics}}
阈值要求:{{thresholds}}

请评估每个检查项是否达标,输出格式:
- 通过的项:简要说明
- 失败的项:具体问题 + 改进建议

最终判断:PASS / FAIL
```

gate-prompts.md 的设计体现了 GSD 的**提示词即代码(Prompt-as-Code)**理念:

  1. 可版本控制:Prompt 模板与代码一同提交到 Git,每次修改都有历史记录
  2. 可热更新:修改 Prompt 无需重启系统,下次门控触发时自动生效
  3. 可 A/B 测试:可以并行测试不同 Prompt 的效果,选择输出更稳定的版本
  4. 可审计:每次门控决策都保留了使用的 Prompt 版本,便于事后追溯

3.2 模板变量与上下文注入

gate-prompts.md 中的模板不是静态文本,而是带有变量的动态模板。变量替换由门控评估 Agent 在执行时完成:

### Safety Gate Prompt
```
你正在评估一个操作的安全风险。

操作类型:{{operation_type}}
目标文件:{{target_files}}
当前权限:{{current_permissions}}
环境标识:{{environment}}  <!-- dev / staging / production -->

请根据以下矩阵评估风险等级:
- Low:只读操作,公开数据
- Medium:文件修改,内部数据
- High:配置变更,敏感数据
- Critical:数据删除/部署,机密数据

风险等级:____
处理建议:____
```

关键设计细节:environment 变量的注入。同一个"删除临时文件"的操作,在 dev 环境下可能是 Low 风险,在 production 环境下可能是 High 风险。gate-prompts.md 通过环境变量动态调整评估标准,避免了"一刀切"的安全策略。

3.3 Prompt 的工程化管理

GSD 对 gate-prompts.md 的管理遵循与代码相同的工程规范:

版本标记

<!-- gate-prompts.md -->
# Gate Prompts v2.3.1
# 最后更新:2026-04-20
# 变更记录:
# - v2.3.1: 优化 Quality Gate 的输出格式,增加"改进优先级"字段
# - v2.3.0: 新增 Safety Gate 的环境感知逻辑

单元测试
GSD 的测试套件中包含 Prompt 模板验证测试,确保:

  • 所有模板变量都有对应的替换逻辑
  • 模板渲染后的输出符合预期的 JSON/Markdown 结构
  • 不会出现未闭合的标签或未替换的 {{variable}}

分级策略
不同 tier 的项目可以使用不同版本的 gate-prompts.md。例如:

  • tier-1(个人项目):使用宽松模板,减少阻塞
  • tier-3(团队项目):使用标准模板
  • tier-5(生产系统):使用严格模板,增加额外的确认步骤

四、检查点机制

4.1 检查点与门控的关系

第 32 篇 中,我们用一句话概括了检查点和门控的区别:"检查点是路标,门控是关卡"。路标告诉你到了哪里,关卡决定你能不能继续走。

flowchart LR
    subgraph "检查点 Checkpoint"
        C1[CP-PLAN-01
计划完整性] C2[CP-EXEC-01
实现完整性] C3[CP-QUAL-01
代码质量] end subgraph "门控 Gate" G1[Quality Gate
质量标准评估] G2[Transition Gate
阶段转换检查] end C1 -->|触发| G1 C2 -->|触发| G1 C3 -->|触发| G1 C2 -->|触发| G2

这种分离设计的优势在于解耦和复用

  • 一个检查点可以触发多个门控(如 CP-EXEC-01 同时触发 Quality Gate 和 Transition Gate)
  • 一个门控可以被多个检查点复用(如 Quality Gate 在 CP-PLAN-01CP-EXEC-01CP-QUAL-01 中都发挥作用)

4.2 检查点的触发机制

checkpoints.md 中定义了五种触发机制,使检查点能够无缝集成到工作流中:

触发机制说明示例
Phase 边界触发工作流阶段转换时自动触发plan → execute 转换时触发 CP-PLAN-02
Agent 完成触发特定 Agent 完成工作时触发Executor 完成时触发 CP-EXEC-01
文件变更触发检测到特定文件变更时触发修改 *.config.js 时触发 CP-SAFE-01
时间触发定时检查长时间运行任务每 30 分钟触发 CP-STATE-01
手动触发用户或 Agent 显式触发/gsd checkpoint CP-QUAL-01

第 14 篇 中,我们见到了 execute-phase 中检查点的实际应用。当计划包含 type="checkpoint:*" 任务时,gsd-executor 会在检查点处精确停止并返回结构化状态:

## CHECKPOINT REACHED

**Type:** human-verify
**Plan:** 03-03
**Progress:** 2/3 tasks complete

### Completed Tasks
| Task | Name | Commit | Files |
| ---- | ---- | ------ | ----- |
| 1 | 搭建布局框架 | a1b2c3d | src/layout/... |

### Current Task
**Task 3:** Dashboard 组件集成
**Status:** awaiting verification
**Blocked by:** 需要用户确认视觉效果

### Checkpoint Details
[已构建内容、验证步骤、预期行为]

### Awaiting
[用户需要提供/执行的操作]

这个结构化消息是检查点协议的精髓:它不仅告诉用户"我停下来了",还提供了完整的上下文——已完成什么、当前在哪、需要什么、为什么需要。用户无需回溯对话历史,就能在检查点处无缝接续工作。

4.3 检查点的失败处理策略

checkpoints.md 定义了三种标准化的失败处理策略:

Retry(重试)

  • 适用:临时性问题(如网络超时、文件锁定)
  • 行为:返回上一步重新执行,最多重试 3 次
  • 配置:max_retries: 3, backoff: exponential

Escalate(升级)

  • 适用:需要更多上下文或权限的问题
  • 行为:将问题升级给更高级别的 Agent 或用户
  • 配置:escalate_to: gsd-planner | user

Abort(中止)

  • 适用:无法自动恢复的致命错误
  • 行为:保存当前状态,中止工作流,等待人工介入
  • 配置:save_state: true, notify: user

第 14 篇 的"偏差处理"中,我们看到 Retry 策略的实际运用:当 Executor 遇到未预见的问题时,它会尝试自动修复(Rule 1-3),这本质上就是 Retry 策略的实例化。

4.4 分层检查点体系

GSD 的检查点不是平铺的,而是具有清晰的层次结构,与门控的层次形成映射:

层次检查点 ID触发时机关联门控
L0CP-INIT-01项目初始化完成Transition Gate
L1CP-PLAN-01计划制定完成Quality Gate
L2CP-EXEC-01每个 Wave 完成Quality Gate + Safety Gate
L3CP-QUAL-01阶段验证启动Quality Gate
L4CP-AUDIT-01里程碑审计Confirm Gate + Safety Gate
L5CP-UAT-01UAT 验收Confirm Gate

这种分层设计的优势在于问题早发现、资源合理分配、反馈延迟递减——越靠近开发的检查点,反馈越快;越靠近交付的检查点,检查越全面。


五、门控与 Defense in Depth 的关系

5.1 纵深防御:不是单一防线,而是多层矩阵

第 3 篇 中,我们首次接触了 Defense in Depth(纵深防御)的概念。在 第 44 篇 中,我们看到了钩子系统如何构成运行时的被动防御网。现在,让我们将门控体系放入 Defense in Depth 的完整框架中,看看各层防御如何协同工作。

flowchart TD
    subgraph "L1: 规范层"
        A[参考文档体系
REQUIREMENTS.md / PLAN.md / gates.md] end subgraph "L2: 编排层" B[Phase Runner 生命周期钩子
before / after / around / onError] C[工作流门控
Confirm / Quality / Safety / Transition] end subgraph "L3: Agent 层" D[Agent 自验证
Plan-Checker / Verifier / Code Reviewer] end subgraph "L4: 运行时层" E[运行时钩子
prompt-guard / read-guard / workflow-guard] F[检查点协议
Checkpoint Protocol] end subgraph "L5: 基础设施层" G[测试覆盖
≥70% 核心路径] H[版本控制
Git 原子提交 / 回滚] end A --> B B --> C C --> D D --> E E --> F F --> G G --> H style A fill:#e1f5fe style C fill:#fff3e0 style E fill:#e8f5e9

门控体系(L2 编排层)处于 Defense in Depth 的核心位置。它上承规范层(gates.md 中定义的质量标准),下启 Agent 层(触发 Plan-Checker、Verifier 等验证 Agent),同时与运行时层紧密协作(检查点协议处理中断和恢复)。

5.2 各层防御的职责边界

层级防御机制主要职责失败行为与门控的关系
L1 规范层参考文档定义"什么是对的"无法执行门控的判定标准来源
L2 编排层Phase Runner 钩子阶段级流程控制阻断阶段门控的执行框架
L2 编排层工作流门控质量/安全/转换决策PASS/BLOCK/REJECT本文核心
L3 Agent 层Agent 自验证产出物质量审查返回修订门控的评估执行者
L4 运行时层运行时钩子工具级安全监控警告记录门控的补充监控
L4 运行时层检查点协议人机协作中断暂停等待门控的人工介入通道
L5 基础设施层测试覆盖自动化回归验证CI 失败门控的量化指标来源
L5 基础设施层版本控制变更追踪与回滚可恢复门控失败后的兜底

关键设计原则:任何一层发现问题都可以阻止缺陷向下游传播。如果一个 bug 逃过了 L3 Agent 的自验证,L4 的运行时钩子可能通过 gsd-read-guard 发现未读取文件的 Edit 操作;如果钩子也没发现,L5 的测试覆盖可能在回归测试中捕获它。门控体系的价值不在于"拦截所有问题",而在于"不给问题逃逸的机会"。

5.3 门控矩阵:从文档到执行的映射

第 3 篇 中的门控矩阵与 第 19 篇 中的嵌入点结合,我们可以得到 GSD 完整的门控矩阵:

工作流阶段Gate 类型检查对象失败行为Defense in Depth 层级
new-project入口Pre-flight (Transition)项目结构合规阻断,提示缺失文件L2
plan-phase入口Pre-flight (Transition)REQUIREMENTS.mdROADMAP.md阻断,提示缺失文件L2
plan-phase步骤 12Revision (Quality)PLAN.md 质量循环至 planner(最多 3 次)L3
plan-phase修订后Escalation (Confirm)未解决问题surfaced 给开发者L4
execute-phase入口Pre-flight (Transition)PLAN.md阻断,提示缺失计划L2
execute-phaseWave 完成Revision (Quality)代码审查、回归测试返回修复L3
execute-phase漂移检测SafetySchema/Codebase Drift警告或阻断L4
verify-work入口Pre-flight (Transition)SUMMARY.md阻断,提示缺失摘要L2
verify-work评估时Escalation (Confirm)未满足标准surfaced gapL3
next入口Abort (Safety)Error state、checkpoints停止,输出诊断L2

这个矩阵揭示了 Defense in Depth 的一个关键特征:同一工作流中,不同阶段的门控类型和严格程度是动态变化的。例如 execute-phase 在入口使用严格的 Transition Gate(没有计划就不让进),在 Wave 完成时使用 Quality Gate(代码不好就修),在漂移检测时使用 Safety Gate(有风险就警告)。这种"松紧结合"的策略既保证了安全性,又避免了过度阻塞开发效率。

5.4 70% 测试覆盖线的意义

第 3 篇 中,我们提到 GSD 对关键路径有 70% 的测试覆盖要求。这个数字与门控体系有深层关联:

tests/workflow-size-budget.test.cjs 等工作流预算测试确保:

  • 每个工作流文件不超过其 tier 的行数上限
  • Agent 定义不超过 50K 字符(某些 runtime 的限制)
  • CLI 模块的核心函数有单元测试覆盖

70% 覆盖线不是随意设定的数字,它对应着「核心编排逻辑 + 状态管理 + 安全校验」这三条关键路径的交集。低于此线意味着某个 gate 或 hook 可能在未经测试的情况下被绕过。在 Defense in Depth 的框架中,未经测试的防御层等于没有防御层。


六、总结

GSD 的质量门控体系是一套精心设计的多层决策基础设施,它通过四种 canonical gate types(Confirm/Quality/Safety/Transition)覆盖了软件开发中所有关键的决策场景,通过 gate-prompts.md 实现了 Prompt-as-Code 的工程化管理,通过检查点机制建立了人机协作的精确中断协议。

这套体系的核心设计原则可以总结为三点:

1. 标准前置,判定后置
质量标准在 gates.mdPLAN.md 中预先定义,而不是在验证时临时解释。这消除了主观性,确保了判定的一致性和可审计性。

2. 分层防御,协同拦截
门控不是孤立存在的。它与 Phase Runner 钩子、Agent 自验证、运行时钩子、测试覆盖共同构成 Defense in Depth 矩阵。任何一层发现问题都可以阻止缺陷向下游传播。

3. 人机协作,精确中断
检查点协议不是简单的"停下来问用户",而是提供完整的上下文快照——已完成什么、当前在哪、需要什么、为什么需要。这种精确中断使人类能够在不丢失上下文的情况下接管决策。


下一篇预告: 第 48 篇《测试架构总览:三层测试金字塔与 23 个测试文件全景》

我们将进入「质量门控、测试与实战」章节,解析 GSD 的三层测试金字塔、23 个测试文件的组织结构,以及测试策略选择和覆盖率目标。敬请期待。