forge-workflow 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/.claude/commands/dev.md +340 -314
  2. package/.claude/commands/plan.md +521 -478
  3. package/.claude/commands/premerge.md +176 -179
  4. package/.claude/commands/research.md +42 -42
  5. package/.claude/commands/review.md +442 -442
  6. package/.claude/commands/rollback.md +721 -721
  7. package/.claude/commands/ship.md +164 -134
  8. package/.claude/commands/sonarcloud.md +152 -152
  9. package/.claude/commands/status.md +48 -77
  10. package/.claude/commands/validate.md +282 -237
  11. package/.claude/commands/verify.md +221 -221
  12. package/.claude/rules/greptile-review-process.md +285 -285
  13. package/.claude/rules/workflow.md +105 -105
  14. package/.claude/scripts/greptile-resolve.sh +526 -526
  15. package/.claude/scripts/load-env.sh +32 -32
  16. package/.cline/workflows/dev.md +337 -311
  17. package/.cline/workflows/plan.md +518 -475
  18. package/.cline/workflows/premerge.md +173 -176
  19. package/.cline/workflows/research.md +39 -39
  20. package/.cline/workflows/review.md +439 -439
  21. package/.cline/workflows/rollback.md +718 -718
  22. package/.cline/workflows/ship.md +161 -131
  23. package/.cline/workflows/sonarcloud.md +146 -146
  24. package/.cline/workflows/status.md +45 -74
  25. package/.cline/workflows/validate.md +279 -234
  26. package/.cline/workflows/verify.md +218 -218
  27. package/.codex/config.toml +11 -11
  28. package/.codex/skills/dev/SKILL.md +340 -314
  29. package/.codex/skills/plan/SKILL.md +521 -478
  30. package/.codex/skills/premerge/SKILL.md +176 -179
  31. package/.codex/skills/research/SKILL.md +42 -42
  32. package/.codex/skills/review/SKILL.md +442 -442
  33. package/.codex/skills/rollback/SKILL.md +721 -721
  34. package/.codex/skills/ship/SKILL.md +164 -134
  35. package/.codex/skills/sonarcloud/SKILL.md +149 -149
  36. package/.codex/skills/status/SKILL.md +48 -77
  37. package/.codex/skills/validate/SKILL.md +282 -237
  38. package/.codex/skills/verify/SKILL.md +221 -221
  39. package/.cursor/commands/dev.md +337 -311
  40. package/.cursor/commands/plan.md +518 -475
  41. package/.cursor/commands/premerge.md +173 -176
  42. package/.cursor/commands/research.md +39 -39
  43. package/.cursor/commands/review.md +439 -439
  44. package/.cursor/commands/rollback.md +718 -718
  45. package/.cursor/commands/ship.md +161 -131
  46. package/.cursor/commands/sonarcloud.md +146 -146
  47. package/.cursor/commands/status.md +45 -74
  48. package/.cursor/commands/validate.md +279 -234
  49. package/.cursor/commands/verify.md +218 -218
  50. package/.cursor/rules/permissions-guidance.mdc +37 -37
  51. package/.forge/hooks/check-tdd.js +240 -240
  52. package/.github/PLUGIN_TEMPLATE.json +32 -32
  53. package/.github/prompts/dev.prompt.md +342 -316
  54. package/.github/prompts/plan.prompt.md +523 -480
  55. package/.github/prompts/premerge.prompt.md +178 -181
  56. package/.github/prompts/research.prompt.md +44 -44
  57. package/.github/prompts/review.prompt.md +444 -444
  58. package/.github/prompts/rollback.prompt.md +723 -723
  59. package/.github/prompts/ship.prompt.md +166 -136
  60. package/.github/prompts/sonarcloud.prompt.md +151 -151
  61. package/.github/prompts/status.prompt.md +50 -79
  62. package/.github/prompts/validate.prompt.md +284 -239
  63. package/.github/prompts/verify.prompt.md +223 -223
  64. package/.github/workflows/beads-to-github.yml +56 -0
  65. package/.github/workflows/github-to-beads.yml +97 -0
  66. package/.kilocode/workflows/dev.md +341 -315
  67. package/.kilocode/workflows/plan.md +522 -479
  68. package/.kilocode/workflows/premerge.md +177 -180
  69. package/.kilocode/workflows/research.md +43 -43
  70. package/.kilocode/workflows/review.md +443 -443
  71. package/.kilocode/workflows/rollback.md +722 -722
  72. package/.kilocode/workflows/ship.md +165 -135
  73. package/.kilocode/workflows/sonarcloud.md +150 -150
  74. package/.kilocode/workflows/status.md +49 -78
  75. package/.kilocode/workflows/validate.md +283 -238
  76. package/.kilocode/workflows/verify.md +222 -222
  77. package/.mcp.json.example +12 -12
  78. package/.opencode/commands/dev.md +340 -314
  79. package/.opencode/commands/plan.md +521 -478
  80. package/.opencode/commands/premerge.md +176 -179
  81. package/.opencode/commands/research.md +42 -42
  82. package/.opencode/commands/review.md +442 -442
  83. package/.opencode/commands/rollback.md +721 -721
  84. package/.opencode/commands/ship.md +164 -134
  85. package/.opencode/commands/sonarcloud.md +149 -149
  86. package/.opencode/commands/status.md +48 -77
  87. package/.opencode/commands/validate.md +282 -237
  88. package/.opencode/commands/verify.md +221 -221
  89. package/.roo/commands/dev.md +341 -315
  90. package/.roo/commands/plan.md +522 -479
  91. package/.roo/commands/premerge.md +177 -180
  92. package/.roo/commands/research.md +43 -43
  93. package/.roo/commands/review.md +443 -443
  94. package/.roo/commands/rollback.md +722 -722
  95. package/.roo/commands/ship.md +165 -135
  96. package/.roo/commands/sonarcloud.md +150 -150
  97. package/.roo/commands/status.md +49 -78
  98. package/.roo/commands/validate.md +283 -238
  99. package/.roo/commands/verify.md +222 -222
  100. package/AGENTS.md +175 -169
  101. package/CLAUDE.md +100 -99
  102. package/LICENSE +21 -21
  103. package/README.md +429 -414
  104. package/bin/forge-cmd.js +313 -313
  105. package/bin/{forge-validate.js → forge-preflight.js} +309 -303
  106. package/bin/forge.js +4596 -4232
  107. package/docs/AGENT_INSTALL_PROMPT.md +342 -342
  108. package/docs/BEADS_GITHUB_SYNC.md +251 -0
  109. package/docs/ENHANCED_ONBOARDING.md +602 -602
  110. package/docs/EXAMPLES.md +482 -482
  111. package/docs/GREPTILE_SETUP.md +400 -400
  112. package/docs/MANUAL_REVIEW_GUIDE.md +106 -106
  113. package/docs/ROADMAP.md +359 -359
  114. package/docs/SETUP.md +663 -632
  115. package/docs/TOOLCHAIN.md +630 -630
  116. package/docs/VALIDATION.md +363 -363
  117. package/install.sh +40 -1058
  118. package/lefthook.yml +39 -39
  119. package/lib/agents/README.md +198 -198
  120. package/lib/agents/claude.plugin.json +28 -28
  121. package/lib/agents/cline.plugin.json +22 -22
  122. package/lib/agents/codex.plugin.json +19 -19
  123. package/lib/agents/copilot.plugin.json +24 -24
  124. package/lib/agents/cursor.plugin.json +25 -25
  125. package/lib/agents/kilocode.plugin.json +22 -22
  126. package/lib/agents/opencode.plugin.json +20 -20
  127. package/lib/agents/roo.plugin.json +23 -23
  128. package/lib/agents-config.js +2112 -2112
  129. package/lib/beads-health-check.js +143 -0
  130. package/lib/beads-setup.js +341 -0
  131. package/lib/beads-sync-scaffold.js +260 -0
  132. package/lib/commands/dev.js +513 -513
  133. package/lib/commands/plan.js +692 -692
  134. package/lib/commands/recommend.js +119 -119
  135. package/lib/commands/ship.js +377 -377
  136. package/lib/commands/status.js +378 -378
  137. package/lib/commands/validate.js +602 -602
  138. package/lib/context-merge.js +359 -359
  139. package/lib/dep-guard/analyzer.js +294 -294
  140. package/lib/dep-guard/behavior-detector.js +98 -98
  141. package/lib/dep-guard/contract-detector.js +162 -162
  142. package/lib/dep-guard/import-detector.js +498 -498
  143. package/lib/dep-guard/path-utils.js +13 -13
  144. package/lib/dep-guard/rubric.js +120 -120
  145. package/lib/dep-guard/task-parser.js +318 -318
  146. package/lib/detect-agent.js +191 -0
  147. package/lib/detect-worktree.js +47 -0
  148. package/lib/file-hash.js +26 -0
  149. package/lib/husky-migration.js +450 -0
  150. package/lib/lefthook-check.js +65 -0
  151. package/lib/pat-setup.js +207 -0
  152. package/lib/plugin-catalog.js +350 -350
  153. package/lib/plugin-manager.js +166 -166
  154. package/lib/plugin-recommender.js +141 -141
  155. package/lib/project-discovery.js +491 -491
  156. package/lib/setup-action-log.js +139 -0
  157. package/lib/setup-summary-renderer.js +106 -0
  158. package/lib/setup-utils.js +96 -0
  159. package/lib/setup.js +192 -118
  160. package/lib/smart-merge.js +64 -0
  161. package/lib/symlink-utils.js +81 -0
  162. package/lib/workflow-profiles.js +197 -197
  163. package/package.json +131 -129
  164. package/scripts/beads-context.sh +291 -0
  165. package/scripts/beads-context.test.js +563 -0
  166. package/scripts/behavioral-judge.sh +378 -0
  167. package/scripts/benchmark.js +85 -0
  168. package/scripts/branch-protection.js +183 -0
  169. package/scripts/check-agents.js +172 -0
  170. package/scripts/commitlint.js +42 -0
  171. package/scripts/conflict-detect.sh +323 -0
  172. package/scripts/dep-guard-analyze.js +71 -0
  173. package/scripts/dep-guard.sh +811 -0
  174. package/scripts/eval_win.py +249 -0
  175. package/scripts/file-index.sh +399 -0
  176. package/scripts/github-beads-sync/comment.mjs +64 -0
  177. package/scripts/github-beads-sync/config.mjs +148 -0
  178. package/scripts/github-beads-sync/github-api.mjs +131 -0
  179. package/scripts/github-beads-sync/index.mjs +332 -0
  180. package/scripts/github-beads-sync/label-mapper.mjs +54 -0
  181. package/scripts/github-beads-sync/mapping.mjs +78 -0
  182. package/scripts/github-beads-sync/reverse-sync-cli.mjs +31 -0
  183. package/scripts/github-beads-sync/reverse-sync.mjs +138 -0
  184. package/scripts/github-beads-sync/run-bd.mjs +159 -0
  185. package/scripts/github-beads-sync/sanitize.mjs +121 -0
  186. package/scripts/github-beads-sync.config.json +26 -0
  187. package/scripts/improve-command.js +375 -0
  188. package/scripts/lib/eval-runner.js +229 -0
  189. package/scripts/lib/eval-schema.js +135 -0
  190. package/scripts/lib/eval-storage.js +78 -0
  191. package/scripts/lib/grading.js +203 -0
  192. package/scripts/lib/transcript-parser.js +63 -0
  193. package/scripts/lint.js +47 -0
  194. package/scripts/migrate-to-bun-test.js +412 -0
  195. package/scripts/run-command-eval.js +236 -0
  196. package/scripts/smart-status.sh +782 -0
  197. package/scripts/sync-commands.js +571 -0
  198. package/scripts/sync-utils.sh +460 -0
  199. package/scripts/test-dashboard.js +123 -0
  200. package/scripts/test.js +44 -0
  201. package/scripts/validate.sh +94 -0
  202. package/skills/parallel-deep-research/SKILL.md +108 -108
  203. package/skills/parallel-deep-research/evals/README.md +27 -27
  204. package/skills/parallel-deep-research/evals/evals.json +62 -62
  205. package/skills/sonarcloud-analysis/SKILL.md +171 -171
  206. package/skills/sonarcloud-analysis/evals/README.md +27 -27
  207. package/skills/sonarcloud-analysis/evals/evals.json +50 -50
  208. package/skills/sonarcloud-analysis/references/api-reference.md +466 -466
  209. package/docs/WORKFLOW.md +0 -400
