* test(#2971): failing-first suite for the pr-branch planning-path filter Binds the not-yet-built planning.pr_strict mode and the corrected filter recipe for /gsd-pr-branch across six layers: pure classification and forbidden-path predicates, real-git fixtures that run the cherry-pick filter loop end to end, config-key registration through the real CLI and both manifests, the executed worktree-materialization claim the issue's triage asked to establish, fast-check properties over arbitrary path sets, and a drift guard over the shipped workflow. Two live defects in today's shipped recipe are pinned as regressions, both reproduced empirically first: `git rm -r --cached` stages a deletion of any .planning/ path the target branch already tracks, so the generated PR removes the base branch's planning files; and the same command leaves the cherry-picked file untracked on disk, so a second commit touching that path aborts the pick with "untracked working tree files would be overwritten" and every remaining commit is silently dropped. The test helper parses the canonical path lists out of gsd-core/workflows/pr-branch.md rather than restating them, so the workflow stays the single source of truth and the suite cannot drift from what ships. Refs #2971 * feat(#2971): strict planning filter mode for /gsd-pr-branch Adds planning.pr_strict — a boolean, default false, that selects what /gsd-pr-branch means by "filtered". Default mode is unchanged: structural planning state survives into the PR branch and the nine transient subdirectories do not. Strict mode drops every .planning/ path, structural files included, and carries a commit over only when it touches at least one file outside .planning/. Strict mode is what makes planning.commit_docs: true safe for a project that versions its planning tree locally but publishes none of it. The alternative posture, commit_docs: false, silently costs parallel executor isolation — a worktree is checked out from a commit, so an untracked or ignored .planning/ is simply absent inside it and the executor has no PLAN.md to read. That claim is now established by an executed fixture rather than inherited. The two path lists are declared once and both projections derived from them, so create_pr_branch and verify can no longer disagree about what the filter promised. verify previously counted every .planning/ path against a documented success criterion of zero while create_pr_branch was specified to preserve five structural files, so a correct run reported itself as failed on every phase that touched STATE.md — which is every phase. It now asserts against the active mode, and names the .planning/ paths default mode deliberately keeps rather than trading a wrong signal for silence. Two verified defects in the same recipe are fixed alongside, because strict mode would have amplified both. `git rm -r --cached` staged a deletion for any .planning/ path the target branch already tracked, so the generated PR removed the base branch's planning files — under strict mode that would have been the entire tree. The same command left the picked file untracked on disk, so a second commit touching that path aborted the cherry-pick with "untracked working tree files would be overwritten" and every remaining commit was silently dropped. Both were reproduced against real git before being fixed. The filter now forces excluded paths back to what the PR branch's HEAD carries, in the index and the working tree; a conflict outside the filter halts instead of being improvised past; a commit left empty by filtering is skipped rather than failing. A clean-working-tree precondition makes the worktree half safe. Closes #2971 * fix(#2971): unwind the checkout on a conflict halt, and test the real recipe Two review findings, both fixed in place. The isolated adversarial pass found that the conflict-outside-the-filter branch exited while leaving the user checked out on the half-built PR branch with cherry-pick state still live — this loop runs in the user's own working directory, so stranding them there is a real cost even though it is not a vulnerability. The branch now aborts the pick, returns to the original branch, removes the partial PR branch, and says so before exiting. The standards pass found the L2 fixtures executed a hand-written mirror of the cherry-pick filter recipe rather than the recipe itself, so a reordering in the workflow would not have been caught — and the order is load-bearing, since restoring a path from HEAD before removing it inverts the filter. The helper now extracts the canonical loop from the shipped workflow and the fixtures execute that verbatim, which also gives the conflict-halt unwind above real coverage. The drift guard additionally pins the two commands' relative order and asserts the workflow carries exactly one canonical loop. Also records the publication gate in the CONTEXT.md glossary next to the commit gate it is distinct from. Refs #2971 * fix(#2971): make the conflict-halt unwind actually unwind, and use the colon slash form The remote matrix caught two defects in the previous commit. The halt path claimed to restore the original branch but did not. `git cherry-pick --abort` does not apply to a single `--no-commit` pick with no sequencer file, and the fallback left the unmerged index in place, which makes `git checkout` refuse — a failure the `2>/dev/null || true` then swallowed, so the user was told they had been restored while still sitting on the half-built PR branch. The unwind now drops sequencer state, hard-resets the disposable PR branch to clear the unmerged index, and only claims a restore when the checkout actually succeeded; when it does not, it says where the user is and gives them the two commands to finish it by hand. Verified against real git: exit 1, the conflict named, HEAD back on the original branch, the partial branch gone, a clean tree and no CHERRY_PICK_HEAD. Two runtime-loaded source artifacts used the retired `/gsd-<cmd>` hyphen form, which names a command no runtime registers. The canonical authoring token for workflows and references is `/gsd:<cmd>`; docs keep the hyphen form, so the documentation added in this branch is unaffected. The comment in src/config.cts moves to the colon form too, since it propagates into the generated lib. Refs #2971 * docs(#2971): backfill PR number into the changeset fragments (#3720) --------- Co-authored-by: sim <sim@local>
GSD Core 文档
文档按四个象限组织:教程通过实践帮助你学习,操作指南解决具体任务,参考文档提供权威信息,概念说明探讨设计理念与决策。
语言版本:English · Português (pt-BR) · 日本語 · 简体中文
Tutorials
How-to guides
- 在你的运行时上安装 — 适用于全部 16 个受支持运行时的安装步骤
- 讨论一个阶段 — 在规划开始前记录实现决策
- 规划一个阶段 — 执行调研、分解工作并验证计划质量
- 执行一个阶段 — 使用全新上下文的子代理以并行波次运行计划
- 验证并交付 — 审查已完成的工作、诊断失败并创建 PR
- 自主运行阶段 — 使用自主模式进行无人值守的阶段执行
- 处理快速临时任务 — 使用
/gsd-quick和/gsd-fast处理阶段循环之外的临时工作 - 配置模型配置文件 — 在高质量、均衡和经济模型层级之间切换
- 设置跨 AI 审查 — 配置第二个 AI 对主代理生成的代码进行审查
- 使用工作流并行工作 — 使用工作流同时运行独立的工作线
- 使用工作空间隔离工作 — 使用工作空间对实验性或高风险变更进行沙箱隔离
- 调试失败的执行 — 诊断并从中断或不完整的阶段执行中恢复
- 探索与草图 — 在提交计划之前,使用
/gsd-spike和/gsd-sketch进行探索性工作 - 设计 UI 阶段 — 使用 UI 阶段循环处理前端和视觉工作
- 从追踪器 Issue 驱动 GSD — 从 GitHub、Linear 或 Jira issue 启动一个阶段
- 从 GSD 2 迁移 — 将现有的 GSD 2 项目升级到 GSD Core
- 更新 GSD — 重新运行安装程序以获取最新版本
- 恢复与故障排查 — 修复常见问题、重建上下文并卸载
Reference
- 命令 — 每个命令的标志和示例
- 配置 — 完整配置模式、模型配置文件、Git 分支策略
- CLI 工具 —
gsd-tools.cjs用于工作流和代理的编程式 API - 功能特性 — 完整功能索引
- 清单 — 已安装的技能与界面映射
- STATE.md 模式 —
.planning/STATE.md的逐字段参考 - CONTEXT.md 模式 —
.planning/phases/<N>/CONTEXT.md的逐字段参考 - PLAN.md 模式 —
.planning/phases/<N>/PLAN.md的逐字段参考 - 规划产物 — 所有
.planning/文件及其作用
Explanation
- 上下文工程 — 上下文腐化如何形成,以及 GSD Core 如何防止它
- 阶段循环 — 讨论 → 规划 → 执行 → 验证 → 交付循环的设计原理
- 多代理编排 — 子代理的生成、范围界定和协调方式
- 安全模型 — 信任边界、权限和安全自动化
- 架构 — 系统架构、代理模型和数据流
- 讨论模式 —
/gsd-discuss-phase的假设模式与访谈模式 - 上下文监控 — 上下文窗口监控钩子架构
- Issue 驱动编排 — 使用现有原语从追踪器 issue 驱动 GSD 的方案
Related
- 根目录 README — 首页、快速开始和文档概览
- 变更日志 — 发布历史