@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.
@@ -46,9 +46,13 @@ read them after, not during. A reason next to a rule is something to negotiate w
46
46
  8. **Walk the asset ladder in order and stop at the first rung that answers:** client's
47
47
  shared folder → client's website → public raws → free stock (Pixabay/Openverse) →
48
48
  IconScout → your own subscription's generator → billed generation.
49
- 9. **Keep the load-bearing DNA. Replace everything else without mercy.** Load-bearing =
50
- the beat count, the cut rhythm, the hook shape, the payoff position, the caption
51
- identity. Every word, every image, every voice line gets replaced.
49
+ 9. **Audit every element, one at a time, before you plan — then keep the load-bearing DNA
50
+ and replace the rest without mercy.** Load-bearing = the beat count, the cut rhythm,
51
+ the hook shape, the payoff position, the caption identity. Everything that carries
52
+ *meaning* — every voice line, every caption word, every clip, image, sticker,
53
+ background, on-screen title, logo and handle — belongs to the source brand until you
54
+ decide otherwise, element by element, in `./work/ADAPTATION.md` (§3½). **KEEP is the
55
+ verdict that needs a reason. REPLACE is the default.**
52
56
  10. **Overfitting to this one template is CORRECT.** Do not add originality on top. The
53
57
  template is the originality; your job is the transplant.
54
58
  11. **Run the gate as a command, not from memory:** `vidfarm qa ./work --harness ./HARNESS.md`,
@@ -271,6 +275,97 @@ A plan is free to redo. A rendered beat is not.
271
275
 
272
276
  ---
273
277
 
278
+ ## 3½. The element audit — every element earns its place
279
+
280
+ **A fork is not a half-finished video that is already partly right. It is somebody else's
281
+ FINISHED video.** Every element in it was chosen for their product, their customer, their
282
+ joke, their face, their palette. Anything you do not deliberately re-decide stays theirs —
283
+ and the client watches the result.
284
+
285
+ So walk the composition element by element and give every one a verdict. There are three:
286
+
287
+ | Verdict | Means |
288
+ |---|---|
289
+ | **KEEP** | it carries the DNA, or it is generic enough to be just as true in the client's world |
290
+ | **REPLACE** | it says something about the source's world. Swap it for the client's equivalent |
291
+ | **CUT** | the client's story does not have this beat or this ornament. Delete it, ripple the hole closed |
292
+
293
+ > **KEEP is the verdict that needs a reason. REPLACE is the default.**
294
+ >
295
+ > This is backwards from how it feels, and that is the point. The cheap failure is not a bad
296
+ > replacement — it is an element nobody ever looked at. **A cut whose captions changed and
297
+ > nothing else is the most commonly rejected video there is**, and on the marketplace it is
298
+ > the most commonly rejected proof. The client is paying for a video about *their* thing.
299
+ > Relevant customization is the deliverable.
300
+
301
+ ### List the elements — from the file, not from memory
302
+
303
+ ```bash
304
+ vidfarm pull <forkId> --dir ./work --json \
305
+ | jq -r '.layers[] | [.key, (.kind // "?"), (.start|tostring), (.duration|tostring), (.label // "—"), (.src // "—")] | @tsv'
306
+
307
+ grep -o 'data-src="[^"]*"' ./work/composition.html | sort -u # every asset file the video loads
308
+ grep -o 'data-layer-kind="[^"]*"' ./work/composition.html | sort | uniq -c
309
+ vidfarm captions list ./work # every caption cue, with its words
310
+ ```
311
+
312
+ `vidfarm pull` without `--json` prints the same layer keys in a readable list. Read
313
+ `./work/HARNESS.md` alongside it: beats marked critical / `must_keep` are the ones you may
314
+ not CUT.
315
+
316
+ **A `text` layer has no `src`, so the inventory shows it as `—`. That is not "nothing to
317
+ decide" — it is the words on screen.** `vidfarm captions list ./work` reads the caption
318
+ cues; the titles, kickers, labels, price tags and end cards you read out of the DOM. They
319
+ get a row each, like everything else.
320
+
321
+ ### Write `./work/ADAPTATION.md` — one row per element
322
+
323
+ | layer key | what it is | verdict | why | replaced with |
324
+ |---|---|---|---|---|
325
+ | `scene-1-vo` | voiceover, "Dishcovery finds you recipes" | REPLACE | names another product | `./work/vo-01.mp3` |
326
+ | `scene-1-bg` | full-canvas kitchen b-roll | KEEP | generic kitchen, still true for a food client | — |
327
+ | `scene-2-logo` | source brand wordmark, 0.4s | CUT | not the client's brand, beat survives without it | — |
328
+ | `cap-*` (23 cues) | caption identity: Montserrat 900, lower third, outline | KEEP | this is the visual DNA — the cheapest thing to keep | — |
329
+
330
+ ### The default verdict per element class
331
+
332
+ Start here, then override with a reason written into the row.
333
+
334
+ | Element class | Default | Why |
335
+ |---|---|---|
336
+ | **Voiceover / TTS — every line** | REPLACE | a fork carries the source brand's narration. See the warning in §3 |
337
+ | **Music bed / SFX** | REPLACE | the track is part of the source's identity, and the licence is not yours |
338
+ | **Captions — the words** | REPLACE, every cue | they are the script |
339
+ | **Captions — the identity** (font, size, placement, background style) | KEEP | this is visual DNA, and the most expensive thing to get right yourself |
340
+ | **On-screen text that is NOT a caption** — titles, kickers, labels, price tags, list items, stat callouts, end cards | REPLACE or CUT | these are the source's claims. A stale number or a stale price is worse than none |
341
+ | **A-roll / talking-head / actor clips** | REPLACE | a face is a brand. The wrong person recommending the client's product is the loudest possible defect |
342
+ | **B-roll clips** | REPLACE unless generic **and** still true in the client's world | "a keyboard" survives a subject change; "a barista pulling a shot" does not survive a move to fintech |
343
+ | **Product images, screenshots, UI frames, mockups** | REPLACE, always | this is literally the other company's product on screen |
344
+ | **Stickers, icons, cutouts, emoji** | REPLACE when they name a thing; KEEP when purely decorative and on-palette | a burger sticker in a payroll video is a rejection |
345
+ | **Backgrounds / plates / colour fields** | KEEP the treatment, REPLACE the picture | the parchment stage, the vignette, the grade are DNA. The photo behind them is content |
346
+ | **Logos, wordmarks, @handles, URLs, watermarks, end-card CTAs** | REPLACE or CUT — **never KEEP** | shipping a competitor's handle is the fastest way to lose a buyer and a trust score |
347
+ | **Palette + typography tokens** | KEEP, unless the client has a brand | then match the client's, staying inside the five allowed fonts |
348
+ | **`start`, `duration`, `track`, transitions** | KEEP | the rhythm is the DNA. Retiming is how a weak model flattens a format |
349
+ | **Beat count and beat order** | KEEP | drop a beat only deliberately, and say which one and why in your report |
350
+
351
+ ### Three tests, when a row is not obvious
352
+
353
+ 1. **Provenance** — *did I put this file here?* If the `data-src` still resolves to the
354
+ source template's storage, nothing was decided about it; it was inherited.
355
+ 2. **Relevance** — *does this show the CLIENT's world?* Their product, their customer, their
356
+ category, their words. If it shows anyone else's, REPLACE.
357
+ 3. **Load-bearing** — *cut it and read the beat again.* If the beat still works, CUT wins.
358
+ Ornament you keep out of politeness is what makes a video feel like a template.
359
+
360
+ ### Before you leave §3½
361
+
362
+ Every layer key from the inventory appears in `ADAPTATION.md` with a verdict. **Count the
363
+ rows against the layer count** — an element with no row is an element you never decided.
364
+ Then carry every REPLACE row into `STORYBOARD.md`'s `src` column: **the audit IS your
365
+ shopping list for §4.**
366
+
367
+ ---
368
+
274
369
  ## 4. Procure every raw — one pass, before you edit
