Video Reel Studio — Ein Orchestrator mit strengen Prüfungen
Dieser Skill zeichnet und schneidet nicht selbst. Er ist ein Orchestrator über fünf vorhandene Skills:
| Skill | Wird vom Orchestrator verwendet für |
|---|---|
video-ad-editor | Alle Skripte (scripts/), Talking Reels, Untertitel, Cover |
montage-video | Montage von Clips ohne Sprache auf den Takt |
podcast-video | Zwei Kameras → Reels oder 16:9-Episode |
motion-video | Motion Film aus Text (Motor motion/) |
thumbnail-video | Cover des Reels und YouTube-Thumbnail |
Wurzel der Skripte: .opencode/skills/video-ad-editor/ — vollständige Pfade übergeben.
Plattformen: Windows und Mac
Der Skill ist für beide geschrieben. Der Unterschied liegt nur in der Art, wie Werkzeuge aufgerufen werden, nicht in der Logik:
| Windows | Mac | |
|---|---|---|
| Python | python | python3 |
.sh-Skripte | & "C:\Program Files\Git\bin\bash.exe" … (⛔ nicht bash normal = WSL) | bash … |
| Chrome | C:\Program Files\Google\Chrome\Application\chrome.exe | /Applications/Google Chrome.app/Contents/MacOS/Google Chrome |
| 3D | GL=gpu (ANGLE/D3D11) | Metal automatisch |
| Pfade | D:/work/x or D:\work\x | /Users/you/work/x |
Vor jeder Arbeit, einmal pro Sitzung:
python scripts/preflight.py # Mac: python3
Überprüft: Python, ffmpeg/ffprobe, node, bash, Chrome, numpy/scipy, die Schwester-Skills, Schriftart und Identitätsordner — und gibt den korrekten Installationsbefehl für jedes System aus (winget auf Windows, brew auf Mac). Das Gate G-2.
Die Skripte erkennen die Plattform selbst: _vision.py wählt Apple-Tools auf Mac und offene Alternativen auf Windows, _chrome_flags.js wählt Metal auf Mac und SwiftShader auf anderen, und 31_device3d.js und motion/render.js suchen Chrome in den Pfaden beider Systeme.
Der Vertrag: Ein Satz → fertige Datei
Der Benutzer gibt dir eine Datei oder einen Link und einen Satz. Du hältst alle Schritte. Gib ihm keine Befehle und frage nicht nach Dingen, die du selbst überprüfen kannst. Frage nur eine einzige Frage, wenn die Entscheidung geschmacklich und nicht technisch ist (welcher Winkel, welcher Hook, welcher Satz soll weg).
Ägyptische Befehle — wenn er das sagt, ist das der Modus
| Wenn er sagt | Modus |
|---|---|
| «منتج الفيديو ده» · «حوّله لريل» · «اقصّ السكتات» · «هات الكابشن» | talking-reel |
| «اعمل مونتاج من المقاطع دي» · «ركّبهم على الأغنية» | montage |
| «اعمل ريلات من الحلقة» · «عندي كاميرتين» · «الحلقة كاملة» | podcast |
| «اعمل فيديو موشن من النص ده» · «اشرح بالحركة» · «موشن جرافيكس» | motion |
| «اشرح الموقع ده بفيديو» · «ديمو للتطبيق» · «اللينك ده» | web-demo |
| «اعمل كوفر» · «ثمبنيل يوتيوب» · «صورة مصغرة» | cover-only |
| «عايز أعدّل بنفسي» · «اعمله كاب كت» · «افتح الاستوديو» | Basis-Modus + CapCut / Studio |
Er muss den Modus nicht erwähnen. Wenn der Satz ein Verb + eine Datei enthält, leitest du den Modus aus dieser Tabelle ab und fährst fort.
Die schnelle Pipeline
| # | Phase | Ausgabe | Gate |
|---|---|---|---|
| -2 | Umgebungsprüfung: preflight.py (Windows/Mac) | Bericht über Werkzeuge | G-2 |
| -1 | Identität (optional): Frage zuerst — gespeichert / neu / Standard | theme.json + brand.md | G-1 |
| 0 | Lese die Anfrage und schreibe brief.json | promise + mode + length | G0 |
| 1 | Quelle: Kopieren, Frames prüfen, Beleuchtung | src.mov | G1 |
| 2 | Schneiden + Transkription + Korrektur + Untertitel | cut.json a.json caps.json | G2 · G3 · G3b |
| 3 | Design: Bewegungen, Szenen, Vorschau | scenes*.js + sheet.jpg | G4b |
| 4 | Vollständiges Rendern | out/ = Dauer×30 | G4 |
| 5 | Kodierung + Master + Übersetzung | ad-master.mp4 .srt | G5 |
| 6 | Cover + Thumbnail + Mobilvorschau | cover.jpg … | G6 · G6b |
| 7 | Lieferbericht | gates.md | G8 |
Details und genaue Befehle → references/pipeline.md.
Rollen und wann an den Agenten übergeben wird → references/roles.md.
Jede Gate-Bedingung und ihre Grenzen → references/gates.md.
Künstlerische Richtung: Vor der ersten Szene wähle einen Stil aus styles/pack.json (10) — python scripts/style_pack.py apply "<work>" <id> — der Stil bestimmt Bewegung und Textur, die Marke bestimmt die Farbe → references/styles-adapted.md.
-1a) Der Agent und das Modell — vor der Identität
ai.json wird vor allem geschrieben: Der Agent ist aus der Umgebung bekannt (du arbeitest darin), also frage nicht danach.
Frage nur eine Frage, wenn das Modell nicht klar ist:
„An welchem Modell arbeitest du? Nur der Name — damit ich die Szenengröße und den Review darauf abstimmen kann.“
| Antwort | Sofortige Auswirkung |
|---|---|
| Modell stark + vision | 6–8 Szenen, Tiefenmomente, visueller Review durch Unteragenten |
| Stark ohne vision | 4–6 Szenen, Review nur Zahlen + Auge des Benutzers auf sheet.jpg |
| Schnell/günstig | 3–5 Szenen aus festen Mustern, eine Vorschau, jedes Gate einmal |
| Kleiner Kontext | Teile die Transkription in Fenster, lies nicht den gesamten Text |
- Der Agent:
opencode·claude-code·codex·cursor·gemini-cli— undpreflight.pyvergleicht das Projekt-Tag mitai.json. - Wenn die Fähigkeiten unbekannt sind, setze sie auf
null→ der Skill geht auf Nummer sicher (Zahlen + Auge). - Details und vollständige Matrix →
references/ai-fit.md.
-1b) Identität — Optionales Onboarding (nicht aufzwingen)
Bei der ersten Videoanfrage, vor jedem Skript, stelle genau eine Frage:
„Bevor wir beginnen: Richten wir deine Identität einmalig ein (5 Minuten: Farben, Schriftart, Ton, Verbote), oder verwenden wir eine gespeicherte Identität, oder fahren wir mit dem Standard fort und ändern später?“
| Seine Antwort | Tu das |
|---|---|
| „Es gibt eine gespeicherte Identität“ | python scripts/onboard.py list → nenne den Namen → apply <work> <slug> |
| „Richte sie ein“ | Die sieben Fragen → new → card → zeige die Karte → apply |
| „Mach mit Standard“ | Frage nicht noch einmal im selben Projekt; Standard #0B0C0C · #F4F2EE · #19C3AE · Cairo · chunk |
| „Ich bin beschäftigt“ | Starte das Video und biete die Identität nach der ersten Lieferung an |
- Die sieben Fragen (Name, Handle, Publikum, Ton, Call-to-Action, Farben, Verbote) →
references/onboarding.md. - Hat er Bilder/Logos? Extrahiere die Palette mit
scripts/00_theme_refs.pystatt zu raten. - G-1: Kontrast ink/bg ≥ 4.5, acc/bg ≥ 3, onAcc/acc ≥ 4.5.
onboard.py newverweigert das Speichern bei Fehlschlag. - Die Identität wird in
~/.config/opencode/brands/<slug>.jsongespeichert und in jedem späteren Projekt verwendet.
⛔ Es ist verboten, das Onboarding zu starten, ohne zu fragen, das Projekt wegen Farben anzuhalten oder mehr als 7 Fragen zu stellen.
G0 — Der Brief (nicht überspringen)
Schreibe <work>/brief.json vor jedem Skript. Vorlage: assets/brief.template.json.
promise= Das, was der Zuschauer in den ersten 3 Sekunden versteht. Ein Satz. Wenn du ihn nicht schreiben kannst, hast du die Anfrage nicht verstanden.modeaus den sechs. Wenn die Anfrage zwei Modi zulässt, wähle den der Benutzerabsicht am nächsten und sag ihm in einem Satz, was du verstanden hast.length_s= realistischer Bereich (Reel 45–90 Sek.; lange Clips → mehrere Reels, nicht ein Reel).must_keep= Namen und Zahlen, die nicht gelöscht oder geändert werden dürfen.
Gate G0: Sind alle drei vorhanden? Wenn nicht, eine Frage und dann weiter.
Führung: Wer entscheidet
Du führst. Warte nicht auf Erlaubnis für jeden Schritt und übergib die Arbeit nicht an einen Agenten, der dich steuert.
- Überprüfe selbst alles Technische: Dauer, Frames, Audio, Größe, Safe Zone.
- Gib die Bewertung ab nur wenn die Bewertung mit frischem Speicher besser ist: Arabisch-Review, Bild-Review.
- Der Agent liest und bewertet nur — schreibt nicht und zeichnet nicht. Prompt-Vorlage in
references/roles.md.
Die Gates: Fail-closed
python scripts/gate_runner.py "<work>" --safe
- Gibt eine Tabelle aus, schreibt
gates.json+gates.mdund beendet mit 1, wenn es einen Blocker gibt. - Keine Lieferung bei offenem Blocker. Und kein „Versuch es und schau, ob es klappt“.
- Budget von zwei Versuchen pro Gate. Beim dritten Mal = Grund nicht verstanden → stoppen und Benutzer mit Beweis fragen (Screenshot + Gattertext).
- Verboten, ein Gate zu deaktivieren,
--maxmbzu erhöhen oder eine Warnung zu ignorieren „weil sie klein ist“. Das ist Fälschung.
Strenge Regeln
- Untertitel sind eine getreue Kopie seiner Rede — erfinde nichts, lösche kein Wort ohne Grund, und die Korrektur behält die Wortanzahl bei.
- Zuerst die Safe Zone — kein Text in y 0–150 oder y 1620–1920, und nicht in der rechten Buttone-Spalte.
- Farben nur aus
theme.json; Null farbliche Änderung an seinem Bild ohne Zustimmung. - Jede Zahl auf dem Bildschirm aus
facts.mdoder seiner Rede — keine Zahl von dir. - Kein Veröffentlichen oder Planen. Lieferung als Dateien.
- Cover ist Pflicht — erster Frame, und lesbar in Handygröße (
cover_phone.jpg). - Größe und Lautstärke sind Teil der Qualität: ≤29 MB, −14 LUFS, Peak ≤ −1.0 dBTP.
Betriebsmodi
- Talking Reel (Standard):
talking-reel— das gesamte Video wird Vollbild, Grafiken im oberen Bereich oder dahinter. - Clips ohne Sprache:
montage— benötigt 10–20 Clips + Audiospur. Keine Wiederholung von Aufnahmen. - Podcast:
podcast— zwei Kameras. Geschriebener Hook ist Pflicht. - Motion Film:
motion— standardmäßig ohne Kommentar (audio.py --no-bed --lufs -20). 3D benötigtGL=gpu. - Website/App:
web-demo—27_web_capture.jsdann30_demo.js(oder31_device3d.js). - Nur Cover:
cover-only.
Lieferbericht
Zwei Zeilen, dann eine kurze Tabelle:
Dauer · Schnitte · Größe · Lautstärke · Peak
Gates 7/7 ✅ (oder akzeptable Warnung + Grund)
Dateien: mp4 · srt · txt · cover.jpg
Nichts veröffentlicht.
Token-Ökonomie
- Ein Befehl pro Phase, nicht 41 einzelne Befehle.
- Ein Blatt mit Aufnahmen (
sheet.jpg) statt 6 Bilder. - Nicht ganze Dateien lesen:
grep -nfür die Funktion,tail -5für das Log. - Referenzen nur bei Bedarf — diese Datei + eine Referenz für die jeweilige Phase.
- Zeige kein Bild, außer für eine visuelle Frage, die nicht anders beantwortet werden kann.
Erwartete Fehler (keine Überraschung)
| Symptome | Grund | Lösung |
|---|---|---|
UnicodeEncodeError | Schreiben ohne utf-8 auf Windows | PYTHONUTF8=1 setzen (Skripte sind gefixt, aber verlasse dich nicht darauf) |
| 3D hängt | Chrome-Pfad/Pfad /work | CHROME korrekt + GL=gpu (in 31_device3d gefixt) |
| Untertitel zu spät/abgeschnitten | Schnitt hat sich nach den Untertiteln geändert | 02_captions.py erneut ausführen, dann G3 |
| Hoher Peak nach Kompression | AAC hebt den Peak an | alimiter im Cover-Pfad oder 06c_loudfix.sh |
| Transkription halluziniert | Umgangssprache/englischer Begriff | 02a_whisper_check.py --fix dann mit konstanter Wortanzahl korrigieren |