Explorer
/tmp/fast-one-58.json
← Zurück ↓ Download
{"queue_id": 58, "relative_path": "Solutions/SMA_VISUAL_ENGINE_MVP_REPORT.md", "title": "SMA_VISUAL_ENGINE_MVP_REPORT", "import_key": "502828447448f8532ee671858726c2d9f05a9f9a19f3543f965487ffca8c2d11", "chunk_count": 15, "created_nodes": 16, "created_relationships": 29, "body": null, "chunks": [{"chunk_key": "59938ba7deefab4037e7feffcc0d44de60c4b3727bfc96e1eb2209352354472a", "chunk_index": 0, "heading": "SMA_VISUAL_ENGINE_MVP_REPORT", "text": "# SMA_VISUAL_ENGINE_MVP_REPORT\nVisual Engine MVP — Abschlussdokumentation\nDatum: 2026-05-28 | Status: PRODUKTIV\n\n---", "text_hash": "ed99febaffbac693dc880c9de54803c7abafb0dacd01d21eb611291a68fcc1fe"}, {"chunk_key": "88df86ca2e1751be13f4d2ae957b0edfc002b0c9b90593cf752f4702649e9dd2", "chunk_index": 1, "heading": "STATUS: MVP LIVE", "text": "# SMA_VISUAL_ENGINE_MVP_REPORT\nVisual Engine MVP — Abschlussdokumentation\nDatum: 2026-05-28 | Status: PRODUKTIV\n\n---\n## STATUS: MVP LIVE\n\nDie SMA Visual Engine ist produktiv. Signale können im Cockpit per Knopfdruck\nals 1:1- und 4:5-PNG-Grafiken gerendert werden.\nKein Auto-Posting. Kein externes API. Vollständig On-VPS.\n\n---", "text_hash": "4cca68f2c0adbb6df42e3a8172b6106cc87f68b5085b310720bd13e18c230a45"}, {"chunk_key": "6702d7ff7d34763508462e125b7917b7bd65c693513148100fd1f68b3ffe21c4", "chunk_index": 2, "heading": "Neue Dateien", "text": "ignale können im Cockpit per Knopfdruck\nals 1:1- und 4:5-PNG-Grafiken gerendert werden.\nKein Auto-Posting. Kein externes API. Vollständig On-VPS.\n\n---\n## Neue Dateien\n\n| Datei | Pfad | Beschreibung |\n|-------|------|-------------|\n| `visual_gate.py` | `/opt/struktur/social-media-radar/` | Gate — prüft Render-Erlaubnis |\n| `visual_render.py` | `/opt/struktur/social-media-agent/` | Playwright-Render-Pipeline |\n| `visual_square.html` | `.../templates/` | 1:1 Template (1080×1080) |\n| `visual_45.html` | `.../templates/` | 4:5 Template (1080×1350) |\n| `generated_visuals/` | `/opt/struktur/social-media-agent/` | PNG-Output-Verzeichnis |", "text_hash": "804275f81926de44c069048ce85098accdd3e6fda4d020bb50246271978be07b"}, {"chunk_key": "d9c4e7cb9aa63479407f7fc011407660cb23c7a76f286b1e178dcb06329ff25e", "chunk_index": 3, "heading": "Geänderte Dateien", "text": "isual_45.html` | `.../templates/` | 4:5 Template (1080×1350) |\n| `generated_visuals/` | `/opt/struktur/social-media-agent/` | PNG-Output-Verzeichnis |\n## Geänderte Dateien\n\n| Datei | Änderung |\n|-------|---------|\n| `templates/cockpit.html` | Visual-Button + Modal + JS eingefügt |\n| `app.py` | `/api/visual/<id>` + `/visuals/<file>` Routen |", "text_hash": "3236ef2dc81c26c2092e1ecc79b20c5619d9864addba5d1aa7371314c7a4ddce"}, {"chunk_key": "4ad7a10b585ad28f3d4f06dc28bce6a148f979ba893fabf58e8a894f9b69fbc1", "chunk_index": 4, "heading": "Backups", "text": "|\n|-------|---------|\n| `templates/cockpit.html` | Visual-Button + Modal + JS eingefügt |\n| `app.py` | `/api/visual/<id>` + `/visuals/<file>` Routen |\n## Backups\n\n| Original | Backup |\n|----------|--------|\n| `cockpit.html` | `cockpit.html.bak.visual_btn` |\n| `app.py` | `app.py.bak.visual_api` |\n| `base.html` | `base.html.bak.sma_rename` |\n\n---", "text_hash": "7ab418c5848bc93adeb03e2cda88802f1444f8b94600ed119b2e4af603249c0e"}, {"chunk_key": "248e228a88090bcfd03e80862202dd34fd4451e638e67598fe02b75c64ce9b1c", "chunk_index": 5, "heading": "Architektur", "text": "|--------|\n| `cockpit.html` | `cockpit.html.bak.visual_btn` |\n| `app.py` | `app.py.bak.visual_api` |\n| `base.html` | `base.html.bak.sma_rename` |\n\n---\n## Architektur\n\n```\nCockpit (Browser)\n  → 🎨 Visual Vorschau Klick\n    → GET /api/visual/<signal_id>?fmt=1x1|4x5  (Flask app.py)\n      → visual_render.py → render_by_id()\n        → signals.db → Signal laden\n          → visual_gate.py → can_generate_visual()\n            BLOCK: briefing_freigabe=verwerfen | Todesfall | mal_rel=0 | abgelaufen\n            PASS:  visual_type bestimmen\n          → build_context() → Jinja2-Template füllen\n          → Playwright headless → PNG\n          → /generated_visuals/<sid>_<fmt>.png\n      → JSON: {success, path, reason}\n    → Cockpit Modal: PNG anzeigen + Download-Link\n```\n\n---", "text_hash": "199198d0134b106429d5cec9ca75eb0f49cc70337c903c52572aa0c123f6e9c7"}, {"chunk_key": "168d11558eda56073f97af49000caf1c2da04f2d9c4d2df534823e1059a2cea6", "chunk_index": 6, "heading": "Kategorie-Mapping", "text": " → PNG\n          → /generated_visuals/<sid>_<fmt>.png\n      → JSON: {success, path, reason}\n    → Cockpit Modal: PNG anzeigen + Download-Link\n```\n\n---\n## Kategorie-Mapping\n\n| Kategorie | Visual-Typ | Icon | Farbe |\n|-----------|-----------|------|-------|\n| feuchte | symbolgrafik | 💧 | #2E86AB (Blau) |\n| wetter_klima | warnbanner | ⛈️ | #E63946 (Rot/Alarm) |\n| schimmel_risiko | warnbanner | ⚠️ | #E63946 auf #2d0a0a |\n| ferienimmobilie | news_karte | 🏡 | #2A9D8F (Teal) |\n| mallorca_news | news_karte | 📰 | #457B9D (Slate) |\n\n---", "text_hash": "61e201b2a3272292cfd5c1df2d6d4b939a03fb9b4d054f38551ab6159b04e599"}, {"chunk_key": "e0a712acf66a15117f43a7d403139edca29a563ecfdb2ec87962bf66b141716e", "chunk_index": 7, "heading": "Gate-Regeln (visual_gate.py)", "text": "arnbanner | ⚠️ | #E63946 auf #2d0a0a |\n| ferienimmobilie | news_karte | 🏡 | #2A9D8F (Teal) |\n| mallorca_news | news_karte | 📰 | #457B9D (Slate) |\n\n---\n## Gate-Regeln (visual_gate.py)\n\n| Bedingung | Ergebnis |\n|-----------|---------|\n| briefing_freigabe = verwerfen | BLOCK |\n| \"Todesfall\"/\"Verletzt\" in briefing_risiko | BLOCK |\n| Ethisch problematische Keywords | BLOCK |\n| mallorca_relevance = 0 | BLOCK |\n| Signal abgelaufen (expires_at < now) | BLOCK |\n| briefing_winkel leer | BLOCK |\n| radar_score < 31 | BLOCK |\n| schimmel_risiko + freigabe=zurueckstellen | BLOCK |\n| Alles andere | PASS → visual_type |\n\n---", "text_hash": "17bf8febca4da05ff8220c46a2ab84b584ab6fba93ebb98f85495a40b2e27daf"}, {"chunk_key": "309c16e113715279a931e4d5c7cdb259c7363fe0d9d3977d2d2431a4a207bd25", "chunk_index": 8, "heading": "Template-Datenfelder", "text": "ng_winkel leer | BLOCK |\n| radar_score < 31 | BLOCK |\n| schimmel_risiko + freigabe=zurueckstellen | BLOCK |\n| Alles andere | PASS → visual_type |\n\n---\n## Template-Datenfelder\n\n| Template-Variable | DB-Quelle |\n|-------------------|-----------|\n| headline | topic_de (Fallback: topic), Source-Suffix entfernt |\n| subline | briefing_winkel |\n| nutzen | briefing_nutzen |\n| cat_icon | Kategorie-Mapping |\n| cat_label | Kategorie-Mapping |\n| bg_color | Kategorie-Mapping |\n| accent_color | Kategorie-Mapping |\n| risk_flag | \"achtung\"/\"sensitiv\" in briefing_risiko |\n| urgency | urgency_level ÷ 2 (1–5 Stufen) |\n| date | created_at[:10] |\n| source_short | source_name (bis zum ersten \":\") |\n| cta_text | Kategorie-Mapping |\n\n---", "text_hash": "668ec877338660e1c5a1d432624f9577f150a5e478789429dff110bf080c46b7"}, {"chunk_key": "cedb133da8d23f66946cdf3b790bdca15b5146facc9863636db535a196824872", "chunk_index": 9, "heading": "Test-Ergebnisse (5 Signale, 2026-05-28)", "text": " urgency_level ÷ 2 (1–5 Stufen) |\n| date | created_at[:10] |\n| source_short | source_name (bis zum ersten \":\") |\n| cta_text | Kategorie-Mapping |\n\n---\n## Test-Ergebnisse (5 Signale, 2026-05-28)\n\n| Test | Signal-ID | Kategorie | Erwartung | Ergebnis |\n|------|-----------|-----------|-----------|---------|\n| T-1 wetter_klima | 2f78b128 | wetter_klima | PASS (render) | ✅ PASS |\n| T-2 feuchte | 02934ebb | feuchte | PASS (render) | ✅ PASS |\n| T-3 mallorca_news | d8e34aa9 | mallorca_news | PASS (render) | ✅ PASS |\n| T-4 schimmel erlaubt | c5add723 | schimmel_risiko | PASS (render) | ✅ PASS |\n| T-5 schimmel blocked | 8684ebec | — | BLOCK (mal_rel=0) | ✅ PASS |\n\n**5/5 PASS** — je 1:1 und 4:5 generiert.", "text_hash": "3e848baca349da688f55590724f527f7b215f621ce63a3cc8462acc4351c19fd"}, {"chunk_key": "9e5c5588ab9786b42b7f76a0ef216f29e2dd4519a76497f0ce7fc718396566b2", "chunk_index": 10, "heading": "Generierte PNGs", "text": "immel_risiko | PASS (render) | ✅ PASS |\n| T-5 schimmel blocked | 8684ebec | — | BLOCK (mal_rel=0) | ✅ PASS |\n\n**5/5 PASS** — je 1:1 und 4:5 generiert.\n### Generierte PNGs\n\n| Datei | Größe |\n|-------|-------|\n| 2d9bfcd3_1x1.png | 114 KB |\n| 2d9bfcd3_4x5.png | 137 KB |\n| 02934ebb_1x1.png | 125 KB |\n| 02934ebb_4x5.png | 154 KB |\n| 2f78b128_1x1.png | 109 KB |\n| 2f78b128_4x5.png | 130 KB |\n| c5add723_1x1.png | 106 KB |\n| c5add723_4x5.png | 132 KB |\n| d8e34aa9_1x1.png | 116 KB |\n| d8e34aa9_4x5.png | 142 KB |\n\n---", "text_hash": "c0381e321482ace7c82557f29c3ecd1ede03cd845919e04c8ec6f023120c573c"}, {"chunk_key": "8a4fd61d13a79d161d36cc1d67c9ef355912f324e99d77a86061a1d87544d7e2", "chunk_index": 11, "heading": "Weitere Gate-Tests (Live-API)", "text": "78b128_4x5.png | 130 KB |\n| c5add723_1x1.png | 106 KB |\n| c5add723_4x5.png | 132 KB |\n| d8e34aa9_1x1.png | 116 KB |\n| d8e34aa9_4x5.png | 142 KB |\n\n---\n## Weitere Gate-Tests (Live-API)\n\n| Signal | Gate-Ergebnis | Grund |\n|--------|--------------|-------|\n| e46b128b | BLOCK | Signal abgelaufen seit 2026-05-28 |\n| 8684ebec | BLOCK | mallorca_relevance=0 |\n| c5add723 | PASS | warnbanner, pruefen, score=35 |\n\n---", "text_hash": "c4c1493cf1c12e4bd754cdae52f74377cca61643aa563f8f1c1462e1d4765810"}, {"chunk_key": "cc22539e76d304f6470c74df464eceddd4d058b7337bc65435afc97943950954", "chunk_index": 12, "heading": "Cockpit-Integration", "text": "28b | BLOCK | Signal abgelaufen seit 2026-05-28 |\n| 8684ebec | BLOCK | mallorca_relevance=0 |\n| c5add723 | PASS | warnbanner, pruefen, score=35 |\n\n---\n## Cockpit-Integration\n\n**Button:** Im \"Nächste Schritte\" Panel jedes Signals:\n`🎨 Visual Vorschau` → öffnet Modal\n\n**Modal-Funktionen:**\n- Beide Formate (1:1 + 4:5) werden parallel generiert\n- Tab-Umschalter zwischen den Formaten\n- PNG-Download-Link\n- Bei Gate-Block: Klartext-Fehlermeldung (kein stilles Versagen)\n\n**API-Routen:**\n- `GET /api/visual/<signal_id>?fmt=1x1|4x5` → JSON {success, path, reason}\n- `GET /visuals/<filename>` → PNG-Datei (direkt)\n\n**Playwright-Config:** `--no-sandbox --disable-dev-shm-usage` (VPS-Requirement)\n\n---", "text_hash": "4197432877e879d91a95c4c85158cd1ed74278329a714f60ed47ac7f860d8d93"}, {"chunk_key": "f851ed2c6f0e46cabe596a8e574ae61ef7c0e4699ab78460c25f94a56800c31a", "chunk_index": 13, "heading": "Offene Risiken", "text": ", path, reason}\n- `GET /visuals/<filename>` → PNG-Datei (direkt)\n\n**Playwright-Config:** `--no-sandbox --disable-dev-shm-usage` (VPS-Requirement)\n\n---\n## Offene Risiken\n\n| Risiko | Schwere | Maßnahme |\n|--------|---------|---------|\n| Playwright-Render-Zeit ca. 3-5s pro Format | Niedrig | Async parallel (beide Formate gleichzeitig im Frontend) |\n| Disk-Wachstum in generated_visuals/ | Niedrig | Cleanup-Job geplant (Phase 2) |\n| Emoji-Rendering in Headless-Browser | Niedrig | Getestet, funktioniert auf Ubuntu 24 |\n| Abgelaufene Signale blockiert | Korrekt | Gate verhindert sinnlose Renders |\n| Keine Font-Einbettung | Niedrig | Systemfonts (Segoe/Arial) ausreichend |\n\n---", "text_hash": "a8e9a24519f30651ec9fe6086d6999fa634bb488ab4633cdae9e1dd7b2f18249"}, {"chunk_key": "c7bb7e48661320f1eec4092529b302dd7f6271febe2bf9cae40f1e2f840d8f96", "chunk_index": 14, "heading": "Nächste Ausbaustufe (Phase 2)", "text": "fene Signale blockiert | Korrekt | Gate verhindert sinnlose Renders |\n| Keine Font-Einbettung | Niedrig | Systemfonts (Segoe/Arial) ausreichend |\n\n---\n## Nächste Ausbaustufe (Phase 2)\n\n| Feature | Aufwand | Priorität |\n|---------|---------|-----------|\n| Foto-Compositing (Signal-Bild + Template) | 3h | Mittel |\n| LinkedIn-Format (1.91:1, 1200×627) | 2h | Mittel |\n| 9:16 Story-Format | 2h | Niedrig |\n| Cleanup-Cronjob (>7 Tage alt löschen) | 1h | Niedrig |\n| visual_generated-Spalte in signals.db | 1h | Niedrig |\n| Render-Queue (statt synchronem Request) | 4h | Phase 3 |\n| Custom-Font-Einbettung (Branding) | 3h | Phase 3 |\n\n---\n\n*Erstellt: 2026-05-28 | Autor: AG (Claude Sonnet 4.6)*\n*Tests: 5/5 PASS | API: Live auf Port 8652*", "text_hash": "d576bc9a0f3ec9079c23ee5278792de5b8008d7b94dc3bab49ac5a531fea3765"}], "elapsed_s": 0.053}