@leeovery/claude-technical-workflows 2.1.16 → 2.1.18

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 (28) hide show
  1. package/agents/implementation-analysis-architecture.md +2 -0
  2. package/agents/implementation-task-reviewer.md +4 -1
  3. package/package.json +1 -1
  4. package/skills/link-dependencies/SKILL.md +2 -2
  5. package/skills/start-discussion/SKILL.md +6 -6
  6. package/skills/start-implementation/SKILL.md +3 -4
  7. package/skills/start-planning/SKILL.md +3 -4
  8. package/skills/start-research/SKILL.md +13 -88
  9. package/skills/start-research/references/gather-context.md +68 -0
  10. package/skills/start-research/references/invoke-skill.md +23 -0
  11. package/skills/start-review/SKILL.md +3 -4
  12. package/skills/start-specification/SKILL.md +20 -20
  13. package/skills/technical-implementation/SKILL.md +15 -7
  14. package/skills/technical-implementation/references/code-quality.md +9 -1
  15. package/skills/technical-implementation/references/steps/analysis-loop.md +6 -6
  16. package/skills/technical-implementation/references/steps/task-loop.md +6 -6
  17. package/skills/technical-implementation/references/tdd-workflow.md +3 -1
  18. package/skills/technical-planning/SKILL.md +12 -8
  19. package/skills/technical-planning/references/steps/analyze-task-graph.md +4 -4
  20. package/skills/technical-planning/references/steps/author-tasks.md +2 -2
  21. package/skills/technical-planning/references/steps/define-phases.md +2 -2
  22. package/skills/technical-planning/references/steps/define-tasks.md +2 -2
  23. package/skills/technical-planning/references/steps/plan-construction.md +2 -2
  24. package/skills/technical-planning/references/steps/resolve-dependencies.md +2 -2
  25. package/skills/technical-planning/references/steps/review-integrity.md +2 -2
  26. package/skills/technical-planning/references/steps/review-traceability.md +2 -2
  27. package/skills/technical-research/SKILL.md +2 -2
  28. package/skills/technical-specification/references/specification-guide.md +6 -6
@@ -27,6 +27,8 @@ You receive via the orchestrator's prompt:
27
27
  - Integration test gaps — are cross-task workflows tested end-to-end?
28
28
  - Seam quality between task boundaries — do the pieces fit together cleanly?
29
29
  - Over/under-engineering — are abstractions justified by usage? Is raw code crying out for structure?
30
+ - Missed composition opportunities — are new abstractions independently implemented when they could be derived from existing ones? If two queries are logical inverses, one should be defined in terms of the other.
31
+ - Type safety at boundaries — are interfaces or function signatures using untyped parameters when the concrete types are known? Runtime type checks inside implementations signal the signature should be more specific.
30
32
 
31
33
  ## Your Process
32
34
 
@@ -42,10 +42,12 @@ Are all criteria genuinely met — not just self-reported?
42
42
  - Check for criteria that are technically met but miss the intent
43
43
 
44
44
  ### 3. Test Adequacy
45
- Do tests actually verify the criteria? Are edge cases covered?
45
+ Do tests actually verify the criteria? Are assertions precise? Are edge cases covered?
46
46
  - Is there a test for each acceptance criterion?
47
47
  - Would the tests fail if the feature broke?
48
48
  - Are edge cases from the task's test cases covered?
49
+ - **Assertion depth**: For mutation operations, do tests verify observable side effects — not just that the operation returned success? State changes should be asserted independently.
50
+ - **Assertion precision**: When expected output is deterministic, do tests use exact comparison? Substring or partial matching masks formatting regressions and missing/extra content.
49
51
  - Flag both under-testing AND over-testing
50
52
 
51
53
  ### 4. Convention Adherence
@@ -61,6 +63,7 @@ Is this a sound design decision? Will it compose well with future tasks?
61
63
  - Are there coupling or abstraction concerns?
62
64
  - Will this cause problems for subsequent tasks in the phase?
63
65
  - Are there structural concerns that should be raised now rather than compounding?
66
+ - Are concrete types used where data structures are known? Flag untyped escape hatches used where concrete types would be clearer and safer.
64
67
 
65
68
  ## Fix Recommendations (needs-changes only)
66
69
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leeovery/claude-technical-workflows",
3
- "version": "2.1.16",
3
+ "version": "2.1.18",
4
4
  "description": "Technical workflow skills & commands for Claude Code",
5
5
  "license": "MIT",
6
6
  "author": "Lee Overy <me@leeovery.com>",
@@ -161,11 +161,11 @@ UPDATED FILES:
161
161
  If any files were updated:
162
162
 
163
163
  ```
164
- · · ·
165
-
164
+ · · · · · · · · · · · ·
166
165
  Shall I commit these dependency updates?
167
166
  - **`y`/`yes`** — Commit the changes
168
167
  - **`n`/`no`** — Skip
168
+ · · · · · · · · · · · ·
169
169
  ```
170
170
 
171
171
  If yes, commit with message:
@@ -228,35 +228,35 @@ Discussions:
228
228
 
229
229
  **If research AND discussions exist:**
230
230
  ```
231
- · · ·
232
-
231
+ · · · · · · · · · · · ·
233
232
  How would you like to proceed?
234
233
 
235
234
  - **`r`/`refresh`** — Force fresh research analysis
236
235
  - From research — pick a topic number above (e.g., "1" or "research 1")
237
236
  - Continue discussion — name one above (e.g., "continue {topic}")
238
237
  - Fresh topic — describe what you want to discuss
238
+ · · · · · · · · · · · ·
239
239
  ```
