🟡 进阶

GSD Core 工作流怎么用

五步阶段循环(Discuss → Plan → Execute → Verify → Ship)每一步在干什么、在磁盘上留下什么文件、以及你该在哪一步插手

📅 更新于 2026-09-13

📌 本文校对于 GSD Core @ v1.13.0(npm 上的 latest,2026-09-06 发布)· 仓库 main 分支 commit a0270a7(2026-09-12)· 官方源:github.com/open-gsd/gsd-core

5
阶段循环的步骤数
72
命令(我数过的,官方教程说 71)
35
随包发布的代理
3
处互相打架的 Node 版本要求

0030 秒速览:读完你能做什么

读完这一篇,你能做出三个判断:这套流程值不值得你付那份"仪式成本";在五步里哪一步你必须亲自在场;以及为什么一份正经教程会反复叫你用 /clear 把聊天记录清空——而这个动作居然不会丢进度。

🔑 先记住三句话(后面都是细节)

① GSD 不是"一套更强的提示词",它是一个把 AI 编程切成固定五步、并且每干一件重活就换一个全新 AI 的流程系统(02)。
② 它要治的病只有一个,叫上下文腐烂:一个聊天窗口聊得越久,AI 越容易忘掉你早先说过的约束——这不是它记性差,是"注意力"这个机制本身的性质(02)。
③ 它的解法不是"让 AI 记住更多",而是把该记住的东西写进文件(.planning/ 目录),于是清空聊天窗口成了安全动作——记忆在硬盘上,不在对话里(12)。

按你现在的处境,直接跳到对应那一节

你现在的状态先看这一节为什么
第一次听说 GSD,想知道它是不是又一个"AI 编程神器"01、02先搞清它到底解决哪一个具体问题,再决定要不要花时间装
已经决定要装,想少踩坑03官方文档对 Node 版本给了三个互相矛盾的说法,我逐个核过了
装好了,有个新项目要开始04 → 11先看立项那一步,再照着一遍完整走查抄命令
正在用它,卡在某一步不知道下一步敲什么05、13五步表 + 命令速查
它报错了 / 看起来卡死了 / 产出不对14八类常见故障的分诊表
用了一阵,在怀疑"这玩意儿是不是过度设计"15官方自己给出的"别用它"判据,以及它公开承认的安全边界

先给一组量级

v1.13.0npm(Node 的包仓库)上的最新版,2026-09-06 发布
72 个随包发布的斜杠命令(我在 commands/gsd/ 里数出来的)
35 个随包发布的代理(22 个主力 + 13 个专项)
9,386GitHub star(2026-09-13 查询 API)
41,591npm 上月下载量(2026-08-13 ~ 09-11)
📎 这篇的定位

这是一篇使用教程:它是什么、怎么装、五步怎么走、每步产生什么文件、坏了怎么修。它不是一份完整命令手册——那有 72 个命令、2,400 多行官方文档。这篇只保证一件事:你照着走一遍,会知道自己在流程的哪一格,以及为什么在这一格。

01它是什么,以及它不是什么

官方的一句话定义

仓库 README 的第一句是这么写的(原文):

📄 README.md · 原文

"GSD Core is a context-engineering and spec-driven development framework that drives AI coding agents (Claude Code, Codex, Antigravity CLI, Kimi CLI, Copilot, Cursor, and more) through a disciplined phase loop."

翻译成人话,这句话里有三个需要解释的词:

它的名字 GSD 是 "Git. Ship. Done." 的缩写——"提交、发布、收工"。仓库 README 页面顶部就是这么写的。

它到底是什么形态的东西?

这一点新手最容易搞混,所以直接说清楚:GSD 是一个 npm 包,装进你已经在用的 AI 编程工具里,给你加一批斜杠命令和一批"干活用的 AI 角色"。

它不是一个新的 AI 工具、不是一个新的聊天界面、更不是一个新的模型。你原来用 Claude Code,装完还是用 Claude Code;你原来用 Codex,装完还是 Codex。它只是往你那个工具里塞了东西。

它由三个部件组成

⌨️
命令(你敲的)
形如 /gsd-plan-phase 1 的斜杠命令。这是你的方向盘——每一步都由你亲手启动,它不会自己开始干活。
🤖
代理(干活的)
正式叫法是"子代理"。每一个都是一个全新的、只带着任务必需材料的 AI 实例,干完就销毁。共 35 个,各有专门职责。
🗂️
.planning/(记忆)
项目里多出来的一个目录,全是普通 Markdown 和 JSON 文件。它是整套东西的地基——因为它,清空对话不会丢进度。

它容易被误当成什么

❌ 误当成:"一套很长的系统提示词"

很多人以为 GSD ≈ 一份写得很好的 CLAUDE.md 规则文件(也就是放在项目根目录、AI 每次启动都会读的那份行为说明)。

差在哪:规则文件只影响同一个对话里的行为,对话越长它越被稀释(这正是第 02 节说的病)。GSD 的核心动作是不断地开新对话——这一点是提示词写法做不到的。

✅ 实际是:"一套流程 + 一个换人的机制"

GSD 管的是什么时间、由哪一个干净的 AI、带着哪些文件、去干哪一件事。

提示词解决"它该怎么想",GSD 解决"该让谁来想、它能看到什么"。两者不冲突,可以叠加。

那它跟 OpenSpec、Superpowers 这些是不是一回事?
同类不同路。它们都在给 AI 编程加纪律,但 GSD 的抓手是"阶段"——把工作切成一块块,每块必须走完 Discuss → Plan → Execute → Verify → Ship 才允许进入下一块。本仓另有《OpenSpec 工作流程详解》与《Superpowers 的工作流程》两篇,讲的是另外两种抓手(规格变更 / 技能链),三篇不重复。

02它唯一要治的病:上下文腐烂

从一个你一定经历过的场景开始

早上你打开 AI 编程工具,让它改一个登录逻辑。它答得很准。你接着让它加个校验、顺手改下报错文案、再修一个测试。到了下午,你发现它开始忘事:明明上午说好"这个项目不许用某个库",它刚刚又给你写上了;明明上午定下的函数命名风格,它现在换了一套。

你没换工具,也没换模型。变的只有一个东西:这个对话窗口里累积的文字量。

两个必须先建立的词

官方给这个病起的名字

📄 docs/explanation/context-engineering.md · 原文

"As that window fills, something subtle happens. The model does not fail loudly. It keeps answering. But the quality of its answers quietly degrades. Early instructions get pushed towards the edge of what it can attend to. […] Researchers call this context rot."

(大意:窗口填满时,出问题的方式很隐蔽——它不会报错,它照常回答,只是答案质量悄悄下降。你早先说的约束被挤到了它注意力的边缘。研究者管这叫上下文腐烂。)

文档列了它腐烂时的四种典型症状,每一条都对得上你的体感:

官方描述的症状你的体感为什么危险
开始推翻它自己早先承认过的决定"我不是刚说过不用这个方案吗?"你若不逐条复核,它会静默地违背约定
代码风格偏离会话开头定下的惯例命名突然变了、目录结构突然换了代码库开始出现两套风格
计划开始忽略那些明确说过、但已被埋进历史的需求做出来的东西少了一块漏需求不会报错,只会漏
凭空写出它二十条消息前还写对过的文件名和函数签名"这个文件根本不存在啊"这就是大家常说的"幻觉",但根因在窗口

为什么"让它记住更多"是错的解法

碰到上面这些症状,最自然的反应是:那我再强调一遍,或者换个记性更好的模型。GSD 的文档明确否掉了这条路,理由值得完整读一遍:

📄 官方对根因的说明 · 原文

"None of this is a model bug. It is a fundamental property of how transformer attention works over long sequences. The model is not forgetting — it never 'remembered' in the human sense. It is weighting relevance across a finite window, and as that window fills with accumulated noise, signal-to-noise degrades."

(大意:这不是模型的 bug,而是注意力机制处理长序列时的固有性质。它不是"忘了"——它从来没有像人那样"记得"过。它只是在有限的窗口里给相关性打分;窗口里塞进的噪音越多,信噪比越低。)

所以正确的解法方向不是"喂得更多",而是"每一件重活,都换一个只带着必需材料的新 AI 来干"。

它实际怎么做到"换人"

GSD 把一次工作分成两种角色:

你 + 编排器
主窗口 · 保持轻
→
研究代理
干净窗口 · 查资料
规划代理
干净窗口 · 写计划
执行代理
干净窗口 · 写代码
→
.planning/
文件 · 唯一记忆

于是"为什么教程叫我 /clear"就有答案了

/clear 是 Claude Code 里"清空当前对话记录"的命令。第一次看到教程让你在阶段之间反复清空,几乎所有人的反应都是:那不是把记忆洗掉了吗?

关键在这一点区分:需要留下来的东西,从来不在对话里,而在文件里。规划代理写下的计划、讨论阶段定下的决定、执行代理写的总结——全都落进了项目里的 .planning/ 目录。任何一个新开的代理都能直接去读这些文件,不需要读过你们的聊天记录。

✅ 一句话记住

GSD 把"记忆"从对话里搬到了硬盘上。所以清空对话不是丢进度,而是把噪音清掉——留下的是干净的推理空间,进度在 .planning/ 里躺着。

一个类比,以及它在哪里失效

你可以把上下文窗口想成一张办公桌:桌面就这么大,你每处理一件事就往上摊一份材料。摊到某个程度,你要找的东西还在桌上,但已经被压在一堆纸下面——你不是没放,是找不到了。GSD 的做法是每处理一件大事,就换一张干净的桌子,只把这件事要用的那几份材料搬过去,干完把结论归档到柜子里。

⚠️ 这个类比到这里就不准了

桌面是物理限制——纸确实还在,你翻一翻总能找到。而上下文腐烂是注意力分配的问题:内容仍然在窗口里,只是每个字分到的关注变少了。也就是说,"翻回去重读一遍"这个人类动作,对模型不成立——重读并不能把被稀释的注意力还原。所以别指望"我再强调一次"能治好它,只能靠换人。

我就是个小改动,也要换人吗?
不用。官方自己划了线:"如果一件事能在一条短提示里说清、并且一轮就能做完,就别走这套流程。"小改动它提供了 /gsd-quick 这条轻量路径(见 13)。整套阶段循环的价值出现在"需要查资料、涉及你好久没读过的文件、或者依赖还没定下来的决定"的时候。

03装上去

先说前置条件,这里官方文档自己打架

我把三处提到 Node 版本的地方都找出来了,它们是三个不同的数字:

