* 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>
19 KiB
GSD 設定リファレンス
設定スキーマの全容、ワークフロートグル、モデルプロファイル、Git ブランチオプション。機能の詳細については機能リファレンスを参照してください。
設定ファイル
GSD はプロジェクト設定を .planning/config.json に保存します。/gsd-new-project 実行時に作成され、/gsd-settings で更新できます。
完全スキーマ
{
"mode": "interactive",
"granularity": "standard",
"model_profile": "balanced",
"model_overrides": {},
"planning": {
"commit_docs": true,
"search_gitignored": false
},
"workflow": {
"research": true,
"plan_check": true,
"verifier": true,
"auto_advance": false,
"nyquist_validation": true,
"ui_phase": true,
"ui_safety_gate": true,
"node_repair": true,
"node_repair_budget": 2,
"research_before_questions": false,
"discuss_mode": "discuss",
"skip_discuss": false,
"text_mode": false,
"use_worktrees": true
},
"hooks": {
"context_warnings": true,
"workflow_guard": false
},
"parallelization": {
"enabled": true,
"plan_level": true,
"task_level": false,
"skip_checkpoints": true,
"max_concurrent_agents": 3,
"min_plans_for_parallel": 2
},
"git": {
"branching_strategy": "none",
"phase_branch_template": "gsd/phase-{phase}-{slug}",
"milestone_branch_template": "gsd/{milestone}-{slug}",
"quick_branch_template": null
},
"gates": {
"confirm_project": true,
"confirm_phases": true,
"confirm_roadmap": true,
"confirm_breakdown": true,
"confirm_plan": true,
"execute_next_plan": true,
"issues_review": true,
"confirm_transition": true
},
"safety": {
"always_confirm_destructive": true,
"always_confirm_external_services": true
}
}
コア設定
| 設定 | 型 | 選択肢 | デフォルト | 説明 |
|---|---|---|---|---|
mode |
enum | interactive, yolo |
interactive |
yolo は判断を自動承認、interactive は各ステップで確認 |
granularity |
enum | coarse, standard, fine |
standard |
フェーズ数を制御: coarse(3〜5)、standard(5〜8)、fine(8〜12) |
model_profile |
enum | quality, balanced, budget, inherit |
balanced |
各エージェントのモデルティア(モデルプロファイルを参照) |
注意:
granularityは v1.22.3 でdepthから改名されました。既存の設定は自動的に移行されます。
ワークフロートグル
すべてのワークフロートグルは 未設定 = 有効 のパターンに従います。config にキーが存在しない場合、デフォルトは true になります。
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
workflow.research |
boolean | true |
各フェーズの計画前にドメイン調査を実施 |
workflow.plan_check |
boolean | true |
プラン検証ループ(最大3回の反復) |
workflow.verifier |
boolean | true |
実行後にフェーズ目標に対する検証を実施 |
workflow.auto_advance |
boolean | false |
discuss → plan → execute を停止せずに自動連鎖 |
workflow.nyquist_validation |
boolean | true |
plan-phase のリサーチ中にテストカバレッジマッピングを実施 |
workflow.ui_phase |
boolean | true |
フロントエンドフェーズで UI デザインコントラクトを生成 |
workflow.ui_safety_gate |
boolean | true |
plan-phase 中にフロントエンドフェーズに対して /gsd-ui-phase の実行を促すプロンプトを表示 |
workflow.node_repair |
boolean | true |
検証失敗時にタスクを自律的に修復 |
workflow.node_repair_budget |
number | 2 |
失敗タスクあたりの最大修復試行回数 |
workflow.research_before_questions |
boolean | false |
ディスカッション質問の後ではなく前にリサーチを実行 |
workflow.use_worktrees |
boolean | true |
false の場合、git worktree 分離を無効化 (v1.31) |
workflow.discuss_mode |
string | 'discuss' |
/gsd-discuss-phase のコンテキスト収集方法を制御。'discuss'(デフォルト)は質問を1つずつ行います。'assumptions' はまずコードベースを読み取り、信頼度レベル付きの構造化された仮説を生成し、誤っている点のみ修正を求めます。v1.28 で追加 |
workflow.skip_discuss |
boolean | false |
true の場合、/gsd-autonomous は discuss-phase を完全にスキップし、ROADMAP のフェーズ目標から最小限の CONTEXT.md を作成します。開発者の要望が PROJECT.md/REQUIREMENTS.md に十分に記載されているプロジェクトに適しています。v1.28 で追加 |
workflow.text_mode |
boolean | false |
AskUserQuestion の TUI メニューをプレーンテキストの番号付きリストに置き換えます。TUI メニューが表示されない Claude Code リモートセッション(/rc モード)で必要です。discuss-phase で --text フラグを使用してセッションごとに設定することもできます。v1.28 で追加 |
推奨プリセット
| シナリオ | mode | granularity | profile | research | plan_check | verifier |
|---|---|---|---|---|---|---|
| プロトタイピング | yolo |
coarse |
budget |
false |
false |
false |
| 通常の開発 | interactive |
standard |
balanced |
true |
true |
true |
| 本番リリース | interactive |
fine |
quality |
true |
true |
true |
プランニング設定
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
planning.commit_docs |
boolean | true |
.planning/ ファイルを git にコミットするかどうか |
planning.pr_strict |
boolean | false |
/gsd-pr-branch のフィルタモード。false は STATE.md、ROADMAP.md、MILESTONES.md、PROJECT.md、REQUIREMENTS.md、milestones/ などの構造的なプランニング状態を PR ブランチに残す。true はすべての .planning/ パスを削除する |
planning.search_gitignored |
boolean | false |
.planning/ を含めるために広範な検索に --no-ignore を追加 |
自動検出
.planning/ が .gitignore に含まれている場合、config.json の設定に関係なく commit_docs は自動的に false になります。これにより git エラーが防止されます。
フック設定
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
hooks.context_warnings |
boolean | true |
コンテキストモニターフックによるコンテキストウィンドウ使用量の警告を表示 |
hooks.workflow_guard |
boolean | false |
GSD ワークフローのコンテキスト外でファイル編集が行われた場合に警告(/gsd-quick または /gsd-fast の使用を推奨) |
プロンプトインジェクションガードフック(gsd-prompt-guard.js)は常に有効であり、無効にすることはできません。これはワークフロートグルではなく、セキュリティ機能です。
プライベートプランニングのセットアップ
プランニング成果物を git から除外するには:
planning.commit_docs: falseとplanning.search_gitignored: trueを設定.planning/を.gitignoreに追加- 既にトラッキング済みの場合:
git rm -r --cached .planning/ && git commit -m "chore: stop tracking planning docs"
並列化設定
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
parallelization.enabled |
boolean | true |
独立したプランを同時に実行 |
parallelization.plan_level |
boolean | true |
プランレベルで並列化 |
parallelization.task_level |
boolean | false |
プラン内のタスクを並列化 |
parallelization.skip_checkpoints |
boolean | true |
並列実行中にチェックポイントをスキップ |
parallelization.max_concurrent_agents |
number | 3 |
同時実行エージェントの最大数 |
parallelization.min_plans_for_parallel |
number | 2 |
並列実行をトリガーする最小プラン数 |
pre-commit フックと並列実行について: 並列化が有効な場合、executor エージェントはビルドロックの競合(例: Rust プロジェクトでの cargo lock の競合)を回避するために
--no-verifyでコミットします。オーケストレーターは各ウェーブの完了後にフックを1回検証します。STATE.md の書き込みはファイルレベルのロックで保護され、同時書き込みによる破損を防ぎます。コミットごとにフックを実行する必要がある場合は、parallelization.enabled: falseに設定してください。
Git ブランチ
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
git.branching_strategy |
enum | none |
none、phase、または milestone |
git.phase_branch_template |
string | gsd/phase-{phase}-{slug} |
phase 戦略のブランチ名テンプレート |
git.milestone_branch_template |
string | gsd/{milestone}-{slug} |
milestone 戦略のブランチ名テンプレート |
git.quick_branch_template |
string or null | null |
/gsd-quick タスク用のオプションのブランチ名テンプレート |
戦略の比較
| 戦略 | ブランチ作成 | スコープ | マージポイント | 適したケース |
|---|---|---|---|---|
none |
なし | N/A | N/A | 個人開発、シンプルなプロジェクト |
phase |
execute-phase 開始時 |
1フェーズ | フェーズ後にユーザーがマージ | フェーズごとのコードレビュー、きめ細かいロールバック |
milestone |
最初の execute-phase 時 |
マイルストーン内の全フェーズ | complete-milestone 時 |
リリースブランチ、バージョンごとの PR |
テンプレート変数
| 変数 | 使用可能な場所 | 例 |
|---|---|---|
{phase} |
phase_branch_template |
03(ゼロパディング) |
{slug} |
両方のテンプレート | user-authentication(小文字、ハイフン区切り) |
{milestone} |
milestone_branch_template |
v1.0 |
{num} / {quick} |
quick_branch_template |
260317-abc(quick タスク ID) |
quick タスクのブランチ設定例:
"git": {
"quick_branch_template": "gsd/quick-{num}-{slug}"
}
マイルストーン完了時のマージオプション
| オプション | Git コマンド | 結果 |
|---|---|---|
| スカッシュマージ(推奨) | git merge --squash |
ブランチごとに1つのクリーンなコミット |
| 履歴付きマージ | git merge --no-ff |
個別のコミットをすべて保持 |
| マージせずに削除 | git branch -D |
ブランチの作業を破棄 |
| ブランチを保持 | (なし) | 後で手動対応 |
ゲート設定
ワークフロー中の確認プロンプトを制御します。
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
gates.confirm_project |
boolean | true |
確定前にプロジェクトの詳細を確認 |
gates.confirm_phases |
boolean | true |
フェーズの分割を確認 |
gates.confirm_roadmap |
boolean | true |
続行前にロードマップを確認 |
gates.confirm_breakdown |
boolean | true |
タスクの分割を確認 |
gates.confirm_plan |
boolean | true |
実行前に各プランを確認 |
gates.execute_next_plan |
boolean | true |
次のプラン実行前に確認 |
gates.issues_review |
boolean | true |
修正プラン作成前に課題をレビュー |
gates.confirm_transition |
boolean | true |
フェーズ遷移を確認 |
セーフティ設定
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
safety.always_confirm_destructive |
boolean | true |
破壊的操作(削除、上書き)の確認 |
safety.always_confirm_external_services |
boolean | true |
外部サービ<EFBFBD><EFBFBD>とのやり取りの確認 |
セキュリティ設定 (v1.31)
| 設定 | 型 | <EFBFBD><EFBFBD>フォルト | 説明 |
|---|---|---|---|
security_enforcement |
boolean | true |
脅威モデルセキュリティ検証を有効化 |
security_asvs_level |
number (1-3) | 1 |
OWASP ASVS 検証レベル |
security_block_on |
string | "high" |
フェーズ進行をブロックする最小重大度 |
レスポンス言語設定 (v1.32)
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
response_language |
string | (なし) | エージェントレスポンスの言語コード(例: "pt"、"ko"、"ja") |
response_language が設定されると、すべてのフェーズおよびスポーンされたエージェントで一貫した言語出力が保証されます。
フック設定
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
hooks.context_warnings |
boolean | true |
セッション中にコンテキストウィンドウの使用量警告を表示 |
モデルプロファイル
プロファイル定義
| エージェント | quality |
balanced |
budget |
inherit |
|---|---|---|---|---|
| gsd-planner | Opus | Opus | Sonnet | Inherit |
| gsd-roadmapper | Opus | Sonnet | Sonnet | Inherit |
| gsd-executor | Opus | Sonnet | Sonnet | Inherit |
| gsd-phase-researcher | Opus | Sonnet | Haiku | Inherit |
| gsd-project-researcher | Opus | Sonnet | Haiku | Inherit |
| gsd-research-synthesizer | Sonnet | Sonnet | Haiku | Inherit |
| gsd-debugger | Opus | Sonnet | Sonnet | Inherit |
| gsd-codebase-mapper | Sonnet | Haiku | Haiku | Inherit |
| gsd-verifier | Sonnet | Sonnet | Haiku | Inherit |
| gsd-plan-checker | Sonnet | Sonnet | Haiku | Inherit |
| gsd-integration-checker | Sonnet | Sonnet | Haiku | Inherit |
| gsd-nyquist-auditor | Sonnet | Sonnet | Haiku | Inherit |
エージェントごとのオーバーライド
プロファイル全体を変更せずに特定のエージェントをオーバーライドできます:
{
"model_profile": "balanced",
"model_overrides": {
"gsd-executor": "opus",
"gsd-planner": "haiku"
}
}
有効なオーバーライド値: opus、sonnet、haiku、inherit、または完全修飾モデル ID(例: "openai/o3"、"google/gemini-2.5-pro")。
非 Claude ランタイム(Codex、OpenCode、Gemini CLI、Kilo)
GSD が非 Claude ランタイム向けにインストールされると、インストーラーは自動的に ~/.gsd/defaults.json に resolve_model_ids: "omit" を設定します。これにより GSD はすべてのエージェントに対して空のモデルパラメータを返し、各エージェントはランタイムで設定されたモデルを使用します。デフォルトの場合、追加のセットアップは不要です。
異なるエージェントに異なるモデルを使用させたい場合は、ランタイムが認識する完全修飾モデル ID で model_overrides を使用してください:
{
"resolve_model_ids": "omit",
"model_overrides": {
"gsd-planner": "o3",
"gsd-executor": "o4-mini",
"gsd-debugger": "o3",
"gsd-codebase-mapper": "o4-mini"
}
}
意図は Claude のプロファイルティアと同じです。計画やデバッグ(推論品質が最も重要な部分)にはより強力なモデルを使用し、実行やマッピング(プランに既に推論が含まれている部分)にはより安価なモデルを使用します。
どのアプローチを使うべきか:
| シナリオ | 設定 | 効果 |
|---|---|---|
| 非 Claude ランタイム、単一モデル | resolve_model_ids: "omit"(インストーラーのデフォルト) |
すべてのエージェントがランタイムのデフォルトモデルを使用 |
| 非 Claude ランタイム、ティアードモデル | resolve_model_ids: "omit" + model_overrides |
指定されたエージェントは特定のモデルを使用、それ以外はランタイムのデフォルト |
| Claude Code + OpenRouter/ローカルプロバイダー | model_profile: "inherit" |
すべてのエージェントがセッションモデルに従う |
| Claude Code + OpenRouter、ティアード | model_profile: "inherit" + model_overrides |
指定されたエージェントは特定のモデルを使用、それ以外は継承 |
resolve_model_ids の値:
| 値 | 動作 | 使用場面 |
|---|---|---|
false(デフォルト) |
Claude エイリアス(opus、sonnet、haiku)を返す |
Claude Code + ネイティブ Anthropic API |
true |
エイリアスを完全な Claude モデル ID(claude-opus-4-8)にマッピング |
完全な ID が必要な API を使用する Claude Code |
"omit" |
空文字列を返す(ランタイムがデフォルトを選択) | 非 Claude ランタイム(Codex、OpenCode、Gemini CLI、Kilo) |
プロファイルの設計思想
| プロファイル | 設計思想 | 使用場面 |
|---|---|---|
quality |
すべての意思決定に Opus、検証に Sonnet | クォータに余裕がある場合、重要なアーキテクチャ作業 |
balanced |
計画のみ Opus、それ以外は Sonnet | 通常の開発(デフォルト) |
budget |
コード記述に Sonnet、リサーチ/検証に Haiku | 大量の作業、重要度の低いフェーズ |
inherit |
すべてのエージェントが現在のセッションモデルを使用 | 動的なモデル切り替え、非 Anthropic プロバイダー(OpenRouter、ローカルモデル) |
環境変数
| 変数 | 用途 |
|---|---|
CLAUDE_CONFIG_DIR |
デフォルトの設定ディレクトリ(~/.claude/)をオーバーライド |
GEMINI_API_KEY |
コンテキストモニターがフックイベント名を切り替えるために検出 |
WSL_DISTRO_NAME |
インストーラーが WSL のパス処理のために検出 |
GSD_SKIP_SCHEMA_CHECK |
スキーマドリフト検出をバイパス (v1.31) |
グローバルデフォルト
将来のプロジェクト向けにグローバルデフォルトとして設定を保存できます。
保存場所: ~/.gsd/defaults.json
/gsd-new-project が新しい config.json を作成する際、グローバルデフォルトを読み込み、初期設定としてマージします。プロジェクトごとの設定は常にグローバル設定を上書きします。