vault-sync: 2026-10-16 12:01 (jimmy)
This commit is contained in:
@@ -301,3 +301,53 @@ Held ≥ 5 s. Political: big **NO/YES** block in the accent color, "ON PROP N",
|
||||
- `C:\video\` — `examples\prop1ad`, `template` (Remotion), `voice_tests` (B1–B10, P1–P4, NOTES.md), `COPYWRITING.md`, `HERMES_PROMPT.md`, `STACK.md` (this file)
|
||||
- Hermes profile — `C:\Users\fight\AppData\Local\hermes\profiles\explainer\` (`SOUL.md`, `STACK.md`, `.env`, `skills\media\explainer-video\SKILL.md`)
|
||||
- Obsidian — `C:\Users\fight\Documents\Obsidian Vault\Video Stack\Full Stack Spec.md`
|
||||
|
||||
|
||||
## Prop 39 critique: lessons (2026-10-16)
|
||||
|
||||
Source: Hermes's "Yes on 39" 1:38 16:9 draft (`C:\video\prop39`). Length 1:38 was intended — not a defect.
|
||||
|
||||
### 1. Captions lost every space ("areyou?Many", "governmentissuedID")
|
||||
**Root cause:** `C:\video\prop39\build_hf.py` line 35 built word spans separated by a space, but the `.cap` CSS rule (line 171) was `display:flex;justify-content:center`. In a flex container each `<span>` becomes a flex item and whitespace-only text between items is discarded, so the words render glued together.
|
||||
- [ ] `.cap` is `display:block` (never flex/grid). Center with `text-align:center`.
|
||||
- [ ] Word spans joined with `' '.join(...)` — real space text nodes.
|
||||
- [ ] Run `python scripts/qa/check_captions.py hf/ad/index.html vo/words.json` — must print `CAPTION CHECK OK`.
|
||||
- [ ] Look at 3 stills with captions on screen and read them aloud.
|
||||
|
||||
### 2. Safe zones
|
||||
- 16:9 1920x1080: title-safe 5% → 96px left/right, 54px top/bottom. Nothing (DRAFT tag, logos, header) outside it.
|
||||
- Captions bottom edge ≥ 12% from the bottom (≥130px at 1080p), so player bars don't cover them.
|
||||
- 9:16 1080x1920: top 250px, bottom 430px, right 90px are UI zones. Content and captions stay inside.
|
||||
- [ ] Export stills of first scene, a caption-heavy scene and end card; check against the zones.
|
||||
|
||||
### 3. Voice was flat (uniform pauses)
|
||||
- Political = Gemini **Charon**; business = **Kore**. Steer delivery in `--style`, never in the text.
|
||||
- Natural punctuation, contractions ("it's", "don't"), mix short and long sentences.
|
||||
- Vary gaps between sentences 150–400ms (longer before the big point, shorter in lists). Never one fixed gap.
|
||||
- [ ] Listen to the whole VO once, start to finish, before building visuals.
|
||||
|
||||
### 4. Persuasive copy — pick the mode first
|
||||
- Decide: **neutral explainer** or **advocacy ad**. Write it in the brief and stick to it.
|
||||
- Advocacy ("Yes on X") argues from line 1. No hedges like "other access concerns remain debated" or "laws vary" — those belong only in neutral explainers.
|
||||
- Lead with the strongest lines (e.g. "When the process feels loose, people stop trusting it", "A secure election is a fair election").
|
||||
- Cut procedural scenes (e.g. "best-efforts" data/reporting) that kill momentum.
|
||||
|
||||
### 5. Pacing
|
||||
- 10–12s static slides feel like a deck. Something visible changes every 3–5s: a build, kinetic number, highlight, camera push, or cut.
|
||||
- [ ] No scene element is static >5s (check the timeline).
|
||||
|
||||
### 6. Facts and disclosure
|
||||
- Every stat (e.g. "36 states", Gallup/Pew numbers) has a source URL in `vo_review.md` / `sources.md`.
|
||||
- No chart labeled "illustrative" presented as data: use real numbers with citation, or remove.
|
||||
- A real "Paid for by ..." line replaces any "sponsor disclosure pending" placeholder before publishing.
|
||||
|
||||
## Pre-render QA checklist (Hermes must run all, every video)
|
||||
1. [ ] **Captions:** `check_captions.py` passes; 3 stills read correctly with spaces.
|
||||
2. [ ] **Safe zones:** stills checked (16:9: 96/54px, captions ≥12% up; 9:16: 250/430/90).
|
||||
3. [ ] **Voice:** full listen; varied pauses; Whisper check has no misreads.
|
||||
4. [ ] **Facts:** every number/claim has a source in `vo_review.md`; no "illustrative" data.
|
||||
5. [ ] **Mode:** brief says neutral or advocacy; no copy contradicts it.
|
||||
6. [ ] **Pacing:** visual change every ≤5s.
|
||||
7. [ ] **Disclosure:** real "Paid for by" end card (political); DRAFT tag inside safe zone or removed for final.
|
||||
Report each item's result to the user before delivering.
|
||||
|
||||
|
||||
@@ -13,3 +13,53 @@ Back to [[Video Stack - Overview]]
|
||||
- ElevenLabs free tier was blocked for TTS ("unusual activity"); not retried.
|
||||
- HyperFrames is easier for local models than Remotion (plain HTML per scene).
|
||||
- Pick an authoritative male voice for political ads.
|
||||
|
||||
|
||||
## Prop 39 critique: lessons (2026-10-16)
|
||||
|
||||
Source: Hermes's "Yes on 39" 1:38 16:9 draft (`C:\video\prop39`). Length 1:38 was intended — not a defect.
|
||||
|
||||
### 1. Captions lost every space ("areyou?Many", "governmentissuedID")
|
||||
**Root cause:** `C:\video\prop39\build_hf.py` line 35 built word spans separated by a space, but the `.cap` CSS rule (line 171) was `display:flex;justify-content:center`. In a flex container each `<span>` becomes a flex item and whitespace-only text between items is discarded, so the words render glued together.
|
||||
- [ ] `.cap` is `display:block` (never flex/grid). Center with `text-align:center`.
|
||||
- [ ] Word spans joined with `' '.join(...)` — real space text nodes.
|
||||
- [ ] Run `python scripts/qa/check_captions.py hf/ad/index.html vo/words.json` — must print `CAPTION CHECK OK`.
|
||||
- [ ] Look at 3 stills with captions on screen and read them aloud.
|
||||
|
||||
### 2. Safe zones
|
||||
- 16:9 1920x1080: title-safe 5% → 96px left/right, 54px top/bottom. Nothing (DRAFT tag, logos, header) outside it.
|
||||
- Captions bottom edge ≥ 12% from the bottom (≥130px at 1080p), so player bars don't cover them.
|
||||
- 9:16 1080x1920: top 250px, bottom 430px, right 90px are UI zones. Content and captions stay inside.
|
||||
- [ ] Export stills of first scene, a caption-heavy scene and end card; check against the zones.
|
||||
|
||||
### 3. Voice was flat (uniform pauses)
|
||||
- Political = Gemini **Charon**; business = **Kore**. Steer delivery in `--style`, never in the text.
|
||||
- Natural punctuation, contractions ("it's", "don't"), mix short and long sentences.
|
||||
- Vary gaps between sentences 150–400ms (longer before the big point, shorter in lists). Never one fixed gap.
|
||||
- [ ] Listen to the whole VO once, start to finish, before building visuals.
|
||||
|
||||
### 4. Persuasive copy — pick the mode first
|
||||
- Decide: **neutral explainer** or **advocacy ad**. Write it in the brief and stick to it.
|
||||
- Advocacy ("Yes on X") argues from line 1. No hedges like "other access concerns remain debated" or "laws vary" — those belong only in neutral explainers.
|
||||
- Lead with the strongest lines (e.g. "When the process feels loose, people stop trusting it", "A secure election is a fair election").
|
||||
- Cut procedural scenes (e.g. "best-efforts" data/reporting) that kill momentum.
|
||||
|
||||
### 5. Pacing
|
||||
- 10–12s static slides feel like a deck. Something visible changes every 3–5s: a build, kinetic number, highlight, camera push, or cut.
|
||||
- [ ] No scene element is static >5s (check the timeline).
|
||||
|
||||
### 6. Facts and disclosure
|
||||
- Every stat (e.g. "36 states", Gallup/Pew numbers) has a source URL in `vo_review.md` / `sources.md`.
|
||||
- No chart labeled "illustrative" presented as data: use real numbers with citation, or remove.
|
||||
- A real "Paid for by ..." line replaces any "sponsor disclosure pending" placeholder before publishing.
|
||||
|
||||
## Pre-render QA checklist (Hermes must run all, every video)
|
||||
1. [ ] **Captions:** `check_captions.py` passes; 3 stills read correctly with spaces.
|
||||
2. [ ] **Safe zones:** stills checked (16:9: 96/54px, captions ≥12% up; 9:16: 250/430/90).
|
||||
3. [ ] **Voice:** full listen; varied pauses; Whisper check has no misreads.
|
||||
4. [ ] **Facts:** every number/claim has a source in `vo_review.md`; no "illustrative" data.
|
||||
5. [ ] **Mode:** brief says neutral or advocacy; no copy contradicts it.
|
||||
6. [ ] **Pacing:** visual change every ≤5s.
|
||||
7. [ ] **Disclosure:** real "Paid for by" end card (political); DRAFT tag inside safe zone or removed for final.
|
||||
Report each item's result to the user before delivering.
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
# Prop 39 Ad (Yes on 39, voter ID)
|
||||
|
||||
- **Made by:** Hermes (explainer profile), Oct 2026
|
||||
- **Files:** `C:\video\prop39` (HyperFrames build `build_hf.py` -> `hf\ad\index.html`; deliveries in `out\delivery`)
|
||||
- **Format:** 16:9, 1:38 (intended length), also vertical variants
|
||||
- **Status:** draft - needs fixes before publishing
|
||||
|
||||
## Critique (2026-10-16)
|
||||
- Captions missing spaces - root cause `.cap` was `display:flex` (build_hf.py line 171). Fixed in project (backup `build_hf.py.bak-20261016`) and stack templates; needs rebuild + re-render.
|
||||
- DRAFT tag at frame edge; captions too low (bottom:40px -> now 130px).
|
||||
- Flat voice with uniform pauses.
|
||||
- Copy reads neutral until the end; drop hedges ("other access concerns remain debated", "laws vary"); cut scene 5 (best-efforts data/reporting); build around "When the process feels loose, people stop trusting it" and "A secure election is a fair election."
|
||||
- Source "36 states" and Gallup/Pew; drop "illustrative" chart or cite real data; replace "sponsor disclosure pending" with a real Paid for by line.
|
||||
|
||||
See [[Lessons Learned]] -> Prop 39 critique: lessons.
|
||||
|
||||
Reference in New Issue
Block a user