说法出处它写的 Node 要求这份文件是给谁看的
package.json 的 engines 字段(仓库 main 与 npm 上 1.13.0 的包体完全一致,我下载包核对过)Node ≥ 24.0.0,npm ≥ 10机器读的。npm 会据此检查,低于它会打印 EBADENGINE 警告;若你开了 engine-strict,会直接拒绝安装
docs/how-to/install-on-your-runtime.mdNode.js 18+人类的安装指南
docs/tutorials/your-first-project.md(教程顶部的徽章与前置表格)Node.js 22+人类的新手教程

还有第四处旁证:仓库根目录的 .nvmrc 文件写的是 24(这类文件的作用是"告诉版本管理工具该用哪个 Node"),以及维护者自己的测试文档 docs/TESTING-SUITES.md 里写着 "All lanes run on Node 24 — the engines.node floor (>=24.0.0)"。也就是说:他们自己开发用的是 24。

⚠️ 怎么处理这个矛盾

以 24 为准。理由:只有 engines 是机器会执行的那一条,其余都是散文,而且散文之间自己也不一致(18 / 22)。另外还有一条旁证:我在 bin/install.js 里没有找到任何主动的 Node 版本检查代码——所以装的时候不会有人拦住你,低版本可能照样跑起来,但一旦某个依赖用上新特性,你会撞到没有解释的报错。先跑 node --version,低于 24 就升。

顺带说明为什么这个矛盾值得单独讲:engines 只是"声明",npm 默认只打警告(EBADENGINE),除非你开了 engine-strict 才会拒绝安装。文档写 18+ 不会让你装失败,只会让你在一个官方不支持的版本上跑。

装:一条命令

GSD 发布在 npm 上——npm 是 Node.js 的包仓库,相当于它自己的应用商店;包名是 @opengsd/gsd-core。下面的命令用的是 npx,意思是"把这个包下载下来并直接运行一次",所以你不需要先安装任何东西。官方要求必须走安装器,不要手动拷贝文件:

# 通用形式:在任意目录运行,安装器会问你要装在哪个工具里
npx @opengsd/gsd-core@latest

也可以直接指定工具和作用范围(全局 = 所有项目可用;本地 = 只在这个项目里可用):

# Claude Code,全局安装(技能落到 ~/.claude/)
npx @opengsd/gsd-core@latest --claude --global

# Claude Code,只装进当前项目(新手教程用的是这个)
npx @opengsd/gsd-core@latest --claude --local

# 装到别的配置目录(比如你在用预览版的 Claude Code)
CLAUDE_CONFIG_DIR=~/.claude-alt npx @opengsd/gsd-core@latest --claude --global

安装器会依次问你两件事:装进哪个工具、以及全局还是本地。装完记得重启你的 AI 工具——命令是启动时加载的,不重启敲 /gsd- 是找不到的。

⚠️ 文档里的 gsd xxx 命令其实不存在

官方配置文档和命令行文档里到处写着形如 gsd config-set …、gsd install … 的用法,但这个包根本没有发布名为 gsd 的命令,安装器也不会创建它。包里实际有四个可执行入口:gsd-core(安装器)、gsd-tools、gsd_run、gsd-mcp-server。

所以你把文档里的命令原样粘进终端会得到 "command not found"。可复制的最小改法是:gsd <动词> → gsd-tools <动词>;或者用完整路径 node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" <动词>。本文后面出现的都写成后者,因为它在你没配 PATH 时也能跑。

支持哪些工具(这个数字官方给了三个版本)

这一处也是文档打架的地方,而且这次我找到了"唯一可执行的那份真相"——安装器源码里能选的运行时列表,正好 18 个:

来源它说的数字可信度
docs/README.md:"all 16 supported runtimes"16散文,而且它自己的安装指南只列了 16 节、漏掉了 Hermes
docs/reference/host-integration-capability-matrix.md(19 个运行时小节)19散文;多出来的那个是 vscode,它没有安装入口
安装器源码 bin/install.js 里的 --all 列表与交互选项18机器执行的——这是唯一会真正决定你敲什么的那份

那 18 个是:Claude Code、Antigravity、Augment、Cline、CodeBuddy、Codex、Copilot、Cursor、Hermes Agent、Kimi、Kimi Code、Kilo、OpenCode、pi、Qwen Code、Trae、Windsurf、ZCode。注意里面没有 Gemini CLI——安装器里写着它已被移除,理由是"Gemini CLI 于 2026-06-18 被 Google 下线,GSD 现在支持 Antigravity CLI"。如果你手上的旧文档(包括本仓的 zh-CN 官方文档)还写着 --gemini,那是过期内容。

几个值得单独知道的:

工具命令前缀要注意的
Claude Code/gsd-*支持最完整。另有"原生插件"安装路径,但官方明说那条路不会应用安装期配置(比如模型覆盖),而且它暴露的命令名是 /gsd-core:xxx 而不是 /gsd:xxx
Codex$gsd-*前缀是美元符号,不是斜杠。另有硬门槛:Codex CLI 本体要 ≥ 0.130.0,hook 事件结构要 ≥ 0.137.0。Codex 上不支持上下文告警(不装 gsd-context-monitor.js)
Kimi CLI / Kimi Code/gsd-*这是两个不同的产品、两个不同的配置根(~/.kimi 与 ~/.kimi-code)。Kimi Code 从 1.10.0 起才作为独立运行时支持;--kimi --local 是官方明确推迟、暂不支持的组合
OpenCode / Kilo/gsd-*安装器会往插件目录写一个 {"type":"commonjs"} 标记,这会影响你自己写的同目录 .js 插件——官方给的缓解办法是自己写的插件用 .ts 后缀
Cline/gsd-*要求 Cline 本体技能支持 ≥ v3.48.0;而且 hook 只在 macOS / Linux 上跑
Windsurf / Devin Desktop/gsd-*全局安装故意不做任何事("intentionally a no-op"),必须用工作区安装
pi/gsd特例:不写 commands//agents//skills/ 目录,靠一个扩展程序注册命令。历史上有个真实的坑:扩展文件必须是 .js 后缀,而它在 1.7.0 之前一直以 .cjs 发布,所以那个版本里它静默地从未被加载过

官方给了一句关键的兼容性说明(原文):"The hyphen and colon forms are runtime-specific spellings of the same command. Whichever runtime you're on, the installer writes the correct form into your runtime's command directory."——连字符形式和冒号形式是同一条命令在不同工具里的写法,安装器会自动写对,你不用记两套。

一个真实的坑:别去跟 @next

官方有一份 VERSIONING.md,说预发布版本用 next 这个 npm 标签发布,并给了 npx @opengsd/gsd-core@next 作为尝鲜写法。但我查 npm registry 的实际标签状态是这样的:

latest = 1.13.02026-09-06 发布
next = 1.7.0-rc.62026-07-12 发布

也就是说:@next 现在指向的是一个比正式版旧了将近两个月的候选版。你如果按文档去装 @next 想"尝鲜",实际拿到的是退版本。这个 next 标签没跟着往前走——一条纯靠查 API 才能发现的事,散文文档里看不到。

安装器会依次问你什么

不带参数跑 npx @opengsd/gsd-core@latest 时,它按固定顺序问四件事(后两个只在特定条件下出现):

  1. 装进哪个运行时——列出 18 个选项加一个 "All";可以多选,用 1,2,6 或 1 2 6 这种写法。直接回车默认选 Claude Code。
  2. 装全局还是本地——默认全局。
  3. (仅当检测到你已有状态栏时)要不要用 GSD 的状态栏替换它——默认保留你原来的。
  4. (仅当状态栏最终不会安装时)要不要装一个"有新版本"的更新提示条——默认不装。

在非交互环境(比如 CI)里跑,它不提问,直接按"Claude Code + 全局"默认执行。

另外有一个省资源的选项值得知道:--minimal(或 --profile=<名字>)只装一个最小技能集——官方给的口径是核心档 8 个技能,标准档 15 个,而完整安装的"冷启动开销"按 docs/install-minimal-and-add-skills.md 的表格是 130 / 700 / 1,200 个 token 量级。如果你只是想先试试水,这条路能让你的 AI 工具每次启动少读一大段技能清单。但注意官方两处给的数字对不上:安装器自己的帮助文本写的是"从约 12k token 降到约 700",和上面那张表不是一个口径。

装完怎么确认成功

# 1) 重启你的 AI 工具,然后敲任意一个 GSD 命令看认不认
/gsd-help

# 2) 想知道它到底装进来了什么、健康不健康
/gsd-health

# 3) 只有 Claude Code 有这条:检查有没有全局/本地打架
/gsd-surface

/gsd-health 是官方文档里明说的诊断入口,能查出"本地和全局都装了、到底哪个在生效"这类问题(它会以 W028 这个诊断编号报出来)。这个冲突在 Claude Code 上是真实存在的:官方解释过个人作用域会覆盖项目作用域、技能会覆盖同名命令,所以全局装的那份永远赢。

它到底往你机器上放了什么

以 1.13.0 的实际包体为准(我下载 tarball 数过):

✅ 别手动拷贝

官方在教程里用了加粗警告:"Don't copy files from agents/ or commands/ directly"。原因是各个工具要的格式不同(工具清单写法、颜色值、TOML 还是 Markdown),安装器负责做转换;直接拷会得到"校验报错"或"命令根本没出现"。装完也别手改这些文件——它们归安装器管。

04第 0 步:立项,或者接手一个老仓库

五步循环是"每个阶段"的循环。在进入循环之前,你得先有一个项目——有路线图、有需求清单。这一步是两种走法二选一:

你的情况用哪条命令它会做什么
全新项目(空目录、空仓库)/gsd-new-project问你要做什么 → 问澄清问题 → 生成路线图给你批准 → 落下一整套规划文件
已有代码的老仓库/gsd-onboard先摸清代码库(映射),可选地把已有文档吃进来,再初始化规划——全程不静默覆盖你已有的规划文件
已经有现成的需求文档/gsd-new-project --auto @prd.md从文档里自动抽取需求、路线图,跳过交互提问

全新项目:它会问你什么

第一个问题永远是"What do you want to build?"——你想做什么。接着是一轮澄清提问,然后是工作流设置(研究开关、粒度、模型档位等)。最后它会给你一份路线图(roadmap)请你批准,长这样:

Proposed Roadmap
1 phase | 4 requirements mapped | All v1 requirements covered ✓

| # | Phase    | Goal                                   | Requirements    |
|---|----------|----------------------------------------|-----------------|
| 1 | Core CLI | add / list / done commands, todos.json | CLI-01 … CLI-04 |

两个词要解释:

接手老仓库:它为什么不能一步到位

