Polish-Plan

Was Marvin im Studio gesehen hat: das Video wirkt abgehackt — lange Talking-Head-Strecken ohne visuelle Variation, Drift-Stellen drin, Display-Whiteboard ohne Detail-Zooms, Brand noch auf altem Forest-Green-Cream-System.

Plan in sechs Phasen, jede mit klarem Output. Marvin nickt ab → ich arbeite Phase fuer Phase ab. Hinterher destilliere ich das in einen Skill.

Befund (warum es abgehackt wirkt)

  1. Sub-Cut B2-3 ist 53 Sek Talking-Head ohne Schnitt — nichts passiert visuell, Aufmerksamkeit kippt. Klassischer Drop-Spot in YouTube-Retention-Daten.
  2. Drift-Stellen drin — „so so so”, „Pfeile machen”, „Schach spielen waehrend Claude denkt”. Im Schnittplan markiert, aber Sub-Cuts sind grob — drinnen ist alles, nicht selektiv.
  3. Display-Recording wird einfach abgespielt — keine Zooms auf Whiteboard-Detail, keine Cursor-Highlights. Profi-ScreenStudio-Output (Auto-Zoom-on-Click) wird gar nicht emuliert.
  4. Talking-Head ist statisch — kein Ken-Burns, kein Zoom-Punch beim Sub-Cut-Start. Wirkt wie Webcam-Aufnahme.
  5. Uebergaenge sind Hard Cut zwischen Pickup-Cards / Sub-Cuts / Atmosphere — funktional, aber nichts „sitzt”.
  6. Brand veraltet — Forest-Green-Cream-Theme. Webseiten-Brand seit 2026-04-25 ist Bone-Weiss + Ink-fast-Schwarz + Forest als RARE Akzent + sharper Borders.

Strategische Quellen die wir nutzen

  • agentic-ventures-website/DESIGN.md (v alpha, 2026-04-25) — neueste Brand-Tokens. Source of Truth.
  • intern/firma/brand.md §Schnitt-Regeln — definiert bereits Hard Cut / Zoom-Punch (1.025 / 6 Frames) / Cut+Text-Overlay / Cutaway-Interlude. Wir nutzen genau diese Patterns. Nicht neu erfinden.
  • Remotion <Video> aus @remotion/mediatrimBefore/trimAfter als Frame-Werte, plus playbackRate fuer Pause-Speedup.
  • Remotion’s eingebauter silencedetect Filter — automatische Filler-Identifikation. Skill-Doku in /remotion-dev/skills silence-detection.md.
  • mouseclicks-0.json im ScreenStudio-Bundle — exakte Klick-Zeitpunkte und Position fuer Auto-Zoom-on-Click-Emulation.
  • @remotion/media-utils useAudioData() — fuer Audio-Waveform-getriebene Zoom-Trigger an Lautstaerke-Peaks.
  • 0042.json (WhisperX-Output) — Word-Level-Timestamps. Damit kann ich Filler-Words wie „digga”, „alter”, „so so”, „okay so” frame-genau loeschen.

Phasen

Phase 1 — Brand-Migration auf Webseiten-Tokens (~15 Min)

Output: remotion/src/theme.ts matcht agentic-ventures-website/DESIGN.md exakt.

Was geaendert wird:

  • colors.background: #F5F4ED#FFFFFF
  • colors.surface: #E5E2D6#FFFFFF
  • colors.muted: #8B8779#737373
  • colors.text: #1D1D1A#0A0A0A (Webseite hat hoeheren Kontrast)
  • Neu: colors.hairline: #E5E5E5, colors.forestDark: #243B32
  • motion.easeOut: bestehender Wert ueberprueft; Webseite hat cubic-bezier(0.16, 1, 0.3, 1) als --ease-editorial, nehme ich uebernehmen
  • Border-Radius: lg von 12px4px, md von 8px2px

Was NICHT geaendert wird:

  • Forest-Green #2D4A3E als Akzent — nur seltener eingesetzt
  • Lora-Italic-Pairing
  • Component-API von Cards (PlaceholderCard, HeyJuliaCard, Highlight-Overlays)

Side-Effekt: alle anderen Compositions (vlog-intro-test, editorial-showcase etc.) ziehen die neuen Farben — wenn sie kaputt aussehen, ist’s nur der Brand-Drift, nicht meine Migration.

Phase 2 — Filler-Cuts via Silence-Detection (~30 Min)