240
240
 
241
241
  **If ONLY research exists:**
242
242
  ```
243
- · · ·
244
-
243
+ · · · · · · · · · · · ·
245
244
  How would you like to proceed?
246
245
 
247
246
  - **`r`/`refresh`** — Force fresh research analysis
248
247
  - From research — pick a topic number above (e.g., "1" or "research 1")
249
248
  - Fresh topic — describe what you want to discuss
249
+ · · · · · · · · · · · ·
250
250
  ```
251
251
 
252
252
  **If ONLY discussions exist:**
253
253
  ```
254
- · · ·
255
-
254
+ · · · · · · · · · · · ·
256
255
  How would you like to proceed?
257
256
 
258
257
  - Continue discussion — name one above (e.g., "continue {topic}")
259
258
  - Fresh topic — describe what you want to discuss
259
+ · · · · · · · · · · · ·
260
260
  ```
261
261
 
262
262
  **STOP.** Wait for user response before proceeding.
@@ -210,8 +210,7 @@ Then re-run /start-implementation.
210
210
 
211
211
  **Otherwise (multiple selectable plans, or implemented plans exist):**
212
212
  ```
213
- · · ·
214
-
213
+ · · · · · · · · · · · ·
215
214
  Select a plan (enter number):
216
215
  ```
217
216
 
@@ -260,11 +259,11 @@ INCOMPLETE (planned but not implemented):
260
259
  - {topic}: task {task_id} not yet completed
261
260
  -> This task must be completed first.
262
261
 
263
- · · ·
264
-
262
+ · · · · · · · · · · · ·
265
263
  - **`i`/`implement`** — Implement the blocking dependencies first
266
264
  - **`l`/`link`** — Run /link-dependencies to wire up recently completed plans
267
265
  - Mark as "satisfied externally" — tell me which dependency was implemented outside this workflow
266
+ · · · · · · · · · · · ·
268
267
  ```
269
268
 
270
269
  **STOP.** Wait for user response.
@@ -155,8 +155,7 @@ Omit either section entirely if it has no entries.
155
155
 
156
156
  **If multiple actionable items:**
157
157
  ```
158
- · · ·
159
-
158
+ · · · · · · · · · · · ·
160
159
  Select a specification (enter number):
161
160
  ```
162
161
 
@@ -232,10 +231,10 @@ Note: The following cross-cutting specifications are still in-progress:
232
231
 
233
232
  These may contain architectural decisions relevant to this plan.
234
233
 
235
- · · ·
236
-
234
+ · · · · · · · · · · · ·
237
235
  - **`c`/`continue`** — Plan without them
238
236
  - **`s`/`stop`** — Complete them first (/start-specification)
237
+ · · · · · · · · · · · ·
239
238
  ```
240
239
 
241
240
  **STOP.** Wait for user response.
@@ -10,14 +10,14 @@ Invoke the **technical-research** skill for this conversation.
10
10
 
11
11
  This is **Phase 1** of the six-phase workflow:
12
12
 
13
- | Phase | Focus | You |
14
- |-------|-------|-----|
15
- | **1. Research** | EXPLORE - ideas, feasibility, market, business | ◀ HERE |
16
- | 2. Discussion | WHAT and WHY - decisions, architecture, edge cases | |
17
- | 3. Specification | REFINE - validate into standalone spec | |
18
- | 4. Planning | HOW - phases, tasks, acceptance criteria | |
19
- | 5. Implementation | DOING - tests first, then code | |
20
- | 6. Review | VALIDATING - check work against artifacts | |
13
+ | Phase | Focus | You |
14
+ |-------------------|----------------------------------------------------|--------|
15
+ | **1. Research** | EXPLORE - ideas, feasibility, market, business | ◀ HERE |
16
+ | 2. Discussion | WHAT and WHY - decisions, architecture, edge cases | |
17
+ | 3. Specification | REFINE - validate into standalone spec | |
18
+ | 4. Planning | HOW - phases, tasks, acceptance criteria | |
19
+ | 5. Implementation | DOING - tests first, then code | |
20
+ | 6. Review | VALIDATING - check work against artifacts | |
21
21
 
22
22
  **Stay in your lane**: Explore freely. This is the time for broad thinking, feasibility checks, and learning. Surface options and tradeoffs — don't make decisions. When a topic converges toward a conclusion, that's a signal it's ready for discussion phase, not a cue to start deciding. Park it and move on.
23
23
 
@@ -43,95 +43,20 @@ Follow these steps EXACTLY as written. Do not skip steps or combine them. Presen
43
43
 
44
44
  Invoke the `/migrate` skill and assess its output.
45
45
 
46
- **If files were updated**: STOP and wait for the user to review the changes (e.g., via `git diff`) and confirm before proceeding to Step 1. Do not continue automatically.
46
+ **If files were updated**: STOP and wait for the user to review the changes (e.g., via `git diff`) and confirm before proceeding to Step 1.
47
47
 
48
48
  **If no updates needed**: Proceed to Step 1.
49
49
 
50
50
  ---
51
51
 
52
- ## Step 1: Get the Seed Idea
52
+ ## Step 1: Gather Context
53
53
 