/gsd-onboard 的设计是"不嵌套、不覆盖":它把三件事串起来但分开跑——《先摸清代码库》(/gsd-map-codebase)、《可选地把已有文档吃进来》(/gsd-ingest-docs)、《初始化项目》(/gsd-new-project),并且不会静默覆盖你已有的规划文件。文档里明说初始化前必须有一份完整的代码库地图,就算你加了 --fast 让它先做轻量映射,也仍然要在项目初始化之前补全。

它跑完会在 .planning/onboarding/SUMMARY.md 留一份接手记录,里面写着"该跑的下一步是哪个命令"。

里程碑又是另一个层级

你会在文档里反复看到 milestone(里程碑)这个词,它跟阶段不是一回事:

里程碑(milestone)阶段(phase)
它回答的问题"这个版本的产品做什么、不做什么""下一件能研究、能规划、能执行、能验证的事是什么"
边界画在哪天然的产品边界:一个能部署的 API、一条走得通的界面流程一次循环能安全吞下的工作量上限
什么时候结束它下面所有阶段都发不出去、并且需求全覆盖走完五步、验证报告为通过

简单说:路线图从上往下是"里程碑 → 阶段",而你日常打交道的是阶段。大多数时间你根本不需要想起里程碑。

05五步循环总览

这是一张你在官方文档里会看到很多次的流程图。它的完整形态其实有六格——中间那格是可选的前端设计环节:

Discuss →(UI design,可选)→ Plan → Execute → Verify → Ship
/gsd-discuss-phase
💬 Discuss
→
/gsd-plan-phase
📐 Plan
→
/gsd-execute-phase
⚙️ Execute
→
/gsd-verify-work
✅ Verify
→
/gsd-ship
🚀 Ship

五步对照表

步骤你敲的命令它在干什么谁在干活留下的主要文件典型耗时
💬 Discuss/gsd-discuss-phase 1 问你"怎么做",并把你的回答写成结构化决定你 + 编排器(一次对话) 01-CONTEXT.md、01-DISCUSSION-LOG.md2–4 分钟
📐 Plan/gsd-plan-phase 1 研究、拆解成小计划、再用一个独立角色复查计划研究代理 + 规划代理 + 计划检查器 01-RESEARCH.md、01-01-PLAN.md…1–5 分钟
⚙️ Execute/gsd-execute-phase 1 按波次并行写代码,每个任务一次提交多个执行代理(并行) 01-01-SUMMARY.md…、代码提交2–6 分钟
✅ Verify/gsd-verify-work 1 把"做出来的东西"编成一条条你亲手验的检查项验证代理(自动)+ 你(人工) 01-VERIFICATION.md、01-UAT.md1–3 分钟
🚀 Ship/gsd-ship 1 把这一阶段的成果做成一个拉取请求编排器 + 你的 git/GitHub 一个 PR;STATE.md 更新不到 1 分钟

耗时一列来自官方新手教程,属于"小而简单的项目"的量级,当成下限看——真实项目里研究和执行都可能明显更长。

这张表就是全部心智模型

✅ 迷路时只问一个问题

官方教程里给了一句很好的话:"Whenever you feel lost, ask yourself one question: which step of the loop am I on?"——哪一步?知道自己在哪一格,就知道下一步该敲哪条命令、该期待什么产物。

每一步之间都清空一次

官方文档把这条列为"长会话里上下文退化的处理办法",并且写得很直接:

📄 docs/USER-GUIDE.md · 原文

"Clear your context window between major commands: /clear in Claude Code. GSD is designed around fresh contexts — every subagent gets a clean 200K window."

原因已经在 02 讲透了:进度在 .planning/,不在对话里。清空之后用 /gsd-progress 或 /gsd-resume-work 就能把状态读回来。

那我每次都得记得手动清空吗?忘了会怎样?
忘了不会立刻坏,只是主窗口会慢慢变脏——这恰恰是它想防的那件事。另外它装了一套 hook(钩子:在固定时机自动触发的小脚本)来盯着这件事:Claude Code 上会注册 PreCompact(即将压缩上下文时)、Stop(一轮结束时)、SubagentStop(子代理结束时)等事件,用来估算还剩多少空间并提前提醒。但官方自己说这是启发式估算,不是保证——"a single model call can consume tokens unpredictably"。所以:把它当提醒,别当保险。

06Discuss:把"怎么做"写下来

为什么这一步不能省

路线图里的阶段描述只说了要达成什么结果(比如"命令行能加、能列、能勾掉待办"),但没说走哪条路达成:用哪个库、错误怎么处理、边界情况怎么表现、某个功能放在全局还是每一处各写一遍。

如果不讨论,这些决定就由规划代理自己拍板。官方对这个风险的描述很到位(原文):

📄 docs/explanation/the-phase-loop.md · 原文

"Sometimes it guesses right. Often it guesses plausibly but wrongly — producing a plan that is coherent but misaligned with your actual preferences. By the time execution is done and you realise the error, you are unwinding significant work."

(大意:有时它猜对了;但更常见的是猜得很有道理、却是错的——产出一份自洽、但跟你的真实偏好不一致的计划。等你执行完发现不对,已经要拆掉一大堆工作了。)

它实际问出来的问题长什么样

官方教程里的真实片段(为一个待办清单程序讨论):

> How should done items be stored — mark them in place or move them?
  Mark them in place with a "done" flag.
> Should `todo list` show completed items by default?
  No, hide them unless --all is passed.
> What if todos.json doesn't exist yet?
  Create it silently on first add.

注意这三个问题的形状:它们都不是"你要什么功能",而是"这个功能具体怎么表现"。这种问法正是这一步的价值——它在你还没花一分执行成本的时候,把分岔路口一个个堵上。

产物:两个文件

文件里面是什么谁会读它
01-CONTEXT.md结构化的实现决定。其中有带编号的"锁定决定"(D-01、D-02…)研究代理(决定该查什么)、规划代理(必须遵守这些决定)、计划检查器(专门有一个维度叫"上下文合规",检查计划有没有违背它)
01-DISCUSSION-LOG.md这次讨论的完整人类可读记录:讨论了哪些方面、给了哪些选项、你选了哪个、哪些留给 AI 自主决定只有人。自动化流程不读它,它是给你复盘用的
✅ 打开看一眼

官方教程让你跑完这一步就打开 01-CONTEXT.md,找到 ## Implementation Decisions 那一段。那里应该是你自己的话。如果不是,说明刚才的讨论跑偏了——现在改(几秒钟)比等到执行完再改(几小时)便宜得多。

常用的几个开关

写法作用什么时候用
/gsd-discuss-phase 1就阶段 1 做一次交互讨论(编号可省,默认当前阶段)常规用法
--all跳过"选哪个方面讨论"这一步,把所有灰区一次性问完你对这个阶段很有想法,不想被筛选
--auto所有问题都自动选推荐值无人值守跑;代价是这一步的全部价值归零
--assumptions不做交互,让 AI 把它对代码库的假设列出来给你看老仓库改造,你想先看它"以为"的是什么
--batch把问题打包成一批问,而不是一问一答问题多、你嫌来回慢
--analyze在讨论里附带权衡分析这个决定有真实取舍,你需要依据
⚠️ 什么时候跳过这一步是合理的

在 yolo 这种"快速原型"档位下,配置项 workflow.skip_discuss 可以直接关掉讨论。官方给的适用场景是:你不在乎这个阶段的实现细节,或者踩错了也无所谓。如果你在乎,别关——这一步省下的时间会从后面加倍还回去。

07Plan:拆成能互不打架的小计划

这一步是整条流程里最厚的一步,因为它内部其实跑了三个不同角色,顺序执行:

1
研究代理(researcher)——先查清楚

拿着你在 Discuss 里定下的 01-CONTEXT.md,去查这个阶段"该怎么实现"。产出 01-RESEARCH.md。它是 4 个并行实例,分别研究技术栈、功能点、架构、以及坑(pitfalls)。

2
规划代理(planner)——再拆成小计划

把研究和你的决定合起来,产出若干份 PLAN.md。每一份是一个"边界清晰、能在一个干净上下文里做完"的工作单元。

3
计划检查器(plan-checker)——在动手之前挑错

一个只读角色(工具权限里被明确禁掉了写文件和改文件),它按多个维度检查这些计划站不站得住,最多迭代 3 轮。它的价值在于:错误在纸面上被发现,比在代码里被发现便宜得多。

顺带说一个文档自相矛盾的地方:这个检查器到底查几个维度,官方给了两个答案——三份文档(how-to/plan-a-phase.md、INVENTORY.md、USER-GUIDE.md)说"8 个维度",而 docs/AGENTS.md 里逐条列了 12 个编号维度+3 个无编号维度。而且那两份"8 个"的清单连条目名字都对不上。下面表里我按 docs/AGENTS.md 的编号来引,因为那份最细。

一份计划长什么样

每份 PLAN.md 开头是一段叫 frontmatter 的元数据(夹在两行 --- 之间、机器读的结构化字段;.planning/ 里几乎所有文件都有)。官方给的例子:

---
phase: 03-post-feed
plan: 02
type: execute
wave: 2
depends_on: ["03-01"]
files_modified:
  - src/components/PostFeed.tsx
  - src/components/PostCard.tsx
autonomous: true
requirements: ["FEED-01", "FEED-03"]

must_haves:
  truths:
    - "User can scroll through posts from followed accounts"
    - "Each post shows author avatar, name, timestamp, and content"
  artifacts:
    - path: "src/components/PostFeed.tsx"
      provides: "Scrollable post list"
      min_lines: 40
---

文件名的编号规则是"阶段号-计划号-类型":03-02-PLAN.md 读作"第三阶段、第二份计划"。阶段号是两位补零的。

四个必须理解的字段

字段它是什么意思为什么它在防一件事
wave(波次) 执行批次。第 1 波里的计划互不依赖,可以同时跑;第 2 波要等第 1 波全部完成 让并行真正安全——如果两个计划都要改同一个文件,同时跑就是互相踩
depends_on 这份计划必须等哪些计划先完成 把"顺序"显式写出来,而不是靠执行时的运气
files_modified 这份计划会创建或改动哪些文件 让检查器能算出来"同一波里有没有两份计划碰同一个文件",有就拆开
must_haves 这个阶段"必须为真"的事:一条条可观察的事实(truths)、必须存在的产物(artifacts)、必须接上的关联(key_links) 这是验证的靶子。验证代理不是"看代码写完没",而是拿这张清单一条条去核对

计划检查器查什么

它按"维度"编号检查,官方 docs/AGENTS.md 列了这些(节选最影响你日常的几条):

