@leeovery/claude-technical-workflows 2.1.24 → 2.1.26

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 (48) hide show
  1. package/agents/review-task-verifier.md +22 -10
  2. package/package.json +1 -1
  3. package/skills/link-dependencies/SKILL.md +60 -33
  4. package/skills/start-discussion/references/display-options.md +44 -15
  5. package/skills/start-discussion/references/gather-context-continue.md +2 -0
  6. package/skills/start-discussion/references/gather-context-fresh.md +6 -0
  7. package/skills/start-discussion/references/gather-context-research.md +2 -2
  8. package/skills/start-implementation/SKILL.md +114 -47
  9. package/skills/start-planning/SKILL.md +19 -133
  10. package/skills/start-planning/references/cross-cutting-context.md +50 -0
  11. package/skills/start-planning/references/display-state.md +109 -0
  12. package/skills/start-planning/references/invoke-skill.md +29 -0
  13. package/skills/start-research/references/gather-context.md +4 -4
  14. package/skills/start-review/SKILL.md +14 -123
  15. package/skills/start-review/references/display-plans.md +103 -0
  16. package/skills/start-review/references/invoke-skill.md +32 -0
  17. package/skills/start-review/references/select-plans.md +41 -0
  18. package/skills/start-specification/references/analysis-flow.md +2 -0
  19. package/skills/start-specification/references/confirm-continue.md +21 -1
  20. package/skills/start-specification/references/confirm-create.md +15 -1
  21. package/skills/start-specification/references/confirm-refine.md +9 -1
  22. package/skills/start-specification/references/confirm-unify.md +12 -0
  23. package/skills/start-specification/references/display-analyze.md +21 -2
  24. package/skills/start-specification/references/display-blocks.md +11 -6
  25. package/skills/start-specification/references/display-groupings.md +20 -13
  26. package/skills/start-specification/references/display-single-grouped.md +13 -6
  27. package/skills/start-specification/references/display-single-has-spec.md +15 -7
  28. package/skills/start-specification/references/display-single-no-spec.md +13 -9
  29. package/skills/start-specification/references/display-single.md +0 -2
  30. package/skills/start-specification/references/display-specs-menu.md +21 -6
  31. package/skills/status/SKILL.md +155 -38
  32. package/skills/status/scripts/discovery.sh +420 -0
  33. package/skills/technical-implementation/SKILL.md +14 -6
  34. package/skills/technical-implementation/references/steps/analysis-loop.md +12 -6
  35. package/skills/technical-implementation/references/steps/task-loop.md +12 -6
  36. package/skills/technical-planning/SKILL.md +8 -4
  37. package/skills/technical-planning/references/steps/analyze-task-graph.md +8 -4
  38. package/skills/technical-planning/references/steps/author-tasks.md +4 -2
  39. package/skills/technical-planning/references/steps/define-phases.md +4 -2
  40. package/skills/technical-planning/references/steps/define-tasks.md +4 -2
  41. package/skills/technical-planning/references/steps/plan-construction.md +4 -2
  42. package/skills/technical-planning/references/steps/resolve-dependencies.md +4 -2
  43. package/skills/technical-planning/references/steps/review-integrity.md +4 -2
  44. package/skills/technical-planning/references/steps/review-traceability.md +4 -2
  45. package/skills/technical-research/SKILL.md +4 -2
  46. package/skills/technical-review/references/invoke-task-verifiers.md +37 -47
  47. package/skills/technical-specification/references/specification-guide.md +11 -3
  48. package/skills/view-plan/SKILL.md +3 -1
