Vision Stand 2026-08-28 03:30 UTC

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.

#SchrittStandSkripte
K0Klonbarkeit 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.py
2 Skripte
klonbarkeit.py
K0 · KLONBARKEIT – kann dieser fremde Kanal ueberhaupt geklont werden, und wie weit?
traeger.py
TRAEGER – welcher Baustein traegt dieses Element? Die Zuordnung, die in BEIDE Richtungen geht.
K1Kanal 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.py
1 Skripte
niche_probe.py
HZ-491: Nischen-Sonde – holt harte YouTube-Zahlen zu einer Nischen-Hypothese und schreibt
K2Die 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.py
2 Skripte
channel_dossier.py
HZ-509: Kanal-Dossier – EIN Datensatz je Kanal, zwei Auswertungstiefen.
fetch_channel_videos.py
HZ-216: Read a FOREIGN YouTube channel's public video list via the YouTube Data API,
K3Zuhö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.py
3 Skripte
yt_subs.py
HZ-491 · Untertitel fremder YouTube-Videos holen – lokal, $0.
algrow_rest.py
HZ-239/HZ-846 · Serverseitige Algrow-REST-Bruecke – OHNE Claude-MCP-Session.
kanal_sprache.py
Welche Sprache misst man an einem Kanal? – eine Auflösung für alle Transkript-Wege.
K4Hinsehen: 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.py
1 Skripte
frame_vision.py
HZ-297 · Eigene Video-Vision ($0, Algrow-unabhaengig).
K5Formel 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.py
1 Skripte
extract_dna.py
Channel-Clone · Phase 0 – Kanal-DNA-Extraktor (HZ-205, Vorstufe zu HZ-203).
K6Maßstab messen
Seit 28.07.: aus denselben Videos gemessene Zielwerte statt Prosa. Materialmix, Kartengröße, Licht
läuft dna_massstab.py, material_mix.py
2 Skripte
dna_massstab.py
HZ-519 · Den MASSSTAB in die DNA schreiben – messbare Zielwerte statt Prosa ($0).
material_mix.py
HZ-519 · Materialmix eines Kanals messen – woraus die Bilder BESTEHEN ($0).
K7Rezept 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.py
1 Skripte
derive_format.py
HZ-322 · Render-Format aus AI-Vision automatisch ableiten (kanaluebergreifend, $0).
K8Rezept 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.py
1 Skripte
apply_recipe.py
HZ-230 Apply-Motor v2 – Kanal-Registry + Recipe in EINEM Befehl anwenden.
K9In 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.py
1 Skripte
fork_channel.py
HZ-231 (Motor v2 Block C, der HZ-203-Kern): Kanal-ERSTELLEN aus Recipe+DNA.
K10Klon-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-1115klon_takt.py, clone_refine_loop.py, clone_score.py
3 Skripte
klon_takt.py
–
clone_refine_loop.py
HZ-324 · Autonomer Klon-Verfeinerungs-Loop ($0, headless, per Cron).
clone_score.py
HZ-353 · T3 – Frame-Abgleich gegen die Referenz + ehrlicher Klon-Prozent ($0).
K11Auf 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-1115registry.json, build_channel.py, upload_target_check.py
3 Skripte
registry.json
–
build_channel.py
build_channel.py <CH> [--editor] – oder als Funktion build(CH, editor) importierbar.
upload_target_check.py
HZ-814 Preflight: stimmt das Upload-Ziel jedes Kanals ueberall ueberein?

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.

##

