taketomarket 0.1.0

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 (123) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/LICENSE +21 -0
  3. package/README.md +419 -0
  4. package/agents/ttm-producer.md +53 -0
  5. package/bin/lib/campaign.cjs +553 -0
  6. package/bin/lib/commit.cjs +105 -0
  7. package/bin/lib/core.cjs +172 -0
  8. package/bin/lib/deviation.cjs +149 -0
  9. package/bin/lib/drift-log.cjs +219 -0
  10. package/bin/lib/health.cjs +438 -0
  11. package/bin/lib/slug.cjs +59 -0
  12. package/bin/lib/state.cjs +96 -0
  13. package/bin/ttm-tools.cjs +157 -0
  14. package/gates/base-gates.md +266 -0
  15. package/gates/discipline/.gitkeep +0 -0
  16. package/gates/gate-evaluation.md +341 -0
  17. package/gates/meta-gates.md +19 -0
  18. package/install.js +307 -0
  19. package/package.json +53 -0
  20. package/playbooks/.gitkeep +0 -0
  21. package/playbooks/aeo.md +223 -0
  22. package/playbooks/affiliate.md +272 -0
  23. package/playbooks/base.md +110 -0
  24. package/playbooks/email.md +306 -0
  25. package/playbooks/events.md +320 -0
  26. package/playbooks/linkedin.md +263 -0
  27. package/playbooks/paid-ads.md +318 -0
  28. package/playbooks/pr-media.md +296 -0
  29. package/playbooks/seo.md +284 -0
  30. package/playbooks/social.md +305 -0
  31. package/playbooks/youtube.md +325 -0
  32. package/references/context-loading.md +107 -0
  33. package/references/learnings-extraction.md +94 -0
  34. package/references/measurement-template.md +48 -0
  35. package/references/meta-gate-evaluation.md +169 -0
  36. package/references/positioning-check-report.md +197 -0
  37. package/references/review-checklist.md +78 -0
  38. package/references/ship-checklist-items.md +94 -0
  39. package/settings.json +4 -0
  40. package/skills/ttm-aeo-check/SKILL.md +20 -0
  41. package/skills/ttm-affiliate-kit/SKILL.md +19 -0
  42. package/skills/ttm-archive/SKILL.md +13 -0
  43. package/skills/ttm-brand-refresh/SKILL.md +19 -0
  44. package/skills/ttm-brief/SKILL.md +14 -0
  45. package/skills/ttm-competitor-scan/SKILL.md +19 -0
  46. package/skills/ttm-email-preflight/SKILL.md +19 -0
  47. package/skills/ttm-fix/SKILL.md +13 -0
  48. package/skills/ttm-health/SKILL.md +12 -0
  49. package/skills/ttm-icp-refresh/SKILL.md +19 -0
  50. package/skills/ttm-init/SKILL.md +12 -0
  51. package/skills/ttm-keyword-map/SKILL.md +19 -0
  52. package/skills/ttm-learn/SKILL.md +14 -0
  53. package/skills/ttm-measure/SKILL.md +14 -0
  54. package/skills/ttm-new-campaign/SKILL.md +13 -0
  55. package/skills/ttm-next/SKILL.md +12 -0
  56. package/skills/ttm-positioning-check/SKILL.md +19 -0
  57. package/skills/ttm-positioning-shift/SKILL.md +19 -0
  58. package/skills/ttm-produce/SKILL.md +14 -0
  59. package/skills/ttm-repurpose/SKILL.md +20 -0
  60. package/skills/ttm-research/SKILL.md +13 -0
  61. package/skills/ttm-resume/SKILL.md +13 -0
  62. package/skills/ttm-review/SKILL.md +13 -0
  63. package/skills/ttm-seo-audit/SKILL.md +20 -0
  64. package/skills/ttm-ship/SKILL.md +13 -0
  65. package/skills/ttm-state/SKILL.md +13 -0
  66. package/skills/ttm-verify/SKILL.md +14 -0
  67. package/templates/agents-md.md +65 -0
  68. package/templates/campaign-brief.md +74 -0
  69. package/templates/campaign-research.md +39 -0
  70. package/templates/campaign-state.md +40 -0
  71. package/templates/claude-md.md +65 -0
  72. package/templates/deviation-log.md +12 -0
  73. package/templates/drift-log.md +17 -0
  74. package/templates/fix-brief.md +59 -0
  75. package/templates/fix-log.md +22 -0
  76. package/templates/measurement-report.md +75 -0
  77. package/templates/migration-plan.md +24 -0
  78. package/templates/production-manifest.json +20 -0
  79. package/templates/reference-files/brand.md +45 -0
  80. package/templates/reference-files/calendar.md +30 -0
  81. package/templates/reference-files/channels.md +40 -0
  82. package/templates/reference-files/competitors.md +40 -0
  83. package/templates/reference-files/icp.md +50 -0
  84. package/templates/reference-files/learnings.md +40 -0
  85. package/templates/reference-files/metrics.md +42 -0
  86. package/templates/reference-files/positioning.md +38 -0
  87. package/templates/reference-files/state.md +27 -0
  88. package/templates/verification-report.md +59 -0
  89. package/workflows/discipline/.gitkeep +0 -0
  90. package/workflows/discipline/aeo-check.md +180 -0
  91. package/workflows/discipline/affiliate-kit.md +147 -0
  92. package/workflows/discipline/email-preflight.md +150 -0
  93. package/workflows/discipline/keyword-map.md +125 -0
  94. package/workflows/discipline/repurpose.md +329 -0
  95. package/workflows/discipline/seo-audit.md +169 -0
  96. package/workflows/lifecycle/.gitkeep +0 -0
  97. package/workflows/lifecycle/brief-positioning-check.md +90 -0
  98. package/workflows/lifecycle/brief.md +355 -0
  99. package/workflows/lifecycle/fix.md +495 -0
  100. package/workflows/lifecycle/learn.md +405 -0
  101. package/workflows/lifecycle/measure.md +379 -0
  102. package/workflows/lifecycle/produce.md +383 -0
  103. package/workflows/lifecycle/research.md +264 -0
  104. package/workflows/lifecycle/review.md +432 -0
  105. package/workflows/lifecycle/ship.md +521 -0
  106. package/workflows/lifecycle/verify.md +507 -0
  107. package/workflows/reference-mgmt/.gitkeep +0 -0
  108. package/workflows/reference-mgmt/brand-refresh.md +193 -0
  109. package/workflows/reference-mgmt/competitor-scan.md +228 -0
  110. package/workflows/reference-mgmt/icp-refresh.md +200 -0
  111. package/workflows/reference-mgmt/positioning-check.md +339 -0
  112. package/workflows/reference-mgmt/positioning-shift.md +368 -0
  113. package/workflows/setup/.gitkeep +0 -0
  114. package/workflows/setup/init-questions.md +225 -0
  115. package/workflows/setup/init-validation.md +155 -0
  116. package/workflows/setup/init.md +449 -0
  117. package/workflows/setup/new-campaign.md +134 -0
  118. package/workflows/utility/.gitkeep +0 -0
  119. package/workflows/utility/archive.md +334 -0
  120. package/workflows/utility/health.md +166 -0
  121. package/workflows/utility/next.md +187 -0
  122. package/workflows/utility/resume.md +249 -0
  123. package/workflows/utility/state.md +207 -0
