@leeovery/claude-technical-workflows 2.1.32 → 2.1.34

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.
package/README.md CHANGED
@@ -110,7 +110,7 @@ Each phase produces documents that feed the next. Here's the journey:
110
110
 
111
111
  **Implementation** — Executes plans via strict TDD. Tests first, then code, commit after each task. Per-task approval gates keep you in control, with auto-mode available when you trust the flow.
112
112
 
113
- **Review** — Validates the implementation against spec and plan. Catches drift, missing requirements, and quality issues. The spec is the source of truth here — earlier phases may contain rejected ideas that were intentionally filtered out. Produces structured feedback without fixing code directly.
113
+ **Review** — Validates the implementation against spec and plan. Catches drift, missing requirements, and quality issues. Findings can be synthesized into remediation tasks that feed back into implementation, closing the review-implementation loop.
114
114
 
115
115
  ### Standalone Skills
116
116
 
@@ -231,8 +231,12 @@ docs/workflow/
231
231
  ├── implementation/ # Phase 5 — directory per topic
232
232
  │ └── {topic}/
233
233
  │ └── tracking.md # Progress, gates, current task
234
- └── review/ # Phase 6 — one file per review
235
- └── {topic}.md
234
+ └── review/ # Phase 6 — versioned per review
235
+ └── {topic}/
236
+ └── r1/
237
+ ├── review.md # Review summary and verdict
238
+ ├── qa-task-1.md # Per-task QA verification
239
+ └── product-assessment.md # Holistic product assessment
236
240
  ```
237
241
 
238
242
  Research starts with `exploration.md` and splits into topic files as themes emerge. From specification onwards, each topic gets its own directory. Planning task storage varies by [output format](#output-formats) — the tree above shows local-markdown; Tick and Linear store tasks externally.
@@ -269,12 +273,15 @@ skills/
269
273
 
270
274
  agents/
271
275
  ├── review-task-verifier.md # Verifies single task implementation for review
276
+ ├── review-findings-synthesizer.md # Synthesizes review findings into remediation tasks
272
277
  ├── implementation-task-executor.md # TDD executor for single plan tasks
273
278
  ├── implementation-task-reviewer.md # Post-task review for spec conformance
274
279
  ├── planning-phase-designer.md # Design phases from specification
275
280
  ├── planning-task-designer.md # Break phases into task lists
276
281
  ├── planning-task-author.md # Write full task detail
277
- └── planning-dependency-grapher.md # Analyze task dependencies and priorities
282
+ ├── planning-dependency-grapher.md # Analyze task dependencies and priorities
283
+ ├── planning-review-traceability.md # Spec-to-plan traceability analysis
284
+ └── planning-review-integrity.md # Plan structural quality review
278
285
 
279
286
  tests/
280
287
  └── scripts/ # Shell script tests for discovery and migrations
@@ -310,7 +317,7 @@ Sequential skills that expect files from previous phases and pass content to pro
310
317
  | [**/start-specification**](skills/start-specification/) | Start a specification session from existing discussion(s). Automatically analyses multiple discussions for natural groupings and consolidates them into unified specifications. |
311
318
  | [**/start-planning**](skills/start-planning/) | Start a planning session from an existing specification. Creates implementation plans with phases, tasks, and acceptance criteria. Supports multiple output formats. |
312
319
  | [**/start-implementation**](skills/start-implementation/) | Start implementing a plan. Executes tasks via strict TDD, committing after each passing test. |
313
- | [**/start-review**](skills/start-review/) | Start reviewing completed work. Validates implementation against plan tasks and acceptance criteria. |
320
+ | [**/start-review**](skills/start-review/) | Start reviewing completed work. Validates implementation against plan tasks and acceptance criteria. Findings can be synthesized into remediation tasks. |
314
321
 
315
322
  #### Utility Skills
316
323
 
@@ -354,6 +361,9 @@ Subagents that skills can spawn for parallel task execution.
354
361
  | [**planning-task-designer**](agents/planning-task-designer.md) | technical-planning | Breaks a single phase into a task list with edge cases. |
355
362
  | [**planning-task-author**](agents/planning-task-author.md) | technical-planning | Writes full detail for a single plan task. |
356
363
  | [**planning-dependency-grapher**](agents/planning-dependency-grapher.md) | technical-planning | Analyzes authored tasks to establish internal dependencies and priorities. |
364
+ | [**planning-review-traceability**](agents/planning-review-traceability.md) | technical-planning | Spec-to-plan traceability analysis. |
365
+ | [**planning-review-integrity**](agents/planning-review-integrity.md) | technical-planning | Plan structural quality review. |
366
+ | [**review-findings-synthesizer**](agents/review-findings-synthesizer.md) | technical-review | Synthesizes review findings into normalized remediation tasks for plan integration. |
357
367
 
358
368
  ## Requirements
359
369
 
@@ -19,6 +19,7 @@ You receive via the orchestrator's prompt:
19
19
  4. **Plan format reading adapter path** — how to read tasks from the plan (for determining next phase number)
20
20
  5. **Plan format authoring adapter path** — how to create tasks in the plan
21
21
  6. **plan-index-schema.md** — Canonical plan index structure
22
+ 7. **Phase label** — the label for the new phase (e.g., "Analysis (Cycle 1)", "Review Remediation (Cycle 1)")
22
23
 
23
24
  ## Your Process
24
25
 
@@ -35,10 +36,10 @@ The Plan Index File (`docs/workflow/planning/{topic}/plan.md`) is the single sou
35
36
 
36
37
  Append at the end of the Plan Index File body, following the **Phase Entry** and **Task Table** templates from plan-index-schema:
37
38
 
38
- - Phase heading: `### Phase {N}: Analysis ({cycle description})`
39
+ - Phase heading: `### Phase {N}: {phase_label}`
39
40
  - Phase `status`: `approved` (pre-approved by user in approval gate)
40
41
  - Phase `ext_id`: external identifier for the phase from the output format