Wert Steht als Wert in der DNA. Die Pipeline liest ihn und richtet sich danach: Bildquellen, Bildmenge, Übergänge, Font, Länge, Stimme.
Regel Kein Wert, sondern eine Vorschrift, WIE etwas entsteht: welche Formel das Skript baut, wie der Hook gemacht wird, wann geschnitten wird. Kommt aus dem Vorbild.
System Weder Wert noch Regel, sondern Werkzeug: was die Fabrik selbst können muss, damit DNA und Pipeline überhaupt zusammenarbeiten.
#ArtBausteinStandWomit es gebaut wird
1RegelFormel (DNA)läuftP1-Nodes „Claude für Skript"/„…Hooks"/„…Title Optimizer" via inject_p1.py --full-p1 (PUT + Reactivate). Seit HZ-528 …
ganzer Eintrag
Ausführungs-Baustein
P1-Nodes „Claude für Skript"/„…Hooks"/„…Title Optimizer" via inject_p1.py --full-p1 (PUT + Reactivate). Seit HZ-528 enthält der Block eine EROEFFNUNGS-Sektion (clone_engine.eroeffnung_block): Wortbudget aus pacing gerechnet, Messzahlen aus channel_clone/retention/<kanal>_*.json (retention_probe.py), ohne Messung keine Zahlen. Zusätzlich liegt das Prompt-Gerüst jetzt im Rezept (prompts.p1 mit {CHANNEL_DNA}/{WORTZIEL}, gemessen von freeze_p1_prompt.py) – Ton aus dem Rezept, Formel aus der DNA, Zahlen aus dem Rezept
Stand
bewiesen (Psych-P1 18.07.; HZ-528: Rückeinsetz-Beweis 45/45 byte-identisch, Idempotenz + --remove restlos). ⚠️ Kein Konsument von prompts.p1 – p1-Straße existiert noch nicht
2WertBild-Lookläuftapply_recipe --with-style: recipe.style → Preset aus style_presets.json als Marker-Block [APPLY_STYLE] im …
ganzer Eintrag
Ausführungs-Baustein
apply_recipe --with-style: recipe.style → Preset aus style_presets.json als Marker-Block [APPLY_STYLE] im P1-Skript-Prompt (idempotent; Epochen-Mapping geschützt, --style-force als Ausnahme; stock_only/auto = skip)
Stand
verdrahtet 25.07. (HZ-344; Wirkbeweis geo: Marker live + Idempotenz)
3WertQuellen-Mix (ai/pexels/pixabay/wikimedia/unsplash/getty/archive/openverse/coverr/reuse)läuftP2 Stock-Kette (Pexels→Pixabay→Wikimedia→Unsplash, LIVE) + Router-Prompt + harvest-gw:8013 (ALLOWED_SOURCES: …
ganzer Eintrag
Ausführungs-Baustein
P2 Stock-Kette (Pexels→Pixabay→Wikimedia→Unsplash, LIVE) + Router-Prompt + harvest-gw:8013 (ALLOWED_SOURCES: pexels/wikimedia/getty/artlist/openverse/archive/coverr, HZ-286 verifiziert)
Stand
HZ-291+302: archive/openverse in P2 verdrahtet UND MODULAR aus Recipe. Quellen-Wahl liegt jetzt in channel_clone/recipes/<slug>.json → recipe.harvest_sources (history [archive,openverse,wikimedia], geo [wikimedia,pexels,openverse,archive]); generisches wf_fork/patch_harvest_sources.py --channel X setzt sie in den Harvest GW-Node (Regex, #7, idempotent, skip wenn keine Stage). WF-Auflösung AUTOMATISCH (resolve_harvest_wf: registry-pX-Kandidaten + Node-Check → neuer Kanal braucht KEINE ID-Pflege, nur Recipe-Feld; STOCK_WF-Dict nur noch Override für Sonderfälle wie history, dessen Stock-WF nicht in registry-p2.id steht). --list zeigt alle Harvest-Kanäle (WF-ID · Node- vs. Recipe-Quellen). Geo live+recipe-getrieben (Schreibpfad bewiesen), History-Node stimmt mit Recipe; Recipe-Änderung an History = --apply als Leon-Handgriff (Live-Classifier). coverr raus (nur Video). Offen separat: fork_channel.py-Vererbung + Stages für weitere Kanäle. youtube_clips , loc zurückgestellt (Cloudflare)
4WertMotion (zoom/kb/out)läuftbuild_payload.py MOTIONS
ganzer Eintrag
Ausführungs-Baustein
build_payload.py MOTIONS
Stand
live (genau diese 3)
4bWertMotion pan/tilt/pulseläuftStaticScene-Cases (pan live seit je, tilt/pulse NEU) – payload-gated
ganzer Eintrag
Ausführungs-Baustein
StaticScene-Cases (pan live seit je, tilt/pulse NEU) – payload-gated
Stand
verdrahtet 18.07.
4cWertMotion-Tempoläuftscene.motion_speed (build_payload aus Recipe) x zoomSpan in StaticScene
ganzer Eintrag
Ausführungs-Baustein
scene.motion_speed (build_payload aus Recipe) x zoomSpan in StaticScene
Stand
verdrahtet 18.07.
5WertÜbergänge (hart)läuftheutiger Beat-Cut
ganzer Eintrag
Ausführungs-Baustein
heutiger Beat-Cut
Stand
live
5bWertÜbergänge (11 weitere) + DauerläuftTransitionWrapper +9 Cases + scene.transition_seconds; Recipe-Rotation + Director pro Beat
ganzer Eintrag
Ausführungs-Baustein
TransitionWrapper +9 Cases + scene.transition_seconds; Recipe-Rotation + Director pro Beat
Stand
verdrahtet 18.07. (Wiring-Proof)
6WertSchnitt-TempohalbTARGET_SHOT_SECONDS env (CS-Fork live; Psych-Fork prüfen)
ganzer Eintrag
Ausführungs-Baustein
TARGET_SHOT_SECONDS env (CS-Fork live; Psych-Fork prüfen)
Stand
7WertCaptions karaoke_yellowläuftCaptions.tsx
ganzer Eintrag
Ausführungs-Baustein
Captions.tsx
Stand
live
7bWertCaptions white/static/boxedläuftCaptions.tsx variant-Prop (scene.caption_variant aus Recipe)
ganzer Eintrag
Ausführungs-Baustein
Captions.tsx variant-Prop (scene.caption_variant aus Recipe)
Stand
verdrahtet 18.07.
7cWertCaption-Font (6 Fonts)läuftCaptions.tsx font-Prop + @font-face (ttf in public/fonts) – Wiring-Proof: Bangers LIVE in MainVideo-Still
ganzer Eintrag
Ausführungs-Baustein
Captions.tsx font-Prop + @font-face (ttf in public/fonts) – Wiring-Proof: Bangers LIVE in MainVideo-Still
Stand
verdrahtet 18.07.
8WertKarten chapter_v7läuftOnScreenText.tsx + CHAPTER_CARDS=v7 env
ganzer Eintrag
Ausführungs-Baustein
OnScreenText.tsx + CHAPTER_CARDS=v7 env
Stand
live
8bWertKarten year/name, popupläuftgleiche Komponente + POPUP_CARDS env – seit HZ-350 aus dem Rezept: apply_recipe.py --with-cards uebersetzt …
ganzer Eintrag
Ausführungs-Baustein
gleiche Komponente + POPUP_CARDS env – seit HZ-350 aus dem Rezept: apply_recipe.py --with-cards uebersetzt recipe.cards (chapter_v7/popup/year_name) auf die Renderer-Schluessel chapter_cards/popup_cards, die kanal_env VOR der Container-env liest. Eine heute laufende Familie abzuschalten braucht --cards-force (History fuehrt cards:["stat"] – blind uebersetzt haette das dem Flaggschiff die Jahreskarten genommen)
Stand
env existiert (bei Psych bewusst off)
8cWertKarten quote/stathalbgleiche Komponente, nur P1-title_cards-Content („KICKER\
ganzer Eintrag
Ausführungs-Baustein
gleiche Komponente, nur P1-title_cards-Content („KICKER\
Stand
TERM") – kein Renderer-Baustein (Builder live:false); --with-cards meldet die beiden ausdruecklich als „nichts geschaltet", statt sie als „aus" zu verbuchen
9WertThumbnail tupacläuftP4 Thumbnail-Kette (Rollout 14.07., 8 Kanäle)
ganzer Eintrag
Ausführungs-Baustein
P4 Thumbnail-Kette (Rollout 14.07., 8 Kanäle)
Stand
live
9bWertThumbnail hook_band/cleanläuftapply_recipe.py activate <x> --with-thumb → prompts.p4.stil.familie (Baustein channel_clone/thumb_stil.py, Vorlagen …
ganzer Eintrag
Ausführungs-Baustein
apply_recipe.py activate <x> --with-thumb → prompts.p4.stil.familie (Baustein channel_clone/thumb_stil.py, Vorlagen thumb_stile.json); clean setzt road.p4_upload_thumbtext mit
Stand
live (HZ-349, 31.07.) – an cs hin und zurück gefahren, Prompt danach wortgleich
10WertSubscribe-OverlayläuftSUBSCRIBE_OVERLAY_AT/DUR env
ganzer Eintrag
Ausführungs-Baustein
SUBSCRIBE_OVERLAY_AT/DUR env
Stand
live
10bWertMaskottchen-Introfehltneue Remotion-Komponente + Look-Entscheid
ganzer Eintrag
Ausführungs-Baustein
neue Remotion-Komponente + Look-Entscheid
Stand
11WerteBook Beschreibung+PinnedläuftP1 „Funnel Copy" + P4 (HZ-180)
ganzer Eintrag
Ausführungs-Baustein
P1 „Funnel Copy" + P4 (HZ-180)
Stand
live
11bWerteBook QR-OutroläuftOutroCard + Buch aus recipes/<kanal>.json → recipe.book (HZ-267; OUTRO_*-env nur noch Notfall-Override)
ganzer Eintrag
Ausführungs-Baustein
OutroCard + Buch aus recipes/<kanal>.json → recipe.book (HZ-267; OUTRO_*-env nur noch Notfall-Override)
Stand
scharf für history + psych (21.07.)
11cWerteBook Mid-PlugläuftMidPlugOverlay + payload.book_plugs (LISTE): 2 Einblendungen/Video auf Kapitelgrenzen, nie erste 60 s / letzte 45 s. Buch …
ganzer Eintrag
Ausführungs-Baustein
MidPlugOverlay + payload.book_plugs (LISTE): 2 Einblendungen/Video auf Kapitelgrenzen, nie erste 60 s / letzte 45 s. Buch kommt pro LAUF aus recipes/<kanal>.json (recipe_key im /render-Body) – nicht aus Container-env, weil ein Container mehrere Kanäle bedient. Optik = Variante G
Stand
scharf für history + psych, Code in cs/history-remotion/psychology (21.07.)
12WertVideo-Längeläuftapply_recipe --with-p1: Wortziel im P1-Skript-Prompt kommt aus wortziel_fuer() → Bauplan plan.wortziel …
ganzer Eintrag
Ausführungs-Baustein
apply_recipe --with-p1: Wortziel im P1-Skript-Prompt kommt aus wortziel_fuer() → Bauplan plan.wortziel (est_length_min × words_per_min aus der DNA, H7). LEN_WORDS ist nur noch Fallback für Rezepte ohne belegtes pacing. Gemessen 31.07.: 2 Kanäle DNA-gerechnet (geo 10,3 min → 1750 · history 18,1 min → 2650 – beide anders als ihr Bucket 1400/950), 7 aus eingefrorenem Fork-Messwert (recipe:pinned), 3 ohne Wortziel (whatif/shorts/ztest_walk: kein pacing UND kein length). Jeder dieser Fälle meldet sich im Log mit eigener Marke [dna]/[pin]/[bucket]/[luecke]/[warn] – kein stiller Rückfall mehr. Seit HZ-636 (31.07.) speist auch keine Quelle den Bucket mehr zurück: recipe_from_live schreibt das gemessene Wortziel unquantisiert (p1.wortziel) und als p1.length den Nicht-Bucket aus_dna (statt es per LEN_WORDS zu runden – daraus entstand die geo-Drift), fork_channel gibt einem neuen Kanal das DNA-Wortziel (bauplan.pacing_groesse, nur Klasse hart) bzw. den gemessenen recipe.wortziel und sonst die sichtbare Lücke p1_laenge.LUECKE statt eines Literals (apply_recipe --with-p1 füllt sie über p1_laenge.luecke_fuellen), der HQ-Builder führt „Aus DNA/Messung – kein Bucket" als Vorauswahl (BLDDEF.length='aus_dna') und quantisiert auch beim „DNA übernehmen" nicht mehr in Buckets. Die vier Rezepte mit Bucket sind migriert (geo · history · auswandern_rente_de · alvaro_horror → length: "aus_dna"); active.json und zzz_test_fork.json führen weiter einen Bucket – dort ist er der letzte Längen-Hinweis und bleibt als Fallback zulässig. Eine Fork-Lücke wird nicht mehr eingefroren (freeze_p1_prompt schreibt nicht) und hält die p1-Stufe an (bauplan 409 wortziel_luecke), damit sie nicht als Prompt ausgeliefert wird
Stand
verdrahtet, Bucket entmachtet UND Rückspeisung zu (HZ-410 → HZ-356 → HZ-636, 31.07.)
13WertSpracheläuftapply_recipe --with-p1: recipe.lang → Sprach-Direktive [APPLY_LANG] im P1-Prompt
ganzer Eintrag
Ausführungs-Baustein
apply_recipe --with-p1: recipe.lang → Sprach-Direktive [APPLY_LANG] im P1-Prompt
Stand
verdrahtet (patch_p1_tuning; Stand korrigiert 25.07., HZ-344)
14WertSFX-SetläuftSchalter heute baustein_an(sfx) + recipe.sfx (build_payload); WHOOSH_SFX-env nur noch Override. „pops_sparse" = …
ganzer Eintrag
Ausführungs-Baustein
Schalter heute baustein_an(sfx) + recipe.sfx (build_payload); WHOOSH_SFX-env nur noch Override. „pops_sparse" = Logik-Patch, weiter offen
Stand
steuerbar – GEMESSEN 06.08.2026 modulbuch.py; Stand stand bis dahin als hier, obwohl der Recipe-Schalter belegt ist (HZ-674)
15WertBGM-Pool-AuswahlläuftSchalter heute baustein_an(bgm) + recipe.bgm; pick_bgm() rotiert ohne Vorgabe über ALLE bgm*.mp3, Subset via BGM_POOL-env
ganzer Eintrag
Ausführungs-Baustein
Schalter heute baustein_an(bgm) + recipe.bgm; pick_bgm() rotiert ohne Vorgabe über ALLE bgm*.mp3, Subset via BGM_POOL-env
Stand
steuerbar – GEMESSEN 06.08.2026 modulbuch.py (HZ-674, vorher )
16WertStimme + VortragläuftKette zu (HZ-254, 21.07.): voices.json (4.772 Stimmen + Akzent-Regeln, Stand 03.08.2026) → voice_pick.py wählt automatisch …
ganzer Eintrag
Ausführungs-Baustein
Kette zu (HZ-254, 21.07.): voices.json (4.772 Stimmen + Akzent-Regeln, Stand 03.08.2026) → voice_pick.py wählt automatisch aus DNA → Recipe-Feld voice → apply_recipe --with-voice patcht den P2-TTS-Node (Fallback auf den Pool, nicht mehr nur registry.voices). Seit 02.08. gehört der VORTRAG dazu: recipe.voice_settings (Preset + stability/similarity_boost, gesetzt von assign_voice_settings.py) löst der Bauplan als voice_stability/voice_similarity_boost auf – Pflichtfelder der p2-Stufe; apply_recipe --with-voice setzt sie im Fork mit, die Straße liest alle vier Felder (voice_id/voice_name/beide Regler) als Expression aus dem Bauplan (build_p2_road.umbau_stimme, live über wf_fork/patch_p2_road_stimme.py) und bricht ohne sie im Bauplan-Guard ab, also vor der Geldstelle. Drift misst road_check.py --stage p2, im HQ steht der 🎚-Chip je Kanal. Wo die Stimme wirklich herkommt (03.08.): zeigt der Umschalt-Beweis road.p2_trigger auf die Straße (road_ids.stufen_ziel, NICHT road.enabled – das ist der gemessene Aktiv-Stand), entscheidet der Bauplan, der Fork-Patch ist nur Rückfallebene – der geprüfte Ort steht nach jedem Apply in registry.channels.<x>.recipe.voice_ort, die Ist-Aufnahme nennt ihn in voice.quelle
Stand
verdrahtet 21.07., Vortrag + Straßen-Weg 02.08., Ortsnachweis 03.08.
17WertKadenzläuftHQ-Studio-Tagesplaner, Schreibweg POST /hq/api/schedule/day. HZ-350: `python3 channel_clone/apply_recipe.py cadence …
ganzer Eintrag
Ausführungs-Baustein
HQ-Studio-Tagesplaner, Schreibweg POST /hq/api/schedule/day. HZ-350: python3 channel_clone/apply_recipe.py cadence <recipe> [--cadence-days N] [--cadence-start JJJJ-MM-TT] --cadence-write rechnet recipe.cadence (daily/every2/3perweek/weekly) auf Termine und traegt sie ein (liest den Ist-Plan aus archive/video_schedule.json, fremde Kanaele am Tag bleiben stehen, zweiter Lauf traegt nichts doppelt ein). Bewusst eigenes Kommando und NICHT in --all: ein geplanter Tag startet die Pipeline automatisch und kostet echtes Geld – ohne --cadence-write nur Vorschau
Stand
verdrahtet 30.07. (Schreib-/Rueckbau-Beweis auf Zukunftstagen, Plan-Datei danach byte-gleich)
18RegelAI-Director (Beat-Advisor)läuftLIVE: P2-Node „AI Director (HZ-212)" (Aggregate→Director→Coverage; Upload-map trägt director – Whitelist-Falle behoben) …
ganzer Eintrag
Ausführungs-Baustein
LIVE: P2-Node „AI Director (HZ-212)" (Aggregate→Director→Coverage; Upload-map trägt director – Whitelist-Falle behoben) – 1 Claude-Call/Video via claude-proxy ($0), wählt pro Beat transition/motion/sfx NUR aus der Recipe-Palette, fail-safe (Fehler ⇒ Beats unverändert); apply_recipe.py --with-director setzt die Palette aus dem Recipe – aber nur im Fork-P2: faehrt der Kanal die geteilte P2-Strasse, wird dort nicht geschrieben, sondern gegen plan.director_palette nachgewiesen – den Schluessel fuehrt der Bauplan seit HZ-745 (08.08.2026, dashboard/bauplan.py:director_palette), der Strassen-Node liest ihn (wf_fork/patch_p2_road_director.py), und der Lauf meldet fuer Strassen-Kanaele wieder Erfolg (gemessen: alvaro_horror hard, crossfade vs. doomed hard im SELBEN Workflow); build_payload nutzt die Annotationen NUR bei aktivem Recipe
Stand
(Wirkbeweis = nächster echter Lauf)
18bSkript kennt sein Material (Materialart eines Beats → Formulierung + Register der Narration)läuftLIVE in der P2-Straße (qUTlurAFjer8cbiD): Node „Skript ans Material anpassen (HZ-542)" hinter Quellen-Mix, davor hing …
ganzer Eintrag
Ausführungs-Baustein
LIVE in der P2-Straße (qUTlurAFjer8cbiD): Node „Skript ans Material anpassen (HZ-542)" hinter Quellen-Mix, davor hing der Ton-Zweig direkt am Skript-Abruf – deshalb war die Kopplung bis 30.07. physisch unmöglich, nicht nur ungebaut. 1 Claude-Call/Video via claude-proxy ($0), fail-safe (Fehler ⇒ Skript unverändert an die TTS), Wortzahl-Probe je Kapitel (±15 %, sonst Original). Träger: recipe.material_sprache je Materialart (stock_foto/ki_bild/stock_video/karte) mit regel + register; ableiten/prüfen: channel_clone/material_sprache.py (kennt seit HZ-625 <anbieter>_video → stock_video; die Materialart haengt jetzt an media NACH dem Mix, nicht mehr am Router-Urteil – sonst bekaeme ein heruntergestufter Beat Bewegtbild-Sprache zu einem Foto). EIN Sprecher, wechselndes Register – keine zweite Stimme je Beat (Entscheid HZ-542, Begründung dort)
Stand
verdrahtet + gegen Testdaten gefahren (wf_fork/einmal/probe_p2_material.py), Wirkbeweis = nächster echter Lauf
19WertMaterial-Mix Stills/Bewegt (Jonas: 69 % Bewegt, 3 % KI = DER Look-Unterschied; wir 100 % KI-Stills)halbHeroScene.tsx rendert Videos LIVE + Wikimedia-Videos in Stock-Kette + fertiger Patch …
ganzer Eintrag
Ausführungs-Baustein
HeroScene.tsx rendert Videos LIVE + Wikimedia-Videos in Stock-Kette + fertiger Patch wf_fork/apply_pexels_gateway_videos.py + Harvester --video
Stand
Mix-Seite verdrahtet 31.07. (HZ-625), Rest offen. In der P2-Strasse ist Bewegtbild jetzt eine QUELLE im quellen_mix – Konvention <anbieter>_video, verdrahtet ist pexels_video (Node Pexels Video Search, $0). Der Mix teilt die Video-Quote deterministisch je Kapitel zu und gibt die Slots bevorzugt den Beats, die der Router ohnehin als Bewegtbild sieht; wer trotzdem heruntergestuft wird, traegt video_verworfen:true + Log-Warnung statt still zum Foto zu werden. Ein Video-Beat ohne Clip faellt aus (Weiche Clip gefunden?), statt sich ein JPEG aus der Bild-Kaskade zu holen, das danach als .mp4 und type:'video' gelaufen waere; der HZ-437-Guard ist dafuer strikt (Video-Beat: video/, sonst image/). coverr/artlist und ein Null-Mix brechen mit Klartext ab. Bewiesen an der LEBENDEN Strasse ($0): wf_fork/einmal/probe_p2_mix.py [--knappe-quote\
20RegelHook = bewegter Clip (Jonas: Sekunde 0 bewegt, wir statisch)läuft`wf_fork/patch_p2_material_mix.py --hook motion\
ganzer Eintrag
Ausführungs-Baustein
`wf_fork/patch_p2_material_mix.py --hook motion\
Stand
static (Router-Prompt + deterministischer Override im Node Split Stock Queries), gespeist aus recipe.hook_style ueber apply_recipe.py --with-material-mix. HZ-350: vorher erzwang der Baustein IMMER Video in Beat 1 – hook_style war ein Bauplan-Wert ohne Traeger. Jetzt: motion = Beat 1 immer Video · static = Beat 1 immer Standbild (ueberstimmt auch ein „video" des Routers). motion_ratio: stills + hook_style: motion_hook ist ein gueltiger Fall (nur der Hook bewegt). Unbekannter Wert = P2 wird NICHT angefasst. HZ-625: motion wirkt erst wirklich, wenn der quellen_mix eine Video-Quelle nennt – sonst wird der Hook-Beat im Mix heruntergestuft (video_verworfen`, Log-Warnung). Ist eine Quote da, bekommt der Hook sie zuerst (der Tausch laeuft in Beat-Reihenfolge)
21WertSchnitt-Dichte-Benchmark (Jonas ~10 Shots/Min · Apex 12-18 · wir 2,4 = 4-10× zu langsam)halbCS-Shot-Expansion (TARGET_SHOT_SECONDS + Bild-Reuse) auf Psych aktivieren
ganzer Eintrag
Ausführungs-Baustein
CS-Shot-Expansion (TARGET_SHOT_SECONDS + Bild-Reuse) auf Psych aktivieren
Stand
CS-Baustein live, Psych-Port fehlt
22SystemNEXUS-Parität: Template-Bibliothek=Recipes · Runs-Monitor=HQ-Übersicht · Clips-DRILLDOWN / Clip-AUSTAUSCH · CSV-Nischen-ImportläuftHQ builder/übersicht
ganzer Eintrag
Ausführungs-Baustein
HQ builder/übersicht
Stand
teils
23SystemVision-Anker (echte Frames des Zielkanals in der DNA als Stil-Referenz) + image_prompt_dna (EIN deterministischer Stil-Prompt)läuftClone: Anker aus Video-Thumbs (Algrow-Scrape) · p1_block traegt VISUAL-STYLE-PROMPT + THUMBNAIL-DNA → fliesst via inject_p1 …
ganzer Eintrag
Ausführungs-Baustein
Clone: Anker aus Video-Thumbs (Algrow-Scrape) · p1_block traegt VISUAL-STYLE-PROMPT + THUMBNAIL-DNA → fliesst via inject_p1 nach P1 (bereits re-injiziert 18.07.) · Ausbau: Anker als img2img-Referenz
Stand
Datenpfad live (Apex re-injiziert)
24SystemSelf-Optimizer (Leon: „System muss schlau sein") – AVD/CTR je Folge → schlaegt Recipe-/DNA-Aenderungen VOR (nie auto-aendern, Leon-Gate)fehltNightly-Skript: yt_analytics je Folge + aktives Recipe/DNA → Claude-Diagnose → Ticket-Note/TG-Vorschlag
ganzer Eintrag
Ausführungs-Baustein
Nightly-Skript: yt_analytics je Folge + aktives Recipe/DNA → Claude-Diagnose → Ticket-Note/TG-Vorschlag
Stand
designed, Bau auf Zuruf
25Reddit-Lesekarte (alvaro/horror_look: Story wird als Reddit-Post-Karte mitgelesen)läuftRemotion-Komponente RedditReadingCard, Schalter recipe.horror_look.reading_mode (build_payload)
ganzer Eintrag
Ausführungs-Baustein
Remotion-Komponente RedditReadingCard, Schalter recipe.horror_look.reading_mode (build_payload)
Stand
steuerbar – GEMESSEN 06.08.2026 python3 channel_clone/modulbuch.py (Komponente vorhanden UND Schalter belegt); Wirkbeweis = Trockenlauf alvaro_horror
26Avatar-Waveform (sprechender Kopf mit Pegelanzeige in Intro/Outro)läuftAvatarWaveform, Schalter payload.horror_intro / payload.horror_outro
ganzer Eintrag
Ausführungs-Baustein
AvatarWaveform, Schalter payload.horror_intro / payload.horror_outro
Stand
steuerbar – GEMESSEN 06.08.2026 modulbuch.py; Wirkbeweis = Trockenlauf alvaro_horror
27Kommentar-Bruch (Reddit-Kommentar als Unterbrechung alle N Beats)läuftRedditCommentCard, Schalter recipe.horror_look.comment_every
ganzer Eintrag
Ausführungs-Baustein
RedditCommentCard, Schalter recipe.horror_look.comment_every
Stand
steuerbar – GEMESSEN 06.08.2026 modulbuch.py (HZ-381); Wirkbeweis = Trockenlauf alvaro_horror
28Presenter (Sprecher-Video als Bildebene)läuftPresenterScene, Schalter baustein_an(presenter) + PRESENTER_VIDEO_URL
ganzer Eintrag
Ausführungs-Baustein
PresenterScene, Schalter baustein_an(presenter) + PRESENTER_VIDEO_URL
Stand
steuerbar – GEMESSEN 06.08.2026 modulbuch.py; kein Kanal fuehrt heute ein Presenter-Video
29Grading (Farbstimmung ueber die ganze Folge)läuftkein eigener Komponenten-Knoten, Schalter payload.grading
ganzer Eintrag
Ausführungs-Baustein
kein eigener Komponenten-Knoten, Schalter payload.grading
Stand
steuerbar – GEMESSEN 06.08.2026 modulbuch.py
30Chat-Blasen (Dialog als Messenger-Blasen)läuftChatBubbles, Schalter baustein_an(chat_bubbles)
ganzer Eintrag
Ausführungs-Baustein
ChatBubbles, Schalter baustein_an(chat_bubbles)
Stand
steuerbar – GEMESSEN 06.08.2026 modulbuch.py

Quelle im Repo: channel_clone/APPLY_MATRIX.md