维度它检查什么对你的意义
1 · 需求覆盖这个阶段的每一条 REQ-ID 是不是都至少出现在一份计划里空的需求列表是阻断级问题(BLOCKER),不是提醒
2 · 任务完整性每份计划自己是不是能独立做完防止"做一半发现缺前置"
3 · 依赖正确性波次和依赖关系排得对不对排错会让执行卡住或互相覆盖
3b · 未声明耦合同一波里两份计划是否通过共享状态(同一个配置键、同一张表、同一个环境变量)暗中耦合这类冲突不会在文件层面暴露,所以单独有一条
5 · 范围合理性计划是不是太大或太小太大 = 执行代理会开始猜
7 · 上下文合规计划有没有违背 CONTEXT.md 里你锁定的决定这是"讨论了但被无视"的防线
7b · 范围缩水检测计划是不是悄悄把你要求的东西砍小了静默缩水比直接失败更危险
12 · 模式一致性新文件有没有按仓库里已有的同类文件来写防止代码库长出两套风格

常用的开关

/gsd-plan-phase 1                    # 研究 + 规划 + 复查一个阶段(最常用)
/gsd-plan-phase 3 --skip-research      # 领域很熟,跳过研究
/gsd-plan-phase 1 --mvp              # 按"垂直切片"来排计划(默认就是这个,见下)
/gsd-plan-phase 1 --tdd              # 让每个加行为的小任务都从"先写一个失败的测试"开始
/gsd-plan-phase 1 --gaps             # 补缺口模式:读验证报告,只规划没做到的部分
/gsd-plan-phase --research-phase 4    # 只做研究,写完 RESEARCH.md 就退出,不进入规划
/gsd-plan-phase --auto               # 跳过所有交互确认
📎 "垂直切片"和 tracer(探针)

默认情况下,规划代理会让每份计划先做一条从头到尾、能真正跑通的细线(官方叫 tracer,"示踪弹"),确认这条路通了,再在上面加宽度。这跟"先把所有数据层写完、再写所有界面"的水平做法相反。官方给出的理由是:一条通的细线能最早暴露"这个设计根本走不通",而水平分层要等到最后才发现。想回到老做法用 --no-tracer。

✅ 一组能自查的数字("计划多大算合适")

官方在上下文预算的参考文档里给了一组很具体的尺子,你可以拿它检查自己看到的计划:

  • 一份计划最多 2–3 个任务;写到 4 个是警告,5 个以上是阻断级问题(BLOCKER)。
  • 一份计划涉及 8–10 个文件是正常范围;15 个以上同样是阻断级。
  • 目标是让一份计划吃掉大约 50% 的上下文,而不是 80%。单个计划的估算成本超过 40% 就是该拆的信号。
  • 对应的配置项是 workflow.smart_zone_tokens,默认 100,000 token。超了会给你一条"建议拆开"的提示——提示不阻断,官方措辞是 "advisory only, never a block"。

另外还有几个默认值会影响你的体感:并行执行最多同时开 3 个代理(parallelization.max_concurrent_agents),少于 2 份计划就不并行(min_plans_for_parallel),以及子代理超时是 5 分钟(workflow.subagent_timeout = 300000 毫秒)。

08Execute:一波一波并行地写

你敲下 /gsd-execute-phase 1 之后,编排器会:

1
按 wave 分组

把计划按依赖关系排成一批批的"波次"。同一波里的计划互不依赖,可以同时开工。

2
每份计划派一个全新的执行代理

官方原话是每个执行代理拿到"a fresh 200k-token context window loaded with exactly what it needs: the project summary, the phase context, the research, and the specific PLAN.md for its task. Nothing more."——只给它那一份计划相关的材料,别的一概不给。

3
每个任务一次提交

执行代理写代码,并且每完成一个任务就做一次 git 提交(官方叫"原子提交"——一个提交只包含一件事,做坏了能单独退回来)。

4
波次之间合流

一波全部完成后,编排器合并状态,再开下一波。

官方教程里给的执行输出长这样——注意每一行对应一份计划:

Wave 1 (parallel):
  [Executor A] → 01-01-PLAN.md (read/write helpers)   ✓ committed
  [Executor B] → 01-02-PLAN.md (CLI commands)          ✓ committed

[Verifier] Checking codebase against phase goals...
  CLI-01 todo add   ✓   CLI-03 todo done  ✓
  CLI-02 todo list  ✓   CLI-04 --all flag ✓
  Status: PASS

产物:每个计划一份总结

执行代理干完会写一份 01-01-SUMMARY.md,内容是:做了什么、跟计划有哪些偏离、以及对着验收标准做的自检。这里"偏离"是明写出来的——计划执行中遇到意外而改道是正常的,悄悄改道才不正常。

还有一个细节值得知道:如果计划里带了成本预估,总结里会记下实际花了多少(actuals 字段:token 数、任务数、提交数)。这些实际值会被收集起来做校准,让后续的预估越来越准。

另一个必须知道的机制:人机确认点(checkpoint)。有些任务不是 AI 能自己做完的——需要你登录某个网站、手动去某个后台拿一个密钥、或者做一个只有你能拍板的决定。这类任务会被标成 checkpoint,执行到这里它会停下来等你。官方文档里给了三类确认点的分布比例:要你核对结果的约占 90%,要你做决定的约占 9%,要你亲手去做某个动作的约占 1%。GSD 的输出格式统一成这样:

### CHECKPOINT: Verification Required

Progress: 5/8 tasks complete
Task: Responsive dashboard layout

How to verify:
  1. Visit: http://localhost:3000/dashboard

---

**→ YOUR ACTION: Type "approved" or describe issues**
✅ 怎么读它的输出

官方明确规定只有三种标记:### GSD ► {阶段名} 表示一次大的流程转换;### CHECKPOINT: {类型} 表示它在等你,最后那行加粗的 **→ …** 告诉你该打什么字;--- 是段落分隔。认准这三样,输出就不会看晕。

并行写代码,两个代理会不会互相覆盖?
设计上是靠两件事防的:波次划分(会碰同一个文件的计划被排进不同波)和文件清单(每份计划声明自己改哪些文件,检查器据此算冲突)。官方还额外盯了一类"文件层面看不出来"的冲突——两份计划通过同一个配置键或同一张表暗中耦合,这类会被单独标出来问你是否故意的。
并行执行时,我的 git hook 还会在每次提交时跑吗?
不会。并行执行的代理是用 --no-verify 提交的,所以 hook 在每一波结束时跑一次,而不是每个提交跑一次。官方给的原话是:如果你需要 hook 逐次提交都跑,就把 parallelization.enabled 设成 false。这一点在你依赖某个提交前检查(比如密钥扫描)时很关键。
它说"卡住了",我要不要按 Ctrl+C?
不要。官方明确写过:子代理跑在另一个上下文窗口里,它干活的过程在主会话里是看不见的——所以"看着没动静"是正常的,研究和规划类代理通常要 1–5 分钟。原话是 "Do not interrupt the session. Wait for the result."

09Verify:写完了 ≠ 能用了

这一步存在的理由,官方一句话说清了(原文):

📄 官方教程 · 原文

"'The code was written' and 'the code works' are different claims. Verify proves the second one before you open a PR."

(大意:"代码写完了"和"代码能用"是两个不同的主张。验证要在你开 PR 之前把第二个主张证出来。)

这里其实是两层验证,别搞混

第一层:自动验证第二层:人工验收
谁在干验证代理(verifier),一个不许改代码的只读角色你,按它给你的一条条检查项动手试
什么时候跑执行阶段末尾自动跑你敲 /gsd-verify-work 1 时
它对什么对着计划里的 must_haves 清单,逐条核对代码库对着"用户能看见的行为"
产出01-VERIFICATION.md,状态是 passed / gaps_found / human_needed 三者之一01-UAT.md(UAT = 用户验收测试,就是"让真人按真实用法试一遍")

自动那一层不只查"需求有没有覆盖",还查"你在 Discuss 里定下的决定有没有真被落实"。官方对此的措辞很硬:"A phase is not done because execution finished without errors. It is done because what was built is what was planned, and what was planned is what was decided."——阶段完成不是"执行没报错",而是"建出来的就是规划要的,规划要的就是你定的"。

人工验收是怎么进行的

它读这个阶段所有 SUMMARY.md,把里面用户能看见的交付物变成一条条检查项,一次只给你一条:

### CHECKPOINT: Verification Required

**Test 1: Add a to-do**

Running `node todo.js add "buy milk"` creates a pending item without errors.

---

**Type `pass` or describe what's wrong.**

符合就打 pass;不符合就把差异描述出来。答案记进 01-UAT.md,然后它给下一条。如果有检查失败,它先诊断根因、写一份修复计划,然后你重新跑 /gsd-execute-phase 1 再验一次——而不是让你自己瞎改。

一个值得单独讲的诚实设计

验证代理有一条规则,我觉得是整套系统里最能说明"这作者是真在解决问题"的一处:

✅ 它会区分"符号在"和"行为对"

如果一条 must_haves 声明的是一个行为(比如"取消之后资源要被清掉"、"操作顺序不能颠倒"),而没有任何测试真的跑过这个行为,它会把这条标成 ⚠️ PRESENT_BEHAVIOR_UNVERIFIED("东西在,但行为没被验证过"),而不是给个 ✓ 就算数。

而且这个标记不计入通过分数,会被单独统计、并被转成"需要人来验"的条目。换句话说:一个满分 N/N 证明的是"行为被验证过",而不只是"名字出现了"。这条规则在 AI 编程工具里不常见——大多数验证只做到"文件存在、函数名对得上"。

那我不就有两轮"测试"了吗,重复吗?
不重复,它们对的是两件不同的事。自动验证回答"跟计划对不对得上"(需求覆盖、决定覆盖、目标对齐);人工验收回答"这东西在真实使用里是不是真的能用"。一个函数可以完全符合计划、测试全绿,但界面上按钮点下去没反应——这种事只有第二层能抓到。

10Ship:开出 PR,然后重复

/gsd-ship 1

它会把这一阶段攒下来的东西——需求、决定、验证证据——组装成一个拉取请求(PR,也就是"请把我的分支合进主干"的正式请求),正文是自动生成的,固定五段结构:

Summary
这一阶段做了什么
Changes
改了哪些东西
Requirements Addressed
对上了哪几条 REQ-ID
Verification
验证是怎么过的、证据是什么
Key Decisions
这一步定下了哪些关键决定
归档
阶段归档,STATE.md 标记完成,循环重启

官方给的回显示例:

Pull request created: https://github.com/your-org/your-repo/pull/1
Title: Phase 01: core-cli
✅ 请注意它没有做什么

官方教程特意标了一句:PR 只是开出来等评审,没有任何东西被合进主干。合并仍然是你(或你的团队)的决定。这个边界划得挺重要——它自动化的不是"发布",是"攒证据 + 写说明书"。

然后就是重复