Output: Liste der Drift-Stellen in 0042-Audio + automatische Sub-Cut-Speedup an Pausen.

Workflow:

  1. npx remotion ffmpeg -i 0042-audio.wav -af loudnorm=print_format=json -f null /dev/null → input_thresh
  2. npx remotion ffmpeg -i 0042-audio.wav -af silencedetect=noise=THRESH dB:d=0.4 -f null /dev/null → Liste aller Stille-Bereiche >0.4s
  3. Liste-Output parsen, JSON ablegen unter intern/projekte/vlog-mai-2026/ressourcen/silence-map-0042.json
  4. Strategie: Pausen <0.6s → playbackRate 1.5x (Audio leicht gespeedet, klingt natuerlich); Pausen >0.6s → komplett rauscutten (Sub-Cut splitten an dieser Stelle).
  5. Plus: aus 0042.json (WhisperX-Word-Timestamps) Filler-Words finden: „digga”, „alter”, „so so so”, „okay so”, „weisst du was”. Diese Word-Spans (typisch 0.3-0.8s) bewusst rauscutten.

Risiko-Mitigation: ich generiere die Cut-Liste, nicht den finalen Schnitt. Marvin sieht Vorschlag-Liste, sagt „das stimmt” oder „lass diese 3 drin”. Erst dann automatisch in Composition.

Phase 3 — Zoom-Punch + Ken-Burns auf Talking-Head (~20 Min)

Output: Talking-Head-Sub-Cuts wirken „lebendig” statt statisch.

Patterns (aus brand.md §Schnitt-Regeln):

  • Zoom-Punch beim Sub-Cut-Start: Scale 1.0 → 1.025 ueber 6 Frames mit Ease-Out. Default fuer JEDEN Sub-Cut. Nicht spuerbar — aber das Auge merkt’s. Standard, nicht Highlight.
  • Ken-Burns auf Master-Cuts: Scale slow 1.0 → 1.04 ueber die ganze Cut-Dauer. Subtil. Nur fuer Sub-Cuts >15 Sek.
  • Stronger Zoom-Punch (1.0 → 1.05) an Punchline-Cuts: „Der Mensch”, „75 Euro pro Stunde”, „Mitarbeiter komplett ersetzen” — bewusste Akzent-Bewegung.
  • Micro-Shift +/- 4px pro Cut: kompensiert Jump-Cut-Drift, gibt Variation.

Implementation: TalkingHeadFull bekommt Props zoomPunch, kenBurns, microShift — analog zur bestehenden TalkingHeadClip-Component.

Phase 4 — Display-Auto-Zoom-on-Click (~40 Min)

Output: Display-Recording bekommt smooth Zoom-Animationen auf Cursor-Klicks — wie ein cleanes ScreenStudio-Output.

Workflow:

  1. mouseclicks-0.json parsen → Liste [{timeMs, x, y}]
  2. Pro Klick im aktuellen Sub-Cut-Range: Zoom-Animation generieren
  3. Animation-Pattern:
    • Trigger 200ms vor Klick (anticipation)
    • Scale 1.0 → 1.4 ueber 600ms (Ease-Out, editorial-easing)
    • Hold auf 1.4 fuer 800ms
    • Smooth Out 1.4 → 1.0 ueber 500ms
    • Transform-Origin: Cursor-Position
  4. Cap: max 1 Zoom pro 4 Sekunden (sonst hektisch)
  5. Skip-Logik: wenn Marvin nur Pfeile zeichnet (Klicks ohne Tool-Wechsel) → kein Zoom

Component: neue DisplayWithSmartZoom als Wrapper um <Video src={DJI_0042_DISPLAY}>. Liest mouseclicks-0.json (in public/screenstudio/), berechnet pro Frame Zoom-Transform.

Phase 5 — Uebergaenge (~15 Min)

Output: Block-Wechsel und Atmosphere-Interludes wirken „smooth”, nicht hart.

Patterns:

  • BlurCut zwischen Bloecken: Gaussian-Blur Peak 3.5px ueber 14 Frames bei Block-Wechsel (Block 1 → I1 → Block 2 → I2 → Block 3 → Outro). Vox-Style-Klassiker.
  • Cut + KineticText-Overlay an den Highlight-Stellen wo eh schon eine Card kommt (Bottleneck, 75€, Block-3-Punchline) — bestehende Overlays bleiben, ergaenzt um BlurCut-Anfang.
  • Atmosphere-Interludes in neuer Brand: warmer Bone-Background statt warmer Gradient. Plus Section-Number ohne Forest-Akzent (nur Muted), reduzierter visueller Stress.

