agileflow 3.4.0 → 3.4.1

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 (112) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +4 -4
  3. package/package.json +1 -1
  4. package/scripts/agileflow-welcome.js +79 -0
  5. package/scripts/claude-tmux.sh +12 -36
  6. package/scripts/lib/ac-test-matcher.js +452 -0
  7. package/scripts/lib/audit-registry.js +58 -2
  8. package/scripts/lib/configure-features.js +35 -0
  9. package/scripts/lib/model-profiles.js +25 -5
  10. package/scripts/lib/quality-gates.js +163 -0
  11. package/scripts/lib/signal-detectors.js +43 -0
  12. package/scripts/lib/status-writer.js +255 -0
  13. package/scripts/lib/story-claiming.js +128 -45
  14. package/scripts/lib/task-sync.js +32 -38
  15. package/scripts/lib/tmux-audit-monitor.js +611 -0
  16. package/scripts/lib/tool-registry.yaml +241 -0
  17. package/scripts/lib/tool-shed.js +441 -0
  18. package/scripts/native-team-observer.js +219 -0
  19. package/scripts/obtain-context.js +14 -0
  20. package/scripts/ralph-loop.js +30 -5
  21. package/scripts/smart-detect.js +21 -0
  22. package/scripts/spawn-audit-sessions.js +372 -44
  23. package/scripts/team-manager.js +19 -0
  24. package/src/core/agents/a11y-analyzer-aria.md +155 -0
  25. package/src/core/agents/a11y-analyzer-forms.md +162 -0
  26. package/src/core/agents/a11y-analyzer-keyboard.md +175 -0
  27. package/src/core/agents/a11y-analyzer-semantic.md +153 -0
  28. package/src/core/agents/a11y-analyzer-visual.md +158 -0
  29. package/src/core/agents/a11y-consensus.md +248 -0
  30. package/src/core/agents/ads-consensus.md +74 -0
  31. package/src/core/agents/ads-generate.md +145 -0
  32. package/src/core/agents/ads-performance-tracker.md +197 -0
  33. package/src/core/agents/api-quality-analyzer-conventions.md +148 -0
  34. package/src/core/agents/api-quality-analyzer-docs.md +176 -0
  35. package/src/core/agents/api-quality-analyzer-errors.md +183 -0
  36. package/src/core/agents/api-quality-analyzer-pagination.md +171 -0
  37. package/src/core/agents/api-quality-analyzer-versioning.md +143 -0
  38. package/src/core/agents/api-quality-consensus.md +214 -0
  39. package/src/core/agents/arch-analyzer-circular.md +148 -0
  40. package/src/core/agents/arch-analyzer-complexity.md +171 -0
  41. package/src/core/agents/arch-analyzer-coupling.md +146 -0
  42. package/src/core/agents/arch-analyzer-layering.md +151 -0
  43. package/src/core/agents/arch-analyzer-patterns.md +162 -0
  44. package/src/core/agents/arch-consensus.md +227 -0
  45. package/src/core/commands/adr.md +1 -0
  46. package/src/core/commands/ads/generate.md +238 -0
  47. package/src/core/commands/ads/health.md +327 -0
  48. package/src/core/commands/ads/test-plan.md +317 -0
  49. package/src/core/commands/ads/track.md +288 -0
  50. package/src/core/commands/ads.md +28 -16
  51. package/src/core/commands/assign.md +1 -0
  52. package/src/core/commands/audit.md +43 -6
  53. package/src/core/commands/babysit.md +90 -6
  54. package/src/core/commands/baseline.md +1 -0
  55. package/src/core/commands/blockers.md +1 -0
  56. package/src/core/commands/board.md +1 -0
  57. package/src/core/commands/changelog.md +1 -0
  58. package/src/core/commands/choose.md +1 -0
  59. package/src/core/commands/ci.md +1 -0
  60. package/src/core/commands/code/accessibility.md +347 -0
  61. package/src/core/commands/code/api.md +297 -0
  62. package/src/core/commands/code/architecture.md +297 -0
  63. package/src/core/commands/code/completeness.md +43 -6
  64. package/src/core/commands/code/legal.md +43 -6
  65. package/src/core/commands/code/logic.md +43 -6
  66. package/src/core/commands/code/performance.md +43 -6
  67. package/src/core/commands/code/security.md +43 -6
  68. package/src/core/commands/code/test.md +43 -6
  69. package/src/core/commands/configure.md +1 -0
  70. package/src/core/commands/council.md +1 -0
  71. package/src/core/commands/deploy.md +1 -0
  72. package/src/core/commands/diagnose.md +1 -0
  73. package/src/core/commands/docs.md +1 -0
  74. package/src/core/commands/epic/edit.md +213 -0
  75. package/src/core/commands/epic.md +1 -0
  76. package/src/core/commands/export.md +238 -0
  77. package/src/core/commands/help.md +16 -1
  78. package/src/core/commands/ideate/discover.md +7 -3
  79. package/src/core/commands/ideate/features.md +65 -4
  80. package/src/core/commands/ideate/new.md +158 -124
  81. package/src/core/commands/impact.md +1 -0
  82. package/src/core/commands/learn/explain.md +118 -0
  83. package/src/core/commands/learn/glossary.md +135 -0
  84. package/src/core/commands/learn/patterns.md +138 -0
  85. package/src/core/commands/learn/tour.md +126 -0
  86. package/src/core/commands/migrate/codemods.md +151 -0
  87. package/src/core/commands/migrate/plan.md +131 -0
  88. package/src/core/commands/migrate/scan.md +114 -0
  89. package/src/core/commands/migrate/validate.md +119 -0
  90. package/src/core/commands/multi-expert.md +1 -0
  91. package/src/core/commands/pr.md +1 -0
  92. package/src/core/commands/review.md +1 -0
  93. package/src/core/commands/sprint.md +1 -0
  94. package/src/core/commands/status/undo.md +191 -0
  95. package/src/core/commands/status.md +1 -0
  96. package/src/core/commands/story/edit.md +204 -0
  97. package/src/core/commands/story/view.md +29 -7
  98. package/src/core/commands/story-validate.md +1 -0
  99. package/src/core/commands/story.md +1 -0
  100. package/src/core/commands/tdd.md +1 -0
  101. package/src/core/commands/team/start.md +10 -6
  102. package/src/core/commands/tests.md +1 -0
  103. package/src/core/commands/verify.md +27 -1
  104. package/src/core/commands/workflow.md +2 -0
  105. package/src/core/teams/backend.json +41 -0
  106. package/src/core/teams/frontend.json +41 -0
  107. package/src/core/teams/qa.json +41 -0
  108. package/src/core/teams/solo.json +35 -0
  109. package/src/core/templates/agileflow-metadata.json +5 -0
  110. package/tools/cli/commands/setup.js +85 -3
  111. package/tools/cli/commands/update.js +42 -0
  112. package/tools/cli/installers/ide/claude-code.js +68 -0