41
- - Phase goal: `Address findings from implementation analysis cycle {N}.`
42
+ - Phase goal: `Address findings from {phase_label}.`
42
43
  - Omit `approved_at` and acceptance criteria (analysis phases don't use them)
43
44
  - Task `Status`: `authored` (task files are fully written)
44
45
  - Task `Ext ID`: external identifier for the task from the output format
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: review-findings-synthesizer
3
+ description: Synthesizes review findings into normalized tasks. Reads review files (QA verifications and product assessment), deduplicates, groups, normalizes using task template, and writes a staging file for orchestrator approval. Invoked by technical-review skill after review actions are initiated.
4
+ tools: Read, Write, Glob, Grep
5
+ model: opus
6
+ ---
7
+
8
+ # Review Findings: Synthesizer
9
+
10
+ You locate the review findings files using the provided paths, then read them, deduplicate and group findings, normalize into tasks, and write a staging file for user approval.
11
+
12
+ ## Your Input
13
+
14
+ You receive via the orchestrator's prompt:
15
+
16
+ 1. **Review scope** — single or multi, with plan list
17
+ 2. **Review paths** — paths to `r{N}/` directories containing review summary, QA files, and product assessment
18
+ 3. **Specification path(s)** — the validated specification(s) for context
19
+ 4. **Cycle number** — which review remediation cycle this is
20
+
21
+ ## Your Process
22
+
23
+ 1. **Read review summary(ies)** — extract verdict, required changes, recommendations from each `review.md`
24
+ 2. **Read all QA files** — read every `qa-task-*.md` across all review paths. Extract BLOCKING ISSUES and significant NON-BLOCKING NOTES with their file:line references
25
+ 3. **Read product assessment(s)** — extract ROBUSTNESS, GAPS, and STRENGTHENING findings from `product-assessment.md`
26
+ 4. **Tag each finding with source plan** — use the directory structure of QA files to identify which plan each finding belongs to. For multi-plan reviews, QA files are stored in per-plan subdirectories within the review. Product assessment findings: tag by plan where identifiable; mark as `cross-cutting` otherwise
27
+ 5. **Deduplicate** — same issue found in QA + product assessment → one finding, note all sources
28
+ 6. **Group related findings** — multiple findings about the same concern become one task (e.g., 3 QA findings about missing error handling in the same module = 1 "add error handling" task)
29
+ 7. **Filter** — discard low-severity non-blocking findings unless they cluster into a pattern. Never discard high-severity or blocking findings.
30
+ 8. **Normalize** — convert each group into a task using the canonical task template (Problem / Solution / Outcome / Do / Acceptance Criteria / Tests)
31
+ 9. **Write report** — output to `docs/workflow/implementation/{primary-topic}/review-report-c{cycle}.md`
32
+ 10. **Write staging file** — if actionable tasks exist, write to `docs/workflow/implementation/{primary-topic}/review-tasks-c{cycle}.md` with `status: pending` for each task
33
+
34
+ ## Report Format
35
+
36
+ Write the report file with this structure:
37
+
38
+ ```markdown
39
+ ---
40
+ scope: {scope description}
41
+ cycle: {N}
42
+ source: review
43
+ total_findings: {N}
44
+ deduplicated_findings: {N}
45
+ proposed_tasks: {N}
46
+ ---
47
+ # Review Report: {Scope} (Cycle {N})
48
+
49
+ ## Summary
50
+ {2-3 sentence overview of findings}
51
+
52
+ ## Discarded Findings
53
+ - {title} — {reason for discarding}
54
+ ```
55
+
56
+ ## Staging File Format
57
+
58
+ Write the staging file with this structure:
59
+
60
+ ```markdown
61
+ ---
62
+ scope: {scope description}
63
+ cycle: {N}
64
+ source: review
65
+ total_proposed: {N}
66
+ gate_mode: gated
67
+ ---
68
+ # Review Tasks: {Scope} (Cycle {N})
69
+
70
+ ## Task 1: {title}
71
+ status: pending
72
+ severity: high
73
+ plan: {plan-topic}
74
+ sources: qa-task-3, product-assessment
75
+
76
+ **Problem**: {what the review found}
77
+ **Solution**: {what to fix}
78
+ **Outcome**: {what success looks like}
79
+ **Do**: {step-by-step implementation instructions}
80
+ **Acceptance Criteria**:
81
+ - {criterion}
82
+ **Tests**:
83
+ - {test description}
84
+
85
+ ## Task 2: {title}
86
+ status: pending
87
+ ...
88
+ ```
89
+
90
+ ## Hard Rules
91
+
92
+ **MANDATORY. No exceptions.**
93
+
94
+ 1. **No new features** — only address issues found in the review. Every proposed task must trace back to a specific review finding.
95
+ 2. **Never discard blocking** — blocking issues from QA always become proposed tasks.
96
+ 3. **Self-contained tasks** — every proposed task must be independently executable. No task should depend on another proposed task.
97
+ 4. **Faithful synthesis** — do not invent findings. Every proposed task must trace back to at least one QA finding or product assessment observation.
98
+ 5. **No git writes** — do not commit or stage. Writing the report and staging files are your only file writes.
99
+ 6. **Plan tagging** — every task must have a `plan:` field identifying which plan it belongs to. This is critical for multi-plan reviews where tasks are created in different plans.
100
+
101
+ ## Your Output
102
+
103
+ Return a brief status to the orchestrator:
104
+
105
+ ```
106
+ STATUS: tasks_proposed | clean
107
+ TASKS_PROPOSED: {N}
108
+ SUMMARY: {1-2 sentences}
109
+ ```
110
+
111
+ - `tasks_proposed`: tasks written to staging file — orchestrator should present for approval
112
+ - `clean`: no actionable findings — orchestrator should report clean result
@@ -42,7 +42,7 @@ You receive via the orchestrator's prompt:
42
42
  3. **Read plan(s)** — understand what was built and the scope of each plan
43
43
  4. **Read all implementation files** — understand the full picture
44
44
  5. **Assess as a product** — evaluate holistically against focus areas
45
- 6. **Write findings** to `docs/workflow/review/{topic-or-scope}/product-assessment.md`
45
+ 6. **Write findings** to `docs/workflow/review/{scope}/r{N}/product-assessment.md`
46
46
 
47
47
  For multi-plan/full-product scope, use a descriptive scope name (e.g., `full-product` or a hyphenated list of topic names).
48
48
 
@@ -59,7 +59,7 @@ For multi-plan/full-product scope, use a descriptive scope name (e.g., `full-pro
59
59
 
60
60
  ## Output File Format
61
61
 
62
- Write to `docs/workflow/review/{topic-or-scope}/product-assessment.md`:
62
+ Write to `docs/workflow/review/{scope}/r{N}/product-assessment.md`:
63
63
 
64
64
  ```
65
65
  SCOPE: {single-plan | multi-plan | full-product}
@@ -17,8 +17,10 @@ You receive:
17
17
  3. **Plan path**: The full plan for additional context
18
18
  4. **Project skill paths**: Relevant `.claude/skills/` paths for framework conventions
19
19
  5. **Review checklist path**: Path to the review checklist (`skills/technical-review/references/review-checklist.md`) — read this for detailed verification criteria
20
- 6. **Topic name**: The plan topic (used for output file path)
21
- 7. **Task index**: Sequential number for this task (used for output file naming)
20
+ 6. **Review scope**: Scope directory name for output path
21
+ 7. **Review number**: Version number (e.g., 1 for `r1/`)
22
+ 8. **Plan topic**: For multi-plan reviews, the plan-specific subdirectory name
23
+ 9. **Task index**: Sequential number for this task (used for output file naming)
22
24
 
23
25
  ## Your Task
24
26
 
@@ -86,7 +88,7 @@ Review the implementation as a senior architect would:
86
88
 
87
89
  ## Output File Format
88
90
 
89
- Write to `docs/workflow/review/{topic}/qa-task-{index}.md`:
91
+ Write to `docs/workflow/review/{scope}/r{N}/qa-task-{index}.md`:
90
92
 
91
93
  ```
92
94
  TASK: [Task name/description]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leeovery/claude-technical-workflows",
3
- "version": "2.1.32",
3
+ "version": "2.1.34",
4
4
  "description": "Technical workflow skills & commands for Claude Code",
5
5
  "license": "MIT",
6
6
  "author": "Lee Overy <me@leeovery.com>",
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # 008-review-directory-structure.sh
4
+ #
5
+ # Moves existing flat review files into a versioned r1/ directory structure.
6
+ #
7
+ # Previous layout:
8
+ # review/
9
+ # ├── tick-core.md # Summary at root
10
+ # ├── tick-core/ # QA files + product assessment
11
+ # │ ├── qa-task-1.md
12
+ # │ └── product-assessment.md
13
+ # ├── doctor-installation-migration.md # Multi-plan summary
14
+ # ├── installation/ # Per-plan QA (ambiguous)
15
+ # │ └── qa-task-1.md
16
+ #
17
+ # New layout:
18
+ # review/
19
+ # ├── tick-core/
20
+ # │ └── r1/
21
+ # │ ├── review.md
22
+ # │ ├── qa-task-1.md
23
+ # │ └── product-assessment.md
24
+ # ├── doctor-installation-migration/
25
+ # │ └── r1/
26
+ # │ ├── review.md
27
+ # │ ├── product-assessment.md
28
+ # │ └── installation/
29
+ # │ └── qa-task-1.md
30
+ #
31
+ # Idempotent: skips if r1/ already exists.
32
+ #
33
+ # This script is sourced by migrate.sh and has access to:
34
+ # - is_migrated "filepath" "migration_id"
35
+ # - record_migration "filepath" "migration_id"
36
+ # - report_update "filepath" "description"
37
+ # - report_skip "filepath"
38
+ #
39
+
40
+ MIGRATION_ID="008"
41
+ REVIEW_DIR="docs/workflow/review"
42
+
43
+ # Skip if no review directory
44
+ if [ ! -d "$REVIEW_DIR" ]; then
45
+ return 0
46
+ fi
47
+
48
+ for review_file in "$REVIEW_DIR"/*.md; do
49
+ [ -f "$review_file" ] || continue
50
+
51
+ scope=$(basename "$review_file" .md)
52
+ scope_dir="$REVIEW_DIR/$scope"
53
+ r1_dir="$scope_dir/r1"
54
+
55
+ # Use the review file as migration tracking key
56
+ if is_migrated "$review_file" "$MIGRATION_ID"; then
57
+ report_skip "$review_file"
58
+ continue
59
+ fi
60
+
61
+ # Skip if r1/ already exists (idempotent)
62
+ if [ -d "$r1_dir" ]; then
63
+ record_migration "$review_file" "$MIGRATION_ID"
64
+ report_skip "$review_file"
65
+ continue
66
+ fi
67
+
68
+ # Create r1/ directory
69
+ mkdir -p "$r1_dir"
70
+
71
+ # Move the summary file to r1/review.md
72
+ mv "$review_file" "$r1_dir/review.md"
73
+ moved=1
74
+
75
+ # If a matching directory exists, move its contents into r1/
76
+ if [ -d "$scope_dir" ]; then
77
+ # Move qa-task-*.md files
78
+ for qa_file in "$scope_dir"/qa-task-*.md; do
79
+ [ -f "$qa_file" ] || continue
80
+ mv "$qa_file" "$r1_dir/"
81
+ moved=$((moved + 1))
82
+ done
83
+
84
+ # Move product-assessment.md
85
+ if [ -f "$scope_dir/product-assessment.md" ]; then
86
+ mv "$scope_dir/product-assessment.md" "$r1_dir/"
87
+ moved=$((moved + 1))
88
+ fi
89
+
90
+ # Move per-plan QA subdirectories (multi-plan reviews)
91
+ for subdir in "$scope_dir"/*/; do
92
+ [ -d "$subdir" ] || continue
93
+ subdir_name=$(basename "$subdir")
94
+ # Skip the r1 directory we just created
95
+ [ "$subdir_name" = "r1" ] && continue
96
+ # Only move directories that contain qa-task files
97
+ if ls -1 "$subdir"/qa-task-*.md >/dev/null 2>&1; then
98
+ mv "$subdir" "$r1_dir/"
99
+ moved=$((moved + 1))
100
+ fi
101
+ done
102
+ fi
103
+
104
+ record_migration "$r1_dir/review.md" "$MIGRATION_ID"
105
+ report_update "$r1_dir/review.md" "migrated to r1/ structure ($moved items)"
106
+ done
@@ -77,10 +77,16 @@ Parse the discovery output to understand:
77
77
  - `files` - list of plans with: name, topic, status, date, format, specification, specification_exists, plan_id (if present)
78
78
  - `count` - total number of plans
79
79
 
80
+ **From `reviews` section:**
81
+ - `exists` - whether any reviews exist
82
+ - `entries` - list of reviews with: scope, type, plans, versions, latest_version, latest_verdict, latest_path, has_synthesis
83
+
80
84
  **From `state` section:**
81
85
  - `scenario` - one of: `"no_plans"`, `"single_plan"`, `"multiple_plans"`
82
86
  - `implemented_count` - plans with implementation_status != "none"
83
87
  - `completed_count` - plans with implementation_status == "completed"
88
+ - `reviewed_plan_count` - plans that have been reviewed
89
+ - `all_reviewed` - whether all implemented plans have reviews
84
90
 
85
91
  **IMPORTANT**: Use ONLY this script for discovery. Do NOT run additional bash commands (ls, head, cat, etc.) to gather state - the script provides everything needed.
86
92
 
@@ -110,9 +116,50 @@ to build it.
110
116
 
111
117
  **STOP.** Do not proceed — terminal condition.
112
118
 
119
+ #### If all_reviewed is true
120
+
121
+ All implemented plans have been reviewed.
122
+
123
+ > *Output the next fenced block as a code block:*
124
+
125
+ ```
126
+ Review Overview
127
+
128
+ All {N} implemented plans have been reviewed.
129
+
130
+ 1. {topic:(titlecase)}
131
+ └─ Review: r{N} ({verdict})
132
+ └─ Synthesis: @if(has_synthesis) completed @else pending @endif
133
+
134
+ 2. ...
135
+ ```
136
+
137
+ > *Output the next fenced block as markdown (not a code block):*
138
+
139
+ ```
140
+ · · · · · · · · · · · ·
141
+ All plans have been reviewed.
142
+
143
+ - **`a`/`analysis`** — Synthesize findings from existing reviews into tasks
144
+ - **`r`/`re-review`** — Re-review a plan (creates new review version)
145
+
146
+ Select an option:
147
+ · · · · · · · · · · · ·
148
+ ```
149
+
150
+ **STOP.** Wait for user response.
151
+
152
+ #### If analysis
153
+
154
+ → Proceed to **Step 4** with scope set to "analysis".
155
+
156
+ #### If re-review
157
+
158
+ → Proceed to **Step 3**, incrementing the review version for the selected plan.
159
+
113
160
  #### If scenario is "single_plan" or "multiple_plans"
114
161
 
115
- Plans exist.
162
+ Plans exist (some may have reviews, some may not).
116
163
 
117
164
  → Proceed to **Step 3** to present options.
118
165
 
@@ -136,19 +183,4 @@ Load **[select-plans.md](references/select-plans.md)** and follow its instructio
136
183
 
137
184
  ## Step 5: Invoke the Skill
138
185
 
139
- Before invoking the processing skill, save a session bookmark.
140
-
141
- > *Output the next fenced block as a code block:*
142
-
143
- ```
144
- Saving session state so Claude can pick up where it left off if the conversation is compacted.
145
- ```
146
-
147
- ```bash
148
- .claude/hooks/workflows/write-session-state.sh \
149
- "{topic}" \
150
- "skills/technical-review/SKILL.md" \
151
- "docs/workflow/review/{topic}.md"
152
- ```
153
-
154
186
  Load **[invoke-skill.md](references/invoke-skill.md)** and follow its instructions as written.
@@ -21,6 +21,7 @@ Review Overview
21
21
  └─ Plan: concluded ({format})
22
22
  └─ Implementation: {impl_status:[completed|in-progress]}
23
23
  └─ Spec: {spec:[exists|missing]}
24
+ └─ Review: @if(has_review) r{N} ({verdict}) @else (none) @endif
24
25
 
25
26
  2. ...
26
27
  ```
@@ -54,6 +55,10 @@ Key:
54
55
  Implementation status:
55
56
  completed — all tasks implemented
56
57
  in-progress — implementation still ongoing
58
+
59
+ Review status:
60
+ r{N} — review version number
61
+ (none) — not yet reviewed
57
62
  ```
58
63
 
59
64
  **Then route based on what's reviewable:**
@@ -90,11 +95,14 @@ Scope: single
90
95
 
91
96
  ```
92
97
  · · · · · · · · · · · ·
93
- What scope would you like to review?
98
+ What would you like to do?
94
99
 
95
100
  - **`s`/`single`** — Review one plan's implementation
96
101
  - **`m`/`multi`** — Review selected plans together (cross-cutting)
97
102
  - **`a`/`all`** — Review all implemented plans (full product)
103
+ @if(has_any_review) - **`analysis`** — Synthesize findings from existing reviews into tasks @endif
104
+
105
+ Select an option:
98
106
  · · · · · · · · · · · ·
99
107
  ```
100
108
 
@@ -6,7 +6,26 @@
6
6
 
7
7
  After completing the steps above, this skill's purpose is fulfilled.
8
8
 
9
- Invoke the [technical-review](../../technical-review/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.
9
+ ## Save Session Bookmark
10
+
11
+ > *Output the next fenced block as a code block:*
12
+
13
+ ```
14
+ Saving session state so Claude can pick up where it left off if the conversation is compacted.
15
+ ```
16
+
17
+ ```bash
18
+ .claude/hooks/workflows/write-session-state.sh \
19
+ "{topic}" \
20
+ "skills/technical-review/SKILL.md" \
21
+ "docs/workflow/review/{scope}/r{N}/review.md"
22
+ ```
23
+
24
+ ---
25
+
26
+ ## Invoke the Skill
27
+
28
+ Invoke the [technical-review](../../technical-review/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. Use the appropriate handoff format based on the gathered context (review or analysis-only).
10
29
 
11
30
  **Example handoff (single):**
12
31
  ```
@@ -30,3 +49,18 @@ Plans:
30
49
 
31
50
  Invoke the technical-review skill.
32
51
  ```
52
+
53
+ **Example handoff (analysis-only):**
54
+ ```
55
+ Analysis session for: {scope description}
56
+ Review mode: analysis-only
57
+ Review scope: {single | multi | all}
58
+ Reviews:
59
+ - scope: {scope}
60
+ path: docs/workflow/review/{scope}/r{N}/
61
+ plans: [{plan topics}]
62
+ format: {format}
63
+ specification: {spec path}
64
+
65
+ Invoke the technical-review skill.
66
+ ```
@@ -4,7 +4,36 @@
4
4
 
5
5
  ---
6
6
 
7
- This step only applies for `single` or `multi` scope chosen in Step 3.
7
+ This step only applies for `single`, `multi`, or `all` scope chosen in Step 3.
8
+
9
+ #### If scope is "analysis"
10
+
11
+ Select which reviews to analyze.
12
+
13
+ #### If multiple reviews exist
14
+
15
+ > *Output the next fenced block as markdown (not a code block):*
16
+
17
+ ```
18
+ · · · · · · · · · · · ·
19
+ Which reviews to analyze?
20
+
21
+ - **`a`/`all`** — All reviewed plans
22
+ - **`s`/`select`** — Choose specific reviews
23
+
24
+ Select an option:
25
+ · · · · · · · · · · · ·
26
+ ```
27
+
28
+ **STOP.** Wait for user response.
29
+
30
+ If `select`, present numbered list of reviewed plans for the user to choose from (comma-separated numbers).
31
+
32
+ #### If single review exists
33
+
34
+ Automatically proceed with the only available review.
35
+
36
+ → Proceed to **Step 5**.
8
37
 
9
38
  #### If scope is "all"
10
39
 
@@ -9,6 +9,8 @@ set -eo pipefail
9
9
 
10
10
  PLAN_DIR="docs/workflow/planning"
11
11
  SPEC_DIR="docs/workflow/specification"
12
+ REVIEW_DIR="docs/workflow/review"
13
+ IMPL_DIR="docs/workflow/implementation"
12
14
 
13
15
  # Helper: Extract a frontmatter field value from a file
14
16
  # Usage: extract_field <file> <field_name>
@@ -113,6 +115,134 @@ fi
113
115
 
114
116
  echo ""
115
117
 
118
+ #
119
+ # REVIEWS
120
+ #
121
+ echo "reviews:"
122
+
123
+ reviewed_plan_count=0
124
+ # Track which plan names have been reviewed (space-separated)
125
+ reviewed_plans=""
126
+
127
+ if [ -d "$REVIEW_DIR" ]; then
128
+ # Check for any review directories with r*/review.md
129
+ has_reviews="false"
130
+ for scope_dir in "$REVIEW_DIR"/*/; do
131
+ [ -d "$scope_dir" ] || continue
132
+ if ls -d "$scope_dir"r*/review.md >/dev/null 2>&1; then
133
+ has_reviews="true"
134
+ break
135
+ fi
136
+ done
137
+
138
+ echo " exists: $has_reviews"
139
+
140
+ if [ "$has_reviews" = "true" ]; then
141
+ echo " entries:"
142
+
143
+ for scope_dir in "$REVIEW_DIR"/*/; do
144
+ [ -d "$scope_dir" ] || continue
145
+ scope=$(basename "$scope_dir")
146
+
147
+ # Count r*/ versions
148
+ versions=0
149
+ latest_version=0
150
+ latest_path=""
151
+ for rdir in "$scope_dir"r*/; do
152
+ [ -d "$rdir" ] || continue
153
+ [ -f "${rdir}review.md" ] || continue
154
+ rnum=${rdir##*r}
155
+ rnum=${rnum%/}
156
+ versions=$((versions + 1))
157
+ if [ "$rnum" -gt "$latest_version" ] 2>/dev/null; then
158
+ latest_version=$rnum
159
+ latest_path="$rdir"
160
+ fi
161
+ done
162
+
163
+ [ "$versions" -eq 0 ] && continue
164
+
165
+ # Extract verdict from latest review.md
166
+ latest_verdict=""
167
+ if [ -f "${latest_path}review.md" ]; then
168
+ latest_verdict=$(grep -m1 '\*\*QA Verdict\*\*:' "${latest_path}review.md" 2>/dev/null | \
169
+ sed -E 's/.*\*\*QA Verdict\*\*:[[:space:]]*//' || true)
170
+ fi
171
+
172
+ # Determine type (single/multi) from Scope line
173
+ review_type="single"
174
+ review_plans=""
175
+ if [ -f "${latest_path}review.md" ]; then
176
+ scope_line=$(grep -m1 '\*\*Scope\*\*:' "${latest_path}review.md" 2>/dev/null || true)
177
+ if echo "$scope_line" | grep -qi "multi-plan\|multi plan"; then
178
+ review_type="multi"
179
+ # Extract plan names from parentheses: Multi-Plan (plan1, plan2, plan3)
180
+ review_plans=$(echo "$scope_line" | sed -E 's/.*\(([^)]+)\).*/\1/' | tr ',' '\n' | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//')
181
+ elif echo "$scope_line" | grep -qi "full product"; then
182
+ review_type="multi"
183
+ fi
184
+ fi
185
+
186
+ # For single-plan reviews, plan name is the scope
187
+ if [ "$review_type" = "single" ]; then
188
+ review_plans="$scope"
189
+ fi
190
+
191
+ # Check for synthesis: look for review-tasks-c*.md in implementation dirs
192
+ has_synthesis="false"
193
+ if [ "$review_type" = "single" ]; then
194
+ if ls "$IMPL_DIR/$scope"/review-tasks-c*.md >/dev/null 2>&1; then
195
+ has_synthesis="true"
196
+ fi
197
+ else
198
+ # For multi-plan, check each plan's implementation dir
199
+ for plan_name in $review_plans; do
200
+ plan_name=$(echo "$plan_name" | tr -d '[:space:]')
201
+ if ls "$IMPL_DIR/$plan_name"/review-tasks-c*.md >/dev/null 2>&1; then
202
+ has_synthesis="true"
203
+ break
204
+ fi
205
+ done
206
+ fi
207
+
208
+ # Track reviewed plans
209
+ for plan_name in $review_plans; do
210
+ plan_name=$(echo "$plan_name" | tr -d '[:space:]')
211
+ if ! echo " $reviewed_plans " | grep -q " $plan_name "; then
212
+ reviewed_plans="$reviewed_plans $plan_name"
213
+ reviewed_plan_count=$((reviewed_plan_count + 1))
214
+ fi
215
+ done
216
+
217
+ echo " - scope: \"$scope\""
218
+ echo " type: \"$review_type\""
219
+ # Format plans as YAML array
220
+ printf " plans: ["
221
+ first="true"
222
+ for plan_name in $review_plans; do
223
+ plan_name=$(echo "$plan_name" | tr -d '[:space:]')
224
+ [ -z "$plan_name" ] && continue
225
+ if [ "$first" = "true" ]; then
226
+ printf "\"%s\"" "$plan_name"
227
+ first="false"
228
+ else
229
+ printf ", \"%s\"" "$plan_name"
230
+ fi
231
+ done
232
+ echo "]"
233
+ echo " versions: $versions"
234
+ echo " latest_version: $latest_version"
235
+ echo " latest_verdict: \"$latest_verdict\""
236
+ echo " latest_path: \"$latest_path\""
237
+ echo " has_synthesis: $has_synthesis"
238
+ done
239
+ fi
240
+ else
241
+ echo " exists: false"
242
+ fi
243
+
244
+ echo ""
245
+
116
246
  #
117
247
  # WORKFLOW STATE SUMMARY
118
248
  #
@@ -122,6 +252,14 @@ echo " has_plans: $([ "$plan_count" -gt 0 ] && echo "true" || echo "false")"
122
252
  echo " plan_count: $plan_count"
123
253
  echo " implemented_count: $implemented_count"
124
254
  echo " completed_count: $completed_count"
255
+ echo " reviewed_plan_count: $reviewed_plan_count"
256
+
257
+ # Determine if all implemented plans have been reviewed
258
+ all_reviewed="false"
259
+ if [ "$implemented_count" -gt 0 ] && [ "$reviewed_plan_count" -ge "$implemented_count" ]; then
260
+ all_reviewed="true"
261
+ fi
262
+ echo " all_reviewed: $all_reviewed"
125
263
 
126
264
  # Determine workflow state for routing
127
265
  if [ "$plan_count" -eq 0 ]; then
@@ -20,6 +20,7 @@ Pass via the orchestrator's prompt:
20
20
  4. **Plan format reading adapter path** — `../../technical-planning/references/output-formats/{format}/reading.md`
21
21
  5. **Plan format authoring adapter path** — `../../technical-planning/references/output-formats/{format}/authoring.md`
22
22
  6. **plan-index-schema.md** — `../../technical-planning/references/plan-index-schema.md`
23
+ 7. **Phase label** — `Analysis (Cycle {N})`
23
24
 
24
25
  ---
25
26
 
@@ -1,15 +1,22 @@
1
1
  # Tick: Authoring
2
2
 
3
- ## Sandbox Mode and Large Descriptions
3
+ ## Descriptions: Inline Only
4
4
 
5
- Bash heredocs (`$(cat <<'EOF'...EOF)`) create temp files that sandbox mode blocks, resulting in empty descriptions being set silently. Do **not** use `dangerouslyDisableSandbox` — it forces user approval on every call.
5
+ **CRITICAL**: Always pass descriptions directly as inline quoted strings. Never use workarounds.
6
6
 
7
- Instead, use the **Write tool + cat pattern**:
7
+ ```bash
8
+ tick create "Title" --parent <id> --description "Full description here.
9
+
10
+ Multi-line content works fine inside double quotes."
11
+ ```
8
12
 
9
- 1. Use the **Write tool** to save the description to `$TMPDIR/tick-desc.txt` — this bypasses sandbox because it uses Claude Code's file writing, not bash
10
- 2. Run the tick command with `--description "$(cat $TMPDIR/tick-desc.txt)"` in normal sandbox mode `cat` just reads, no temp files needed
13
+ **Do NOT**:
14
+ - Use heredocs (`<<'EOF'`) sandbox blocks the temp files they create
15
+ - Use the Write tool to create temp files — triggers approval prompts outside the project directory
16
+ - Use Bash functions, variables, or subshells to construct the description
17
+ - Write temp files anywhere (including `$TMPDIR`, `/tmp`, or the working directory)
11
18
 
12
- This works for both `tick create --description` and `tick update --description`.
19
+ If a description contains double quotes, escape them with `\"`. That's it.
13
20
 
14
21
  ## Task Storage
15
22
 
@@ -49,6 +49,12 @@ having it provides better context for the review.
49
49
 
50
50
  The specification is optional — the review can proceed with just the plan.
51
51
 
52
+ #### If review mode is "analysis-only"
53
+
54
+ Analysis of existing review findings was requested. The review has already been completed.
55
+
56
+ → Go directly to **Step 6**.
57
+
52
58
  ---
53
59
 
54
60
  ## Resuming After Context Refresh
@@ -135,33 +141,13 @@ Load **[invoke-product-assessor.md](references/invoke-product-assessor.md)** and
135
141
 
136
142
  ## Step 5: Produce Review
137
143
 
138
- Aggregate findings from both stages into a review document using the **[template.md](references/template.md)**.
139
-
140
- Write the review to `docs/workflow/review/{topic}.md` (single) or `docs/workflow/review/{scope-description}.md` (multi/all).
141
-
142
- **QA Verdict** (from Step 3):
143
- - **Approve** — All acceptance criteria met, no blocking issues
144
- - **Request Changes** — Missing requirements, broken functionality, inadequate tests
145
- - **Comments Only** — Minor suggestions, non-blocking observations
144
+ Load **[produce-review.md](references/produce-review.md)** and follow its instructions as written.
146
145
 
147
- **Product Assessment** (from Step 4) — always advisory, presented alongside the verdict.
148
-
149
- Commit: `review({topic}): complete review`
150
-
151
- Present the review to the user.
152
-
153
- Your review feedback can be:
154
- - Addressed by implementation (same or new session)
155
- - Delegated to an agent for fixes
156
- - Overridden by user ("ship it anyway")
157
-
158
- You produce feedback. User decides what to do with it.
146
+ Proceed to **Step 6**.
159
147
 
160
148
  ---
161
149
 
162
- ## References
150
+ ## Step 6: Review Actions
151
+
152
+ Load **[review-actions-loop.md](references/review-actions-loop.md)** and follow its instructions.
163
153
 
164
- - **[invoke-task-verifiers.md](references/invoke-task-verifiers.md)** — How to dispatch QA verifier agents
165
- - **[invoke-product-assessor.md](references/invoke-product-assessor.md)** — How to dispatch the product assessor agent
166
- - **[template.md](references/template.md)** — Review output structure and verdict guidelines
167
- - **[review-checklist.md](references/review-checklist.md)** — Per-task verification criteria (read by agents), plan completion checks, writing feedback guidance
@@ -40,7 +40,7 @@ The assessor receives:
40
40
 
41
41
  **STOP.** Do not proceed until the assessor has returned.
42
42
 
43
- The assessor writes its findings to `docs/workflow/review/{topic-or-scope}/product-assessment.md` and returns a brief status. If the agent fails (error, timeout), record the failure and continue to the review production step with QA findings only.
43
+ The assessor writes its findings to `docs/workflow/review/{scope}/r{N}/product-assessment.md` and returns a brief status. If the agent fails (error, timeout), record the failure and continue to the review production step with QA findings only.
44
44
 
45
45
  ---
46
46
 
@@ -54,4 +54,4 @@ FINDINGS_COUNT: {N}
54
54
  SUMMARY: {1 sentence}
55
55
  ```
56
56
 
57
- The full findings are in the output file. Read `docs/workflow/review/{topic-or-scope}/product-assessment.md` to incorporate into the review document.
57
+ The full findings are in the output file. Read `docs/workflow/review/{scope}/r{N}/product-assessment.md` to incorporate into the review document.
@@ -0,0 +1,64 @@
1
+ # Invoke Review Synthesizer
2
+
3
+ *Reference for **[technical-review](../SKILL.md)***
4
+
5
+ ---
6
+
7
+ This step dispatches a `review-findings-synthesizer` agent to read review findings, deduplicate, group, and normalize them into proposed tasks.
8
+
9
+ ---
10
+
11
+ ## Determine Cycle Number
12
+
13
+ Count existing `review-tasks-c*.md` files in `docs/workflow/implementation/{primary-topic}/` and add 1.
14
+
15
+ ```bash
16
+ ls docs/workflow/implementation/{primary-topic}/review-tasks-c*.md 2>/dev/null | wc -l
17
+ ```
18
+
19
+ ---
20
+
21
+ ## Invoke the Agent
22
+
23
+ **Agent path**: `../../../agents/review-findings-synthesizer.md`
24
+
25
+ Dispatch **one agent** via the Task tool.
26
+
27
+ The synthesizer receives:
28
+
29
+ 1. **Review scope** — single or multi, with plan list
30
+ 2. **Review paths** — paths to `r{N}/` directories (include summary, QA directory, product assessment)
31
+ 3. **Specification path(s)** — from each plan's frontmatter
32
+ 4. **Cycle number** — the review remediation cycle number
33
+
34
+ ---
35
+
36
+ ## Wait for Completion
37
+
38
+ **STOP.** Do not proceed until the synthesizer has returned.
39
+
40
+ If the agent fails (error, timeout), record the failure and report "synthesis failed" to the user.
41
+
42
+ ---
43
+
44
+ ## Commit Findings
45
+
46
+ Commit the report and staging file (if created):
47
+
48
+ ```
49
+ review({scope}): synthesis cycle {N} — findings
50
+ ```
51
+
52
+ ---
53
+
54
+ ## Expected Result
55
+
56
+ The synthesizer returns:
57
+
58
+ ```
59
+ STATUS: tasks_proposed | clean
60
+ TASKS_PROPOSED: {N}
61
+ SUMMARY: {1-2 sentences}
62
+ ```
63
+
64
+ The full report is at `docs/workflow/implementation/{primary-topic}/review-report-c{N}.md`. If tasks were proposed, the staging file is at `docs/workflow/implementation/{primary-topic}/review-tasks-c{N}.md`.
@@ -0,0 +1,44 @@
1
+ # Invoke Review Task Writer
2
+
3
+ *Reference for **[technical-review](../SKILL.md)***
4
+
5
+ ---
6
+
7
+ This step invokes the task writer agent to create plan tasks from approved review findings. It reuses the `implementation-analysis-task-writer` agent with a review-specific phase label.
8
+
9
+ ---
10
+
11
+ ## Determine Format
12
+
13
+ Read the `format` field from the plan's frontmatter (`docs/workflow/planning/{topic}/plan.md`). This determines which output format adapters to pass to the agent.
14
+
15
+ ---
16
+
17
+ ## Invoke the Agent
18
+
19
+ **Agent path**: `../../../agents/implementation-analysis-task-writer.md`
20
+
21
+ Pass via the orchestrator's prompt:
22
+
23
+ 1. **Topic name** — the implementation topic (scopes tasks to correct plan)
24
+ 2. **Staging file path** — `docs/workflow/implementation/{topic}/review-tasks-c{cycle-number}.md`
25
+ 3. **Plan path** — the implementation plan path
26
+ 4. **Plan format reading adapter path** — `../../technical-planning/references/output-formats/{format}/reading.md`
27
+ 5. **Plan format authoring adapter path** — `../../technical-planning/references/output-formats/{format}/authoring.md`
28
+ 6. **plan-index-schema.md** — `../../technical-planning/references/plan-index-schema.md`
29
+ 7. **Phase label** — `Review Remediation (Cycle {N})`
30
+
31
+ ---
32
+
33
+ ## Expected Result
34
+
35
+ The agent creates tasks in the plan for all approved entries in the staging file.
36
+
37
+ Returns a brief status:
38
+
39
+ ```
40
+ STATUS: complete
41
+ TASKS_CREATED: {N}
42
+ PHASE: {N}
43
+ SUMMARY: {1 sentence}
44
+ ```
@@ -32,10 +32,16 @@ From each plan in scope, list every task across all phases:
32
32
 
33
33
  ## Create Output Directory
34
34
 
35
- For each topic in scope, ensure the review output directory exists:
35
+ Ensure the review output directory exists:
36
36
 
37
37
  ```bash
38
- mkdir -p docs/workflow/review/{topic}
38
+ mkdir -p docs/workflow/review/{scope}/r{N}
39
+ ```
40
+
41
+ For multi-plan reviews, also create per-plan subdirectories:
42
+
43
+ ```bash
44
+ mkdir -p docs/workflow/review/{scope}/r{N}/{plan-topic}
39
45
  ```
40
46
 
41
47
  ---
@@ -60,8 +66,10 @@ Each verifier receives:
60
66
  3. **Plan path** — the full plan for phase context
61
67
  4. **Project skill paths** — from Step 2 discovery
62
68
  5. **Review checklist path** — `skills/technical-review/references/review-checklist.md`
63
- 6. **Topic name** — for output file path
64
- 7. **Task index** — sequential number for file naming (1, 2, 3...)
69
+ 6. **Review scope** — scope directory name for output path
70
+ 7. **Review number** — version number (e.g., 1 for `r1/`)
71
+ 8. **Plan topic** — for multi-plan reviews, the plan-specific subdirectory name
72
+ 9. **Task index** — sequential number for file naming (1, 2, 3...)
65
73
 
66
74
  If any verifier fails (error, timeout), record the failure and continue — aggregate what's available.
67
75
 
@@ -77,7 +85,7 @@ FINDINGS_COUNT: {N blocking issues}
77
85
  SUMMARY: {1 sentence}
78
86
  ```
79
87
 
80
- Full findings are written to `docs/workflow/review/{topic}/qa-task-{index}.md`.
88
+ Full findings are written to `docs/workflow/review/{scope}/r{N}/qa-task-{index}.md` (single-plan) or `docs/workflow/review/{scope}/r{N}/{plan-topic}/qa-task-{index}.md` (multi-plan).
81
89
 
82
90
  ---
83
91
 
@@ -85,7 +93,7 @@ Full findings are written to `docs/workflow/review/{topic}/qa-task-{index}.md`.
85
93
 
86
94
  Once all batches have completed:
87
95
 
88
- 1. Read all `docs/workflow/review/{topic}/qa-task-*.md` files
96
+ 1. Read all `docs/workflow/review/{scope}/r{N}/qa-task-*.md` files (and `{scope}/r{N}/{plan-topic}/qa-task-*.md` for multi-plan)
89
97
  2. Synthesize findings from file contents:
90
98
  - Collect all tasks with `STATUS: Incomplete` or `STATUS: Issues Found` as blocking issues
91
99
  - Collect all test issues (under/over-tested)
@@ -0,0 +1,27 @@
1
+ # Produce Review
2
+
3
+ *Reference for **[technical-review](../SKILL.md)***
4
+
5
+ ---
6
+
7
+ Aggregate findings from both stages into a review document using the **[template.md](template.md)**.
8
+
9
+ Write the review to `docs/workflow/review/{scope}/r{N}/review.md`. The review scope `{scope}` is the topic name (single) or a descriptive scope name (multi/all). The review number `r{N}` is passed in from the entry point.
10
+
11
+ **QA Verdict** (from Step 3):
12
+ - **Approve** — All acceptance criteria met, no blocking issues
13
+ - **Request Changes** — Missing requirements, broken functionality, inadequate tests
14
+ - **Comments Only** — Minor suggestions, non-blocking observations
15
+
16
+ **Product Assessment** (from Step 4) — always advisory, presented alongside the verdict.
17
+
18
+ Commit: `review({topic}): complete review`
19
+
20
+ Present the review to the user.
21
+
22
+ Your review feedback can be:
23
+ - Addressed by implementation (same or new session)
24
+ - Delegated to an agent for fixes
25
+ - Overridden by user ("ship it anyway")
26
+
27
+ You produce feedback. User decides what to do with it.
@@ -0,0 +1,303 @@
1
+ # Review Actions Loop
2
+
3
+ *Reference for **[technical-review](../SKILL.md)***
4
+
5
+ ---
6
+
7
+ After a review is complete, this loop synthesizes findings into actionable tasks.
8
+
9
+ Stages A through E run sequentially. Always start at **A. Verdict Gate**.
10
+
11
+ ```
12
+ A. Verdict gate (check verdicts, offer synthesis)
13
+ B. Dispatch review synthesizer → invoke-review-synthesizer.md
14
+ C. Approval gate (present tasks, approve/skip/comment)
15
+ D. Create tasks in plan → invoke-review-task-writer.md
16
+ E. Re-open implementation + plan mode handoff
17
+ ```
18
+
19
+ ---
20
+
21
+ ## A. Verdict Gate
22
+
23
+ Check the verdict(s) from the review(s) being analyzed.
24
+
25
+ #### If all verdicts are "Approve" with no required changes
26
+
27
+ > *Output the next fenced block as a code block:*
28
+
29
+ ```
30
+ No actionable findings. All reviews passed with no required changes.
31
+ ```
32
+
33
+ **STOP.** Do not proceed — terminal condition.
34
+
35
+ #### If any verdict is "Request Changes"
36
+
37
+ Blocking issues exist. Synthesis is strongly recommended.
38
+
39
+ > *Output the next fenced block as a code block:*
40
+
41
+ ```
42
+ The review found blocking issues that require changes.
43
+ Synthesizing findings into actionable tasks is recommended.
44
+ ```
45
+
46
+ > *Output the next fenced block as markdown (not a code block):*
47
+
48
+ ```
49
+ · · · · · · · · · · · ·
50
+ - **`y`/`yes`** — Synthesize findings into tasks *(recommended)*
51
+ - **`n`/`no`** — Skip synthesis
52
+
53
+ Proceed with synthesis?
54
+ · · · · · · · · · · · ·
55
+ ```
56
+
57
+ **STOP.** Wait for user response.
58
+
59
+ #### If yes
60
+
61
+ → Proceed to **B. Dispatch Review Synthesizer**.
62
+
63
+ #### If no
64
+
65
+ **STOP.** Do not proceed — terminal condition.
66
+
67
+ #### If verdict is "Comments Only"
68
+
69
+ Non-blocking improvements only. Synthesis is optional.
70
+
71
+ > *Output the next fenced block as a code block:*
72
+
73
+ ```
74
+ The review found non-blocking suggestions only.
75
+ You can synthesize these into tasks or skip.
76
+ ```
77
+
78
+ > *Output the next fenced block as markdown (not a code block):*
79
+
80
+ ```
81
+ · · · · · · · · · · · ·
82
+ - **`y`/`yes`** — Synthesize findings into tasks
83
+ - **`n`/`no`** — Skip synthesis *(default)*
84
+
85
+ Synthesize non-blocking findings?
86
+ · · · · · · · · · · · ·
87
+ ```
88
+
89
+ **STOP.** Wait for user response.
90
+
91
+ #### If yes
92
+
93
+ → Proceed to **B. Dispatch Review Synthesizer**.
94
+
95
+ #### If no
96
+
97
+ **STOP.** Do not proceed — terminal condition.
98
+
99
+ ---
100
+
101
+ ## B. Dispatch Review Synthesizer
102
+
103
+ Load **[invoke-review-synthesizer.md](invoke-review-synthesizer.md)** and follow its instructions.
104
+
105
+ **STOP.** Do not proceed until the synthesizer has returned.
106
+
107
+ #### If STATUS is "clean"
108
+
109
+ > *Output the next fenced block as a code block:*
110
+
111
+ ```
112
+ No actionable tasks synthesized.
113
+ ```
114
+
115
+ **STOP.** Do not proceed — terminal condition.
116
+
117
+ #### If STATUS is "tasks_proposed"
118
+
119
+ → Proceed to **C. Approval Gate**.
120
+
121
+ ---
122
+
123
+ ## C. Approval Gate
124
+
125
+ Read the staging file from `docs/workflow/implementation/{primary-topic}/review-tasks-c{cycle-number}.md`.
126
+
127
+ Check `gate_mode` in the staging file frontmatter (`gated` or `auto`).
128
+
129
+ Present an overview. For multi-plan reviews, group tasks by plan:
130
+
131
+ > *Output the next fenced block as a code block:*
132
+
133
+ ```
134
+ Review synthesis cycle {N}: {K} proposed tasks
135
+
136
+ {plan-topic}:
137
+ 1. {title} ({severity})
138
+ 2. {title} ({severity})
139
+
140
+ {plan-topic-2}:
141
+ 3. {title} ({severity})
142
+ ```
143
+
144
+ Then present each task with `status: pending` individually:
145
+
146
+ > *Output the next fenced block as markdown (not a code block):*
147
+
148
+ ```
149
+ **Task {current}/{total}: {title}** ({severity}) — Plan: {plan-topic}
150
+ Sources: {sources}
151
+
152
+ **Problem**: {problem}
153
+ **Solution**: {solution}
154
+ **Outcome**: {outcome}
155
+
156
+ **Do**:
157
+ {steps}
158
+
159
+ **Acceptance Criteria**:
160
+ {criteria}
161
+
162
+ **Tests**:
163
+ {tests}
164
+ ```
165
+
166
+ #### If gate_mode is "gated"
167
+
168
+ > *Output the next fenced block as markdown (not a code block):*
169
+
170
+ ```
171
+ · · · · · · · · · · · ·
172
+ - **`a`/`approve`** — Approve this task
173
+ - **`auto`** — Approve this and all remaining tasks automatically
174
+ - **`s`/`skip`** — Skip this task
175
+ - **Comment** — Revise based on feedback
176
+ · · · · · · · · · · · ·
177
+ ```
178
+
179
+ **STOP.** Wait for user input.
180
+
181
+ #### If gate_mode is "auto"
182
+
183
+ > *Output the next fenced block as a code block:*
184
+
185
+ ```
186
+ Task {current} of {total}: {title} — approved (auto).
187
+ ```
188
+
189
+ → Continue to next task without stopping.
190
+
191
+ ---
192
+
193
+ Process user input:
194
+
195
+ #### If `approve`
196
+
197
+ Update `status: approved` in the staging file.
198
+
199
+ → Present the next pending task, or proceed to routing below if all tasks processed.
200
+
201
+ #### If `auto`
202
+
203
+ Update `status: approved` in the staging file. Update `gate_mode: auto` in the staging file frontmatter.
204
+
205
+ → Continue processing remaining tasks without stopping.
206
+
207
+ #### If `skip`
208
+
209
+ Update `status: skipped` in the staging file.
210
+
211
+ → Present the next pending task, or proceed to routing below if all tasks processed.
212
+
213
+ #### If comment
214
+
215
+ Revise the task content in the staging file based on the user's feedback. Re-present this task.
216
+
217
+ ---
218
+
219
+ After all tasks processed:
220
+
221
+ → If any tasks have `status: approved`, proceed to **D. Create Tasks in Plan**.
222
+
223
+ → If all tasks were skipped:
224
+
225
+ Commit the staging file updates:
226
+
227
+ ```
228
+ review({scope}): synthesis cycle {N} — tasks skipped
229
+ ```
230
+
231
+ **STOP.** Do not proceed — terminal condition.
232
+
233
+ ---
234
+
235
+ ## D. Create Tasks in Plan
236
+
237
+ For each plan that has approved tasks in the staging file, invoke the task writer.
238
+
239
+ Process plans sequentially — each writes to a different plan.
240
+
241
+ For each plan:
242
+
243
+ 1. Filter staging file to tasks with `plan: {plan-topic}` and `status: approved`
244
+ 2. Load **[invoke-review-task-writer.md](invoke-review-task-writer.md)** and follow its instructions
245
+ 3. Wait for the task writer to return before processing the next plan
246
+
247
+ **STOP.** Do not proceed until all task writers have returned.
248
+
249
+ Commit all changes (staging file, plan tasks, Plan Index Files):
250
+
251
+ ```
252
+ review({scope}): add review remediation ({K} tasks across {P} plans)
253
+ ```
254
+
255
+ → Proceed to **E. Re-open Implementation + Plan Mode Handoff**.
256
+
257
+ ---
258
+
259
+ ## E. Re-open Implementation + Plan Mode Handoff
260
+
261
+ For each plan that received new tasks:
262
+
263
+ 1. Read the implementation tracking file at `docs/workflow/implementation/{topic}/tracking.md`
264
+ 2. Update frontmatter:
265
+ - `status: in-progress`
266
+ - Remove `completed` field (if present)
267
+ - `updated: {today's date}`
268
+ - `analysis_cycle: 0`
269
+ 3. Commit tracking changes:
270
+
271
+ ```
272
+ review({scope}): re-open implementation tracking
273
+ ```
274
+
275
+ Then enter plan mode and write the following plan:
276
+
277
+ ```
278
+ # Review Actions Complete: {scope}
279
+
280
+ Review findings have been synthesized into {N} implementation tasks.
281
+
282
+ ## Summary
283
+
284
+ {Per-plan summary, e.g., "tick-core: 3 tasks in Phase 9", "installation: 1 task in Phase 6"}
285
+
286
+ ## Instructions
287
+
288
+ 1. Invoke `/start-implementation`
289
+ 2. The skill will detect the new tasks and start executing them
290
+
291
+ ## Context
292
+
293
+ - Plans updated: {list of plan topics}
294
+ - Tasks created: {total count}
295
+ - Implementation tracking: re-opened for each plan
296
+
297
+ ## How to proceed
298
+
299
+ Clear context and continue. Claude will start implementation
300
+ and pick up the new review remediation tasks automatically.
301
+ ```
302
+
303
+ Exit plan mode. The user will approve and clear context, and the fresh session will pick up with `/start-implementation` routing to the new tasks.