@growthub/cli 0.3.41 → 0.3.43

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 (23) hide show
  1. package/README.md +87 -220
  2. package/assets/shared-templates/ad-formats/INDEX.md +94 -0
  3. package/assets/shared-templates/ad-formats/bedroom-minimic-talk.md +197 -0
  4. package/assets/shared-templates/ad-formats/frame-analysis.md +209 -0
  5. package/assets/shared-templates/ad-formats/process-specialist-medical.md +105 -0
  6. package/assets/shared-templates/ad-formats/villain-animation.md +183 -0
  7. package/assets/shared-templates/manifest.json +23 -0
  8. package/assets/shared-templates/scene-modules/INDEX.md +151 -0
  9. package/assets/shared-templates/scene-modules/body/before-after-flatlay.md +143 -0
  10. package/assets/shared-templates/scene-modules/body/minimic-problem.md +109 -0
  11. package/assets/shared-templates/scene-modules/body/product-demo-glow.md +123 -0
  12. package/assets/shared-templates/scene-modules/body/tiktok-skeptic-pivot.md +119 -0
  13. package/assets/shared-templates/scene-modules/body/villain-agitation.md +156 -0
  14. package/assets/shared-templates/scene-modules/cta/bogo-meme-bookend.md +144 -0
  15. package/assets/shared-templates/scene-modules/cta/guarantee-close.md +143 -0
  16. package/assets/shared-templates/scene-modules/hooks/dollar-amount.md +105 -0
  17. package/assets/shared-templates/scene-modules/hooks/meme-overlay.md +104 -0
  18. package/assets/shared-templates/scene-modules/hooks/pov-confession.md +92 -0
  19. package/assets/shared-templates/scene-modules/hooks/tiktok-comment.md +116 -0
  20. package/assets/shared-templates/scene-modules/hooks/villain-hook.md +134 -0
  21. package/dist/index.js +2606 -600
  22. package/package.json +4 -4
  23. package/dist/index.js.map +0 -7