54
- Ask:
55
-
56
- ```
57
- What's on your mind?
58
-
59
- - What idea or topic do you want to explore?
60
- - What prompted this - a problem, opportunity, curiosity?
61
- ```
62
-
63
- **STOP.** Wait for user response before proceeding.
54
+ Load **[gather-context.md](references/gather-context.md)** and follow its instructions as written.
64
55
 
65
56
  → Proceed to **Step 2**.
66
57
 
67
58
  ---
68
59
 
69
- ## Step 2: Understand Current Knowledge
70
-
71
- Ask:
72
-
73
- ```
74
- What do you already know?
75
-
76
- - Any initial thoughts or research you've done?
77
- - Constraints or context I should be aware of?
78
- ```
79
-
80
- **STOP.** Wait for user response before proceeding.
81
-
82
- → Proceed to **Step 3**.
83
-
84
- ---
85
-
86
- ## Step 3: Determine Starting Point
87
-
88
- Ask:
89
-
90
- ```
91
- Where should we start?
92
-
93
- - Technical feasibility? Market landscape? Business model?
94
- - Or just talk it through and see where it goes?
95
- ```
96
-
97
- **STOP.** Wait for user response before proceeding.
98
-
99
- → Proceed to **Step 4**.
100
-
101
- ---
102
-
103
- ## Step 4: Gather Final Context
104
-
105
- Ask:
106
-
107
- ```
108
- Any constraints or context I should know about upfront?
109
-
110
- (Or "none" if we're starting fresh)
111
- ```
112
-
113
- **STOP.** Wait for user response before proceeding.
114
-
115
- → Proceed to **Step 5**.
116
-
117
- ---
118
-
119
- ## Step 5: Invoke the Skill
120
-
121
- After completing the steps above, this skill's purpose is fulfilled.
122
-
123
- Invoke the [technical-research](../technical-research/SKILL.md) skill for your next instructions. Do not act on the gathered information until the skill is loaded - it contains the instructions for how to proceed.
124
-
125
- **Example handoff:**
126
- ```
127
- Research session for: {topic}
128
- Output: docs/workflow/research/exploration.md
129
-
130
- Context:
131
- - Prompted by: {problem, opportunity, or curiosity}
132
- - Already knows: {any initial thoughts or research, or "starting fresh"}
133
- - Starting point: {technical feasibility, market, business model, or "open exploration"}
134
- - Constraints: {any constraints mentioned, or "none"}
60
+ ## Step 2: Invoke the Skill
135
61
 
136
- Invoke the technical-research skill.
137
- ```
62
+ Load **[invoke-skill.md](references/invoke-skill.md)** and follow its instructions as written.
@@ -0,0 +1,68 @@
1
+ # Gather Context
2
+
3
+ *Reference for **[start-research](../SKILL.md)***
4
+
5
+ ---
6
+
7
+ Ask each question below **one at a time**. After each, **STOP** and wait for the user's response before proceeding.
8
+
9
+ ---
10
+
11
+ ## Seed Idea
12
+
13
+ Ask:
14
+
15
+ ```
16
+ What's on your mind?
17
+
18
+ - What idea or topic do you want to explore?
19
+ - What prompted this - a problem, opportunity, curiosity?
20
+ ```
21
+
22
+ **STOP.** Wait for user response before proceeding.
23
+
24
+ ---
25
+
26
+ ## Current Knowledge
27
+
28
+ Ask:
29
+
30
+ ```
31
+ What do you already know?
32
+
33
+ - Any initial thoughts or research you've done?
34
+ - Constraints or context I should be aware of?
35
+ ```
36
+
37
+ **STOP.** Wait for user response before proceeding.
38
+
39
+ ---
40
+
41
+ ## Starting Point
42
+
43
+ Ask:
44
+
45
+ ```
46
+ Where should we start?
47
+
48
+ - Technical feasibility? Market landscape? Business model?
49
+ - Or just talk it through and see where it goes?
50
+ ```
51
+
52
+ **STOP.** Wait for user response before proceeding.
53
+
54
+ ---
55
+
56
+ ## Final Context
57
+
58
+ Ask:
59
+
60
+ ```
61
+ Any constraints or context I should know about upfront?
62
+
63
+ (Or "none" if we're starting fresh)
64
+ ```
65
+
66
+ **STOP.** Wait for user response before proceeding.
67
+
68
+ ---
@@ -0,0 +1,23 @@
1
+ # Invoke the Skill
2
+
3
+ *Reference for **[start-research](../SKILL.md)***
4
+
5
+ ---
6
+
7
+ This skill's purpose is now fulfilled.
8
+
9
+ Invoke the [technical-research](../../technical-research/SKILL.md) skill for your next instructions. Do not act on the gathered information until the skill is loaded - it contains the instructions for how to proceed.
10
+
11
+ **Example handoff:**
12
+ ```
13
+ Research session for: {topic}
14
+ Output: docs/workflow/research/exploration.md
15
+
16
+ Context:
17
+ - Prompted by: {problem, opportunity, or curiosity}
18
+ - Already knows: {any initial thoughts or research, or "starting fresh"}
19
+ - Starting point: {technical feasibility, market, business model, or "open exploration"}
20
+ - Constraints: {any constraints mentioned, or "none"}
21
+
22
+ Invoke the technical-research skill.
23
+ ```
@@ -114,8 +114,7 @@ Available Plans:
114
114
  1. {topic-1} ({status}) - format: {format}, spec: {exists|missing}