多阶段项目就是把这个五步对每个阶段各跑一遍。如果你不确定下一个该干什么:

/gsd-progress --next       # 让它读状态、判断下一步,并直接执行
/gsd-progress              # 只告诉你现在在哪、下一步是什么

整个项目的一个里程碑走完之后,还有两条收尾命令:/gsd-audit-milestone(横向检查需求覆盖、找出没写完只留了个空壳的代码)和 /gsd-complete-milestone(归档、打标签)。

两件按需开启的事,别等到踩了才知道

把规划文件藏起来(但要知道代价)

.planning/ 默认是会进 git 的。如果你想让它不进仓库,官方给了两个键,它们是回答两个不同问题的:

你想要的怎么配你要放弃什么
规划文件根本不进 gitplanning.commit_docs: false(再把 .planning/ 加进 .gitignore)并行执行直接失效。因为执行代理跑在独立的 worktree(git 的"并行工作副本")里,而 worktree 是从提交检出的——没被提交的 .planning/ 在它里面根本不存在,执行代理读不到计划文件。另外 /gsd-undo 也没有历史可回退
规划文件本地有版本、但绝不推到远端planning.commit_docs: true + planning.pr_strict: true什么都不用放弃。但你自己不能推工作分支,要推的是它生成的那个 -pr 分支

官方把这条讲得很清楚,我直接把它当成一个"必须提前知道"的坑列在这里——"本地保留规划"和"并行执行"在这套设计里是互斥的,这是很多人事后才发现的事。

按阶段类型换模型省点钱

默认档位是 balanced(均衡)。想按环节分别指定模型,在 .planning/config.json 里加一个 models 块:

{
  "model_profile": "balanced",
  "models": {
    "planning": "opus",
    "discuss": "opus",
    "research": "sonnet",
    "execution": "opus",
    "verification": "sonnet",
    "completion": "sonnet"
  }
}

要给某个具体代理开小灶,再加一个 model_overrides,它的优先级高于 models:

{
  "models": { "research": "sonnet" },
  "model_overrides": {
    "gsd-codebase-mapper": "haiku"
  }
}
⚠️ 省钱的顺序反了

官方给了一条反直觉的建议:在调模型档位之前,先去关掉你不需要的 MCP 服务。MCP 是"给 AI 挂外部工具"的协议,每挂一个,它的工具说明就会塞进每一轮请求里——官方给的量级是"重的服务每个能吃掉 20k+ token"。而这属于你那个工具(harness)的设置,不是 GSD 的设置,写在 .claude/settings.json 里。

{
  "enabledMcpjsonServers": ["context7"],
  "disabledMcpjsonServers": ["playwright", "mac-tools"]
}

判断法很简单:这个阶段没有界面工作,那浏览器类的工具开着干什么?

11最小例子:一遍完整走查(todo CLI)

官方新手教程选的例子是一个命令行工具(CLI)——就是那种在终端里敲一条命令、它打印一行结果的程序。这个待办工具只用 Node 内置库、没有任何外部依赖,目的是让你把注意力全放在流程上,而不是工具链上。下面是它完整的八步,命令都是可以照抄的。

前置检查

node --version      # 官方教程写"要 ≥ 22";但包的 engines 字段要求 ≥ 24(见第 03 节)
npm --version       # ≥ 10
git --version
gh --version && gh auth status   # gh 是 GitHub 的命令行工具;没登录先跑 gh auth login

# 没有空仓库的话,用 gh 建一个并克隆下来
gh repo create gsd-todo-tutorial --private --clone
cd gsd-todo-tutorial
git remote get-url origin

第 1 步 · 装

npx @opengsd/gsd-core@latest --claude --local
# 装完重启 Claude Code

第 2 步 · 打开你的 AI 工具

claude
🚫 关于 --dangerously-skip-permissions

官方教程用的是 claude --dangerously-skip-permissions,它会跳过每一次文件读写确认。官方对它的说明是:只在你确认这个目录是可丢弃的一次性练习时用;正经项目请先读安全模型那一节。我的建议更保守一点:第一次走查可以开着,但别在有你真实代码的仓库里开。

第 3 步 · 立项

/gsd-new-project

第一个问题永远是"你想做什么",粘这段:

A Node.js CLI tool for managing to-do items. Users run `todo add "buy milk"`,
`todo list`, and `todo done 1`. Items are saved to a local todos.json file.
No external dependencies — Node built-ins only.

然后回答澄清问题;被问到"每个阶段规划前要不要先研究"时选 No(这个项目小、领域熟,研究只会多花 token 和时间);工作流设置取推荐默认值;等大约一分钟的路线图;最后打 Approve。

✅ 现在去打开这个文件

.planning/ROADMAP.md。阶段 1 上写着 Goal(目标)、Requirements(需求编号)、Success Criteria(成功判据——可观察的行为)。这份文件是接下来全程的地图。

第 4 步 · 清空,然后讨论阶段 1

/clear
/gsd-discuss-phase 1

它会问你怎么实现,比如"已完成的项目是原地标记还是挪走"。答完去看 .planning/phases/01-core-cli/01-CONTEXT.md,找 ## Implementation Decisions——那里应该是你刚才说的话。

第 5 步 · 规划阶段 1

/gsd-plan-phase 1

被问"规划前要不要研究"时选 Skip research。然后规划代理把 01-CONTEXT.md 变成几份小计划,计划检查器逐份复查后存盘:

.planning/phases/01-core-cli/
  01-01-PLAN.md       ← 任务:todos.json 的读写辅助函数
  01-02-PLAN.md       ← 任务:add / list / done 三个命令

打开 01-01-PLAN.md 看 <task> 块:任务名、涉及文件、动作步骤、一条 <verify> 命令、以及"什么算做完"。那条验证命令不是装饰——执行代理写完代码会真的跑它。

第 6 步 · 执行阶段 1

/gsd-execute-phase 1

它把计划分组进波次,每份计划开一个全新的 200k 上下文执行代理,每个任务一次提交。跑完之后——这是你第一次看见真的东西:

node todo.js add "buy milk"
node todo.js add "write tests"
node todo.js list        # → 两条都在
node todo.js done 1
node todo.js list        # → 只剩 "write tests"

第一条勾掉之后从默认列表里消失了——说明第 4 步里你定的那条决定("默认不显示已完成")真的被执行了。执行的产出:

.planning/phases/01-core-cli/
  01-01-SUMMARY.md    ← 执行代理 A 建了什么、提交了什么
  01-02-SUMMARY.md    ← 执行代理 B 建了什么、提交了什么
  01-VERIFICATION.md  ← 需求覆盖结果:PASS

第 7 步 · 验证

/gsd-verify-work 1

它会一条一条问你,比如"跑 node todo.js add "buy milk" 是不是能正常加进去"。符合就打 pass;不符合就描述差异,它会诊断、写修复计划,你再回到第 6 步重跑。

第 8 步 · 发出去

/gsd-ship 1

PR 开出来,正文五段齐全。一个阶段从想法到 PR,到此走完。多阶段项目就重复第 4–8 步。

📎 这个例子故意做小了

官方原话:"Small on purpose. Once the loop is muscle memory, the exact same eight steps scale to a real multi-phase product."——把它做小是故意的:等这八步成了肌肉记忆,同一套步骤原样放大到真实的多阶段产品上。

12.planning/ 地图:我该看哪个文件

这是整套系统里最实用的一节。因为一旦你开始用 GSD,项目里会多出一堆文件,而"我到底该打开哪一个"是最高频的问题。

目录长什么样

.planning/
├── PROJECT.md            # 项目身份:这是什么、给谁用、核心价值
├── ROADMAP.md            # 路线图:里程碑 + 阶段 + 每个阶段的目标与成功判据
├── REQUIREMENTS.md       # 需求清单:每条一个编号(AUTH-01 这样)
├── STATE.md              # 状态:项目现在走到哪了(目标:100 行以内)
├── config.json           # 你在这台项目上的工作流配置
├── state.json            # 同一个状态的机器可读版(给外部工具读的合同文件)
├── codebase/             # 代码库地图(老仓库接手时生成)
├── onboarding/
│   └── SUMMARY.md        # 接手记录:下一步该跑什么命令
└── phases/
    └── 01-core-cli/                    # 每个阶段一个目录
        ├── 01-CONTEXT.md               # 你定的实现决定(Discuss 产物)
        ├── 01-DISCUSSION-LOG.md        # 讨论全程记录(给人看的)
        ├── 01-RESEARCH.md              # 研究结论(Plan 产物)
        ├── 01-VALIDATION.md            # 测试覆盖策略
        ├── 01-PATTERNS.md              # 新文件对应的老文件范本
        ├── 01-01-PLAN.md               # 第 1 份计划
        ├── 01-01-SUMMARY.md            # 第 1 份计划的执行记录
        ├── 01-VERIFICATION.md          # 阶段目标的验证报告
        ├── 01-UAT.md                   # 人工验收的问答记录
        └── .continue-here.md           # 暂停后的续做说明

命名规则是死的,认识了就能一眼认出文件属于谁:阶段级是 阶段号-名字.md(三位一体:03-CONTEXT.md);计划级是 阶段号-计划号-名字.md(03-02-PLAN.md)。号都是两位、补零。

谁写、谁读、你什么时候该看

文件谁写它谁依赖它你什么时候该打开它
ROADMAP.md/gsd-new-project后面每一步都读接手一个新项目时第一个看它:确认阶段切分和成功判据合不合你的意
REQUIREMENTS.md/gsd-new-project规划代理、计划检查器验收前对账:"我要的东西是不是都在这个清单上"
STATE.md所有步骤持续更新所有步骤开跑前都读迷路时看它。它记录了当前阶段、进度百分比、待处理事项和阻塞
config.json/gsd-new-project、/gsd-settings每个步骤、每个代理想改行为、换模型、调开销时
state.jsonGSD 在固定的步骤边界自动刷新外部看板 / 你自己的脚本你想写脚本读进度时用它,别去解析 Markdown。官方原话是"你永远不需要用启发式规则去解析 STATE.md 或 ROADMAP.md";里面的键永远存在,读不到就是 null
01-CONTEXT.md/gsd-discuss-phase研究、规划、计划检查执行前扫一眼,确认"你定的决定"没被理解歪
01-01-PLAN.md/gsd-plan-phase执行代理、验证代理怀疑"它是不是做偏离了"时,这里是原始约定
01-01-SUMMARY.md执行代理/gsd-progress、后续计划想知道"它说自己做了什么、哪里偏离了"时
01-VERIFICATION.md验证代理/gsd-progress、缺口修复规划开 PR 前看它的 status。它是"能不能发"的凭据
01-UAT.md你(通过问答)重新开始验收时验收中断后想续做时
.continue-here.md/gsd-pause-work任何在当前阶段启动的流程你暂停过工作、现在要接着做时

