{"queue_id": 33, "relative_path": "Solutions/SMA_VISUAL_ENGINE_ANALYSIS.md", "title": "SMA_VISUAL_ENGINE_ANALYSIS", "import_key": "f3c1a5ba637ec18a2e65c82045e0dbf7803727c0592d40735d12f179f6d43153", "chunk_count": 35, "created_nodes": 0, "created_relationships": 0, "body": null, "chunks": [{"chunk_key": "61ea836c228202f157c49c06d4c823ea6e99886a18389e58b1265db744621495", "chunk_index": 0, "heading": "SMA_VISUAL_ENGINE_ANALYSIS", "text": "# SMA_VISUAL_ENGINE_ANALYSIS\nArchitektur- und Datenanalyse — Automatische Grafik-Pipeline für Social-Media-Signale\nDatum: 2026-05-28 | Status: Analyse (kein Code)\n\n---", "text_hash": "26c46fb4d0849d1fb179bbe9214e532a20af7c31ac86160a22af046839a43e3d"}, {"chunk_key": "8c761984363491bb1e98132ea5b0d1c29eea36962aa1143a03aae329e6d3b92d", "chunk_index": 1, "heading": "EXECUTIVE SUMMARY", "text": "NE_ANALYSIS\nArchitektur- und Datenanalyse — Automatische Grafik-Pipeline für Social-Media-Signale\nDatum: 2026-05-28 | Status: Analyse (kein Code)\n\n---\n## EXECUTIVE SUMMARY\n\nDas Signal-System liefert bereits alle notwendigen Textdaten für automatische Grafiken.\nDer kritische Engpass ist nicht Architektur, sondern **Bildverfügbarkeit: 85% der Signale\nhaben kein Foto**. Eine Visual Engine muss deshalb primär ohne Fotos funktionieren.\n\n**Empfehlung:** HTML/CSS-Template-Render (Playwright → PNG) als MVP.\nKeine externe API, keine KI-Bildgenerierung, kein Canva. Vollständige Kontrolle,\nreproduzierbar, kostenlos, ausfallsicher.\n\n---", "text_hash": "6f1c801aac4ee60a117e510ffa40b65e32f6aa62910200b33a422321629875b0"}, {"chunk_key": "37bf3750a58b43c0fda3a5ec47bcda398299fc023e37cbb679e679bc7da3286a", "chunk_index": 2, "heading": "1. SIGNALTYPEN — VISUAL-BEDARF JE KATEGORIE", "text": "wright → PNG) als MVP.\nKeine externe API, keine KI-Bildgenerierung, kein Canva. Vollständige Kontrolle,\nreproduzierbar, kostenlos, ausfallsicher.\n\n---\n## 1. SIGNALTYPEN — VISUAL-BEDARF JE KATEGORIE\n\nTatsächliche DB-Kategorien (362 Signale):\n\n| Kategorie | Signale | Primäre Visual-Art | Auto-Grad |\n|-----------|---------|-------------------|-----------|\n| wetter_klima | 132 | **Warnbanner** (Wetter-Icon + Ort + Datum) | vollautomatisch |\n| ferienimmobilie | 89 | **News-Karte** (Headline + Ort-Badge + CTA) | vollautomatisch |\n| feuchte | 56 | **Symbolgrafik** (Feuchte-Icon + Messwert + Hook) | vollautomatisch |\n| mallorca_news | 48 | **News-Karte** (Headline + Kategorie-Badge) | vollautomatisch |\n| schimmel_risiko | 37 | **Warnbanner** (Risiko-Indikator + Handlungsaufforderung) | template-basiert |\n\n**Geplante zukünftige Kategorien** (noch nicht in DB):\n\n| Kategorie | Primäre Visual-Art | Bemerkung |\n|-----------|-------------------|-----------|\n| luftqualitaet | Statistik-Grafik (CO2/Feuchte-Wert) | Erst wenn Kategorie existiert |\n| KI HomeProtect | Produkt-Feature-Karte | Eigene Template-Familie nötig |\n| occupado | Fallkarte (Objekt + Problem + CTA) | braucht Fallfotos |\n| service | Angebot-Karte (Leistung + Preis-CTA) | braucht Branding-Assets |\n| warnung | Hochkontrast-Warnbanner (Rot) | vollautomatisch, aber ethisch prüfen |\n\n---", "text_hash": "cbb8b5866e7c9a26d569faee04350609baa016d73fe28b5c18cca81d8d86e04b"}, {"chunk_key": "12cd40cbe6e5ee8c014d2e97b8042c06849e82210caa23a61a27cfcb294c3bf2", "chunk_index": 3, "heading": "Visual-Art je Kategorie — Detail", "text": "gebot-Karte (Leistung + Preis-CTA) | braucht Branding-Assets |\n| warnung | Hochkontrast-Warnbanner (Rot) | vollautomatisch, aber ethisch prüfen |\n\n---\n### Visual-Art je Kategorie — Detail\n\n**feuchte:**\n- ✅ Symbolgrafik: Wassertropfen-Icon, Luftfeuchtigkeitsmesser, prozentualer Wert\n- ✅ Textgrafik: Headline (briefing_winkel) + 1-Zeiler (briefing_nutzen) + CTA\n- ❌ Foto: nur 14% verfügbar → nicht als Standard verwendbar\n- Kein Vorher/Nachher (kein Case-Material)\n\n**schimmel_risiko:**\n- ✅ Warnbanner: Kategorie-Farbe Rot/Orange + Risiko-Indikator\n- ✅ Textgrafik mit Handlungsaufforderung\n- ⚠️ Fallfoto möglich wenn vorhanden — aber ethisch sensibel\n- Kein Auto-Posting ohne Sichtprüfung (briefing_risiko-Feld nutzen)\n\n**wetter_klima:**\n- ✅ Warnbanner: AEMET/DWD-Niveau-Farbe (gelb/orange/rot) + Icon + Ort\n- ✅ Vollautomatisch: urgency_level + emotional_direction als Steuerparameter\n- ⚠️ briefing_freigabe = zurueckstellen → kein Visual erzeugen\n\n**ferienimmobilie:**\n- ✅ News-Karte: Headline + Quelle + Mallorca-Badge\n- ✅ 53 Signale haben image_url → beste Bild-Abdeckung dieser Kategorie\n- ✅ Foto-Template wenn vorhanden, Text-Template als Fallback\n\n**mallorca_news:**\n- ✅ News-Karte (universell)\n- ✅ Quelle + Datum + Hook sichtbar\n- Fotos partiell verfügbar (Prensa Ibérica CDN)\n\n---", "text_hash": "e6cca86f472efb2fe9d18661a5fbc028982f71e4680d4a6d0c7632102e33900f"}, {"chunk_key": "e5448d7675b277911bad24bef15034f5d5aa53298ba0534e85336485a22e3426", "chunk_index": 4, "heading": "2. VERFÜGBARE DATENPUNKTE JE SIGNAL", "text": "e als Fallback\n\n**mallorca_news:**\n- ✅ News-Karte (universell)\n- ✅ Quelle + Datum + Hook sichtbar\n- Fotos partiell verfügbar (Prensa Ibérica CDN)\n\n---\n## 2. VERFÜGBARE DATENPUNKTE JE SIGNAL", "text_hash": "919bc61e8d4f9ab405834efa96dad9011afa604d613b919eae591d98dab4afb0"}, {"chunk_key": "f3648eb00c6d32e0f903c87c0823ecd3e2fbce466caa061fcebb6e34a64239e2", "chunk_index": 5, "heading": "Vollständig befüllt (339/362 Signale):", "text": "## 2. VERFÜGBARE DATENPUNKTE JE SIGNAL\n### Vollständig befüllt (339/362 Signale):\n\n| Feld | Inhalt | Visual-Nutzung |\n|------|--------|---------------|\n| `topic` | Titel des Signals (DE/ES/EN) | Headline in Grafik |\n| `topic_de` | Deutsche Übersetzung | Grafik-Headline (DE-Audience) |\n| `briefing_winkel` | Redaktioneller Blickwinkel | Grafik-Subheadline |\n| `briefing_nutzen` | Kernnutzen für Zielgruppe | Caption-Text |\n| `briefing_zielgruppe` | Zielgruppe | Targeting, nicht sichtbar in Grafik |\n| `briefing_material` | Empfehlung: Fallfoto / Messwert / Icon | Visual-Typ-Auswahl |\n| `briefing_risiko` | Risiko-Flag (Todesfall etc.) | **Hard-Block-Signal** |\n| `briefing_freigabe` | geeignet / pruefen / zurueckstellen / verwerfen | **Gate-Signal** |\n| `signal_category` | Kategorie | Template-Auswahl |\n| `emotional_direction` | ueberraschung / sorge / vertrauen etc. | Farbton / Bildsprache |\n| `urgency_level` | 1-10 | Warn-Intensität |\n| `mallorca_relevance` | 0 / 25 / 50 | Geo-Badge |\n| `suggested_platforms` | facebook,instagram,whatsapp_status | Format-Auswahl |\n| `briefing_fb_fit` | ja / pruefen / nein | Freigabe-Gate Facebook |\n| `briefing_li_fit` | ja / pruefen / nein | Freigabe-Gate LinkedIn |", "text_hash": "bd93de6bc019cc645f2cb0f42c5483417934a6f9aeda7a823aeec32aa1f34334"}, {"chunk_key": "3624c261da824ee2d4ec8646aa7a595cf4a62864eb45e03b1083fda7890bd554", "chunk_index": 6, "heading": "Partiell vorhanden:", "text": "at-Auswahl |\n| `briefing_fb_fit` | ja / pruefen / nein | Freigabe-Gate Facebook |\n| `briefing_li_fit` | ja / pruefen / nein | Freigabe-Gate LinkedIn |\n### Partiell vorhanden:\n\n| Feld | Verfügbarkeit | Nutzung |\n|------|--------------|---------|\n| `image_url` | 53/362 (14.6%) | Foto-Template wenn vorhanden |\n| `cached_image_path` | entspricht image_url | Lokaler Cache (kein Hotlinking) |\n| `source_name` | ~100% | Quellenangabe in Grafik |\n| `extracted_hook` | ~90% | Alternativer Headline-Text |", "text_hash": "17b46e18bb2eab241c08449f4e20d9af63f703b3fd186d87c5a42c69dcf9d9a4"}, {"chunk_key": "94a47aec244e8a7b3f837e62b021f26daa3dd54f9554bb6258c298f8789dc655", "chunk_index": 7, "heading": "Nicht vorhanden / nicht nutzbar:", "text": "e_url | Lokaler Cache (kein Hotlinking) |\n| `source_name` | ~100% | Quellenangabe in Grafik |\n| `extracted_hook` | ~90% | Alternativer Headline-Text |\n### Nicht vorhanden / nicht nutzbar:\n\n- Koordinaten/Ort-Geodaten (nur mallorca_relevance als Integer)\n- Echte Case-Assets (Fotos aus eigenen Fällen)\n- Videomaterial\n- Kundenfotos\n\n---", "text_hash": "473717407ce60cc717e76a8fcb9a176d15a4354a3dd9dad05e556f93dac2d947"}, {"chunk_key": "06a4a471977b72bb97c23e3d7af766374f14983963f3269da993a7616fcce0a3", "chunk_index": 8, "heading": "3. GRAFIKFORMATE", "text": "ar:\n\n- Koordinaten/Ort-Geodaten (nur mallorca_relevance als Integer)\n- Echte Case-Assets (Fotos aus eigenen Fällen)\n- Videomaterial\n- Kundenfotos\n\n---\n## 3. GRAFIKFORMATE\n\n| Format | Verhältnis | Pixel | Plattform | Priorität |\n|--------|-----------|-------|-----------|-----------|\n| Facebook Feed | 1:1 | 1080×1080 | Facebook, Instagram | **MVP** |\n| Facebook Feed breit | 4:5 | 1080×1350 | Facebook, Instagram | **MVP** |\n| LinkedIn Post | 1.91:1 | 1200×627 | LinkedIn | Phase 2 |\n| Story/Reel Cover | 9:16 | 1080×1920 | Instagram, Facebook | Phase 3 |\n| WhatsApp Status | 9:16 | 1080×1920 | WhatsApp | Phase 3 |\n\n**MVP-Fokus:** 1:1 und 4:5 abdecken Facebook + Instagram mit einem Render-Durchgang.\n9:16 erst wenn 1:1/4:5 stabil laufen.\n\n---", "text_hash": "71f8ba4b31e9b635518f720b96c2a29afdaa613cda231373421d3afc13d00194"}, {"chunk_key": "053ef330f8a19380d817aabb1481fa85654dbd7810994e057c205851a68b7668", "chunk_index": 9, "heading": "4. AUTOMATISIERUNGSGRAD JE KATEGORIE", "text": " WhatsApp | Phase 3 |\n\n**MVP-Fokus:** 1:1 und 4:5 abdecken Facebook + Instagram mit einem Render-Durchgang.\n9:16 erst wenn 1:1/4:5 stabil laufen.\n\n---\n## 4. AUTOMATISIERUNGSGRAD JE KATEGORIE", "text_hash": "0cbd4bf5f3ec677066fa4acf56b708ac513da133374f356d4761a78268900a97"}, {"chunk_key": "71cfb3fa8ad3810ac2dc41af14f2b37ddb6a124f18bbb6505511d620b4c6a94f", "chunk_index": 10, "heading": "Vollautomatisch (kein menschliches Eingreifen nötig):", "text": "## 4. AUTOMATISIERUNGSGRAD JE KATEGORIE\n### Vollautomatisch (kein menschliches Eingreifen nötig):\n\n| Kategorie | Bedingung | Template |\n|-----------|-----------|---------|\n| wetter_klima | briefing_freigabe = geeignet | Warnbanner |\n| feuchte | briefing_freigabe = geeignet, kein Risiko-Flag | Symbolgrafik |\n| mallorca_news | briefing_freigabe = geeignet, kein Risiko-Flag | News-Karte |\n\n**Regel:** Grafik wird erzeugt, aber **nicht automatisch gepostet**. Nur Vorschau + Freigabe.\n\n---", "text_hash": "4b27e334375c113d09e825e1cd91a05835f76530e83c2d61c91b0527a29fdec7"}, {"chunk_key": "006ac4313e831f5f47edf875c02842f41aa269857017d63d9585604435b835a3", "chunk_index": 11, "heading": "Template-basiert (Grafik-Erzeugung automatisch, Freigabe manuell):", "text": "eigabe = geeignet, kein Risiko-Flag | News-Karte |\n\n**Regel:** Grafik wird erzeugt, aber **nicht automatisch gepostet**. Nur Vorschau + Freigabe.\n\n---\n### Template-basiert (Grafik-Erzeugung automatisch, Freigabe manuell):\n\n| Kategorie | Bedingung | Warum manuell? |\n|-----------|-----------|---------------|\n| ferienimmobilie | immer | Immobilien-Content: Preise, Rechtsthemen |\n| schimmel_risiko | immer | Risiko-Framing, Haftung |\n| alle mit briefing_freigabe=pruefen | immer | Operator-Entscheid nötig |\n\n---", "text_hash": "07a129fe30249e750fc76c858812bcda15eb6d087f21123b909ea0280a299c08"}, {"chunk_key": "3d5d486833fec2f3c9c23386698b23b2786ab1df2bbbfc99fa61f9b128c001d6", "chunk_index": 12, "heading": "Braucht manuelle Bilder:", "text": "e, Rechtsthemen |\n| schimmel_risiko | immer | Risiko-Framing, Haftung |\n| alle mit briefing_freigabe=pruefen | immer | Operator-Entscheid nötig |\n\n---\n### Braucht manuelle Bilder:\n\n| Kategorie | Bedarf |\n|-----------|--------|\n| occupado (geplant) | Objektfoto (eigener Fall) |\n| service (geplant) | Branding-Foto, Team, Aktion |\n| KI HomeProtect (geplant) | Produkt-Screenshot oder Illustration |\n| Vorher/Nachher | eigenes Case-Bildmaterial |\n\n---", "text_hash": "daaf83ee413b07b37c185cebf96cda9b571b428f8709d1d81137c7671c9e0a47"}, {"chunk_key": "a704c172148958993bee33e6d22f4366d14447a575741ecbf57c3de1deebba63", "chunk_index": 13, "heading": "Ungeeignet für Auto-Grafik:", "text": " Branding-Foto, Team, Aktion |\n| KI HomeProtect (geplant) | Produkt-Screenshot oder Illustration |\n| Vorher/Nachher | eigenes Case-Bildmaterial |\n\n---\n### Ungeeignet für Auto-Grafik:\n\n| Kategorie/Fall | Grund |\n|---------------|-------|\n| briefing_freigabe = verwerfen | Inhalt nicht postbar |\n| briefing_risiko enthält \"Todesfall\" | Ethisch sensitiv |\n| briefing_risiko enthält \"Verletzt\" | Ethisch sensitiv |\n| mallorca_relevance = 0 | Kein Mallorca-Bezug |\n| Señale ohne briefing_winkel | Datenbasis zu dünn |\n\n---", "text_hash": "3d24d6a36684771b72e03f80889b44860c724fe284a847cb3b32f232a7e04f67"}, {"chunk_key": "26468e7256fe9d60b7279c242dc222cfbafcc00e2b56e308898cd9151023abfe", "chunk_index": 14, "heading": "5. ENGINE-BEWERTUNG", "text": "iko enthält \"Verletzt\" | Ethisch sensitiv |\n| mallorca_relevance = 0 | Kein Mallorca-Bezug |\n| Señale ohne briefing_winkel | Datenbasis zu dünn |\n\n---\n## 5. ENGINE-BEWERTUNG", "text_hash": "11a4db3cc1c42c8be185eeef5f0c2111d52c329ce9f61c904c15684a804d53d1"}, {"chunk_key": "fc8a1487863b5835b291806e7e000cc7ca7682d067997f56b7e13f9438f4ef33", "chunk_index": 15, "heading": "Option A: HTML/CSS → Playwright → PNG ✅ EMPFOHLEN", "text": "## 5. ENGINE-BEWERTUNG\n### Option A: HTML/CSS → Playwright → PNG ✅ EMPFOHLEN\n\n**Funktionsweise:**\n1. Python füllt Jinja2-HTML-Template mit Signal-Daten\n2. Playwright rendert HTML headless → PNG\n3. PNG gespeichert in `/opt/struktur/social-media-radar/visuals/`\n\n**Bewertung:**\n\n| Kriterium | Bewertung |\n|-----------|-----------|\n| Kosten | Null (open source) |\n| Kontrolle | Vollständig — Pixel-genaues Layout |\n| Abhängigkeiten | Playwright (npm), Jinja2 (pip) |\n| Offline-Fähigkeit | Ja |\n| Template-Aufwand | Mittel (einmalig, dann wartbar) |\n| CI/CD-Fähigkeit | Ja (kein Browser nötig nach Headless-Setup) |\n| Reproduzierbarkeit | 100% |\n| Font-Rendering | Gut (System-Fonts oder eingebettete Fonts) |\n| VPS-Kompatibilität | Ja (Playwright lief bereits für andere Tasks) |\n\n**Einschränkungen:**\n- Kein Foto-Compositing ohne Canvas/Pillow (lösbar)\n- Responsive-Verhalten muss explizit pro Format definiert werden\n\n---", "text_hash": "f21ea3e46d840dc21455ce956c620390dcfba76bdc183821bba4d2a80f5b5a17"}, {"chunk_key": "f54da27c6b200a64d565e6d9ff93c33e987cb954c295a3f8fcc9a89428f22a01", "chunk_index": 16, "heading": "Option B: Canva API ❌ Nicht empfohlen", "text": "sks) |\n\n**Einschränkungen:**\n- Kein Foto-Compositing ohne Canvas/Pillow (lösbar)\n- Responsive-Verhalten muss explizit pro Format definiert werden\n\n---\n### Option B: Canva API ❌ Nicht empfohlen\n\n| Kriterium | Bewertung |\n|-----------|-----------|\n| Kosten | Canva-Enterprise-API: kostenpflichtig, hoher Einstiegspreis |\n| Abhängigkeit | Externer Dienst, API-Limits, Änderungsrisiko |\n| Kontrolle | Eingeschränkt (Canva-Designgrenzen) |\n| Vorteil | Fertige Templates mit Canva-Ästhetik |\n| Fazit | Sinnvoll wenn Team bereits Canva nutzt, sonst Overhead |\n\n---", "text_hash": "9a8a4f8769747966df4fa40bc3db62c01863bcc6a4051bebd45c6d73233eabdb"}, {"chunk_key": "e177aab9e970238cb003fd88995d5689133a0a47fd88bc22cbacd0f5ade45940", "chunk_index": 17, "heading": "Option C: DALL·E / Stable Diffusion ❌ Nicht empfohlen für MVP", "text": "nkt (Canva-Designgrenzen) |\n| Vorteil | Fertige Templates mit Canva-Ästhetik |\n| Fazit | Sinnvoll wenn Team bereits Canva nutzt, sonst Overhead |\n\n---\n### Option C: DALL·E / Stable Diffusion ❌ Nicht empfohlen für MVP\n\n| Kriterium | Bewertung |\n|-----------|-----------|\n| Einsatzgebiet | Foto-Illustration, nicht Infografiken |\n| Kostenstruktur | Per-Request (OpenAI: ~0.04$/Bild) |\n| Reproduzierbarkeit | Nicht gegeben (stochastisch) |\n| Markenkonsistenz | Nicht kontrollierbar |\n| Latenz | 5-30 Sekunden pro Bild |\n| Fazit | Sinnvoll nur für Hintergrundbilder als Zusatzoption, nie als Primär-Engine |\n\n---", "text_hash": "88379296a41db93901a66f1613c1a0e94ffa588f3d6eb539641fc39b36767014"}, {"chunk_key": "c6c4d727538d20c97764c10b4949d82d81797556f872b7127857858bdf3331e8", "chunk_index": 18, "heading": "Option D: Lokales Template-System mit Pillow (Python) ⚠️ Alternative", "text": "Nicht kontrollierbar |\n| Latenz | 5-30 Sekunden pro Bild |\n| Fazit | Sinnvoll nur für Hintergrundbilder als Zusatzoption, nie als Primär-Engine |\n\n---\n### Option D: Lokales Template-System mit Pillow (Python) ⚠️ Alternative\n\n**Funktionsweise:** Python-Pillow zeichnet direkt: Rechtecke, Text, Icons auf Bitmap.\n\n| Kriterium | Bewertung |\n|-----------|-----------|\n| Kosten | Null |\n| Kontrolle | Vollständig, aber umständlich bei komplexem Layout |\n| Font-Rendering | Eingeschränkt (kein CSS-equivalent) |\n| Aufwand | Hoch (jedes Layout muss pixel-genau hardcoded werden) |\n| Fazit | Fallback für Minimal-Templates, nicht als Primär-Engine |\n\n---", "text_hash": "5200565aeb4acf8e934f36136a5d42d796c1947c921154458615bc09015597f5"}, {"chunk_key": "4bc32162b57cec1a6570964d43c8ea66a91d9346066fa7ca637990213c819a5e", "chunk_index": 19, "heading": "Option E: Hybride Lösung ✅ Empfohlen für Phase 2", "text": "valent) |\n| Aufwand | Hoch (jedes Layout muss pixel-genau hardcoded werden) |\n| Fazit | Fallback für Minimal-Templates, nicht als Primär-Engine |\n\n---\n### Option E: Hybride Lösung ✅ Empfohlen für Phase 2\n\nHTML/CSS (Primär) + Pillow (Foto-Overlay) + DALL·E (optionaler Hintergrund):\n- Layouts: HTML/CSS\n- Fotos einblenden: Pillow-Compositing\n- Fehlende Fotos: vordefinierte Icon-Sets statt KI\n\n---", "text_hash": "c2ecd01e646881bce7ffbd9297144d8b925efe35f6205c1026d458bce1f1cc13"}, {"chunk_key": "75d2a199ab2f768f6d75d189ea612be45034c36b3817a7616cbf752b77044f4a", "chunk_index": 20, "heading": "6. RISIKEN", "text": " + DALL·E (optionaler Hintergrund):\n- Layouts: HTML/CSS\n- Fotos einblenden: Pillow-Compositing\n- Fehlende Fotos: vordefinierte Icon-Sets statt KI\n\n---\n## 6. RISIKEN", "text_hash": "1274d6eeb9c3dbbd7431b03514d0cf3b13f3e60ec5501539b777aedfb786b838"}, {"chunk_key": "2e730c47e5e8ab5453a3cb40d83d8c0d4c88abbbffa97f53268a31e59787cf26", "chunk_index": 21, "heading": "Ethische Risiken", "text": "## 6. RISIKEN\n### Ethische Risiken\n\n| Risiko | Signal-Indikator | Maßnahme |\n|--------|-----------------|---------|\n| Todesfall-Grafik | `briefing_risiko` enthält \"Todesfall\" | **Hard-Block**: keine Grafik erzeugen |\n| Katastrophen-Sensationalism | urgency_level >= 9 AND emotional_direction = \"angst\" | Visual-Erzeugung sperren |\n| Fake-News-Risiko | confidence_score < 0.4 | Wasserzeichen \"Bitte prüfen\" oder Block |\n| Schimmel als Clickbait | signal_category = schimmel_risiko + virality_level >= 4 | Freigate-Pflicht |", "text_hash": "17aa7e17afe0f3f9db02dca31e3bb051273983a838f22c0dbaf1b2dc0852bac4"}, {"chunk_key": "51495c7474acbaba1912f9eefd74f6185cf18ce94a05df592e0eaa9c8326d682", "chunk_index": 22, "heading": "Copyright-Risiken", "text": ".4 | Wasserzeichen \"Bitte prüfen\" oder Block |\n| Schimmel als Clickbait | signal_category = schimmel_risiko + virality_level >= 4 | Freigate-Pflicht |\n### Copyright-Risiken\n\n| Risiko | Maßnahme |\n|--------|---------|\n| Externe image_url direkt einbetten | Nur cached_image_path verwenden (lokal gecacht) |\n| Fremde Fotos ohne Lizenz | Nur wenn image_source = eigene Quelle oder CC-lizenziert |\n| Headlines 1:1 übernehmen | Immer briefing_winkel verwenden (eigene Formulierung) |\n| Prensaiberica-CDN-Bilder | Keine direkte Nutzung für Werbezwecke — nur redaktionell |", "text_hash": "c1abcffbc65a44cea3acd795fd21d6d470b0977ee5842b4068c6b3604b1a5874"}, {"chunk_key": "d73f091e846ad69dc23566b7ede653888e0e884336876919ff7b0c85b7388011", "chunk_index": 23, "heading": "Technische Risiken", "text": "hmen | Immer briefing_winkel verwenden (eigene Formulierung) |\n| Prensaiberica-CDN-Bilder | Keine direkte Nutzung für Werbezwecke — nur redaktionell |\n### Technische Risiken\n\n| Risiko | Maßnahme |\n|--------|---------|\n| Playwright-Crash auf VPS | Render-Queue mit Retry-Logik |\n| Fehlende Schriften | Fonts explizit einbetten (Google Fonts lokal) |\n| Image-URLs veraltet | Immer cached_image_path bevorzugen |\n| Doppelte Visuals | Hash (signal_id + format) als Dateiname → kein Re-Render |", "text_hash": "867da0b4e9308f46e2398ef5b25cdd9bc8f2a9d770c9aee756f03466ee254528"}, {"chunk_key": "63822def8d6a9fc922d1605392ad67a2fce2656d1e3f854e860a7c8b68e077ba", "chunk_index": 24, "heading": "Inhaltliche Risiken", "text": " lokal) |\n| Image-URLs veraltet | Immer cached_image_path bevorzugen |\n| Doppelte Visuals | Hash (signal_id + format) als Dateiname → kein Re-Render |\n### Inhaltliche Risiken\n\n| Risiko | Maßnahme |\n|--------|---------|\n| Veraltete Signale (expires_at überschritten) | Kein Visual für abgelaufene Signale |\n| Signale ohne Mallorca-Bezug (mal_rel=0) | Hard-Block in Visual-Gate |\n| Wetter-Alarmismus | urgency_level <= 7 für Auto-Visual, darüber manuell |\n\n---", "text_hash": "a92f67204ebfa80865e49602250d30bf6fb11de7dd3f7d102e9f2d7807188e92"}, {"chunk_key": "41872f122305319466427ae4f6966704e272c257f7b084ebe6207e34ae5047c7", "chunk_index": 25, "heading": "7. PRIORISIERUNG", "text": "Signale ohne Mallorca-Bezug (mal_rel=0) | Hard-Block in Visual-Gate |\n| Wetter-Alarmismus | urgency_level <= 7 für Auto-Visual, darüber manuell |\n\n---\n## 7. PRIORISIERUNG", "text_hash": "5ea7bfb4c994c8028d99dd919fa660b7cdcfe37cd6aa2b3eb891274d89a4054e"}, {"chunk_key": "13227be7151755503bd80477571b927e016f4b1dc45bb2d3e5c0657bb83dd65b", "chunk_index": 26, "heading": "Phase 1 — MVP (empfohlen als Einstieg)", "text": "## 7. PRIORISIERUNG\n### Phase 1 — MVP (empfohlen als Einstieg)\n\n**Ziel:** Erste automatische Grafiken für die 3 häufigsten Kategorien.\n\n| Priorität | Schritt | Aufwand |\n|-----------|---------|---------|\n| 1 | Visual-Gate: Funktion `can_generate_visual(signal)` schreiben | 2h |\n| 2 | HTML-Template für 1:1 / 4:5 (feuchte + wetter_klima) | 4h |\n| 3 | Playwright-Render-Funktion + PNG-Output | 3h |\n| 4 | Text-Rendering: topic_de + briefing_winkel + CTA | 2h |\n| 5 | Cockpit-Integration: \"Grafik generieren\"-Button + Vorschau | 3h |\n| **Gesamt** | | **~14h** |\n\n**Ergebnis MVP:** Für jedes feuchte/wetter_klima-Signal mit freigabe=geeignet kann per\nKnopfdruck ein 1:1 + 4:5 PNG erzeugt und lokal gespeichert werden. Kein Auto-Posting.\n\n---", "text_hash": "4bd1b32990c83c726f04bd469e7b7b96497215c77ba2344f6c5c77e16f0f0bfd"}, {"chunk_key": "c5aa62a43e39a31c749267e98a39526e91ac27feb5dbb8e7e576b3500a88cffc", "chunk_index": 27, "heading": "Phase 2 — Template-Erweiterung", "text": " feuchte/wetter_klima-Signal mit freigabe=geeignet kann per\nKnopfdruck ein 1:1 + 4:5 PNG erzeugt und lokal gespeichert werden. Kein Auto-Posting.\n\n---\n### Phase 2 — Template-Erweiterung\n\n- ferienimmobilie: Foto-Template (mit Bild) + Text-Fallback (ohne Bild)\n- schimmel_risiko: Warnbanner-Template\n- LinkedIn-Format (1.91:1)\n- Foto-Compositing via Pillow\n\n---", "text_hash": "de0652107942a9070d4bc65a7566d06c7048849ea644d67f22cd76653fac6c88"}, {"chunk_key": "82aba0643e52812e1e35758206e810d364f10df1684d9d827d28ea626fc799b9", "chunk_index": 28, "heading": "Phase 3 — Automation", "text": "o-Template (mit Bild) + Text-Fallback (ohne Bild)\n- schimmel_risiko: Warnbanner-Template\n- LinkedIn-Format (1.91:1)\n- Foto-Compositing via Pillow\n\n---\n### Phase 3 — Automation\n\n- Auto-Generate bei briefing_run() für freigegebene Signale\n- 9:16 Story-Format\n- WhatsApp-Export\n- Grafik-Queue + Status in DB (visual_generated, visual_path, visual_status)\n\n---", "text_hash": "f387500ee32e968c8219a02dd7afaac8fb7a40690e6e754441f1ea4991ad304f"}, {"chunk_key": "1c2bb2b8d22ff58084d69f7cbd79c8dec291e8a2b5f6560323c23b39bfc91473", "chunk_index": 29, "heading": "8. EMPFOHLENER MVP", "text": "run() für freigegebene Signale\n- 9:16 Story-Format\n- WhatsApp-Export\n- Grafik-Queue + Status in DB (visual_generated, visual_path, visual_status)\n\n---\n## 8. EMPFOHLENER MVP", "text_hash": "c884f5b44474361058ec9c420117d5d2a42e4ed254504818c65c351ccfc5fd15"}, {"chunk_key": "bfc0adb90b194467d30c46aaadcabf5ffcf03d085392d2ba7481a36ff5dafaaa", "chunk_index": 30, "heading": "Architektur", "text": "## 8. EMPFOHLENER MVP\n### Architektur\n\n```\nsignal (DB) → visual_gate.py → jinja2_template → playwright_render → PNG\n                    ↓ Hard-Block wenn:\n                    - briefing_freigabe = verwerfen/zurueckstellen\n                    - mallorca_relevance = 0\n                    - \"Todesfall\" in briefing_risiko\n                    - expires_at überschritten\n```", "text_hash": "cee0cf10f12d9c0f55f7ecc64d2d8e869cf69a07b6ef183f622dcc54b642bbc5"}, {"chunk_key": "64b9d3012eac8ed6bd63337991f2c1be73b9336c3b574f79d7cd792461852b98", "chunk_index": 31, "heading": "Template-Daten für MVP", "text": "n\n                    - mallorca_relevance = 0\n                    - \"Todesfall\" in briefing_risiko\n                    - expires_at überschritten\n```\n### Template-Daten für MVP\n\nAus einem Signal werden folgende Felder genutzt:\n\n```\nHEADLINE:   topic_de     (deutsche Übersetzung des Titels)\nSUBLINE:    briefing_winkel  (redaktioneller Blickwinkel)\nBADGE:      signal_category  (Kategorie-Icon + Farbe)\nCTA:        briefing_nutzen  (1-Satz-Nutzen)\nFOOTER:     \"MAS · Mallorca Air Solutions\"\nDATUM:      created_at[:10]\nFARBE:      emotional_direction → Farbprofil\n```", "text_hash": "f64b8fbc57090b5c513d6a75a076cf2a6e753d7bf9e07ddebdbcdcefda554ea0"}, {"chunk_key": "c04e3628331fd7ccfce619cd310d3d70f032c140bab8555330dba2b4cf952e38", "chunk_index": 32, "heading": "Farbprofil je Kategorie", "text": "iefing_nutzen  (1-Satz-Nutzen)\nFOOTER:     \"MAS · Mallorca Air Solutions\"\nDATUM:      created_at[:10]\nFARBE:      emotional_direction → Farbprofil\n```\n### Farbprofil je Kategorie\n\n| Kategorie | Primärfarbe | Sekundär | Stil |\n|-----------|------------|---------|------|\n| feuchte | #2E86AB (Blau) | #A8DADC | Seriös, vertrauend |\n| wetter_klima | #E63946 / #FFBE0B | #1D3557 | Warnung, auffällig |\n| schimmel_risiko | #E63946 | #F1FAEE | Risiko, klar |\n| ferienimmobilie | #2A9D8F | #E9C46A | Wertigkeit, Warm |\n| mallorca_news | #457B9D | #F1FAEE | Neutral, seriös |", "text_hash": "9daebe0e02537b395cfb6e1d14e65713146b3ee82d625e60e6604a4f191252ba"}, {"chunk_key": "71f5817a450e2d7deaa0216488fddc35c22be4e9f715bad0d92d656937277a06", "chunk_index": 33, "heading": "Neue DB-Felder (Phase 1)", "text": " #E63946 | #F1FAEE | Risiko, klar |\n| ferienimmobilie | #2A9D8F | #E9C46A | Wertigkeit, Warm |\n| mallorca_news | #457B9D | #F1FAEE | Neutral, seriös |\n### Neue DB-Felder (Phase 1)\n\n```sql\nALTER TABLE signals ADD COLUMN visual_generated INTEGER DEFAULT 0;\nALTER TABLE signals ADD COLUMN visual_path_1x1 TEXT;\nALTER TABLE signals ADD COLUMN visual_path_4x5 TEXT;\nALTER TABLE signals ADD COLUMN visual_generated_at TEXT;\n```\n\n---", "text_hash": "c06ed94d1c0ad916b93271db659e1d8bf88eadb17d9fba937a64698e7923d49a"}, {"chunk_key": "730668fad1e19c6a2b347bacc744c6ebb527a79bfa40ae9528e2bd33070a6fcd", "chunk_index": 34, "heading": "FAZIT", "text": "DD COLUMN visual_path_1x1 TEXT;\nALTER TABLE signals ADD COLUMN visual_path_4x5 TEXT;\nALTER TABLE signals ADD COLUMN visual_generated_at TEXT;\n```\n\n---\n## FAZIT\n\nDas Signal-System ist visuell vorbereitet: briefing_winkel, briefing_nutzen, topic_de,\nemotional_direction, briefing_freigabe und briefing_risiko liefern alle nötigen Texte\nund Gate-Signale.\n\nDie HTML/CSS → Playwright → PNG Pipeline ist der richtige Ansatz:\nkostenlos, kontrollierbar, VPS-kompatibel, ohne externe Abhängigkeit.\n\nDas fehlende Bildmaterial (85% ohne Foto) ist kein Blocker — Text-Grafiken mit\nIcon-Sets sind für Facebook/Instagram mindestens gleichwertig zu schlechten Stock-Fotos.\n\nMVP-Aufwand: ~14 Stunden. Einstieg: `visual_gate.py` + 2 HTML-Templates.\n\n---\n\n*Erstellt: 2026-05-28 | Autor: AG (Claude Sonnet 4.6)*\n*Basis: 362 Signale analysiert, 71 DB-Felder ausgewertet*\n*Status: Analyse abgeschlossen — bereit für Implementierungs-Freigabe*", "text_hash": "7b037a919fc25cb637c8968da22b6873d637e892c628345b02b53355020f3c15"}], "elapsed_s": 0.059}