@@ -0,0 +1,420 @@
1
+ #!/bin/bash
2
+ #
3
+ # Discovers the full workflow state across all phases
4
+ # for the /status command.
5
+ #
6
+ # Outputs structured YAML that the command can consume directly.
7
+ #
8
+
9
+ set -eo pipefail
10
+
11
+ RESEARCH_DIR="docs/workflow/research"
12
+ DISCUSSION_DIR="docs/workflow/discussion"
13
+ SPEC_DIR="docs/workflow/specification"
14
+ PLAN_DIR="docs/workflow/planning"
15
+ IMPL_DIR="docs/workflow/implementation"
16
+
17
+ # Helper: Extract a frontmatter field value from a file
18
+ # Usage: extract_field <file> <field_name>
19
+ extract_field() {
20
+ local file="$1"
21
+ local field="$2"
22
+ local value=""
23
+
24
+ if head -1 "$file" 2>/dev/null | grep -q "^---$"; then
25
+ value=$(sed -n '2,/^---$/p' "$file" 2>/dev/null | \
26
+ grep -i -m1 "^${field}:" | \
27
+ sed -E "s/^${field}:[[:space:]]*//i" || true)
28
+ fi
29
+
30
+ echo "$value"
31
+ }
32
+
33
+ # Helper: Extract frontmatter content (between first pair of --- delimiters)
34
+ extract_frontmatter() {
35
+ local file="$1"
36
+ awk 'BEGIN{c=0} /^---$/{c++; if(c==2) exit; next} c==1{print}' "$file" 2>/dev/null
37
+ }
38
+
39
+ # Helper: Extract sources from specification frontmatter
40
+ # Outputs: name|status per line (object format only; legacy converted by migration 004)
41
+ extract_sources() {
42
+ local file="$1"
43
+ local in_sources=false
44
+ local current_name=""
45
+ local current_status=""
46
+
47
+ while IFS= read -r line; do
48
+ if [[ "$line" =~ ^sources: ]]; then
49
+ in_sources=true
50
+ continue
51
+ fi
52
+
53
+ if $in_sources && [[ "$line" =~ ^[a-z_]+: ]] && [[ ! "$line" =~ ^[[:space:]] ]]; then
54
+ if [ -n "$current_name" ]; then
55
+ echo "${current_name}|${current_status:-incorporated}"
56
+ fi
57
+ break
58
+ fi
59
+
60
+ if $in_sources; then
61
+ if [[ "$line" =~ ^[[:space:]]*-[[:space:]]*name:[[:space:]]*(.+)$ ]]; then
62
+ if [ -n "$current_name" ]; then
63
+ echo "${current_name}|${current_status:-incorporated}"
64
+ fi
65
+ current_name="${BASH_REMATCH[1]}"
66
+ current_name=$(echo "$current_name" | sed 's/^"//' | sed 's/"$//' | xargs)
67
+ current_status=""
68
+ elif [[ "$line" =~ ^[[:space:]]*status:[[:space:]]*(.+)$ ]]; then
69
+ current_status="${BASH_REMATCH[1]}"
70
+ current_status=$(echo "$current_status" | sed 's/^"//' | sed 's/"$//' | xargs)
71
+ fi
72
+ fi
73
+ done < <(extract_frontmatter "$file")
74
+
75
+ if [ -n "$current_name" ]; then
76
+ echo "${current_name}|${current_status:-incorporated}"
77
+ fi
78
+ }
79
+
80
+ # Helper: Extract external_dependencies from plan frontmatter
81
+ # Outputs: topic|state|task_id per line
82
+ extract_external_deps() {
83
+ local file="$1"
84
+ local frontmatter
85
+ frontmatter=$(extract_frontmatter "$file")
86
+
87
+ if ! echo "$frontmatter" | grep -q "^external_dependencies:" 2>/dev/null; then
88
+ return 0
89
+ fi
90
+
91
+ if echo "$frontmatter" | grep -q "^external_dependencies:[[:space:]]*\[\]" 2>/dev/null; then
92
+ return 0
93
+ fi
94
+
95
+ echo "$frontmatter" | awk '
96
+ /^external_dependencies:/ { in_block=1; next }
97
+ in_block && /^[a-z_]+:/ && !/^[[:space:]]/ { exit }
98
+ in_block && /^[[:space:]]*- topic:/ {
99
+ if (topic != "") print topic "|" state "|" task_id
100
+ line=$0; gsub(/^[[:space:]]*- topic:[[:space:]]*/, "", line)
101
+ topic=line; state=""; task_id=""
102
+ next
103
+ }
104
+ in_block && /^[[:space:]]*state:/ {
105
+ line=$0; gsub(/^[[:space:]]*state:[[:space:]]*/, "", line)
106
+ state=line; next
107
+ }
108
+ in_block && /^[[:space:]]*task_id:/ {
109
+ line=$0; gsub(/^[[:space:]]*task_id:[[:space:]]*/, "", line)
110
+ task_id=line; next
111
+ }
112
+ END { if (topic != "") print topic "|" state "|" task_id }
113
+ '
114
+ }
115
+
116
+ # Helper: Count completed tasks from implementation tracking
117
+ count_completed_tasks() {
118
+ local file="$1"
119
+ local frontmatter
120
+ frontmatter=$(extract_frontmatter "$file")
121
+
122
+ if echo "$frontmatter" | grep -q "^completed_tasks:[[:space:]]*\[\]" 2>/dev/null; then
123
+ echo 0
124
+ return
125
+ fi
126
+
127
+ local count
128
+ count=$(echo "$frontmatter" | awk '
129
+ /^completed_tasks:/ { in_block=1; next }
130
+ in_block && /^[a-z_]+:/ { exit }
131
+ in_block && /^[[:space:]]*-[[:space:]]/ { c++ }
132
+ END { print c+0 }
133
+ ')
134
+ echo "$count"
135
+ }
136
+
137
+ # Helper: Count completed phases from implementation tracking
138
+ count_completed_phases() {
139
+ local file="$1"
140
+ local frontmatter
141
+ frontmatter=$(extract_frontmatter "$file")
142
+
143
+ # Handle inline array format: [1, 2, 3]
144
+ local inline
145
+ inline=$(echo "$frontmatter" | grep "^completed_phases:" | sed 's/^completed_phases:[[:space:]]*//' || true)
146
+ if echo "$inline" | grep -q '^\['; then
147
+ local items
148
+ items=$(echo "$inline" | tr -d '[]' | tr ',' '\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | grep -v '^$')
149
+ if [ -n "$items" ]; then
150
+ echo "$items" | wc -l | tr -d ' '
151
+ else
152
+ echo 0
153
+ fi
154
+ return
155
+ fi
156
+
157
+ if echo "$frontmatter" | grep -q "^completed_phases:[[:space:]]*\[\]" 2>/dev/null; then
158
+ echo 0
159
+ return
160
+ fi
161
+
162
+ local count
163
+ count=$(echo "$frontmatter" | awk '
164
+ /^completed_phases:/ { in_block=1; next }
165
+ in_block && /^[a-z_]+:/ { exit }
166
+ in_block && /^[[:space:]]*-[[:space:]]/ { c++ }
167
+ END { print c+0 }
168
+ ')
169
+ echo "$count"
170
+ }
171
+
172
+
173
+ # Start YAML output
174
+ echo "# Workflow Status Discovery"
175
+ echo "# Generated: $(date -Iseconds)"
176
+ echo ""
177
+
178
+ #
179
+ # RESEARCH
180
+ #
181
+ echo "research:"
182
+
183
+ research_count=0
184
+ if [ -d "$RESEARCH_DIR" ] && [ -n "$(ls -A "$RESEARCH_DIR" 2>/dev/null)" ]; then
185
+ echo " exists: true"
186
+ echo " files:"
187
+ for file in "$RESEARCH_DIR"/*; do
188
+ [ -f "$file" ] || continue
189
+ name=$(basename "$file" .md)
190
+ echo " - \"$name\""
191
+ research_count=$((research_count + 1))
192
+ done
193
+ echo " count: $research_count"
194
+ else
195
+ echo " exists: false"
196
+ echo " files: []"
197
+ echo " count: 0"
198
+ fi
199
+
200
+ echo ""
201
+
202
+ #
203
+ # DISCUSSIONS
204
+ #
205
+ echo "discussions:"
206
+
207
+ disc_count=0
208
+ disc_concluded=0
209
+ disc_in_progress=0
210
+
211
+ if [ -d "$DISCUSSION_DIR" ] && [ -n "$(ls -A "$DISCUSSION_DIR" 2>/dev/null)" ]; then
212
+ echo " exists: true"
213
+ echo " files:"
214
+ for file in "$DISCUSSION_DIR"/*.md; do
215
+ [ -f "$file" ] || continue
216
+ name=$(basename "$file" .md)
217
+ status=$(extract_field "$file" "status")
218
+ status=${status:-"unknown"}
219
+
220
+ echo " - name: \"$name\""
221
+ echo " status: \"$status\""
222
+
223
+ disc_count=$((disc_count + 1))
224
+ [ "$status" = "concluded" ] && disc_concluded=$((disc_concluded + 1))
225
+ [ "$status" = "in-progress" ] && disc_in_progress=$((disc_in_progress + 1))
226
+ done
227
+ echo " count: $disc_count"
228
+ echo " concluded: $disc_concluded"
229
+ echo " in_progress: $disc_in_progress"
230
+ else
231
+ echo " exists: false"
232
+ echo " files: []"
233
+ echo " count: 0"
234
+ echo " concluded: 0"
235
+ echo " in_progress: 0"
236
+ fi
237
+
238
+ echo ""
239
+
240
+ #
241
+ # SPECIFICATIONS
242
+ #
243
+ echo "specifications:"
244
+
245
+ spec_count=0
246
+ spec_active=0
247
+ spec_superseded=0
248
+ spec_feature=0
249
+ spec_crosscutting=0
250
+
251
+ if [ -d "$SPEC_DIR" ] && [ -n "$(ls -A "$SPEC_DIR" 2>/dev/null)" ]; then
252
+ echo " exists: true"
253
+ echo " files:"
254
+ for file in "$SPEC_DIR"/*.md; do
255
+ [ -f "$file" ] || continue
256
+ name=$(basename "$file" .md)
257
+ status=$(extract_field "$file" "status")
258
+ status=${status:-"in-progress"}
259
+ spec_type=$(extract_field "$file" "type")
260
+ spec_type=${spec_type:-"feature"}
261
+ superseded_by=$(extract_field "$file" "superseded_by")
262
+
263
+ echo " - name: \"$name\""
264
+ echo " status: \"$status\""
265
+ echo " type: \"$spec_type\""
266
+ [ -n "$superseded_by" ] && echo " superseded_by: \"$superseded_by\""
267
+
268
+ # Sources
269
+ sources_output=$(extract_sources "$file")
270
+ if [ -n "$sources_output" ]; then
271
+ echo " sources:"
272
+ while IFS='|' read -r src_name src_status; do
273
+ [ -z "$src_name" ] && continue
274
+ echo " - name: \"$src_name\""
275
+ echo " status: \"$src_status\""
276
+ done <<< "$sources_output"
277
+ else
278
+ echo " sources: []"
279
+ fi
280
+
281
+ spec_count=$((spec_count + 1))
282
+ if [ "$status" = "superseded" ]; then
283
+ spec_superseded=$((spec_superseded + 1))
284
+ else
285
+ spec_active=$((spec_active + 1))
286
+ [ "$spec_type" = "cross-cutting" ] && spec_crosscutting=$((spec_crosscutting + 1))
287
+ [ "$spec_type" != "cross-cutting" ] && spec_feature=$((spec_feature + 1))
288
+ fi
289
+ done
290
+ echo " count: $spec_count"
291
+ echo " active: $spec_active"
292
+ echo " superseded: $spec_superseded"
293
+ echo " feature: $spec_feature"
294
+ echo " crosscutting: $spec_crosscutting"
295
+ else
296
+ echo " exists: false"
297
+ echo " files: []"
298
+ echo " count: 0"
299
+ echo " active: 0"
300
+ echo " superseded: 0"
301
+ echo " feature: 0"
302
+ echo " crosscutting: 0"
303
+ fi
304
+
305
+ echo ""
306
+
307
+ #
308
+ # PLANS
309
+ #
310
+ echo "plans:"
311
+
312
+ plan_count=0
313
+ plan_concluded=0
314
+ plan_in_progress=0
315
+
316
+ if [ -d "$PLAN_DIR" ] && [ -n "$(ls -A "$PLAN_DIR" 2>/dev/null)" ]; then
317
+ echo " exists: true"
318
+ echo " files:"
319
+ for file in "$PLAN_DIR"/*.md; do
320
+ [ -f "$file" ] || continue
321
+ name=$(basename "$file" .md)
322
+ status=$(extract_field "$file" "status")
323
+ status=${status:-"unknown"}
324
+ format=$(extract_field "$file" "format")
325
+ format=${format:-"unknown"}
326
+ specification=$(extract_field "$file" "specification")
327
+ specification=${specification:-"${name}.md"}
328
+
329
+ echo " - name: \"$name\""
330
+ echo " status: \"$status\""
331
+ echo " format: \"$format\""
332
+ echo " specification: \"$specification\""
333
+
334
+ # External dependencies
335
+ deps_output=$(extract_external_deps "$file")
336
+ has_unresolved="false"
337
+ if [ -n "$deps_output" ]; then
338
+ echo " external_deps:"
339
+ while IFS='|' read -r dep_topic dep_state dep_task_id; do
340
+ [ -z "$dep_topic" ] && continue
341
+ echo " - topic: \"$dep_topic\""
342
+ echo " state: \"$dep_state\""
343
+ [ -n "$dep_task_id" ] && echo " task_id: \"$dep_task_id\""
344
+ [ "$dep_state" = "unresolved" ] && has_unresolved="true"
345
+ done <<< "$deps_output"
346
+ else
347
+ echo " external_deps: []"
348
+ fi
349
+ echo " has_unresolved_deps: $has_unresolved"
350
+
351
+ plan_count=$((plan_count + 1))
352
+ [ "$status" = "concluded" ] && plan_concluded=$((plan_concluded + 1))
353
+ { [ "$status" = "planning" ] || [ "$status" = "in-progress" ]; } && plan_in_progress=$((plan_in_progress + 1))
354
+ done
355
+ echo " count: $plan_count"
356
+ echo " concluded: $plan_concluded"
357
+ echo " in_progress: $plan_in_progress"
358
+ else
359
+ echo " exists: false"
360
+ echo " files: []"
361
+ echo " count: 0"
362
+ echo " concluded: 0"
363
+ echo " in_progress: 0"
364
+ fi
365
+
366
+ echo ""
367
+
368
+ #
369
+ # IMPLEMENTATION
370
+ #
371
+ echo "implementation:"
372
+
373
+ impl_count=0
374
+ impl_completed=0
375
+ impl_in_progress=0
376
+
377
+ if [ -d "$IMPL_DIR" ] && [ -n "$(ls -A "$IMPL_DIR" 2>/dev/null)" ]; then
378
+ echo " exists: true"
379
+ echo " files:"
380
+ for file in "$IMPL_DIR"/*/tracking.md; do
381
+ [ -f "$file" ] || continue
382
+ topic=$(basename "$(dirname "$file")")
383
+ status=$(extract_field "$file" "status")
384
+ status=${status:-"unknown"}
385
+ current_phase=$(extract_field "$file" "current_phase")
386
+
387
+ completed_tasks=$(count_completed_tasks "$file")
388
+ completed_phases=$(count_completed_phases "$file")
389
+
390
+ # Count total tasks from plan directory (local-markdown format)
391
+ total_tasks=0
392
+ plan_file="$PLAN_DIR/${topic}.md"
393
+ if [ -f "$plan_file" ]; then
394
+ plan_format=$(extract_field "$plan_file" "format")
395
+ if [ "$plan_format" = "local-markdown" ] && [ -d "$PLAN_DIR/${topic}" ]; then
396
+ total_tasks=$(ls -1 "$PLAN_DIR/${topic}/"*.md 2>/dev/null | wc -l | tr -d ' ')
397
+ fi
398
+ fi
399
+
400
+ echo " - topic: \"$topic\""
401
+ echo " status: \"$status\""
402
+ [ -n "$current_phase" ] && [ "$current_phase" != "~" ] && echo " current_phase: $current_phase"
403
+ echo " completed_tasks: $completed_tasks"
404
+ echo " completed_phases: $completed_phases"
405
+ echo " total_tasks: $total_tasks"
406
+
407
+ impl_count=$((impl_count + 1))
408
+ [ "$status" = "completed" ] && impl_completed=$((impl_completed + 1))
409
+ [ "$status" = "in-progress" ] && impl_in_progress=$((impl_in_progress + 1))
410
+ done
411
+ echo " count: $impl_count"
412
+ echo " completed: $impl_completed"
413
+ echo " in_progress: $impl_in_progress"
414
+ else
415
+ echo " exists: false"
416
+ echo " files: []"
417
+ echo " count: 0"
418
+ echo " completed: 0"
419
+ echo " in_progress: 0"
420
+ fi
@@ -166,6 +166,9 @@ Commit: `impl({topic}): start implementation`
166
166
 
167
167
  Present the existing configuration for confirmation:
168
168
 
169
+ > *Output the next fenced block as markdown (not a code block):*
170
+
171
+ ```
169
172
  Previous session used these project skills:
170
173
  - `{skill-name}` — {path}
171
174
  - ...
@@ -174,8 +177,7 @@ Previous session used these project skills:
174
177
  - **`y`/`yes`** — Keep these, proceed
175
178
  - **`c`/`change`** — Re-discover and choose skills
176
179
  · · · · · · · · · · · ·
177
-
178
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
180
+ ```
179
181
 
180
182
  **STOP.** Wait for user choice.
181
183
 
@@ -184,6 +186,8 @@ Previous session used these project skills:
184
186
 
185
187
  #### If `.claude/skills/` does not exist or is empty
186
188
 
189
+ > *Output the next fenced block as a code block:*
190
+
187
191
  ```
188
192
  No project skills found. Proceeding without project-specific conventions.
189
193
  ```
@@ -194,6 +198,9 @@ No project skills found. Proceeding without project-specific conventions.
194
198
 
195
199
  Scan `.claude/skills/` for project-specific skill directories. Present findings:
196
200
 
201
+ > *Output the next fenced block as markdown (not a code block):*
202
+
203
+ ```
197
204
  Found these project skills that may be relevant to implementation:
198
205
  - `{skill-name}` — {brief description}
199
206
  - `{skill-name}` — {brief description}
@@ -204,8 +211,7 @@ Found these project skills that may be relevant to implementation:
204
211
  - **`n`/`none`** — Skip project skills
205
212
  - **Or list the ones you want** — e.g. "golang-pro, react-patterns"
206
213
  · · · · · · · · · · · ·
207
-
208
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
214
+ ```
209
215
 
210
216
  **STOP.** Wait for user to confirm which skills are relevant.
211
217
 
@@ -223,6 +229,9 @@ If `linters` is already populated in the tracking file, present the existing con
223
229
 
224
230
  Otherwise, present discovery findings to the user:
225
231
 
232
+ > *Output the next fenced block as markdown (not a code block):*
233
+
234
+ ```
226
235
  **Linter discovery:**
227
236
  - {tool} — `{command}` (installed / not installed)
228
237
  - ...
@@ -234,8 +243,7 @@ Recommendations: {any suggested tools with install commands}
234
243
  - **`c`/`change`** — Modify the linter list
235
244
  - **`s`/`skip`** — Skip linter setup (no linting during TDD)
236
245
  · · · · · · · · · · · ·
237
-
238
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
246
+ ```
239
247
 
240
248
  **STOP.** Wait for user choice.
241
249
 
@@ -32,12 +32,14 @@ If `analysis_cycle > 3`:
32
32
 
33
33
  Analysis has run {N-1} times so far. You can continue (recommended if issues were still found last cycle) or skip to completion.
34
34
 
35
+ > *Output the next fenced block as markdown (not a code block):*
36
+
37
+ ```
35
38
  · · · · · · · · · · · ·
36
39
  - **`p`/`proceed`** — Continue analysis *(default)*
37
40
  - **`s`/`skip`** — Skip analysis, proceed to completion
38
41
  · · · · · · · · · · · ·
39
-
40
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
42
+ ```
41
43
 
42
44
  **STOP.** Wait for user choice. You MUST NOT choose on the user's behalf.
43
45
 
@@ -61,13 +63,15 @@ If there are unstaged changes or untracked files, categorize them:
61
63
  - `{file}` ({status: modified/untracked})
62
64
  - ...
63
65
 
66
+ > *Output the next fenced block as markdown (not a code block):*
67
+
68
+ ```
64
69
  · · · · · · · · · · · ·
65
70
  - **`y`/`yes`** — Include all in the checkpoint commit
66
71
  - **`s`/`skip`** — Exclude unexpected files, commit only implementation files
67
72
  - **Comment** — Specify which to include
68
73
  · · · · · · · · · · · ·
69
-
70
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
74
+ ```
71
75
 
72
76
  **STOP.** Wait for user choice.
73
77
 
@@ -145,13 +149,15 @@ Sources: {sources}
145
149
  **Tests**:
146
150
  {tests}
147
151
 
152
+ > *Output the next fenced block as markdown (not a code block):*
153
+
154
+ ```
148
155
  · · · · · · · · · · · ·
149
156
  - **`a`/`approve`** — Approve this task
150
157
  - **`s`/`skip`** — Skip this task
151
158
  - **Comment** — Revise based on feedback
152
159
  · · · · · · · · · · · ·
153
-
154
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
160
+ ```
155
161
 
156
162
  **STOP.** Wait for user input.
157
163
 
@@ -44,13 +44,15 @@ Present the executor's ISSUES to the user:
44
44
 
45
45
  {executor's ISSUES content}
46
46
 
47
+ > *Output the next fenced block as markdown (not a code block):*
48
+
49
+ ```
47
50
  · · · · · · · · · · · ·
48
51
  - **`r`/`retry`** — Re-invoke the executor with your comments (provide below)
49
52
  - **`s`/`skip`** — Skip this task and move to the next
50
53
  - **`t`/`stop`** — Stop implementation entirely
51
54
  · · · · · · · · · · · ·
52
-
53
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
55
+ ```
54
56
 
55
57
  **STOP.** Wait for user choice.
56
58
 
@@ -103,14 +105,16 @@ Present the reviewer's findings and fix analysis to the user:
103
105
  Notes (non-blocking):
104
106
  {NOTES from reviewer}
105
107
 
108
+ > *Output the next fenced block as markdown (not a code block):*
109
+
110
+ ```
106
111
  · · · · · · · · · · · ·
107
112
  - **`y`/`yes`** — Accept the review and fix analysis, pass to executor
108
113
  - **`a`/`auto`** — Accept and auto-approve future fix analyses
109
114
  - **`s`/`skip`** — Override the reviewer and proceed as-is
110
115
  - **Comment** — Any commentary, adjustments, alternative approaches, or questions before passing to executor
111
116
  · · · · · · · · · · · ·
112
-
113
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
117
+ ```
114
118
 
115
119
  **STOP.** Wait for user choice.
116
120
 
@@ -134,14 +138,16 @@ Present a summary and wait for user input:
134
138
  Phase: {phase number} — {phase name}
135
139
  {executor's SUMMARY — brief commentary, decisions, implementation notes}
136
140
 
141
+ > *Output the next fenced block as markdown (not a code block):*
142
+
143
+ ```
137
144
  · · · · · · · · · · · ·
138
145
  **Options:**
139
146
  - **`y`/`yes`** — Approve, commit, continue to next task
140
147
  - **`a`/`auto`** — Approve this and all future reviewer-approved tasks automatically
141
148
  - **Comment** — Feedback the reviewer missed (triggers a fix round)
142
149
  · · · · · · · · · · · ·
143
-
144
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
150
+ ```
145
151
 
146
152
  **STOP.** Wait for user input.
147
153
 
@@ -84,12 +84,14 @@ Found existing plan for **{topic}** (previously reached phase {N}, task {M}).
84
84
 
85
85
  {spec change summary from spec-change-detection.md}
86
86
 
87
+ > *Output the next fenced block as markdown (not a code block):*
88
+
89
+ ```
87
90
  · · · · · · · · · · · ·
88
91
  - **`c`/`continue`** — Walk through the plan from the start. You can review, amend, or navigate at any point — including straight to the leading edge.
89
92
  - **`r`/`restart`** — Erase all planning work for this topic and start fresh. This deletes the Plan Index File and any Authored Tasks. Other topics are unaffected.
90
93
  · · · · · · · · · · · ·
91
-
92
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
94
+ ```
93
95
 
94
96
  **STOP.** Wait for user response.
95
97
 
@@ -128,12 +130,14 @@ Present the recommendation:
128
130
 
129
131
  Existing plans use **{format}**. Use the same format for consistency?
130
132
 
133
+ > *Output the next fenced block as markdown (not a code block):*
134
+
135
+ ```
131
136
  · · · · · · · · · · · ·
132
137
  - **`y`/`yes`** — Use {format}
133
138
  - **`n`/`no`** — See all available formats
134
139
  · · · · · · · · · · · ·
135
-
136
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
140
+ ```
137
141
 
138
142
  **STOP.** Wait for user choice. If declined, fall through to the full list below.
139
143
 
@@ -38,13 +38,15 @@ The natural task order is already correct. Present as rendered markdown (not in
38
38
 
39
39
  {notes from agent output}"
40
40
 
41
+ > *Output the next fenced block as markdown (not a code block):*
42
+
43
+ ```
41
44
  · · · · · · · · · · · ·
42
45
  **To proceed:**
43
46
  - **`y`/`yes`** — Confirmed.
44
47
  - **Or tell me what to change.**
45
48
  · · · · · · · · · · · ·
46
-
47
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
49
+ ```
48
50
 
49
51
  **STOP.** Wait for the user's response.
50
52
 
@@ -74,13 +76,15 @@ Dependencies and priorities have already been written to the task files. Present
74
76
 
75
77
  {any notes from agent output}"
76
78
 
79
+ > *Output the next fenced block as markdown (not a code block):*
80
+
81
+ ```
77
82
  · · · · · · · · · · · ·
78
83
  **To proceed:**
79
84
  - **`y`/`yes`** — Approved.
80
85
  - **Or tell me what to change.**
81
86
  · · · · · · · · · · · ·
82
-
83
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
87
+ ```
84
88
 
85
89
  **STOP.** Wait for the user's response.
86
90
 
@@ -31,14 +31,16 @@ After presenting, ask:
31
31
 
32
32
  **Task {M} of {total}: {Task Name}**
33
33
 
34
+ > *Output the next fenced block as markdown (not a code block):*
35
+
36
+ ```
34
37
  · · · · · · · · · · · ·
35
38
  **To proceed:**
36
39
  - **`y`/`yes`** — Approved. I'll log it to the plan.
37
40
  - **Or tell me what to change.**
38
41
  - **Or navigate** — a different phase or task, or the leading edge.
39
42
  · · · · · · · · · · · ·
40
-
41
- **Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
43
+ ```
42
44
 
43
45
  **STOP.** Wait for the user's response.
44
46