@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.
Files changed (27) hide show
  1. package/.agents/skills/editor-capabilities/SKILL.md +26 -0
  2. package/.agents/skills/vidfarm/SKILL.md +53 -2
  3. package/.agents/skills/vidfarm/recipes/bulk-scripting-with-a-regime.md +65 -0
  4. package/.agents/skills/vidfarm/recipes/cutout-graphics-for-explainers.md +78 -7
  5. package/.agents/skills/vidfarm/recipes/local-edit-render-approve.md +2 -2
  6. package/.agents/skills/vidfarm/recipes/retheme-template.md +1 -1
  7. package/.agents/skills/vidfarm/references/automation-and-local-dev.md +64 -5
  8. package/.agents/skills/vidfarm/references/editor-workflows.md +94 -1
  9. package/.agents/skills/vidfarm/references/hooks-and-virality.md +237 -0
  10. package/.agents/skills/vidfarm/references/onboarding.md +1 -1
  11. package/.agents/skills/vidfarm/regimes/README.md +77 -0
  12. package/.agents/skills/vidfarm/regimes/explainer.QA_REGIME.md +82 -0
  13. package/.agents/skills/vidfarm/regimes/hooks.QA_REGIME.md +117 -0
  14. package/.agents/skills/vidfarm/regimes/product-demo.QA_REGIME.md +92 -0
  15. package/.agents/skills/vidfarm/regimes/short-form.QA_REGIME.md +163 -0
  16. package/.agents/skills/vidfarm/regimes/ugc-testimonial.QA_REGIME.md +82 -0
  17. package/SKILL.director.md +597 -19
  18. package/SKILL.md +18 -2
  19. package/demo/dist/app.js +103 -103
  20. package/dist/src/cli.js +925 -18
  21. package/dist/src/devcli/handoff.js +162 -0
  22. package/dist/src/devcli/interaction-mode.js +154 -0
  23. package/dist/src/devcli/qa-check.js +173 -0
  24. package/dist/src/devcli/qa-regime.js +396 -0
  25. package/dist/src/devcli/sticker-pack.js +396 -0
  26. package/dist/src/devcli/storyboard.js +243 -0
  27. 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