@officexapp/vidfarm-devcli 0.21.28 → 0.21.29
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/.agents/skills/editor-capabilities/SKILL.md +26 -0
- package/.agents/skills/vidfarm/SKILL.md +53 -2
- package/.agents/skills/vidfarm/recipes/bulk-scripting-with-a-regime.md +65 -0
- package/.agents/skills/vidfarm/recipes/cutout-graphics-for-explainers.md +78 -7
- package/.agents/skills/vidfarm/recipes/local-edit-render-approve.md +2 -2
- package/.agents/skills/vidfarm/recipes/retheme-template.md +1 -1
- package/.agents/skills/vidfarm/references/automation-and-local-dev.md +64 -5
- package/.agents/skills/vidfarm/references/editor-workflows.md +94 -1
- package/.agents/skills/vidfarm/references/hooks-and-virality.md +237 -0
- package/.agents/skills/vidfarm/references/onboarding.md +1 -1
- package/.agents/skills/vidfarm/regimes/README.md +77 -0
- package/.agents/skills/vidfarm/regimes/explainer.QA_REGIME.md +82 -0
- package/.agents/skills/vidfarm/regimes/hooks.QA_REGIME.md +117 -0
- package/.agents/skills/vidfarm/regimes/product-demo.QA_REGIME.md +92 -0
- package/.agents/skills/vidfarm/regimes/short-form.QA_REGIME.md +163 -0
- package/.agents/skills/vidfarm/regimes/ugc-testimonial.QA_REGIME.md +82 -0
- package/SKILL.director.md +597 -19
- package/SKILL.md +18 -2
- package/demo/dist/app.js +103 -103
- package/dist/src/cli.js +925 -18
- package/dist/src/devcli/handoff.js +162 -0
- package/dist/src/devcli/interaction-mode.js +154 -0
- package/dist/src/devcli/qa-check.js +173 -0
- package/dist/src/devcli/qa-regime.js +396 -0
- package/dist/src/devcli/sticker-pack.js +396 -0
- package/dist/src/devcli/storyboard.js +243 -0
- package/package.json +6 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hooks
|
|
3
|
+
video_type: short-form hook test — cold-algorithm survival into a funnel
|
|
4
|
+
checks:
|
|
5
|
+
duration_sec: 6-45
|
|
6
|
+
aspect: 9:16
|
|
7
|
+
first_frame_visual: required
|
|
8
|
+
first_frame_text: required
|
|
9
|
+
hook_words_max: 7
|
|
10
|
+
text_by_sec: 0.5
|
|
11
|
+
font_regime: required
|
|
12
|
+
max_simultaneous_text: 1
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Hooks Regime
|
|
16
|
+
|
|
17
|
+
Operating rules for short-form hooks that have to survive a cold algorithm and convert into a funnel. Use this regime when the thing you are bulk-generating **is the hook** — same body, N openings — which is the highest-leverage variant axis there is.
|
|
18
|
+
|
|
19
|
+
Copy this file next to your work (`vidfarm regime init hooks --out ./work/QA_REGIME.md`) and edit it. The parts that matter most to you are the parts you add.
|
|
20
|
+
|
|
21
|
+
*(Craft reference: the vidfarm skill's `references/hooks-and-virality.md`. This file is its checkable form — copy and edit it per account.)*
|
|
22
|
+
|
|
23
|
+
## The three gates
|
|
24
|
+
|
|
25
|
+
A hook clears three gates in order. They fail in order too, and each fails *silently* — the view count never tells you which one killed you.
|
|
26
|
+
|
|
27
|
+
| # | Gate | Question | Where it lives | Failure looks like |
|
|
28
|
+
|---|---|---|---|---|
|
|
29
|
+
| 1 | **Legibility** | Can a stranger *understand* this? | Caption chunk 1 | Never leaves the test batch |
|
|
30
|
+
| 2 | **Tension** | Is there something they don't know? | The withheld final clause | Views and likes, no clicks |
|
|
31
|
+
| 3 | **Relevance** | Is this person a buyer? | Chunks 2–3 and the body | Clicks and opt-ins, no sales |
|
|
32
|
+
|
|
33
|
+
**The order is the whole insight.** Almost everyone writes for gate 3 first, because relevance is what marketing training optimizes. But a hook that is maximally relevant and minimally legible never reaches a relevant person.
|
|
34
|
+
|
|
35
|
+
## Gate 1 — Legibility
|
|
36
|
+
|
|
37
|
+
The platform's first test batch is a few hundred essentially random viewers, of whom your buyer is 1–2%. If the opening only parses for someone already living the exact situation, ~98% of the batch swipes without comprehending, watch time craters, and the video never escapes the batch to reach the people who *would* have understood it. **A hook that only works on a perfectly-targeted viewer never gets a perfectly-targeted viewer.**
|
|
38
|
+
|
|
39
|
+
**The unit is caption chunk 1, not "the first 3 seconds."** Captions render in phrase chunks of ~2–6 words, and the viewer reads chunk one *before hearing any audio*. The real hook unit is words 1–5 on screen — which is why `first_frame_text` and `hook_words_max` are machine-checked above.
|
|
40
|
+
|
|
41
|
+
> **Chunk 1 must be legible to everyone and relevant to few.**
|
|
42
|
+
|
|
43
|
+
Three constraints:
|
|
44
|
+
|
|
45
|
+
1. **Complete clause — subject plus verb.** Not a noun phrase, not a bare number, not a label. This one rule fixes most failures, because a clause forces context in.
|
|
46
|
+
2. **No jargon.** A domain term in chunk 1 kills the cold start even inside a valid clause. Jargon belongs in chunk 2+, where it *qualifies* instead of excluding.
|
|
47
|
+
3. **The cold-viewer test.** Would a random person with no interest in the category understand what situation is described? Not *would they care* — *would they understand*.
|
|
48
|
+
|
|
49
|
+
**The cheapest predictor: situations, not labels.** A situation is a thing that happened, with a subject and an outcome — *someone deleted my message · she refused my money · they stopped replying · tracking said delivered*. A stranger parses all of it instantly, because humans are built to parse events. A label is a concept with a name — *anonymity · distribution · platform risk · seeding* — and it carries meaning only for someone who already holds the category, which is exactly the person the cold-start batch does not contain. If your opening names a concept rather than an event, assume it fails until proven otherwise.
|
|
50
|
+
|
|
51
|
+
| Fragment (fails) | Complete clause (passes) |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `SIX STARTS, ZERO FINISHES` | `I'VE QUIT SIX BUSINESSES` |
|
|
54
|
+
| `FOURTH APP` | `I SHIPPED MY FOURTH APP` |
|
|
55
|
+
| `ANONYMITY` | `I'VE NEVER SHOWN MY FACE` |
|
|
56
|
+
| `$50,000 IN SALES` | `THEY WANTED $50,000 FIRST` |
|
|
57
|
+
| `TWO HOURS A WEEK` | `THIS TAKES TWO HOURS A WEEK` |
|
|
58
|
+
|
|
59
|
+
**Banned chunk-1 openers:** *So I was thinking · There's a reason · Here's the thing · A lot of people · If you're a… · Let me tell you* — any throat-clearing. The first words are the most expensive real estate you own.
|
|
60
|
+
|
|
61
|
+
## Gate 2 — Tension
|
|
62
|
+
|
|
63
|
+
**Identification and curiosity are different jobs.** Identification ("that's me") earns a like, a save, a follow. Curiosity ("wait, what?") earns **a click**. If the hook's job is a click into a funnel, the loop matters more than the resonance.
|
|
64
|
+
|
|
65
|
+
**The mechanical fix:** most weak hooks state the insight *and its resolution* in one line, so there is nothing left to find out. Move the payoff out of the line and into the video body — same insight, same specificity, the last clause just stops answering itself.
|
|
66
|
+
|
|
67
|
+
| Closes | Opens |
|
|
68
|
+
|---|---|
|
|
69
|
+
| "I paid three creators. I ended up teaching all three how to hook." | "I paid three creators. The third one told me why the first two ghosted." |
|
|
70
|
+
| "Every customer I have, I'm renting." | "I asked my lead company one question. Their answer told me I don't own a single customer." |
|
|
71
|
+
| "Launch day: three upvotes, two of them mine." | "Fourth launch, three upvotes. The problem was never the product." |
|
|
72
|
+
|
|
73
|
+
> **Tension in the first chunk. Withheld answer in the last chunk.**
|
|
74
|
+
|
|
75
|
+
**The answer must be unguessable.** A structurally valid loop whose answer the viewer can supply themselves **is not a loop** — the withhold happens on the page, the resolution happens in their head before their thumb moves. This is the most dangerous failure in this document, because it passes every mechanical check above and dies in the field. Two ways out: withhold something only you know (the other side of a transaction, what the gatekeeper actually checks), or send them to check rather than telling them (*"Go and look at who's still watching at eleven at night"*) — an unresolved belief they can't close from the sofa.
|
|
76
|
+
|
|
77
|
+
**Don't force it.** When a line lands in one beat and withholding would break it, keep it and *label it an identification hook*. Tagged, those become the control group that tells you whether loops actually beat identification for your audience.
|
|
78
|
+
|
|
79
|
+
## Gate 3 — Relevance
|
|
80
|
+
|
|
81
|
+
- **Offer adjacency.** The hook should be the "before" of the offer's "after." A hook that fully solves the problem, or creates a desire the offer doesn't resolve, is *worse* than a weak hook: it fills the funnel with people who will never buy. Symptom — great opt-in rate, lead→paid under ~5%, visible only after you've scaled it.
|
|
82
|
+
- **Deliverability.** Aggression isn't the problem, undeliverability is. A promise the offer can't keep buys front-end conversion with churn. Point the aggression at what you can demonstrate.
|
|
83
|
+
- **Guarantees are proof, not headline.** Leading with the guarantee attracts guarantee-shoppers who churn at the boundary.
|
|
84
|
+
- **Sell the entry promise, not the offer.** The hook's job is to match what the *next screen* says. A hook that pitches the end offer desyncs the sequence.
|
|
85
|
+
|
|
86
|
+
## Anti-patterns for bulk generation
|
|
87
|
+
|
|
88
|
+
Read these before you loop — they are the failure modes that only appear at volume.
|
|
89
|
+
|
|
90
|
+
- **Never point a generator at your grader.** A model writing hooks scored by a model converges on whatever the rubric measures, not on what works. The rubric is a check on a hook you already believe in, **never a ranking function**. Use it to catch defects, not to pick winners.
|
|
91
|
+
- **A different noun is not a different hook.** If two variants could be filmed from one script by changing one word, you have one hook — and a batch of 20 of those teaches you nothing. This is the dominant failure mode when bulk-generating for a category that spans verticals.
|
|
92
|
+
- **Specificity is observed detail, not generated nouns.** `Boston window cleaner` is a generated token; `comment posted 9:14, video finished 9:55` is an observation. One sounds invented, the other sounds witnessed.
|
|
93
|
+
- **Obscurity is not qualification.** A hard-to-parse opening filters for nobody, because the video never reaches anyone. Qualification is the body's job.
|
|
94
|
+
|
|
95
|
+
## The measurement regime
|
|
96
|
+
|
|
97
|
+
- **The cluster is the unit, not the hook.** A single hook at low view counts tells you nothing — variance dominates. A cluster is a bet on one buyer insight and one emotional lever; that's what you kill or scale. One attribution slug per cluster, one cluster per account.
|
|
98
|
+
- **Judge on the metric that pays rent.** In increasing order of truth: views → completions → profile visits → **funnel completions per post** → **revenue per 1,000 views**.
|
|
99
|
+
- **Read the retention curve:** cliff in the first 2–3s = chunk 1 failed · gentle decline with low completion = the body doesn't pay off the hook · good completion but no profile visits = you built identification, not curiosity · good clicks but no sales = offer adjacency.
|
|
100
|
+
- **Then play the power law.** ~2% of videos produce ~90% of results. When one hits, make ten more of exactly it. Iterate on winners; never fix losers.
|
|
101
|
+
|
|
102
|
+
## Pre-flight checklist
|
|
103
|
+
|
|
104
|
+
- [ ] Chunk 1 is a complete clause with a subject and a verb
|
|
105
|
+
- [ ] Chunk 1 names a **situation**, not a label or concept
|
|
106
|
+
- [ ] Chunk 1 contains no domain jargon
|
|
107
|
+
- [ ] A stranger with no interest in the category understands the situation
|
|
108
|
+
- [ ] No throat-clearing in the first words
|
|
109
|
+
- [ ] The final clause withholds
|
|
110
|
+
- [ ] **The withheld answer is one the viewer cannot supply themselves**
|
|
111
|
+
- [ ] Frame 0 works as a standalone thumbnail — subject in frame, caption legible
|
|
112
|
+
- [ ] The promise can be cashed, honestly, every time
|
|
113
|
+
- [ ] The person this attracts is someone who would buy
|
|
114
|
+
- [ ] It matches what the next screen actually says
|
|
115
|
+
- [ ] It is a genuinely different video from every other hook in the batch
|
|
116
|
+
|
|
117
|
+
Twelve checks. Two carry most of the weight and are the two almost everyone skips: **situation, not label** predicts cold-start survival before you write a word, and **unguessable** is the only item a hook can fail while passing every other item — which is why it gets shipped.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: product-demo
|
|
3
|
+
video_type: product / SaaS demo, feature reveal, launch clip
|
|
4
|
+
checks:
|
|
5
|
+
duration_sec: 10-90
|
|
6
|
+
first_frame_visual: required
|
|
7
|
+
first_frame_text: required
|
|
8
|
+
captions: required
|
|
9
|
+
font_regime: required
|
|
10
|
+
max_text_cards: 3
|
|
11
|
+
max_simultaneous_text: 1
|
|
12
|
+
forbid_text:
|
|
13
|
+
- sign up for a free trial
|
|
14
|
+
- get started today
|
|
15
|
+
- book a demo
|
|
16
|
+
- learn more
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Product Demo QA Regime
|
|
20
|
+
|
|
21
|
+
For showing a real product doing a real thing. This is the format with the **highest slop risk in the entire catalog**, because the subject matter is a website — so the author's web instincts and the product's own design language both push toward putting a landing page on the timeline.
|
|
22
|
+
|
|
23
|
+
## The one test
|
|
24
|
+
|
|
25
|
+
> **Does the video show the product doing something, or does it describe the product?**
|
|
26
|
+
|
|
27
|
+
A demo shows the screen changing. Everything else — the value prop, the pricing, the benefits, the logos — is a landing page that happens to be rendered as video, and it converts like one (i.e. it doesn't, in a feed).
|
|
28
|
+
|
|
29
|
+
## Structure
|
|
30
|
+
|
|
31
|
+
| Beat | Job |
|
|
32
|
+
|---|---|
|
|
33
|
+
| **The before** (0:00–0:03) | The painful version of the task, shown. Not stated |
|
|
34
|
+
| **The move** | The one action that changes it. A click, a paste, a command |
|
|
35
|
+
| **The after** | The result, on screen, uncut, long enough to be believed |
|
|
36
|
+
| **The scope** | What it doesn't do / what it costs. One line, honest |
|
|
37
|
+
| **The close** | Where to find it — *said*, not rendered as a button |
|
|
38
|
+
|
|
39
|
+
**Open on the pain, in the product, not on the logo.** A logo open spends the thumbnail and the first second on the one thing the viewer has no reason to care about yet.
|
|
40
|
+
|
|
41
|
+
## Rules
|
|
42
|
+
|
|
43
|
+
### Rule 1 — the demo is real, uncut, and at real speed
|
|
44
|
+
|
|
45
|
+
Speed-ramping through the boring parts is fine and expected; **cutting away at the moment the product does its work is not** — that's the exact beat the viewer is deciding on. If the real thing takes 40 seconds, show a compressed version and say it took 40 seconds. A demo that hides its latency reads as a mockup.
|
|
46
|
+
|
|
47
|
+
### Rule 2 — no landing page on the timeline
|
|
48
|
+
|
|
49
|
+
This is the banned list, and it's not stylistic — every one of these is web furniture that appears in zero real feed videos:
|
|
50
|
+
|
|
51
|
+
- CTA buttons and capsules ("Sign Up for a Free Trial →"). Machine-checked above via `forbid_text`.
|
|
52
|
+
- Benefit chip / badge rows ("✓ No credit card needed").
|
|
53
|
+
- Pricing cards, feature grids, comparison tables, "as seen in" logo strips.
|
|
54
|
+
- Frosted/bordered cards holding a headline + URL, gradient text fills.
|
|
55
|
+
|
|
56
|
+
**Nothing in a video is clickable.** The CTA is spoken, or it's a plain caption line, or it's an arrow pointing at the real UI.
|
|
57
|
+
|
|
58
|
+
### Rule 3 — one feature per video
|
|
59
|
+
|
|
60
|
+
The launch-post instinct is to cover everything shipped. A feed video that covers four features teaches none of them and gets remembered for zero. Ship four videos.
|
|
61
|
+
|
|
62
|
+
### Rule 4 — the UI must be legible on a phone
|
|
63
|
+
|
|
64
|
+
Full-screen browser captures are unreadable at phone scale. Crop to the region that changes, scale it up, and let the rest go. If the viewer can't read the thing that changed, the demo didn't happen. Zoom on the change, not on the chrome.
|
|
65
|
+
|
|
66
|
+
### Rule 5 — say the price or say nothing
|
|
67
|
+
|
|
68
|
+
Pricing teased ("starting at…"), asterisked, or implied does more damage than a number that's higher than expected. Either the price is part of the story and it's stated plainly, or the video isn't about price.
|
|
69
|
+
|
|
70
|
+
### Rule 6 — production floor
|
|
71
|
+
|
|
72
|
+
Captions verbatim, font regime, safe zone · frame 0 shows the product mid-task with a caption up, never a logo or a title card · brand colors are fine, brand *layouts* are not · no music that fights the click sounds if the interaction is the point.
|
|
73
|
+
|
|
74
|
+
## Bulk-generation notes
|
|
75
|
+
|
|
76
|
+
The variant axis is **the before**: the same feature demoed against N different starting pains, one per audience segment. Same move, same after, different opening 3 seconds — which is also the cheapest possible variant to generate, since only the head of the timeline changes.
|
|
77
|
+
|
|
78
|
+
Resist the temptation to fan out on visual style instead. Ten themes of one video is one video; ten pains is ten videos.
|
|
79
|
+
|
|
80
|
+
## Pre-flight checklist
|
|
81
|
+
|
|
82
|
+
- [ ] The video shows the product doing something, not describing it
|
|
83
|
+
- [ ] It opens on the pain inside the product, not on a logo or title card
|
|
84
|
+
- [ ] The moment the product does its work is on screen, uncut
|
|
85
|
+
- [ ] Exactly one feature is covered
|
|
86
|
+
- [ ] The changing UI region is cropped and scaled to be legible on a phone
|
|
87
|
+
- [ ] There is one honest scope line (what it doesn't do, or what it costs)
|
|
88
|
+
- [ ] No CTA button, benefit chip row, pricing card, feature grid, or logo strip
|
|
89
|
+
- [ ] The CTA is spoken or a plain caption line — nothing on screen looks clickable
|
|
90
|
+
- [ ] Price is either stated plainly or absent entirely
|
|
91
|
+
- [ ] Frame 0 shows the product mid-task and works as a standalone thumbnail
|
|
92
|
+
- [ ] In a batch: this variant opens on a genuinely different pain, not a restyled one
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: short-form
|
|
3
|
+
video_type: general short-form social video (TikTok / Reels / Shorts) — the default base regime
|
|
4
|
+
checks:
|
|
5
|
+
duration_sec: 8-90
|
|
6
|
+
aspect: 9:16
|
|
7
|
+
first_frame_visual: required
|
|
8
|
+
first_frame_text: required
|
|
9
|
+
text_by_sec: 1.0
|
|
10
|
+
captions: required
|
|
11
|
+
font_regime: required
|
|
12
|
+
max_text_cards: 3
|
|
13
|
+
max_simultaneous_text: 2
|
|
14
|
+
max_scene_sec: 8
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Short-Form QA Regime
|
|
18
|
+
|
|
19
|
+
The default base. Start here, copy it next to your work, then **delete what doesn't apply and add what makes your format yours** — a regime you didn't edit is a regime that isn't about your videos.
|
|
20
|
+
|
|
21
|
+
> **Part I** is the anatomy: the four charges that decide whether a video travels.
|
|
22
|
+
> **Part II** is the rules that keep it credible.
|
|
23
|
+
> Run the pre-flight checklist before you build, and `vidfarm qa <dir> --regime ./QA_REGIME.md` before you publish. An unchecked box is a rewrite, not a fix in the edit.
|
|
24
|
+
|
|
25
|
+
## Part 0 — who this is for (fill this in yourself)
|
|
26
|
+
|
|
27
|
+
**Write your viewer in one line, at the top of your copy of this file, before anything else.** A perfectly-built video aimed at the wrong person is the most expensive mistake available, and it fails *silently* — nobody comments "this wasn't for me," they just scroll.
|
|
28
|
+
|
|
29
|
+
Name: who they are, what they're choosing between (their real alternatives, which are rarely your competitors), the beliefs the video has to land, and the register you speak in. Every rule below is executed differently depending on that answer, which is exactly why this section can't be shipped pre-filled.
|
|
30
|
+
|
|
31
|
+
## Part I — the anatomy
|
|
32
|
+
|
|
33
|
+
*(The craft behind every rule below — the three gates, situations-vs-labels, loop mechanics, diagnosis by charge — is the vidfarm skill's `references/hooks-and-virality.md`. This file is the checkable form.)*
|
|
34
|
+
|
|
35
|
+
**Four charges, in series, like a firework.** Each is loaded separately, and each can be weak while the others are strong — which is why you diagnose a flop *by charge*, never by declaring the whole video bad.
|
|
36
|
+
|
|
37
|
+
| Charge | Job | Where it fails | Symptom when it's the weak one |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| 🪝 **Hook** | Stop the scroll | First 3 seconds | Almost no views at all |
|
|
40
|
+
| 🔄 **Curiosity loop** | Hold to the end | ~0:08 → the payoff | Views, but everyone leaves at 5s |
|
|
41
|
+
| 😍 **Payoff** | Tap the desire | Last third | Watched to the end, no reaction |
|
|
42
|
+
| 🎣 **Bait** | Provoke a comment | Final beat + post caption | Good watch time, dead comments |
|
|
43
|
+
|
|
44
|
+
**Hold three constant, vary one, post, compare.** That is the only reliable way to learn which charge is your weak one — and it's the reason bulk generation is worth doing at all.
|
|
45
|
+
|
|
46
|
+
### 🪝 Hook — the first 3 seconds
|
|
47
|
+
|
|
48
|
+
Three seconds, not five. The decision is made before you finish the first sentence, so **the first sentence must be the whole claim**, not the run-up to it.
|
|
49
|
+
|
|
50
|
+
**Stack three hooks simultaneously** — most videos fire only one:
|
|
51
|
+
|
|
52
|
+
1. **Verbal** — the spoken line.
|
|
53
|
+
2. **Text** — a caption already on screen at frame 0, readable before a word is said.
|
|
54
|
+
3. **Visual** — motion, an unusual angle, a face already mid-sentence, hands already working.
|
|
55
|
+
|
|
56
|
+
**Muted autoplay is the default viewing condition, so the text hook does more work than the verbal one.** If the video only works with sound on, it doesn't work.
|
|
57
|
+
|
|
58
|
+
**Banned openings:** throat-clearing ("Hey guys", "So I wanted to talk about…") · a logo, title card, fade from black, or a beat of silence · any sentence whose subject arrives in the second half · context before the claim (context is beat 2).
|
|
59
|
+
|
|
60
|
+
⚠️ **Frame 0 is the hook AND the thumbnail.** No black open, no fade, subject in frame, caption already legible. See the `hooks` regime for the full chunk-1 craft.
|
|
61
|
+
|
|
62
|
+
### 🔄 Curiosity loop — retention
|
|
63
|
+
|
|
64
|
+
An open question planted early and paid off late. **The charge most videos skip entirely**, and the one that separates 200 views from 30,000.
|
|
65
|
+
|
|
66
|
+
- **Open it by 0:10.** After that you're re-hooking someone who already decided to leave.
|
|
67
|
+
- **Say the loop on screen**, not just out loud — a timer, a running counter, a caption that persists.
|
|
68
|
+
- **One loop.** Two open questions dilute both.
|
|
69
|
+
- **The loop opens and closes inside THIS video.** Withholding for forty seconds is retention; deferring the answer to another upload is a broken video (see Rule 1).
|
|
70
|
+
- **Never bait-and-switch the payoff.** If you promised a number, give the real number.
|
|
71
|
+
|
|
72
|
+
Mechanics, ranked: the withheld number (strongest — a real number is a promise you can keep, and a timer sustains it visually) · the withheld part ("one part of this nobody explains") · the numbered list ("three reasons, the third is the only one that matters") · the unresolved visual (works muted, zero words) · the contradiction/concession ("X pays better, and I'm still going to explain this").
|
|
73
|
+
|
|
74
|
+
### 😍 Payoff — tap the desire
|
|
75
|
+
|
|
76
|
+
The moment the video pays what the hook promised, landing on **what they actually want**, not on what you're selling.
|
|
77
|
+
|
|
78
|
+
- **Show it, don't summarize it.** The result plays, full frame, ≥5 uninterrupted seconds. Description is not payoff.
|
|
79
|
+
- **The payoff is not the CTA.** Pitching where the payoff belongs is the most common way a good video converts nothing.
|
|
80
|
+
- **Land it before the final beat.** Payoff, then bait, then close — a payoff in the last second gets cut off by the loop-around.
|
|
81
|
+
- **Go past the functional layer.** The satisfying beat is usually the honest limit named out loud, not the feature list.
|
|
82
|
+
|
|
83
|
+
### 🎣 Bait — comments are distribution
|
|
84
|
+
|
|
85
|
+
A video with replies gets shown again; a video with none dies at its first audience regardless of watch time. **Bait is a deliberate beat, not something you hope for.** One ask, in the final beat, **and in the post caption** (many people reply from the caption without finishing).
|
|
86
|
+
|
|
87
|
+
Works: the confession invite ("tell me which one you already quit") · the guess ("guess how long it took, I say it at the end" — pairs perfectly with a withheld-number loop) · the named omission ("I left one thing out on purpose, ask me") · the soft disagree (a true concession people want to argue with) · a specific question, never "thoughts?".
|
|
88
|
+
|
|
89
|
+
Doesn't: ragebait or a deliberate error to farm corrections (works once, costs the positioning permanently) · "follow for part two" (breaks Rule 1) · DM funnels · anything that makes bait the price of the payoff. **Pay off first, then ask.**
|
|
90
|
+
|
|
91
|
+
### 📝 Captions — the delivery system for three of the four charges
|
|
92
|
+
|
|
93
|
+
Not an accessibility afterthought: captions are how the hook, the loop, and the payoff reach a muted viewer.
|
|
94
|
+
|
|
95
|
+
- **Verbatim, every word.** Paraphrased captions desync from the voice and read as fake.
|
|
96
|
+
- **Weight 700–900, inside the 8–85% safe zone.** Below 700 disappears against footage.
|
|
97
|
+
- **One to three words per line, one line at a time.** A block of full sentences doesn't get read.
|
|
98
|
+
- **Cards are timed text over footage** — never a card UI, table, chip row, or frosted panel (`vidfarm qa` flags those as slop).
|
|
99
|
+
- **Max ~3 standalone cards per video:** one for the loop, one for the payoff, one for the bait.
|
|
100
|
+
|
|
101
|
+
## Part II — the rules
|
|
102
|
+
|
|
103
|
+
### Rule 1 — every video is standalone. There is no part two.
|
|
104
|
+
|
|
105
|
+
A viewer arriving mid-scroll with zero context must get a complete, useful video. **You do not control the order** — your video 12 is most people's video 1, and if one breaks out it breaks out *alone*. A cross-video cliffhanger converts your one winner into a dead end. Sharing an angle, a look, or a set of beliefs across the catalog is the strategy; *dependency* is what's banned. Test: hand it to someone who knows nothing — "wait, what is this?" and "where's the rest?" are both failures.
|
|
106
|
+
|
|
107
|
+
### Rule 2 — re-establish the premise every time, and don't apologize for it
|
|
108
|
+
|
|
109
|
+
One jargon-free sentence inside the first eight seconds, **after** the hook. It feels redundant to you and is load-bearing for a viewer who has heard it zero times. Vary the phrasing so the feed doesn't read as copy-paste.
|
|
110
|
+
|
|
111
|
+
### Rule 3 — claim the mechanism, never the outcome
|
|
112
|
+
|
|
113
|
+
Say how the thing works and what it costs. Don't promise the result — it's the claim you can't cash, and on money/health/appearance topics it's also the one that draws platform enforcement. An explicit refusal beat ("I'm not going to tell you what you'd make") reads as credibility, not as a disclaimer, and is often the strongest beat in the video.
|
|
114
|
+
|
|
115
|
+
### Rule 4 — concede something true and unflattering, early
|
|
116
|
+
|
|
117
|
+
Credibility is bought, and the currency is a concession they didn't expect — in the first ten seconds, so everything after inherits it. At the end it reads as a disclaimer. It doubles as a hook shape and as a loop opener ("so why bother?").
|
|
118
|
+
|
|
119
|
+
### Rule 5 — show the work, not a claim
|
|
120
|
+
|
|
121
|
+
Real screen capture > POV/hands > on camera > kinetic text. **Real numbers only** — rounding in your favor is the same category of lie as an outcome claim, and the audience does the arithmetic in about four seconds.
|
|
122
|
+
|
|
123
|
+
### Rule 6 — production floor
|
|
124
|
+
|
|
125
|
+
Verbatim captions in the font regime and the safe zone · frame 0 works as hook and thumbnail · no HTML slop (no CTA buttons, pricing cards, feature grids, benefit chips, frosted panels) · no URL or brand chrome on screen unless the angle *is* the offer.
|
|
126
|
+
|
|
127
|
+
## Pre-flight checklist
|
|
128
|
+
|
|
129
|
+
**Anatomy**
|
|
130
|
+
- [ ] 🪝 The claim is complete inside 3 seconds — no throat-clearing, no context first
|
|
131
|
+
- [ ] 🪝 Verbal + text + visual hooks all fire; a caption is legible at frame 0
|
|
132
|
+
- [ ] 🪝 Frame 0 works as a standalone thumbnail a stranger would stop on
|
|
133
|
+
- [ ] 🔄 One curiosity loop, opened by 0:10 and stated on screen
|
|
134
|
+
- [ ] 🔄 The loop closes in this video, and the payoff is the thing that was promised
|
|
135
|
+
- [ ] 😍 The payoff is shown, not summarized, and lands before the final beat
|
|
136
|
+
- [ ] 🎣 One bait ask, in the final beat and in the post caption
|
|
137
|
+
- [ ] 🎣 The bait is not ragebait, a DM funnel, or a follow-for-part-two
|
|
138
|
+
|
|
139
|
+
**Standalone**
|
|
140
|
+
- [ ] A stranger seeing only this video understands what it's about
|
|
141
|
+
- [ ] Premise re-established in one sentence within 8 seconds, after the hook
|
|
142
|
+
- [ ] Zero references to other videos; the close resolves here
|
|
143
|
+
|
|
144
|
+
**Credibility**
|
|
145
|
+
- [ ] Mechanism claimed, outcome not promised; every number on screen is real
|
|
146
|
+
- [ ] One true, unflattering concession in the first ten seconds
|
|
147
|
+
|
|
148
|
+
**Production**
|
|
149
|
+
- [ ] Verbatim captions, weight 700–900, safe zone, one line at a time
|
|
150
|
+
- [ ] ≤3 standalone cards, no slop furniture, `vidfarm qa` otherwise clean
|
|
151
|
+
- [ ] In a batch: this variant differs from its siblings by more than one noun
|
|
152
|
+
|
|
153
|
+
## Diagnosing a flop — read the charges, not the video
|
|
154
|
+
|
|
155
|
+
| What the numbers say | Weak charge | Fix |
|
|
156
|
+
|---|---|---|
|
|
157
|
+
| Barely any views | 🪝 Hook | Rewrite the first 3s. New opening line, new frame 0 |
|
|
158
|
+
| Views, mass exit at 3–8s | 🔄 Loop | No open question. Plant one by 0:10 |
|
|
159
|
+
| Watched to the end, no reaction | 😍 Payoff | Landed on features, not desire |
|
|
160
|
+
| Good retention, no comments | 🎣 Bait | No ask, or the ask was "thoughts?" |
|
|
161
|
+
| Comments, but hostile | 🎣 Bait | Ragebait or an over-claim |
|
|
162
|
+
|
|
163
|
+
**Vary one charge at a time.** A batch where everything changed at once teaches you nothing — which is the entire point of running scripting mode against a regime instead of just generating volume.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ugc-testimonial
|
|
3
|
+
video_type: UGC / talking-head testimonial — a person on camera vouching for a product
|
|
4
|
+
checks:
|
|
5
|
+
duration_sec: 12-60
|
|
6
|
+
aspect: 9:16
|
|
7
|
+
first_frame_visual: required
|
|
8
|
+
first_frame_text: required
|
|
9
|
+
captions: required
|
|
10
|
+
audio: required
|
|
11
|
+
font_regime: required
|
|
12
|
+
max_text_cards: 2
|
|
13
|
+
max_simultaneous_text: 1
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# UGC / Testimonial QA Regime
|
|
17
|
+
|
|
18
|
+
For the format where a person talks to camera about a product they use. The entire value of the format is that it **doesn't look produced** — so most of this regime is about what NOT to add.
|
|
19
|
+
|
|
20
|
+
## The one test
|
|
21
|
+
|
|
22
|
+
> **Would this survive being posted from the speaker's own account, with no brand involved?**
|
|
23
|
+
|
|
24
|
+
If the answer needs the brand's permission, budget, or logo, it isn't UGC — it's an ad wearing UGC's clothes, and the audience reads that in under a second. The failure is not "it looks cheap"; it's "it looks funded," and funded means skippable.
|
|
25
|
+
|
|
26
|
+
## Structure
|
|
27
|
+
|
|
28
|
+
| Beat | Runtime | Job |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| **Situation** | 0:00–0:03 | The problem, as a thing that happened to *them*. Not a claim about the product |
|
|
31
|
+
| **Turn** | 0:03–0:10 | What they tried, what changed. The product enters here, never in the first line |
|
|
32
|
+
| **Demonstration** | the middle | Screen or hands. The product doing the thing, on their real account/desk/kitchen |
|
|
33
|
+
| **Honest limit** | before the close | What it doesn't do / who it isn't for. **The credibility beat** |
|
|
34
|
+
| **Close** | final beat | What they'd tell a friend. Not a CTA read |
|
|
35
|
+
|
|
36
|
+
**The product enters second, never first.** A testimonial that opens on the product is a commercial. It opens on the *situation* — and situations are also what survives a cold algorithm (see the `hooks` regime).
|
|
37
|
+
|
|
38
|
+
## Rules
|
|
39
|
+
|
|
40
|
+
### Rule 1 — first person, specific, and falsifiable
|
|
41
|
+
|
|
42
|
+
"It saves me time" is an ad line. "I used to spend Sunday night on this and now I don't" is a testimonial. Every claim should be a thing that happened, with a when and a how much. Vague praise reads as paid; specific mundane detail reads as real.
|
|
43
|
+
|
|
44
|
+
### Rule 2 — one honest limit, said out loud
|
|
45
|
+
|
|
46
|
+
The beat that makes everything else believable. It is not a disclaimer and it does not go at the end as fine print — it goes in the body, in the speaker's own voice, and it should cost you something real. A testimonial with no limit is a review nobody believes.
|
|
47
|
+
|
|
48
|
+
### Rule 3 — never claim an outcome the viewer's situation can't reproduce
|
|
49
|
+
|
|
50
|
+
Results-may-vary in tiny type does not fix a headline result. If the number depends on the speaker's audience, budget, or luck, either say what it depended on or don't say the number.
|
|
51
|
+
|
|
52
|
+
### Rule 4 — production floor: deliberately low
|
|
53
|
+
|
|
54
|
+
- **Audio is the only thing allowed to be good.** Bad audio is the one production sin the format doesn't forgive; everything else *should* look handheld.
|
|
55
|
+
- **No b-roll montage, no music swell, no logo sting, no lower-third name card.** A brand logo on screen converts this from a testimonial into an ad.
|
|
56
|
+
- **Captions verbatim**, weight 700–900, safe zone, one line at a time. Never kinetic VFX captions — produced captions are the single loudest "this was made by a marketing team" signal.
|
|
57
|
+
- **At most two standalone text cards** in the whole video, and only to surface a number the speaker said out loud.
|
|
58
|
+
- **Frame 0:** the speaker already mid-sentence, in frame, with a caption up. Not a title card, not a product shot, not black.
|
|
59
|
+
|
|
60
|
+
### Rule 5 — disclosure is not optional
|
|
61
|
+
|
|
62
|
+
Paid, gifted, or affiliate relationships get disclosed on screen and in the caption. Beyond the legal exposure, an undisclosed relationship that surfaces later costs more trust than the video ever bought.
|
|
63
|
+
|
|
64
|
+
## Bulk-generation notes
|
|
65
|
+
|
|
66
|
+
The natural variant axis here is **the situation, not the script**: five different opening situations pointing at the same turn and demonstration. Varying the adjectives instead of the situation gives you five videos that are one video — and the algorithm treats near-duplicates accordingly.
|
|
67
|
+
|
|
68
|
+
If you're generating variants with different speakers/avatars, hold the honest-limit beat constant. It's the load-bearing one, and it's the one an AI rewrite is most likely to quietly soften into nothing.
|
|
69
|
+
|
|
70
|
+
## Pre-flight checklist
|
|
71
|
+
|
|
72
|
+
- [ ] The first line is a situation that happened to the speaker, not a product claim
|
|
73
|
+
- [ ] The product enters in the second beat or later
|
|
74
|
+
- [ ] Every claim is specific enough to be falsifiable (a when, a how much, a what happened)
|
|
75
|
+
- [ ] There is one honest limit, in the body, in the speaker's own voice
|
|
76
|
+
- [ ] No outcome is promised that the viewer's situation couldn't reproduce
|
|
77
|
+
- [ ] The demonstration shows the real thing on a real account/desk, not a mockup
|
|
78
|
+
- [ ] Audio is clean; nothing else looks produced
|
|
79
|
+
- [ ] No logo sting, no music swell, no lower-third, no kinetic captions
|
|
80
|
+
- [ ] Any paid/gifted/affiliate relationship is disclosed on screen and in the caption
|
|
81
|
+
- [ ] Frame 0 shows the speaker mid-sentence with a legible caption
|
|
82
|
+
- [ ] In a batch: this variant's *situation* differs from its siblings, not just its wording
|