115
115
  2. {topic-2} ({status}) - format: {format}, spec: {exists|missing}
116
116
 
117
- · · ·
118
-
117
+ · · · · · · · · · · · ·
119
118
  Which plan would you like to review the implementation for? (Enter a number or name)
120
119
  ```
121
120
 
@@ -138,13 +137,13 @@ Auto-selecting: {topic} (only available plan)
138
137
  Ask the user what code to review:
139
138
 
140
139
  ```
141
- · · ·
142
-
140
+ · · · · · · · · · · · ·
143
141
  What code should I review?
144
142
 
145
143
  - **`a`/`all`** — All changes since the plan was created
146
144
  - **`g`/`git`** — Identify from git status
147
145
  - Specific directories or files — tell me which
146
+ · · · · · · · · · · · ·
148
147
  ```
149
148
 
150
149
  **STOP.** Wait for user response.
@@ -210,13 +210,13 @@ Check `cache.status` from discovery to determine which options to present.
210
210
  ##### If `cache.status: "valid"`
211
211
 
212
212
  ```
213
- · · ·
214
-
213
+ · · · · · · · · · · · ·
215
214
  What would you like to do?
216
215
 
217
216
  - **`c`/`continue`** — Resume work on a spec in progress
218
217
  - **`s`/`select`** — Choose from previously analyzed groupings ({cache.generated})
219
218
  - **`r`/`refresh`** — Fresh analysis of discussion relationships
219
+ · · · · · · · · · · · ·
220
220
  ```
221
221
 
222
222
  **STOP.** Wait for user response.
@@ -224,14 +224,14 @@ What would you like to do?
224
224
  ##### If `cache.status: "stale"`
225
225
 
226
226
  ```
227
- · · ·
228
-
227
+ · · · · · · · · · · · ·
229
228
  What would you like to do?
230
229
 
231
230
  Note: A previous grouping analysis exists but is now outdated - discussion documents have changed since it was created. Re-analysis is required, but existing specification names will be preserved where groupings overlap.
232
231
 
233
232
  - **`c`/`continue`** — Resume work on a spec in progress
234
233
  - **`a`/`assess`** — Re-analyze discussions for combinations
234
+ · · · · · · · · · · · ·
235
235
  ```
236
236
 
237
237
  **STOP.** Wait for user response.
@@ -239,12 +239,12 @@ Note: A previous grouping analysis exists but is now outdated - discussion docum
239
239
  ##### If `cache.status: "none"`
240
240
 
241
241
  ```
242
- · · ·
243
-
242
+ · · · · · · · · · · · ·
244
243
  What would you like to do?
245
244
 
246
245
  - **`c`/`continue`** — Resume work on a spec in progress
247
246
  - **`a`/`assess`** — Analyze discussions for combinations
247
+ · · · · · · · · · · · ·
248
248
  ```
249
249
 
250
250
  **STOP.** Wait for user response.
@@ -474,8 +474,7 @@ Coupling: {explanation}
474
474
 
475
475
  ---
476
476
 
477
- · · ·
478
-
477
+ · · · · · · · · · · · ·
479
478
  How would you like to proceed?
480
479
 
481
480
  - **`p`/`proceed`** — As recommended (I'll ask which to start with)
@@ -483,6 +482,7 @@ How would you like to proceed?
483
482
  - **`i`/`individual`** — Create 1:1 specs (I'll ask which to start)
484
483
  - **`r`/`refresh`** — Re-analyze discussions
485
484
  - Combine differently — tell me your preferred groupings
485
+ · · · · · · · · · · · ·
486
486
  ```
487
487
 
488
488
  **Status Legend:**
@@ -564,10 +564,10 @@ This reorganization affects multiple existing specifications:
564
564
 
565
565
  Moving discussions between established specifications requires deleting the affected specs and re-processing. The source material in your discussions is preserved.
566
566
 
567
- · · ·
568
-
567
+ · · · · · · · · · · · ·
569
568
  - **`d`/`delete`** — Remove affected specs and create fresh ones for your new groupings
570
569
  - **`r`/`reconsider`** — Adjust your groupings to affect fewer specs
570
+ · · · · · · · · · · · ·
571
571
  ```
572
572
 
573
573
  **STOP.** Wait for user choice.
@@ -608,11 +608,11 @@ Check if `docs/workflow/specification/unified.md` already exists.
608
608
 
609
609
  This will consolidate ALL {N} concluded discussions into a single specification.
610
610
 
611
- · · ·
612
-
611
+ · · · · · · · · · · · ·
613
612
  Proceed with unified specification?
614
613
  - **`y`/`yes`** — Proceed
615
614
  - **`n`/`no`** — Cancel
615
+ · · · · · · · · · · · ·
616
616
  ```
617
617
 
618
618
  **STOP.** Wait for user to confirm, then proceed to **Step 9** with all discussions as sources.
@@ -665,11 +665,11 @@ Output: docs/workflow/specification/{grouping-name}.md
665
665
  After completion:
666
666
  - specification/{topic-c}.md will be marked as superseded
667
667
 
668
- · · ·
669
-
668
+ · · · · · · · · · · · ·
670
669
  Proceed?
671
670
  - **`y`/`yes`** — Proceed
672
671
  - **`n`/`no`** — Go back
