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.
- package/.claude-plugin/plugin.json +10 -0
- package/LICENSE +21 -0
- package/README.md +419 -0
- package/agents/ttm-producer.md +53 -0
- package/bin/lib/campaign.cjs +553 -0
- package/bin/lib/commit.cjs +105 -0
- package/bin/lib/core.cjs +172 -0
- package/bin/lib/deviation.cjs +149 -0
- package/bin/lib/drift-log.cjs +219 -0
- package/bin/lib/health.cjs +438 -0
- package/bin/lib/slug.cjs +59 -0
- package/bin/lib/state.cjs +96 -0
- package/bin/ttm-tools.cjs +157 -0
- package/gates/base-gates.md +266 -0
- package/gates/discipline/.gitkeep +0 -0
- package/gates/gate-evaluation.md +341 -0
- package/gates/meta-gates.md +19 -0
- package/install.js +307 -0
- package/package.json +53 -0
- package/playbooks/.gitkeep +0 -0
- package/playbooks/aeo.md +223 -0
- package/playbooks/affiliate.md +272 -0
- package/playbooks/base.md +110 -0
- package/playbooks/email.md +306 -0
- package/playbooks/events.md +320 -0
- package/playbooks/linkedin.md +263 -0
- package/playbooks/paid-ads.md +318 -0
- package/playbooks/pr-media.md +296 -0
- package/playbooks/seo.md +284 -0
- package/playbooks/social.md +305 -0
- package/playbooks/youtube.md +325 -0
- package/references/context-loading.md +107 -0
- package/references/learnings-extraction.md +94 -0
- package/references/measurement-template.md +48 -0
- package/references/meta-gate-evaluation.md +169 -0
- package/references/positioning-check-report.md +197 -0
- package/references/review-checklist.md +78 -0
- package/references/ship-checklist-items.md +94 -0
- package/settings.json +4 -0
- package/skills/ttm-aeo-check/SKILL.md +20 -0
- package/skills/ttm-affiliate-kit/SKILL.md +19 -0
- package/skills/ttm-archive/SKILL.md +13 -0
- package/skills/ttm-brand-refresh/SKILL.md +19 -0
- package/skills/ttm-brief/SKILL.md +14 -0
- package/skills/ttm-competitor-scan/SKILL.md +19 -0
- package/skills/ttm-email-preflight/SKILL.md +19 -0
- package/skills/ttm-fix/SKILL.md +13 -0
- package/skills/ttm-health/SKILL.md +12 -0
- package/skills/ttm-icp-refresh/SKILL.md +19 -0
- package/skills/ttm-init/SKILL.md +12 -0
- package/skills/ttm-keyword-map/SKILL.md +19 -0
- package/skills/ttm-learn/SKILL.md +14 -0
- package/skills/ttm-measure/SKILL.md +14 -0
- package/skills/ttm-new-campaign/SKILL.md +13 -0
- package/skills/ttm-next/SKILL.md +12 -0
- package/skills/ttm-positioning-check/SKILL.md +19 -0
- package/skills/ttm-positioning-shift/SKILL.md +19 -0
- package/skills/ttm-produce/SKILL.md +14 -0
- package/skills/ttm-repurpose/SKILL.md +20 -0
- package/skills/ttm-research/SKILL.md +13 -0
- package/skills/ttm-resume/SKILL.md +13 -0
- package/skills/ttm-review/SKILL.md +13 -0
- package/skills/ttm-seo-audit/SKILL.md +20 -0
- package/skills/ttm-ship/SKILL.md +13 -0
- package/skills/ttm-state/SKILL.md +13 -0
- package/skills/ttm-verify/SKILL.md +14 -0
- package/templates/agents-md.md +65 -0
- package/templates/campaign-brief.md +74 -0
- package/templates/campaign-research.md +39 -0
- package/templates/campaign-state.md +40 -0
- package/templates/claude-md.md +65 -0
- package/templates/deviation-log.md +12 -0
- package/templates/drift-log.md +17 -0
- package/templates/fix-brief.md +59 -0
- package/templates/fix-log.md +22 -0
- package/templates/measurement-report.md +75 -0
- package/templates/migration-plan.md +24 -0
- package/templates/production-manifest.json +20 -0
- package/templates/reference-files/brand.md +45 -0
- package/templates/reference-files/calendar.md +30 -0
- package/templates/reference-files/channels.md +40 -0
- package/templates/reference-files/competitors.md +40 -0
- package/templates/reference-files/icp.md +50 -0
- package/templates/reference-files/learnings.md +40 -0
- package/templates/reference-files/metrics.md +42 -0
- package/templates/reference-files/positioning.md +38 -0
- package/templates/reference-files/state.md +27 -0
- package/templates/verification-report.md +59 -0
- package/workflows/discipline/.gitkeep +0 -0
- package/workflows/discipline/aeo-check.md +180 -0
- package/workflows/discipline/affiliate-kit.md +147 -0
- package/workflows/discipline/email-preflight.md +150 -0
- package/workflows/discipline/keyword-map.md +125 -0
- package/workflows/discipline/repurpose.md +329 -0
- package/workflows/discipline/seo-audit.md +169 -0
- package/workflows/lifecycle/.gitkeep +0 -0
- package/workflows/lifecycle/brief-positioning-check.md +90 -0
- package/workflows/lifecycle/brief.md +355 -0
- package/workflows/lifecycle/fix.md +495 -0
- package/workflows/lifecycle/learn.md +405 -0
- package/workflows/lifecycle/measure.md +379 -0
- package/workflows/lifecycle/produce.md +383 -0
- package/workflows/lifecycle/research.md +264 -0
- package/workflows/lifecycle/review.md +432 -0
- package/workflows/lifecycle/ship.md +521 -0
- package/workflows/lifecycle/verify.md +507 -0
- package/workflows/reference-mgmt/.gitkeep +0 -0
- package/workflows/reference-mgmt/brand-refresh.md +193 -0
- package/workflows/reference-mgmt/competitor-scan.md +228 -0
- package/workflows/reference-mgmt/icp-refresh.md +200 -0
- package/workflows/reference-mgmt/positioning-check.md +339 -0
- package/workflows/reference-mgmt/positioning-shift.md +368 -0
- package/workflows/setup/.gitkeep +0 -0
- package/workflows/setup/init-questions.md +225 -0
- package/workflows/setup/init-validation.md +155 -0
- package/workflows/setup/init.md +449 -0
- package/workflows/setup/new-campaign.md +134 -0
- package/workflows/utility/.gitkeep +0 -0
- package/workflows/utility/archive.md +334 -0
- package/workflows/utility/health.md +166 -0
- package/workflows/utility/next.md +187 -0
- package/workflows/utility/resume.md +249 -0
- 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>
|