Implementation: BlurCutTransition-Component — wraps die Sequence-Boundary mit Frame-spezifischem filter: blur(...).

Phase 6 — Studio-Iteration mit Marvin (open-ended)

Output: Marvin sieht das Resultat, gibt Feedback, ich justiere.

  • Sub-Cut-fuer-Sub-Cut durchgehen
  • B2-2 „produzierendes Gewerbe” individuell justieren (das Display-Sync-Issue)
  • Hartcut-Stellen evaluieren (Sub-Cut 8→9 in Block 1)
  • Display-Zooms je nach Wirkung dimmen oder verstaerken

Phase 7 — Skill destillieren

Output: agentic-ventures:vlog-cut Skill in ~/.claude/plugins/.../skills/

Inhalt:

  • Trigger: „cutte vlog”, „make vlog cut”, „polish vlog footage”, „bau composition fuer take X”
  • Knowledge:
    • Brand-Tokens (Bone, Ink, Forest, Lora-Italic, Hairlines, Border-Radii)
    • Schnitt-Patterns (Hard Cut Default 60%, Zoom-Punch 25%, Cut+Overlay 10%, Cutaway 5%)
    • Silence-Detection-Workflow (loudnorm → silencedetect → JSON-Map)
    • Filler-Word-Liste fuer deutsche Vlogs („digga”, „alter”, „okay so”, „weisst du was”)
    • Display-Auto-Zoom-Pattern (Trigger 200ms vor Klick, Scale 1.4, 600/800/500ms)
    • BlurCut-Easing-Werte
    • Hook-Promise-Stakes-Pickup-Pattern (aus 03-pickup-liste)
  • Workflow:
    1. Transcripts vorhanden? Ja → schauen welche Sub-Cuts. Nein → WhisperX laufen lassen.
    2. Roter Faden + Hook + Promise + Stakes definieren (Faden-Check 4 Kriterien)
    3. Schnittplan pro Block mit Zeilen-rein/raus
    4. Trim-Werte rechnen + Composition aufbauen
    5. Silence-Detection + Filler-Cut
    6. Brand-Cards + Highlight-Overlays
    7. Zoom-Patterns
    8. Display-Insert mit Auto-Zoom (falls ScreenStudio-Bundle vorhanden)
    9. Studio-Iteration

Reihenfolge + Estimate

Total: 2-3 Std Implementation plus Marvin’s Studio-Iteration zwischen Phase 5 und 7.

#PhaseDauerMarvin-Block?
1Brand-Migration15 Minnein
2Silence-Detection + Filler-Cut-Liste30 Minja (Marvin sieht Liste, nickt ab)
3Zoom-Punch + Ken-Burns20 Minnein (per Default an, Marvin pickt ggf. raus)
4Display-Auto-Zoom40 Minnein
5Uebergaenge15 Minnein
6Studio-Iterationopenkontinuierlich
7Skill30 Minnein

Risken

  • Auto-Zoom kann hektisch wirken falls zu viele Klicks dicht aufeinander liegen. Mitigation: 4-Sek-Cap.
  • Silence-Detection kann zu aggressiv und Marvin’s Atemluft mitschneiden. Mitigation: Threshold konservativ, Marvin reviewt Liste.
  • Brand-Migration koennte andere Compositions optisch brechen (Editorial-Showcases nutzen alte Bone-Farbe). Mitigation: theme.ts ist Source of Truth, andere Compositions laufen weiter, sehen nur „aktualisiert” aus. Kein API-Break.
  • 0042-Proxy ist 1080p, nicht 4K — bei Display-Zoom auf 1.4x sieht man Pixel. Mitigation: Display ist 0042-display.mp4 (separat, nativ 1080p oder hoeher von ScreenStudio), nicht der DJI-Proxy. Talking-Head-PiP ist klein genug, dass 1080p reicht.

Was Marvin abnicken muss

  • ✅ / ❌ pro Phase
  • Falls eine Phase „nein”: Begruendung, dann passe ich den Plan an
  • Plus: Reihenfolge ok? Ich faenge mit Phase 1 an, Phase 2-5 in Reihenfolge.