672
+ · · · · · · · · · · · ·
673
673
  ```
674
674
 
675
675
  #### If creating a NEW grouped specification (no existing specs)
@@ -684,11 +684,11 @@ Sources:
684
684
 
685
685
  Output: docs/workflow/specification/{grouping-name}.md
686
686
 
687
- · · ·
688
-
687
+ · · · · · · · · · · · ·
689
688
  Proceed?
690
689
  - **`y`/`yes`** — Proceed
691
690
  - **`n`/`no`** — Go back
691
+ · · · · · · · · · · · ·
692
692
  ```
693
693
 
694
694
  #### If CONTINUING an existing grouped specification
@@ -702,11 +702,11 @@ Sources:
702
702
  - docs/workflow/discussion/{topic-a}.md
703
703
  - docs/workflow/discussion/{topic-b}.md
704
704
 
705
- · · ·
706
-
705
+ · · · · · · · · · · · ·
707
706
  Proceed?
708
707
  - **`y`/`yes`** — Proceed
709
708
  - **`n`/`no`** — Go back
709
+ · · · · · · · · · · · ·
710
710
  ```
711
711
 
712
712
  #### If creating/continuing an INDIVIDUAL specification
@@ -719,11 +719,11 @@ Sources:
719
719
 
720
720
  Output: docs/workflow/specification/{topic}.md
721
721
 
722
- · · ·
723
-
722
+ · · · · · · · · · · · ·
724
723
  Proceed?
725
724
  - **`y`/`yes`** — Proceed
726
725
  - **`n`/`no`** — Go back
726
+ · · · · · · · · · · · ·
727
727
  ```
728
728
 
729
729
  **STOP.** Wait for user confirmation.
@@ -62,6 +62,10 @@ Do not guess at progress or continue from memory. The files on disk and git hist
62
62
  1. **No autonomous decisions on spec deviations** — when the executor reports a blocker or spec deviation, present to user and STOP. Never resolve on the user's behalf.
63
63
  2. **All git operations are the orchestrator's responsibility** — agents never commit, stage, or interact with git.
64
64
 
65
+ ## Output Formatting
66
+
67
+ When announcing a new step, output `── ── ── ── ──` on its own line before the step heading.
68
+
65
69
  ---
66
70
 
67
71
  ## Step 1: Environment Setup
@@ -162,14 +166,14 @@ Commit: `impl({topic}): start implementation`
162
166
 
163
167
  Present the existing configuration for confirmation:
164
168
 
165
- > "Previous session used these project skills:
169
+ > Previous session used these project skills:
166
170
  > - `{skill-name}` — {path}
167
171
  > - ...
168
172
  >
169
- > · · ·
170
- >
173
+ > · · · · · · · · · · · ·
171
174
  > - **`y`/`yes`** — Keep these, proceed
172
- > - **`c`/`change`** — Re-discover and choose skills"
175
+ > - **`c`/`change`** — Re-discover and choose skills
176
+ > · · · · · · · · · · · ·
173
177
 
174
178
  **STOP.** Wait for user choice.
175
179
 
@@ -193,7 +197,11 @@ Scan `.claude/skills/` for project-specific skill directories. Present findings:
193
197
  > - `{skill-name}` — {brief description}
194
198
  > - ...
195
199
  >
196
- > Which of these should I pass to the implementation agents? (all / list / none)
200
+ > · · · · · · · · · · · ·
201
+ > - **`a`/`all`** — Use all listed skills
202
+ > - **`n`/`none`** — Skip project skills
203
+ > - **Or list the ones you want** — e.g. "golang-pro, react-patterns"
204
+ > · · · · · · · · · · · ·
197
205
 
198
206
  **STOP.** Wait for user to confirm which skills are relevant.
199
207
 
@@ -217,11 +225,11 @@ Otherwise, present discovery findings to the user:
217
225
  >
218
226
  > Recommendations: {any suggested tools with install commands}
219
227
  >
220
- > · · ·
221
- >
228
+ > · · · · · · · · · · · ·
222
229
  > - **`y`/`yes`** — Approve these linter commands
223
230
  > - **`c`/`change`** — Modify the linter list
224
231
  > - **`s`/`skip`** — Skip linter setup (no linting during TDD)
232
+ > · · · · · · · · · · · ·
225
233
 
226
234
  **STOP.** Wait for user choice.
227
235
 
@@ -12,8 +12,11 @@ Apply standard quality principles. Defer to project-specific skills for framewor
12
12
  - Extract repeated logic after three instances (Rule of Three)
13
13
  - Avoid premature abstraction for code used once or twice
14
14
 
15
+ ### Compose, Don't Duplicate
16
+ When new behavior is the logical inverse or subset of existing behavior, derive it from the existing abstraction rather than implementing independently. If you have a query for "ready items," the query for "blocked items" should be "open AND NOT ready" — not an independently authored query that could drift. Prefer mathematical relationships (derived = total - computed) over parallel computations that must be kept in sync.
17
+
15
18
  ### SOLID
16
- - **Single Responsibility**: Each class/function does one thing
19
+ - **Single Responsibility**: Each class/function does one thing. Multi-step logic should decompose into named helper functions — each step a function, each name documents intent.
17
20
  - **Open/Closed**: Extend behavior without modifying existing code
18
21
  - **Liskov Substitution**: Subtypes must be substitutable for base types
19
22
  - **Interface Segregation**: Don't force classes to implement unused methods
