这是「GSD 全景代码解析」专题的第 23 篇。在前面的章节中,我们系统梳理了 GSD 的命令系统、工作流编排和规划体系。从本篇开始,我们将进入Agent 系统章节,逐层拆解 GSD 中各个 Agent 的设计哲学、角色定义和协作机制。首先登场的是 GSD 最大的 Agent 定义——
gsd-planner.md(46KB),以及它的"质量守门人"gsd-plan-checker。
一、gsd-planner.md 概览
gsd-planner.md 是 GSD 仓库中体积最大的 Agent 定义文件,约 46KB。这一体量本身就说明了规划在 GSD 体系中的核心地位——规划 Agent 是整个框架的"战略大脑",它需要将模糊的人类意图转化为精确、可执行、可验证的工程计划。
在 GSD 的 Agent 谱系中,planner 不是简单的"任务列表生成器"。它是一个具备完整软件工程思维的架构师角色:
flowchart TB
subgraph "gsd-planner 能力矩阵"
A1["需求工程"]
A2["技术架构"]
A3["任务分解"]
A4["风险评估"]
A5["资源估算"]
A6["依赖管理"]
end
subgraph "输出物"
B1[ROADMAP.md]
B2["phases/*.md"]
B3["技术方案文档"]
B4["风险登记册"]
end
A1 --> B1
A2 --> B3
A3 --> B2
A4 --> B4
A5 --> B1
A6 --> B2与其他 Agent 相比,planner 的独特之处在于它同时承担创造性思维和系统性验证的双重职责:既要产出创新的技术方案,又要确保方案在工程上的可执行性。
二、Agent 的角色定义和工作方式
2.1 角色定位:架构师 + 项目经理
gsd-planner.md 在 frontmatter 中明确定义了 Agent 的角色:
---
agent: gsd-planner
role: Strategic Planning Architect
model_tier: reasoning # 必须使用思考类模型
collaborators:
- gsd-phase-researcher
- gsd-plan-checker
- gsd-spec-writer
context_budget:
max_tokens: 200000
reserve_for_checker: 15000
---这个角色定义包含三个关键信息:
- model_tier: reasoning:planner 被强制要求使用推理类模型,这与 GSD 其他 Agent(如 executor 可以使用 fast 模型)形成鲜明对比
- context_budget 管理:planner 拥有最高的上下文预算(200K tokens),但会为 plan-checker 预留 15K tokens 的验证空间
- 协作者网络:planner 不是孤立的,它明确知道自己可以与 researcher、checker、spec-writer 协作
2.2 工作模式:多轮对话 + 结构化输出
planner 的工作方式遵循一个固定的五阶段循环:
sequenceDiagram
participant User as "用户/命令"
participant Planner as gsd-planner
participant Context as ".planning/ 上下文"
participant Checker as gsd-plan-checker
User->>Planner: 触发规划(idea / ROADMAP / 需求变更)
Planner->>Context: 读取 PROJECT.md + REQUIREMENTS.md
Planner->>Planner: 阶段1:需求解构
Planner->>Planner: 阶段2:技术方案设计
Planner->>Context: 读取 references/(如存在)
Planner->>Planner: 阶段3:任务分解
Planner->>Planner: 阶段4:Chunked Plan 组装
Planner->>Checker: 提交计划验证
Checker->>Planner: 验证报告(通过/缺陷列表)
alt 验证失败
Planner->>Planner: 阶段5:计划修订
Planner->>Checker: 重新提交验证
end
Planner->>Context: 写入 ROADMAP.md + phases/*.md
Planner->>User: 返回规划摘要2.3 上下文注入策略
planner 的 46KB 定义中,很大一部分是上下文注入规则。GSD 采用 XML 格式化的结构化 prompt,确保 planner 在接收上下文时不会"迷失":
<planner_context>
<project>
<name>{project_name}</name>
<tech_stack>{tech_stack}</tech_stack>
<constraints>{constraints}</constraints>
</project>
<requirements>
<functional>{fr_list}</functional>
<non_functional>{nfr_list}</non_functional>
</requirements>
<existing_state>
<roadmap>{current_roadmap}</roadmap>
<completed_phases>{completed}</completed_phases>
<active_phase>{active}</active_phase>
</existing_state>
<references>
<research_docs>{research_summaries}</research_docs>
<spike_reports>{spike_findings}</spike_findings>
</references>
</planner_context>这种 XML 结构化注入的好处是:
- 语义明确:每个标签有明确含义,减少模型理解偏差
- 层级清晰:项目 → 需求 → 状态 → 参考文档,层次分明
- 易于裁剪:可以根据上下文预算,选择性注入某些标签内容
三、需求分解策略
3.1 从模糊想法到结构化需求
planner 的第一步是需求解构(Requirement Deconstruction)。GSD 不假设用户输入是结构化的——它可能是一句话、一段描述,甚至是一系列零散的想法。
planner 采用五维需求提取框架:
| 维度 | 提取目标 | 输出格式 |
|---|---|---|
| 功能需求(FR) | 系统必须做什么 | FR-001 ~ FR-NNN,带优先级 P0/P1/P2 |
| 非功能需求(NFR) | 系统必须做到什么程度 | NFR-001 ~ NFR-NNN,带量化指标 |
| 约束条件 | 不可逾越的边界 | 技术约束、时间约束、预算约束 |
| 假设前提 | 规划成立的基础 | ASSUME-001,需在执行中验证 |
| 风险因素 | 可能导致计划失败的因素 | RISK-001,带概率和影响评估 |
flowchart LR
A["用户输入"] --> B{结构化程度?}
B -->|"自然语言描述"| C["Dream Extraction"]
B -->|"部分结构化"| D["补全与规范化"]
B -->|"完全结构化"| E["直接解析"]
C --> F["五维需求框架"]
D --> F
E --> F
F --> G["FR 列表"]
F --> H["NFR 列表"]
F --> I["约束/假设/风险"]3.2 需求依赖图构建
提取需求后,planner 会构建需求依赖图(Requirement Dependency Graph):
flowchart TD
FR001["FR-001: 用户注册"] --> FR002["FR-002: 用户登录"]
FR001 --> FR003["FR-003: 邮箱验证"]
FR002 --> FR004["FR-004: 密码重置"]
FR002 --> FR005["FR-005: JWT Token 颁发"]
FR005 --> FR006["FR-006: API 鉴权中间件"]
FR006 --> FR007["FR-007: 受保护资源访问"]
NFR001["NFR-001: 响应时间 < 200ms"] -.-> FR002
NFR002["NFR-002: 密码 bcrypt 加密"] -.-> FR001依赖图的构建遵循三条规则:
- 功能依赖:A 功能必须在 B 功能之前实现(如必须先注册才能登录)
- 数据依赖:A 功能产生的数据是 B 功能的输入(如必须先设计 Schema 才能写 Repository)
- 技术依赖:A 技术是 B 技术的基础(如必须先配置数据库连接才能写 Migration)
3.3 需求优先级动态评估
planner 不是静态地分配 P0/P1/P2,而是基于四象限动态评估:
quadrantChart
title 需求优先级四象限
x-axis 低业务价值 --> 高业务价值
y-axis 低技术风险 --> 高技术风险
quadrant-1 高风险高价值:重点攻坚
quadrant-2 低风险高价值:快速交付
quadrant-3 低风险低价值:延后或裁剪
quadrant-4 高风险低价值:Spike 验证或放弃
"FR-001 用户注册": [0.8, 0.2]
"FR-010 实时协作": [0.9, 0.8]
"FR-015 深色模式": [0.3, 0.1]
"FR-020 区块链存证": [0.4, 0.9]这种动态评估让 planner 能够在资源有限时做出更合理的取舍,而不是机械地按照用户声明的优先级执行。
四、技术方案设计
4.1 架构决策记录(ADR)
planner 在技术方案设计阶段会生成架构决策记录(Architecture Decision Records)。这些记录不是形式化的文档,而是嵌入在 plan 中的思考轨迹:
## ADR-001: 数据库选型
**上下文**:项目需要支持高并发读写,数据关系复杂。
**考虑方案**:
- PostgreSQL + Redis:关系型 + 缓存,成熟稳定
- MongoDB:灵活 Schema,适合快速迭代
- TiDB:分布式 NewSQL,水平扩展
**决策**:PostgreSQL + Redis
**理由**:
1. 数据关系复杂(用户-订单-支付-物流),关系型数据库更适合
2. 团队已有 PostgreSQL 运维经验
3. ACID 事务对金融相关操作是硬性要求
**风险**:单节点 PostgreSQL 可能成为瓶颈,需在 Phase 3 评估读写分离每个 ADR 包含五个要素:上下文、考虑方案、决策、理由、风险。这种结构化的决策记录使得 plan-checker 可以回溯验证每个技术选择的合理性。
4.2 技术栈一致性检查
planner 在设计技术方案时,必须遵守 PROJECT.md 中声明的技术栈约束:
flowchart LR
A["PROJECT.md
tech_stack"] --> B{planner 技术方案}
B -->|"一致"| C["继续规划"]
B -->|"偏离"| D{是否有理由?}
D -->|"有(性能/兼容性/生态)"| E["生成 ADR 说明偏离原因"]
D -->|"无"| F["回退到声明技术栈"]
E --> C
F --> C如果 planner 建议使用未声明的技术(例如在 React 项目中引入 Vue),它必须提供充分的 ADR 论证。plan-checker 会在验证阶段重点检查这些偏离项。
4.3 与 references/ 文档的协作
当项目目录中存在 references/ 文件夹时,planner 会将其视为权威信息源。
sequenceDiagram
participant Planner as gsd-planner
participant Refs as references/*.md
participant Plan as "生成的 Plan"
Planner->>Refs: 扫描 references/ 目录
Planner->>Refs: 读取相关研究文档
Refs->>Planner: 技术选型建议、竞品分析、架构参考
Planner->>Planner: 将研究发现融入技术方案
Planner->>Plan: 在 Plan 中引用 references
Plan->>Plan: 标注 ["REF: research-auth-20260420"]引用格式采用 [REF: filename] 标记,例如:
## 认证方案
采用 OAuth 2.0 + JWT 的混合认证模式 [REF: research-auth-protocols-20260420]。
根据研究文档的对比分析:
- Session 方案:适合传统服务端渲染,但不符合本项目 SPA 架构 [REF: research-auth-20260420#section-3]
- 纯 JWT:无状态,适合微服务,但注销和续期较复杂
- OAuth 2.0 + JWT:支持第三方登录,同时保持无状态优势这种引用机制的好处是:
- 可追溯:每个技术决策都有信息来源
- 可更新:当 references 更新时,plan-checker 可以标记需要重新评估的 plan
- 可验证:reviewer 可以对照原始研究验证决策是否合理
五、任务分解和计划生成
5.1 分层分解模型
planner 的任务分解采用四阶分层模型:
| 层级 | 粒度 | 时间跨度 | 负责人 | 存储位置 |
|---|---|---|---|---|
| Epic | 子系统/业务域 | 2-4 周 | 架构师 | ROADMAP.md |
| Milestone | 可交付功能集 | 3-7 天 | 技术 Lead | ROADMAP.md |
| Task | 单次开发单元 | 2-4 小时 | 开发者/Agent | phases/*.md |
| Sub-task | 最小执行单元 | 15-30 分钟 | 开发者/Agent | phases/*.md |
flowchart TD
A["项目目标"] --> B1["Epic: 用户系统"]
A --> B2["Epic: 订单系统"]
A --> B3["Epic: 支付系统"]
B1 --> C1["Milestone: 注册登录"]
B1 --> C2["Milestone: 用户管理"]
B2 --> C3["Milestone: 购物车"]
B2 --> C4["Milestone: 订单流转"]
C1 --> D1["Task: API 设计"]
C1 --> D2["Task: 密码安全实现"]
C1 --> D3["Task: 前端登录页"]
D2 --> E1["Sub-task: bcrypt 集成"]
D2 --> E2["Sub-task: 密码强度校验"]
D2 --> E3["Sub-task: 加盐策略实现"]5.2 任务元数据规范
每个 Task 必须包含完整的元数据:
---
task_id: T-001
epic: 用户系统
milestone: 注册登录
title: 实现用户注册 API
priority: P0
estimated_effort: 2h
assigned_to: gsd-executor
acceptance_criteria:
- 接受 email + password 输入
- 密码使用 bcrypt 哈希(cost >= 12)
- 返回 201 和用户信息(不含密码)
- 邮箱重复时返回 409
dependencies: []
references:
- research-auth-20260420
- SPEC-user-auth.md
---这个元数据结构有五个设计意图:
- task_id:全局唯一标识,便于在 STATE.md 中追踪状态
- acceptance_criteria:明确的完成定义,消除"做完了吗"的歧义
- estimated_effort:工作量估算,用于上下文预算规划
- assigned_to:指定执行 Agent,实现 Agent 间的任务路由
- references:关联参考资料和 SPEC,确保执行时有据可依
5.3 Chunked Planning 的内部实现
planner 的 46KB 定义中,约 12KB 专门描述 Chunked Planning 算法。这是 GSD 规划系统的核心创新之一。
Chunked Planning 的本质是将一个大规划问题分解为多个独立的子规划问题,每个子问题在独立的上下文窗口中解决:
flowchart LR
A["完整需求"] --> B{按 Chunk 拆分}
B --> C1["Chunk 1: 基础设施"]
B --> C2["Chunk 2: 数据层"]
B --> C3["Chunk 3: 业务层"]
B --> C4["Chunk 4: 接口层"]
C1 --> D1["上下文窗口 1"]
C2 --> D2["上下文窗口 2"]
C3 --> D3["上下文窗口 3"]
C4 --> D4["上下文窗口 4"]
D1 --> E1["子计划 1"]
D2 --> E2["子计划 2"]
D3 --> E3["子计划 3"]
D4 --> E4["子计划 4"]
E1 --> F["Stitch Point 接口定义"]
E2 --> F
E3 --> F
E4 --> F
F --> G["完整计划组装"]Chunk 间的"缝合点"(Stitch Point) 是关键设计:
## Chunk 1 输出接口
```typescript
// Chunk 1 完成后,以下接口必须可用
interface IDatabaseConnection {
connect(): Promise<void>;
query(sql: string, params: any[]): Promise<any[]>;
transaction(fn: (trx: ITransaction) => Promise<void>): Promise<void>;
}Chunk 2 输入假设
// Chunk 2 假设以下接口已存在
interface IDatabaseConnection {
connect(): Promise<void>;
query(sql: string, params: any[]): Promise<any[]>;
transaction(fn: (trx: ITransaction) => Promise<void>): Promise<void>;
}
planner 在生成每个 Chunk 时,只向当前上下文注入:
- 上游 Chunk 的**输出接口定义**(而非实现细节)
- 全局约束(技术栈、编码规范、安全要求)
- 本 Chunk 对应的需求子集
这种"接口驱动"的 Chunk 间通信,使得各 Chunk 可以独立演进,同时保证最终组装后的计划是**一致且连贯**的。
---
## 六、gsd-plan-checker 深度解析
### 6.1 职责定位
如果说 planner 是"创造者",那么 `gsd-plan-checker` 就是"质检员"。它的职责不是生成计划,而是**以批判性视角审查计划的质量**。
plan-checker 的核心设计哲学是:**任何由 AI 生成的计划都必须经过独立验证**,就像人类架构师的设计需要 Code Review 一样。
<pre class="mermaid">flowchart TB
subgraph "gsd-plan-checker 验证维度"
V1["完整性检查"]
V2["一致性检查"]
V3["可行性检查"]
V4["可追踪性检查"]
V5["依赖合理性检查"]
V6["上下文预算检查"]
end
subgraph "输出"
R1["通过"]
R2["缺陷报告<br/>含严重等级和修复建议"]
end
V1 --> R2
V2 --> R2
V3 --> R2
V4 --> R2
V5 --> R2
V6 --> R2
V1 -.-> R1
V2 -.-> R1
V3 -.-> R1
V4 -.-> R1
V5 -.-> R1
V6 -.-> R1</pre>
### 6.2 验证检查项详解
#### 6.2.1 完整性检查(Completeness)
完整性检查确保计划**覆盖所有需求**,没有遗漏:
<pre class="mermaid">flowchart LR
A[REQUIREMENTS.md] --> B{每个 FR/NFR}
B -->|"有对应 Task"| C["标记覆盖"]
B -->|"无对应 Task"| D["记录遗漏"]
C --> E["覆盖率统计"]
D --> E
E --> F{覆盖率 >= 95%?}
F -->|"是"| G["通过"]
F -->|"否"| H["失败:需求遗漏"]</pre>
检查规则:
- 每个 FR 必须至少有一个 Task 直接对应
- 每个 NFR 必须有相应的验收标准或验证 Task
- 约束条件必须在 Plan 中有体现(如"使用 TypeScript"必须反映在技术栈选择中)
#### 6.2.2 一致性检查(Consistency)
一致性检查确保计划**内部没有矛盾**:
| 检查类型 | 示例 |
|---------|------|
| **技术栈一致** | Task A 使用 Prisma,Task B 使用 TypeORM → 冲突 |
| **命名一致** | 一个模块在 Task 1 中叫 `UserService`,在 Task 2 中叫 `UsersService` → 需统一 |
| **接口一致** | Chunk 1 输出接口与 Chunk 2 输入假设不匹配 → 需修正 |
| **标准一致** | Task A 要求密码 8 位,Task B 要求密码 6 位 → 冲突 |
#### 6.2.3 可行性检查(Feasibility)
可行性检查评估计划**在现实中能否执行**:
<pre class="mermaid">flowchart TD
A["计划可行性检查"] --> B["技术可行性"]
A --> C["资源可行性"]
A --> D["时间可行性"]
B --> B1["所需工具在 allowed-tools 列表中?"]
B --> B2["技术方案符合当前生态成熟度?"]
C --> C1["分配的 Agent 具备相应能力?"]
C --> C2["上下文预算足够覆盖所有 Task?"]
D --> D1["工作量估计是否合理?"]
D --> D2["里程碑时间是否有缓冲?"]</pre>
plan-checker 使用**经验规则库**进行可行性评估:
- 单个 Task 的工作量不应超过 4 小时(否则应进一步拆分)
- 两个连续 Task 之间应预留 10% 的缓冲时间
- 如果计划涉及未在 `allowed-tools` 中的工具,标记为高风险
#### 6.2.4 可追踪性检查(Traceability)
可追踪性检查确保每个 Task 都有**明确的完成标准和验收方式**:
```markdown
## 可追踪性检查清单
- [ ] 每个 Task 都有 acceptance_criteria
- [ ] 每个 acceptance_criteria 都是可验证的(避免"良好"、"优化"等模糊词)
- [ ] 每个 Task 都有 task_id,便于在 STATE.md 中追踪
- [ ] 每个 Task 都关联了对应的 FR/NFR
- [ ] 高风险 Task 有回滚策略6.2.5 依赖合理性检查
依赖检查的核心是检测循环依赖和过度耦合:
flowchart TD
A["构建依赖图"] --> B["检测循环依赖"]
B -->|"发现循环"| C["标记失败:循环依赖"]
B -->|"无循环"| D["检测依赖深度"]
D --> E{最长依赖链 > 5?}
E -->|"是"| F["警告:依赖链过长,建议解耦"]
E -->|"否"| G["通过"]plan-checker 还会检查"隐式依赖"——两个 Task 虽然没有显式声明依赖关系,但修改其中一个会影响另一个。这类依赖通常通过接口变更分析发现。
6.2.6 上下文预算检查
这是 GSD 特有的检查项——评估执行计划所需的总 token 消耗是否在预算范围内:
## 上下文预算估算
| 项目 | 估算 Tokens | 说明 |
|------|------------|------|
| PROJECT.md | 2,000 | 固定开销 |
| REQUIREMENTS.md | 3,500 | 固定开销 |
| ROADMAP.md | 1,500 | 固定开销 |
| 当前 Phase Plan | 8,000 | 每个 Phase 约 8K |
| 代码上下文 | 15,000 | 平均加载的文件 |
| 工具调用结果 | 5,000 | 预估工具返回 |
| **总计** | **35,000** | **预算上限:150,000** |
**结论**:预算充足,当前计划可执行。如果估算超出预算,plan-checker 会建议进一步拆分 Chunk 或采用更粗粒度的规划。
七、Planner 与 Plan-Checker 的协作循环
7.1 验证-修订循环
planner 和 plan-checker 的协作是一个闭环质量控制系统:
sequenceDiagram
participant P as gsd-planner
participant C as gsd-plan-checker
participant Plan as "计划文档"
P->>Plan: 生成初始计划
P->>C: 提交验证请求
C->>C: 执行六维检查
C->>P: 返回验证报告
alt 全部通过
C->>Plan: 标记 "checker-approved"
else 发现缺陷
C->>P: 返回缺陷列表(含严重等级)
P->>P: 分析缺陷根因
P->>P: 针对性修订
P->>C: 重新提交验证
C->>C: 执行增量检查
C->>P: 返回结果
end7.2 严重等级与处理策略
plan-checker 发现的缺陷按严重等级分类:
| 等级 | 标识 | 说明 | 处理策略 |
|---|---|---|---|
| CRITICAL | 🔴 | 计划存在根本性缺陷,执行将导致失败 | 必须修复,否则拒绝输出 |
| HIGH | 🟠 | 重大风险,可能导致严重返工 | 强烈建议修复 |
| MEDIUM | 🟡 | 中等问题,影响执行效率 | 建议修复,可接受风险 |
| LOW | 🟢 | 小问题,不影响核心目标 | 可记录为技术债 |
| INFO | 🔵 | 改进建议 | 供 planner 参考 |
修订循环上限:GSD 规定修订循环最多执行 3 次。如果 3 次后仍有 CRITICAL 或 HIGH 缺陷,planner 会降级为粗粒度规划,将详细规划推迟到执行阶段。
flowchart LR
A["生成计划"] --> B{第1次验证}
B -->|"通过"| C["输出计划"]
B -->|"失败"| D["修订"]
D --> E{第2次验证}
E -->|"通过"| C
E -->|"失败"| F["修订"]
F --> G{第3次验证}
G -->|"通过"| C
G -->|"失败"| H["降级为粗粒度规划"]
H --> I["详细规划推迟到执行阶段"]7.3 增量验证优化
为了节省 token 和时间,plan-checker 支持增量验证:
- 第 1 次验证:全量六维检查
- 第 2 次及以后:只检查被修改的部分及其直接影响范围
例如,如果 planner 修订了 Chunk 3 的接口定义,plan-checker 只需验证:
- Chunk 3 内部的完整性
- Chunk 3 与 Chunk 2 的缝合点一致性
- Chunk 3 与 Chunk 4 的缝合点一致性
其他未修改的 Chunk 可以直接复用上一次验证结果。
八、Planner 与 plan-phase 工作流的关系
8.1 职责边界
在 GSD 的体系结构中,planner 是 Agent,plan-phase 是工作流。它们的关系类似于"演员"和"剧本":
flowchart TB
subgraph "plan-phase 工作流(剧本)"
W1["定义输入输出格式"]
W2["编排 Agent 调用顺序"]
W3["管理状态转换"]
W4["处理异常和边界情况"]
end
subgraph "gsd-planner Agent(演员)"
A1["理解需求"]
A2["设计技术方案"]
A3["生成计划内容"]
A4["与 checker 协作"]
end
W1 --> A1
W2 --> A2
W3 --> A3
W4 --> A4具体边界划分:
| 职责 | plan-phase(工作流) | gsd-planner(Agent) |
|---|---|---|
| 读取哪些文件 | 决定 | 执行 |
| 调用哪个 Agent | 编排 | 被调用 |
| 计划内容质量 | 不直接负责 | 核心职责 |
| 验证机制 | 定义流程 | 参与执行 |
| 输出格式规范 | 定义模板 | 填充内容 |
| 错误处理策略 | 定义回退逻辑 | 报告错误 |
8.2 数据流
flowchart LR
A["用户命令"] --> B["plan-phase 工作流"]
B --> C["读取 .planning/ 上下文"]
C --> D["注入 planner prompt"]
D --> E["gsd-planner Agent"]
E --> F["生成计划内容"]
F --> G["注入 checker prompt"]
G --> H[gsd-plan-checker]
H --> I{验证结果?}
I -->|"通过"| J["写入 ROADMAP.md + phases/*.md"]
I -->|"失败"| K["返回修订指令"]
K --> E
J --> L["更新 STATE.md"]plan-phase 负责"流程管理":什么时候调用 planner、什么时候调用 checker、验证失败后怎么办、最终结果写入哪里。planner 和 checker 则专注于"内容生产"和"内容质检"。
8.3 多 Agent 协作全景
在完整的规划流程中,planner 不是唯一工作的 Agent:
sequenceDiagram
participant Workflow as "plan-phase 工作流"
participant Planner as gsd-planner
participant Researcher as gsd-phase-researcher
participant Checker as gsd-plan-checker
participant SpecWriter as gsd-spec-writer
Workflow->>Planner: 触发规划
Planner->>Workflow: 请求研究支持
Workflow->>Researcher: 调用研究 Agent
Researcher->>Workflow: 返回研究成果
Workflow->>Planner: 注入研究上下文
Planner->>Planner: 生成初始计划
Planner->>Workflow: 提交计划
Workflow->>Checker: 调用验证
Checker->>Workflow: 返回缺陷报告
Workflow->>Planner: 请求修订
Planner->>Planner: 修订计划
Workflow->>Checker: 重新验证
Checker->>Workflow: 验证通过
Workflow->>SpecWriter: 生成 SPEC(可选)
SpecWriter->>Workflow: 返回 SPEC.md
Workflow->>Workflow: 输出最终计划九、模型选择:为什么 planner 需要思考类模型
9.1 规划任务的认知复杂度
规划是软件工程中最需要深度推理的环节。与代码生成(可以将大问题分解为局部模式匹配)不同,规划要求模型具备以下能力:
quadrantChart
title 不同任务类型的认知需求
x-axis 低模式匹配 --> 高模式匹配
y-axis 低全局推理 --> 高全局推理
quadrant-1 高推理高模式:代码重构
quadrant-2 低推理高模式:代码补全
quadrant-3 低推理低模式:文本格式化
quadrant-4 高推理低模式:架构规划
"代码补全": [0.9, 0.1]
"单元测试生成": [0.8, 0.3]
"代码审查": [0.7, 0.5]
"Bug 修复": [0.6, 0.4]
"架构规划": [0.2, 0.9]
"需求分析": [0.3, 0.85]
"任务分解": [0.4, 0.8]架构规划(以及需求分析、任务分解)处于"高全局推理、低模式匹配"象限,这正是**思考类模型(Reasoning Model)**的优势领域。
9.2 快速模型 vs 思考类模型的对比
| 维度 | 快速模型(如 GPT-4o-mini) | 思考类模型(如 Claude 3.7 Sonnet / o3) |
|---|---|---|
| 推理深度 | 浅层,适合单步任务 | 深层,适合多步因果链 |
| 上下文保持 | 容易在长文本中丢失关键约束 | 能在大上下文窗口中保持全局一致性 |
| 架构设计 | 倾向于选择最常见的方案 | 能权衡多种方案,给出非显而易见的创新 |
| 风险评估 | 容易忽略边缘情况 | 能系统性地识别潜在风险 |
| 依赖分析 | 可能遗漏间接依赖 | 能构建完整的依赖传递闭包 |
| 响应速度 | 快(秒级) | 慢(分钟级) |
| 成本 | 低 | 高(5-10x) |
9.3 GSD 的模型分层策略
GSD 利用不同模型的特性差异,实现了成本-质量的动态平衡:
flowchart LR
A["规划阶段"] -->|"使用"| B["思考类模型
Claude 3.7 Sonnet / o3
Gemini 2.5 Pro"]
B --> C["生成计划"]
C --> D["执行阶段"]
D -->|"简单 Task"| E["快速模型
GPT-4o-mini / Haiku"]
D -->|"复杂 Task"| F["标准模型
GPT-4o / Sonnet"]
D -->|"需要深度推理"| G["思考类模型"]核心原则:
- 规划一次性,执行多次:投入高成本模型做规划是值得的,因为一个好的计划能降低后续执行的返工成本
- 错误成本不对称:规划错误的代价(方向错误、架构缺陷)远大于执行错误的代价(单个 Task 失败可以重试)
- 上下文利用率:规划需要处理大量上下文(需求、约束、参考文档),思考类模型的大上下文窗口利用率更高
9.4 planner 的 prompt 设计对模型的要求
planner 的 46KB 定义中包含大量需要深度理解才能正确执行的指令:
## 任务分解规则
1. **独立性原则**:每个 Task 应该是"可独立验证"的——即完成该 Task 后,
存在一个明确的验收标准可以判断它是否正确完成,而不需要等待其他 Task。
2. **最小耦合原则**:Task 之间的依赖应尽可能少。如果两个 Task 必须共享
大量上下文,考虑将它们合并为一个 Task。
3. **渐进复杂度原则**:早期 Phase 的 Task 应该比后期 Phase 的 Task 更简单。
这允许团队在项目的"蜜月期"建立信心,同时降低早期失败的风险。
4. **风险前置原则**:高风险的 Task 应该安排在早期 Phase。如果技术方案
不可行,越早发现越好。这些规则不是简单的模板填充,而是需要模型进行价值判断和权衡的。例如"最小耦合原则"与"渐进复杂度原则"在某些情况下可能冲突——早期 Phase 拆得太细会增加耦合,此时模型需要判断哪个原则优先。这种判断正是思考类模型的强项。
十、小结
gsd-planner.md(46KB)和 gsd-plan-checker 共同构成了 GSD 规划体系的"双引擎":
| 组件 | 角色 | 核心能力 | 输出 |
|---|---|---|---|
| gsd-planner | 创造者 | 需求解构、架构设计、任务分解、Chunked Planning | ROADMAP.md + phases/*.md |
| gsd-plan-checker | 质检员 | 完整性、一致性、可行性、可追踪性、依赖、预算检查 | 验证报告 |
它们的设计亮点包括:
- 分层的职责分离:planner 专注内容生产,checker 专注质量验证,形成创造性思维与批判性思维的互补
- 结构化的上下文工程:XML 格式化注入、五维需求框架、ADR 决策记录,确保规划过程可追踪、可验证
- Chunked Planning 算法:通过接口驱动的分块规划,解决大模型上下文溢出和计划僵化问题
- 闭环质量控制系统:验证-修订循环 + 增量验证优化,确保输出计划的质量
- 模型分层策略:规划阶段使用思考类模型,充分利用其深度推理能力,降低后续执行风险
GSD 的 46KB planner 定义不是"过度设计",而是对规划这一复杂认知任务的尊重。在软件工程中,规划质量决定一切——正如 GSD 的核心理念所言:"Plan slow, execute fast. A good plan is half the battle won."
下一篇预告: 第 24 篇《Executor 与 Debugger》——深入解析 GSD 执行层的核心 Agent:gsd-executor 如何将 plan 转化为代码、gsd-debugger 如何处理执行失败和异常、以及执行-调试循环如何确保每个 Task 高质量完成。如果说 planner 是"运筹帷幄的将军",那么 executor 和 debugger 就是"冲锋陷阵的士兵和随军军医"——它们共同构成了 GSD 从计划到交付的最后一公里。