@@ -0,0 +1,183 @@
1
+ # Ad Format: Villain Object Animation
2
+ > ID: `villain-animation`
3
+ > Category: Pet Products / Home Devices / Supplements / Any product displacing an incumbent
4
+ > Length: 90–120 seconds (proven at 98s)
5
+ > Scene Count: 9
6
+ > Hook Variations: 5 (A–E)
7
+ > Status: ✅ PROVEN — Clarifion ODRx brief, April 2026
8
+ > Aspect Ratios: 9:16 primary, 1:1 secondary
9
+
10
+ ---
11
+
12
+ ## MUSE REFERENCE
13
+
14
+ - **Creator/Brand:** TheraPet (AI animation ad)
15
+ - **URL:** https://www.facebook.com/100068524006696/posts/1227321179562004
16
+ - **Original product featured:** TheraPet pheromone plug-in device (pet behavior / cat marking)
17
+ - **Local muse file:** `~/Downloads/AQN2IbZ…mp4`
18
+ - **Runtime:** 98.47 seconds | 360×640 | 9:16 vertical | 30fps
19
+ - **Why it works:** Long-form agitation stack + villain character format creates emotional investment before the product appears. 4× agitation scenes build genuine frustration — by the time the hero product arrives, the viewer is psychologically primed to want it. Animated villain objects prevent competitor brand legal issues while being more visually memorable than live footage. Tone flip at Scene 6 is a hard emotional reset — the color/warmth change signals "it's over now."
20
+
21
+ ---
22
+
23
+ ## FORMAT SIGNALS (non-negotiable)
24
+
25
+ 1. **Animated villain objects** — competing/failed products rendered as cartoon characters with expressive faces, small arms, frustrated/evil expressions. Never show real competitor branding — use generic category labels ("Enzyme Cleaner," "Scented Plug-In," "Litter Bag").
26
+ 2. **4× agitation stack** — Scenes 2–5 are each a different failed solution. Each one ends with the villain still losing / the problem persisting. Do not compress to fewer agitation scenes — the stack is what builds the emotional case.
27
+ 3. **Karaoke word-by-word text** — 1–4 words at a time, key word highlighted in brand accent color. This text rhythm is sacred. Full sentences break the format.
28
+ 4. **Hard tone flip at Scene 6** — full color, lighting, energy reversal. Cold/chaotic/frustrated → warm/golden/calm. This scene flip is the emotional payoff. It must be distinct — not a gentle transition.
29
+ 5. **Product trio reveal** — 3 hero product units on the floor/surface in formation before being plugged in. This staging is consistent across the muse.
30
+ 6. **Gray-haired woman social proof** — Carol-type persona in Scene 8 with a calendar on the wall showing the guarantee period. This is the trust anchor before the CTA.
31
+ 7. **Stacked product boxes CTA** — Scene 9 shows bundled/stacked product boxes with satisfied animals/characters. Product must be in its packaging, not just the unit.
32
+
33
+ ---
34
+
35
+ ## PROVEN SCENE STRUCTURE
36
+
37
+ | # | Scene Name | Timecode | Beat | Sacred Element |
38
+ |---|------------|----------|------|----------------|
39
+ | 1 | Hook | 0–17s | Scroll stop — villain established | Villain between 3 competing devices. Agitation energy. Hook line variations A–E. |
40
+ | 2 | Agitation 1 | 17–29s | Failed solution #1 | Villain INSIDE the failed product. Specific dollar amount wasted. |
41
+ | 3 | Agitation 2 | 29–41s | Failed solution #2 | Different villain character / product category. "You've tried [X]..." |
42
+ | 4 | Agitation 3 | 41–50s | Failed solution #3 | Different villain — natural/DIY solutions that also fail. |
43
+ | 5 | Agitation 4 | 50–62s | Failed solution #4 | Most extreme failed solution — medical/pharmaceutical or highest-stakes option. |
44
+ | 6 | Product Intro — TONE FLIP | 62–74s | Hero enters — full emotional reset | Warm lighting ON. Hero product in trio formation on floor, glowing. Problem framing drops. |
45
+ | 7 | Product in Action | 74–83s | Mechanism proof | Product plugged in / in use. Animal/character calm below it. Low camera angle. |
46
+ | 8 | Social Proof | 83–92s | Trust anchor | Carol-type persona + satisfied animals + calendar (guarantee days). |
47
+ | 9 | CTA | 92–98s | Convert | Stacked product boxes + animals + satisfaction guarantee text. |
48
+
49
+ ---
50
+
51
+ ## SCENE MODULES USED IN THIS FORMAT
52
+
53
+ | Scene | Module ID | File |
54
+ |-------|-----------|------|
55
+ | 1 | `villain-hook` | `hooks/villain-hook.md` |
56
+ | 2–5 | `villain-agitation` × 4 | `body/villain-agitation.md` |
57
+ | 6–7 | product intro + in-action (format-specific — use inline, not modular) | — |
58
+ | 8 | social proof persona (format-specific — use inline) | — |
59
+ | 9 | `guarantee-close` | `cta/guarantee-close.md` |
60
+
61
+ ---
62
+
63
+ ## ADAPTATION RULES
64
+
65
+ ### Keep (sacred)
66
+ - 9 scenes — no exceptions
67
+ - 4 agitation scenes (Scenes 2–5) — never compress to fewer
68
+ - Animated villain object format — never swap to real competitor footage
69
+ - Hard tone flip at Scene 6 — warm/golden must be visually distinct from Scenes 1–5
70
+ - Karaoke word-by-word text rhythm — 1–4 words at a time
71
+ - Gray-haired woman persona in Scene 8 — age and warmth signal are part of the trust mechanic
72
+ - Stacked product boxes in CTA — not just the device
73
+
74
+ ### Swap (per brand)
75
+ - Villain character design — match the category (litter bag for pet, pill bottle for supplement, etc.)
76
+ - Dollar amounts — match what target audience actually spends ($300 on litter, etc.)
77
+ - Calendar day count — match guarantee period exactly (30 days for ODRx, 60 days for TheraPet)
78
+ - Animal type — match product's target animal (cats, dogs, etc.)
79
+ - Guarantee language — must match compliance exactly
80
+ - Product glow color — match brand's device color/LED color
81
+
82
+ ### Never
83
+ - Real competitor brand names — use generic labels
84
+ - "Home stops smelling" → check compliance, may need "room" instead
85
+ - Specific medical claims in agitation scenes — "zombifying" language only if cleared
86
+ - Tone flip before Scene 6 — the first 5 scenes must stay cold/frustrated
87
+
88
+ ---
89
+
90
+ ## AI ACTOR / ANIMATION SPEC
91
+
92
+ ```yaml
93
+ character_style: "Animated 3D — expressive faces, small arms, exaggerated frustrated emotions"
94
+ villain_format: "Product objects as characters — litter bags, pill bottles, spray cans, etc. each with villain face"
95
+ hero_product: "Clean, glowing, warm — NOT animated with face. Product is aspirational, not a character."
96
+ social_proof_persona: "Animated woman, 60–70, gray or white hair, warm smile. 'Carol'-type. Relatable grandmother energy."
97
+ setting_villain: "Chaotic, dark, cluttered — matches the frustration of the problem"
98
+ setting_hero: "Warm, golden, organized — immediate visual contrast from villain scenes"
99
+ ```
100
+
101
+ ---
102
+
103
+ ## DOCX JS STUBS
104
+
105
+ Paste these sceneBlock() calls. Replace `[PLACEHOLDERS]`.
106
+
107
+ ```js
108
+ // SCENE 1 — Hook (use sceneBlock + 5 hookCards above it)
109
+ sceneBlock("SCENE 1 — HOOK", "0–17s | MUST stop the scroll", [
110
+ ["Visual Direction", "Animated setting: [PROBLEM_ENVIRONMENT]. Villain character ([VILLAIN_1_TYPE] with angry face + small arms) positioned between 3 competing [PRODUCT_CATEGORY] devices. Chaotic, dim, frustrated energy."],
111
+ ["On-Screen Text", "Karaoke word-by-word: [HOOK_LINE] — 1–4 words at a time. Key word highlighted in [BRAND_ACCENT_COLOR]."],
112
+ ["VO", "[HOOK_VO_LINE]"],
113
+ ["Purpose", "Establish the problem AND the villain in one scene. Viewer must recognize their own frustration immediately."],
114
+ ])
115
+
116
+ // SCENE 2 — Agitation 1
117
+ sceneBlock("SCENE 2 — AGITATION 1", "17–29s | Consistent across all variations", [
118
+ ["Visual Direction", "[VILLAIN_1_TYPE] INSIDE the failed product ([SPECIFIC_PRODUCT]). [ANIMAL/CHARACTER] still frustrated. Same chaotic setting."],
119
+ ["On-Screen Text", "Karaoke: '[DOLLAR_AMOUNT_WASTED] / [PRODUCT_CATEGORY] / [FAILURE_STATEMENT]'"],
120
+ ["VO", "[AGITATION_1_VO]"],
121
+ ["Purpose", "Quantify the pain. Dollar amount makes it visceral. Villain inside the product = the problem is in the product, not the user."],
122
+ ])
123
+
124
+ // SCENES 3–5: repeat sceneBlock pattern with different villain types and products
125
+
126
+ // SCENE 6 — Tone Flip + Product Intro
127
+ sceneBlock("SCENE 6 — TONE FLIP + PRODUCT INTRO", "62–74s | EMOTIONAL RESET", [
128
+ ["Visual Direction", "FULL TONE FLIP: warm golden lighting replaces cold/chaotic. [HERO_PRODUCT] × 3 units in trio formation on [SURFACE], [ACTIVE_STATE] glowing. [ANIMAL/CHARACTER] present and CALM. No villain characters."],
129
+ ["On-Screen Text", "Karaoke: '[UNLIKE_THOSE / PRODUCT_NAME / ALL IN ONE]' — positive framing for first time"],
130
+ ["VO", "[PRODUCT_INTRO_VO — first mention of hero product by name]"],
131
+ ["Purpose", "Full emotional reset. Problem era is over. Every visual signal (color, warmth, calm animals) signals the solution has arrived."],
132
+ ])
133
+
134
+ // SCENE 7 — Product in Action
135
+ sceneBlock("SCENE 7 — PRODUCT IN ACTION", "74–83s | Mechanism proof", [
136
+ ["Visual Direction", "[HERO_PRODUCT] plugged in / in use. [ACTIVE_STATE] visible. [ANIMAL/CHARACTER] calm and resting below or near device. Low camera angle looking up at product."],
137
+ ["On-Screen Text", "Karaoke: '[MECHANISM] / [KEY_BENEFIT] / [TIME_CLAIM]'"],
138
+ ["VO", "[MECHANISM_VO — how it works, simply]"],
139
+ ["Purpose", "Show the product DOING SOMETHING. The [ACTIVE_STATE] is the proof. Low camera angle makes product feel significant."],
140
+ ])
141
+
142
+ // SCENE 8 — Social Proof
143
+ sceneBlock("SCENE 8 — SOCIAL PROOF", "83–92s | Trust anchor", [
144
+ ["Visual Direction", "Animated [PERSONA_AGE]-year-old woman, warm smile. [ANIMAL/CHARACTER] happy beside her. Calendar on wall showing [GUARANTEE_DAYS] days."],
145
+ ["On-Screen Text", "Karaoke: '[GUARANTEE_DAYS] DAYS / [PRODUCT_BENEFIT] / [ACTION]'"],
146
+ ["VO", "[SOCIAL_PROOF_VO]"],
147
+ ["Purpose", "Human trust anchor before the ask. Calendar = risk reversal is real. Persona age should match target audience."],
148
+ ])
149
+
150
+ // SCENE 9 — CTA
151
+ sceneBlock("SCENE 9 — CTA", "92–98s | Convert", [
152
+ ["Visual Direction", "Bokeh/clean background. Stacked [HERO_PRODUCT] boxes. [ANIMAL/CHARACTER] happy. Satisfaction guarantee badge visible."],
153
+ ["On-Screen Text", "Karaoke: '[SOCIAL_PROOF_NUMBER] / [OFFER_TEXT] / [GUARANTEE_TEXT]'"],
154
+ ["VO", "[CTA_VO — product name + action + guarantee]"],
155
+ ["Purpose", "Drive the one action. Stacked boxes signal availability/popularity. Guarantee removes final objection."],
156
+ ])
157
+ ```
158
+
159
+ ---
160
+
161
+ ## AI GENERATION PROMPTS (per-scene stubs)
162
+
163
+ ```
164
+ SCENE 1 — Villain Hook
165
+ 3D animated [PROBLEM_ENVIRONMENT]. [VILLAIN_1_TYPE] character with angry cartoon face and small arms stands between 3 competing [PRODUCT_CATEGORY] devices. Dark, chaotic, frustrated color palette. [ANIMAL/CHARACTER] present looking unhappy. Karaoke text overlaid word-by-word. 9:16. 17 seconds.
166
+
167
+ SCENES 2–5 — Agitation Stack
168
+ 3D animated [VILLAIN_N_TYPE] character inside/near [FAILED_PRODUCT]. Same chaotic setting. Each scene ends with villain laughing or problem persisting. 9:16. 8–12 seconds each.
169
+
170
+ SCENE 6 — Tone Flip
171
+ DRAMATIC TRANSITION: cold/chaotic → warm/golden. [HERO_PRODUCT] × 3 units on [SURFACE] glowing [ACTIVE_COLOR]. [ANIMAL/CHARACTER] calm and peaceful. Soft warm ambient lighting replaces all previous harsh tones. 9:16. 12 seconds.
172
+
173
+ SCENE 9 — CTA Close
174
+ Clean bokeh background. Stacked [HERO_PRODUCT] boxes in pyramid/stack arrangement. [ANIMAL/CHARACTER] happy sitting nearby. Satisfaction guarantee badge in corner. Warm, aspirational lighting. 9:16. 6 seconds.
175
+ ```
176
+
177
+ ---
178
+
179
+ ## FIRST DEPLOYED — Clarifion ODRx Campaign
180
+
181
+ - Brief: `~/Downloads/Clarifion_ODRx_VideoBrief_TheraPetAI_v1_20260408.docx`
182
+ - Brand kit: `brands/clarifion/brand-kit.md`
183
+ - Script: `/tmp/docx_work/odrx_brief_v3.js`
@@ -0,0 +1,23 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "frozenAt": "2026-04-12T00:00:00.000Z",
4
+ "source": "creative-strategist-v1",
5
+ "templates": [
6
+ { "id": "ad-formats/bedroom-minimic-talk", "slug": "bedroom-minimic-talk", "type": "ad-format", "family": "video-creative", "path": "ad-formats/bedroom-minimic-talk.md" },
7
+ { "id": "ad-formats/villain-animation", "slug": "villain-animation", "type": "ad-format", "family": "video-creative", "path": "ad-formats/villain-animation.md" },
8
+ { "id": "ad-formats/process-specialist-medical","slug": "process-specialist-medical","type": "ad-format", "family": "video-creative", "path": "ad-formats/process-specialist-medical.md" },
9
+ { "id": "ad-formats/frame-analysis", "slug": "frame-analysis", "type": "ad-format", "family": "video-creative", "path": "ad-formats/frame-analysis.md" },
10
+ { "id": "scene-modules/hooks/meme-overlay", "slug": "meme-overlay", "type": "scene-module", "subtype": "hook", "family": "video-creative", "path": "scene-modules/hooks/meme-overlay.md" },
11
+ { "id": "scene-modules/hooks/tiktok-comment", "slug": "tiktok-comment", "type": "scene-module", "subtype": "hook", "family": "video-creative", "path": "scene-modules/hooks/tiktok-comment.md" },
12
+ { "id": "scene-modules/hooks/pov-confession", "slug": "pov-confession", "type": "scene-module", "subtype": "hook", "family": "video-creative", "path": "scene-modules/hooks/pov-confession.md" },
13
+ { "id": "scene-modules/hooks/dollar-amount", "slug": "dollar-amount", "type": "scene-module", "subtype": "hook", "family": "video-creative", "path": "scene-modules/hooks/dollar-amount.md" },
14
+ { "id": "scene-modules/hooks/villain-hook", "slug": "villain-hook", "type": "scene-module", "subtype": "hook", "family": "video-creative", "path": "scene-modules/hooks/villain-hook.md" },
15
+ { "id": "scene-modules/body/minimic-problem", "slug": "minimic-problem", "type": "scene-module", "subtype": "body", "family": "video-creative", "path": "scene-modules/body/minimic-problem.md" },
16
+ { "id": "scene-modules/body/tiktok-skeptic-pivot","slug": "tiktok-skeptic-pivot", "type": "scene-module", "subtype": "body", "family": "video-creative", "path": "scene-modules/body/tiktok-skeptic-pivot.md" },
17
+ { "id": "scene-modules/body/product-demo-glow","slug": "product-demo-glow", "type": "scene-module", "subtype": "body", "family": "video-creative", "path": "scene-modules/body/product-demo-glow.md" },
18
+ { "id": "scene-modules/body/villain-agitation","slug": "villain-agitation", "type": "scene-module", "subtype": "body", "family": "video-creative", "path": "scene-modules/body/villain-agitation.md" },
19
+ { "id": "scene-modules/body/before-after-flatlay","slug": "before-after-flatlay", "type": "scene-module", "subtype": "body", "family": "video-creative", "path": "scene-modules/body/before-after-flatlay.md" },
20
+ { "id": "scene-modules/cta/bogo-meme-bookend", "slug": "bogo-meme-bookend", "type": "scene-module", "subtype": "cta", "family": "video-creative", "path": "scene-modules/cta/bogo-meme-bookend.md" },
21
+ { "id": "scene-modules/cta/guarantee-close", "slug": "guarantee-close", "type": "scene-module", "subtype": "cta", "family": "video-creative", "path": "scene-modules/cta/guarantee-close.md" }
22
+ ]
23
+ }
@@ -0,0 +1,151 @@
1
+ # Scene Module Library — INDEX
2
+ > These are the plug-in building blocks. Each module = one scene or one hook variation.
3
+ > Pull a module file → swap `[PLACEHOLDERS]` from brand-kit.md → paste into brief JS.
4
+ > All modules are format-compatible as noted. Mix across formats where marked.
5
+
6
+ ---
7
+
8
+ ## HOW MODULES WORK
9
+
10
+ Every module contains:
11
+ - **What it does** — the job this scene performs in the ad
12
+ - **Visual direction** — camera, character, setting, lighting
13
+ - **On-screen text** — exact template with `[PLACEHOLDERS]`
14
+ - **Actor dialogue** — full template with delivery notes
15
+ - **JS stub** — ready-to-paste `sceneBlock()` or `hookCard()` row content
16
+ - **AI generation prompt** — ready-to-paste Veo 3 / Runway prompt stub
17
+ - **Brand-kit placeholders** — maps each `[PLACEHOLDER]` to its source field
18
+
19
+ **Placeholder schema (universal across all modules):**
20
+ ```
21
+ [BRAND_NAME] → brand-kit.md → client_name
22
+ [PRODUCT_NAME] → brand-kit.md → primary_service
23
+ [PRICE] → brief content / website
24
+ [OFFER_TEXT] → brand-kit.md → cta_offer
25
+ [LANDING_PAGE] → brand-kit.md → landing_page
26
+ [PAIN_POINT] → brand-kit.md → target_pain_point
27
+ [MECHANISM] → brand-kit.md → approved_phrases
28
+ [ACTIVE_STATE] → brief content (device glow, motion, effect)
29
+ [AI_ACTOR_AGE] → brand-kit.md → ai_actor_age_range
30
+ [ACCENT_COLOR] → brand-kit.md → colors.secondary (hex, no #)
31
+ [GUARANTEE_DAYS] → brand-kit.md → compliance_notes
32
+ ```
33
+
34
+ ---
35
+
36
+ ## HOOKS
37
+
38
+ > Scene 1 only. One hook per variation (A–E). Scenes 2–N identical across all variations.
39
+
40
+ | File | ID | Best For | Format |
41
+ |------|----|----------|--------|
42
+ | `hooks/meme-overlay.md` | `meme-overlay` | Relatable lifestyle pain (tired, broke, frustrated) | `bedroom-minimic-talk` |
43
+ | `hooks/tiktok-comment.md` | `tiktok-comment` | High-skepticism categories; objection-first opens | `bedroom-minimic-talk` |
44
+ | `hooks/pov-confession.md` | `pov-confession` | Mirror moment; female 25–35 demo; skincare/beauty | `bedroom-minimic-talk` |
45
+ | `hooks/dollar-amount.md` | `dollar-amount` | Any category where overspending is the shared pain | `bedroom-minimic-talk`, `villain-animation` |
46
+ | `hooks/villain-hook.md` | `villain-hook` | Animated format; any product displacing incumbents | `villain-animation` |
47
+
48
+ **Recommended hook pairings (5-variation set):**
49
+ ```
50
+ bedroom-minimic-talk (skincare/beauty tech):
51
+ A: meme-overlay ← direct muse mirror — test first
52
+ B: tiktok-comment ← highest persuasion for skeptical categories
53
+ C: dollar-amount ← works for 28–40 Facebook/Meta feed
54
+ D: product-reveal* ← custom hook; device with active glow in frame 1
55
+ E: pov-confession ← native TikTok; mirror moment
56
+
57
+ villain-animation (pet / home / supplement):
58
+ A–E: villain-hook × 5 with different VO lines (see villain-hook.md → Hook Variations section)
59
+ ```
60
+ *product-reveal hook = custom variant; write inline in brief, no module file needed.
61
+
62
+ ---
63
+
64
+ ## BODY SCENES
65
+
66
+ > Scenes 2–N. Identical across all hook variations.
67
+
68
+ | File | ID | Scene # | Format | Beat |
69
+ |------|----|---------|--------|------|
70
+ | `body/minimic-problem.md` | `minimic-problem` | 2 | `bedroom-minimic-talk` | Authority + failed solutions confession |
71
+ | `body/tiktok-skeptic-pivot.md` | `tiktok-skeptic-pivot` | 3 | `bedroom-minimic-talk` | Skeptic disarm + product intro |
72
+ | `body/product-demo-glow.md` | `product-demo-glow` | 4 | `bedroom-minimic-talk` | Product in active use (glow/effect visible) |
73
+ | `body/villain-agitation.md` | `villain-agitation` | 2–5 (×4) | `villain-animation` | Stacked failed solutions as villain characters |
74
+ | `body/before-after-flatlay.md` | `before-after-flatlay` | 5 | `bedroom-minimic-talk` | Split-screen + "this is the real deal." flat lay |
75
+
76
+ **Sequencing rules:**
77
+ ```
78
+ bedroom-minimic-talk order:
79
+ minimic-problem → tiktok-skeptic-pivot → product-demo-glow → before-after-flatlay → [CTA]
80
+
81
+ villain-animation order:
82
+ villain-agitation × 4 → [product intro inline] → [social proof inline] → [CTA]
83
+ (product intro + social proof are format-specific — write inline, not from modules)
84
+ ```
85
+
86
+ ---
87
+
88
+ ## CTAs
89
+
90
+ > Final scene only. One CTA per brief. Select based on offer type + format.
91
+
92
+ | File | ID | Format | Offer Type |
93
+ |------|----|--------|------------|
94
+ | `cta/bogo-meme-bookend.md` | `bogo-meme-bookend` | `bedroom-minimic-talk` | BOGO / % off / any flash offer |
95
+ | `cta/guarantee-close.md` | `guarantee-close` | `villain-animation` | Guarantee + social proof number |
96
+
97
+ **Offer → module mapping:**
98
+ ```
99
+ Buy 1 Get 1 FREE → bogo-meme-bookend
100
+ % Discount → bogo-meme-bookend (swap offer text)
101
+ Free trial → bogo-meme-bookend (swap offer text)
102
+ Satisfaction guarantee → guarantee-close
103
+ Bundle deal → guarantee-close or bogo-meme-bookend depending on format
104
+ ```
105
+
106
+ ---
107
+
108
+ ## ASSEMBLY RECIPES
109
+
110
+ Copy-paste these to brief the production team or start a new JS file.
111
+
112
+ ### Recipe 1: Skincare/Beauty Tech — 23s BOGO (bedroom-minimic-talk)
113
+ ```
114
+ Scene 1: hooks/meme-overlay.md (Hook A — test first)
115
+ hooks/tiktok-comment.md (Hook B)
116
+ hooks/dollar-amount.md (Hook C)
117
+ [custom product-reveal hook] (Hook D — write inline)
118
+ hooks/pov-confession.md (Hook E)
119
+ Scene 2: body/minimic-problem.md
120
+ Scene 3: body/tiktok-skeptic-pivot.md
121
+ Scene 4: body/product-demo-glow.md
122
+ Scene 5: body/before-after-flatlay.md
123
+ Scene 6: cta/bogo-meme-bookend.md
124
+ ```
125
+
126
+ ### Recipe 2: Pet / Home / Supplement — 90–120s Villain Format
127
+ ```
128
+ Scene 1: hooks/villain-hook.md (5 variations A–E)
129
+ Scene 2: body/villain-agitation.md (Agitation 1 — COST)
130
+ Scene 3: body/villain-agitation.md (Agitation 2 — EFFORT)
131
+ Scene 4: body/villain-agitation.md (Agitation 3 — FUTILITY)
132
+ Scene 5: body/villain-agitation.md (Agitation 4 — RISK)
133
+ Scene 6: [product intro — write inline]
134
+ Scene 7: [product in action — write inline]
135
+ Scene 8: [social proof persona — write inline]
136
+ Scene 9: cta/guarantee-close.md
137
+ ```
138
+
139
+ ---
140
+
141
+ ## ADDING NEW MODULES
142
+
143
+ When you build a new brief and a scene is clearly reusable:
144
+ 1. Create `scene-modules/<type>/<new-id>.md` using any existing module as the template
145
+ 2. Add a row to the relevant table above
146
+ 3. Add it to `ad-formats/INDEX.md` under the compatible format
147
+ 4. Note which brief it was first deployed in at the bottom of the module file
148
+
149
+ ---
150
+
151
+ *Scene Module Library — Creative Strategy Worker Kit — April 2026*
@@ -0,0 +1,143 @@
1
+ # Scene Module: Before/After + Product Flat Lay
2
+ > ID: `before-after-flatlay`
3
+ > Type: body (Scene 5)
4
+ > Compatible Formats: `bedroom-minimic-talk`
5
+ > Timecode: 18–21s (in 23s format)
6
+ > Status: ✅ PROVEN — Solawave BOGO (Scene 5)
7
+
8
+ ---
9
+
10
+ ## WHAT IT DOES
11
+
12
+ Two rapid clips back-to-back. First: a split-screen before/after that delivers the social proof in a single glance. Second: a product flat lay with arrows pointing at it and the phrase "this is the real deal." — the product authority close. Together these 3 seconds are the brief's receipt: proof it works, proof of what to buy.
13
+
14
+ **Why it works:** The split-screen is the most trusted visual format for product proof on TikTok/Reels — viewers parse it instantly. The flat lay + arrows is borrowed from the muse's most persuasive moment — it says "I'm putting the camera on the thing that actually matters" without any words needing to explain it. "this is the real deal." is the copy that closes this scene — it's been proven in the muse and should not be paraphrased.
15
+
16
+ ---
17
+
18
+ ## VISUAL DIRECTION
19
+
20
+ ```
21
+ CLIP 1 — Split-Screen (1.5 seconds):
22
+ LEFT side: Bare, natural skin (or before-product state). Label: "before [BRAND_NAME]"
23
+ RIGHT side: Same creator/subject with [PRODUCT_NAME] in use ([ACTIVE_STATE]). Label: "[TIMEFRAME]"
24
+ Lighting: Matching warm light both sides. NOT dramatic — subtle, believable difference.
25
+ Note: "Before" should look normal/real — not intentionally bad. Authenticity > drama.
26
+
27
+ CLIP 2 — Product Flat Lay (1.5 seconds):
28
+ Subject: [PRODUCT_NAME] centered on clean surface (white, marble, or warm wood).
29
+ [ACTIVE_STATE] ON — product facing camera.
30
+ Arrows: 3 white animated arrows pointing DOWN toward the product.
31
+ Appear in sequence (staggered 0.2s each) — not all at once.
32
+ Text: "this is the real deal." — bold white text. Appears after arrows.
33
+ Brand: "[BRAND_NAME]" in smaller text below.
34
+ Lighting: Warm, slightly aspirational. Clean but not clinical.
35
+ ```
36
+
37
+ ---
38
+
39
+ ## ON-SCREEN TEXT
40
+
41
+ ```
42
+ CLIP 1 — Split-Screen labels:
43
+ Left: "before [BRAND_NAME]" — small, white, top or bottom of left panel
44
+ Right: "[TIMEFRAME]" — e.g. "week 3" / "day 14" / "30 days"
45
+ Small, white, top or bottom of right panel.
46
+
47
+ Note: "week 3" not "after 3 weeks" — brevity is required.
48
+ Note: do not use "after" label — it implies a clinical claim. Use timeframe only.
49
+
50
+ CLIP 2 — Flat Lay:
51
+ Line 1: "this is the real deal." — bold, white, all lowercase (muse style)
52
+ Line 2: "[BRAND_NAME]" — slightly smaller, white
53
+ Arrows: animated (not static) — stagger entry for dynamism
54
+ ```
55
+
56
+ ---
57
+
58
+ ## ACTOR DIALOGUE
59
+
60
+ ```
61
+ Spoken over BOTH clips (continuous):
62
+
63
+ Pattern: [personal result statement — specific but not a clinical claim]
64
+
65
+ Template:
66
+ "This is the real deal. [PERSONAL_RESULT] since before I had a reason to worry about it."
67
+
68
+ Examples:
69
+ "This is the real deal. My skin hasn't looked this good since before I had a reason to worry about it."
70
+ "This is the real deal. The marking stopped. Week 3 — completely different house."
71
+ "This is the real deal. I stopped counting how many serums are in the trash."
72
+
73
+ Delivery: Quiet conviction. Not shouting. Not a sales line. Just the truth.
74
+ "This is the real deal." — slight pause before it. Let it land.
75
+ ```
76
+
77
+ ---
78
+
79
+ ## TIMEFRAME CALIBRATION
80
+
81
+ ```
82
+ Use a timeframe that is:
83
+ - Long enough to be believable (not "next day")
84
+ - Short enough to be motivating (not "after 6 months")
85
+ - Consistent with brand compliance guidelines
86
+
87
+ Calibration guide:
88
+ Skincare device: "week 3" / "week 4" / "day 21"
89
+ Supplement: "day 30" / "week 6"
90
+ Pet behavior: "week 2" / "week 3" (behavior changes faster)
91
+ Air quality: "day 3" / "first week" (immediate-ish results credible)
92
+
93
+ Check brand-kit.md → compliance_notes before setting timeframe.
94
+ Never use exact % improvement without clinical backing.
95
+ ```
96
+
97
+ ---
98
+
99
+ ## BRAND-KIT PLACEHOLDERS
100
+
101
+ | Placeholder | Source | Example |
102
+ |-------------|--------|---------|
103
+ | `[BRAND_NAME]` | `brand-kit.md → client_name` | "Solawave" |
104
+ | `[PRODUCT_NAME]` | `brand-kit.md → primary_service` | "Solawave wand" |
105
+ | `[ACTIVE_STATE]` | Brief content | "red light glowing" |
106
+ | `[TIMEFRAME]` | Brief content (compliance-checked) | "week 3" |
107
+ | `[PERSONAL_RESULT]` | Brief content | "My skin hasn't looked this good..." |
108
+
109
+ ---
110
+
111
+ ## COMPLIANCE CHECK (run before finalizing)
112
+
113
+ ```
114
+ [ ] No "before/after" labels (use timeframe on right side only)
115
+ [ ] No specific % improvement claim
116
+ [ ] "Results may vary" included in Scene 6 bottom strip if making any outcome statement
117
+ [ ] Timeframe is plausible and consistent with brand-kit.md → compliance_notes
118
+ [ ] "this is the real deal." is a subjective personal statement — not a clinical claim ✓
119
+ ```
120
+
121
+ ---
122
+
123
+ ## JS STUB (sceneBlock row content)
124
+
125
+ ```js
126
+ // Drop into sceneBlock() rows array for Scene 5
127
+ ["Visual Direction", "(1) Split-screen 1.5s: bare [skin/state] LEFT 'before [BRAND_NAME]' — [PRODUCT_NAME] in use RIGHT '[TIMEFRAME]'. Matching warm light both sides.\n\n(2) Product flat lay: [PRODUCT_NAME] centered on [SURFACE]. [ACTIVE_STATE]. 3 staggered white arrows pointing down. 'this is the real deal.' bold white. '[BRAND_NAME]' below."],
128
+ ["Actor Line", "'This is the real deal. [PERSONAL_RESULT_STATEMENT].'"],
129
+ ["On-Screen Text", "Split: LEFT 'before [BRAND_NAME]' / RIGHT '[TIMEFRAME]'\n\nFlat lay: 'this is the real deal.' bold white + 3 animated arrows + '[BRAND_NAME]'"],
130
+ ["Compliance note", "No % claims. No 'after' label. '[TIMEFRAME]' only. 'Results may vary' in Scene 6 strip."],
131
+ ["Purpose", "Social proof + product authority. Split-screen is the receipt. 'this is the real deal.' closes the credibility loop before CTA."],
132
+ ["Transition", "Hard cut to CTA frame."],
133
+ ```
134
+
135
+ ---
136
+
137
+ ## AI GENERATION PROMPT STUB
138
+
139
+ ```
140
+ CLIP 1 (split-screen): Two-panel vertical split. LEFT: creator bare natural [skin/state], soft warm light, small label 'before [BRAND_NAME]'. RIGHT: same creator with [PRODUCT_NAME] in use [ACTIVE_STATE], small label '[TIMEFRAME]'. Matching warm ambient light both panels. Authentic, subtle difference — not dramatic. 9:16. 1.5 seconds.
141
+
142
+ CLIP 2 (flat lay): [PRODUCT_NAME] centered on [white marble/warm wood] surface. [ACTIVE_STATE] facing camera. Warm soft light. 3 white arrows animated in sequence pointing down at product. 'this is the real deal.' appears in bold white after arrows. Clean, minimal. 9:16. 1.5 seconds.
143
+ ```
@@ -0,0 +1,109 @@
1
+ # Scene Module: Mini-Mic Problem Confession
2
+ > ID: `minimic-problem`
3
+ > Type: body (Scene 2)
4
+ > Compatible Formats: `bedroom-minimic-talk`
5
+ > Timecode: 3–8s (in 23s format)
6
+ > Status: ✅ PROVEN — Solawave BOGO (Scene 2)
7
+
8
+ ---
9
+
10
+ ## WHAT IT DOES
11
+
12
+ The creator lists the things she's already tried — with specificity. Mini-mic in hand, product held casually in the other (not showcasing it yet). The point is to establish shared experience: she's not naive, she's done the work, nothing worked. This converts the viewer from skeptic to peer before the product is ever named.
13
+
14
+ **Why it works:** Shared struggle = trust. If she's tried the same $300 serums and $120 eye creams the viewer has, she has earned the right to recommend something. The casual product hold (not presenting it) creates subconscious anticipation — the viewer wonders what she's holding — without feeling sold to.
15
+
16
+ ---
17
+
18
+ ## VISUAL DIRECTION
19
+
20
+ ```
21
+ Frame: Creator close-up. Mini-mic in one hand at chin/chest level.
22
+ [PRODUCT_NAME] held casually in OTHER hand — not presented, just held.
23
+ Skincare/category items slightly out-of-focus in background (shelf, counter).
24
+ Lighting: Warm ambient — same bedroom setup as hook scene.
25
+ Camera: Tight angles alternating: face → hands/product → face.
26
+ Slight low angle — intimate, confiding.
27
+ Duration: 4–5 seconds.
28
+ ```
29
+
30
+ ---
31
+
32
+ ## ON-SCREEN TEXT
33
+
34
+ ```
35
+ Lists the failed products/attempts the creator has tried.
36
+ Appears as stacked caption beats, not all at once.
37
+
38
+ Template:
39
+ "[FAILED_CATEGORY_1]. [FAILED_CATEGORY_2]. [FAILED_CATEGORY_3]."
40
+ Key words bolded. White text, black outline. Bottom third.
41
+
42
+ Examples:
43
+ "serums. eye creams. sheet masks."
44
+ "$600 red light panels. microneedling. facials."
45
+ "clay litter. crystal litter. enzyme cleaner."
46
+ "supplements. probiotics. prescription topicals."
47
+ ```
48
+
49
+ ---
50
+
51
+ ## ACTOR DIALOGUE
52
+
53
+ ```
54
+ Pattern: [category items tried + dollar anchor] + [the honest failure] + [leads into product]
55
+
56
+ Full template:
57
+ "I've tried [FAILED_1]. [FAILED_2]. [FAILED_3]. [DOLLAR_AMOUNT] later.
58
+ Nothing was giving me what I actually needed for [PAIN_POINT]."
59
+
60
+ Short template (for tighter edits):
61
+ "[DOLLAR_AMOUNT] on [CATEGORY_PRODUCTS]. Nothing for [PAIN_POINT]. Until this."
62
+
63
+ Delivery: Candid, slightly frustrated — but resolved. She's past the frustration.
64
+ This is the origin story, not the complaint. Keep it moving.
65
+ Target: 4–5 seconds spoken, ~30–35 words max.
66
+ ```
67
+
68
+ ---
69
+
70
+ ## TRANSITION OUT
71
+
72
+ ```
73
+ Direct cut to the product being lifted into frame (Scene 3 — Skeptic Pivot).
74
+ OR: Creator lifts the product naturally at end of line — camera follows.
75
+ Do NOT fade or wipe — this format uses hard cuts throughout.
76
+ ```
77
+
78
+ ---
79
+
80
+ ## BRAND-KIT PLACEHOLDERS
81
+
82
+ | Placeholder | Source | Example |
83
+ |-------------|--------|---------|
84
+ | `[FAILED_1/2/3]` | Brief content + category research | "serums / eye creams / sheet masks" |
85
+ | `[DOLLAR_AMOUNT]` | Brief content | "$300" |
86
+ | `[CATEGORY_PRODUCTS]` | Brief content | "serums and red light panels" |
87
+ | `[PAIN_POINT]` | `brand-kit.md → target_pain_point` | "fine lines" / "cat odor" |
88
+ | `[PRODUCT_NAME]` | `brand-kit.md → primary_service` | "Solawave wand" |
89
+
90
+ ---
91
+
92
+ ## JS STUB (sceneBlock row content)
93
+
94
+ ```js
95
+ // Drop into sceneBlock() rows array for Scene 2
96
+ ["Visual Direction", "AI actor close-up, mini-mic in one hand at chin level. [PRODUCT_NAME] held casually in other hand — not presenting, just holding. [CATEGORY_ITEMS] slightly out-of-focus on shelf behind. Warm ambient light. Tight alternating angles: face / hands."],
97
+ ["Actor Line", "'I've tried [FAILED_1], [FAILED_2], [FAILED_3]. [DOLLAR_AMOUNT] later. Nothing was giving me what I actually needed for [PAIN_POINT].'"],
98
+ ["On-Screen Text", "'[FAILED_1]. [FAILED_2]. [FAILED_3].' — stacked caption beats. Key words bold."],
99
+ ["Purpose", "Build credibility through shared experience. Positions [PRODUCT_NAME] reveal as earned discovery, not ad pitch."],
100
+ ["Transition", "Direct cut to [PRODUCT_NAME] lifted into frame for Scene 3."],
101
+ ```
102
+
103
+ ---
104
+
105
+ ## AI GENERATION PROMPT STUB
106
+
107
+ ```
108
+ Photoreal female creator, [AI_ACTOR_AGE], natural look. Bedroom desk. Silver mini-mic in left hand at chin level. [PRODUCT_NAME] held casually in right hand (not presenting — just in hand). [CATEGORY_ITEMS] slightly blurred on shelf behind. She speaks directly and candidly — slightly frustrated resolving to confident. Warm golden ambient light. Tight alternating angles: face close-up / hands + product. Handheld feel. 9:16. 5 seconds.
109
+ ```