@officexapp/vidfarm-devcli 0.21.58 → 0.21.60

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vidfarm
3
- skill_version: 0.21.58
3
+ skill_version: 0.21.60
4
4
  description: Use Vidfarm as a director. Run a strategy **consultation** (the `brainstorm/*` chain — cold-start interview, awareness stages, persuasive angles, hooks, product placement). Answer "give me content ideas" / "what should I post" / "I need 30 videos this month" from the bundled idea banks (50 content frames x 5 awareness stages x 44 problem angles). Browse/add inspiration videos, browse the free public raws catalog BY CATEGORY (curated shelves like scroll-stoppers/greenscreen/reaction — the cheapest way to source footage for one video, and a ready-made clip pool for bulk scripting N variants), fork a template into a composition, edit it in the Trackpad Editor (timeline-based like Premiere/DaVinci), auto-decompose source video into scenes, render to MP4, approve into a shareable post, and schedule it. Includes login, provider keys, discovery, versioning, uploads/downloads, and billing. Every step is available as raw REST; `vidfarm-devcli` wraps those routes and composes the file-backed scripting flows.
5
5
  ---
6
6
 
@@ -488,7 +488,7 @@ You may be running as the **in-web AI chat** (the /editor copilot, the chat dock
488
488
  | `references/hooks-and-virality.md` | ~295 ln | **Before writing ANY hook, caption script, or re-theme**, and before a hook-variant batch. The four charges, three gates, banned openers, loop mechanics. This is the craft; the rest of the pack is mechanics |
489
489
  | `references/reviewing-renders.md` | ~140 ln | **Before you report a video as done**, or grade someone else's. The holistic pass, the common defects, frozen-render and audio verification |
490
490
  | `references/onboarding.md` | ~80 ln | Cold-start interviews, **consultations** (the `brainstorm/*` chain), strategy docs, durable director context |
491
- | `references/content-ideas.md` | ~335 ln | **"Give me content ideas" / "what should I post" / a month of posts.** The three banks — 50 content frames, the 5-stage awareness ladder (with each stage's frames, angles and permitted ask), and 44 problem angles — plus **the subject pool** (adjacent topics inside the niche, so 50 frames are not 50 versions of one sentence), the monthly stage mix, the frame × angle × stage grid, and frame → format notes |
491
+ | `references/content-ideas.md` | ~490 ln | **"Give me content ideas" / "what should I post" / a month of posts.** The three banks — 50 content frames, the 5-stage awareness ladder (with each stage's frames, angles and permitted ask), and 44 problem angles — plus **the subject pool** (adjacent topics inside the niche, so 50 frames are not 50 versions of one sentence), the monthly stage mix, the frame × angle × stage grid, and frame → format notes |
492
492
  | `references/rest-api.md` | ~85 ln | Only when the user asks for REST, an endpoint/schema, or direct HTTP integration. It is an index — follow its domain links; do not preload it into ordinary director conversations |
493
493
 
494
494
  **Recipes — step-by-step procedures. When a recipe matches the task, prefer it over the broad reference.**
@@ -572,7 +572,7 @@ The File Index above says what each file *is*; this says which one a given ask m
572
572
  5b. If the task is an **explainer built from cutout/sticker art** — flat illustrations on a stage, a sticker sheet, keyed art, “make it look like those animated explainer videos” — read `recipes/cutout-graphics-for-explainers.md`. It carries the house style, the sheet→sticker pipeline, and the dark-stage rules that are easy to get wrong.
573
573
  5c. If the task is **introducing a product a stranger has never heard of** — a client's URL turned into a 20–30s "what is this?" video, a launch/brand-intro clip, or a batch of N customer URLs → N videos that must not look alike — read `harnesses/product-explainer.HARNESS.md`. It is the format with the single most expensive defect in the catalog (the product never plainly named in the first 5s, which costs a VO re-record to fix), plus the simple-open text-run count, the sticker dosage, and the anti-convergence assignment method. Use `product-demo` instead when you actually have the UI on screen.
574
574
  6. If the task explicitly asks for a primitive or needs specialized generation/transcription work, read `references/primitives.md`.
575
- 7. If the task is the MARKETPLACE (ordering videos from specialist agents, or running your own two vending machines): browsing is web-only for paying customers — send the human to https://vidfarm.cc/marketplace, never render it locally. **`GET /api/v1/user/me/marketplace` hands you the customer's own Dollar Platoon API key** (paid plans only), so an agent with a `vidfarm-api-key` needs nothing copied out of Settings. Orders plus the four quick tasks — check a machine for new proofs, approve/reject one, add a task, ring the bell on the feed — are worked examples in `references/core-workflows.md` (§ Marketplace, § Your Dollar Platoon key). **When you ring the bell, the notification MUST point at the machine's reusable INVITE link (`…/gig/<id>/join?invite=<token>`)** — that is what a gigworker taps to join and pitch. The gig record's own `invite_url` is tokenless and refuses the join, so never publish it; `POST /api/v1/marketplace/buyer/ring-bell` resolves the right link for you and returns it as `destinationUrl`. Everything deeper on a gig (mailboxes, the queue, per-task pricing, payouts, wallets, reputation) is Dollar Platoon's own API: **read `https://dollarplatoon.com/skill.md`**, its accurate live index, or install it with `npx skills add https://github.com/OfficeXApp/dollarplatoon-skill` — the same way FlockPoster work beyond scheduling needs `npx skills add https://github.com/OfficeXApp/flockposter-skill`. Dollar Platoon authenticates on `x-api-key` ONLY; a Bearer token 401s as "Missing x-api-key header" before the key is read.
575
+ 7. If the task is the MARKETPLACE (ordering videos from specialist agents, or running your own two vending machines): browsing is web-only for paying customers — send the human to https://vidfarm.cc/marketplace, never render it locally. **`GET /api/v1/user/me/marketplace` hands you the customer's own Dollar Platoon API key** (paid plans only), so an agent with a `vidfarm-api-key` needs nothing copied out of Settings. Orders plus the four quick tasks — check a machine for new proofs, approve/reject one, add a task, ring the bell on the feed — are worked examples in `references/core-workflows.md` (§ Marketplace, § Your Dollar Platoon key). **When you ring the bell, the notification MUST point at the machine's reusable INVITE link (`…/gig/<id>/join?invite=<token>`)** — that is what a gigworker taps to join and pitch. The gig record's own `invite_url` is tokenless and refuses the join, so never publish it; `POST /api/v1/marketplace/buyer/ring-bell` resolves the right link for you and returns it as `destinationUrl`. Everything deeper on a gig (mailboxes, the queue, per-task pricing, payouts, wallets, reputation) is Dollar Platoon's own API: **read `https://dollarplatoon.com/skill.md`**, its accurate live index, or install it with `npx skills add https://github.com/OfficeXApp/dollarplatoon-skill` — the same way FlockPoster work beyond scheduling needs `npx skills add https://github.com/OfficeXApp/flockposter-skill`. Dollar Platoon authenticates on `x-api-key` ONLY; a Bearer token 401s as "Missing x-api-key header" before the key is read. **On the earning side, never submit a proof without the sanity check first:** `vidfarm gigs verify-proof --proof <url> --clean-master ./final-clean.mp4` needs no key, loads every proof url the way a stranger's browser would, and exits non-zero on a dead link, a 403 bucket, an error page served as `video/mp4`, or an **expiring presigned url** — then checks the watermarked cut is the public half and the clean master the sealed one. `vidfarm gigs submit` runs it too and refuses a failing proof. **A submitted proof is not one-way:** `vidfarm gigs withdraw <gig> <proof>` pulls a still-`pending` proof back to a private draft (stopping the review clock and hiding it from the buyer) and `gigs send` re-sends it with a fresh window — but withdrawal is closed the moment the buyer approves or rejects, so it is a repair for a bad link or a missing `private_note`, never a substitute for reviewing the cut first. `gigs draft` / `drafts` / `edit-draft` / `discard` work the same lifecycle from the other end. The whole earning loop is `https://vidfarm.cc/agentic-clipper.md`.
576
576
 
577
577
  ## Non-Negotiables
578
578
 
@@ -5,13 +5,14 @@ Use this when the user wants to keep the format’s feel but replace the subject
5
5
  1. Read `references/editor-workflows.md`.
6
6
  2. Fetch `video-context.json` and `editor-harness.json` first.
7
7
  3. State the plan in the three axes vocabulary: scenes, audio, text; SWAP vs REPLACE for each.
8
- 4. Preserve the hook structure, cut rhythm, emotional punch, and important scenes flagged by the harness. **Read `references/hooks-and-virality.md` before rewriting the opening line or the retention beat** `viral_dna.hook`/`retention`/`payoff` name the source's four charges, and rebuilding each one for the new subject (rather than flattening the loop into a product statement) is the whole job.
9
- 5. Source footage in this order:
8
+ 4. **Audit every element before you touch one.** The fork is somebody else's *finished* video, so list its layers (`vidfarm pull <forkId> --json` → `.layers[]`, plus `grep -o 'data-src="[^"]*"' composition.html | sort -u`) and write one row per element into `./work/ADAPTATION.md`: KEEP / REPLACE / CUT, why, what replaced it. **KEEP is the verdict that needs a reason.** Structure stays (beat count and order, `start`/`duration`, cut rhythm, transitions, caption identity); meaning goes (voiceover, music, caption words, on-screen titles and prices and stats, actor clips, product shots and screenshots, stickers that name a thing, the picture behind a background, and every logo, @handle, URL and watermark). See `references/editor-workflows.md` → *Before the axes: audit every element*. The REPLACE rows are your sourcing list for step 6.
9
+ 5. Preserve the hook structure, cut rhythm, emotional punch, and important scenes flagged by the harness. **Read `references/hooks-and-virality.md` before rewriting the opening line or the retention beat** — `viral_dna.hook`/`retention`/`payoff` name the source's four charges, and rebuilding each one for the new subject (rather than flattening the loop into a product statement) is the whole job.
10
+ 6. Source footage for every REPLACE row, in this order:
10
11
  - My Files or existing raws
11
12
  - a raws hunt from a long-form source
12
13
  - AI image generation
13
14
  - AI video generation only with permission
14
- 6. Rebuild captions and narration so timing, cadence, and joke structure survive the subject change.
15
- 7. Render, verify, then approve and schedule only after the director is happy.
15
+ 7. Rebuild captions and narration so timing, cadence, and joke structure survive the subject change.
16
+ 8. Render, verify, then approve and schedule only after the director is happy. Report the audit counts — kept / replaced / cut — with it.
16
17
 
17
- Failure mode to avoid: flattening the format by swapping words but losing the timing, sound, or payoff beat.
18
+ Two failure modes to avoid: flattening the format by swapping words but losing the timing, sound, or payoff beat — and the opposite, swapping the words and leaving everything else, so the source brand's voice, screenshots, stickers or handle ship inside the director's video.
@@ -4,7 +4,7 @@ Read this when a director says **"give me content ideas"**, "what should I post"
4
4
 
5
5
  **This also runs FIRST for a brand-new director, before the cold-start interview.** It needs one line of offer, not an interview; it is offline, free, and keyless; and it hands the director 20+ titled videos in about a minute. That is the easiest win available on turn one, and their reactions to the list ("this one, not that one") are better raw material than anything an interview gets cold. Run it, save `content-ideas.md`, then offer the interview as the way to turn ideas into a strategy — `references/onboarding.md` → *Start with content ideas*.
6
6
 
7
- **What this is — three banks, not one.** An idea is a point in a small grid, and this reference holds all three axes:
7
+ **What this is — four banks, not one.** An idea is a point in a small grid, and this reference holds every axis:
8
8
 
9
9
  | Axis | Bank | Question it answers |
10
10
  |---|---|---|
@@ -12,12 +12,13 @@ Read this when a director says **"give me content ideas"**, "what should I post"
12
12
  | **Frame** | 50 content frames | *What is the video the story of?* (`the rise of`, `then vs now`, `one decision that changed everything`) |
13
13
  | **Awareness** | 5 stages | *What does the viewer already know?* (unaware → problem-aware → solution-aware → product-aware → most-aware) |
14
14
  | **Angle** | 44 problem angles | *From which side do we talk about the problem?* (the hidden cost, the myth, the confession, the honest downside) |
15
+ | **Format** | 40 ad formats | *What does the finished video look like?* (an iPhone note, a Reddit thread, a tier list, a warning label, a claymation) |
15
16
 
16
17
  The subject axis carries a **distance**: how far from the offer the video is allowed to sit. Distance is what produces genuinely different videos rather than differently-shaped ones, and the **turn back to the offer** is what keeps distance from becoming irrelevance — see *Distance* below. Freeze the subject at distance zero and no amount of frames or angles will save the list.
17
18
 
18
- A **frame** is a reusable shape for a video's subject — not a hook line, not a script. You pour the director's topic into it: `the rise of` + `dropshipping supplements` → *"The rise of the supplement dropship store"*. An **angle** decides which face of the problem that video shows; the same frame at two angles is two genuinely different videos. An **awareness stage** decides who it is allowed to be for — the same idea aimed at a stranger and at a buyer needs different first ten seconds and a different ask.
19
+ A **frame** is a reusable shape for a video's subject — not a hook line, not a script. You pour the director's topic into it: `the rise of` + `dropshipping supplements` → *"The rise of the supplement dropship store"*. An **angle** decides which face of the problem that video shows; the same frame at two angles is two genuinely different videos. An **awareness stage** decides who it is allowed to be for — the same idea aimed at a stranger and at a buyer needs different first ten seconds and a different ask. A **format** decides what the thing on screen actually is — the same idea as an iPhone note, as a tier list, and as a warning label is three shoots, three thumbnails, and three different scroll behaviours.
19
20
 
20
- **The grid is where the volume comes from.** 50 frames × 44 angles × 5 stages, over a pool of adjacent subjects, is not a number to take literally, but it is why "I need 30 videos this month" is an easy ask, not a hard one. Vary **two** axes across a set and it never reads as repeats. Vary only one and it does — and the axis most often left frozen is the subject, because the offer line is right there and it is easy to paste.
21
+ **The grid is where the volume comes from.** 50 frames × 44 angles × 5 stages × 40 formats, over a pool of adjacent subjects, is not a number to take literally, but it is why "I need 30 videos this month" is an easy ask, not a hard one. Vary **two** axes across a set and it never reads as repeats. Vary only one and it does — and the axis most often left frozen is the subject, because the offer line is right there and it is easy to paste.
21
22
 
22
23
  **How to use it (the loop).**
23
24
 
@@ -26,8 +27,9 @@ A **frame** is a reusable shape for a video's subject — not a hook line, not a
26
27
  3. **Spread across awareness stages, not just frames.** Most directors post everything at one stage — usually product-aware, because that is the stage they live in — and then wonder why the account does not grow. Cover the ladder deliberately; the default monthly mix is in *Spreading a month across the ladder* below. Say the stage next to each idea.
27
28
  4. **Pick frames and angles, don't dump the lists.** Choose 10–20 combinations that actually fit the topic. Label each idea `frame · angle · stage` so the director can say "more like that one" and you know exactly which axis they mean.
28
29
  5. **Write each idea as a title, not a frame.** Output `"The one pricing mistake that killed our first 400 orders"`, not `"one mistake that changed everything — about pricing"`. A frame that stays abstract is not an idea yet.
29
- 6. **Then run it through the hook harness.** A content idea is the *subject*; it is not the four charges. Every idea a director picks still needs hook / loop / payoff / bait written before the timeline `references/hooks-and-virality.md`. The frames on this list are deliberately curiosity-shaped, which makes the loop easy to name, but never skip that pass.
30
- 7. **Batch it properly.** If the director wants the whole set produced, that is scripting mode with a `HARNESS.md` — `recipes/bulk-scripting-with-a-harness.md`. One idea per video, one line in the plan file, with its stage and angle recorded so the set stays balanced.
30
+ 6. **Give each idea a format.** The title says what the video is about; the format says what it *looks like* see *The ad formats* below. Name it on the line (`iphone notes`, `tier list`, `warning`) so the shoot is decided before production, and rotate it so a month does not arrive as thirty talking heads.
31
+ 7. **Then run it through the hook harness.** A content idea is the *subject*; it is not the four charges. Every idea a director picks still needs hook / loop / payoff / bait written before the timeline — `references/hooks-and-virality.md`. The frames on this list are deliberately curiosity-shaped, which makes the loop easy to name, but never skip that pass.
32
+ 8. **Batch it properly.** If the director wants the whole set produced, that is scripting mode with a `HARNESS.md` — `recipes/bulk-scripting-with-a-harness.md`. One idea per video, one line in the plan file, with its stage and angle recorded so the set stays balanced.
31
33
 
32
34
  **Give lots when asked.** "Give me content ideas" means volume. Return **20+ titled ideas** by default, grouped by frame family or by awareness stage, not three polite suggestions. The director prunes; you supply.
33
35
 
@@ -355,6 +357,83 @@ An angle is **which side of the problem the video approaches from**. It is not a
355
357
  - the cost of waiting — the same decision made now vs in six months, priced
356
358
  - the first-mover gap — what the early ones get that the late ones cannot
357
359
 
360
+ ### The ad formats — 40 executions
361
+
362
+ A format is **what the finished video is, as an object**. Not what it is about (frame), not which side of the problem it comes from (angle), not who it is for (stage), and not the first line (hook). `the hidden cost` `of the van receipts` `for a problem-aware viewer` is an idea; whether it arrives as an iPhone note, a Trustpilot screenshot or a claymation is the format, and the director still has to choose one before anybody films.
363
+
364
+ **Why it is a bank and not a taste decision.** Left to taste, a director shoots the same talking head forty times and blames the ideas. The format is also the axis that costs the least to vary — the research, the title and the script survive a format swap intact — so it is the cheapest way to turn one idea that worked into four posts that do not read as reposts.
365
+
366
+ `vidfarm ideas --formats` prints the bank; `--format <family or name>` filters it.
367
+
368
+ **Fake-artifact formats — the video pretends to be something that is not an ad**
369
+
370
+ - iphone notes — the pitch typed into the notes app, screen-recorded, no production at all
371
+ - text message — the conversation that sells it, two people, read at the speed of reading
372
+ - email screenshot — a real inbox: a complaint, a supplier reply, a refund thread
373
+ - google search — the query they actually type, and what the results fail to answer
374
+ - reddit style — the thread, the top comment, the reply that names the product
375
+ - ig story — the casual story frame, sticker and all, reposted as the ad
376
+ - trustpilot reviews — the review wall, scrolled, with the one-star ones left in
377
+ - breaking news — the news lower-third and the anchor voice, applied to a small thing
378
+ - native — no ad markers at all: it looks like the platform's ordinary content
379
+
380
+ **List & ranking formats — the count is the promise**
381
+
382
+ - x reasons why — the numbered case, one reason per beat, the count in the first frame
383
+ - x signs — a checklist the viewer scores themselves against
384
+ - tier list — S to F on screen, the product placed last and defended
385
+ - hack 101 — one trick, taught properly, in under a minute
386
+ - stat headline — one number, held on screen, everything else in service of it
387
+
388
+ **Two-column formats — the comparison is the argument**
389
+
390
+ - us vs them — the direct competitive split, named or unnamed
391
+ - us vs us — the old version against the new one; no competitor is needed
392
+ - new vs old — the category's past against its present
393
+ - problem vs solution — left frame breaks, right frame works, same input
394
+ - myth vs fact — the repeated sentence, then the correction, side by side
395
+ - venn diagram — two circles, and the product sits in the overlap
396
+
397
+ *These six overlap with the contrast frames above, and that is not a duplicate — `problem vs solution` as a **frame** is what the video is the story of, and as a **format** it is the split on screen. Use one as the format only when the frame is a contrast too. A video cannot carry two comparisons; that is the "do not stack two frames" rule wearing a new hat.*
398
+
399
+ **Pattern-interrupt formats — it opens by refusing to sell**
400
+
401
+ - don't buy this — the disqualification opener, then who it *is* for
402
+ - don't be an idiot — the blunt correction; earns attention, spends goodwill
403
+ - we're sorry — the apology format: an owned mistake, then the fix
404
+ - side effect — the benefit stated as a warning label
405
+ - zero stars — the worst review, read out, and answered
406
+ - you can avoid — the outcome named first, the escape route second
407
+
408
+ **Alert & urgency formats — the shape of an announcement, not an ad**
409
+
410
+ - warning — the hazard sign, the deadline, the consequence of waiting
411
+ - low stock alert — the shelf, the count, the date it runs out
412
+ - case of emergency — break-glass framing: the thing to do when it goes wrong
413
+ - bundle offer — what is in the box, itemised, priced against the parts
414
+
415
+ **Proof formats — something visibly changes on camera**
416
+
417
+ - customer testimonial — their words, their room, their number
418
+ - transformation — before and after in one cut, same frame, same light
419
+ - crossed out problems — the list of pains, struck through one at a time
420
+
421
+ **Made-look formats — the production style carries it**
422
+
423
+ - whiteboard — drawn while spoken; the hand is the retention device
424
+ - doodle — rough marker illustration over the footage
425
+ - meme — the format the niche already shares, recaptioned at a real pain
426
+ - claymation — stop-motion or clay-look; the craft is the scroll-stopper
427
+ - greenscreen — the presenter keyed over the artifact they are reacting to
428
+ - text on skin — the words written on a hand, an arm, a face
429
+ - ai podcast — two synthetic hosts discussing it, clipped like a podcast
430
+
431
+ **Choosing one.** Match the format to the stage, not to the mood. Fake-artifact and made-look formats carry stage 1 and 2, because they read as content rather than as an ad. Two-column and list formats carry stage 3, because they explain. Proof and pattern-interrupt formats carry stage 4, because they answer an objection. Alert formats carry stage 5, and only stage 5 — a warning label shown to a stranger is a scroll.
432
+
433
+ **The honesty rule, and it is the important one.** Several of these formats work by imitating a *record*: a review wall, an inbox, a search result, a news bulletin, a stock count. An imitation of a record that states something untrue is a fabricated record, and it is the client's problem the moment it posts. So: use a real screenshot where a real one exists; where the artifact is staged, keep every claim inside it true and checkable; never stage a third party's review, message or verdict; and never invent a deadline or a stock number that is not real. The same flag-it-for-checking rule from *Distance* applies to every number the artifact shows.
434
+
435
+ **Do not let the format become the idea.** "Let's do a tier list" is not a content idea — it is a shoot with nothing in it. Pick the subject, the angle and the stage first; the format is the last field, and it is the one you change when an idea that worked deserves a second post.
436
+
358
437
  ### Frame × angle × stage — the grid
359
438
 
360
439
  The grid is the answer to "give me 30 different videos" and to "I already made a video about that."
@@ -364,25 +443,26 @@ The grid is the answer to "give me 30 different videos" and to "I already made a
364
443
  3. Pick an **angle** that fits that stage (each stage above lists its five).
365
444
  4. Pick a **frame** that carries the angle (each stage above lists its six).
366
445
  5. Write the title. If the title does not say the angle out loud, the pairing was wrong — go back to step 3, not step 4.
446
+ 6. Pick a **format** the stage can carry, and write it on the row. It is the last field, and the only one you may change on its own.
367
447
 
368
448
  Worked example, one topic (`bookkeeping for solo trades`), one frame family, four angles, four different videos:
369
449
 
370
- | Stage | Angle | Frame | Title |
371
- |---|---|---|---|
372
- | 1 | the daily friction | the psychology of | *"Why every tradie has a glovebox full of receipts"* |
373
- | 2 | the hidden cost | why it failed | *"The £3,400 a year that disappears in your van"* |
374
- | 3 | the false solution | myth vs reality | *"A shoebox is not a filing system, and HMRC agrees"* |
375
- | 4 | the price objection | cheap vs expensive | *"£49 a month vs the accountant's £900 catch-up bill"* |
450
+ | Stage | Angle | Frame | Format | Title |
451
+ |---|---|---|---|---|
452
+ | 1 | the daily friction | the psychology of | native | *"Why every tradie has a glovebox full of receipts"* |
453
+ | 2 | the hidden cost | why it failed | stat headline | *"The £3,400 a year that disappears in your van"* |
454
+ | 3 | the false solution | myth vs reality | myth vs fact | *"A shoebox is not a filing system, and HMRC agrees"* |
455
+ | 4 | the price objection | cheap vs expensive | us vs them | *"£49 a month vs the accountant's £900 catch-up bill"* |
376
456
 
377
457
  **When a director says "I already covered that."** Hold the frame, change the angle. Same subject, new video, and it is the cheapest idea in the bank to produce because the research is already done.
378
458
 
379
459
  **When a set feels repetitive.** Check which axis you froze — and check the **subject** first, because it is the one that hides. Thirty ideas that vary only the frame, on one pasted offer sentence, at one stage and one angle, are thirty versions of one video. Vary two axes minimum, and never let the subject be the constant.
380
460
 
381
- ### Frame → format notes
461
+ ### Frame → build notes
382
462
 
383
- The frame also suggests how to build it, which saves a planning round:
463
+ The frame also suggests how to build it, which saves a planning round. This is the *default* build; a format from the bank above overrides it:
384
464
 
385
- | Frame family | Natural format | Build notes |
465
+ | Frame family | Natural build | Build notes |
386
466
  |---|---|---|
387
467
  | Contrast (`then vs now`, `cheap vs expensive`) | Split screen or A/B beat pairs | Cheapest to produce — two stills or two clips per beat. Great for the cutout/sticker explainer style. |
388
468
  | Hidden-knowledge (`what nobody noticed`, `the untold story`) | Talking head, or footage + kinetic captions | The loop writes itself; state the timestamp it closes at anyway. |
@@ -404,3 +484,6 @@ The frame also suggests how to build it, which saves a planning round:
404
484
  - **Do not hand over a distant idea with no turn written.** A video about Napoleon's field library, for a book app, is a great video and a dead one until somebody writes the line that reaches the offer. Write the turn with the idea, in the same breath, or drop the idea.
405
485
  - **Do not let the whole list become dated trivia.** "Be concrete" pushes a model straight into "in 1978, a man…". Fifty history videos is one idea fifty times, exactly like the frozen subject. Spread the proof types.
406
486
  - **Do not state a date, a number or a record without flagging it for checking.** The editor films what the brief says. A wrong figure is the director's problem the moment it posts, not the writer's.
487
+ - **Do not pick the format first.** "Let's do a tier list" is a shoot with no idea in it. The format is the last field on the row, after the subject, the angle and the stage.
488
+ - **Do not run one format for a month.** Thirty talking heads and thirty tier lists fail the same way, and the format is the cheapest axis to rotate — the script survives the swap.
489
+ - **Do not fabricate the artifact a format imitates.** A staged review wall, a staged inbox, an invented stock count or an invented deadline is a fabricated record with the client's name on it. Use the real screenshot, or keep every claim inside the staged one true.
@@ -369,6 +369,10 @@ curl -s -X PATCH -H "x-api-key: $DP" -H "content-type: application/json" \
369
369
 
370
370
  Rejection tags and what each costs a worker's reputation: `dollarplatoon.com/skill/proofs.md`.
371
371
 
372
+ **A pending proof can vanish from the list — that is a withdrawal, not a bug.** A worker may pull their own `pending` submission back to a private draft (`POST .../proofs/:proof_id/withdraw`), usually to fix a bad link or a missing master, and re-send it later with a fresh review window and `"resubmitted": true` on the webhook. Key your automation off the proof id so a re-send is not reviewed twice. Drafts are filtered out of your list entirely, and the moment you approve or reject, withdrawal is closed to them — your verdict is final from their side.
373
+
374
+ **The card will not play? Check the link before you judge the work.** `vidfarm gigs verify-proof --proof "<the url on the proof>"` fetches it with no key and no cookie — the way the deck does — and names the reason: a 403 bucket, a 404, an error page served as `video/mp4`, an expiring presigned url, or a link behind a login. Reject that `incomplete` with the reason, not `low_quality`: the video is often fine and only the upload is broken, and the worker fixes it in a minute. Do not just leave it — silence is approval, so an unplayable proof you ignore is one you pay for. A **watermark** on a proof is not a defect: the clipper is told to publish the watermarked cut and seal the clean master in `private_note`, which unseals on `paid_out_at`.
375
+
372
376
  **3 — Release the payouts.** **Approved is not paid.** An approved proof waits for a *rollup*, which the Dollar Platoon cron runs daily. Run it now with `POST .../payouts`, or read what it would cost first with `GET .../payouts`. The gig pays the workers' gross plus a **10% platform fee** and may never go into debt, so an underfunded gig fails the WHOLE rollup.
373
377
 
374
378
  ```bash
@@ -7,6 +7,31 @@ Almost every editor session is a director taking a template / fork / project and
7
7
 
8
8
  Name the plan back in these terms ("I'll SWAP the captions and REPLACE the scenes"), then execute axis by axis. Be **proactive at the heavy end** — carry the whole transformation, don't wait to be micro-managed one layer at a time.
9
9
 
10
+ ### Before the axes: audit every element, one at a time
11
+
12
+ **A fork of a decomposed template is not a half-finished video — it is somebody else's FINISHED one.** Every element in it was chosen for their product, their customer, their face, their joke. An element nobody re-decides stays theirs, and the director's audience watches it. The axes above tell you what *kind* of re-work this is; the audit tells you *which specific elements* it touches, and it is what turns "re-theme" into relevant customization instead of a caption swap.
13
+
14
+ So the moment you pull a fork, list its elements and give each one a verdict — **KEEP**, **REPLACE** or **CUT** — into `./work/ADAPTATION.md` (one row per element: key, what it is, verdict, why, what replaced it).
15
+
16
+ ```bash
17
+ vidfarm pull <forkId> --dir ./work --json | jq -r '.layers[] | [.key,(.kind//"?"),(.start|tostring),(.src//"—")] | @tsv'
18
+ grep -o 'data-src="[^"]*"' ./work/composition.html | sort -u # every asset the video still loads
19
+ ```
20
+
21
+ **KEEP is the verdict that needs a reason; REPLACE is the default.** An element you overlooked and an element you deliberately kept produce byte-identical HTML, so the written ledger is the only thing that separates them, and no automated check will ever flag the first one.
22
+
23
+ | Stays — this is DNA | Goes — this is content |
24
+ |---|---|
25
+ | beat count and beat order; any beat the harness marks critical / `must_keep` | voiceover, every line — a fork ships the source brand's narration, and it passes every automated check |
26
+ | each layer's `start`, `duration`, track and transitions — the rhythm | the music bed and the SFX |
27
+ | the caption identity: font, size, placement, background style | every caption word |
28
+ | the hook's *shape* and the payoff's *position* | on-screen text that is not a caption — titles, kickers, labels, prices, stat callouts, end cards |
29
+ | the grade, the vignette, the stage treatment behind a background | the picture inside that background |
30
+ | the palette and type tokens, unless the director has a brand | actor / talking-head clips (a face is a brand), product shots, screenshots, UI frames, mockups |
31
+ | generic b-roll that is still true in the new subject's world — "a keyboard" survives a subject change, "a barista" does not survive a move to fintech | stickers and icons that name a thing; every logo, wordmark, @handle, URL and watermark — **those are never a KEEP** |
32
+
33
+ Three tie-breaks when a row is not obvious: **provenance** (did I put this file here, or did I inherit it?), **relevance** (does it show the DIRECTOR's world?), **load-bearing** (cut it — does the beat still work? then CUT wins). Run the audit **before** sourcing: every REPLACE row is a line on the procurement list, which is what stops a beat being built twice. Report the counts — kept / replaced / cut — with the render. The full version is §3½ of `https://vidfarm.cc/flash-harness.md`.
34
+
10
35
  **Fuel a scene REPLACE with raw clips, not expensive AI video.** A heavy scenes-axis replace needs footage; sources in cost order: (1) the director's own library — search `/raws` and `/files` (`vidfarm raws search …`, `vidfarm files --search …` / `browse_files`); (1b) the **PUBLIC RAWS catalog, browsed by category** — free, pre-tagged, already on the platform, and no download or hunt required (`vidfarm public-raws --categories` to see the shelves, then `--category <shelf>`); (2) **HUNT new raws** out of a long-form source (podcast/VOD/webinar or any YouTube/TikTok/IG/X URL) — `vidfarm raws scan <src> --prompt "<what the new scenes need>" --aspect <canvas> [--duration N --no-text --range …]` (local-first, free compute) or the async `POST /clips/scan` / `/raws/scan`; then reuse the picks (`set_layer_media` / `vidfarm set-media` to swap in place, `add_layer`/`vidfarm place` for net-new scenes); (3) `generate_layer` / `vidfarm generate` AI generation — the **expensive last resort**, only for scenes no real clip can cover. When a big scene re-work is asked for but no footage is given, **ask for a source to hunt (or point at the raws library) before AI-generating** — see [Raws](#raws-long-form--short-form-raws) and [Generate AI media …](#generate-ai-media-and-drop-it-on-the-timeline).
11
36
 
12
37
  **Audio is natively multi-track — overlay narration + music + SFX, each at its own volume.** A composition mixes UNLIMITED simultaneous `<audio>` layers; each sits on its own `data-track-index` and carries its own `data-volume` (0–2, default 1), and the runtime mixes them with per-track volume honored identically in the preview and the exported MP4 (a real ffmpeg `amix` of every audio layer at render). So you never need a pre-mixed file — lay **narration/voiceover at ~1.0 on one track, a music bed at ~0.1–0.2 on a separate track, and SFX on their own tracks**, each via `add_layer kind=audio` (web) / `vidfarm place --kind audio --volume …` (devcli), tuning levels later with the Inspector's Volume slider or `set_layer_media` (`volume`, `muted`). **The key move when recreating a template whose original baked music + narration into ONE audio track: rebuild it as TWO independent tracks** — a fresh narration track (`/audio/speech`, or same-voice reword via `/audio/regenerate-speech` / `vidfarm speech regenerate`) at ~1.0 and a separate real music track at ~0.1–0.2 — then mute/remove the original combined source-audio layer. This gives the director independent voice and music volume, and works around AI TTS being unable to emit narration+music in one file: you compose the mix on the timeline. Honesty: you can't un-mix / stem-separate the original's baked audio — the two tracks are a fresh narration track **plus** a real music file (owned / user-provided / `browse_files` / generated with `/api/v1/primitives/music/generate` (`vidfarm music`)), never a faked or duplicated voice layer.
package/SKILL.director.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vidfarm
3
- skill_version: 0.21.58
3
+ skill_version: 0.21.60
4
4
  description: Use Vidfarm as a director. Run a strategy **consultation** (the `brainstorm/*` chain — cold-start interview, awareness stages, persuasive angles, hooks, product placement). Answer "give me content ideas" / "what should I post" / "I need 30 videos this month" from the bundled idea banks (50 content frames x 5 awareness stages x 44 problem angles). Browse/add inspiration videos, browse the free public raws catalog BY CATEGORY (curated shelves like scroll-stoppers/greenscreen/reaction — the cheapest way to source footage for one video, and a ready-made clip pool for bulk scripting N variants), fork a template into a composition, edit it in the Trackpad Editor (timeline-based like Premiere/DaVinci), auto-decompose source video into scenes, render to MP4, approve into a shareable post, and schedule it. Includes login, provider keys, discovery, versioning, uploads/downloads, and billing. Every step is available as raw REST; `vidfarm-devcli` wraps those routes and composes the file-backed scripting flows.
5
5
  ---
6
6
 
@@ -488,7 +488,7 @@ You may be running as the **in-web AI chat** (the /editor copilot, the chat dock
488
488
  | `references/hooks-and-virality.md` | ~295 ln | **Before writing ANY hook, caption script, or re-theme**, and before a hook-variant batch. The four charges, three gates, banned openers, loop mechanics. This is the craft; the rest of the pack is mechanics |
489
489
  | `references/reviewing-renders.md` | ~140 ln | **Before you report a video as done**, or grade someone else's. The holistic pass, the common defects, frozen-render and audio verification |
490
490
  | `references/onboarding.md` | ~80 ln | Cold-start interviews, **consultations** (the `brainstorm/*` chain), strategy docs, durable director context |
491
- | `references/content-ideas.md` | ~335 ln | **"Give me content ideas" / "what should I post" / a month of posts.** The three banks — 50 content frames, the 5-stage awareness ladder (with each stage's frames, angles and permitted ask), and 44 problem angles — plus **the subject pool** (adjacent topics inside the niche, so 50 frames are not 50 versions of one sentence), the monthly stage mix, the frame × angle × stage grid, and frame → format notes |
491
+ | `references/content-ideas.md` | ~490 ln | **"Give me content ideas" / "what should I post" / a month of posts.** The three banks — 50 content frames, the 5-stage awareness ladder (with each stage's frames, angles and permitted ask), and 44 problem angles — plus **the subject pool** (adjacent topics inside the niche, so 50 frames are not 50 versions of one sentence), the monthly stage mix, the frame × angle × stage grid, and frame → format notes |
492
492
  | `references/rest-api.md` | ~85 ln | Only when the user asks for REST, an endpoint/schema, or direct HTTP integration. It is an index — follow its domain links; do not preload it into ordinary director conversations |
493
493
 
494
494
  **Recipes — step-by-step procedures. When a recipe matches the task, prefer it over the broad reference.**
@@ -572,7 +572,7 @@ The File Index above says what each file *is*; this says which one a given ask m
572
572
  5b. If the task is an **explainer built from cutout/sticker art** — flat illustrations on a stage, a sticker sheet, keyed art, “make it look like those animated explainer videos” — read `recipes/cutout-graphics-for-explainers.md`. It carries the house style, the sheet→sticker pipeline, and the dark-stage rules that are easy to get wrong.
573
573
  5c. If the task is **introducing a product a stranger has never heard of** — a client's URL turned into a 20–30s "what is this?" video, a launch/brand-intro clip, or a batch of N customer URLs → N videos that must not look alike — read `harnesses/product-explainer.HARNESS.md`. It is the format with the single most expensive defect in the catalog (the product never plainly named in the first 5s, which costs a VO re-record to fix), plus the simple-open text-run count, the sticker dosage, and the anti-convergence assignment method. Use `product-demo` instead when you actually have the UI on screen.
574
574
  6. If the task explicitly asks for a primitive or needs specialized generation/transcription work, read `references/primitives.md`.
575
- 7. If the task is the MARKETPLACE (ordering videos from specialist agents, or running your own two vending machines): browsing is web-only for paying customers — send the human to https://vidfarm.cc/marketplace, never render it locally. **`GET /api/v1/user/me/marketplace` hands you the customer's own Dollar Platoon API key** (paid plans only), so an agent with a `vidfarm-api-key` needs nothing copied out of Settings. Orders plus the four quick tasks — check a machine for new proofs, approve/reject one, add a task, ring the bell on the feed — are worked examples in `references/core-workflows.md` (§ Marketplace, § Your Dollar Platoon key). **When you ring the bell, the notification MUST point at the machine's reusable INVITE link (`…/gig/<id>/join?invite=<token>`)** — that is what a gigworker taps to join and pitch. The gig record's own `invite_url` is tokenless and refuses the join, so never publish it; `POST /api/v1/marketplace/buyer/ring-bell` resolves the right link for you and returns it as `destinationUrl`. Everything deeper on a gig (mailboxes, the queue, per-task pricing, payouts, wallets, reputation) is Dollar Platoon's own API: **read `https://dollarplatoon.com/skill.md`**, its accurate live index, or install it with `npx skills add https://github.com/OfficeXApp/dollarplatoon-skill` — the same way FlockPoster work beyond scheduling needs `npx skills add https://github.com/OfficeXApp/flockposter-skill`. Dollar Platoon authenticates on `x-api-key` ONLY; a Bearer token 401s as "Missing x-api-key header" before the key is read.
575
+ 7. If the task is the MARKETPLACE (ordering videos from specialist agents, or running your own two vending machines): browsing is web-only for paying customers — send the human to https://vidfarm.cc/marketplace, never render it locally. **`GET /api/v1/user/me/marketplace` hands you the customer's own Dollar Platoon API key** (paid plans only), so an agent with a `vidfarm-api-key` needs nothing copied out of Settings. Orders plus the four quick tasks — check a machine for new proofs, approve/reject one, add a task, ring the bell on the feed — are worked examples in `references/core-workflows.md` (§ Marketplace, § Your Dollar Platoon key). **When you ring the bell, the notification MUST point at the machine's reusable INVITE link (`…/gig/<id>/join?invite=<token>`)** — that is what a gigworker taps to join and pitch. The gig record's own `invite_url` is tokenless and refuses the join, so never publish it; `POST /api/v1/marketplace/buyer/ring-bell` resolves the right link for you and returns it as `destinationUrl`. Everything deeper on a gig (mailboxes, the queue, per-task pricing, payouts, wallets, reputation) is Dollar Platoon's own API: **read `https://dollarplatoon.com/skill.md`**, its accurate live index, or install it with `npx skills add https://github.com/OfficeXApp/dollarplatoon-skill` — the same way FlockPoster work beyond scheduling needs `npx skills add https://github.com/OfficeXApp/flockposter-skill`. Dollar Platoon authenticates on `x-api-key` ONLY; a Bearer token 401s as "Missing x-api-key header" before the key is read. **On the earning side, never submit a proof without the sanity check first:** `vidfarm gigs verify-proof --proof <url> --clean-master ./final-clean.mp4` needs no key, loads every proof url the way a stranger's browser would, and exits non-zero on a dead link, a 403 bucket, an error page served as `video/mp4`, or an **expiring presigned url** — then checks the watermarked cut is the public half and the clean master the sealed one. `vidfarm gigs submit` runs it too and refuses a failing proof. **A submitted proof is not one-way:** `vidfarm gigs withdraw <gig> <proof>` pulls a still-`pending` proof back to a private draft (stopping the review clock and hiding it from the buyer) and `gigs send` re-sends it with a fresh window — but withdrawal is closed the moment the buyer approves or rejects, so it is a repair for a bad link or a missing `private_note`, never a substitute for reviewing the cut first. `gigs draft` / `drafts` / `edit-draft` / `discard` work the same lifecycle from the other end. The whole earning loop is `https://vidfarm.cc/agentic-clipper.md`.
576
576
 
577
577
  ## Non-Negotiables
578
578
 
@@ -967,6 +967,10 @@ curl -s -X PATCH -H "x-api-key: $DP" -H "content-type: application/json" \
967
967
 
968
968
  Rejection tags and what each costs a worker's reputation: `dollarplatoon.com/skill/proofs.md`.
969
969
 
970
+ **A pending proof can vanish from the list — that is a withdrawal, not a bug.** A worker may pull their own `pending` submission back to a private draft (`POST .../proofs/:proof_id/withdraw`), usually to fix a bad link or a missing master, and re-send it later with a fresh review window and `"resubmitted": true` on the webhook. Key your automation off the proof id so a re-send is not reviewed twice. Drafts are filtered out of your list entirely, and the moment you approve or reject, withdrawal is closed to them — your verdict is final from their side.
971
+
972
+ **The card will not play? Check the link before you judge the work.** `vidfarm gigs verify-proof --proof "<the url on the proof>"` fetches it with no key and no cookie — the way the deck does — and names the reason: a 403 bucket, a 404, an error page served as `video/mp4`, an expiring presigned url, or a link behind a login. Reject that `incomplete` with the reason, not `low_quality`: the video is often fine and only the upload is broken, and the worker fixes it in a minute. Do not just leave it — silence is approval, so an unplayable proof you ignore is one you pay for. A **watermark** on a proof is not a defect: the clipper is told to publish the watermarked cut and seal the clean master in `private_note`, which unseals on `paid_out_at`.
973
+
970
974
  **3 — Release the payouts.** **Approved is not paid.** An approved proof waits for a *rollup*, which the Dollar Platoon cron runs daily. Run it now with `POST .../payouts`, or read what it would cost first with `GET .../payouts`. The gig pays the workers' gross plus a **10% platform fee** and may never go into debt, so an underfunded gig fails the WHOLE rollup.
971
975
 
972
976
  ```bash
@@ -1144,6 +1148,31 @@ Almost every editor session is a director taking a template / fork / project and
1144
1148
 
1145
1149
  Name the plan back in these terms ("I'll SWAP the captions and REPLACE the scenes"), then execute axis by axis. Be **proactive at the heavy end** — carry the whole transformation, don't wait to be micro-managed one layer at a time.
1146
1150
 
1151
+ ### Before the axes: audit every element, one at a time
1152
+
1153
+ **A fork of a decomposed template is not a half-finished video — it is somebody else's FINISHED one.** Every element in it was chosen for their product, their customer, their face, their joke. An element nobody re-decides stays theirs, and the director's audience watches it. The axes above tell you what *kind* of re-work this is; the audit tells you *which specific elements* it touches, and it is what turns "re-theme" into relevant customization instead of a caption swap.
1154
+
1155
+ So the moment you pull a fork, list its elements and give each one a verdict — **KEEP**, **REPLACE** or **CUT** — into `./work/ADAPTATION.md` (one row per element: key, what it is, verdict, why, what replaced it).
1156
+
1157
+ ```bash
1158
+ vidfarm pull <forkId> --dir ./work --json | jq -r '.layers[] | [.key,(.kind//"?"),(.start|tostring),(.src//"—")] | @tsv'
1159
+ grep -o 'data-src="[^"]*"' ./work/composition.html | sort -u # every asset the video still loads
1160
+ ```
1161
+
1162
+ **KEEP is the verdict that needs a reason; REPLACE is the default.** An element you overlooked and an element you deliberately kept produce byte-identical HTML, so the written ledger is the only thing that separates them, and no automated check will ever flag the first one.
1163
+
1164
+ | Stays — this is DNA | Goes — this is content |
1165
+ |---|---|
1166
+ | beat count and beat order; any beat the harness marks critical / `must_keep` | voiceover, every line — a fork ships the source brand's narration, and it passes every automated check |
1167
+ | each layer's `start`, `duration`, track and transitions — the rhythm | the music bed and the SFX |
1168
+ | the caption identity: font, size, placement, background style | every caption word |
1169
+ | the hook's *shape* and the payoff's *position* | on-screen text that is not a caption — titles, kickers, labels, prices, stat callouts, end cards |
1170
+ | the grade, the vignette, the stage treatment behind a background | the picture inside that background |
1171
+ | the palette and type tokens, unless the director has a brand | actor / talking-head clips (a face is a brand), product shots, screenshots, UI frames, mockups |
1172
+ | generic b-roll that is still true in the new subject's world — "a keyboard" survives a subject change, "a barista" does not survive a move to fintech | stickers and icons that name a thing; every logo, wordmark, @handle, URL and watermark — **those are never a KEEP** |
1173
+
1174
+ Three tie-breaks when a row is not obvious: **provenance** (did I put this file here, or did I inherit it?), **relevance** (does it show the DIRECTOR's world?), **load-bearing** (cut it — does the beat still work? then CUT wins). Run the audit **before** sourcing: every REPLACE row is a line on the procurement list, which is what stops a beat being built twice. Report the counts — kept / replaced / cut — with the render. The full version is §3½ of `https://vidfarm.cc/flash-harness.md`.
1175
+
1147
1176
  **Fuel a scene REPLACE with raw clips, not expensive AI video.** A heavy scenes-axis replace needs footage; sources in cost order: (1) the director's own library — search `/raws` and `/files` (`vidfarm raws search …`, `vidfarm files --search …` / `browse_files`); (1b) the **PUBLIC RAWS catalog, browsed by category** — free, pre-tagged, already on the platform, and no download or hunt required (`vidfarm public-raws --categories` to see the shelves, then `--category <shelf>`); (2) **HUNT new raws** out of a long-form source (podcast/VOD/webinar or any YouTube/TikTok/IG/X URL) — `vidfarm raws scan <src> --prompt "<what the new scenes need>" --aspect <canvas> [--duration N --no-text --range …]` (local-first, free compute) or the async `POST /clips/scan` / `/raws/scan`; then reuse the picks (`set_layer_media` / `vidfarm set-media` to swap in place, `add_layer`/`vidfarm place` for net-new scenes); (3) `generate_layer` / `vidfarm generate` AI generation — the **expensive last resort**, only for scenes no real clip can cover. When a big scene re-work is asked for but no footage is given, **ask for a source to hunt (or point at the raws library) before AI-generating** — see [Raws](#raws-long-form--short-form-raws) and [Generate AI media …](#generate-ai-media-and-drop-it-on-the-timeline).
1148
1177
 
1149
1178
  **Audio is natively multi-track — overlay narration + music + SFX, each at its own volume.** A composition mixes UNLIMITED simultaneous `<audio>` layers; each sits on its own `data-track-index` and carries its own `data-volume` (0–2, default 1), and the runtime mixes them with per-track volume honored identically in the preview and the exported MP4 (a real ffmpeg `amix` of every audio layer at render). So you never need a pre-mixed file — lay **narration/voiceover at ~1.0 on one track, a music bed at ~0.1–0.2 on a separate track, and SFX on their own tracks**, each via `add_layer kind=audio` (web) / `vidfarm place --kind audio --volume …` (devcli), tuning levels later with the Inspector's Volume slider or `set_layer_media` (`volume`, `muted`). **The key move when recreating a template whose original baked music + narration into ONE audio track: rebuild it as TWO independent tracks** — a fresh narration track (`/audio/speech`, or same-voice reword via `/audio/regenerate-speech` / `vidfarm speech regenerate`) at ~1.0 and a separate real music track at ~0.1–0.2 — then mute/remove the original combined source-audio layer. This gives the director independent voice and music volume, and works around AI TTS being unable to emit narration+music in one file: you compose the mix on the timeline. Honesty: you can't un-mix / stem-separate the original's baked audio — the two tracks are a fresh narration track **plus** a real music file (owned / user-provided / `browse_files` / generated with `/api/v1/primitives/music/generate` (`vidfarm music`)), never a faked or duplicated voice layer.
@@ -3614,7 +3643,7 @@ Read this when a director says **"give me content ideas"**, "what should I post"
3614
3643
 
3615
3644
  **This also runs FIRST for a brand-new director, before the cold-start interview.** It needs one line of offer, not an interview; it is offline, free, and keyless; and it hands the director 20+ titled videos in about a minute. That is the easiest win available on turn one, and their reactions to the list ("this one, not that one") are better raw material than anything an interview gets cold. Run it, save `content-ideas.md`, then offer the interview as the way to turn ideas into a strategy — `references/onboarding.md` → *Start with content ideas*.
3616
3645
 
3617
- **What this is — three banks, not one.** An idea is a point in a small grid, and this reference holds all three axes:
3646
+ **What this is — four banks, not one.** An idea is a point in a small grid, and this reference holds every axis:
3618
3647
 
3619
3648
  | Axis | Bank | Question it answers |
3620
3649
  |---|---|---|
@@ -3622,12 +3651,13 @@ Read this when a director says **"give me content ideas"**, "what should I post"
3622
3651
  | **Frame** | 50 content frames | *What is the video the story of?* (`the rise of`, `then vs now`, `one decision that changed everything`) |
3623
3652
  | **Awareness** | 5 stages | *What does the viewer already know?* (unaware → problem-aware → solution-aware → product-aware → most-aware) |
3624
3653
  | **Angle** | 44 problem angles | *From which side do we talk about the problem?* (the hidden cost, the myth, the confession, the honest downside) |
3654
+ | **Format** | 40 ad formats | *What does the finished video look like?* (an iPhone note, a Reddit thread, a tier list, a warning label, a claymation) |
3625
3655
 
3626
3656
  The subject axis carries a **distance**: how far from the offer the video is allowed to sit. Distance is what produces genuinely different videos rather than differently-shaped ones, and the **turn back to the offer** is what keeps distance from becoming irrelevance — see *Distance* below. Freeze the subject at distance zero and no amount of frames or angles will save the list.
3627
3657
 
3628
- A **frame** is a reusable shape for a video's subject — not a hook line, not a script. You pour the director's topic into it: `the rise of` + `dropshipping supplements` → *"The rise of the supplement dropship store"*. An **angle** decides which face of the problem that video shows; the same frame at two angles is two genuinely different videos. An **awareness stage** decides who it is allowed to be for — the same idea aimed at a stranger and at a buyer needs different first ten seconds and a different ask.
3658
+ A **frame** is a reusable shape for a video's subject — not a hook line, not a script. You pour the director's topic into it: `the rise of` + `dropshipping supplements` → *"The rise of the supplement dropship store"*. An **angle** decides which face of the problem that video shows; the same frame at two angles is two genuinely different videos. An **awareness stage** decides who it is allowed to be for — the same idea aimed at a stranger and at a buyer needs different first ten seconds and a different ask. A **format** decides what the thing on screen actually is — the same idea as an iPhone note, as a tier list, and as a warning label is three shoots, three thumbnails, and three different scroll behaviours.
3629
3659
 
3630
- **The grid is where the volume comes from.** 50 frames × 44 angles × 5 stages, over a pool of adjacent subjects, is not a number to take literally, but it is why "I need 30 videos this month" is an easy ask, not a hard one. Vary **two** axes across a set and it never reads as repeats. Vary only one and it does — and the axis most often left frozen is the subject, because the offer line is right there and it is easy to paste.
3660
+ **The grid is where the volume comes from.** 50 frames × 44 angles × 5 stages × 40 formats, over a pool of adjacent subjects, is not a number to take literally, but it is why "I need 30 videos this month" is an easy ask, not a hard one. Vary **two** axes across a set and it never reads as repeats. Vary only one and it does — and the axis most often left frozen is the subject, because the offer line is right there and it is easy to paste.
3631
3661
 
3632
3662
  **How to use it (the loop).**
3633
3663
 
@@ -3636,8 +3666,9 @@ A **frame** is a reusable shape for a video's subject — not a hook line, not a
3636
3666
  3. **Spread across awareness stages, not just frames.** Most directors post everything at one stage — usually product-aware, because that is the stage they live in — and then wonder why the account does not grow. Cover the ladder deliberately; the default monthly mix is in *Spreading a month across the ladder* below. Say the stage next to each idea.
3637
3667
  4. **Pick frames and angles, don't dump the lists.** Choose 10–20 combinations that actually fit the topic. Label each idea `frame · angle · stage` so the director can say "more like that one" and you know exactly which axis they mean.
3638
3668
  5. **Write each idea as a title, not a frame.** Output `"The one pricing mistake that killed our first 400 orders"`, not `"one mistake that changed everything — about pricing"`. A frame that stays abstract is not an idea yet.
3639
- 6. **Then run it through the hook harness.** A content idea is the *subject*; it is not the four charges. Every idea a director picks still needs hook / loop / payoff / bait written before the timeline `references/hooks-and-virality.md`. The frames on this list are deliberately curiosity-shaped, which makes the loop easy to name, but never skip that pass.
3640
- 7. **Batch it properly.** If the director wants the whole set produced, that is scripting mode with a `HARNESS.md` — `recipes/bulk-scripting-with-a-harness.md`. One idea per video, one line in the plan file, with its stage and angle recorded so the set stays balanced.
3669
+ 6. **Give each idea a format.** The title says what the video is about; the format says what it *looks like* see *The ad formats* below. Name it on the line (`iphone notes`, `tier list`, `warning`) so the shoot is decided before production, and rotate it so a month does not arrive as thirty talking heads.
3670
+ 7. **Then run it through the hook harness.** A content idea is the *subject*; it is not the four charges. Every idea a director picks still needs hook / loop / payoff / bait written before the timeline — `references/hooks-and-virality.md`. The frames on this list are deliberately curiosity-shaped, which makes the loop easy to name, but never skip that pass.
3671
+ 8. **Batch it properly.** If the director wants the whole set produced, that is scripting mode with a `HARNESS.md` — `recipes/bulk-scripting-with-a-harness.md`. One idea per video, one line in the plan file, with its stage and angle recorded so the set stays balanced.
3641
3672
 
3642
3673
  **Give lots when asked.** "Give me content ideas" means volume. Return **20+ titled ideas** by default, grouped by frame family or by awareness stage, not three polite suggestions. The director prunes; you supply.
3643
3674
 
@@ -3965,6 +3996,83 @@ An angle is **which side of the problem the video approaches from**. It is not a
3965
3996
  - the cost of waiting — the same decision made now vs in six months, priced
3966
3997
  - the first-mover gap — what the early ones get that the late ones cannot
3967
3998
 
3999
+ ### The ad formats — 40 executions
4000
+
4001
+ A format is **what the finished video is, as an object**. Not what it is about (frame), not which side of the problem it comes from (angle), not who it is for (stage), and not the first line (hook). `the hidden cost` `of the van receipts` `for a problem-aware viewer` is an idea; whether it arrives as an iPhone note, a Trustpilot screenshot or a claymation is the format, and the director still has to choose one before anybody films.
4002
+
4003
+ **Why it is a bank and not a taste decision.** Left to taste, a director shoots the same talking head forty times and blames the ideas. The format is also the axis that costs the least to vary — the research, the title and the script survive a format swap intact — so it is the cheapest way to turn one idea that worked into four posts that do not read as reposts.
4004
+
4005
+ `vidfarm ideas --formats` prints the bank; `--format <family or name>` filters it.
4006
+
4007
+ **Fake-artifact formats — the video pretends to be something that is not an ad**
4008
+
4009
+ - iphone notes — the pitch typed into the notes app, screen-recorded, no production at all
4010
+ - text message — the conversation that sells it, two people, read at the speed of reading
4011
+ - email screenshot — a real inbox: a complaint, a supplier reply, a refund thread
4012
+ - google search — the query they actually type, and what the results fail to answer
4013
+ - reddit style — the thread, the top comment, the reply that names the product
4014
+ - ig story — the casual story frame, sticker and all, reposted as the ad
4015
+ - trustpilot reviews — the review wall, scrolled, with the one-star ones left in
4016
+ - breaking news — the news lower-third and the anchor voice, applied to a small thing
4017
+ - native — no ad markers at all: it looks like the platform's ordinary content
4018
+
4019
+ **List & ranking formats — the count is the promise**
4020
+
4021
+ - x reasons why — the numbered case, one reason per beat, the count in the first frame
4022
+ - x signs — a checklist the viewer scores themselves against
4023
+ - tier list — S to F on screen, the product placed last and defended
4024
+ - hack 101 — one trick, taught properly, in under a minute
4025
+ - stat headline — one number, held on screen, everything else in service of it
4026
+
4027
+ **Two-column formats — the comparison is the argument**
4028
+
4029
+ - us vs them — the direct competitive split, named or unnamed
4030
+ - us vs us — the old version against the new one; no competitor is needed
4031
+ - new vs old — the category's past against its present
4032
+ - problem vs solution — left frame breaks, right frame works, same input
4033
+ - myth vs fact — the repeated sentence, then the correction, side by side
4034
+ - venn diagram — two circles, and the product sits in the overlap
4035
+
4036
+ *These six overlap with the contrast frames above, and that is not a duplicate — `problem vs solution` as a **frame** is what the video is the story of, and as a **format** it is the split on screen. Use one as the format only when the frame is a contrast too. A video cannot carry two comparisons; that is the "do not stack two frames" rule wearing a new hat.*
4037
+
4038
+ **Pattern-interrupt formats — it opens by refusing to sell**
4039
+
4040
+ - don't buy this — the disqualification opener, then who it *is* for
4041
+ - don't be an idiot — the blunt correction; earns attention, spends goodwill
4042
+ - we're sorry — the apology format: an owned mistake, then the fix
4043
+ - side effect — the benefit stated as a warning label
4044
+ - zero stars — the worst review, read out, and answered
4045
+ - you can avoid — the outcome named first, the escape route second
4046
+
4047
+ **Alert & urgency formats — the shape of an announcement, not an ad**
4048
+
4049
+ - warning — the hazard sign, the deadline, the consequence of waiting
4050
+ - low stock alert — the shelf, the count, the date it runs out
4051
+ - case of emergency — break-glass framing: the thing to do when it goes wrong
4052
+ - bundle offer — what is in the box, itemised, priced against the parts
4053
+
4054
+ **Proof formats — something visibly changes on camera**
4055
+
4056
+ - customer testimonial — their words, their room, their number
4057
+ - transformation — before and after in one cut, same frame, same light
4058
+ - crossed out problems — the list of pains, struck through one at a time
4059
+
4060
+ **Made-look formats — the production style carries it**
4061
+
4062
+ - whiteboard — drawn while spoken; the hand is the retention device
4063
+ - doodle — rough marker illustration over the footage
4064
+ - meme — the format the niche already shares, recaptioned at a real pain
4065
+ - claymation — stop-motion or clay-look; the craft is the scroll-stopper
4066
+ - greenscreen — the presenter keyed over the artifact they are reacting to
4067
+ - text on skin — the words written on a hand, an arm, a face
4068
+ - ai podcast — two synthetic hosts discussing it, clipped like a podcast
4069
+
4070
+ **Choosing one.** Match the format to the stage, not to the mood. Fake-artifact and made-look formats carry stage 1 and 2, because they read as content rather than as an ad. Two-column and list formats carry stage 3, because they explain. Proof and pattern-interrupt formats carry stage 4, because they answer an objection. Alert formats carry stage 5, and only stage 5 — a warning label shown to a stranger is a scroll.
4071
+
4072
+ **The honesty rule, and it is the important one.** Several of these formats work by imitating a *record*: a review wall, an inbox, a search result, a news bulletin, a stock count. An imitation of a record that states something untrue is a fabricated record, and it is the client's problem the moment it posts. So: use a real screenshot where a real one exists; where the artifact is staged, keep every claim inside it true and checkable; never stage a third party's review, message or verdict; and never invent a deadline or a stock number that is not real. The same flag-it-for-checking rule from *Distance* applies to every number the artifact shows.
4073
+
4074
+ **Do not let the format become the idea.** "Let's do a tier list" is not a content idea — it is a shoot with nothing in it. Pick the subject, the angle and the stage first; the format is the last field, and it is the one you change when an idea that worked deserves a second post.
4075
+
3968
4076
  ### Frame × angle × stage — the grid
3969
4077
 
3970
4078
  The grid is the answer to "give me 30 different videos" and to "I already made a video about that."
@@ -3974,25 +4082,26 @@ The grid is the answer to "give me 30 different videos" and to "I already made a
3974
4082
  3. Pick an **angle** that fits that stage (each stage above lists its five).
3975
4083
  4. Pick a **frame** that carries the angle (each stage above lists its six).
3976
4084
  5. Write the title. If the title does not say the angle out loud, the pairing was wrong — go back to step 3, not step 4.
4085
+ 6. Pick a **format** the stage can carry, and write it on the row. It is the last field, and the only one you may change on its own.
3977
4086
 
3978
4087
  Worked example, one topic (`bookkeeping for solo trades`), one frame family, four angles, four different videos:
3979
4088
 
3980
- | Stage | Angle | Frame | Title |
3981
- |---|---|---|---|
3982
- | 1 | the daily friction | the psychology of | *"Why every tradie has a glovebox full of receipts"* |
3983
- | 2 | the hidden cost | why it failed | *"The £3,400 a year that disappears in your van"* |
3984
- | 3 | the false solution | myth vs reality | *"A shoebox is not a filing system, and HMRC agrees"* |
3985
- | 4 | the price objection | cheap vs expensive | *"£49 a month vs the accountant's £900 catch-up bill"* |
4089
+ | Stage | Angle | Frame | Format | Title |
4090
+ |---|---|---|---|---|
4091
+ | 1 | the daily friction | the psychology of | native | *"Why every tradie has a glovebox full of receipts"* |
4092
+ | 2 | the hidden cost | why it failed | stat headline | *"The £3,400 a year that disappears in your van"* |
4093
+ | 3 | the false solution | myth vs reality | myth vs fact | *"A shoebox is not a filing system, and HMRC agrees"* |
4094
+ | 4 | the price objection | cheap vs expensive | us vs them | *"£49 a month vs the accountant's £900 catch-up bill"* |
3986
4095
 
3987
4096
  **When a director says "I already covered that."** Hold the frame, change the angle. Same subject, new video, and it is the cheapest idea in the bank to produce because the research is already done.
3988
4097
 
3989
4098
  **When a set feels repetitive.** Check which axis you froze — and check the **subject** first, because it is the one that hides. Thirty ideas that vary only the frame, on one pasted offer sentence, at one stage and one angle, are thirty versions of one video. Vary two axes minimum, and never let the subject be the constant.
3990
4099
 
3991
- ### Frame → format notes
4100
+ ### Frame → build notes
3992
4101
 
3993
- The frame also suggests how to build it, which saves a planning round:
4102
+ The frame also suggests how to build it, which saves a planning round. This is the *default* build; a format from the bank above overrides it:
3994
4103
 
3995
- | Frame family | Natural format | Build notes |
4104
+ | Frame family | Natural build | Build notes |
3996
4105
  |---|---|---|
3997
4106
  | Contrast (`then vs now`, `cheap vs expensive`) | Split screen or A/B beat pairs | Cheapest to produce — two stills or two clips per beat. Great for the cutout/sticker explainer style. |
3998
4107
  | Hidden-knowledge (`what nobody noticed`, `the untold story`) | Talking head, or footage + kinetic captions | The loop writes itself; state the timestamp it closes at anyway. |
@@ -4014,6 +4123,9 @@ The frame also suggests how to build it, which saves a planning round:
4014
4123
  - **Do not hand over a distant idea with no turn written.** A video about Napoleon's field library, for a book app, is a great video and a dead one until somebody writes the line that reaches the offer. Write the turn with the idea, in the same breath, or drop the idea.
4015
4124
  - **Do not let the whole list become dated trivia.** "Be concrete" pushes a model straight into "in 1978, a man…". Fifty history videos is one idea fifty times, exactly like the frozen subject. Spread the proof types.
4016
4125
  - **Do not state a date, a number or a record without flagging it for checking.** The editor films what the brief says. A wrong figure is the director's problem the moment it posts, not the writer's.
4126
+ - **Do not pick the format first.** "Let's do a tier list" is a shoot with no idea in it. The format is the last field on the row, after the subject, the angle and the stage.
4127
+ - **Do not run one format for a month.** Thirty talking heads and thirty tier lists fail the same way, and the format is the cheapest axis to rotate — the script survives the swap.
4128
+ - **Do not fabricate the artifact a format imitates.** A staged review wall, a staged inbox, an invented stock count or an invented deadline is a fabricated record with the client's name on it. Use the real screenshot, or keep every claim inside the staged one true.
4017
4129
 
4018
4130
  ## Primitive: image_remove_background
4019
4131
 
@@ -4633,16 +4745,17 @@ Use this when the user wants to keep the format’s feel but replace the subject
4633
4745
  1. Read `references/editor-workflows.md`.
4634
4746
  2. Fetch `video-context.json` and `editor-harness.json` first.
4635
4747
  3. State the plan in the three axes vocabulary: scenes, audio, text; SWAP vs REPLACE for each.
4636
- 4. Preserve the hook structure, cut rhythm, emotional punch, and important scenes flagged by the harness. **Read `references/hooks-and-virality.md` before rewriting the opening line or the retention beat** `viral_dna.hook`/`retention`/`payoff` name the source's four charges, and rebuilding each one for the new subject (rather than flattening the loop into a product statement) is the whole job.
4637
- 5. Source footage in this order:
4748
+ 4. **Audit every element before you touch one.** The fork is somebody else's *finished* video, so list its layers (`vidfarm pull <forkId> --json` → `.layers[]`, plus `grep -o 'data-src="[^"]*"' composition.html | sort -u`) and write one row per element into `./work/ADAPTATION.md`: KEEP / REPLACE / CUT, why, what replaced it. **KEEP is the verdict that needs a reason.** Structure stays (beat count and order, `start`/`duration`, cut rhythm, transitions, caption identity); meaning goes (voiceover, music, caption words, on-screen titles and prices and stats, actor clips, product shots and screenshots, stickers that name a thing, the picture behind a background, and every logo, @handle, URL and watermark). See `references/editor-workflows.md` → *Before the axes: audit every element*. The REPLACE rows are your sourcing list for step 6.
4749
+ 5. Preserve the hook structure, cut rhythm, emotional punch, and important scenes flagged by the harness. **Read `references/hooks-and-virality.md` before rewriting the opening line or the retention beat** — `viral_dna.hook`/`retention`/`payoff` name the source's four charges, and rebuilding each one for the new subject (rather than flattening the loop into a product statement) is the whole job.
4750
+ 6. Source footage for every REPLACE row, in this order:
4638
4751
  - My Files or existing raws
4639
4752
  - a raws hunt from a long-form source
4640
4753
  - AI image generation
4641
4754
  - AI video generation only with permission
4642
- 6. Rebuild captions and narration so timing, cadence, and joke structure survive the subject change.
4643
- 7. Render, verify, then approve and schedule only after the director is happy.
4755
+ 7. Rebuild captions and narration so timing, cadence, and joke structure survive the subject change.
4756
+ 8. Render, verify, then approve and schedule only after the director is happy. Report the audit counts — kept / replaced / cut — with it.
4644
4757
 
4645
- Failure mode to avoid: flattening the format by swapping words but losing the timing, sound, or payoff beat.
4758
+ Two failure modes to avoid: flattening the format by swapping words but losing the timing, sound, or payoff beat — and the opposite, swapping the words and leaving everything else, so the source brand's voice, screenshots, stickers or handle ship inside the director's video.
4646
4759
 
4647
4760
  ## Recipe: Local Pull, Edit, Render, Approve
4648
4761