Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
c61f64e
fix(#5182): watch a GSD-owned return receipt instead of the host tran…
davesienkowski Oct 3, 2026
dac6820
docs(#5182): add changeset for the plan-phase stall-watch return receipt
davesienkowski Oct 3, 2026
54dfccf
test(#5182): pass the unsafe phase-dir values through a file, not arg…
davesienkowski Oct 3, 2026
f781e7a
fix(#5182): fit plan-phase.md under its cap after the rebase and make…
davesienkowski Oct 3, 2026
a2c199b
test(#5182): add fast-check properties for the receipt helpers, AC4 b…
davesienkowski Oct 3, 2026
e672621
test(#5182): run the #5182 rows on the shipped helper functions only,…
davesienkowski Oct 3, 2026
de7554c
test(#5182): the AC5 row checks the watch's behavior, not two runs wi…
davesienkowski Oct 7, 2026
98cd720
fix(#5182): a planner checkpoint, split or source audit whose body ne…
davesienkowski Oct 7, 2026
be33dcd
fix(#5182): move gsd-plan-checker to #767 Group B so its return recei…
davesienkowski Oct 8, 2026
f71524b
fix(#5182): refuse a symlinked receipt directory and bound the receip…
davesienkowski Oct 9, 2026
d36e22b
docs(#5182): state the kimi-code receipt limit in the stall-watch hel…
davesienkowski Oct 9, 2026
4274114
fix(#5182): confine the receipt to the project's physical path and ha…
davesienkowski Oct 10, 2026
450e83d
fix(#5182): remove the receipt at every watch site and state the no-r…
davesienkowski Oct 10, 2026
c13ee49
fix(#5182): state what the orchestrator binds when the receipt is ref…
davesienkowski Oct 11, 2026
9a58670
fix(#5182): refuse a .. component in the receipt phase dir, and bind …
davesienkowski Oct 12, 2026
bd0574f
fix(#5182): pin the receipt walk's own link test with in-project link…
davesienkowski Oct 16, 2026
2c27266
fix(#5182): scope the changeset's symlink claim to what the receipt h…
davesienkowski Oct 16, 2026
2f9a3cc
docs(#5182): say the plan-checker receipt grant widens to full edit o…
davesienkowski Oct 18, 2026
f4e21dd
fix(#5182): drop the plan-checker's receipt Write on hosts that grant…
davesienkowski Oct 21, 2026
144bbf7
fix(#5182): anchor the receipt containment on the project root, and n…
davesienkowski Oct 21, 2026
2407fde
fix(#5182): a receipt-only REVISION_CONFLICT fails closed instead of …
davesienkowski Oct 21, 2026
1ea66d5
fix(#5182): read the receipt's byte cap boundary exactly, and strip a…
davesienkowski Oct 21, 2026
9d7fc24
test(#5182): drive the freshness window with a find shim, and drop th…
davesienkowski Oct 21, 2026
4cd1d4f
test(#5182): regenerate the compact-content benchmark baseline after …
davesienkowski Oct 21, 2026
c901dbc
chore(#5182): regenerate the Pi package roles for the planner and che…
davesienkowski Oct 21, 2026
50c4f7d
test(#5182): pin the receipt-Write scoping table against what each ho…
davesienkowski Oct 21, 2026
aff15ba
test(#5182): pin the checker's scoped edit posture on global installs…
davesienkowski Oct 21, 2026
d60c13b
Merge origin/next into fix/5182-stall-watch-return-receipt
davesienkowski Oct 24, 2026
0b844e6
fix(#5182): fail closed on a receipt-only VERIFICATION PASSED now tha…
davesienkowski Oct 24, 2026
5f6c7fc
Merge origin/next into fix/5182-stall-watch-return-receipt
davesienkowski Oct 24, 2026
4a2efb3
fix(#5182): point a body-less VERIFICATION PASSED at 11a in step 11 i…
davesienkowski Oct 24, 2026
9d0ed75
Merge origin/next into fix/5182-stall-watch-return-receipt
davesienkowski Oct 24, 2026
1a88577
fix(#5182): give 11a its own case for a receipt-routed checker marker…
davesienkowski Oct 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/lively-sloths-forage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
type: Fixed
pr: 5192
---
**plan-phase's stall watch now waits for the planner and plan-checker to actually return** — it no longer reports them finished at its first check because their own prompt or definition mentions the return markers, and a finished plan revision now continues instead of always ending in the stall menu. The plan-checker now declares `Write` for that one receipt file, so on Codex it runs `workspace-write` instead of `read-only`, and on Claude Code it is denied only `Edit` and `MultiEdit`; on OpenCode, Kilo and Copilot, which grant Write and Edit as one permission, the installer drops that `Write`, so the checker stays read-only there and writes no receipt. No receipt is created when the phase directory is a symlink or resolves outside the project root plan-phase resolved (for example through a symlinked parent), when its path has a `.` or `..` component, or when it holds a control character; a one-line stderr reason names the refusal, and the watch then ends on the agent's own completion result or as stalled. (#5182)
16 changes: 15 additions & 1 deletion agents/gsd-plan-checker.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
---
name: gsd-plan-checker
description: Verifies plans will achieve phase goal before execution. Goal-backward analysis of plan quality. Spawned by /gsd:plan-phase orchestrator.
tools: Read, Bash, Glob, Grep, Skill
tools: Read, Write, Bash, Glob, Grep, Skill
color: green
# hooks:
# PostToolUse:
# - matcher: "Write|Edit"
# hooks:
# - type: command
# command: "npx eslint --fix $FILE 2>/dev/null || true"
---

<role>
Expand Down Expand Up @@ -960,6 +966,12 @@ Return all issues as a structured `issues:` YAML list (see dimension examples fo

<structured_returns>

**Return receipt (#5182):** if your prompt has a `<return_receipt>PATH</return_receipt>` line,
your LAST action is to write the marker line you are about to return (e.g. `## ISSUES FOUND`)
to PATH with the Write tool; never use `Bash(cat << 'EOF')` or heredoc. Its directory already exists. This is your only write: never use
Write on a plan or any other file. If the write fails, or you have no Write tool (an install drops it where
Write would grant full edit), note that in your return and continue; never write it another way.

## VERIFICATION PASSED

```markdown
Expand Down Expand Up @@ -1031,6 +1043,8 @@ Plans verified. Run `/gsd:execute-phase {phase}` to proceed.

<anti_patterns>

**DO NOT** use Write on any file except the `<return_receipt>` path, if your prompt gives one. You never write, split or fix a plan.

**DO NOT** check code existence — that's gsd-verifier's job. You verify plans, not codebase.

**DO NOT** run the application. Static plan analysis only.
Expand Down
11 changes: 11 additions & 0 deletions agents/gsd-planner.md
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,12 @@ See @~/.claude/gsd-core/references/planner-chunked.md for `## OUTLINE COMPLETE`

Your orchestrator dispatches on exact marker strings in your final output. Emit exactly one of:

**Return receipt (#5182):** if your prompt has a `<return_receipt>PATH</return_receipt>` line,
your LAST action, after every plan write and commit, is to write the marker line you are about to
return (e.g. `## PLANNING COMPLETE`, or `## REVISION COMPLETE` in revision mode) to PATH with
the Write tool. Its directory already exists. The orchestrator's bounded stall watch reads only
that file, so never write it early.

```markdown
## PLANNING COMPLETE
```
Expand Down Expand Up @@ -961,6 +967,11 @@ Your orchestrator dispatches on exact marker strings in your final output. Emit
```
(cannot produce a plan, include exactly what is missing)

```markdown
## REVISION COMPLETE
```
(revision mode only — checker issues addressed; shape: `gsd-core/references/planner-revision.md` Step 7)

```markdown
## REVISION_CONFLICT
```
Expand Down
8 changes: 4 additions & 4 deletions docs/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -239,8 +239,8 @@ GSD uses a multi-agent architecture where thin orchestrators (workflow files) sp
|----------|-------|
| **Spawned by** | `/gsd-plan-phase` (verification loop, max 3 iterations) |
| **Parallelism** | Single instance (iterative) |
| **Tools** | Read, Bash, Glob, Grep, Skill |
| **Disallowed Tools** | Write, Edit, MultiEdit |
| **Tools** | Read, Write, Bash, Glob, Grep, Skill |
| **Disallowed Tools** | Edit, MultiEdit |
| **Model (balanced)** | Sonnet |
| **Color** | Green |
| **Produces** | PASS/FAIL verdict with specific feedback |
Expand Down Expand Up @@ -868,7 +868,7 @@ Thirteen additional agents ship under `agents/gsd-*.md` and are used by specialt
| planner | ✓ | ✓ | | ✓ | ✓ | ✓ | | ✓ | ✓ |
| roadmapper | ✓ | ✓ | | ✓ | ✓ | ✓ | | | |
| executor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | |
| plan-checker | ✓ | | | ✓ | ✓ | ✓ | | | |
| plan-checker | ✓ | ✓ | | ✓ | ✓ | ✓ | | | |
| integration-checker | ✓ | | | ✓ | ✓ | ✓ | | | |
| ui-checker | ✓ | | | ✓ | ✓ | ✓ | | | |
| verifier | ✓ | ✓ | | ✓ | ✓ | ✓ | | | |
Expand All @@ -882,7 +882,7 @@ Thirteen additional agents ship under `agents/gsd-*.md` and are used by specialt
| security-auditor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | |

**Principle of Least Privilege:**
- Checkers are read-only (no Write/Edit) — they evaluate, never modify
- Checkers never modify what they check (no Edit); plan-checker's one Write is its stall-watch return receipt (#5182). OpenCode, Kilo and Copilot grant Write and Edit as one `edit` permission, so the installer drops plan-checker's Write there: it stays read-only and writes no receipt
- Researchers have web access — they need current ecosystem information
- Executors have Edit — they modify code but not web access
- Mappers have Write — they write analysis documents but not Edit (no code changes)
Expand Down
6 changes: 3 additions & 3 deletions docs/ja-JP/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ GSD はマルチエージェントアーキテクチャを採用しており、
|------------|-----|
| **スポーン元** | `/gsd-plan-phase`(検証ループ、最大3回の反復) |
| **並列数** | 単一インスタンス(反復型) |
| **ツール** | Read, Bash, Glob, Grep |
| **ツール** | Read, Write, Bash, Glob, Grep |
| **モデル (balanced)** | Sonnet |
| **カラー** | Green |
| **生成物** | 具体的なフィードバック付きの PASS/FAIL 判定 |
Expand Down Expand Up @@ -411,7 +411,7 @@ GSD はマルチエージェントアーキテクチャを採用しており、
| planner | ✓ | ✓ | | ✓ | ✓ | ✓ | | ✓ | ✓ |
| roadmapper | ✓ | ✓ | | ✓ | ✓ | ✓ | | | |
| executor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | |
| plan-checker | ✓ | | | ✓ | ✓ | ✓ | | | |
| plan-checker | ✓ | ✓ | | ✓ | ✓ | ✓ | | | |
| integration-checker | ✓ | | | ✓ | ✓ | ✓ | | | |
| ui-checker | ✓ | | | ✓ | ✓ | ✓ | | | |
| verifier | ✓ | ✓ | | ✓ | ✓ | ✓ | | | |
Expand All @@ -422,7 +422,7 @@ GSD はマルチエージェントアーキテクチャを採用しており、
| user-profiler | ✓ | | | | | | | | |

**最小権限の原則:**
- チェッカーは読み取り専用(Write/Edit なし) — 評価のみを行い、変更は行わない
- チェッカーは確認対象を変更しない(Edit なし) — plan-checker の唯一の Write はストール監視用のリターンレシート(#5182)。OpenCode・Kilo・Copilot は Write と Edit を 1 つの `edit` 権限として付与するため、インストーラーはそこで plan-checker の Write を外す(読み取り専用のまま、レシートは書かれない)
- リサーチャーは Web アクセスを持つ — 最新のエコシステム情報が必要なため
- エグゼキューターは Edit を持つ — コードを変更するが Web アクセスは不要
- マッパーは Write を持つ — 分析ドキュメントを作成するが Edit は不要(コード変更なし)
6 changes: 3 additions & 3 deletions docs/ko-KR/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ GSD는 멀티 에이전트 아키텍처를 사용합니다. 가벼운 오케스
|----------|-------|
| **생성 주체** | `/gsd-plan-phase` (검증 루프, 최대 3회 반복) |
| **병렬성** | 단일 인스턴스 (반복적) |
| **도구** | Read, Bash, Glob, Grep |
| **도구** | Read, Write, Bash, Glob, Grep |
| **모델 (balanced)** | Sonnet |
| **색상** | Green |
| **생성물** | 구체적인 피드백을 포함한 PASS/FAIL 판정 |
Expand Down Expand Up @@ -411,7 +411,7 @@ GSD는 멀티 에이전트 아키텍처를 사용합니다. 가벼운 오케스
| planner | ✓ | ✓ | | ✓ | ✓ | ✓ | | ✓ | ✓ |
| roadmapper | ✓ | ✓ | | ✓ | ✓ | ✓ | | | |
| executor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | |
| plan-checker | ✓ | | | ✓ | ✓ | ✓ | | | |
| plan-checker | ✓ | ✓ | | ✓ | ✓ | ✓ | | | |
| integration-checker | ✓ | | | ✓ | ✓ | ✓ | | | |
| ui-checker | ✓ | | | ✓ | ✓ | ✓ | | | |
| verifier | ✓ | ✓ | | ✓ | ✓ | ✓ | | | |
Expand All @@ -422,7 +422,7 @@ GSD는 멀티 에이전트 아키텍처를 사용합니다. 가벼운 오케스
| user-profiler | ✓ | | | | | | | | |

**최소 권한 원칙.**
- Checker는 읽기 전용입니다 (Write/Edit 없음) — 평가만 하며 수정하지 않습니다
- Checker는 검사 대상을 수정하지 않습니다 (Edit 없음) — plan-checker의 유일한 Write는 stall 감시용 반환 영수증입니다 (#5182). OpenCode, Kilo, Copilot은 Write와 Edit를 하나의 `edit` 권한으로 부여하므로, 설치 프로그램은 그곳에서 plan-checker의 Write를 제거합니다 (읽기 전용으로 유지되고 영수증은 작성되지 않습니다)
- Researcher는 웹 접근 권한을 가집니다 — 최신 생태계 정보가 필요하기 때문입니다
- Executor는 Edit 권한을 가집니다 — 코드를 수정하지만 웹 접근은 없습니다
- Mapper는 Write 권한을 가집니다 — 분석 문서를 작성하지만 Edit은 없습니다 (코드 변경 없음)
2 changes: 1 addition & 1 deletion gsd-core/references/agent-contracts.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ This doc describes what IS, not what should be. Casing inconsistencies are docum
| Agent | Role | Completion Markers | Consumed by | Kind |
|-------|------|--------------------|--------------|------|
| gsd-ai-researcher | AI framework research | No marker (writes the AI-SPEC.md framework section via Edit) | `gsd-core/workflows/ai-integration-phase.md` reads the AI-SPEC.md section after the agent returns | artifact+query |
| gsd-planner | Plan creation | `## PLANNING COMPLETE`, `## OUTLINE COMPLETE`, `## PHASE SPLIT RECOMMENDED`, `## ⚠ Source Audit`, `## CHECKPOINT REACHED`, `## PLANNING INCONCLUSIVE`, `## REVISION_CONFLICT` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md`, `gsd-core/workflows/plan-review-convergence.md`, `gsd-core/workflows/quick.md`, `gsd-core/workflows/quick/steps/plan-checker-loop.md`, `gsd-core/workflows/verify-work.md` | sentinel-match |
| gsd-planner | Plan creation | `## PLANNING COMPLETE`, `## OUTLINE COMPLETE`, `## PHASE SPLIT RECOMMENDED`, `## ⚠ Source Audit`, `## CHECKPOINT REACHED`, `## PLANNING INCONCLUSIVE`, `## REVISION COMPLETE`, `## REVISION_CONFLICT` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md`, `gsd-core/workflows/plan-review-convergence.md`, `gsd-core/workflows/quick.md`, `gsd-core/workflows/quick/steps/plan-checker-loop.md`, `gsd-core/workflows/verify-work.md` | sentinel-match |
| gsd-executor | Plan execution | `## PLAN COMPLETE`, `## CHECKPOINT REACHED` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md`, `agents/gsd-debug-session-manager.md`, `agents/gsd-debugger.md` | sentinel-match |
| gsd-phase-researcher | Phase-scoped research | `## RESEARCH COMPLETE`, `## RESEARCH BLOCKED` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/quick/steps/research-phase.md`, `agents/gsd-project-researcher.md` | sentinel-match |
| gsd-project-researcher | Project-wide research | `## RESEARCH COMPLETE`, `## RESEARCH BLOCKED` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/quick/steps/research-phase.md`, `agents/gsd-phase-researcher.md` | sentinel-match |
Expand Down
Loading
Loading