@@ -0,0 +1,432 @@
1
+ <purpose>
2
+ Review workflow for /ttm-review. Presents verified assets with structured
3
+ review checklist for human evaluation (LIFE-10). Collects per-asset outcomes
4
+ (Approve/Revise/Reject per D-03) with hero-first ordering (D-02). Structured
5
+ revision feedback on Revise (D-12). Auto-triggers /ttm-fix for revised assets (D-15).
6
+ </purpose>
7
+
8
+ <required_reading>
9
+ @${CLAUDE_PLUGIN_ROOT}/references/context-loading.md
10
+ @${CLAUDE_PLUGIN_ROOT}/references/review-checklist.md
11
+ </required_reading>
12
+
13
+ <constraints>
14
+ ## POSITIONING.md is READ-ONLY
15
+
16
+ **Do NOT modify `.marketing/POSITIONING.md` during this workflow.**
17
+
18
+ POSITIONING.md is an architectural invariant. If you detect positioning drift:
19
+ - In verify: use the Escalate option to launch /ttm-positioning-shift
20
+ - In other workflows: flag the issue and recommend running /ttm-positioning-check
21
+
22
+ Only /ttm-positioning-shift and /ttm-init may modify POSITIONING.md.
23
+ </constraints>
24
+
25
+ <process>
26
+
27
+ ## Text-Mode Detection
28
+
29
+ **Text mode (`--text` flag):** Set `TEXT_MODE=true` if `--text` is present in `$ARGUMENTS`
30
+ or if the runtime is not Claude Code. When TEXT_MODE is active, replace every
31
+ `AskUserQuestion` call with a plain-text numbered list.
32
+
33
+ Detection:
34
+ ```bash
35
+ if echo "$ARGUMENTS" | grep -q -- '--text'; then TEXT_MODE=true; fi
36
+ ```
37
+
38
+ If `AskUserQuestion` tool is not available in the current runtime, set `TEXT_MODE=true`.
39
+
40
+ When TEXT_MODE is active, replace each AskUserQuestion with a plain-text numbered list:
41
+ ```
42
+ [HEADER]
43
+ [QUESTION]
44
+ 1. [OPTION_1_LABEL] -- [OPTION_1_DESCRIPTION]
45
+ 2. [OPTION_2_LABEL] -- [OPTION_2_DESCRIPTION]
46
+ ...
47
+ Type the number of your choice:
48
+ ```
49
+
50
+ ---
51
+
52
+ ## Step 1: Load Context
53
+
54
+ ```
55
+ takeToMarket > LOADING CONTEXT
56
+ ```
57
+
58
+ Extract SLUG from $ARGUMENTS (strip `--text` flag if present):
59
+ ```bash
60
+ SLUG=$(echo "$ARGUMENTS" | sed 's/--text//g' | xargs)
61
+ ```
62
+
63
+ If SLUG is empty, error: "Usage: /ttm-review [campaign-slug]. Provide a campaign slug." Exit.
64
+
65
+ **Load Tier 1 summaries** from all 9 reference files (lines 1 to `<!-- END_SUMMARY -->`):
66
+ - `.marketing/POSITIONING.md`
67
+ - `.marketing/BRAND.md`
68
+ - `.marketing/ICP.md`
69
+ - `.marketing/CHANNELS.md`
70
+ - `.marketing/STATE.md` (frontmatter only)
71
+ - `.marketing/CALENDAR.md`
72
+ - `.marketing/COMPETITORS.md`
73
+ - `.marketing/METRICS.md`
74
+ - `.marketing/LEARNINGS.md`
75
+
76
+ **Tier 2:** None for review (per context-loading.md matrix -- review is human-driven).
77
+
78
+ **Load campaign-specific files** (always full-load per context-loading.md rule 4):
79
+ - `.marketing/CAMPAIGNS/${SLUG}/STATE.md`
80
+ - `.marketing/CAMPAIGNS/${SLUG}/BRIEF.md`
81
+
82
+ **Load MANIFEST.json:**
83
+ ```bash
84
+ MANIFEST_PATH=".marketing/CAMPAIGNS/${SLUG}/MANIFEST.json"
85
+ ```
86
+
87
+ Read `.marketing/CAMPAIGNS/${SLUG}/MANIFEST.json`. If the file does not exist, error:
88
+ "No production manifest found for campaign '${SLUG}'. Run /ttm-produce first."
89
+ Exit.
90
+
91
+ **Load VERIFICATION.md:**
92
+ Read `.marketing/CAMPAIGNS/${SLUG}/VERIFICATION.md`. If the file does not exist, error:
93
+ "No verification report found for campaign '${SLUG}'. Run /ttm-verify first."
94
+ Exit.
95
+
96
+ ---
97
+
98
+ ## Step 2: Validate Campaign State
99
+
100
+ ```
101
+ takeToMarket > VALIDATING CAMPAIGN
102
+ ```
103
+
104
+ Check campaign exists:
105
+ ```bash
106
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" campaign state "${SLUG}" --raw
107
+ ```
108
+
109
+ If result shows `exists: false`: Tell the user the campaign does not exist and suggest
110
+ running `/ttm-new-campaign` first. Exit.
111
+
112
+ Read campaign state. Check the `phase` field:
113
+ - If phase is NOT `"verified"`: Warn the user:
114
+ "Campaign is in phase '${PHASE}'. Expected 'verified' before review.
115
+ Running /ttm-review now may produce incomplete results. Proceed?"
116
+ Wait for user confirmation via AskUserQuestion (or text-mode prompt).
117
+ If user declines, exit.
118
+
119
+ **Determine review run number:**
120
+ Read `review.run_count` from state. If null or 0, set `RUN_NUMBER=1`.
121
+ Otherwise set `RUN_NUMBER` to `review.run_count + 1`.
122
+
123
+ ---
124
+
125
+ ## Step 3: Load Assets and Verification Results
126
+
127
+ ```
128
+ takeToMarket > LOADING ASSETS AND GATE RESULTS
129
+ ```
130
+
131
+ **Parse MANIFEST.json** for the asset list. The manifest contains a `hero` object
132
+ and a `derivatives` array:
133
+
134
+ ```
135
+ HERO = { name: manifest.hero.name, file: manifest.hero.file, type: manifest.hero.type }
136
+ DERIVATIVES = []
137
+ for each derivative in manifest.derivatives:
138
+ DERIVATIVES.push({ name: derivative.name, file: derivative.file, type: derivative.type })
139
+ ALL_ASSETS = [HERO] + DERIVATIVES
140
+ ```
141
+
142
+ **Parse VERIFICATION.md** for gate results. Extract the summary table to get per-asset
143
+ PASS/WARN/FAIL counts and overall result for each gate. Build a lookup:
144
+ ```
145
+ GATE_RESULTS[asset_name] = {
146
+ gates: [ { gate_name, gate_id, result: PASS|WARN|FAIL }, ... ],
147
+ pass_count, warn_count, fail_count,
148
+ overall: PASS|WARN|FAIL
149
+ }
150
+ ```
151
+
152
+ **Load content previews** from disk. For each asset:
153
+ - Read the file from `.marketing/CAMPAIGNS/${SLUG}/${asset.file}`
154
+ - Extract the first ~500 characters for the hero, first ~300 characters for derivatives (D-04)
155
+ - If an asset file is missing from disk, display warning and skip it
156
+
157
+ If ALL asset files are missing: Error: "No asset files found on disk. Re-run /ttm-produce."
158
+ Exit.
159
+
160
+ ---
161
+
162
+ ## Step 4: Review Hero Asset (D-02)
163
+
164
+ ```
165
+ takeToMarket > REVIEW: Hero Asset
166
+ ```
167
+
168
+ Display the hero asset in full detail:
169
+
170
+ ```
171
+ ## [HERO_ASSET_NAME]
172
+ File: .marketing/CAMPAIGNS/${SLUG}/${HERO_FILE}
173
+
174
+ ### Gate Summary
175
+ | Gate | Result |
176
+ |------|--------|
177
+ | Positioning Drift (GATE-01) | [PASS|WARN|FAIL] |
178
+ | Claim Accuracy (GATE-02) | [PASS|WARN|FAIL] |
179
+ | Voice Drift (GATE-03) | [PASS|WARN|FAIL] |
180
+ | Outcome Alignment (GATE-04) | [PASS|WARN|FAIL] |
181
+ | Funnel Integrity (GATE-05) | [PASS|WARN|FAIL|N/A] |
182
+ | UTM Hygiene (GATE-06) | [PASS|WARN|FAIL|N/A] |
183
+ | Compliance (GATE-07) | [PASS|WARN|FAIL|N/A] |
184
+ | Competitor Collision (GATE-08) | [PASS|WARN|FAIL] |
185
+ | ICP Fit (GATE-09) | [PASS|WARN|FAIL] |
186
+ | Format Correctness (GATE-10) | [PASS|WARN|FAIL] |
187
+
188
+ ### Content Preview
189
+ [First ~500 characters of the asset]
190
+ [Full file: .marketing/CAMPAIGNS/${SLUG}/${HERO_FILE}]
191
+ ```
192
+
193
+ **Present the 4 mandatory review questions** from review-checklist.md. Use
194
+ AskUserQuestion (or text-mode prompt) for each question. All 4 are REQUIRED --
195
+ the reviewer must answer each one before selecting an outcome.
196
+
197
+ ### Question 1: Positioning Reinforcement
198
+ Using AskUserQuestion (or text-mode), ask:
199
+ "Does this asset reinforce your positioning -- your primary differentiator, target
200
+ audience, and category? Identify any claims that go beyond or contradict POSITIONING.md."
201
+
202
+ Record the answer.
203
+
204
+ ### Question 2: Outcome Realism
205
+ "Is the outcome metric target realistic given this content? Could this asset
206
+ plausibly drive the defined outcome (e.g., demo requests, signups, pipeline)?"
207
+
208
+ Record the answer.
209
+
210
+ ### Question 3: Claim Substantiation
211
+ "Are all factual claims, statistics, and proof points substantiated by approved
212
+ data in BRAND.md? Flag any unverifiable or unsourced claims."
213
+
214
+ Record the answer.
215
+
216
+ ### Question 4: Competitor Differentiation
217
+ "Does this asset clearly differentiate from competitors? Could a competitor
218
+ publish this same content with their name swapped in?"
219
+
220
+ Record the answer.
221
+
222
+ ### Freeform Notes (Optional)
223
+ "Any additional feedback, concerns, or suggestions? (Press enter to skip)"
224
+
225
+ Record notes if provided.
226
+
227
+ ### Collect Hero Outcome (D-03)
228
+ Present outcome selection using AskUserQuestion (or text-mode numbered list):
229
+ ```
230
+ Select outcome for [HERO_ASSET_NAME]:
231
+ 1. Approve -- asset is ready for shipping
232
+ 2. Revise -- asset needs changes (you will provide structured feedback next)
233
+ 3. Reject -- asset is fundamentally wrong (final, no fix loop)
234
+ ```
235
+
236
+ **If outcome is Approve:**
237
+ Set hero `review_status` = `"approved"` in memory.
238
+
239
+ **If outcome is Revise:**
240
+ Collect structured revision feedback per D-12 (see review-checklist.md):
241
+
242
+ 1. Ask: "Which review questions did this asset fail? (select numbers, e.g., 1,3)"
243
+ Options: 1=Positioning reinforcement, 2=Outcome realism, 3=Claim substantiation,
244
+ 4=Competitor differentiation
245
+
246
+ 2. Ask: "Severity? 1=Minor (small adjustments), 2=Major (significant rewrite),
247
+ 3=Critical (fundamental approach is wrong)"
248
+
249
+ 3. Ask: "What specifically needs to change? Be as concrete as possible -- reference
250
+ specific sections, sentences, or claims."
251
+
252
+ Set hero `review_status` = `"needs-fix"` in memory.
253
+
254
+ Write the structured feedback to `.marketing/CAMPAIGNS/${SLUG}/REVIEW-FEEDBACK-${HERO_NAME}.md`:
255
+ ```markdown
256
+ # Review Feedback: [HERO_ASSET_NAME]
257
+
258
+ **Campaign:** [SLUG]
259
+ **Date:** [ISO_TIMESTAMP]
260
+ **Reviewer outcome:** Revise
261
+ **Severity:** [Minor|Major|Critical]
262
+
263
+ ## Failed Checklist Items
264
+ - [x] Positioning reinforcement (if selected)
265
+ - [x] Outcome realism (if selected)
266
+ - [x] Claim substantiation (if selected)
267
+ - [x] Competitor differentiation (if selected)
268
+
269
+ ## Specific Feedback
270
+ [User's freeform feedback text]
271
+
272
+ ## Gate Failures (from VERIFICATION.md)
273
+ [Extract relevant WARN/FAIL findings for this asset from VERIFICATION.md]
274
+ ```
275
+
276
+ **If outcome is Reject:**
277
+ Ask: "Why are you rejecting this asset? (This will be logged permanently.)"
278
+ Set hero `review_status` = `"rejected"` in memory.
279
+ Record the rejection reason.
280
+
281
+ ---
282
+
283
+ ## Step 5: Batch Review Derivatives (D-02, D-13)
284
+
285
+ If there are no derivative assets, skip this step.
286
+
287
+ ```
288
+ takeToMarket > REVIEW: Derivative Assets
289
+
290
+ Reviewing ${N} derivatives. Hero asset for reference: ${HERO_FILE}
291
+ ```
292
+
293
+ For each derivative asset:
294
+
295
+ ### Display Abbreviated View
296
+ Show abbreviated gate summary (PASS count / WARN count / FAIL count -- not full table):
297
+ ```
298
+ ## [DERIVATIVE_NAME]
299
+ File: .marketing/CAMPAIGNS/${SLUG}/${DERIVATIVE_FILE}
300
+ Gates: ${PASS_COUNT} PASS / ${WARN_COUNT} WARN / ${FAIL_COUNT} FAIL
301
+
302
+ ### Content Preview
303
+ [First ~300 characters of the asset]
304
+ [Full file: .marketing/CAMPAIGNS/${SLUG}/${DERIVATIVE_FILE}]
305
+ ```
306
+
307
+ ### Review Questions (Batch Mode)
308
+ Present the same 4 mandatory questions from review-checklist.md. In batch mode,
309
+ answers can be shorter but all 4 are still required.
310
+
311
+ ### Freeform Notes (Optional)
312
+ "Any additional feedback? (Press enter to skip)"
313
+
314
+ ### Collect Derivative Outcome
315
+ Same 3 outcome options (Approve/Revise/Reject) per D-03.
316
+
317
+ If **Approve**: Set derivative `review_status` = `"approved"` in memory.
318
+
319
+ If **Revise**: Collect same structured revision feedback (failed items, severity,
320
+ specific feedback). Write to `.marketing/CAMPAIGNS/${SLUG}/REVIEW-FEEDBACK-${DERIVATIVE_NAME}.md`.
321
+ Set derivative `review_status` = `"needs-fix"` in memory.
322
+
323
+ If **Reject**: Collect rejection reason. Set derivative `review_status` = `"rejected"` in memory.
324
+
325
+ ---
326
+
327
+ ## Step 6: Update MANIFEST.json with Review Status (D-11, D-13)
328
+
329
+ Read MANIFEST.json from `.marketing/CAMPAIGNS/${SLUG}/MANIFEST.json`.
330
+
331
+ Add `review_status` field to hero and each derivative:
332
+ - `"approved"` for Approve outcomes
333
+ - `"needs-fix"` for Revise outcomes
334
+ - `"rejected"` for Reject outcomes
335
+
336
+ For Revise outcomes, also add `review_feedback_file` pointing to the feedback file:
337
+ ```json
338
+ {
339
+ "hero": {
340
+ ...existing fields...,
341
+ "review_status": "approved|needs-fix|rejected",
342
+ "review_feedback_file": "REVIEW-FEEDBACK-[NAME].md"
343
+ },
344
+ "derivatives": [
345
+ {
346
+ ...existing fields...,
347
+ "review_status": "approved|needs-fix|rejected",
348
+ "review_feedback_file": "REVIEW-FEEDBACK-[NAME].md"
349
+ }
350
+ ]
351
+ }
352
+ ```
353
+
354
+ Write the updated MANIFEST.json back to disk.
355
+
356
+ ---
357
+
358
+ ## Step 7: Update Campaign State
359
+
360
+ **Determine overall result:**
361
+ - `approved` -- all assets approved (no Revise, no Reject)
362
+ - `needs-fix` -- all non-rejected assets need fix
363
+ - `mixed` -- some approved, some need fix, some rejected
364
+
365
+ ```bash
366
+ TIMESTAMP=$(node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" timestamp --raw)
367
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" campaign update "${SLUG}" review.run_count "${RUN_NUMBER}"
368
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" campaign update "${SLUG}" review.last_run "$TIMESTAMP"
369
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" campaign update "${SLUG}" review.overall_result "[approved|mixed|needs-fix]"
370
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" campaign update "${SLUG}" phase reviewed
371
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" campaign update "${SLUG}" phase.reviewed "$TIMESTAMP"
372
+ ```
373
+
374
+ ---
375
+
376
+ ## Step 8: Display Completion and Next Steps (D-15)
377
+
378
+ ```
379
+ takeToMarket > REVIEW COMPLETE
380
+
381
+ Run: ${RUN_NUMBER} | Date: ${ISO_DATE}
382
+ Assets reviewed: ${TOTAL}
383
+ Approved: ${APPROVE_COUNT}
384
+ Needs fix: ${REVISE_COUNT}
385
+ Rejected: ${REJECT_COUNT}
386
+ ```
387
+
388
+ **If any assets were rejected:**
389
+ ```
390
+ Rejected assets logged. These will not enter the fix loop.
391
+ ```
392
+
393
+ **If all assets approved:**
394
+ ```
395
+ All assets approved! Run `/ttm-ship ${SLUG}` to launch.
396
+ ```
397
+
398
+ **If any assets need fix (D-15):**
399
+ ```
400
+ Run `/ttm-fix ${SLUG}` to fix ${REVISE_COUNT} asset(s) with review feedback.
401
+ ```
402
+
403
+ Per D-15, the auto-trigger is an instruction to the user to run /ttm-fix next.
404
+ The review workflow completes here -- /ttm-fix is a separate command invoked
405
+ by the user (review.md is NOT forked and cannot directly invoke /ttm-fix).
406
+
407
+ **If mixed results (some approved, some need fix):**
408
+ ```
409
+ ${APPROVE_COUNT} asset(s) approved and ready for shipping.
410
+ ${REVISE_COUNT} asset(s) need fixes. Run `/ttm-fix ${SLUG}` to address review feedback.
411
+ After fixes, approved + fixed assets can ship together via `/ttm-ship ${SLUG}`.
412
+ ```
413
+
414
+ </process>
415
+
416
+ <success_criteria>
417
+ - [ ] All assets from MANIFEST.json presented with gate summary and content preview
418
+ - [ ] 4 mandatory review questions asked per asset (positioning, outcome, claims, differentiation)
419
+ - [ ] Hero reviewed first in full detail, then derivatives in batch (D-02)
420
+ - [ ] Per-asset outcome collected: Approve, Revise, or Reject (D-03, D-13)
421
+ - [ ] Structured revision feedback captured for Revise outcomes (D-12)
422
+ - [ ] REVIEW-FEEDBACK-[NAME].md written for each revised asset
423
+ - [ ] MANIFEST.json updated with review_status per asset (D-11)
424
+ - [ ] Campaign state updated: review.run_count, review.last_run, review.overall_result
425
+ - [ ] Campaign phase advanced to "reviewed"
426
+ - [ ] User directed to /ttm-fix for any revised assets (D-15)
427
+ </success_criteria>
428
+
429
+ <output>
430
+ - `.marketing/CAMPAIGNS/${SLUG}/MANIFEST.json` (updated with review_status per asset)
431
+ - `.marketing/CAMPAIGNS/${SLUG}/REVIEW-FEEDBACK-*.md` (one per revised asset)
432
+ </output>