STATE.md 里面到底长什么样

它是整个系统的"导航层"。官方给的结构示例(节选):

---
gsd_state_version: '1.0'
milestone: v2.0
status: executing
active_phase: "4.5"
next_action: execute-phase
progress:
  total_phases: 17
  completed_phases: 10
  total_plans: 84
  completed_plans: 47
  percent: 59
---

两个细节值得知道,因为它们解释了"为什么有些规矩看起来莫名其妙":

⚠️ 这个文件不要"手写追加"

官方文档里有一段很长的警告,核心是一句话:## Current Position 这一段是"覆盖"语义,不是"追加"语义。你再写一行 Phase: 不是"新的位置",而是格式错误的数据;而且它按"形式"决定信哪一行——加粗的那一行优先于普通行,也就是说你为了强调而加粗追加的一行,会静默覆盖掉前面的正确值。要改就整段替换,别加行。

真出了问题也不用怕,有修复命令:

node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" state validate      # 检测漂移
node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" state sync --verify  # 预览要改什么
node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" state sync           # 按磁盘现状重建
✅ 一个反直觉的坑

state validate 报 valid:true 不等于"一切正常"。官方专门提醒:返回里还有一个 scope 字段,用来说明"这次检查到底跑起来了没有"——如果某个阶段根本没法解析、或者目录读不到,它也会报 valid:true,因为压根没有东西可标记。所以看这个命令的结果要连 scope 一起看。

13命令速查表

1.13.0 一共随包发布 72 个命令。你不需要记住它们——需要的是知道有哪几类,以及最常用的那十来条。

核心循环(这五条就是全部主干)

/gsd-new-project                  # 立项:全新项目
/gsd-onboard                      # 立项:已有代码的老仓库
/gsd-discuss-phase 1              # ① 讨论怎么做
/gsd-plan-phase 1                 # ② 研究 + 规划 + 复查
/gsd-execute-phase 1              # ③ 分波并行执行
/gsd-verify-work 1                # ④ 人工验收
/gsd-ship 1                       # ⑤ 开 PR

按场景查

你现在想做的事命令说明
我迷路了 / 想接着上次做/gsd-progress告诉你现在在哪、下一步是什么
/gsd-progress --next直接判断并执行下一步
/gsd-next推进到下一步
/gsd-resume-work从上次会话完整恢复上下文
/gsd-pause-work暂停,并写下续做说明
/gsd-health体检:安装、作用域冲突、状态一致性
我就改个小东西,不想走全流程/gsd-quick一次性小任务,仍带部分保障
/gsd-quick --full小任务但走完整质量管道(讨论+研究+复查+验证)
一次批量处理好几件小事/gsd-quick-batch一个协调者统一规划、派发、合并
无人值守跑完剩下的阶段/gsd-autonomous自动推进;风险与代价见 15
改配置(交互式)/gsd-settings最常用的配置入口
改配置(单点)/gsd-config --profile budget切换预算档;也支持逐键设置
看它到底装进来了什么/gsd-surface列出当前生效的命令/代理/技能
阶段中间要插活/删活/gsd-phase、--insert 3、--remove 7、--edit 4增、插、删、改阶段
把老仓库摸清楚/gsd-map-codebase生成 .planning/codebase/ 下的代码库地图
代码质量/gsd-code-review、/gsd-debug、/gsd-secure-phase评审、调试、安全核查
前端阶段/gsd-ui-phase、/gsd-ui-review先写设计契约,再做视觉审计
里程碑收尾/gsd-audit-milestone、/gsd-complete-milestone横向核对 → 归档打标签
更新 GSD 本身/gsd-update检查并升级
撤销上一步/gsd-undo依赖 git 历史——所以规划文件没进 git 时它也没得退

另一个省 token 的入口:命名空间

命令多了之后有个副作用:技能清单本身也占 token,而且每一轮都要重新发一遍。1.13.0 里加了 6 个"命名空间路由"命令来缓解这件事——官方给的数字是:6 个路由大约 120 token,而把 86 个技能平铺列出来大约 2,150 token。

/gsd-workflow     # 阶段流水线:discuss / plan / execute / verify / phase / progress / next
/gsd-project      # 项目生命周期:里程碑、审计、总结
/gsd-quality      # 质量闸门:评审、调试、审计、安全、评估、界面
/gsd-context      # 代码库情报:地图、图谱、文档、经验
/gsd-manage       # 管理:配置、工作区、线程、更新、发布
/gsd-ideate       # 探索与记录:探索、草图、探针、规格、速记

官方明说这几个路由是附加的:每一条具体命令都仍然可以直接敲,不会因为加了路由就失效。

档位预设:速度 vs 质量

如果你不想一个个调,官方给了一张三档预设表,直接照场景选:

场景模式粒度模型档研究计划复查验证
做原型yolocoarse(粗)budget关关关
日常开发interactivestandardbalanced开开开
要上生产interactivefine(细)quality开开开

14常见坑与排错

八类常见故障的分诊表

症状最可能的原因怎么办
敲 /gsd- 什么都不出来装完之后没重启你的 AI 工具重启。命令是启动时加载的
命令出现了两个、行为怪全局和本地都装了,作用域打架跑 /gsd-health 看 W028 诊断,它会告诉你哪一份在赢(Claude Code 上全局那份总是赢)
屏幕上显示 Spawning researchers… 就不动了子代理跑在独立上下文里,过程你看不见别打断。研究和规划通常 1–5 分钟。真卡死了再 /clear 重跑这一步
进度、百分比看起来不对状态文件和磁盘上的实际内容不一致了gsd-tools.cjs state validate → state sync --verify → state sync。注意看返回里的 scope 字段(见 12)
计划看着不对、跑偏了跳过了讨论,规划代理只能自己猜补跑 /gsd-discuss-phase N 再重新规划。官方原话:"多数计划质量问题来自 Claude 做了本可被 CONTEXT.md 挡住的假设"
执行出来的东西是半成品/空壳计划太大,执行代理做到后面没力气了拆小重规划。官方给的尺子是一份计划 2–3 个任务封顶
账单太高模型档位高、研究/复查全开、MCP 挂太多按这个顺序:先关不需要的 MCP(每个重的能到 20k token/轮)→ 再切 /gsd-config --profile budget → 再关研究和计划复查
执行一开始就报 FATAL: worktree base mismatch(退出码 42)你的 AI 工具从 origin/HEAD(远端的头)而不是你的 HEAD(本地的头)叉出执行用的工作副本,于是只存在于你本地的计划文件在副本里根本看不到官方原话是这时"所有隔离执行器立刻停机,零进度"——这是设计如此,防止在错误的树里静默改动。现象上它会自动降级为串行并给一行警告;想恢复并行,把你的分支推上去或合并,再用 worktree set-baseref
并行执行莫名失效要么被上面的基址问题降级成串行,要么是 planning.commit_docs: false 让 .planning/ 不在 git 里,而 worktree 是从提交检出的先看 /gsd-health 有没有 W025(分支分叉降级);规划文件那条要改成提交 + 用 planning.pr_strict: true 保住"不推到远端"(见 10)

三件我核对过、但文档没说清的"版本陷阱"

⚠️ ① 文档里的版本号和包版本号对不上——原因官方自己写过,但埋在了一个归档文件里

仓库文档里到处是形如 v1.26、v1.40.0、v1.42.1、v1.50.0-canary.1 的功能标记,但:
· package.json 是 1.13.0;
· CHANGELOG.md 里 21 个条目(1 个 Unreleased + 20 个正式版),最高就是 1.13.0,从来没有过 1.26 或 1.38;
· npm registry 上 38 个版本,最高也是 1.13.0。
这不是笔误。我在 docs/RELEASE-NOTES-LEGACY.md 里找到了原因:这个项目改过名。它以前叫 get-shit-done-cc,后叫 @opengsd/get-shit-done-redux,那条线从 1.0.0 一路发到 1.42.3(另有一串 canary 到 1.50.0-canary.1,2025-12-14 到 2026-05-15);改名成 @opengsd/gsd-core 之后,版本号从 1.0.0 重新开始数。

那份归档文件自己写了一句警告(原文大意):"因为 @opengsd/gsd-core 这条线复用了低位版本号……下面这些旧的 1.x 数字会与当前的撞车。"

实用结论:你在这些文档里读到的任何"自 v1.26 起支持"之类的句子,说的都是已经退役的那条产品线,不代表你现在装的 1.13.0。想确认某个功能到底在不在,唯一可靠的办法是去你本地的 /gsd-help、/gsd-surface 或命令目录里找,而不是读文档里的版本标记。

我核实这一点的方法是:把标着 v1.42.1 的功能(包合法性闸门,gsd-core/bin/lib/package-legitimacy.cjs)拿到 npm 上 1.13.0 的实际包体里去找——功能在,版本标记对不上。也就是说文档描述的代码是当前的,只有版本号来自旧世系。

⚠️ ② 仓库 main 分支 ≠ 你装到的版本

我克隆 main 时它停在 commit a0270a7(2026-09-12),而 npm 上最新版是 2026-09-06 发的 1.13.0。更要紧的是:main 上堆着 85 个还没发布的变更记录(.changeset/ 目录里的待发布条目)。所以你在 GitHub 上读到的文档,描述的可能是你装的那个版本里还不存在的行为。

⚠️ ③ 这份项目自己动得很快,而且发版记录里有重复

我把 npm registry 的时间线拉出来算了一下:包 2026-05-30 首次发布,到 9 月 6 日已经发了 38 个版本;其中 1.7.0(7 月 15 日)到 1.13.0(9 月 6 日)是 53 天里发了 7 个次版本。仓库里的 CHANGELOG.md 有 80 多万字节、1,875 行,覆盖 20 个正式版,平均约 5 天一个版本。

更值得你知道的是:发版记录本身有明显复制粘贴的痕迹。有人逐条比对过版本正文里的条目,结果是 1.8.0 有 98.9% 的内容是 1.7.0 的逐字复制(1.7.0 的 175 条独立条目里有 173 条原样出现在 1.8.0 里);1.5.0 也整段带上了 1.4.1 的全部条目;同一个修复甚至同时挂在两个版本下面。此外 .changeset/ 里还堆着 84 条尚未发布的变更记录,其中约 73% 是缺陷修复。

结论:这篇里所有"多少个命令、哪些开关、什么默认值"的事实,几个月内都会变。核对日期是 2026-09-13,读到时请以你本地的 /gsd-help 和 /gsd-surface 输出为准。这也是为什么本文的时效标记是 volatile(强时效)而不是"不太会过时"。