@@ -25,6 +28,9 @@ Keep low. Fix with early returns and method extraction.
25
28
  ### YAGNI
26
29
  Only implement what's in the plan. Ask: "Is this in the plan?"
27
30
 
31
+ ### Concrete Over Abstract
32
+ Prefer concrete types over language-level escape hatches that bypass the type system. Use specific types for data passing between layers, not untyped containers. If you need polymorphism, define a named interface/protocol with specific methods — don't pass untyped values. If you find yourself writing runtime type checks or casts inside a function, the signature is too abstract.
33
+
28
34
  ## Testability
29
35
  - Inject dependencies
30
36
  - Prefer pure functions
@@ -36,6 +42,8 @@ Only implement what's in the plan. Ask: "Is this in the plan?"
36
42
  - Deep nesting (3+)
37
43
  - Long parameter lists (4+)
38
44
  - Boolean parameters
45
+ - Untyped parameters when concrete types are known at design time
46
+ - Substring assertions in tests when exact output is deterministic
39
47
 
40
48
  ## Project Standards
41
49
  Check `.claude/skills/` for project-specific patterns.
@@ -26,10 +26,10 @@ If `analysis_cycle > 3`:
26
26
 
27
27
  > **Analysis cycle {N} — this is beyond the standard 3 cycles.**
28
28
  >
29
- > · · ·
30
- >
29
+ > · · · · · · · · · · · ·
31
30
  > - **`s`/`skip`** — Skip analysis, proceed to completion
32
31
  > - **`p`/`proceed`** — Run analysis anyway
32
+ > · · · · · · · · · · · ·
33
33
 
34
34
  **STOP.** Wait for user choice.
35
35
 
@@ -55,11 +55,11 @@ If there are unstaged changes or untracked files, categorize them:
55
55
  > - `{file}` ({status: modified/untracked})
56
56
  > - ...
57
57
  >
58
- > · · ·
59
- >
58
+ > · · · · · · · · · · · ·
60
59
  > - **`y`/`yes`** — Include all in the checkpoint commit
61
60
  > - **`s`/`skip`** — Exclude unexpected files, commit only implementation files
62
61
  > - **Comment** — Specify which to include
62
+ > · · · · · · · · · · · ·
63
63
 
64
64
  **STOP.** Wait for user choice.
65
65
 
@@ -137,11 +137,11 @@ Then present each task with `status: pending` individually:
137
137
  > **Tests**:
138
138
  > {tests}
139
139
  >
140
- > · · ·
141
- >
140
+ > · · · · · · · · · · · ·
142
141
  > - **`a`/`approve`** — Approve this task
143
142
  > - **`s`/`skip`** — Skip this task
144
143
  > - **Comment** — Revise based on feedback
144
+ > · · · · · · · · · · · ·
145
145
 
146
146
  **STOP.** Wait for user input.
147
147
 
@@ -44,11 +44,11 @@ Present the executor's ISSUES to the user:
44
44
  >