@@ -0,0 +1,327 @@
1
+ ---
2
+ description: Unified marketing health scorecard — runs ads, SEO, landing page, and tracking audits in parallel to produce a combined score with cross-domain insights
3
+ argument-hint: "<account-data-and-url> [SCOPE=all]"
4
+ compact_context:
5
+ priority: high
6
+ preserve_rules:
7
+ - "ACTIVE COMMAND: /agileflow:ads:health - Unified marketing health scorecard"
8
+ - "CRITICAL: Deploy ads audit + SEO audit + landing page analysis IN PARALLEL"
9
+ - "CRITICAL: Combine scores into unified Marketing Health Score with domain weights"
10
+ - "Domain weights: Ads 40%, SEO 25%, Landing Pages 20%, Tracking 15%"
11
+ - "Cross-domain insights: tracking gaps affect ads + SEO, landing page quality affects ad ROAS"
12
+ state_fields:
13
+ - ads_score
14
+ - seo_score
15
+ - landing_score
16
+ - tracking_score
17
+ - unified_score
18
+ ---
19
+
20
+ # /agileflow:ads:health
21
+
22
+ Unified marketing health scorecard that orchestrates ads, SEO, landing page, and tracking audits in parallel, then synthesizes into a single Marketing Health Score with cross-domain insights.
23
+
24
+ ---
25
+
26
+ ## Quick Reference
27
+
28
+ ```
29
+ /agileflow:ads:health <account-data> <landing-page-url> # Full health check
30
+ /agileflow:ads:health <account-data> SCOPE=ads,seo # Ads + SEO only
31
+ /agileflow:ads:health <account-data> SCOPE=ads,landing # Ads + landing pages only
32
+ ```
33
+
34
+ ---
35
+
36
+ ## How It Works
37
+
38
+ ```
39
+ +-------------------------------------------------------------------+
40
+ | /agileflow:ads:health |
41
+ | |
42
+ | 1. Parse inputs (ad data + URLs) |
43
+ | 2. Deploy domain audits IN PARALLEL |
44
+ | 3. Collect all domain scores |
45
+ | 4. Cross-reference findings across domains |
46
+ | 5. Calculate unified Marketing Health Score |
47
+ | 6. Generate shareable scorecard |
48
+ +-------------------------------------------------------------------+
49
+
50
+ +-----------+ +----------+ +-----------+ +----------+
51
+ | Ads | | SEO | | Landing | | Tracking |
52
+ | Audit | | Audit | | Page | | Audit |
53
+ | (6 agents)| |(6 agents)| | Analysis | | (shared) |
54
+ +-----+-----+ +----+-----+ +-----+-----+ +----+-----+
55
+ | | | |
56
+ +---------------+---------------+---------------+
57
+ |
58
+ +-----------+-----------+
59
+ | Health Score |
60
+ | Synthesis & |
61
+ | Cross-Domain |
62
+ | Insights |
63
+ +-----------------------+
64
+ ```
65
+
66
+ ---
67
+
68
+ ## Arguments
69
+
70
+ | Argument | Values | Default | Description |
71
+ |----------|--------|---------|-------------|
72
+ | account-data | Text, file, or description | Required for ads | Ad account data for ads audit |
73
+ | URL | Landing page URL(s) | Optional | URLs for SEO + landing page analysis |
74
+ | SCOPE | all, ads, seo, landing, tracking | all | Which domains to include |
75
+
76
+ ---
77
+
78
+ ## Step-by-Step Process
79
+
80
+ ### STEP 1: Parse Inputs
81
+
82
+ Accept a combination of:
83
+ - **Ad account data** (pasted, file, or described) — triggers ads audit
84
+ - **URL(s)** — triggers SEO audit + landing page analysis
85
+ - **Both** — triggers full health check
86
+
87
+ If insufficient data provided:
88
+
89
+ ```xml
90
+ <invoke name="AskUserQuestion">
91
+ <parameter name="questions">[
92
+ {
93
+ "question": "What data do you have for the health check? More data = more comprehensive score.",
94
+ "header": "Data Sources",
95
+ "multiSelect": true,
96
+ "options": [
97
+ {"label": "Ad account data (Recommended)", "description": "Paste from Google Ads, Meta Ads Manager — enables ads audit (40% of score)"},
98
+ {"label": "Website/landing page URL", "description": "Your main URL for SEO + landing page analysis (45% of score)"},
99
+ {"label": "Tracking setup description", "description": "Describe your GTM, pixels, conversion events (15% of score)"}
100
+ ]
101
+ }
102
+ ]</parameter>
103
+ </invoke>
104
+ ```
105
+
106
+ ### STEP 2: Deploy Domain Audits in Parallel
107
+
108
+ **CRITICAL**: Deploy ALL applicable audits in a SINGLE message with multiple Task calls using `run_in_background: true`.
109
+
110
+ #### Ads Audit (if ad data provided)
111
+
112
+ ```xml
113
+ <invoke name="Task">
114
+ <parameter name="description">Ads audit for health scorecard</parameter>
115
+ <parameter name="prompt">Run a complete ads audit on this account data. Apply all checks from all 6 analyzers (Google, Meta, Budget, Creative, Tracking, Compliance). Calculate the Ads Health Score.
116
+
117
+ ACCOUNT DATA:
118
+ {account_data}
119
+
120
+ OUTPUT: Your Ads Health Score X/100 with category breakdown and top 5 findings by severity.</parameter>
121
+ <parameter name="subagent_type">ads-consensus</parameter>
122
+ <parameter name="run_in_background">true</parameter>
123
+ </invoke>
124
+ ```
125
+
126
+ #### SEO Audit (if URL provided)
127
+
128
+ ```xml
129
+ <invoke name="Task">
130
+ <parameter name="description">SEO audit for health scorecard</parameter>
131
+ <parameter name="prompt">Run a complete SEO audit on this URL. Apply all checks from all 6 analyzers (Technical, Content, Schema, Performance, Images, Sitemap). Calculate the SEO Health Score.
132
+
133
+ URL: {url}
134
+
135
+ OUTPUT: Your SEO Health Score X/100 with category breakdown and top 5 findings by severity.</parameter>
136
+ <parameter name="subagent_type">seo-consensus</parameter>
137
+ <parameter name="run_in_background">true</parameter>
138
+ </invoke>
139
+ ```
140
+
141
+ #### Landing Page Analysis (if URL provided)
142
+
143
+ ```xml
144
+ <invoke name="Task">
145
+ <parameter name="description">Landing page analysis for health scorecard</parameter>
146
+ <parameter name="prompt">Analyze this landing page for conversion optimization. Score across these dimensions:
147
+
148
+ URL: {url}
149
+
150
+ ## Landing Page Scoring (100 points total)
151
+
152
+ ### Above-the-Fold (30 points)
153
+ - Clear headline matching ad intent (10)
154
+ - Visible CTA above fold (10)
155
+ - Social proof visible without scrolling (5)
156
+ - Load time under 3 seconds (5)
157
+
158
+ ### Message Match (25 points)
159
+ - Headline matches ad copy themes (10)
160
+ - Value proposition clarity (10)
161
+ - Single clear conversion goal (5)
162
+
163
+ ### Trust & Proof (20 points)
164
+ - Customer testimonials/logos (8)
165
+ - Security badges/certifications (4)
166
+ - Clear contact information (4)
167
+ - Privacy policy linked (4)
168
+
169
+ ### Form/CTA Optimization (15 points)
170
+ - Minimal form fields for stage (5)
171
+ - CTA button contrast and copy (5)
172
+ - Multiple CTAs on long pages (5)
173
+
174
+ ### Mobile Experience (10 points)
175
+ - Responsive layout (4)
176
+ - Touch-friendly buttons (3)
177
+ - Fast mobile load (3)
178
+
179
+ OUTPUT: Landing Page Score X/100 with breakdown and top 5 recommendations.</parameter>
180
+ <parameter name="subagent_type">general-purpose</parameter>
181
+ <parameter name="run_in_background">true</parameter>
182
+ </invoke>
183
+ ```
184
+
185
+ #### Tracking Audit (always runs if any data provided)
186
+
187
+ The tracking score is extracted from the ads audit (if run) or assessed independently from the URL/description.
188
+
189
+ ### STEP 3: Collect Results
190
+
191
+ Wait for all background tasks to complete using TaskOutput with `block: true`.
192
+
193
+ ### STEP 4: Cross-Domain Insights
194
+
195
+ After collecting all scores, identify cross-domain correlations:
196
+
197
+ | Pattern | Domains | Insight |
198
+ |---------|---------|---------|
199
+ | Tracking broken + low ads ROAS | Tracking + Ads | "Your ROAS numbers are unreliable — fix tracking first" |
200
+ | Slow landing page + high CPC | Landing + Ads | "Slow pages increase bounce rate, raising your CPC" |
201
+ | Missing schema + low organic | SEO + Landing | "No structured data means fewer rich snippets in SERPs" |
202
+ | Ad copy mismatch + low CVR | Ads + Landing | "Your ads promise X but landing page delivers Y" |
203
+ | No retargeting pixel + high bounce | Tracking + Landing | "Losing bounced visitors with no way to retarget them" |
204
+
205
+ ### STEP 5: Calculate Unified Score
206
+
207
+ ```
208
+ Marketing Health Score = sum(Domain Score * Domain Weight)
209
+ ```
210
+
211
+ **Domain Weights:**
212
+ | Domain | Weight | Why |
213
+ |--------|--------|-----|
214
+ | Ads | 40% | Direct spend efficiency — highest dollar impact |
215
+ | SEO | 25% | Organic acquisition — compounding long-term value |
216
+ | Landing Pages | 20% | Conversion rate — multiplier for all traffic |
217
+ | Tracking | 15% | Data quality — foundation for all optimization |
218
+
219
+ **If a domain is excluded** (not in SCOPE or no data), redistribute its weight proportionally to included domains.
220
+
221
+ **Grade Scale:**
222
+ | Grade | Score | Meaning |
223
+ |-------|-------|---------|
224
+ | A | 90-100 | Excellent — optimized marketing funnel |
225
+ | B | 80-89 | Good — minor improvements available |
226
+ | C | 70-79 | Needs Work — significant gaps in the funnel |
227
+ | D | 60-69 | Poor — major issues across multiple domains |
228
+ | F | < 60 | Critical — fundamental problems, likely wasting significant spend |
229
+
230
+ ### STEP 6: Generate Scorecard
231
+
232
+ Output a compact, shareable scorecard:
233
+
234
+ ```markdown
235
+ # Marketing Health Scorecard
236
+
237
+ **Generated**: {YYYY-MM-DD}
238
+ **Account**: {name/description}
239
+ **Scope**: {domains audited}
240
+
241
+ ---
242
+
243
+ ## Marketing Health Score: {X}/100 ({grade})
244
+
245
+ ```
246
+ Ads: ████████████████████░░░░░░ 78/100 (40%)
247
+ SEO: ██████████████░░░░░░░░░░░░ 58/100 (25%)
248
+ Landing: ████████████████████████░░ 92/100 (20%)
249
+ Tracking: ██████░░░░░░░░░░░░░░░░░░░░ 25/100 (15%)
250
+ ──────────────────────────
251
+ Overall: ██████████████████░░░░░░░░ 71/100 (C)
252
+ ```
253
+
254
+ | Domain | Score | Grade | Top Issue |
255
+ |--------|-------|-------|-----------|
256
+ | **Ads** | {X}/100 | {grade} | {top finding} |
257
+ | **SEO** | {X}/100 | {grade} | {top finding} |
258
+ | **Landing Pages** | {X}/100 | {grade} | {top finding} |
259
+ | **Tracking** | {X}/100 | {grade} | {top finding} |
260
+
261
+ ---
262
+
263
+ ## Cross-Domain Insights
264
+
265
+ 1. **{insight title}** ({domains affected})
266
+ {description and impact}
267
+
268
+ 2. **{insight title}** ({domains affected})
269
+ {description and impact}
270
+
271
+ ---
272
+
273
+ ## Priority Actions (by estimated $ impact)
274
+
275
+ | # | Action | Domain | Impact | Effort |
276
+ |---|--------|--------|--------|--------|
277
+ | 1 | {action} | {domain} | {$$} | {Low/Med/High} |
278
+ | 2 | {action} | {domain} | {$$} | {Low/Med/High} |
279
+ | 3 | {action} | {domain} | {$$} | {Low/Med/High} |
280
+
281
+ ---
282
+
283
+ ## Domain Deep-Dives
284
+
285
+ Run individual audits for detailed findings:
286
+ - `/agileflow:ads:audit` — Full 190-check ads analysis
287
+ - `/agileflow:seo:audit` — Full 6-analyzer SEO audit
288
+ - `/agileflow:ads:landing` — Detailed landing page optimization
289
+ ```
290
+
291
+ Save scorecard to `docs/08-project/health-scorecards/health-scorecard-{YYYYMMDD}.md`.
292
+
293
+ ### STEP 7: Present Results
294
+
295
+ ```xml
296
+ <invoke name="AskUserQuestion">
297
+ <parameter name="questions">[{
298
+ "question": "Marketing Health Score: {X}/100 ({grade}). Lowest domain: {domain} ({score}/100). {N} cross-domain insights found.",
299
+ "header": "Next steps",
300
+ "multiSelect": false,
301
+ "options": [
302
+ {"label": "Fix {lowest_domain} issues first (Recommended)", "description": "{top_issue} — estimated ${impact}/mo impact"},
303
+ {"label": "Deep-dive ads audit", "description": "Run full /agileflow:ads:audit for 190-check analysis"},
304
+ {"label": "Deep-dive SEO audit", "description": "Run full /agileflow:seo:audit for comprehensive SEO analysis"},
305
+ {"label": "Generate fix artifacts", "description": "Auto-generate corrected ad copy, schema markup, and meta tags"}
306
+ ]
307
+ }]</parameter>
308
+ </invoke>
309
+ ```
310
+
311
+ ---
312
+
313
+ <!-- COMPACT_SUMMARY_START -->
314
+ ## Compact Summary
315
+
316
+ **Command**: `/agileflow:ads:health` - Unified marketing health scorecard
317
+
318
+ **What It Does**: Deploy ads + SEO + landing page + tracking audits in parallel -> cross-domain insights -> Marketing Health Score 0-100
319
+
320
+ **Domain Weights**: Ads 40%, SEO 25%, Landing Pages 20%, Tracking 15%
321
+
322
+ **Output**: Shareable scorecard with bar chart, cross-domain insights, and priority actions
323
+
324
+ **Usage**: `/agileflow:ads:health <account-data> <url> [SCOPE=all]`
325
+
326
+ **File**: `docs/08-project/health-scorecards/health-scorecard-{YYYYMMDD}.md`
327
+ <!-- COMPACT_SUMMARY_END -->
@@ -0,0 +1,317 @@
1
+ ---
2
+ description: CPC-first test planning — structured test matrix with budget allocation, CPC thresholds, winner/kill rules, and graduation criteria
3
+ argument-hint: "[BUDGET=100] [DURATION=3d] [VARIANTS=from-generate]"
4
+ compact_context:
5
+ priority: medium
6
+ preserve_rules:
7
+ - "ACTIVE COMMAND: /agileflow:ads:test-plan - CPC-first test planning"
8
+ - "Generate structured test matrix with decision criteria"
9
+ - "CPC threshold methodology: $100/3-day test, winner/kill rules"
10
+ - "Output includes budget allocation, measurement criteria, graduation rules"
11
+ state_fields:
12
+ - test_budget
13
+ - duration
14
+ - variants
15
+ - platform
16
+ ---
17
+
18
+ # /agileflow:ads:test-plan
19
+
20
+ Generate a structured A/B testing plan with budget allocation, CPC-first decision criteria, winner/kill rules, and graduation strategy. Based on the CPC-first testing methodology where cheap clicks validate messaging before optimizing for conversions.
21
+
22
+ ---
23
+
24
+ ## Quick Reference
25
+
26
+ ```
27
+ /agileflow:ads:test-plan # Interactive (recommended)
28
+ /agileflow:ads:test-plan BUDGET=300 DURATION=5d # Custom budget/duration
29
+ /agileflow:ads:test-plan VARIANTS=from-generate # Use variants from /ads:generate
30
+ /agileflow:ads:test-plan BUDGET=100 PLATFORM=meta # Meta-specific test plan
31
+ ```
32
+
33
+ ---
34
+
35
+ ## Arguments
36
+
37
+ | Argument | Values | Default | Description |
38
+ |----------|--------|---------|-------------|
39
+ | BUDGET | Dollar amount | $100 | Total test budget per round |
40
+ | DURATION | Days | 3d | Test duration before decision |
41
+ | VARIANTS | from-generate, manual, or count | from-generate | Source of ad variants to test |
42
+ | PLATFORM | meta, google, linkedin, tiktok | meta | Platform to test on |
43
+
44
+ ---
45
+
46
+ ## CPC-First Testing Methodology
47
+
48
+ ### Why CPC First?
49
+
50
+ ```
51
+ Traditional: Optimize for conversions → need 50+ conversions per variant → $$$
52
+ CPC-First: Optimize for clicks → need 100+ clicks per variant → $
53
+
54
+ CPC validates MESSAGE RESONANCE at 1/50th the cost.
55
+ Only graduate winners to conversion optimization.
56
+ ```
57
+
58
+ ### The 3-Stage Funnel
59
+
60
+ ```
61
+ Stage 1: CPC Test ($100, 3 days)
62
+ → Does the message resonate? (CTR + CPC)
63
+ → Kill: CPC > 2x average
64
+ → Graduate: CPC < average AND CTR > 1%
65
+
66
+ Stage 2: Landing Page Test ($300, 7 days)
67
+ → Do clicks convert? (CVR + CPA)
68
+ → Kill: CVR < 1% after 200+ clicks
69
+ → Graduate: CPA < 2x target
70
+
71
+ Stage 3: Scale Test ($1000+, 14 days)
72
+ → Does it scale profitably? (ROAS + volume)
73
+ → Kill: ROAS < 1.5x at 2x budget
74
+ → Graduate: ROAS > 2x → move to always-on
75
+ ```
76
+
77
+ ---
78
+
79
+ ## Multi-Step Discovery Flow
80
+
81
+ ### STEP 1: Test Context
82
+
83
+ ```xml
84
+ <invoke name="AskUserQuestion">
85
+ <parameter name="questions">[
86
+ {
87
+ "question": "What stage of testing are you at?",
88
+ "header": "Test Stage",
89
+ "multiSelect": false,
90
+ "options": [
91
+ {"label": "Stage 1: Message testing (Recommended)", "description": "CPC-first — validate which angles/hooks resonate before spending on conversions"},
92
+ {"label": "Stage 2: Landing page testing", "description": "I have winning ad copy, now testing landing page variants"},
93
+ {"label": "Stage 3: Scale testing", "description": "I have winning ads + landing pages, testing budget scaling"},
94
+ {"label": "Full funnel from scratch", "description": "Generate a complete 3-stage test plan"}
95
+ ]
96
+ },
97
+ {
98
+ "question": "How many ad variants do you want to test?",
99
+ "header": "Variants",
100
+ "multiSelect": false,
101
+ "options": [
102
+ {"label": "Use variants from /ads:generate (Recommended)", "description": "Pull variants from the most recent ads-copy generation"},
103
+ {"label": "5 variants (minimum viable test)", "description": "Test 5 angles with $20 each"},
104
+ {"label": "10 variants (standard test)", "description": "Test 10 variants with $10 each"},
105
+ {"label": "20 variants (comprehensive)", "description": "Test 20 variants — requires $200+ budget"}
106
+ ]
107
+ }
108
+ ]</parameter>
109
+ </invoke>
110
+ ```
111
+
112
+ ### STEP 2: Check for Existing Variants
113
+
114
+ If VARIANTS=from-generate, look for recent ad copy:
115
+
116
+ ```
117
+ docs/08-project/ads-copy/ads-copy-{YYYYMMDD}.md
118
+ ```
119
+
120
+ If found, extract angle names and variant counts. If not found, suggest running `/agileflow:ads:generate` first.
121
+
122
+ ### STEP 3: Generate Test Plan
123
+
124
+ Based on stage, budget, and variants, generate the test matrix.
125
+
126
+ ---
127
+
128
+ ## Output Format
129
+
130
+ ```markdown
131
+ # Ad Testing Plan
132
+
133
+ **Generated**: {YYYY-MM-DD}
134
+ **Platform**: {platform}
135
+ **Total Budget**: ${total across all stages}
136
+ **Methodology**: CPC-First → CVR → Scale
137
+
138
+ ---
139
+
140
+ ## Stage 1: Message Resonance Test (CPC-First)
141
+
142
+ **Budget**: ${budget}
143
+ **Duration**: {duration}
144
+ **Objective**: Traffic (optimize for link clicks)
145
+ **Bidding**: Lowest cost (no cap)
146
+
147
+ ### Test Matrix
148
+
149
+ | Variant | Angle | Headline | Daily Budget | Min Clicks | Decision By |
150
+ |---------|-------|----------|-------------|------------|-------------|
151
+ | A | Pain Point | "{headline}" | ${daily} | 33 | {date} |
152
+ | B | Outcome | "{headline}" | ${daily} | 33 | {date} |
153
+ | C | Social Proof | "{headline}" | ${daily} | 33 | {date} |
154
+ | D | Urgency | "{headline}" | ${daily} | 33 | {date} |
155
+ | E | Contrarian | "{headline}" | ${daily} | 33 | {date} |
156
+
157
+ ### Decision Criteria
158
+
159
+ | Metric | Kill | Hold | Graduate |
160
+ |--------|------|------|----------|
161
+ | **CPC** | > ${2x_avg} | ${avg} - ${2x_avg} | < ${avg} |
162
+ | **CTR** | < 0.5% | 0.5% - 1.0% | > 1.0% |
163
+ | **Impressions** | < 500 (insufficient data) | 500-1000 | > 1000 |
164
+
165
+ ### Decision Rules
166
+
167
+ 1. **Kill immediately** if CPC > 2x average after 50+ clicks
168
+ 2. **Hold** if CPC is average but CTR is borderline — extend 2 more days
169
+ 3. **Graduate** if CPC < average AND CTR > 1.0% — move to Stage 2
170
+ 4. **Minimum data**: Do NOT make decisions with < 100 impressions per variant
171
+ 5. **Time minimum**: Run at least 48 hours to capture day-of-week variance
172
+
173
+ ### Expected Outcomes
174
+
175
+ At $100 budget with ~$1.50 CPC:
176
+ - ~67 total clicks across 5 variants
177
+ - ~13 clicks per variant (marginal — consider $200 for statistical confidence)
178
+ - Expected: 1-2 clear winners, 1-2 kills, 1-2 holds
179
+
180
+ ### Budget Scaling (if budget allows)
181
+
182
+ | Budget | Variants | Clicks/Variant | Confidence |
183
+ |--------|----------|---------------|------------|
184
+ | $100 | 5 | ~13 | Low (directional only) |
185
+ | $200 | 5 | ~27 | Medium (clear signal) |
186
+ | $300 | 5 | ~40 | High (statistically significant) |
187
+ | $500 | 10 | ~33 | High (wider angle coverage) |
188
+
189
+ ---
190
+
191
+ ## Stage 2: Conversion Validation Test
192
+
193
+ **Budget**: ${stage2_budget}
194
+ **Duration**: 7 days
195
+ **Objective**: Conversions (optimize for leads/purchases)
196
+ **Bidding**: Target CPA (set at 1.5x current CPA)
197
+
198
+ ### Graduates from Stage 1
199
+ {Only variants that passed Stage 1 criteria}
200
+
201
+ | Variant | Angle | Stage 1 CPC | Stage 1 CTR | Daily Budget |
202
+ |---------|-------|-------------|-------------|-------------|
203
+ | {winner} | {angle} | ${cpc} | {ctr}% | ${daily} |
204
+
205
+ ### Decision Criteria
206
+
207
+ | Metric | Kill | Hold | Graduate |
208
+ |--------|------|------|----------|
209
+ | **CPA** | > 3x target | 1.5x - 3x target | < 1.5x target |
210
+ | **CVR** | < 1% after 200+ clicks | 1% - 3% | > 3% |
211
+ | **ROAS** (e-commerce) | < 1:1 | 1:1 - 2:1 | > 2:1 |
212
+
213
+ ### The 3x Kill Rule
214
+
215
+ > **If any campaign's CPA exceeds 3x your target CPA, pause it immediately.**
216
+ > No exceptions. No "let it learn longer." Kill it, iterate the creative, relaunch.
217
+
218
+ ---
219
+
220
+ ## Stage 3: Scale Test
221
+
222
+ **Budget**: ${stage3_budget}
223
+ **Duration**: 14 days
224
+ **Objective**: Profitable scale
225
+ **Bidding**: Target CPA or Target ROAS
226
+
227
+ ### Scaling Rules
228
+
229
+ 1. **20% Rule**: Never increase budget more than 20% per day
230
+ 2. **Learning Phase**: After budget changes, wait 3-5 days before judging
231
+ 3. **Diminishing Returns**: Track CPA at each budget level:
232
+
233
+ | Budget Level | Expected CPA | Actual CPA | CPA Delta | Action |
234
+ |-------------|-------------|-----------|-----------|--------|
235
+ | Baseline ${x} | ${target} | — | — | — |
236
+ | +20% ${x*1.2} | ${target*1.1} | — | — | Continue if < 1.5x |
237
+ | +20% ${x*1.44} | ${target*1.2} | — | — | Pause if > 2x |
238
+ | +20% ${x*1.73} | ${target*1.3} | — | — | — |
239
+
240
+ 4. **Exit criteria**: Stop scaling when CPA increase per 20% budget step exceeds 15%
241
+
242
+ ---
243
+
244
+ ## Test Calendar
245
+
246
+ | Week | Stage | Action | Budget | Key Metric |
247
+ |------|-------|--------|--------|-----------|
248
+ | 1 | Setup | Create campaigns, install tracking | $0 | Pixel fires ✓ |
249
+ | 1-2 | Stage 1 | CPC message test | ${s1} | CPC + CTR |
250
+ | 2 | Decision | Kill/Hold/Graduate | — | — |
251
+ | 2-3 | Stage 2 | Conversion test (winners) | ${s2} | CPA + CVR |
252
+ | 3 | Decision | Kill/Graduate | — | — |
253
+ | 4-5 | Stage 3 | Scale test | ${s3} | ROAS at scale |
254
+ | 6 | Evergreen | Move winners to always-on | ${ongoing} | Monitor weekly |
255
+
256
+ ---
257
+
258
+ ## Tracking Requirements
259
+
260
+ Before starting ANY test:
261
+
262
+ - [ ] Conversion pixel/tag installed and firing
263
+ - [ ] Conversion events defined (lead, purchase, sign-up)
264
+ - [ ] UTM parameters on all ad URLs: `utm_source={platform}&utm_medium=paid&utm_campaign={test_name}&utm_content={variant}`
265
+ - [ ] Google Analytics or equivalent receiving data
266
+ - [ ] Baseline metrics recorded (current CPC, CTR, CPA if available)
267
+
268
+ ---
269
+
270
+ ## Post-Test Analysis Template
271
+
272
+ After each stage, record:
273
+
274
+ | Variant | Impressions | Clicks | CTR | CPC | Conversions | CVR | CPA | Decision |
275
+ |---------|------------|--------|-----|-----|------------|-----|-----|----------|
276
+ | A | — | — | — | — | — | — | — | Kill/Hold/Graduate |
277
+ ```
278
+
279
+ Save test plan to `docs/08-project/ads-test-plans/test-plan-{YYYYMMDD}.md`.
280
+
281
+ ---
282
+
283
+ ## Present Results
284
+
285
+ ```xml
286
+ <invoke name="AskUserQuestion">
287
+ <parameter name="questions">[{
288
+ "question": "Test plan generated: {N} variants across {stages} stages, ${total_budget} total budget, {duration} timeline. Ready to launch?",
289
+ "header": "Next steps",
290
+ "multiSelect": false,
291
+ "options": [
292
+ {"label": "Generate ad variants to test (Recommended)", "description": "Run /agileflow:ads:generate to create the ad copy for this test plan"},
293
+ {"label": "Adjust budget or duration", "description": "Modify the test parameters before finalizing"},
294
+ {"label": "Review tracking setup", "description": "Verify conversion tracking is properly configured before testing"},
295
+ {"label": "Export for platform", "description": "Format the test plan as platform-specific campaign structure"}
296
+ ]
297
+ }]</parameter>
298
+ </invoke>
299
+ ```
300
+
301
+ ---
302
+
303
+ <!-- COMPACT_SUMMARY_START -->
304
+ ## Compact Summary
305
+
306
+ **Command**: `/agileflow:ads:test-plan` - CPC-first A/B test planning
307
+
308
+ **Methodology**: Stage 1 (CPC message test, $100/3d) → Stage 2 (CVR validation, $300/7d) → Stage 3 (Scale test, $1000+/14d)
309
+
310
+ **Key Rules**: 3x Kill Rule, 20% scaling rule, 48h minimum data, 100+ impressions before decisions
311
+
312
+ **Output**: Test matrix with decision criteria, scaling rules, and timeline
313
+
314
+ **Usage**: `/agileflow:ads:test-plan [BUDGET=100] [DURATION=3d] [VARIANTS=from-generate]`
315
+
316
+ **File**: `docs/08-project/ads-test-plans/test-plan-{YYYYMMDD}.md`
317
+ <!-- COMPACT_SUMMARY_END -->