275
370
 
276
371
  **This is the half of the job that decides whether the video is good, and it is the half
@@ -348,23 +443,32 @@ vidfarm serve --fork <forkId> # free local editor + render loop at localhost:3
348
443
 
349
444
  ### What you are doing, precisely
350
445
 
351
- You are running a **transplant**, beat by beat, down `STORYBOARD.md`. For each beat:
446
+ You are running a **transplant**, and `ADAPTATION.md` from §3½ is the work order. Take the
447
+ rows in timeline order. For each one:
352
448
 
353
- 1. Find the source layer (`vidfarm pull` printed the scene/layer keys).
354
- 2. Swap its `data-src` for your procured asset.
355
- 3. Rewrite its text for the client.
356
- 4. **Leave `start` and `duration` alone** unless the Structural DNA says that beat is free.
449
+ 1. Find the layer by its key (`vidfarm pull` printed them).
450
+ 2. **REPLACE** — swap its `data-src` for your procured asset, or rewrite its text for the
451
+ client. Then write the new asset into the row's *replaced with* cell.
452
+ 3. **CUT** delete the layer, then close the hole (`vidfarm ripple`) so the rhythm survives.
453
+ 4. **KEEP** — do nothing, and leave the reason in the row. It is the only verdict a reviewer
454
+ will question.
455
+ 5. **Leave `start` and `duration` alone** unless the Structural DNA says that beat is free.
357
456
 
358
- ### Keep vs replace the line
457
+ ### Work the ledger, not your memory
359
458
 