两处"某个机制说自己会保护你、但做得没那么全"的地方

这两条与使用无关,但与你能不能相信它的告警有关,所以我单独摆出来。

⚠️ ① 上下文告警有三个不同的阈值,分别属于三个子系统

你会看到三组数字,它们测的东西不一样,但用的词一样:

子系统它报什么阈值
运行时那个监控 hook(gsd-context-monitor.js)还剩多少上下文剩余 ≤35% 警告,≤25% 严重
/gsd-health --context用了多少上下文用到 60% 警告,70% 严重
执行阶段的上下文闸(context_guard)阶段划分50–70% 算"退化中",70%+ 算"差"

把第一行的"剩余 35%"换算成"已用",是 65%;而第二行说的是 60%。两个都在跑的告警器差了 5 个百分点。看到"上下文告警"时,先确认是哪一条在说话。

⚠️ ② "卡住的守卫不再自我失效"这个修复,只落在了其中一条安装路径上

1.13.0 的更新日志里有一条修复,说六个"会阻断的"前置守卫(守卫 = 在某类操作真正执行前先检查一次"允不允许"的 hook)超时上限从 5 秒提到了 120 秒,理由是"宿主把超时的 hook 当成放行",而实测卡顿到了 84.3 秒。这个修复我核实过,确实写在代码里(BLOCKING_GUARD_TIMEOUT_S = 120)。

但是仓库自带的那份插件清单 hooks/hooks.json 里,同一批守卫声明的仍然是 "timeout": 5,而那份插件的版本号也是 1.13.0。也就是说:走安装器这条路拿到了新预算,走插件这条路还是旧预算。这条不是我要你去修什么,而是提醒你——更新日志里的"已修复",不代表所有安装路径都拿到了那个修复。

另外三处我数出来的小出入(都不影响使用,但说明文档别全信)

15什么时候别用它(含它自己承认的安全边界)

官方自己给的"别用"判据

这部分特别值得读,因为它是作者自己写下来的,不是外人挑刺:

📄 docs/explanation/context-engineering.md · 原文

"A useful rule of thumb: if the task could be fully specified in a single, short prompt and completed in one agent turn without further clarification, skip the phase loop. If the task requires research, involves files you have not read recently, or depends on decisions that are not yet settled, the phase loop protects you."

(大意:一个有用的经验法则——如果这件事能用一条短提示写清楚、并且一轮就能干完,就别用阶段循环。如果它需要查资料、涉及你最近没读过的文件、或者依赖还没定下来的决定,阶段循环才是在保护你。)

文档还点名了三种明确不该用的情形:改变量名、修错别字、补一个漏掉的 import——这些用 /gsd-quick,或者干脆别用 GSD。/gsd-quick-batch 里也写了类似的话:这个命令不支持 --discuss 和 --full,会直接报用法错误。

代价是真实的,官方没藏

代价官方原话的意思你该怎么权衡
额外开销把 /gsd-discuss-phase、/gsd-plan-phase、/gsd-execute-phase 分成独立步骤跑,比直接打字说"写这个功能"要花更多总时间小改动上不值;跨文件、跨会话的工作上值
延迟开多个干净上下文的子代理,比在同一个上下文里直接改要慢研究和规划各自都有往返成本
简单任务的仪式感改个变量名走这套流程是杀鸡用牛刀这不是缺点,是选错了工具

它自己的总结是这样的(原文):"The overhead is real, but it is front-loaded — paid in minutes of planning rather than hours of rework."——开销是真的,但它是前置的:用几分钟的规划,换掉几小时的重做。

安全边界:它公开承认了什么做不到

这一节是我最想让读者看到的部分。GSD 有一份写得很扎实的安全模型,而且它明确列出了自己防不住什么——这在工具文档里很少见。

它做了哪几层防护

层防什么怎么防
供应链AI 幻觉出来的、或攻击者抢注的包名被真的装进你的项目(这类攻击有个名字叫 slopsquatting:抢注 AI 爱编的包名)研究代理推荐外部包时,逐个去 npm / PyPI / crates.io 查注册信息,给出 [SLOP](直接删掉)/ [SUS](要人确认)/[OK] 三档判定;来自网络搜索的包一律标 [ASSUMED],按可疑处理
提示注入你在文件、网页、依赖 README 里夹带的文字,被 AI 当成了指令执行装了扫描 hook(gsd-read-injection-scanner.js 覆盖网页抓取结果)、在代理提示里用 <security_context> 边界把这类内容标成"数据不是指令"
仓库与依赖完整性提交、锁文件被改提交校验 hook、锁文件与依赖审计
子进程任意命令执行按运行时的沙箱能力做约束

它明说自己防不住什么

🚫 官方原文承认的四个缺口

① 提示注入的检测是"只记录、不阻断"。原文:"The advisory-only posture means detection is logged but not blocked — a deliberate choice that preserves workflow continuity at the cost of not hard-stopping on a detection."——检测到了也只是记一笔,不会拦下来。这是有意换来的:保住流程连续性,代价是不硬停。

② 换了花样的注入它能漏。原文承认"新颖的越狱手法或低信号注入可能不被发现"。

③ 合法包事后被投毒,它抓不到。那个包合法性闸门查的是研究那一刻的注册信息;一个正规包后来被账号接管、或者它自己的依赖树被做手脚,不在它的覆盖范围内。官方明说这一类要靠锁文件和依赖审计。

④ 有些"边界"只是提示层面的,不是能力层面的。举个它自己举的例子:界面检查器被要求"永远不要执行 UI 规格文件里记录的那条命令"——但那个检查器手里确实有执行命令的权限(它启动技能时需要),而权限不是按命令粒度给的。所以"不许执行"是一句指令,不是一道物理墙。官方原话是 "that barrier is prompt-level only"。

🚫 关于"扩展能力",原话是:根本没有沙箱

GSD 有一套"能力(capability)"机制,可以装第三方扩展。它的信任模型文档里有这么一句(原文):

"There is no sandbox. The capability author has, in effect, a code-execution path into your runtime."

(大意:没有沙箱。能力的作者事实上拿到了一条可以往你的运行时里执行代码的路径。)同一份文档接着说:一个第三方能力一旦被你同意并安装,它就带着和 GSD 自己一样的权限运行,它没有被隔离——"就像一个恶意 npm 包一样"。

它给的三个保障是:你会知道你装了什么(同意)、你拿到的就是你被展示的那个东西(完整性校验)、你可以完整撤销它。然后它明确补了一句:这三件事不保证内容是安全的。而且校验用的那个哈希只覆盖最外层那一个包,不覆盖它拉下来的整棵依赖树。

实用结论:如果你只按本文学核心五步循环,你根本不会碰到这条路径——它属于"装第三方扩展"的场景。但如果你打算装,请把它当成"运行一个来源不明的程序"来对待,而不是"装一个插件"。

✅ 一个你能动的安全开关

提示注入的扫描默认只记录、不阻断(配置项 security.injection_blocking 默认 false)。你可以把它打开:

node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" config-set security.injection_blocking true

打开后,扫描到高严重度的注入时会发出阻断信号,让代理的下一步停下来。但要知道两件事:① 它是"中止下一步",不是"把已进入上下文的内容撤回"——官方原话是 "Blocking does not retroactively redact that content";② 开关在顶层 security 下,写成 workflow.security.injection_blocking 会被静默忽略。还有一条小字值得知道:那个管注入的防护 hook 本身无法关闭——能关的只有"是否阻断"。

还有一件事要自己判断:--dangerously-skip-permissions

官方教程为了减少练习时的打断,用了这个跳过所有文件读写确认的参数,并且配了一段警告。这段话值得原样理解一遍(原文):

📄 官方教程 · 原文

"The permissions flag is optional. It skips per-file confirmation while GSD's sub-agents read and write files. Use it only for this throwaway tutorial in an empty folder. […] For real work, read the security model first."

翻译过来:子代理会大量读写文件,跳过确认意味着你对这些读写不再有逐次的否决机会。在空目录里做练习可以,在你放着真实代码和密钥的仓库里,先读安全模型,再决定。

三处"宣传语比行为文档更响"的地方

我不想只挑好话说。下面这三条都能在仓库里同时找到两边原话,你可以自己核。

对外那句话仓库里另一处怎么说的
① "轻量" README 第一段自称 "A light-weight meta-prompting, context engineering, and spec-driven development system" 实际随包的是:35 个代理(外加 29 份精简版,共 64 个文件)、72 个命令、72 个技能目录、89 份工作流定义、235 个源码模块、约 956 个测试文件、31 个 CI 工作流、80 多万字节的更新日志、95 份架构决策记录、797 行的清单文件
② "解决了上下文腐烂" README:它"solves"上下文腐烂;结尾标语 "Claude Code is powerful. GSD Core makes it reliable." 上下文预算参考文档里写着(原文):"the orchestrator cannot verify semantic correctness of agent output -- only structural completeness. This is a fundamental limitation."(编排器无法验证代理产出的语义正确性,只能验证结构完整——这是一个根本性的局限。)。另一处承认:"Headroom tracking is a heuristic… not to make hard guarantees about what will fit."(余量跟踪只是启发式估算,不构成保证)
③ "组织级安全基线" 安全模型文档说:open-gsd 组织"在仓库与包层面强制执行控制措施……完整写在 docs/security/baseline.md" 那份基线文档自己的字段是:"RFC status | Draft"、版本 0.1.0、最后更新 2026-05-22;第一阶段每一项控制措施的状态都是"进行中 / 目标日期:待定";十条后续待办里有九条没打勾,其中一条正是"维护者审阅本基线(状态升级为 Approved 的前置条件)"

公平地说:第 ② 条的两句话并不真的矛盾——GSD 确实大幅降低了上下文腐烂的发生率,而"无法验证语义正确性"说的是另一件事(它没法保证 AI 写的东西逻辑对不对)。但把这两句话放在一起看,你就能明白它替你挡掉的是"流程性错误",不是"判断性错误"。这恰好是本文反复强调"Verify 那一步你得亲自在场"的原因。

另外,维护者对这个项目主动划了边界:仓库里有一个 .out-of-scope/ 目录,17 个文件,每份都是一个写明理由的"这个我们不做"记录。其中一条值得引:

📄 .out-of-scope/omp-runtime-in-core.md · 原文

"GSD is not expanding its supported-runtime set. The long-term direction is to reduce the number of supported runtimes, not grow it, absent funded development."

(大意:GSD 不打算扩大支持的运行时集合,长期方向是减少而不是增加。)——所以如果你在等它支持你那个冷门工具,官方已经把答案写下来了。

如果要用自动模式,先看官方列的四条"别用"

