Was in den letzten 2 Tagen gebaut wurde, damit aus einem gewinnenden Creative automatisch die nächste Generation entsteht — Winner erkennen → labeln → züchten → zurück in den Pool. Plus: wo überall Tags entstehen, was in welchem Schritt ingested wird, und wie du alles E2E testest.
Der Kern: ein Creative wird gebaut, läuft auf Meta, die Performance wird gemessen und in DNA-Tags übersetzt. Aus den Tags errechnet sich, welcher Angle/welche Mechanik gewinnt. Der gewinnende Creative wird gelabelt und gezüchtet — die nächste Generation erbt die DNA und variiert ein Element. So lernt das System aus deinen eigenen Ergebnissen.
Creative Engine baut Bilder/Videos. DNA-Tags werden schon hier gesetzt.
on-demand1-Klick auf Meta, pausiert. Du aktivierst.
on-demandPerformance + meta_ad_id zurück ins System.
stündlich · 0 * * * *Importierte Ads ohne Tags → Vision schlägt Labels vor.
19:00 · 0 19 * * *Tags × Performance → creative_dna + Winner je Achse.
20:30 · 30 20 * * *Ranking gegen deine KPI-Benchmark. Du siehst die Gewinner.
live · Build 1Vision schlägt Angle vor, du korrigierst. Tag = „customer".
live · Build 1Erbt DNA, variiert Headline → 3 Drafts in den Pool.
live · Build 2Drafts launchen → Schritt 03 misst sie → Kreis geschlossen.
on-demandOrange = automatischer Backend-Schritt (Cron oder async-Job) · „NEU" = in diesen 2 Tagen gebaut/freigeschaltet
Vor 2 Tagen war der Loop read-only: das System erkannte Winner und sagte dem Menschen „mach mehr davon" — aber jeder neue Zyklus musste manuell angestoßen werden, und importierte Ads hatten gar keine Tags. Jetzt: Cold-Start-Tags (04) geben jedem Ad eine DNA, die Benchmark (06) macht Winner sichtbar, Labeln (07) gibt ihnen den richtigen Angle, und Züchten (08) erzeugt die nächste Generation per Klick — mit geerbter DNA. Der Mensch bleibt im Steuer (Phase 1), aber die Mechanik des Kreises steht.
| Stage | Was passiert | Was wird geschrieben / ingested | Trigger |
|---|---|---|---|
| 01 Erzeugen | Creative Engine generiert Varianten (generateCreativeVariants). | ad_pool_items (Bild/Video + DNA-Tags) · Asset in R2. | on-demand |
| 02 Launch | Push als PAUSED Meta-Ad (handleLaunchpadPush). Mensch aktiviert. | Meta-Ad-Objekt · pool.meta_status, launched_at. | on-demand |
| 03 Import | Holt Spend/Revenue/Klicks je Ad/Tag von Meta (handleMetaImport). | ad_performance_daily (spend, meta_revenue/nc_revenue, roas, clicks, nc_orders …) · setzt pool.meta_ad_id. | stündlich |
| 04 Cold-Start | Für importierte Ads ohne Labels: Vision liest das Creative + schlägt DNA-Tags vor. | Tag-Spalten auf ad_pool_items (wo vorher NULL). | 19:00 täglich |
| 05 Rollup | Joint Tags × Performance (14-Tage-Fenster) → Snapshots + Winner je Achse (MIN 4 Ads / 50 €, James-Stein-Shrinkage). | creative_dna (hook_rate, hold_rate, link_ctr, roas, cpa) · Performance-Learnings in den Agent-Kontext. | 20:30 täglich |
| 06 Benchmark | Rankt deine Ads gegen die KPI-Benchmark der Marke (ROAS/CPA/CPC, 2×CPA-Spend-Riegel). Join: pool.meta_ad_id = ad_performance_daily.ad_id. | brand_benchmarks (deine KPI-Ziele, persistent) · Winner-Liste live berechnet. | live (Tab) |
| 07 Labeln | Vision schlägt Angle (gegen deine echten Angles gematcht) + Hook/Headline/Template/Format vor; du korrigierst. | Tag-Spalten + payload.angle_source='customer' (Cron überschreibt das nie mehr). | live (Drawer) |
| 08 Züchten | Breed-Job erbt die exakten Tags des Winners, lässt die Headline frei → 3 Bild-Varianten. | async generation_jobs (type agent-tool-job) → 3 neue ad_pool_items (status draft, geerbte Tags, source='breed_variant'). | live (Button) |
| 09 Relaunch | Drafts als PAUSED launchen → Stage 03 misst sie → Stage 05 faltet sie zurück. | (zurück zu 02/03) | on-demand |
Klick „Züchten" → POST /winners/breed legt eine pending-Row in generation_jobs an (mit dem vollen Replay-Payload). Der */2-Min-Cron claimt sie atomar (pending→processing), ruft sich per SELF.fetch intern selbst auf (kein 150s-Wall-Limit), generiert die Varianten, verrechnet genau einmal Credits, legt die Drafts an, setzt completed. Du siehst den Fortschritt in der Jobs-Leiste. Exakt dasselbe Muster wie b-roll/Creative-Engine — heute end-to-end in Prod bewiesen.
Die Hälfte des Loops, die Winner sichtbar + labelbar macht (Stages 06 + 07).
brand_benchmarks + 30-Tage-Vorschlag-Button.type-CHECK) + ein output:null-Insert blockierten jeden async-Job (Breed, Creative-Engine-Batch, Agent-Tools). Beide gefixt → der SELF.fetch-Dispatch ist jetzt end-to-end bewiesen.Die zweite Hälfte: aus einem gelabelten Winner die nächste Generation (Stage 08).
Alles über den bewährten async-Pfad, 0 Edits an FROZEN-Files (creative.js/db.js/routes.js nur importiert). Phase 2 (nightly Auto-Breed hinter Marken-Flag) ist bewusst noch nicht gebaut — der Mensch steuert die Frequenz.
① Dev-Account (der Benchmark-Tab ist dev-only). ② Marke Iron Brothers Collagen mit verbundenem Meta-Konto (Ads sind schon importiert). ③ Credits auf der Marke: 3 Varianten ≈ 33 Credits — falls leer, vorher aufladen, sonst schlägt Stage 08 mit „insufficient credits" fehl.
Benchmark-Tab öffnen → Marke wählen → „Vorschlag aus 30 Tagen" klicken (oder Werte manuell). Speichern (Auto-Save nach ~1 s).
brand_benchmarks für brand_id 761465fe mit deinen Werten.Auf einem Winner (z.B. einem Whey-Ad) „Labeln" → der Drawer öffnet, Vision schlägt einen Angle vor. Angle wählen/korrigieren (+ optional Hook/Headline/Template/Format) → Speichern.
ad_pool_items des Winners hat angle_id gesetzt + payload.angle_source='customer'; die anderen DNA-Spalten unverändert (kein Nullen mehr).Auf derselben Card „Züchten" klicken.
generation_jobs-Row, type agent-tool-job, input.tool='breed_variant', output:{}, Status pending.Nichts tun — der */2-Min-Cron übernimmt. Innerhalb von ~2 Min: pending → processing, dann rendern die Bilder, dann completed.
pending→processing→completed; output.result.bred = Anzahl Drafts; genau 1 credit_transactions-Eintrag (charge-once).In den Pool / Creative Engine schauen — 3 neue Drafts vom gezüchteten Winner.
ad_pool_items mit source='breed_variant', source_ref=Winner-ID, status draft, exakt geerbte Tag-Strings (angle_id/template_category/… identisch zum Parent), je eine eigene Headline.Einen Draft als PAUSED auf Meta launchen → aktivieren. Ab da misst der stündliche Import (Stage 03) die Variante, der nächtliche Rollup (Stage 05) faltet sie zurück in die DNA-Statistik — und beim nächsten Mal taucht sie selbst als Winner-Kandidat auf.
meta_ad_id + Performance. Der Kreis ist geschlossen.Wenn du den „Züchten"-Klick machst (Schritt 3), gib mir kurz Bescheid oder nenn den Winner — dann tracke ich den ganzen Lauf live in der DB und bestätige dir jede Stufe (Job-Status, geerbte Tags, Credit-Charge). Genau wie beim b-roll-Smoke-Test heute früh.