360
- | Keep this is the DNA | Replace this is the dressing |
361
- |---|---|
362
- | beat count and beat order | every clip, every image, every sticker |
363
- | each beat's `start` and `duration` | every caption word |
364
- | the cut rhythm and the transitions | the palette, if the client has a brand |
365
- | the caption identity — font, size, placement, background style | the voiceover, every line of it |
366
- | the hook's *shape* and the payoff's *position* | the music bed |
367
- | any beat marked critical / `must_keep` | the offer, the handle, the CTA |
459
+ **A row you have not touched is not a KEEPit is an element you forgot.** The two are
460
+ indistinguishable in the finished video and completely different in the buyer's reaction, so
461
+ close the loop in the file: every REPLACE row ends with the asset you actually put there.
462
+
463
+ When the pass is done, prove there is no residue from the source brand:
464
+
465
+ ```bash
466
+ grep -o 'data-src="[^"]*"' ./work/composition.html | sort -u # any src still on the source's storage?
467
+ grep -oiE '@[a-z0-9_.]+|https?://[^"< ]+' ./work/composition.html | sort -u # stray handles and URLs
468
+ ```
469
+
470
+ Read both lists row by row. Anything that is not the client's, and not a generic asset you
471
+ deliberately kept, is unfinished work — not a detail to mention in the report.
368
472
 
369
473
  ### "It is okay to heavily alter it"
370
474
 
@@ -409,8 +513,11 @@ vidfarm stills ./work --sheet # contact sheet → read it as ONE
409
513
  your report instead of running is not a check, and this is the failure mode weak models hit
410
514
  hardest: reporting a pass on the half the CLI never judged.
411
515
 
412
- Three things the CLI cannot judge, which you must answer honestly:
516
+ Four things the CLI cannot judge, which you must answer honestly:
413
517
 
518
+ - **The audit is closed.** Every row in `ADAPTATION.md` has a verdict, every REPLACE row
519
+ names the asset that replaced it, and every KEEP row carries a reason. Report the three
520
+ counts — kept / replaced / cut — not the word "done".
414
521
  - **Audio provenance.** Paste the `grep` output from §3. Every audio `data-src` is yours.
415
522
  - **The contact sheet.** One type scale, one palette, deliberate pacing, clean joins. If
416
523
  two beats look like they came from different videos, they did — fix it.
@@ -450,6 +557,9 @@ FLASH-HARNESS RESULT
450
557
  source_template: template_...
451
558
  decomposed_by: already | cloud | local | inspiration-mint
452
559
  format_harness: <name or "none — freestyled">
560
+ elements_audited: <n>/<n layers in the fork> (ADAPTATION.md, §3½)
561
+ element_verdicts: kept=<n> replaced=<n> cut=<n>
562
+ kept_and_why: <one line per KEEP that a reviewer could question>
453
563
  beats: <kept>/<source total> dropped: <which, and why>
454
564
  assets_by_rung: shared=<n> website=<n> raws=<n> stock=<n> iconscout=<n> subscription=<n> billed=<n>
455
565
  audio_replaced: <n>/<n> audio data-src now point at my own files
@@ -489,6 +599,16 @@ cost*, not by cost alone. A designer's finished transparent vector from IconScou
489
599
  generated icon on both axes. A real photo beats a generated photo. Free does not mean first
490
600
  — *best free* means first.
491
601
 
602
+ **Why the audit is element-by-element, and why KEEP needs the reason (rule 9).** A fork
603
+ starts as a video that is 100% about another company, and it degrades gracefully: swap the
604
+ captions and it still plays, still renders, still passes every automated check — while a
605
+ competitor's screenshot sits in beat 4 and a competitor's handle sits on the end card. Nothing
606
+ in the pipeline flags an element you never looked at, because "untouched" and "deliberately
607
+ kept" produce byte-identical HTML. The written ledger is the only thing that separates them.
608
+ Making REPLACE the default costs a few minutes on the rows that genuinely should stay, and it
609
+ removes the failure that gets proofs rejected: a video the buyer can tell was made for
610
+ somebody else.
611
+
492
612
  **Why overfitting is fine (rules 9–10).** A weak model's improvisation has a wide variance
493
613
  and a low mean. A decomposed template has a narrow variance and a high mean. Across a batch
494
614
  of thirty videos the client sees, the template path wins on every percentile that matters —
@@ -530,6 +650,10 @@ vidfarm harness show ./work/HARNESS.md --dna viral
530
650
  vidfarm harness show ./work/HARNESS.md --dna visual
531
651
  vidfarm storyboard ./work --init --frames "Hook,Problem,Reveal,CTA"
532
652
 
653
+ # 3½ — audit every element, then write ./work/ADAPTATION.md (KEEP needs the reason)
654
+ vidfarm pull <forkId> --dir ./work --json | jq -r '.layers[] | [.key,(.kind//"?"),(.src//"—")] | @tsv'
655
+ grep -o 'data-src="[^"]*"' ./work/composition.html | sort -u
656
+
533
657
  # 4 — procure (one pass, every beat)
534
658
  vidfarm shared ls "$ASSETS_LINK"
535
659
  vidfarm capture <client-url>