45
45
  > {executor's ISSUES content}
46
46
  >
47
- > · · ·
48
- >
47
+ > · · · · · · · · · · · ·
49
48
  > - **`r`/`retry`** — Re-invoke the executor with your comments (provide below)
50
49
  > - **`s`/`skip`** — Skip this task and move to the next
51
50
  > - **`t`/`stop`** — Stop implementation entirely
51
+ > · · · · · · · · · · · ·
52
52
 
53
53
  **STOP.** Wait for user choice.
54
54
 
@@ -101,12 +101,12 @@ Present the reviewer's findings and fix analysis to the user:
101
101
  > Notes (non-blocking):
102
102
  > {NOTES from reviewer}
103
103
  >
104
- > · · ·
105
- >
104
+ > · · · · · · · · · · · ·
106
105
  > - **`y`/`yes`** — Accept the review and fix analysis, pass to executor
107
106
  > - **`a`/`auto`** — Accept and auto-approve future fix analyses
108
107
  > - **`s`/`skip`** — Override the reviewer and proceed as-is
109
108
  > - **Comment** — Any commentary, adjustments, alternative approaches, or questions before passing to executor
109
+ > · · · · · · · · · · · ·
110
110
 
111
111
  **STOP.** Wait for user choice.
112
112
 
@@ -130,12 +130,12 @@ Present a summary and wait for user input:
130
130
  > Phase: {phase number} — {phase name}
131
131
  > {executor's SUMMARY — brief commentary, decisions, implementation notes}
132
132
  >
133
- > · · ·
134
- >
133
+ > · · · · · · · · · · · ·
135
134
  > **Options:**
136
135
  > - **`y`/`yes`** — Approve, commit, continue to next task
137
136
  > - **`a`/`auto`** — Approve this and all future reviewer-approved tasks automatically
138
137
  > - **Comment** — Feedback the reviewer missed (triggers a fix round)
138
+ > · · · · · · · · · · · ·
139
139
 
140
140
  **STOP.** Wait for user input.
141
141
 
@@ -42,7 +42,9 @@ But write **complete, functional implementations** - don't artificially minimize
42
42
 
43
43
  **Derive tests from plan**: Task's micro acceptance becomes your first test. Edge cases become additional tests.
44
44
 
45
- **Write test names first**: List all test names before writing bodies. Confirm coverage matches acceptance criteria.
45
+ **Assert precisely**: For mutation operations (create, update, delete, state transitions), don't just assert the return value — verify observable side effects independently. A test that checks "operation succeeded" but ignores whether timestamps updated, related records changed, or output structure is correct will miss regressions that only affect side effects. Assert structured output by parsing and checking fields/values, not by string matching the serialized form.
46
+
47
+ **Write test names first**: List all test names before writing bodies. Confirm coverage matches acceptance criteria. Then consider: invalid input types, boundary values, zero/nil/empty inputs, single vs multiple items, and success alongside failure paths — add tests for any that are relevant and non-trivial.
46
48
 
47
49
  **No implementation code exists yet.** If you're tempted to "just sketch out the class first" - don't. The test comes first. Always.
48
50
 
@@ -58,6 +58,10 @@ This process constructs a plan from a specification. A plan consists of:
58
58
 
59
59
  Follow every step in sequence. No steps are optional.
60
60
 
61
+ ## Output Formatting
62
+
63
+ When announcing a new step, output `── ── ── ── ──` on its own line before the step heading.
64
+
61
65
  ---
62
66
 
63
67
  ## Step 0: Resume Detection
@@ -76,14 +80,14 @@ Note the current phase and task position from the `planning:` block.
76
80
 
77
81
  Load **[spec-change-detection.md](references/spec-change-detection.md)** to check whether the specification has changed since planning started. Then present the user with an informed choice:
78
82
 
79
- > "Found existing plan for **{topic}** (previously reached phase {N}, task {M}).
83
+ > Found existing plan for **{topic}** (previously reached phase {N}, task {M}).
80
84
  >
81
85
  > {spec change summary from spec-change-detection.md}
82
86
  >
83
- > · · ·
84
- >
87
+ > · · · · · · · · · · · ·
85
88
  > - **`c`/`continue`** — Walk through the plan from the start. You can review, amend, or navigate at any point — including straight to the leading edge.
86
- > - **`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."
89
+ > - **`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
+ > · · · · · · · · · · · ·
87
91
 
88
92
  **STOP.** Wait for user response.
89
93
 
@@ -120,12 +124,12 @@ First, choose the Output Format.
120
124
 
121
125
  Present the recommendation:
122
126
 
123
- > "Existing plans use **{format}**. Use the same format for consistency?
124
- >
125
- > · · ·
127
+ > Existing plans use **{format}**. Use the same format for consistency?
126
128
  >
129
+ > · · · · · · · · · · · ·
127
130
  > - **`y`/`yes`** — Use {format}
128
- > - **`n`/`no`** — See all available formats"
131
+ > - **`n`/`no`** — See all available formats
132
+ > · · · · · · · · · · · ·
129
133
 
130
134
  **STOP.** Wait for user choice. If declined, fall through to the full list below.
131
135
 
@@ -38,11 +38,11 @@ The natural task order is already correct. Present this to the user:
38
38
  >
39
39
  > {notes from agent output}"
40
40
 
41
- > · · ·
42
- >
41
+ > · · · · · · · · · · · ·
43
42
  > **To proceed:**
44
43
  > - **`y`/`yes`** — Confirmed.
45
44
  > - **Or tell me what to change.**
45
+ > · · · · · · · · · · · ·
46
46
 
47
47
  **STOP.** Wait for the user's response.
48
48
 
@@ -72,11 +72,11 @@ Dependencies and priorities have already been written to the task files. Present
72
72
  >
73
73
  > {any notes from agent output}"
74
74
 
75
- > · · ·
76
- >
75
+ > · · · · · · · · · · · ·
77
76
  > **To proceed:**
78
77
  > - **`y`/`yes`** — Approved.
79
78
  > - **Or tell me what to change.**
79
+ > · · · · · · · · · · · ·
80
80
 
81
81
  **STOP.** Wait for the user's response.
82
82
 
@@ -31,12 +31,12 @@ After presenting, ask:
31
31
 
32
32
  > **Task {M} of {total}: {Task Name}**
33
33
  >
34
- > · · ·
35
- >
34
+ > · · · · · · · · · · · ·
36
35
  > **To proceed:**
37
36
  > - **`y`/`yes`** — Approved. I'll log it to the plan.
38
37
  > - **Or tell me what to change.**
39
38
  > - **Or navigate** — a different phase or task, or the leading edge.
39
+ > · · · · · · · · · · · ·
40
40
 
41
41
  **STOP.** Wait for the user's response.
42
42
 
@@ -59,12 +59,12 @@ Present the phase structure to the user.
59
59
 
60
60
  > **Phase Structure**
61
61
  >
62
- > · · ·
63
- >
62
+ > · · · · · · · · · · · ·
64
63
  > **To proceed:**
65
64
  > - **`y`/`yes`** — Approved. I'll proceed to task breakdown.
66
65
  > - **Or tell me what to change** — reorder, split, merge, add, edit, or remove phases.
67
66
  > - **Or navigate** — a different phase or task, or the leading edge.
67
+ > · · · · · · · · · · · ·
68
68
 
69
69
  #### If the user provides feedback
70
70
 
@@ -42,12 +42,12 @@ Present the task overview to the user.
42
42
 
43
43
  **STOP.** Ask:
44
44
 
45
- > · · ·
46
- >
45
+ > · · · · · · · · · · · ·
47
46
  > **To proceed:**
48
47
  > - **`y`/`yes`** — Approved.
49
48
  > - **Or tell me what to change** — reorder, split, merge, add, edit, or remove tasks.
50
49
  > - **Or navigate** — a different phase or task, or the leading edge.
50
+ > · · · · · · · · · · · ·
51
51
 
52
52
  #### If the user provides feedback
53
53
 
@@ -71,12 +71,12 @@ Present the task list to the user for review.
71
71
 
72
72
  > **Phase {N}: {Phase Name}** — {M} tasks.
73
73
  >
74
- > · · ·
75
- >
74
+ > · · · · · · · · · · · ·
76
75
  > **To proceed:**
77
76
  > - **`y`/`yes`** — Confirmed.
78
77
  > - **Or tell me what to change.**
79
78
  > - **Or navigate** — a different phase or task, or the leading edge.
79
+ > · · · · · · · · · · · ·
80
80
 
81
81
  **STOP.** Wait for the user's response.
82
82
 
@@ -43,11 +43,11 @@ Skip the resolution and reverse check — there is nothing to resolve against. D
43
43
 
44
44
  **STOP.** Present a summary of the dependency state: what was documented, what was resolved, what remains unresolved, and any reverse resolutions made.
45
45
 
46
- > · · ·
47
- >
46
+ > · · · · · · · · · · · ·
48
47
  > **To proceed:**
49
48
  > - **`y`/`yes`** — Approved. I'll proceed to plan review.
50
49
  > - **Or tell me what to change.**
50
+ > · · · · · · · · · · · ·
51
51
 
52
52
  #### If the user provides feedback
53
53
 
@@ -171,12 +171,12 @@ After presenting the finding and proposed fix, ask:
171
171
 
172
172
  > **Finding {N} of {total}: {Brief Title}**
173
173
  >
174
- > · · ·
175
- >
174
+ > · · · · · · · · · · · ·
176
175
  > **To proceed:**
177
176
  > - **`y`/`yes`** — Approved. I'll apply it to the plan verbatim.
178
177
  > - **`s`/`skip`** — Leave this as-is and move to the next finding.
179
178
  > - **Or tell me what to change.**
179
+ > · · · · · · · · · · · ·
180
180
 
181
181
  **STOP.** Wait for the user's response.
182
182
 
@@ -149,12 +149,12 @@ After presenting the finding and proposed fix, ask:
149
149
 
150
150
  > **Finding {N} of {total}: {Brief Title}**
151
151
  >
152
- > · · ·
153
- >
152
+ > · · · · · · · · · · · ·
154
153
  > **To proceed:**
155
154
  > - **`y`/`yes`** — Approved. I'll apply it to the plan verbatim.
156
155
  > - **`s`/`skip`** — Leave this as-is and move to the next finding.
157
156
  > - **Or tell me what to change.**
157
+ > · · · · · · · · · · · ·
158
158
 
159
159
  **STOP.** Wait for the user's response.
160
160
 
@@ -87,11 +87,11 @@ When you notice convergence, **flag it and give the user options**:
87
87
 
88
88
  > This thread seems to be converging — we've explored {topic} enough that the tradeoffs are clear and it's approaching decision territory.
89
89
  >
90
- > · · ·
91
- >
90
+ > · · · · · · · · · · · ·
92
91
  > - **`p`/`park`** — Mark as discussion-ready and move to another topic
93
92
  > - **`k`/`keep`** — Keep digging, there's more to understand
94
93
  > - Comment — your call
94
+ > · · · · · · · · · · · ·
95
95
 
96
96
  **Never decide for the user.** Even if the answer seems obvious, flag it and ask.
97
97
 
@@ -78,11 +78,11 @@ Present your understanding to the user **in the format it would appear in the sp
78
78
 
79
79
  Then present two explicit choices:
80
80
 
81
- > · · ·
82
- >
81
+ > · · · · · · · · · · · ·
83
82
  > **To proceed:**
84
83
  > - **`y`/`yes`** — Approved. I'll add the above to the specification **verbatim** (exactly as shown, no modifications).
85
84
  > - **Or tell me what to change.**
85
+ > · · · · · · · · · · · ·
86
86
 
87
87
  **Do not paraphrase these choices.** Present them exactly as written so users always know what to expect.
88
88
 
@@ -518,11 +518,11 @@ For each item, follow the **same workflow as the main specification process**:
518
518
  >
519
519
  > [content exactly as it would appear]
520
520
  >
521
- > · · ·
522
- >
521
+ > · · · · · · · · · · · ·
523
522
  > **To proceed:**
524
523
  > - **`y`/`yes`** — Approved. I'll add the above to the specification **verbatim**.
525
524
  > - **Or tell me what to change.**
525
+ > · · · · · · · · · · · ·
526
526
 
527
527
  4. **Wait for explicit approval** - same rules as always: `y`/`yes` or equivalent before writing
528
528
  5. **Log verbatim** when approved
@@ -650,11 +650,11 @@ For each item:
650
650
  >
651
651
  > [content exactly as it would appear]
652
652
  >
653
- > · · ·
654
- >
653
+ > · · · · · · · · · · · ·
655
654
  > **To proceed:**
656
655
  > - **`y`/`yes`** — Approved. I'll add the above to the specification **verbatim**.
657
656
  > - **Or tell me what to change.**
657
+ > · · · · · · · · · · · ·
658
658
 
659
659
  4. **Wait for explicit approval**
660
660
  5. **Log verbatim** when approved