@@ -1,479 +1,522 @@
1
- ---
2
- description: Design intent → research → branch + worktree + task list
3
- mode: code
4
- ---
5
-
6
- Plan a feature from scratch: brainstorm design intent, research technical approach, then set up branch, worktree, and a complete task list ready for /dev.
7
-
8
- # Plan
9
-
10
- This command runs in **3 phases**. Each phase ends with a HARD-GATE. Do not skip phases.
11
-
12
- ---
13
-
14
- ```
15
- <HARD-GATE: /plan entry — worktree isolation>
16
- Before ANY planning work begins:
17
-
18
- 1. Run: git branch --show-current
19
- 2. If the current branch is NOT master/main:
20
- - STOP. Do not begin Phase 1.
21
- - Tell the user: "You are on '<branch>'. Planning must start from a clean worktree on master.
22
- Run: git checkout master — then re-run /plan."
23
- 3. If on master, create the worktree NOW before asking any questions:
24
- a. bd worktree create .worktrees/<slug> --branch feat/<slug>
25
- b. cd .worktrees/<slug>
26
- 4. Confirm: "Working in isolated worktree: .worktrees/<slug> (branch: feat/<slug>)"
27
- 5. ONLY THEN begin Phase 1.
28
-
29
- Rationale: Planning commits (design docs, task lists) belong only to this feature's branch.
30
- If planning runs in the main directory on a non-master branch, those commits contaminate
31
- whatever branch is currently checked out. The worktree ensures zero cross-contamination
32
- between parallel features or sessions.
33
- </HARD-GATE>
34
- ```
35
-
36
- ---
37
-
38
- ## Usage
39
-
40
- ```bash
41
- /plan <feature-slug>
42
- /plan <feature-slug> --strategic # Major architecture change: creates design doc PR before Phase 2
43
- /plan <feature-slug> --continue # After --strategic PR is merged: run Phase 2 + 3
44
- ```
45
-
46
- ---
47
-
48
- ## Phase 1: Design Intent (Brainstorming)
49
-
50
- **Goal**: Capture WHAT to build — purpose, constraints, success criteria, edge cases, approach.
51
-
52
- ### Step 0: Dependency ripple check (advisory)
53
-
54
- Before exploring context or asking questions, check for potential conflicts with in-flight work:
55
-
56
- ```bash
57
- # If a Beads issue ID is known (e.g., from /status or bd ready):
58
- bash scripts/dep-guard.sh check-ripple <beads-issue-id>
59
-
60
- # If no issue exists yet (first-time plan):
61
- bd list --status=open,in_progress
62
- ```
63
-
64
- Review the output. If overlaps are detected:
65
- - Consider whether the overlapping issue should be a dependency
66
- - Note any shared areas for the design Q&A
67
- - This check is **advisory only** always proceed to Step 1 regardless of findings
68
-
69
- #### Ripple Analyst Agent (spawned when contract overlaps found)
70
-
71
- When `check-ripple` detects overlapping issues AND contract metadata is available, spawn a Ripple Analyst subagent with this prompt:
72
-
73
- **Input to agent**:
74
- - Current issue's contract changes (from `extract-contracts` output)
75
- - Consumer code snippets (from `find-consumers` output for each changed contract)
76
- - Overlapping issue's title, description, and contract metadata
77
-
78
- **Agent instructions**:
79
- 1. For each overlapping contract, imagine 2-3 concrete break scenarios:
80
- - "If [contract X] changes [specific behavior], then [consumer Y] will [specific failure]"
81
- 2. Rate overall impact as one of:
82
- - **NONE**: No real conflict despite keyword overlap
83
- - **LOW**: Consumers need trivial adjustment (add parameter, rename call)
84
- - **HIGH**: Consumer needs significant rework (parsing logic, data handling changes)
85
- - **CRITICAL**: Consumer is in an active in_progress issue's task list
86
- 3. **When uncertain, default to HIGH** conservative over permissive
87
- 4. Recommend one action:
88
- - Add dependency (`bd dep add <source> <target>`)
89
- - Coordinate with other issue's developer
90
- - Scope down current feature to avoid overlap
91
- - Proceed as-is (no real conflict)
92
-
93
- **Output format**:
94
- ```
95
- Impact: [NONE|LOW|HIGH|CRITICAL]
96
- Confidence: [high|medium|low]
97
-
98
- Break scenarios:
99
- 1. [scenario description]
100
- 2. [scenario description]
101
-
102
- Recommendation: [action]
103
- Reason: [why this action]
104
- ```
105
-
106
- This agent is advisory only. The developer always makes the final decision.
107
-
108
- ### Step 1: Explore project context
109
-
110
- Before asking any questions, read relevant files:
111
- - Recent commits related to this area
112
- - Existing code in affected modules
113
- - Any related docs, tests, or prior research
114
-
115
- ### Step 2: Ask clarifying questions one at a time
116
-
117
- Ask each question in sequence. Wait for user response. Use multiple choice where possible.
118
-
119
- Questions to cover (adapt to feature, don't ask mechanical copies):
120
- 1. **Purpose** What problem does this solve? Who benefits?
121
- 2. **Constraints** What must this NOT do? What are the hard limits?
122
- 3. **Success criteria** How will we know it's done? What is the minimum viable result?
123
- 4. **Edge cases** — What happens when [key dependency] fails / [input] is missing / [state] is ambiguous?
124
- 5. **Technical preferences** — Library A or B? Pattern X or Y? (when real options exist)
125
- 6. **Ambiguity policy** — If a spec gap is found mid-dev, should the agent: (a) make a reasonable choice and document it, or (b) pause and wait for input?
126
-
127
- ### Step 3: Propose approaches
128
-
129
- Propose 2-3 concrete approaches with:
130
- - Trade-offs (speed vs safety, complexity vs flexibility)
131
- - A clear recommendation with reasoning
132
- - Get user approval on the chosen approach
133
-
134
- ### Step 4: Write design doc
135
-
136
- Save to `docs/plans/YYYY-MM-DD-<slug>-design.md` with these sections:
137
- - **Feature**: slug, date, status
138
- - **Purpose**: what problem it solves
139
- - **Success criteria**: measurable, specific
140
- - **Out of scope**: explicit boundaries
141
- - **Approach selected**: which option and why
142
- - **Constraints**: hard limits
143
- - **Edge cases**: decisions made during Q&A
144
- - **Ambiguity policy**: agent's fallback when spec gaps arise mid-dev
145
-
146
- Commit the design doc:
147
- ```bash
148
- git add docs/plans/YYYY-MM-DD-<slug>-design.md
149
- git commit -m "docs: add design doc for <slug>"
150
- ```
151
-
152
- ---
153
-
154
- **--strategic flag** (for major architecture changes):
155
-
156
- After committing the design doc, push to a proposal branch and open PR:
157
- ```bash
158
- git checkout -b feat/<slug>-proposal
159
- git push -u origin feat/<slug>-proposal
160
- gh pr create --title "Design: <feature-name>" \
161
- --body "Design doc for review. See docs/plans/YYYY-MM-DD-<slug>-design.md"
162
- ```
163
-
164
- **STOP here.** Present the PR URL. Wait for the user to merge the proposal PR.
165
- After merge, run `/plan <slug> --continue` to proceed to Phase 2 + 3.
166
-
167
- ---
168
-
169
- ```
170
- <HARD-GATE: Phase 1 exit>
171
- Do NOT begin Phase 2 (web research) until:
172
- 1. User has approved the design in this session
173
- 2. Design doc exists at docs/plans/YYYY-MM-DD-<slug>-design.md
174
- 3. Design doc includes: success criteria, edge cases, out-of-scope, ambiguity policy
175
- 4. Design doc is committed to git
176
- </HARD-GATE>
177
- ```
178
-
179
- ---
180
-
181
- ## Phase 2: Technical Research
182
-
183
- **Goal**: Find HOW to build it — best practices, known issues, security risks, TDD scenarios.
184
-
185
- Run these in parallel:
186
-
187
- ### Web research (parallel-deep-research skill)
188
- ```
189
- Skill("parallel-deep-research")
190
- ```
191
- Search for:
192
- - "[tech stack] [feature] best practices [year]"
193
- - "[library/framework] [feature] implementation patterns"
194
- - "Known issues / gotchas with [approach selected]"
195
-
196
- ### OWASP Top 10 analysis
197
-
198
- For this feature's risk surface, document each relevant OWASP category:
199
- - What the risk is
200
- - Whether it applies to this feature
201
- - What mitigation will be implemented
202
-
203
- ### Codebase exploration (Explore agent)
204
- - Similar existing patterns to reuse
205
- - Files this feature will affect
206
- - Existing test infrastructure to leverage
207
-
208
- ### DRY check (mandatory — use actual search tools)
209
-
210
- Before finalizing the approach, run Grep/Glob/Read searches for existing implementations of the planned function or pattern. Do not rely on memory or assumptions — execute the searches.
211
-
212
- ```
213
- Grep(searchTerm) # e.g., the function or concept name
214
- Glob("**/*.js") # narrow to affected file types if needed
215
- Read(matchedFile) # inspect any match in context
216
- ```
217
-
218
- If a match is found:
219
- - Update the design doc's "Approach selected" section to say "extend existing [file/function]" not "create new".
220
- - Note the existing file path and line number in the design doc.
221
-
222
- If no match is found: proceed. The DRY gate is cleared.
223
-
224
- ### Blast-radius search (mandatory for remove/rename/replace features)
225
-
226
- If this feature involves **removing**, **renaming**, or **replacing** a concept, tool, or dependency:
227
-
228
- 1. Grep the ENTIRE codebase for the thing being removed/renamed:
229
- ```
230
- Grep("<thing-being-removed>") # exact name
231
- Grep("<thing-being-removed>", -i) # case-insensitive variant
232
- Glob("**/*<thing>*") # files named after it
233
- ```
234
-
235
- 2. For EVERY match found:
236
- - Note the file path and line number in the design doc
237
- - Add a cleanup task to the task list (Phase 3)
238
- - Flag matches in unexpected packages or config files explicitly
239
-
240
- 3. Common hiding spots to check:
241
- - `package.json` (scripts, dependencies, description)
242
- - `install.sh` / setup scripts
243
- - CI/CD workflows (`.github/workflows/`)
244
- - Agent config files (`lib/agents/`, `.cursorrules`, etc.)
245
- - Documentation (`docs/`, `README.md`, `AGENTS.md`)
246
- - Import statements and require() calls
247
-
248
- If no removal/rename is involved, this section is skipped.
249
-
250
- ### TDD test scenarios
251
-
252
- Identify at minimum 3 test scenarios:
253
- - Happy path
254
- - Error / failure path
255
- - Edge case from Phase 1
256
-
257
- Append all research findings to the design doc under a `## Technical Research` section (not a separate file).
258
-
259
- ---
260
-
261
- ```
262
- <HARD-GATE: Phase 2 exit>
263
- Do NOT begin Phase 3 (setup) until:
264
- 1. OWASP analysis is documented in design doc
265
- 2. At least 3 TDD test scenarios are identified
266
- 3. Approach selection is confirmed (which library/pattern to use)
267
- 4. If feature involves removal/rename: blast-radius search completed, all references added to task list
268
- </HARD-GATE>
269
- ```
270
-
271
- ---
272
-
273
- ## Phase 3: Setup + Task List
274
-
275
- **Goal**: Create branch, worktree, Beads issue, and a complete task list ready for /dev.
276
-
277
- ### Step 1: Beads issue
278
-
279
- ```bash
280
- bd create --title="<feature-name>" --type=feature
281
- bd update <id> --status=in_progress
282
- ```
283
-
284
- ### Step 2: Branch + worktree
285
-
286
- **ALWAYS branch from master, never from the current branch.** If the working directory is on any branch other than master, the new feature branch would inherit all unmerged changes from that branch — contaminating the new feature's history.
287
-
288
- **Note**: If the Entry HARD-GATE already created the branch and worktree (and you are already inside `.worktrees/<slug>`), skip Steps 2b–2d — they are already done.
289
-
290
- ```bash
291
- # Step 2a: Check if branch and worktree were already created by Entry HARD-GATE
292
- CURRENT=$(git branch --show-current)
293
- if [ "$CURRENT" = "feat/<slug>" ]; then
294
- echo "✓ Branch feat/<slug> already exists (Entry HARD-GATE created it) skipping 2b–2d"
295
- else
296
- # Step 2b: Verify .worktrees/ is gitignored — add if missing
297
- git check-ignore -v .worktrees/ || echo ".worktrees/" >> .gitignore
298
-
299
- # Step 2c: Create a Beads-aware worktree rooted on master
300
- git checkout master
301
- bd worktree create .worktrees/<slug> --branch feat/<slug>
302
- cd .worktrees/<slug>
303
- fi
304
- ```
305
-
306
- **Why this matters**: Multiple parallel features or sessions each get their own isolated worktree. Changes to one feature never bleed into another. The main working directory can stay on any branch without affecting new feature branches.
307
-
308
- ### Step 3: Project setup in worktree
309
-
310
- Auto-detect and run install:
311
- ```bash
312
- # e.g., bun install / npm install / pip install -r requirements.txt
313
- ```
314
-
315
- ### Step 4: Baseline test run
316
-
317
- ```bash
318
- # Run full test suite in worktree
319
- bun test # or project test command
320
- ```
321
-
322
- If tests fail: report which tests are failing and ask user whether to investigate or proceed anyway. Do not silently proceed past failing baseline tests.
323
-
324
- ### Step 5: Task list creation
325
-
326
- Read the design doc. Break implementation into granular tasks.
327
-
328
- **Task format** (each task MUST have ALL of these):
329
- ```
330
- Task N: <descriptive title>
331
- File(s): <exact file paths>
332
- What to implement: <complete description — not "add feature X", but what specifically>
333
- TDD steps:
334
- 1. Write test: <test file path, what assertion, what input/output>
335
- 2. Run test: confirm it fails with [specific expected error message]
336
- 3. Implement: <exact function/class/component to write>
337
- 4. Run test: confirm it passes
338
- 5. Commit: `<type>: <message>`
339
- Expected output: <what running the test/code produces when done>
340
- ```
341
-
342
- **Ordering rules**:
343
- - Foundational/shared modules FIRST (types, utils, constants)
344
- - Feature logic SECOND
345
- - Integration/wiring THIRD
346
- - Uncertain/ambiguous tasks LAST (so they can be deferred if blocked)
347
-
348
- **YAGNI filter** (after initial task draft, before saving):
349
-
350
- For each task, confirm it maps to a specific requirement, success criterion, or edge case in the design doc. Run `applyYAGNIFilter({ task, designDoc })` for each task.
351
-
352
- - Tasks that match → keep as-is.
353
- - Tasks with no anchor → flagged as "potential scope creep". Present flagged tasks to the user: "These tasks have no anchor in the design doc. Keep (specify which requirement it serves) or remove?"
354
- - If ALL tasks are flagged → return `allFlagged: true` and tell the user: "Design doc doesn't cover all tasks — needs amendment." Do not save the task list until the design doc is updated or tasks are removed.
355
-
356
- **Before finalizing**: flag any tasks that touch areas not fully specified in the design doc. Present flagged tasks to user for quick clarification before saving.
357
-
358
- Save to `docs/plans/YYYY-MM-DD-<slug>-tasks.md`.
359
-
360
- ### Step 5b: Beads context
361
-
362
- After saving the task list, attach design context and acceptance criteria to the Beads issue so downstream stages (`/dev`, `/validate`, `/review`) can retrieve it without re-reading the design doc.
363
-
364
- ```bash
365
- # Link design metadata (task count + task file path) to the Beads issue
366
- bash scripts/beads-context.sh set-design <id> <task-count> docs/plans/YYYY-MM-DD-<slug>-tasks.md
367
-
368
- # Record the success criteria from the design doc on the issue
369
- bash scripts/beads-context.sh set-acceptance <id> "<success-criteria from design doc>"
370
- ```
371
-
372
- Both commands must exit with code 0. If either fails, investigate (wrong issue ID? missing script?) before continuing.
373
-
374
- ### Step 5c: Contract extraction and logic-level dependency review
375
-
376
- After saving the task list and Beads context, extract and store contract metadata, then run the logic-level Phase 3 dependency review:
377
-
378
- ```bash
379
- # Extract contracts only call store-contracts if extract succeeds (exit 0)
380
- if bash scripts/dep-guard.sh extract-contracts docs/plans/YYYY-MM-DD-<slug>-tasks.md > /tmp/contracts.txt; then
381
- bash scripts/dep-guard.sh store-contracts <id> "$(cat /tmp/contracts.txt)"
382
- else
383
- echo "No contracts found — skipping store-contracts"
384
- fi
385
-
386
- # Re-run ripple check using Beads JSON + logic-level analysis
387
- bash scripts/dep-guard.sh check-ripple <id>
388
- ```
389
-
390
- `extract-contracts` exits 1 when no contracts are found (not an error — just nothing to store). `store-contracts` must exit 0 if called.
391
-
392
- `check-ripple` is now advisory but logic-aware. It should:
393
- - read Beads issue data via JSON
394
- - analyze import/call-chain, contract, and behavioral dependency signals
395
- - show rubric score, confidence, issue pairs, and proposed dependency updates with pros/cons
396
- - stop for user approval whenever a dependency mutation is proposed
397
-
398
- If the user approves a dependency mutation, apply it explicitly:
399
-
400
- ```bash
401
- bash scripts/dep-guard.sh apply-decision <id> <dependent-id> <depends-on-id> "<approval rationale>"
402
- ```
403
-
404
- That approval step must validate with `bd dep cycles`, show `bd graph`, summarize `bd ready`, and persist the decision via `bd set-state` plus `bd comments`. Beads remains the canonical machine-readable decision record; the plan docs hold only the concise summary.
405
-
406
- ### Step 6: User review
407
-
408
- Present the full task list. Allow the user to reorder, split, or remove tasks.
409
-
410
- ---
411
-
412
- ```
413
- <HARD-GATE: /plan exit>
414
- Do NOT proceed to /dev until ALL are confirmed:
415
- 1. git branch --show-current output shows feat/<slug>
416
- 2. git worktree list shows .worktrees/<slug>
417
- 3. Baseline tests ran either passing OR user confirmed to proceed past failures
418
- 4. Beads issue is created with status=in_progress
419
- 5. Task list exists at docs/plans/YYYY-MM-DD-<slug>-tasks.md
420
- 6. User has confirmed task list is correct
421
- 7. `beads-context.sh set-design` ran successfully (exit code 0)
422
- 8. `beads-context.sh set-acceptance` ran successfully (exit code 0)
423
- 9. `dep-guard.sh store-contracts` ran successfully (exit code 0) — or skipped if no contracts found
424
- 10. `dep-guard.sh check-ripple` ran successfully and any proposed dependency mutation was reviewed with the user before calling `apply-decision`
425
- </HARD-GATE>
426
- ```
427
-
428
- After all HARD-GATE items pass, record the stage transition on the Beads issue:
429
-
430
- ```bash
431
- bash scripts/beads-context.sh stage-transition <id> plan dev
432
- ```
433
-
434
- ---
435
-
436
- ## Example Output (Phase 3 complete)
437
-
438
- ```
439
- Phase 1: Design intent captured
440
- - Design doc: docs/plans/2026-02-26-stripe-billing-design.md
441
- - Approach: Stripe SDK v4 (selected over v3)
442
- - Ambiguity policy: Make conservative choice + document in decisions log
443
-
444
- Phase 2: Technical research complete
445
- - OWASP Top 10: 3 risks identified, 3 mitigations planned
446
- - TDD scenarios: 5 identified
447
- - Sources: 8 references
448
-
449
- Phase 3: Setup complete
450
- - Beads: forge-xyz (in_progress)
451
- - Branch: feat/stripe-billing
452
- - Worktree: .worktrees/stripe-billing (baseline: 24/24 tests passing)
453
- - Task list: docs/plans/2026-02-26-stripe-billing-tasks.md (8 tasks)
454
-
455
- ⏸️ Task list ready for review. Confirm to proceed.
456
-
457
- After confirming, run: /dev
458
- ```
459
-
460
- ## Integration with Workflow
461
-
462
- ```
463
- Utility: /status → Understand current context before starting
464
- Stage 1: /plan → Design intent → research → branch + worktree + task list (you are here)
465
- Stage 2: /dev → Implement each task with subagent-driven TDD
466
- Stage 3: /validate → Type check, lint, tests, securityall fresh output
467
- Stage 4: /ship → Push + create PR
468
- Stage 5: /review → Address GitHub Actions, Greptile, SonarCloud
469
- Stage 6: /premerge → Update docs, hand off PR to user
470
- Stage 7: /verify → Post-merge CI check on main
471
- ```
472
-
473
- ## Tips
474
-
475
- - **Phase 1 quality = /dev autonomy**: Every ambiguity resolved in Phase 1 is a decision gate that won't fire during /dev
476
- - **One question at a time**: Don't dump all questions at once — dialogue produces better design decisions than a questionnaire
477
- - **Task granularity**: Target 2-5 minutes per task. If a task takes longer, split it
478
- - **Uncertain tasks go last**: Anything ambiguous at the end of the task list can be deferred if blocked without stopping other work
479
- - **Baseline failures matter**: Pre-existing test failures hide regressions. Fix or explicitly document them before /dev starts
1
+ ---
2
+ description: Design intent → research → branch + worktree + task list
3
+ mode: code
4
+ ---
5
+
6
+ Plan a feature from scratch: brainstorm design intent, research technical approach, then set up branch, worktree, and a complete task list ready for /dev.
7
+
8
+ # Plan
9
+
10
+ This command runs in **3 phases**. Each phase ends with a HARD-GATE. Do not skip phases.
11
+
12
+ ---
13
+
14
+ ```
15
+ <HARD-GATE: /plan entry — worktree isolation>
16
+ Before ANY planning work begins:
17
+
18
+ 1. Run: git branch --show-current
19
+ 2. If the current branch is NOT master/main:
20
+ - STOP. Do not begin Phase 1.
21
+ - Tell the user: "You are on '<branch>'. Planning must start from a clean worktree on master.
22
+ Run: git checkout master — then re-run /plan."
23
+ 3. If on master, create the worktree NOW before asking any questions:
24
+ a. bd worktree create .worktrees/<slug> --branch feat/<slug>
25
+ b. cd .worktrees/<slug>
26
+ 4. Confirm: "Working in isolated worktree: .worktrees/<slug> (branch: feat/<slug>)"
27
+ 5. Create the epic issue and record the stage transition:
28
+ ```bash
29
+ bd create --title="<feature-name>" --type=epic
30
+ bd update <id> --status=in_progress
31
+ bash scripts/beads-context.sh stage-transition <id> none plan
32
+ ```
33
+ 6. ONLY THEN begin Phase 1.
34
+
35
+ Rationale: Planning commits (design docs, task lists) belong only to this feature's branch.
36
+ If planning runs in the main directory on a non-master branch, those commits contaminate
37
+ whatever branch is currently checked out. The worktree ensures zero cross-contamination
38
+ between parallel features or sessions.
39
+ </HARD-GATE>
40
+ ```
41
+
42
+ ---
43
+
44
+ ## Usage
45
+
46
+ ```bash
47
+ /plan <feature-slug>
48
+ /plan <feature-slug> --strategic # Major architecture change: creates design doc PR before Phase 2
49
+ /plan <feature-slug> --continue # After --strategic PR is merged: run Phase 2 + 3
50
+ ```
51
+
52
+ ---
53
+
54
+
55
+ ### Multi-developer conflict check (soft block)
56
+
57
+ Before proceeding to Phase 1, check for cross-developer conflicts:
58
+
59
+ ```bash
60
+ # Auto-sync to get latest team state
61
+ bash scripts/sync-utils.sh auto-sync
62
+
63
+ # Check for conflicts with this issue's planned work area
64
+ bash scripts/conflict-detect.sh --issue <beads-id>
65
+ ```
66
+
67
+ If exit code 2 (validation error): show error message, abort do not show conflict prompt.
68
+
69
+ If exit code 1 (conflicts found):
70
+ - Display the conflict output to the developer
71
+ - Ask: "Other developers are working in overlapping areas. Proceed anyway? (y/n)"
72
+ - If `n`: exit cleanly, no side effects
73
+ - If `y`: log override via `bd comments add <id> "Conflict override: proceeding despite overlap with <conflicting-issues>"`, then continue to Phase 1
74
+ - Audit: record conflict override per OWASP A09
75
+
76
+ If exit code 0: proceed silently to Phase 1.
77
+
78
+ ---
79
+
80
+ ## Phase 1: Design Intent (Brainstorming)
81
+
82
+ **Goal**: Capture WHAT to build purpose, constraints, success criteria, edge cases, approach.
83
+
84
+ ### Step 0: Dependency ripple check (advisory)
85
+
86
+ Before exploring context or asking questions, check for potential conflicts with in-flight work:
87
+
88
+ ```bash
89
+ # If a Beads issue ID is known (e.g., from /status or bd ready):
90
+ bash scripts/dep-guard.sh check-ripple <beads-issue-id>
91
+
92
+ # If no issue exists yet (first-time plan):
93
+ bd list --status=open,in_progress
94
+ ```
95
+
96
+ Review the output. If overlaps are detected:
97
+ - Consider whether the overlapping issue should be a dependency
98
+ - Note any shared areas for the design Q&A
99
+ - This check is **advisory only** — always proceed to Step 1 regardless of findings
100
+
101
+ #### Ripple Analyst Agent (spawned when contract overlaps found)
102
+
103
+ When `check-ripple` detects overlapping issues AND contract metadata is available, spawn a Ripple Analyst subagent with this prompt:
104
+
105
+ **Input to agent**:
106
+ - Current issue's contract changes (from `extract-contracts` output)
107
+ - Consumer code snippets (from `find-consumers` output for each changed contract)
108
+ - Overlapping issue's title, description, and contract metadata
109
+
110
+ **Agent instructions**:
111
+ 1. For each overlapping contract, imagine 2-3 concrete break scenarios:
112
+ - "If [contract X] changes [specific behavior], then [consumer Y] will [specific failure]"
113
+ 2. Rate overall impact as one of:
114
+ - **NONE**: No real conflict despite keyword overlap
115
+ - **LOW**: Consumers need trivial adjustment (add parameter, rename call)
116
+ - **HIGH**: Consumer needs significant rework (parsing logic, data handling changes)
117
+ - **CRITICAL**: Consumer is in an active in_progress issue's task list
118
+ 3. **When uncertain, default to HIGH** — conservative over permissive
119
+ 4. Recommend one action:
120
+ - Add dependency (`bd dep add <source> <target>`)
121
+ - Coordinate with other issue's developer
122
+ - Scope down current feature to avoid overlap
123
+ - Proceed as-is (no real conflict)
124
+
125
+ **Output format**:
126
+ ```
127
+ Impact: [NONE|LOW|HIGH|CRITICAL]
128
+ Confidence: [high|medium|low]
129
+
130
+ Break scenarios:
131
+ 1. [scenario description]
132
+ 2. [scenario description]
133
+
134
+ Recommendation: [action]
135
+ Reason: [why this action]
136
+ ```
137
+
138
+ This agent is advisory only. The developer always makes the final decision.
139
+
140
+ ### Step 1: Explore project context
141
+
142
+ Before asking any questions, read relevant files:
143
+ - Recent commits related to this area
144
+ - Existing code in affected modules
145
+ - Any related docs, tests, or prior research
146
+
147
+ ### Step 2: Ask clarifying questions — one at a time
148
+
149
+ Ask each question in sequence. Wait for user response. Use multiple choice where possible.
150
+
151
+ Questions to cover (adapt to feature, don't ask mechanical copies):
152
+ 1. **Purpose** — What problem does this solve? Who benefits?
153
+ 2. **Constraints** — What must this NOT do? What are the hard limits?
154
+ 3. **Success criteria** How will we know it's done? What is the minimum viable result?
155
+ 4. **Edge cases** — What happens when [key dependency] fails / [input] is missing / [state] is ambiguous?
156
+ 5. **Technical preferences** Library A or B? Pattern X or Y? (when real options exist)
157
+ 6. **Ambiguity policy** — If a spec gap is found mid-dev, should the agent: (a) make a reasonable choice and document it, or (b) pause and wait for input?
158
+
159
+ ### Step 3: Propose approaches
160
+
161
+ Propose 2-3 concrete approaches with:
162
+ - Trade-offs (speed vs safety, complexity vs flexibility)
163
+ - A clear recommendation with reasoning
164
+ - Get user approval on the chosen approach
165
+
166
+ ### Step 4: Write design doc
167
+
168
+ Save to `docs/plans/YYYY-MM-DD-<slug>-design.md` with these sections:
169
+ - **Feature**: slug, date, status
170
+ - **Purpose**: what problem it solves
171
+ - **Success criteria**: measurable, specific
172
+ - **Out of scope**: explicit boundaries
173
+ - **Approach selected**: which option and why
174
+ - **Constraints**: hard limits
175
+ - **Edge cases**: decisions made during Q&A
176
+ - **Ambiguity policy**: agent's fallback when spec gaps arise mid-dev
177
+
178
+ Commit the design doc:
179
+ ```bash
180
+ git add docs/plans/YYYY-MM-DD-<slug>-design.md
181
+ git commit -m "docs: add design doc for <slug>"
182
+ ```
183
+
184
+ ---
185
+
186
+ **--strategic flag** (for major architecture changes):
187
+
188
+ After committing the design doc, push to a proposal branch and open PR:
189
+ ```bash
190
+ git checkout -b feat/<slug>-proposal
191
+ git push -u origin feat/<slug>-proposal
192
+ gh pr create --title "Design: <feature-name>" \
193
+ --body "Design doc for review. See docs/plans/YYYY-MM-DD-<slug>-design.md"
194
+ ```
195
+
196
+ **STOP here.** Present the PR URL. Wait for the user to merge the proposal PR.
197
+ After merge, run `/plan <slug> --continue` to proceed to Phase 2 + 3.
198
+
199
+ ---
200
+
201
+ ```
202
+ <HARD-GATE: Phase 1 exit>
203
+ Do NOT begin Phase 2 (web research) until:
204
+ 1. User has approved the design in this session
205
+ 2. Design doc exists at docs/plans/YYYY-MM-DD-<slug>-design.md
206
+ 3. Design doc includes: success criteria, edge cases, out-of-scope, ambiguity policy
207
+ 4. Design doc is committed to git
208
+ </HARD-GATE>
209
+ ```
210
+
211
+ ---
212
+
213
+ ## Phase 2: Technical Research
214
+
215
+ **Goal**: Find HOW to build it — best practices, known issues, security risks, TDD scenarios.
216
+
217
+ Record the phase transition before starting research:
218
+ ```bash
219
+ bash scripts/beads-context.sh stage-transition <id> plan research
220
+ ```
221
+
222
+ Run these in parallel:
223
+
224
+ ### Web research (parallel-deep-research skill)
225
+ ```
226
+ Skill("parallel-deep-research")
227
+ ```
228
+ Search for:
229
+ - "[tech stack] [feature] best practices [year]"
230
+ - "[library/framework] [feature] implementation patterns"
231
+ - "Known issues / gotchas with [approach selected]"
232
+
233
+ ### OWASP Top 10 analysis
234
+
235
+ For this feature's risk surface, document each relevant OWASP category:
236
+ - What the risk is
237
+ - Whether it applies to this feature
238
+ - What mitigation will be implemented
239
+
240
+ ### Codebase exploration (Explore agent)
241
+ - Similar existing patterns to reuse
242
+ - Files this feature will affect
243
+ - Existing test infrastructure to leverage
244
+
245
+ ### DRY check (mandatory use actual search tools)
246
+
247
+ Before finalizing the approach, run Grep/Glob/Read searches for existing implementations of the planned function or pattern. Do not rely on memory or assumptions — execute the searches.
248
+
249
+ ```
250
+ Grep(searchTerm) # e.g., the function or concept name
251
+ Glob("**/*.js") # narrow to affected file types if needed
252
+ Read(matchedFile) # inspect any match in context
253
+ ```
254
+
255
+ If a match is found:
256
+ - Update the design doc's "Approach selected" section to say "extend existing [file/function]" — not "create new".
257
+ - Note the existing file path and line number in the design doc.
258
+
259
+ If no match is found: proceed. The DRY gate is cleared.
260
+
261
+ ### Blast-radius search (mandatory for remove/rename/replace features)
262
+
263
+ If this feature involves **removing**, **renaming**, or **replacing** a concept, tool, or dependency:
264
+
265
+ 1. Grep the ENTIRE codebase for the thing being removed/renamed:
266
+ ```
267
+ Grep("<thing-being-removed>") # exact name
268
+ Grep("<thing-being-removed>", -i) # case-insensitive variant
269
+ Glob("**/*<thing>*") # files named after it
270
+ ```
271
+
272
+ 2. For EVERY match found:
273
+ - Note the file path and line number in the design doc
274
+ - Add a cleanup task to the task list (Phase 3)
275
+ - Flag matches in unexpected packages or config files explicitly
276
+
277
+ 3. Common hiding spots to check:
278
+ - `package.json` (scripts, dependencies, description)
279
+ - `install.sh` / setup scripts
280
+ - CI/CD workflows (`.github/workflows/`)
281
+ - Agent config files (`lib/agents/`, `.cursorrules`, etc.)
282
+ - Documentation (`docs/`, `README.md`, `AGENTS.md`)
283
+ - Import statements and require() calls
284
+
285
+ If no removal/rename is involved, this section is skipped.
286
+
287
+ ### TDD test scenarios
288
+
289
+ Identify at minimum 3 test scenarios:
290
+ - Happy path
291
+ - Error / failure path
292
+ - Edge case from Phase 1
293
+
294
+ Append all research findings to the design doc under a `## Technical Research` section (not a separate file).
295
+
296
+ ---
297
+
298
+ ```
299
+ <HARD-GATE: Phase 2 exit>
300
+ Do NOT begin Phase 3 (setup) until:
301
+ 1. OWASP analysis is documented in design doc
302
+ 2. At least 3 TDD test scenarios are identified
303
+ 3. Approach selection is confirmed (which library/pattern to use)
304
+ 4. If feature involves removal/rename: blast-radius search completed, all references added to task list
305
+ </HARD-GATE>
306
+ ```
307
+
308
+ ---
309
+
310
+ ## Phase 3: Setup + Task List
311
+
312
+ **Goal**: Create branch, worktree, and a complete task list ready for /dev.
313
+
314
+ Record the phase transition before starting setup:
315
+ ```bash
316
+ bash scripts/beads-context.sh stage-transition <id> research setup
317
+ ```
318
+
319
+ ### Step 1: Link child issues to the epic
320
+
321
+ The epic was created in the Entry HARD-GATE (Phase 1 entry). If this feature requires child issues (sub-tasks tracked separately), create them now and link to the epic:
322
+
323
+ ```bash
324
+ bd create --title="<sub-task-name>" --type=feature --parent=<epic-id>
325
+ ```
326
+
327
+ ### Step 2: Branch + worktree
328
+
329
+ **ALWAYS branch from master, never from the current branch.** If the working directory is on any branch other than master, the new feature branch would inherit all unmerged changes from that branch — contaminating the new feature's history.
330
+
331
+ **Note**: If the Entry HARD-GATE already created the branch and worktree (and you are already inside `.worktrees/<slug>`), skip Steps 2b–2d — they are already done.
332
+
333
+ ```bash
334
+ # Step 2a: Check if branch and worktree were already created by Entry HARD-GATE
335
+ CURRENT=$(git branch --show-current)
336
+ if [ "$CURRENT" = "feat/<slug>" ]; then
337
+ echo "✓ Branch feat/<slug> already exists (Entry HARD-GATE created it) — skipping 2b–2d"
338
+ else
339
+ # Step 2b: Verify .worktrees/ is gitignored add if missing
340
+ git check-ignore -v .worktrees/ || echo ".worktrees/" >> .gitignore
341
+
342
+ # Step 2c: Create a Beads-aware worktree rooted on master
343
+ git checkout master
344
+ bd worktree create .worktrees/<slug> --branch feat/<slug>
345
+ cd .worktrees/<slug>
346
+ fi
347
+ ```
348
+
349
+ **Why this matters**: Multiple parallel features or sessions each get their own isolated worktree. Changes to one feature never bleed into another. The main working directory can stay on any branch without affecting new feature branches.
350
+
351
+ ### Step 3: Project setup in worktree
352
+
353
+ Auto-detect and run install:
354
+ ```bash
355
+ # e.g., bun install / npm install / pip install -r requirements.txt
356
+ ```
357
+
358
+ ### Step 4: Baseline test run
359
+
360
+ ```bash
361
+ # Run full test suite in worktree
362
+ bun test # or project test command
363
+ ```
364
+
365
+ If tests fail: report which tests are failing and ask user whether to investigate or proceed anyway. Do not silently proceed past failing baseline tests.
366
+
367
+ ### Step 5: Task list creation
368
+
369
+ Read the design doc. Break implementation into granular tasks.
370
+
371
+ **Task format** (each task MUST have ALL of these):
372
+ ```
373
+ Task N: <descriptive title>
374
+ File(s): <exact file paths>
375
+ What to implement: <complete description — not "add feature X", but what specifically>
376
+ TDD steps:
377
+ 1. Write test: <test file path, what assertion, what input/output>
378
+ 2. Run test: confirm it fails with [specific expected error message]
379
+ 3. Implement: <exact function/class/component to write>
380
+ 4. Run test: confirm it passes
381
+ 5. Commit: `<type>: <message>`
382
+ Expected output: <what running the test/code produces when done>
383
+ ```
384
+
385
+ **Ordering rules**:
386
+ - Foundational/shared modules FIRST (types, utils, constants)
387
+ - Feature logic SECOND
388
+ - Integration/wiring THIRD
389
+ - Uncertain/ambiguous tasks LAST (so they can be deferred if blocked)
390
+
391
+ **YAGNI filter** (after initial task draft, before saving):
392
+
393
+ For each task, confirm it maps to a specific requirement, success criterion, or edge case in the design doc. Run `applyYAGNIFilter({ task, designDoc })` for each task.
394
+
395
+ - Tasks that match keep as-is.
396
+ - Tasks with no anchor → flagged as "potential scope creep". Present flagged tasks to the user: "These tasks have no anchor in the design doc. Keep (specify which requirement it serves) or remove?"
397
+ - If ALL tasks are flagged → return `allFlagged: true` and tell the user: "Design doc doesn't cover all tasks — needs amendment." Do not save the task list until the design doc is updated or tasks are removed.
398
+
399
+ **Before finalizing**: flag any tasks that touch areas not fully specified in the design doc. Present flagged tasks to user for quick clarification before saving.
400
+
401
+ Save to `docs/plans/YYYY-MM-DD-<slug>-tasks.md`.
402
+
403
+ ### Step 5b: Beads context
404
+
405
+ After saving the task list, attach design context and acceptance criteria to the Beads issue so downstream stages (`/dev`, `/validate`, `/review`) can retrieve it without re-reading the design doc.
406
+
407
+ ```bash
408
+ # Link design metadata (task count + task file path) to the Beads issue
409
+ bash scripts/beads-context.sh set-design <id> <task-count> docs/plans/YYYY-MM-DD-<slug>-tasks.md
410
+
411
+ # Record the success criteria from the design doc on the issue
412
+ bash scripts/beads-context.sh set-acceptance <id> "<success-criteria from design doc>"
413
+ ```
414
+
415
+ Both commands must exit with code 0. If either fails, investigate (wrong issue ID? missing script?) before continuing.
416
+
417
+ ### Step 5c: Contract extraction and logic-level dependency review
418
+
419
+ After saving the task list and Beads context, extract and store contract metadata, then run the logic-level Phase 3 dependency review:
420
+
421
+ ```bash
422
+ # Extract contracts — only call store-contracts if extract succeeds (exit 0)
423
+ if bash scripts/dep-guard.sh extract-contracts docs/plans/YYYY-MM-DD-<slug>-tasks.md > /tmp/contracts.txt; then
424
+ bash scripts/dep-guard.sh store-contracts <id> "$(cat /tmp/contracts.txt)"
425
+ else
426
+ echo "No contracts found — skipping store-contracts"
427
+ fi
428
+
429
+ # Re-run ripple check using Beads JSON + logic-level analysis
430
+ bash scripts/dep-guard.sh check-ripple <id>
431
+ ```
432
+
433
+ `extract-contracts` exits 1 when no contracts are found (not an error — just nothing to store). `store-contracts` must exit 0 if called.
434
+
435
+ `check-ripple` is now advisory but logic-aware. It should:
436
+ - read Beads issue data via JSON
437
+ - analyze import/call-chain, contract, and behavioral dependency signals
438
+ - show rubric score, confidence, issue pairs, and proposed dependency updates with pros/cons
439
+ - stop for user approval whenever a dependency mutation is proposed
440
+
441
+ If the user approves a dependency mutation, apply it explicitly:
442
+
443
+ ```bash
444
+ bash scripts/dep-guard.sh apply-decision <id> <dependent-id> <depends-on-id> "<approval rationale>"
445
+ ```
446
+
447
+ That approval step must validate with `bd dep cycles`, show `bd graph`, summarize `bd ready`, and persist the decision via `bd set-state` plus `bd comments`. Beads remains the canonical machine-readable decision record; the plan docs hold only the concise summary.
448
+
449
+ ### Step 6: User review
450
+
451
+ Present the full task list. Allow the user to reorder, split, or remove tasks.
452
+
453
+ ---
454
+
455
+ ```
456
+ <HARD-GATE: /plan exit>
457
+ Do NOT proceed to /dev until ALL are confirmed:
458
+ 1. git branch --show-current output shows feat/<slug>
459
+ 2. git worktree list shows .worktrees/<slug>
460
+ 3. Baseline tests ran — either passing OR user confirmed to proceed past failures
461
+ 4. Beads issue is created with status=in_progress
462
+ 5. Task list exists at docs/plans/YYYY-MM-DD-<slug>-tasks.md
463
+ 6. User has confirmed task list is correct
464
+ 7. `beads-context.sh set-design` ran successfully (exit code 0)
465
+ 8. `beads-context.sh set-acceptance` ran successfully (exit code 0)
466
+ 9. `dep-guard.sh store-contracts` ran successfully (exit code 0)or skipped if no contracts found
467
+ 10. `dep-guard.sh check-ripple` ran successfully and any proposed dependency mutation was reviewed with the user before calling `apply-decision`
468
+ </HARD-GATE>
469
+ ```
470
+
471
+ After all HARD-GATE items pass, record the stage transition on the Beads issue:
472
+
473
+ ```bash
474
+ bash scripts/beads-context.sh stage-transition <id> plan dev
475
+ ```
476
+
477
+ ---
478
+
479
+ ## Example Output (Phase 3 complete)
480
+
481
+ ```
482
+ ✓ Phase 1: Design intent captured
483
+ - Design doc: docs/plans/2026-02-26-stripe-billing-design.md
484
+ - Approach: Stripe SDK v4 (selected over v3)
485
+ - Ambiguity policy: Make conservative choice + document in decisions log
486
+
487
+ ✓ Phase 2: Technical research complete
488
+ - OWASP Top 10: 3 risks identified, 3 mitigations planned
489
+ - TDD scenarios: 5 identified
490
+ - Sources: 8 references
491
+
492
+ ✓ Phase 3: Setup complete
493
+ - Beads: forge-xyz (in_progress)
494
+ - Branch: feat/stripe-billing
495
+ - Worktree: .worktrees/stripe-billing (baseline: 24/24 tests passing)
496
+ - Task list: docs/plans/2026-02-26-stripe-billing-tasks.md (8 tasks)
497
+
498
+ ⏸️ Task list ready for review. Confirm to proceed.
499
+
500
+ After confirming, run: /dev
501
+ ```
502
+
503
+ ## Integration with Workflow
504
+
505
+ ```
506
+ Utility: /status → Understand current context before starting
507
+ Stage 1: /plan → Design intent → research → branch + worktree + task list (you are here)
508
+ Stage 2: /dev → Implement each task with subagent-driven TDD
509
+ Stage 3: /validate → Type check, lint, tests, security — all fresh output
510
+ Stage 4: /ship → Push + create PR
511
+ Stage 5: /review → Address GitHub Actions, Greptile, SonarCloud
512
+ Stage 6: /premerge → Update docs, hand off PR to user
513
+ Stage 7: /verify → Post-merge CI check on main
514
+ ```
515
+
516
+ ## Tips
517
+
518
+ - **Phase 1 quality = /dev autonomy**: Every ambiguity resolved in Phase 1 is a decision gate that won't fire during /dev
519
+ - **One question at a time**: Don't dump all questions at once — dialogue produces better design decisions than a questionnaire
520
+ - **Task granularity**: Target 2-5 minutes per task. If a task takes longer, split it
521
+ - **Uncertain tasks go last**: Anything ambiguous at the end of the task list can be deferred if blocked without stopping other work
522
+ - **Baseline failures matter**: Pre-existing test failures hide regressions. Fix or explicitly document them before /dev starts