Explorer
/tmp/fast-one-45.json
← Zurück ↓ Download
{"queue_id": 45, "relative_path": "Solutions/SMA_CAPTION_ENGINE_MVP_REPORT.md", "title": "SMA_CAPTION_ENGINE_MVP_REPORT", "import_key": "fbad0d9aa3939be17c86e82e16ef0bde6f29de9624f9fdfe1f61f798c646488e", "chunk_count": 19, "created_nodes": 20, "created_relationships": 37, "body": null, "chunks": [{"chunk_key": "003fe94fc8a080c76f50d7b92fa17cf6bb8205ccd9288342b3ba8bf53a8fc643", "chunk_index": 0, "heading": "SMA_CAPTION_ENGINE_MVP_REPORT", "text": "# SMA_CAPTION_ENGINE_MVP_REPORT\nCaption Engine MVP — Abschlussdokumentation\nDatum: 2026-05-28 | Status: PRODUKTIV\n\n---", "text_hash": "bcfac7a811c0611acdd7654edf300e6f0c7bed25b14dd9b0bf39f939c0bf12b7"}, {"chunk_key": "4510896cc124eab6b9f08d0f10b68a29c36989ac87bab0b323bb4111ad20aa6a", "chunk_index": 1, "heading": "STATUS: MVP LIVE", "text": "# SMA_CAPTION_ENGINE_MVP_REPORT\nCaption Engine MVP — Abschlussdokumentation\nDatum: 2026-05-28 | Status: PRODUKTIV\n\n---\n## STATUS: MVP LIVE\n\nDie SMA Caption Engine ist produktiv. Signale können im Cockpit per Knopfdruck\nals Facebook- und LinkedIn-Caption-Entwürfe generiert werden.\nKein LLM. Kein Auto-Posting. Keine Social APIs. Vollständig template-basiert.\n\n---", "text_hash": "d36fbec912cdf87ee2f174122b65a7133b327f961d3bd895f644c430b4d0becd"}, {"chunk_key": "99ad285e6fd16ef87f7665fd4680b25354bc4badca78c050a35c50cf154c21f1", "chunk_index": 2, "heading": "Neue Dateien", "text": "druck\nals Facebook- und LinkedIn-Caption-Entwürfe generiert werden.\nKein LLM. Kein Auto-Posting. Keine Social APIs. Vollständig template-basiert.\n\n---\n## Neue Dateien\n\n| Datei | Pfad | Beschreibung |\n|-------|------|-------------|\n| `caption_gate.py` | `/opt/struktur/social-media-radar/` | Gate — prüft Caption-Erlaubnis |\n| `caption_render.py` | `/opt/struktur/social-media-agent/` | Template-Render-Pipeline |\n| `caption_templates/facebook.txt` | `.../caption_templates/` | Jinja2-Template Facebook |\n| `caption_templates/linkedin.txt` | `.../caption_templates/` | Jinja2-Template LinkedIn |", "text_hash": "3cbfe47b5bbba9a0ba9f3dab799dd6601c55c90fe80ec49c52daad83f66e4d92"}, {"chunk_key": "6494c291c8ca190e8ab2d3d5a9dac4e97e19af4e7327ce65206e3ae8a5fd3332", "chunk_index": 3, "heading": "Geänderte Dateien", "text": "xt` | `.../caption_templates/` | Jinja2-Template Facebook |\n| `caption_templates/linkedin.txt` | `.../caption_templates/` | Jinja2-Template LinkedIn |\n## Geänderte Dateien\n\n| Datei | Änderung |\n|-------|---------|\n| `templates/cockpit.html` | Caption-Button + Modal + Copy-JS |\n| `app.py` | `/api/caption/<signal_id>` Route |", "text_hash": "12a3f09ed3d37f39bcf25cdc9fc93bd72e8cf5541f6d2677048022e6864fccb2"}, {"chunk_key": "44c2bee6cff997f7516d14d32fbac713c2adcf9b7195f639e24dfa43d7eea528", "chunk_index": 4, "heading": "Backups", "text": "Datei | Änderung |\n|-------|---------|\n| `templates/cockpit.html` | Caption-Button + Modal + Copy-JS |\n| `app.py` | `/api/caption/<signal_id>` Route |\n## Backups\n\n| Original | Backup |\n|----------|--------|\n| `cockpit.html` | `cockpit.html.bak.caption_btn` |\n| `app.py` | `app.py.bak.caption_api` |\n\n---", "text_hash": "602428418d03ddd30e03a8cc5b720d50880336d431a4480b01729bb9c2be2bf3"}, {"chunk_key": "7ac9a50d131ed277f9cd59a4d4932d0a88f788b45830d2c092b0a8782a26f389", "chunk_index": 5, "heading": "Architektur", "text": " Backups\n\n| Original | Backup |\n|----------|--------|\n| `cockpit.html` | `cockpit.html.bak.caption_btn` |\n| `app.py` | `app.py.bak.caption_api` |\n\n---\n## Architektur\n\n```\nCockpit (Browser)\n  → 📝 Caption Vorschau Klick\n    → GET /api/caption/<signal_id>  (Flask app.py)\n      → caption_render.py → render_by_id()\n        → signals.db → Signal laden\n          → caption_gate.py → can_generate_caption()\n              BLOCK: freigabe=verwerfen | Todesfall | mal_rel=0 | abgelaufen | kein Winkel\n              PASS:  caption_style bestimmen\n          → build_facebook_context() + build_linkedin_context()\n          → Jinja2-Template füllen → Texte\n      → JSON: {success, facebook, linkedin, char_count, reason}\n    → Cockpit Modal: FB + LI Tab-Ansicht + Copy-Button\n```\n\n---", "text_hash": "862776a987a85263a3a7413eef1fc80ce342dddbb7f1b7112ef7472732d6dfea"}, {"chunk_key": "1c1616ac8dd8a385da1fa2552d7ed83770db612ee970170fcb19d9789e0baf89", "chunk_index": 6, "heading": "Gate-Regeln (caption_gate.py)", "text": "emplate füllen → Texte\n      → JSON: {success, facebook, linkedin, char_count, reason}\n    → Cockpit Modal: FB + LI Tab-Ansicht + Copy-Button\n```\n\n---\n## Gate-Regeln (caption_gate.py)\n\n| Bedingung | Ergebnis |\n|-----------|---------|\n| briefing_freigabe = verwerfen | BLOCK |\n| Todesfall-/Verletzungs-Keyword in briefing_risiko | BLOCK |\n| Ethisch problematische Keywords in Topic | BLOCK |\n| mallorca_relevance = 0 | BLOCK |\n| Signal abgelaufen | BLOCK |\n| briefing_winkel UND briefing_nutzen leer | BLOCK |\n| radar_score < 31 | BLOCK |\n| Alles andere | PASS → caption_style |\n\n---", "text_hash": "dbbaed5fbf26749831daf42148c0650e7bd43fae6c430914941c2da76acf5da5"}, {"chunk_key": "aeda85961237830249d40142fc5e9db17921f5c9c0d160d2e7fe4ce4ebd1e4d2", "chunk_index": 7, "heading": "Caption-Stil je Kategorie", "text": "al abgelaufen | BLOCK |\n| briefing_winkel UND briefing_nutzen leer | BLOCK |\n| radar_score < 31 | BLOCK |\n| Alles andere | PASS → caption_style |\n\n---\n## Caption-Stil je Kategorie\n\n| Kategorie | Stil | Fokus |\n|-----------|------|-------|\n| feuchte | problemloesung | Risiko + Frühwarnung |\n| wetter_klima | warnung | Kontext + Schutz |\n| ferienimmobilie | eigentuemer | Betreuung + Werterhalt |\n| mallorca_news | lokal | Relevanz + Einordnung |\n| schimmel_risiko | sachlich | Kein Panik, Handlungsaufforderung |\n\n---", "text_hash": "214c7d6e2f70fcb4df0e034a8f39f49a79ea51bff71939b4241ffa85164e5bc9"}, {"chunk_key": "db298782727350f3268391ad4ecaffcaef3321dd2032108c353c086da99acab2", "chunk_index": 8, "heading": "Template-Datenfelder", "text": "r | Betreuung + Werterhalt |\n| mallorca_news | lokal | Relevanz + Einordnung |\n| schimmel_risiko | sachlich | Kein Panik, Handlungsaufforderung |\n\n---\n## Template-Datenfelder", "text_hash": "a6fcb0cf59f208582b833b68460d3b18cf631bdda69e77d34389e91811d83080"}, {"chunk_key": "d73aa98fc6917b6a1a4b19d1864991eb37fb2eb8f8c27340ee4da7c4b0180a7f", "chunk_index": 9, "heading": "Facebook-Kontext", "text": "## Template-Datenfelder\n### Facebook-Kontext\n\n| Variable | Quelle |\n|----------|--------|\n| hook_intro | emotional_direction → HOOK_FB, Fallback: HOOK_CAT_FB + topic_de |\n| nutzen_line | briefing_nutzen (Fallback: briefing_winkel) |\n| context_line | briefing_winkel als Einordnung (wenn nicht zu ähnlich wie nutzen) |\n| cta_line | CTA_FB[category] |\n| hashtags | TAGS_FB[category] — max 3 |", "text_hash": "ffa027add773a29e930542c09c2e69d5386af338cbf779e9041caace2f7521fe"}, {"chunk_key": "34adc70a592d2741b31e940a8d2ca4e71cecb6baae7ad2b58f947a3abfa2f408", "chunk_index": 10, "heading": "LinkedIn-Kontext", "text": "xt_line | briefing_winkel als Einordnung (wenn nicht zu ähnlich wie nutzen) |\n| cta_line | CTA_FB[category] |\n| hashtags | TAGS_FB[category] — max 3 |\n### LinkedIn-Kontext\n\n| Variable | Quelle |\n|----------|--------|\n| professional_intro | emotional_direction → HOOK_LI + topic_de |\n| context_line | briefing_winkel als vollständiger Satz |\n| value_line | briefing_nutzen mit Verstärker (wenn ≠ winkel) |\n| reflection_question | REFLECT_LI[category] |\n| cta_line | CTA_FB[category] (gleicher CTA) |\n| hashtags | TAGS_LI[category] — max 5 |\n\n**Ähnlichkeits-Guard:** Wenn `briefing_nutzen` und `briefing_winkel` > 60% Wort-Overlap,\nwird die redundante Zeile durch einen generischen Fallback ersetzt.\n\n---", "text_hash": "b1932e9204226e3107aa5cafeb0694a4cb479d73173a7f23d1a5a11287dc0290"}, {"chunk_key": "67b4ea4cbca859fea4f40541f84e74cc1ac809946868e59c28e9cac6992c290f", "chunk_index": 11, "heading": "Caption-Beispiele (Produktionssignale)", "text": "its-Guard:** Wenn `briefing_nutzen` und `briefing_winkel` > 60% Wort-Overlap,\nwird die redundante Zeile durch einen generischen Fallback ersetzt.\n\n---\n## Caption-Beispiele (Produktionssignale)", "text_hash": "0c4ba616edda4f61c4112ba72e0bd510438f8ce34df33d2e478c5d3787717ad8"}, {"chunk_key": "76866260068120ba13011a2186201bccb97590d90d1998c7e4a1f5b74a111051", "chunk_index": 12, "heading": "Signal 2d9bfcd3 — feuchte, Score=70", "text": "## Caption-Beispiele (Produktionssignale)\n### Signal 2d9bfcd3 — feuchte, Score=70\n\n**Facebook (405 Zeichen):**\n```\nDas haben viele Mallorca-Eigentümer so nicht erwartet:\n\n💬 Mallorca hat europaweit die \"höchste Luftfeuchtigkeit\"\n\nEigentümer erkennt Feuchteproblem frühzeitig und handelt gezielt\n\nFeuchteprobleme in Mallorca-Wohnungen: Ursachen und Lösung — das betrifft Mallorca-Eigentümer direkt.\n\n👉 Jetzt kostenlosen Feuchtigkeits-Check anfragen → mallorca-airservices.com\n\n#Mallorca #Ferienimmobilien #Schimmelschutz\n```\n\n**LinkedIn (524 Zeichen):**\n```\nEine aktuelle Entwicklung auf Mallorca verdient Aufmerksamkeit:\n\nMallorca hat europaweit die \"höchste Luftfeuchtigkeit\".\n\nFeuchteprobleme in Mallorca-Wohnungen: Ursachen und Lösung.\n\nEigentümer erkennt Feuchteproblem frühzeitig und handelt gezielt — mit dem richtigen Vor-Ort-Partner.\n\nWann haben Sie Ihre Immobilie zuletzt auf Feuchtigkeit prüfen lassen?\n→ Jetzt kostenlosen Feuchtigkeits-Check anfragen → mallorca-airservices.com\n\n#MallorcaImmobilien #Ferienimmobilien #Immobilienmanagement #Mallorca #Schimmelprävention\n```\n\n---", "text_hash": "8986b2872e17104bc314b3c60b61c69243cd4ccdf11b7241bf6e76b8895f0412"}, {"chunk_key": "ebe98f877b0774668825b41dafbd78a66358cb5c2d5407f32aff4765b46faadc", "chunk_index": 13, "heading": "Test-Ergebnisse (6 Signale, 2026-05-28)", "text": "tigkeits-Check anfragen → mallorca-airservices.com\n\n#MallorcaImmobilien #Ferienimmobilien #Immobilienmanagement #Mallorca #Schimmelprävention\n```\n\n---\n## Test-Ergebnisse (6 Signale, 2026-05-28)\n\n| Test | Signal-ID | Erwartung | Ergebnis | FB-Z | LI-Z |\n|------|-----------|-----------|----------|------|------|\n| T-1 wetter_klima | 2f78b128 | PASS | ✅ PASS | 374 | 500 |\n| T-2 feuchte | 02934ebb | PASS | ✅ PASS | 408 | 551 |\n| T-3 mallorca_news | d8e34aa9 | PASS | ✅ PASS | 342 | 488 |\n| T-4 schimmel erlaubt | c5add723 | PASS | ✅ PASS | 378 | 501 |\n| T-5 Todesfall blockiert | 234a7a31 | BLOCK | ✅ PASS | — | — |\n| T-6 mal_rel=0 blockiert | 8684ebec | BLOCK | ✅ PASS | — | — |\n\n**6/6 PASS**\n\n**Alle Captions geprüft auf:**\n- ✅ Länge > 50 Zeichen\n- ✅ FB ≠ LI (keine identischen Texte)\n- ✅ CTA vorhanden (mallorca-airservices.com)\n- ✅ Hashtags vorhanden (FB)\n- ✅ Todesfall korrekt blockiert\n- ✅ mal_rel=0 korrekt blockiert\n\n---", "text_hash": "ebc51f9ba6b4c17a6ae419e343bc74695fad5a55a9696f8886d4c41f7c88c42e"}, {"chunk_key": "2b6f065389b285999628b5ad4ceedde9622683e9a15f99d65dd487acee314ebd", "chunk_index": 14, "heading": "API-Tests (Live, Port 8652)", "text": "n Texte)\n- ✅ CTA vorhanden (mallorca-airservices.com)\n- ✅ Hashtags vorhanden (FB)\n- ✅ Todesfall korrekt blockiert\n- ✅ mal_rel=0 korrekt blockiert\n\n---\n## API-Tests (Live, Port 8652)\n\n| Endpunkt | Signal | Ergebnis |\n|----------|--------|---------|\n| `/api/caption/2d9bfcd3` | feuchte | `{\"success\":true, \"facebook\":\"...\", \"linkedin\":\"...\"}` |\n| `/api/caption/234a7a31` | Todesfall | `{\"success\":false, \"reason\":\"[234a7a31] Todesfall/Verletzung...\"}` |\n| `/api/caption/8684ebec` | mal_rel=0 | `{\"success\":false, \"reason\":\"[8684ebec] mallorca_relevance=0\"}` |\n\n---", "text_hash": "540607f0ab70b09f2e47965679de46cdbcd8b981a353d94fa07474aa8967d776"}, {"chunk_key": "b731967beb11a46f561dacb77216b69dc857afed177664230cb78bca5b44911a", "chunk_index": 15, "heading": "Cockpit-Integration", "text": "[234a7a31] Todesfall/Verletzung...\"}` |\n| `/api/caption/8684ebec` | mal_rel=0 | `{\"success\":false, \"reason\":\"[8684ebec] mallorca_relevance=0\"}` |\n\n---\n## Cockpit-Integration\n\n**Button:** Im \"Nächste Schritte\" Panel:\n`📝 Caption Vorschau` → öffnet Modal (vor `🎨 Visual Vorschau`)\n\n**Modal-Funktionen:**\n- Facebook-Tab + LinkedIn-Tab (Umschaltung)\n- Zeichen-Counter mit Längen-Warnung (FB > 600, LI > 1000)\n- `📋 Kopieren`-Button (Clipboard API)\n- Hinweis-Banner: \"Entwurf — vor Verwendung manuell prüfen\"\n- Bei Gate-Block: Klartext-Fehlermeldung\n- ESC schließt Modal (shared mit Visual-Modal)\n\n---", "text_hash": "7684925aae380e25d842d4871eb132fac2266a1921bee784b692dcaeb96b1188"}, {"chunk_key": "4fbebd83d740c349ae786a881cbd20ce87fd9c8cac9fab553ce7a2d43ed7710e", "chunk_index": 16, "heading": "Bekannte Grenzen", "text": "Hinweis-Banner: \"Entwurf — vor Verwendung manuell prüfen\"\n- Bei Gate-Block: Klartext-Fehlermeldung\n- ESC schließt Modal (shared mit Visual-Modal)\n\n---\n## Bekannte Grenzen\n\n| Grenze | Schwere | Details |\n|--------|---------|---------|\n| Composite-Topics | Niedrig | Wenn `topic_de` mehrere Nachrichten enthält (\"+\"-getrennt, Google News), erscheint die vollständige Composite-Headline im Hook. Betrifft Signale mit schlechter Quellenqualität. |\n| Briefing-Text-Qualität | Niedrig | Captions sind nur so gut wie briefing_winkel/nutzen. Algorithmisch generierte Briefings mit generischen Formulierungen (\"MAS-relevantes Thema aufbereiten\") produzieren generische Captions. |\n| Kein Satz-Uppercase | Niedrig | Briefing-Felder kommen teils ohne Punkt am Ende — Caption endet ohne finalen Punkt. |\n| Keine Personalisierung | Bewusst | Keine Kundenname, keine spezifischen Zahlen — Template bleibt allgemein. Bewusste Entscheidung für MVP. |\n\n---", "text_hash": "f43334e8f0ad0706c4595d47e3de652f21ef42ad81e70f830ebce022adddd6ff"}, {"chunk_key": "3636506fdd6e5d9b580e50cb1d3240f3a8b7daabb7a58252bf2398c0171f914b", "chunk_index": 17, "heading": "Gesamte SMA-Pipeline (Stand 2026-05-28)", "text": " |\n| Keine Personalisierung | Bewusst | Keine Kundenname, keine spezifischen Zahlen — Template bleibt allgemein. Bewusste Entscheidung für MVP. |\n\n---\n## Gesamte SMA-Pipeline (Stand 2026-05-28)\n\n```\nSignal (DB)\n  → caption_gate     → BLOCK / PASS\n  → caption_render   → Facebook + LinkedIn Caption-Entwurf\n  → visual_gate      → BLOCK / PASS\n  → visual_render    → 1:1 + 4:5 PNG\n  → Cockpit          → Operator prüft + kopiert + postet manuell\n```\n\n---", "text_hash": "8cb138568bbb9cd3fa76aabe9428457b7d9a0213ec86a598d4e05b886831cfd3"}, {"chunk_key": "03f66f59c78b2b69a1be0d11a67473968a30aa864ce11ccc8705a3514366db5d", "chunk_index": 18, "heading": "Nächste Ausbaustufe (Phase 2)", "text": "urf\n  → visual_gate      → BLOCK / PASS\n  → visual_render    → 1:1 + 4:5 PNG\n  → Cockpit          → Operator prüft + kopiert + postet manuell\n```\n\n---\n## Nächste Ausbaustufe (Phase 2)\n\n| Feature | Aufwand | Priorität |\n|---------|---------|-----------|\n| Caption in signals.db speichern (caption_fb, caption_li Spalten) | 2h | Mittel |\n| Caption-Qualitäts-Score (Länge + CTA + Hashtag-Check) | 2h | Niedrig |\n| Caption-Bearbeitung im Cockpit (editierbar vor Kopieren) | 3h | Mittel |\n| Story-Format-Caption (sehr kurz, 150 Z, kein Hashtag) | 1h | Niedrig |\n| Mehrsprachig: ES-Caption für spanische Zielgruppe | 3h | Phase 3 |\n| Caption → Content Queue übertragen (ein Klick) | 2h | Mittel |\n\n---\n\n*Erstellt: 2026-05-28 | Autor: AG (Claude Sonnet 4.6)*\n*Tests: 6/6 PASS | API: Live auf Port 8652*", "text_hash": "f5a5dee87d10a499aeb855d26bd2369d704602991652d358c5fa8884a613fe25"}], "elapsed_s": 0.056}