/gsd-autonomous 能一路把剩下的阶段跑完(它会连着把 讨论 → 规划 → 执行 做掉,最后还会自动走里程碑的审计与归档)。但官方明确列了四种不该用它的情形,我原样翻译过来:

  1. 这个阶段的设计决定还没定下来——自动模式下的讨论会替你做出选择,"你可能并不同意"。
  2. 你需要对这个阶段做精细控制。
  3. 这个阶段有新颖或高风险的工作——那就留在环路里,手动执行。
  4. 你正处在一个阶段的中途、只执行了一半——它不会接着跑一个执行了一半的波次。

官方还补了一句关键的:自动模式与手动执行唯一的区别是"验证通过之后会自动往前推进"——各道安全闸门照常触发,需要决定的地方照样停下来问你。所以它不是"无人驾驶",是"你不用手动敲下一步"。

什么人适合用,什么人不适合

✅ 适合
· 你在做多文件、跨会话、要查资料的功能开发
· 你受过"AI 聊到下午就开始胡说"的苦
· 你需要证据链(哪条需求、哪次验证、哪个决定)而不只是"它说做完了"
· 你已经在用 Claude Code / Codex 这类工具,不想换工具
❌ 不适合
· 你只是偶尔改一两行、修个错别字
· 你要的是完全无人值守地写完整个产品(它的 /gsd-autonomous 能跑,但验证那一步的价值全在"人真的试一遍")
· 你不接受 AI 在项目里生成一批规划文件(哪怕它们可以配置成不进 git)
· 你的 Node 升不到 24,又不想折腾

16术语对照表

这些词在正文里都解释过,这里做成一张能回头查的表。第三列是它在 GSD 里为什么重要 / 别拿它当什么用——不是简单翻译。

术语定义在这套体系里为什么重要 · 别当什么用
上下文窗口
context window
AI 在一次回答里能"看见"的 token 总量上限整套设计的出发点。别当成"记忆容量"——它不是存储,是注意力能覆盖的范围
上下文腐烂
context rot
窗口填满导致回答质量静默下降的现象GSD 存在的唯一理由。别当成 bug 或"模型变懒",靠重述治不好
tokenAI 处理文字的最小单位,约等于一个英文词或一到两个汉字费用、速度、容量的统一计量单位。看省钱的建议时到处都要用它
子代理
subagent
被派出去干一件具体活的临时 AI 实例,每次都是全新上下文整套机制的承重墙。别当成"另一个聊天窗口"——它不共享你的对话历史
编排器
orchestrator
你的主会话:派活、收结果、更新状态、决定下一步,自己不碰源码它必须保持"轻"才有意义。别在这里手动做本该派出去的重活
阶段
phase
路线图上的一个工作单元,要完整走完五步日常打交道的单位。别和"里程碑"混:阶段是工程单位,里程碑是产品单位
波次
wave
一批可以同时执行的计划并行的安全边界靠它。别以为同一个波里的计划"随便并行"——它们被检查过不碰同一个文件
REQ-ID形如 AUTH-01 的需求编号可追溯的最小单位,验证时按它对账。别当成给文档加的编号装饰——检查器会真的拿它核对
must_haves计划里"必须为真"的清单:truths / artifacts / key_links验证的靶子。别当成愿望清单——验证代理逐条核对它
原子提交
atomic commit
一个提交只包含一件事,能单独回退让"做坏了"可以局部撤回。别在 GSD 干活时手工把多个任务的改动混提
checkpoint
人机确认点
必须由人完成或拍板的任务,流程会停下来等你看到 ### CHECKPOINT 就是它在等你,最后那行加粗文字告诉你要打什么。别把它当报错
UAT
用户验收测试
让真人按真实用法走一遍回答"能不能用",跟自动测试回答的"符不符合计划"是两回事
worktree
工作副本
git 的并行工作目录,从某个提交检出一份独立的工作树并行执行依赖它;也正因为它从提交检出,"规划文件不进 git"和"并行执行"才互斥
hook
钩子
在固定时机自动触发的小脚本负责上下文监控、配置热加载、注入扫描。别当成"插件"——它是运行时事件回调
MCP给 AI 挂外部工具的一套协议每个启用的服务都会往每一轮塞工具说明,重的能到 20k token。它属于你工具的设置,不是 GSD 的设置
frontmatter文件开头夹在两行 --- 之间的结构化字段.planning/ 里几乎所有文件靠它被机器读懂。别删它——删了流程就读不出状态
里程碑
milestone
一个可发布的版本周期,由若干阶段组成回答"这个版本做什么、不做什么"。日常推进时你基本不需要想起它
斜杠命令
slash command
在对话里以 / 开头敲的命令GSD 里每一步都由你亲手启动,它不会自己往下跑(除非你显式用自动模式)
提示注入把指令伪装成普通内容,让 AI 误当命令执行GSD 有扫描层,但官方明确说只记录不阻断,且防不住新花样
slopsquatting抢注 AI 容易编造出来的包名,等你误装包合法性闸门专门防它;但防不住"正规包事后被投毒"

17参考来源与证据边界

本文关于 GSD 的所有陈述,来自下面这些一手材料。抓取与核对日期:2026-09-13。我按"读到什么程度"分层列出,并说明每份材料在本文里承担哪一部分。

A. 逐字读了原文的官方文档(本文主要依据)

B. 我自己算出来 / 数出来的(这些是本文独有的部分)

C. 由四个并行研究任务逐行核对、并附了行号引用的文档

出于效率考虑,几份超长参考文档(COMMANDS.md 2,405 行、CONFIGURATION.md 2,377 行等)我拆成四份逐行核对的阅读任务并行处理,要求每条结论都带 文件:行号。上面 B 组里的多数交叉核对、以及第 13–15 节里带具体数字的陈述,都来自这批带行号的报告;其中的关键矛盾(Node 三个版本、命令 71 vs 72、代理 33/34/35、版本世系)我另外用独立的命令亲自复核过一遍(数文件、下载 npm 包、查 registry / GitHub API)。

D. 我明确没有读、因此本文不引用其内容的材料

docs/FEATURES.md(4,408 行)、docs/ARCHITECTURE.md(1,044 行)、docs/CLI-TOOLS.md、docs/INVENTORY.md 的完整 797 行、docs/adr/ 下 50 多份架构决策记录、src/ 下 235 个源码文件(只在核对规划目录解析、安装器版本检查、守卫超时常量时读了片段)、tests/ 下约 956 个测试文件、docs/prd/ 与 docs/adr/ 的大部分内容,以及 docs/zh-CN/、ja-JP/、ko-KR/、pt-BR/ 四套翻译文档。

这一点值得明说:我没有逐行读源码去验证文档描述的每一条行为是否属实。本文的定位是"文档说该怎么用",不是"代码实际怎么跑"。凡涉及"它内部如何实现",本文一律以官方文档的表述为准并标明出处;凡是与代码/包体对得上的(版本、计数、默认值、开关名),我才标成"我数过/我核过"。

⚠️ 证据边界与时效说明

① 版本口径。本文锚定 npm 上的 v1.13.0(2026-09-06),但文档与目录结构读的是仓库 main 分支 2026-09-12 的状态。两者之间 main 已经累积了 85 个未发布变更,所以文中的某些细节可能在你装的 1.13.0 里还不存在。要精确对齐,请 npm view @opengsd/gsd-core@1.13.0 或 checkout 对应版本。

② 时效:volatile(强时效)。理由是我算出来的:53 天 7 个次版本、85 个待发布变更、而且文档本身已经与包版本脱节(v1.42.1 vs 1.13.0)。这类主题的数字与开关会持续变动——本文标为 volatile 意味着下次刷新时要重新核全部数字与日期,而不是只改一两处。

③ 多处矛盾我选择"两边都摆出来"而不是择一。(a)Node 要求 18 / 22 / 24 三个数字,出处各不相同;(b)代理总数在同一份文件里 34 / 35 打架,另两份文档写 33;(c)命令数 71(教程)vs 72(实际包体);(d)运行时数量 16(README)/ 18(安装器可执行)/ 19(能力矩阵);(e)上下文告警阈值 35% 与 60% 两套口径。这些我都给了出处与核对方法,没有替作者裁决哪一个"应该"是对的——例外是 Node 和运行时数量这两条:它们各自有"机器可执行的那一侧"(engines 字段、安装器的运行时列表),所以我在文中给了明确建议并说明了理由。

④ 版本号撞车这一条我没有当成"错误"来写。一开始我以为是文档写错了版本号;查 docs/RELEASE-NOTES-LEGACY.md 之后发现是项目改名 + 版本号重新计数,而且归档文件自己就警告过会撞车。所以本文没有把它写成"作者疏忽",而是写成"读文档时必须知道的一条背景"。这一点差别很重要——它决定了你是"别信这份文档"还是"要带着这条背景去读它"。

⑤ 发版记录里的重复我按"可核对的事实"写,没有替它找动机。1.8.0 与 1.7.0 的条目重合度是按版本正文逐条比对算出来的(175 条里 173 条逐字相同)。我没有读发布流程的说明去判断这是不是有意为之,所以文中只陈述数字,并把它用作"变化速度快"的证据,而不是当作质量指控。

⑥ 那三处"宣传语比行为文档更响"的地方,我都同时给了两边的原话。其中第 ② 条我明确写了"这两句话并不真的矛盾"——因为"降低了发生率"和"无法验证语义正确性"说的是两件事。我不想制造并不存在的矛盾来让文章显得尖锐。

④ 安全性结论全部是"文档自述"。第 15 节的四个缺口是官方自己在安全模型里写下来的;我没有做任何渗透测试或代码审计去验证这些自述是否准确。请把它读成"作者承认的边界",而不是"经第三方验证的边界"。

⑤ 耗时数字不是独立测量。五步的耗时(2–4 / 1–5 / 2–6 / 1–3 分钟)来自官方教程,针对的是一个刻意做小的练习项目。真实项目请当成下限,我没有做过计时复现。

99一句话总结

🎯 核心要点

GSD 不是"更聪明的提示词",而是一套把活切成阶段、每一步都换一个干净 AI 来干的流程;它治的病是"聊久了 AI 就变笨",药方是把记忆从对话搬进 .planning/ 的文件里——所以清空对话是安全的,而你要盯的是 Discuss 里定下的决定、Verify 里的那一条条人工验收,和"这件事是否大到值得走这套流程"。

最后留一个只有你能回答的问题,它是检验这篇有没有讲透的唯一标准:想一件你最近用 AI 干过的活,然后判断——它该走五步循环,还是该用 /gsd-quick,还是压根不该用 GSD?如果你能说出理由(而不是感觉),这篇就到位了。

⌂