DNA & Rezept
Am Vorbild gemessen, in ausführbare Werte übersetzt – und so lange nachgezogen, bis der Klon sitzt
Der Kloner beantwortet zwei Fragen. Zuerst K0: koennen wir diesen Kanal ueberhaupt bauen? – der Vorab-Pruefer haelt das Vorbild gegen das Modulbuch und sagt als Zahl 1-100, wie weit ein Klon reichen kann, samt Begruendung je Element. Ein Element, fuer das ein Baustein fehlt, ist Bauarbeit; nur ein strukturell fremdes (echtes Gesicht, Lizenzmaterial, Marke) ist ein Abbruch. Danach erst: was genau macht aus einem fremden Video unsere DNA?
Er sieht sich einen bewiesenen Kanal an und schreibt auf, was ihn ausmacht: welche Hooks, welcher Skript-Bogen, welche Titel, welche Bildarten, welcher Schnitt. Das Ergebnis ist eine JSON-Datei, keine Beschreibung. Alles laeuft ueber den eigenen Plan, also kostenlos.
Drei Woerter, drei verschiedene Sachen – sie werden hier bewusst auseinandergehalten:
Nische ist eine Entscheidung: worueber, fuer wen, in welcher Sprache. Sie wird nicht erzeugt, sie legt nur fest, WELCHE Vorbilder man sich ansieht.
DNA wird gemessen – an den Vorbild-Videos, nicht an der Nische. Sie beschreibt, was einen Kanal ausmacht, und besteht groesstenteils aus Prosa plus einigen belegten Zahlen. Keine Pipeline liest sie direkt.
Rezept ist die Uebersetzung der DNA in ausfuehrbare Werte – genau ein Wert je Feld, maschinenlesbar. Es wird ERZEUGT, nicht von Hand gepflegt: wer etwas aendern will, aendert die DNA und laesst neu ableiten. Der eingefrorene Abzug ist der Grund, warum ein Video von gestern reproduzierbar bleibt, auch wenn man das Vorbild neu vermisst.
| # | Schritt | Stand | Skripte |
|---|---|---|---|
| K0 | Klonbarkeit prüfen – bevor irgendetwas gebaut wird Seit 12.08.2026. Beantwortet die Frage, die bisher erst das dritte Testvideo beantwortete: koennen wir diesen Kanal ueberhaupt bauen? Der Referenz-Kontaktbogen wird gegen das Modulbuch gehalten (was der Renderer laut Code KANN) und jedes tragende Vorbild-Element bekommt einen Traeger – oder einen von drei Toepfen: bauen (Modul fehlt, gilt danach fuer jeden Kanal) · messen (wir wissen nicht, was das Vorbild tut, $0) · fremd (Gesicht, Lizenzmaterial, Marke – das einzige echte Nein). Die Zahl ist KEINE zweite Skala, sondern die Vorhersage des Klon-% aus K10: gleiche Deckel-Tabelle, gleiche Rechnung, geliehen statt kopiert. Sie wird geprueft – `--rueckmessung` haelt sie gegen die echte Messung. Kostet $0 (Storyboard-Frames + herz-agent). Stand: alvaro_horror erreicht rechnerisch 100 von 100 gegen das Vorbild A05zU0zCZlM – die Zahl steht auf 21 von 24 gesehenen Elementen; davon getragen 21, zu bauen 0, zu messen 3, strukturell fremd 0 (gemessen 2026-08-12 11:54 mit channel_clone/klonbarkeit.py) | läuft | klonbarkeit.py, traeger.py2 Skripte
|
| K1 | Kanal messen Median-Views der letzten 10 chronologischen Uploads, Verhältnis zu den Abos, Frische. Ein Bestwert aus einer Suchliste ist eine Hypothese, der Median ist ein Beleg | läuft | niche_probe.py1 Skripte
|
| K2 | Die besten Videos ziehen Top-Videos mit View-Zahlen plus die letzten Uploads als Friedhofstest. Dieselben Videos liefern später die Referenz-Frames zum Messen | läuft | channel_dossier.py, fetch_channel_videos.py2 Skripte
|
| K3 | Zuhören: Transkripte Was gesagt wird, Wort für Wort. Daraus kommen Hooks, Skript-Bogen und Sprechtempo – gemessen in der Sprache des Kanals (recipe.lang); eine auto-übersetzte Spur hat eine andere Wortzahl als das gesprochene Wort | läuft | yt_subs.py, algrow_rest.py, kanal_sprache.py3 Skripte
|
| K4 | Hinsehen: echte Frames Frames über die ganze Laufzeit als Kontaktbogen. Ohne diesen Schritt ist eine DNA optikblind und kann Schnitt-Tempo und Look nur raten | läuft | frame_vision.py1 Skripte
|
| K5 | Formel schreiben Aus Transkripten, Titeln und Frames wird ein festes JSON-Schema: Hooks, Titel-Formeln, Retention, Format, Bildstil, Thumbnail. Jedes Feld mit open_gaps, wo etwas unklar blieb | läuft | extract_dna.py1 Skripte
|
| K6 | Maßstab messen Seit 28.07.: aus denselben Videos gemessene Zielwerte statt Prosa. Materialmix, Kartengröße, Licht | läuft | dna_massstab.py, material_mix.py2 Skripte
|
| K7 | Rezept ableiten Die Uebersetzung: aus der beschreibenden DNA werden AUSFUEHRBARE Werte. Die DNA sagt 'ruhig, warm, erzaehlend' (audio_style) – das Rezept rechnet daraus das Preset 'ruhig' mit voice_id, stability 0.7 und similarity_boost 0.85, und seit 02.08.2026 liest die Strasse diese Werte in P2 aus dem Bauplan statt sie festzuschreiben (3 von 3 messbaren Kanal-mal-Stufe-Paaren fahren die gemeinsame Kette (100 %); in p2 kommen 10 Felder parametrisch aus dem Bauplan bei 0 DRIFT auf der Straße, 1 DRIFT stehen in den alten Kanal-Forks – gemessen 2026-08-28 03:30 UTC mit channel_clone/road_switch.py + road_check.py --stage p2). Halb steht der Schritt nicht wegen der Stimme, sondern weil erst ein Teil der bestimmenden Werte aus der DNA kommt: 80 Prozent der bestimmenden Werte sind DNA-getrieben (4 aus der DNA, 1 gepinnt), gültig über 5 von 55 bestimmenden Feldern – bei den übrigen 50 lässt sich die Herkunft weder als DNA noch als eingefroren lesen, sie stehen in keiner der beiden Zahlen, gemessen 2026-08-28 03:30 UTC mit channel_clone/road_check.py --schuld. Nur was die DNA maschinenlesbar hergibt, wird gerechnet; der Rest steht als datierter Pin mit Begruendung im Rezept und faellt weg, sobald die DNA an der Stelle eine Zahl liefert. Wie weit das ist, misst road_check.py --schuld. | halb | derive_format.py1 Skripte
|
| K8 | Rezept anwenden Schreibt die Rezept-Werte in die laufenden Workflows. Ab hier fragt die Pipeline nichts mehr – sie fuehrt aus, was im Rezept steht. Das Ergebnis ist noch KEIN Kanal-Video, sondern der Stand, gegen den K10 misst | läuft | apply_recipe.py1 Skripte
|
| K9 | In einen Kanal gießen Erzeugt aus DNA + Rezept + Registry einen kompletten Workflow-Satz. Heute noch als Fork je Kanal – deshalb nur teilweise; das Ziel ist EINE parametrische Kette (HZ-363). | halb | fork_channel.py1 Skripte
|
| K10 | Klon-Loop: Testvideo, messen, nachziehen DER Standardschritt (Leon 11.08.2026), seit 11.08. als Automatik: `scripts/klon_takt.py` (Cron 1x/Min) fuehrt den Zyklus Video -> messen -> nachziehen -> Video, bis Klon-% >= 85 oder drei Testvideos verbraucht sind. Video 1 trocken (~$0), Video 2 bezahlt ($0,52 – nur der misst die Optik), Video 3 nur nach Leons Freigabe: davor prueft der Takt, ob der Restabstand ueberhaupt in Reichweite liegt (letzter Zuwachs + Messstreuung) und schickt sonst eine Telegram-Nachricht mit Knopf im HQ. Gemessen wird der MEDIAN voller Messungen, nie eine Einzelziehung – die 85/86 im Ledger sind Kurzmessungen (runden=1), der belastbare Stand von alvaro_horror ist 82. Halb bleibt der Schritt, weil das Nachziehen weiter nur vier Grading-Zahlen anfassen darf: Stimme, Schnitt und Aufbau meldet der Loop als Befund und haelt an, statt sie zu erfinden. | halb HZ-1115 | klon_takt.py, clone_refine_loop.py, clone_score.py3 Skripte
|
| K11 | Auf den vorbereiteten Kanal legen Der letzte Schritt und der einzige, der nach draussen wirkt: das bestandene Rezept wird mit einem in Phase 1 fertig vorbereiteten Kanal verknuepft (Konto, Proxy, Warm-up, Walking-Video, Reichweite belegt). Vorher passiert das nicht – ein Kanal, auf den ein ungeprueftes Rezept laedt, verbrennt seinen einzigen ersten Eindruck | fehlt HZ-1115 | registry.json, build_channel.py, upload_target_check.py3 Skripte
|
Klonbarkeit alvaro_horror: 100 von 100 – getragen 21 · zu bauen 0 · zu messen 3 · fremd 0, Stand 2026-08-12 11:54.
Noch ungeklärt – senkt die Zahl nicht, kostet $0 zu klären:
- Kleines rotes Label/Tag oben links auf einzelnen Textkarten, regelmäßig wiederkehrend (format)
- Kurze B-Roll-Einschnitte aus Wald/Natur und eine Feuer-Nahaufnahme als Auflockerung zwischen den Textblöcken (look)
- Kleine rote Box mit weißem Text, innerhalb der Leseabsätze eingeschoben (text)
Kein fehlender Baustein. Der Abstand zum echten Klon-% ist damit Einstell- und Fehlerarbeit, kein Fabrik-Ausbau – nachzuhalten mit klonbarkeit.py --rueckmessung.
Das Rezept ist die Uebersetzung der DNA in ausfuehrbare Werte – genau ein Wert je Feld, von der Maschine erzeugt, nie von Hand editiert (ADR-007). Es ist zugleich der eingefrorene Abzug: eine Neumessung des Vorbilds aendert das laufende Video erst, wenn neu abgeleitet wird.
Soll: jeder Wert kommt aus der DNA oder traegt einen datierten Pin mit Begruendung, und die Pins werden weniger. Ist: 80 Prozent der bestimmenden Werte sind DNA-getrieben (4 aus der DNA, 1 gepinnt), gültig über 5 von 55 bestimmenden Feldern – bei den übrigen 50 lässt sich die Herkunft weder als DNA noch als eingefroren lesen, sie stehen in keiner der beiden Zahlen, gemessen 2026-08-28 03:30 UTC mit channel_clone/road_check.py --schuld – Betriebsparameter des Thumbnail-Bauens (thumb_retry, thumb_wait, thumb_regie_tokens …) zaehlen seit dem 30.07.2026 NICHT mehr mit, weil keine DNA-Stelle sie hergeben kann und sie die Quote sonst um rund zehn Punkte deckeln; zur Herkunft: 1 von 1 Kanälen mit Rezept führen die Herkunfts-Buchführung (provenance), gemessen 2026-08-28 03:30 UTC – wo sie fehlt, weiss niemand maschinenlesbar, woher die Werte stammen. Selbst nachmessen: python3 channel_clone/road_check.py --schuld
Was der Kloner nicht kann: entscheiden, welcher Kanal das Vorbild sein soll. Messen kann er jede Nische, ranken muss ein Mensch. Und die letzte Stufe schreibt heute in einen geforkten Workflow statt in eine Straße, die zur Laufzeit liest.
Das Zielbild zeigt, wie eine DNA entsteht – hier steht, was in ihr drin ist, abgelegt als dna/<kanal>.json.
Die Liste führt drei verschiedene Dinge:
- Wert – steht in der DNA, die Pipeline liest ihn (Bildquellen, Bildmenge, Übergänge, Font, Länge, Stimme). Ändern heißt: Zahl oder Name ändern.
- Regel – keine Zahl, sondern eine Vorschrift, wie etwas entsteht: welche Formel das Skript baut, wie der Hook gemacht wird. Kommt aus dem Vorbild, nicht aus einer Liste.
- System – Werkzeug der Fabrik selbst, damit DNA und Pipeline zusammenarbeiten.
##
| # | Art | Baustein | Stand | Womit es gebaut wird |
|---|---|---|---|---|
| 1 | Regel | Formel (DNA) | läuft | P1-Nodes „Claude für Skript"/„…Hooks"/„…Title Optimizer" via inject_p1.py --full-p1 (PUT + Reactivate). Seit HZ-528 …ganzer Eintrag
|
| 2 | Wert | Bild-Look | läuft | apply_recipe --with-style: recipe.style → Preset aus style_presets.json als Marker-Block [APPLY_STYLE] im …ganzer Eintrag
|
| 3 | Wert | Quellen-Mix (ai/pexels/pixabay/wikimedia/unsplash/getty/archive/openverse/coverr/reuse) | läuft | P2 Stock-Kette (Pexels→Pixabay→Wikimedia→Unsplash, LIVE) + Router-Prompt + harvest-gw:8013 (ALLOWED_SOURCES: …ganzer Eintrag
|
| 4 | Wert | Motion (zoom/kb/out) | läuft | build_payload.py MOTIONSganzer Eintrag
|
| 4b | Wert | Motion pan/tilt/pulse | läuft | StaticScene-Cases (pan live seit je, tilt/pulse NEU) – payload-gatedganzer Eintrag
|
| 4c | Wert | Motion-Tempo | läuft | scene.motion_speed (build_payload aus Recipe) x zoomSpan in StaticSceneganzer Eintrag
|
| 5 | Wert | Übergänge (hart) | läuft | heutiger Beat-Cutganzer Eintrag
|
| 5b | Wert | Übergänge (11 weitere) + Dauer | läuft | TransitionWrapper +9 Cases + scene.transition_seconds; Recipe-Rotation + Director pro Beatganzer Eintrag
|
| 6 | Wert | Schnitt-Tempo | halb | TARGET_SHOT_SECONDS env (CS-Fork live; Psych-Fork prüfen)ganzer Eintrag
|
| 7 | Wert | Captions karaoke_yellow | läuft | Captions.tsxganzer Eintrag
|
| 7b | Wert | Captions white/static/boxed | läuft | Captions.tsx variant-Prop (scene.caption_variant aus Recipe)ganzer Eintrag
|
| 7c | Wert | Caption-Font (6 Fonts) | läuft | Captions.tsx font-Prop + @font-face (ttf in public/fonts) – Wiring-Proof: Bangers LIVE in MainVideo-Stillganzer Eintrag
|
| 8 | Wert | Karten chapter_v7 | läuft | OnScreenText.tsx + CHAPTER_CARDS=v7 envganzer Eintrag
|
| 8b | Wert | Karten year/name, popup | läuft | gleiche Komponente + POPUP_CARDS env – seit HZ-350 aus dem Rezept: apply_recipe.py --with-cards uebersetzt …ganzer Eintrag
|
| 8c | Wert | Karten quote/stat | halb | gleiche Komponente, nur P1-title_cards-Content („KICKER\ganzer Eintrag
|
| 9 | Wert | Thumbnail tupac | läuft | P4 Thumbnail-Kette (Rollout 14.07., 8 Kanäle)ganzer Eintrag
|
| 9b | Wert | Thumbnail hook_band/clean | läuft | apply_recipe.py activate <x> --with-thumb → prompts.p4.stil.familie (Baustein channel_clone/thumb_stil.py, Vorlagen …ganzer Eintrag
|
| 10 | Wert | Subscribe-Overlay | läuft | SUBSCRIBE_OVERLAY_AT/DUR envganzer Eintrag
|
| 10b | Wert | Maskottchen-Intro | fehlt | neue Remotion-Komponente + Look-Entscheidganzer Eintrag
|
| 11 | Wert | eBook Beschreibung+Pinned | läuft | P1 „Funnel Copy" + P4 (HZ-180)ganzer Eintrag
|
| 11b | Wert | eBook QR-Outro | läuft | OutroCard + Buch aus recipes/<kanal>.json → recipe.book (HZ-267; OUTRO_*-env nur noch Notfall-Override)ganzer Eintrag
|
| 11c | Wert | eBook Mid-Plug | läuft | MidPlugOverlay + payload.book_plugs (LISTE): 2 Einblendungen/Video auf Kapitelgrenzen, nie erste 60 s / letzte 45 s. Buch …ganzer Eintrag
|
| 12 | Wert | Video-Länge | läuft | apply_recipe --with-p1: Wortziel im P1-Skript-Prompt kommt aus wortziel_fuer() → Bauplan plan.wortziel …ganzer Eintrag
|
| 13 | Wert | Sprache | läuft | apply_recipe --with-p1: recipe.lang → Sprach-Direktive [APPLY_LANG] im P1-Promptganzer Eintrag
|
| 14 | Wert | SFX-Set | läuft | Schalter heute baustein_an(sfx) + recipe.sfx (build_payload); WHOOSH_SFX-env nur noch Override. „pops_sparse" = …ganzer Eintrag
|
| 15 | Wert | BGM-Pool-Auswahl | läuft | Schalter heute baustein_an(bgm) + recipe.bgm; pick_bgm() rotiert ohne Vorgabe über ALLE bgm*.mp3, Subset via BGM_POOL-envganzer Eintrag
|
| 16 | Wert | Stimme + Vortrag | läuft | Kette zu (HZ-254, 21.07.): voices.json (4.772 Stimmen + Akzent-Regeln, Stand 03.08.2026) → voice_pick.py wählt automatisch …ganzer Eintrag
|
| 17 | Wert | Kadenz | läuft | HQ-Studio-Tagesplaner, Schreibweg POST /hq/api/schedule/day. HZ-350: `python3 channel_clone/apply_recipe.py cadence …ganzer Eintrag
|
| 18 | Regel | AI-Director (Beat-Advisor) | läuft | LIVE: P2-Node „AI Director (HZ-212)" (Aggregate→Director→Coverage; Upload-map trägt director – Whitelist-Falle behoben) …ganzer Eintrag
|
| 18b | Skript kennt sein Material (Materialart eines Beats → Formulierung + Register der Narration) | läuft | LIVE in der P2-Straße (qUTlurAFjer8cbiD): Node „Skript ans Material anpassen (HZ-542)" hinter Quellen-Mix, davor hing …ganzer Eintrag
| |
| 19 | Wert | Material-Mix Stills/Bewegt (Jonas: 69 % Bewegt, 3 % KI = DER Look-Unterschied; wir 100 % KI-Stills) | halb | HeroScene.tsx rendert Videos LIVE + Wikimedia-Videos in Stock-Kette + fertiger Patch …ganzer Eintrag
|
| 20 | Regel | Hook = bewegter Clip (Jonas: Sekunde 0 bewegt, wir statisch) | läuft | `wf_fork/patch_p2_material_mix.py --hook motion\ganzer Eintrag
|
| 21 | Wert | Schnitt-Dichte-Benchmark (Jonas ~10 Shots/Min · Apex 12-18 · wir 2,4 = 4-10× zu langsam) | halb | CS-Shot-Expansion (TARGET_SHOT_SECONDS + Bild-Reuse) auf Psych aktivierenganzer Eintrag
|
| 22 | System | NEXUS-Parität: Template-Bibliothek=Recipes · Runs-Monitor=HQ-Übersicht · Clips-DRILLDOWN / Clip-AUSTAUSCH · CSV-Nischen-Import | läuft | HQ builder/übersichtganzer Eintrag
|
| 23 | System | Vision-Anker (echte Frames des Zielkanals in der DNA als Stil-Referenz) + image_prompt_dna (EIN deterministischer Stil-Prompt) | läuft | Clone: Anker aus Video-Thumbs (Algrow-Scrape) · p1_block traegt VISUAL-STYLE-PROMPT + THUMBNAIL-DNA → fliesst via inject_p1 …ganzer Eintrag
|
| 24 | System | Self-Optimizer (Leon: „System muss schlau sein") – AVD/CTR je Folge → schlaegt Recipe-/DNA-Aenderungen VOR (nie auto-aendern, Leon-Gate) | fehlt | Nightly-Skript: yt_analytics je Folge + aktives Recipe/DNA → Claude-Diagnose → Ticket-Note/TG-Vorschlagganzer Eintrag
|
| 25 | Reddit-Lesekarte (alvaro/horror_look: Story wird als Reddit-Post-Karte mitgelesen) | läuft | Remotion-Komponente RedditReadingCard, Schalter recipe.horror_look.reading_mode (build_payload)ganzer Eintrag
| |
| 26 | Avatar-Waveform (sprechender Kopf mit Pegelanzeige in Intro/Outro) | läuft | AvatarWaveform, Schalter payload.horror_intro / payload.horror_outroganzer Eintrag
| |
| 27 | Kommentar-Bruch (Reddit-Kommentar als Unterbrechung alle N Beats) | läuft | RedditCommentCard, Schalter recipe.horror_look.comment_everyganzer Eintrag
| |
| 28 | Presenter (Sprecher-Video als Bildebene) | läuft | PresenterScene, Schalter baustein_an(presenter) + PRESENTER_VIDEO_URLganzer Eintrag
| |
| 29 | Grading (Farbstimmung ueber die ganze Folge) | läuft | kein eigener Komponenten-Knoten, Schalter payload.gradingganzer Eintrag
| |
| 30 | Chat-Blasen (Dialog als Messenger-Blasen) | läuft | ChatBubbles, Schalter baustein_an(chat_bubbles)ganzer Eintrag
|
Quelle im Repo: channel_clone/APPLY_MATRIX.md
Vision