{"queue_id": 48, "relative_path": "Solutions/SMA_COMPOSITE_TOPIC_CLEANUP_REPORT.md", "title": "SMA_COMPOSITE_TOPIC_CLEANUP_REPORT", "import_key": "798c463ff093ef4411181c42aef4add1a0e5eb622478f605e0f5b79b089a0520", "chunk_count": 11, "created_nodes": 12, "created_relationships": 21, "body": null, "chunks": [{"chunk_key": "01e49d9e6fe1d5768c3aa547beb39daef71e6064a7c1470deb8072500329f442", "chunk_index": 0, "heading": "SMA_COMPOSITE_TOPIC_CLEANUP_REPORT", "text": "# SMA_COMPOSITE_TOPIC_CLEANUP_REPORT\nComposite-Topic Cleanup — Abschlussdokumentation\nDatum: 2026-05-28 | Status: ABGESCHLOSSEN\n\n---", "text_hash": "93b2ccb54f4c3edadf210a357c8a588b4219b388e2973dbc2e6db4f11f7b0460"}, {"chunk_key": "340b7745465499080a50f7acc481b8db8f3c8f7ea974cceba64ad892239d6380", "chunk_index": 1, "heading": "Ausgangsproblem", "text": "# SMA_COMPOSITE_TOPIC_CLEANUP_REPORT\nComposite-Topic Cleanup — Abschlussdokumentation\nDatum: 2026-05-28 | Status: ABGESCHLOSSEN\n\n---\n## Ausgangsproblem\n\nEinige Signale hatten `topic_de` oder `topic`-Felder mit aggregierten\nMehrfach-Headlines, Media-Prefixen oder langen Titeln, die unbereinigt\nin Caption-Hooks und Visual-Headlines erschienen.\n\n---", "text_hash": "2c8d974497cab81df3e03729bd3ae1b4d63209fe5763455de8e07ac4378cdba7"}, {"chunk_key": "4090237f3bbb65b70829db090c413374c76f6f9f643c20cd003438b35528667f", "chunk_index": 2, "heading": "Analyseergebnis (362 Signale)", "text": "-Felder mit aggregierten\nMehrfach-Headlines, Media-Prefixen oder langen Titeln, die unbereinigt\nin Caption-Hooks und Visual-Headlines erschienen.\n\n---\n## Analyseergebnis (362 Signale)\n\n| Muster | Anzahl | Beschreibung |\n|--------|--------|-------------|\n| `topic_de LIKE '% \\| %'` | 4 | Titel \\| Untertitel, Media-Prefix |\n| `topic LIKE '% + %'` | 1 | Google-News-Aggregat (topic_de leer) |\n| `topic_de > 120 Zeichen` | 116 | Lange Überschriften |\n| `topic_de LIKE '% - %'` | 73 | Source-Suffix (teils schon behandelt) |\n\n**Gesamtbetroffene caption-relevante Signale (score>=31, mal_rel>0):** 15\n\n---", "text_hash": "fe64eb2c1bf3ee376bb8cbac7dba11ee2e595cd4c4d8b18db8b3e1e90f12476d"}, {"chunk_key": "784784f6e9af13178319bd15088ba12545ea4233db7929ebb05b2bc5597cf8f8", "chunk_index": 3, "heading": "Neue Datei", "text": "`topic_de LIKE '% - %'` | 73 | Source-Suffix (teils schon behandelt) |\n\n**Gesamtbetroffene caption-relevante Signale (score>=31, mal_rel>0):** 15\n\n---\n## Neue Datei\n\n| Datei | Pfad |\n|-------|------|\n| `topic_normalize.py` | `/opt/struktur/social-media-radar/` |", "text_hash": "57f524cce50d86c9af8bbb6c5687135b2fbc72df8174a45b354b52e0eb2e601d"}, {"chunk_key": "59edcf7b8466c20761a3ca2013db8298695384fc4125ad094695bf6a212f8eb5", "chunk_index": 4, "heading": "Normalisierungsregeln (in Reihenfolge)", "text": "## Neue Datei\n\n| Datei | Pfad |\n|-------|------|\n| `topic_normalize.py` | `/opt/struktur/social-media-radar/` |\n### Normalisierungsregeln (in Reihenfolge)\n\n| Schritt | Regel |\n|---------|-------|\n| 1 | Media-Type-Prefix entfernen: `\"VIDEO \\| ...\"` → Prefix weg |\n| 2 | `\" \\| \"` Composite → ersten Segment nehmen |\n| 3 | `\" + \"` Composite → ersten Segment nehmen |\n| 4 | Source-Suffix `\" - Publisher\"` entfernen (Suffix ≤ 40 Zeichen) |\n| 5a | Lange Headline: Kürzen an Doppelpunkt wenn sinnvoll (>20 Z vor `:`) |\n| 5b | Noch zu lang: Wortgrenze + `…` |\n\n**Keine inhaltliche Umschreibung. Keine KI. Keine Faktenergänzung.**\n\n---", "text_hash": "95b195e43e3818cda7ba608a4cacf1ae0f98e0657162126394cf279b4f471cd7"}, {"chunk_key": "a40a22edc8534917ded1930d45875b419433d51a8b30f7a344aa396c0351a07b", "chunk_index": 5, "heading": "Geänderte Dateien", "text": "nkt wenn sinnvoll (>20 Z vor `:`) |\n| 5b | Noch zu lang: Wortgrenze + `…` |\n\n**Keine inhaltliche Umschreibung. Keine KI. Keine Faktenergänzung.**\n\n---\n## Geänderte Dateien\n\n| Datei | Änderung |\n|-------|---------|\n| `caption_render.py` | `_topic_short()` → ruft `normalize_topic()` auf |\n| `visual_render.py` | `build_context()` → ruft `normalize_topic()` auf |\n\n**Backups:** `caption_render.py.bak.normalizer`, `visual_render.py.bak.normalizer`\n\n**Unverändert:** DB (`topic_de`, `topic` — kein Update), Score, Briefing, Director, Gate\n\n---", "text_hash": "c546ceb1455fadad5eaf63fd649a19062e2421688822f85457f5f06c9f503abd"}, {"chunk_key": "bdd8b0ffc99e8e0a0903fa20408925f293cb139f11d39d54b77d916567bf879d", "chunk_index": 6, "heading": "Vorher / Nachher", "text": "r.py.bak.normalizer`, `visual_render.py.bak.normalizer`\n\n**Unverändert:** DB (`topic_de`, `topic` — kein Update), Score, Briefing, Director, Gate\n\n---\n## Vorher / Nachher\n\n| Typ | Vorher | Nachher |\n|-----|--------|---------|\n| `\\|` Composite | `Tödlicher Erdrutsch in Manacor \\| Das Haus stürzte ein, als sich die Balken lösten` | `Tödlicher Erdrutsch in Manacor` |\n| VIDEO Prefix | `VIDEO \\| Der Film Mallorca Confidencial wird in Calvià präsentiert` | `Der Film Mallorca Confidencial wird in Calvià präsentiert` |\n| `+` Composite | `Rostocker Kinder bekommen Schimmel-Essen + Karls expandiert nach Mallorca + ...` | `Rostocker Kinder bekommen Schimmel-Essen` |\n| Source-Suffix | `Mallorca hat die höchste Luftfeuchtigkeit - mallorca-services.es` | `Mallorca hat die höchste Luftfeuchtigkeit` |\n| Langer Titel | `Das Wetter heute, 30. September, in Spanien: Valencianische Gemeinschaft...` | `Das Wetter heute, 30. September, in Spanien` |\n| Saubere Headline | `Das Aemet aktiviert orangefarbene Warnung für Stürme auf Mallorca` | *unverändert* |\n\n---", "text_hash": "fe06d571295ccce2317ef2fc5ae21473b99696b2db87e77a1e5d13ab605c7609"}, {"chunk_key": "9b098551b4383e4a4a84b219b8359388f635f380aa030c0bb28dc0762a4dd922", "chunk_index": 7, "heading": "Testergebnisse", "text": "er heute, 30. September, in Spanien` |\n| Saubere Headline | `Das Aemet aktiviert orangefarbene Warnung für Stürme auf Mallorca` | *unverändert* |\n\n---\n## Testergebnisse", "text_hash": "c654118c02462108b9b302229e66764efc8cc2fc334003a4c5bb1dd706cc7433"}, {"chunk_key": "98d91dd1a0474318b2117b4ab4d557251e5e9388727e012babdcdaf4eeac20e3", "chunk_index": 8, "heading": "Normalizer-Einheitstests (8/8)", "text": "## Testergebnisse\n### Normalizer-Einheitstests (8/8)\n\n| Test | Eingabe-Typ | Ergebnis |\n|------|------------|---------|\n| A-1 | `\\|` Composite | PASS |\n| A-2 | Media-Prefix VIDEO | PASS |\n| A-3 | `+` Composite in topic | PASS |\n| A-4 | Source-Suffix | PASS |\n| A-5 | Saubere Headline unverändert | PASS |\n| A-6 | Lange Headline an Doppelpunkt | PASS |\n| A-7 | Sehr lang, Wortgrenze | PASS |\n| A-8 | Kategorie-Tag `\\|` Zitat | PASS |", "text_hash": "b1bd1628fb5adff98ba0083870eba95801f62f2776c02dae6ec6f6bbf138989b"}, {"chunk_key": "29f3fadcaa5df3b581c2f783b424e11f7f6f9449a9359d2b7543ae7503a0c010", "chunk_index": 9, "heading": "E2E-Tests (12/12)", "text": "e unverändert | PASS |\n| A-6 | Lange Headline an Doppelpunkt | PASS |\n| A-7 | Sehr lang, Wortgrenze | PASS |\n| A-8 | Kategorie-Tag `\\|` Zitat | PASS |\n### E2E-Tests (12/12)\n\n| Test | Ergebnis |\n|------|---------|\n| A-1 bis A-8 (Unit) | 8/8 PASS |\n| B-1 Caption-Integration \\| Composite | PASS (Todesfall-Gate greift korrekt) |\n| B-2 Caption-Integration lange Headline | PASS (abgelaufen → korrekt blockiert) |\n| C-1 Visual-Integration \\| Composite | PASS |\n| C-2 Visual-Integration lange Headline | PASS |\n\n**12/12 PASS**\n\n---", "text_hash": "f48fe715b6cebb1bf6bc81e40b2945615f23eea44ef99231fbed09baeb681027"}, {"chunk_key": "937c83fcfa037bcf2b8fb5ef4a52ca943d1a9f78ca2858ba69eceb617af4f806", "chunk_index": 10, "heading": "Verbleibende Datenqualitätsgrenzen", "text": "abgelaufen → korrekt blockiert) |\n| C-1 Visual-Integration \\| Composite | PASS |\n| C-2 Visual-Integration lange Headline | PASS |\n\n**12/12 PASS**\n\n---\n## Verbleibende Datenqualitätsgrenzen\n\n| Grenze | Schwere | Details |\n|--------|---------|---------|\n| `topic_de` leer bei Composite-`topic` | Niedrig | Nur 1 Signal (`02934ebb`). Normalizer holt Fallback auf `topic` — erste Segment korrekt extrahiert. Echter Fix wäre Neu-Übersetzung. |\n| Kategorie-Tag als alleiniger Hook | Niedrig | `\"Mietpreisregulierung\"` bleibt als Hook wenn `\\|` entfernt. Inhaltlich korrekt, aber sehr kurz. Kein falscher Inhalt. |\n| Doppelten Punkt nach Kürzen | Trivial | Gelegentlich entsteht `\"...: \"` als Ende nach Doppelpunkt-Kürzen. Kein funktionales Problem. |\n| Google-News-`+`-Composites in Summary | Niedrig | Das `short_summary`-Feld wird nicht normalisiert — der Briefing-Algorithmus hat es bereits verarbeitet, Caption nutzt nur topic und briefing_winkel. |\n\n---\n\n*Erstellt: 2026-05-28 | Autor: AG (Claude Sonnet 4.6)*\n*Tests: 12/12 PASS (8 Unit + 4 E2E) | Keine DB-Änderungen*", "text_hash": "c0a533875960f954992b09652695c3fb6c234bf5ab9bae3acef8a20e4af2742e"}], "elapsed_s": 0.047}