Explorer
/tmp/fast-one-41.json
← Zurück ↓ Download
{"queue_id": 41, "relative_path": "Solutions/SOL_006_QUICKFIX_1_3_REPORT.md", "title": "SOL_006_QUICKFIX_1_3_REPORT", "import_key": "9c53ab0deaa43dbb319edd54b0f6e603e9fd1ca62f9ee7048745029c8bef949f", "chunk_count": 22, "created_nodes": 23, "created_relationships": 43, "body": null, "chunks": [{"chunk_key": "885133082599448ab03d9c0f07723a37e567f1f052ea3f26481d837b89c1d936", "chunk_index": 0, "heading": "SOL_006_QUICKFIX_1_3_REPORT", "text": "# SOL_006_QUICKFIX_1_3_REPORT\nUmsetzungsbericht der drei einfachen Fixes aus SOL-006\nDatum: 2026-05-28 | Status: Abgeschlossen | Testergebnis: 15/15 PASS\n\n---", "text_hash": "47ec4ec5fe1bd3b82db72c85972fbf62f980d6625890e6f2dc17bbd7fcc04410"}, {"chunk_key": "7c858c904a4be66a70570a7a8192921efac993fda7fb8b35cdd143835ab68575", "chunk_index": 1, "heading": "Geaenderte Dateien", "text": "6_QUICKFIX_1_3_REPORT\nUmsetzungsbericht der drei einfachen Fixes aus SOL-006\nDatum: 2026-05-28 | Status: Abgeschlossen | Testergebnis: 15/15 PASS\n\n---\n## Geaenderte Dateien\n\n| Datei | Pfad (VPS) | Backup-Pfad |\n|---|---|---|\n| signal_classifier.py | `/opt/struktur/social-media-radar/classification/signal_classifier.py` | `...signal_classifier.py.bak.20260528` |\n| content_briefing.py | `/opt/struktur/social-media-radar/content_briefing.py` | `...content_briefing.py.bak.20260528` |\n| cockpit.html | `/opt/struktur/social-media-agent/templates/cockpit.html` | `...cockpit.html.bak.20260528` |\n\n---", "text_hash": "7be214d2381f2390418ae6f03afb00b47bf9b4221bf428e7b98d603ae040b4e4"}, {"chunk_key": "70286d8c2cb52ccc98259aec14d3d5b630c3c6932628127875cc97c98c607da7", "chunk_index": 2, "heading": "Fix 1: UI-02 — Post-Button sperren bei negativer Freigabe", "text": "content_briefing.py.bak.20260528` |\n| cockpit.html | `/opt/struktur/social-media-agent/templates/cockpit.html` | `...cockpit.html.bak.20260528` |\n\n---\n## Fix 1: UI-02 — Post-Button sperren bei negativer Freigabe\n\n**Datei:** `cockpit.html`\n\n**Geaenderte Stellen:**\n- Zeile ~831: neue Variable `const canPost`\n- Zeile ~843-844: `Post erstellen`-Div mit bedingter Klasse und onclick\n\n**Konkrete Aenderung:**\n\n```javascript\n// NEU: Variable vor \"const acts\"\nconst canPost = !(s.b_freig === 'zurueckstellen' || s.b_freig === 'verwerfen');\n\n// VORHER:\n<div class=\"act\" onclick=\"createPostFromSignal(...)\"><span>✍️</span>\n  <span><div>Post erstellen</div><div class=\"act-s\">LinkedIn · Facebook · Reel · CTA</div></span></div>\n\n// NACHHER:\n<div class=\"${canPost ? 'act' : 'act dis'}\" ${canPost ? `onclick=\"createPostFromSignal(...)\"` : ''}\n  title=\"${canPost ? '' : 'Freigabe: ' + s.b_freig + ' — Signal zuerst manuell prüfen'}\">\n  <span>✍️</span>\n  <span><div>Post erstellen</div>\n  <div class=\"act-s\">${canPost ? 'LinkedIn · Facebook · Reel · CTA' : 'Gesperrt — Freigabe: ' + s.b_freig}</div>\n  </span></div>\n```\n\n**Effekt:**\n- 163 Signale mit `briefing_freigabe=zurueckstellen` haben einen gesperrten Post-Button\n- Keine Backend-Aenderung noetig\n- Klasse `act dis` bereits im CSS definiert (kein neuer Stil noetig)\n\n---", "text_hash": "6cad9e74a460945052af7765f8ffa4a46f011cb7c01889682310a4e386b7eb3e"}, {"chunk_key": "2cf8b99424022dd1d5438e27f9ccebd6411a59931adc59b47709be2933c548c4", "chunk_index": 3, "heading": "Fix 2: REGEL-01 — Lebensmittel-Schimmel ausschliessen", "text": "stellen` haben einen gesperrten Post-Button\n- Keine Backend-Aenderung noetig\n- Klasse `act dis` bereits im CSS definiert (kein neuer Stil noetig)\n\n---\n## Fix 2: REGEL-01 — Lebensmittel-Schimmel ausschliessen\n\n**Datei:** `signal_classifier.py`\n\n**Geaenderte Stellen:**\n- Nach `IRRELEVANT_KW` (Zeile ~148): neue Liste `FOOD_CONTEXT_KW`\n- `score_signal()`, Kategorie-Zuweisung: `food_hit`-Variable + Guard\n- `score_signal()`, `case_types`-Block: Guard auf `food_hit == 0`\n- Erweiterung (zweite Iteration): Regex-Check fuer Bindestrich-Komposita\n\n**Konkrete Aenderung:**\n\n```python", "text_hash": "6e118dcf4b46147d84a1e34cae96cbcc66bc18d988b505b90f86c69e18c49bec"}, {"chunk_key": "f1204da134a6ab76da5845f304a0c0c3837916051f08745043a2ba67bfc7970b", "chunk_index": 4, "heading": "NEU: Liste nach IRRELEVANT_KW", "text": "e_types`-Block: Guard auf `food_hit == 0`\n- Erweiterung (zweite Iteration): Regex-Check fuer Bindestrich-Komposita\n\n**Konkrete Aenderung:**\n\n```python\n# NEU: Liste nach IRRELEVANT_KW\nFOOD_CONTEXT_KW = [\n    \"lebensmittel\", \"schinken\", \"fleisch\", \"gammel\", \"abgelaufen\",\n    \"speise\", \"mahlzeit\", \"schulessen\", \"lebensmittelkontrolle\",\n    \"gammelfleisch\", \"essen verdorben\", \"schimmelkaese\",\n    \"mensa\", \"kantine\", \"cafeteria\",\n]", "text_hash": "50e0f827d56fb0d68763080dc253295cbdfcfaf54e0418321fb7a636e0e79029"}, {"chunk_key": "2e043308f5a97f28c43011df19f41ab23f661d8af1e3ede6350d8113f8065a0f", "chunk_index": 5, "heading": "In score_signal(), Kategorie-Zuweisung:", "text": "e\", \"mahlzeit\", \"schulessen\", \"lebensmittelkontrolle\",\n    \"gammelfleisch\", \"essen verdorben\", \"schimmelkaese\",\n    \"mensa\", \"kantine\", \"cafeteria\",\n]\n# In score_signal(), Kategorie-Zuweisung:", "text_hash": "042441a5a114e4198fd1c6d352612a1a516391dfe6acb4192319c733f086a52c"}, {"chunk_key": "c8099f154c9f3eac0addf8671d94f178c7c00830bafd8730618fce91530855be", "chunk_index": 6, "heading": "VORHER:", "text": "# In score_signal(), Kategorie-Zuweisung:\n# VORHER:\nif core_hits > 0 and (\"schimmel\" in t or \"mold\" in t or \"moho\" in t):\n    signal_category = \"schimmel_risiko\"", "text_hash": "06187cfbfb35a5db1d17f8059d8c076b5d412d8df362eb34cbc20eaecffd24ff"}, {"chunk_key": "847c2a941057038204ada7046d72f044be67d8f9b7c2ff5d99b2d0046ac48884", "chunk_index": 7, "heading": "NACHHER:", "text": "# VORHER:\nif core_hits > 0 and (\"schimmel\" in t or \"mold\" in t or \"moho\" in t):\n    signal_category = \"schimmel_risiko\"\n# NACHHER:\nfood_hit = _hits(text, FOOD_CONTEXT_KW)  # SOL-006 REGEL-01", "text_hash": "3de387ebd8f5ca5fd6dcfae679e37d422a3a1ad8fa5dc2a7e7a1252fbc2423cd"}, {"chunk_key": "525a4bef0d5d503470c27fb19b96b1d044b8204968e6d033f103fe436c02c892", "chunk_index": 8, "heading": "Bindestrich-Komposita: Schimmel-Essen, Gammel-Essen etc.", "text": "# NACHHER:\nfood_hit = _hits(text, FOOD_CONTEXT_KW)  # SOL-006 REGEL-01\n# Bindestrich-Komposita: Schimmel-Essen, Gammel-Essen etc.\n_food_compound = bool(re.search(\n    r\"schimmel[\\-]?essen|essen[\\-]?schimmel|gammel[\\-]?essen|gammelfleisch\",\n    t\n))\nif _food_compound:\n    food_hit += 1\nif core_hits > 0 and (\"schimmel\" in t or \"mold\" in t or \"moho\" in t) and food_hit == 0:\n    signal_category = \"schimmel_risiko\"", "text_hash": "030d760d0d1823c537259d5422a68d046998365ab9e9cfd1158c2a8d5562518a"}, {"chunk_key": "8bfdea83a3661588e6d6641a02703d60ebe87d91a475fe6430b4ce59656c9d3d", "chunk_index": 9, "heading": "case_types ebenfalls:", "text": "und:\n    food_hit += 1\nif core_hits > 0 and (\"schimmel\" in t or \"mold\" in t or \"moho\" in t) and food_hit == 0:\n    signal_category = \"schimmel_risiko\"\n# case_types ebenfalls:", "text_hash": "599a24fd6f65fa3f1b11dc63060c3dc6581da4c0d3f6cb2bbf0f773a0b9d8245"}, {"chunk_key": "c758ea12e70c864600ff2e755e5101a98644ac57e2c4917c457ad6975438eb18", "chunk_index": 10, "heading": "VORHER:", "text": "# case_types ebenfalls:\n# VORHER:\nif \"schimmel\" in t or \"mold\" in t or \"moho\" in t:\n    case_types += [\"schimmel_risiko\", \"feuchtefall\"]", "text_hash": "bc212dd9ca7f3244b529b3c42f2353876ab2a456440721e9c138279d69c7b0fb"}, {"chunk_key": "81188883e54b9737bd2cfe85e8e924f839f73ec113603eebfcbb86193241e387", "chunk_index": 11, "heading": "NACHHER:", "text": "# VORHER:\nif \"schimmel\" in t or \"mold\" in t or \"moho\" in t:\n    case_types += [\"schimmel_risiko\", \"feuchtefall\"]\n# NACHHER:\nif (\"schimmel\" in t or \"mold\" in t or \"moho\" in t) and food_hit == 0:\n    case_types += [\"schimmel_risiko\", \"feuchtefall\"]\n```\n\n**Zweite Iteration noetig (Bindestrich-Problem):**\n`_hits()` splittet bei Sonderzeichen — \"Schimmel-Essen\" wird zu [\"schimmel\", \"essen\"]. \"essen\" allein ist zu generisch als Keyword. Loesung: separater `re.search()`-Check fuer Komposita.\n\n**Effekt:**\n- \"Gammelfleischskandal Mallorca — Schimmel auf Schinken\" → nicht mehr `schimmel_risiko`\n- \"Rostocker Kinder bekommen Schimmel-Essen\" → nicht mehr `schimmel_risiko`\n- \"Schimmelbefall in Ferienwohnung Mallorca\" → bleibt `schimmel_risiko` (korrekt)\n- Hinweis: betroffene Signale in DB haben NOCH die alte Klassifikation — erfordert Rescore (nicht im Scope dieser Quickfixes)\n\n---", "text_hash": "e36f8e67b1eaed627411d84f97be5a330f196b7b68fa772cbffa1b441d4c93ac"}, {"chunk_key": "1ec08704fbbc594e2ef06a21c488af86e33a5ece6a3ff039a9e1d070a01a775d", "chunk_index": 12, "heading": "Fix 3: REGEL-03 — Todesfall-/Ethik-Flag", "text": "l_risiko` (korrekt)\n- Hinweis: betroffene Signale in DB haben NOCH die alte Klassifikation — erfordert Rescore (nicht im Scope dieser Quickfixes)\n\n---\n## Fix 3: REGEL-03 — Todesfall-/Ethik-Flag\n\n**Datei:** `content_briefing.py`\n\n**Geaenderte Stellen:**\n- Vor `_get_risiko()` (Zeile ~300): neue Konstante `DEATH_KW`\n- `_get_risiko()`: Death-Check nach `risiken = []`\n- `_get_freigabe()`: Death-Override nach `pr >= 2`-Check\n\n**Konkrete Aenderung:**\n\n```python", "text_hash": "f416e71a34a33f7793269a717db3a9f95bcdbe0dc2ecf6ce1cc00da9f46610a6"}, {"chunk_key": "7c8af04fabd2d9c7dc01a5cd230af5c969dd6351023ab565f6cc48ada4688a18", "chunk_index": 13, "heading": "NEU: Konstante vor _get_risiko()", "text": "TH_KW`\n- `_get_risiko()`: Death-Check nach `risiken = []`\n- `_get_freigabe()`: Death-Override nach `pr >= 2`-Check\n\n**Konkrete Aenderung:**\n\n```python\n# NEU: Konstante vor _get_risiko()\nDEATH_KW = [\n    \"mortal\", \"fatale\", \"fatal\", \"toedlich\", \"todesfall\",\n    \"gestorben\", \"ums leben\", \"getoetet\", \"verstorben\",\n    \"fallecido\", \"fallecimiento\", \"victima mortal\", \"muerto\",\n    \"dead\", \"died\", \"fatal accident\", \"death\",\n    \"verletzt schwer\", \"schwerstverletzt\", \"lebensgefahr\",\n]", "text_hash": "8554430335198f0a0696f05fe61f5ac357bd675f7b6eda82587f603b42f6ba9f"}, {"chunk_key": "4d57da0202f91cb818bcc42527c79e4afad7c3c24c803c67d70c333048cc107c", "chunk_index": 14, "heading": "In _get_risiko(): nach risiken = []", "text": "allecimiento\", \"victima mortal\", \"muerto\",\n    \"dead\", \"died\", \"fatal accident\", \"death\",\n    \"verletzt schwer\", \"schwerstverletzt\", \"lebensgefahr\",\n]\n# In _get_risiko(): nach risiken = []\ntopic_text = (sig.get(\"topic\") or \"\").lower()\nif any(kw in topic_text for kw in DEATH_KW):\n    risiken.append(\n        \"Achtung: Todesmeldung / Verletzte — ethisch sensitives Thema. \"\n        \"Kein direkter CTA. Sachlichen Abstand wahren. Manuell pruefen.\"\n    )", "text_hash": "ed2a6ca4be47fc1c4ce361194f5a5576c81c6a30dce38e36cac33bd13a8d5bcb"}, {"chunk_key": "16b6135601c40df85c5de023206d55f2bb33a13907d363bfc7f3139792c15cb9", "chunk_index": 15, "heading": "In _get_freigabe(): nach pr >= 2 Check", "text": "       \"Achtung: Todesmeldung / Verletzte — ethisch sensitives Thema. \"\n        \"Kein direkter CTA. Sachlichen Abstand wahren. Manuell pruefen.\"\n    )\n# In _get_freigabe(): nach pr >= 2 Check\ntopic_text_f = (sig.get(\"topic\") or \"\").lower()\nif any(kw in topic_text_f for kw in DEATH_KW):\n    return \"pruefen\"  # Todesmeldung: nie automatisch freigeben\n```\n\n**Effekt:**\n- \"Derrumbe mortal en Manacor\" (Todesfall durch Feuchte):\n  - `briefing_risiko` enthaelt jetzt: \"Achtung: Todesmeldung / Verletzte...\"\n  - `briefing_freigabe` = `pruefen` (war: `pruefen` aus anderen Gruenden — Effekt gleich, Grund jetzt korrekt)\n- Normales Feuchte-Signal ohne Tod: unveraendert, bleibt `geeignet` moeglich\n- `briefing_freigabe = geeignet` fuer Todesmeldungen ist strukturell ausgeschlossen\n\n---", "text_hash": "ff69cb17c9d1a74d0c57078485b9d752be1512de27b76b75aae0ddc1a51adaaa"}, {"chunk_key": "011c5dfcd5d16b3c7822bf5574364022862ab1d306ab39de33694dde6b8e2d4f", "chunk_index": 16, "heading": "Testergebnisse", "text": "hte-Signal ohne Tod: unveraendert, bleibt `geeignet` moeglich\n- `briefing_freigabe = geeignet` fuer Todesmeldungen ist strukturell ausgeschlossen\n\n---\n## Testergebnisse\n\n| Testfall | Test | Ergebnis | Wert |\n|---|---|---|---|\n| TF1: Lebensmittel-Schimmel | Kategorie != schimmel_risiko (Gammelfleisch) | PASS | feuchte |\n| TF1: Lebensmittel-Schimmel | case_types ohne schimmel_risiko | PASS | feuchtefall |\n| TF1: Lebensmittel-Schimmel | Rostock-Signal != schimmel_risiko | PASS | feuchte |\n| TF1: Lebensmittel-Schimmel | Randfall Abgelaufene Lebensmittel | PASS | feuchte |\n| TF1: Negativtest | Gebaeude-Schimmel bleibt schimmel_risiko | PASS | schimmel_risiko |\n| TF2: Todesfall | Death-Flag in briefing_risiko | PASS | \"Achtung: Todesmeldung...\" |\n| TF2: Todesfall | Freigabe != geeignet | PASS | pruefen |\n| TF2: Negativtest | Normales Signal: kein Death-Flag | PASS | \"Kein erhöhtes Risiko...\" |\n| TF2: Negativtest | Normales Signal: geeignet moeglich | PASS | geeignet |\n| TF3: Normales Feuchte-Signal | Gebaeude-Schimmel: schimmel_risiko | PASS | schimmel_risiko |\n| TF3: Normales Feuchte-Signal | Score > 35 | PASS | 85 |\n| TF3: Normales Feuchte-Signal | FOOD_CONTEXT_KW inaktiv fuer Gebaeude | PASS | korrekt |\n| TF3: Normales Feuchte-Signal | feuchte-Kategorie ohne Schimmel | PASS | feuchte |\n| TF4: DB-Check | 163 Signale mit zurueckstellen | PASS | 163 Signale |\n| TF4: DB-Check | DEATH_KW importierbar | PASS | 20 Keywords |\n\n**Gesamt: 15/15 PASS**\n\n---", "text_hash": "7616a9a7c8a8d8bab5b1add3937785a181d54127872e16062efaac5028536dd6"}, {"chunk_key": "5dbe7530d8613fa71fd687cd8ee753e1150a73025c32a08fdaad753eea525dc0", "chunk_index": 17, "heading": "Zwischenfall: Bindestrich-Compound-Problem", "text": "ck | 163 Signale mit zurueckstellen | PASS | 163 Signale |\n| TF4: DB-Check | DEATH_KW importierbar | PASS | 20 Keywords |\n\n**Gesamt: 15/15 PASS**\n\n---\n## Zwischenfall: Bindestrich-Compound-Problem\n\nBeim ersten Test-Run scheiterte \"Rostocker Kinder bekommen Schimmel-Essen\" (1 FAIL).\n\n**Ursache:** `_hits()` splittet Texte an Sonderzeichen — Bindestrich macht aus \"Schimmel-Essen\" zwei separate Woerter \"schimmel\" und \"essen\". \"essen\" allein ist zu generisch als FOOD_CONTEXT_KW-Eintrag. FOOD_CONTEXT_KW hatte nur \"schulessen\" (ein Wort), aber nicht den Kompositum-Fall.\n\n**Loesung:** `re.search()` fuer Bindestrich-Komposita als zweite Pruefstufe. Damit abgedeckt: \"schimmel-essen\", \"schimmelessen\", \"gammel-essen\", \"gammelfleisch\".\n\n---", "text_hash": "069d2491204186027049e20deba860be1f6efb1701b54f4577be3ca6e9144e05"}, {"chunk_key": "6e12ea60e25b976743794953baa59ae0aa5d6b4f3b2a782604cf7850d715e71a", "chunk_index": 18, "heading": "Hinweise zur Vollstaendigkeit", "text": ".search()` fuer Bindestrich-Komposita als zweite Pruefstufe. Damit abgedeckt: \"schimmel-essen\", \"schimmelessen\", \"gammel-essen\", \"gammelfleisch\".\n\n---\n## Hinweise zur Vollstaendigkeit\n\n**Signale in DB noch NICHT neu klassifiziert:**\nDie bestehenden ~50-100 falsch klassifizierten Signale (Lebensmittel-Schimmel) haben in der DB noch `signal_category = schimmel_risiko`. Der Fix greift nur fuer NEU eingehende Signale. Fuer bestehende Signale: `rescore.py --live` ausfuehren (ausserhalb des Quickfix-Scope).\n\n**Briefing-Werte fuer bestehende Todesmeldungs-Signale:**\nAehnlich: bestehende Signale haben das alte `briefing_risiko`. Briefing-Run neu starten: `python3 content_briefing.py` (ausserhalb des Quickfix-Scope).\n\n---", "text_hash": "c8cc118e016a2fd0beb9009a0aa056b70354729cd3edc010862053778d43f06f"}, {"chunk_key": "67ee425e7f03bd8b13228a590d56e5cf0f4d3a8285c87b157c455bce9fd1042f", "chunk_index": 19, "heading": "Offene Punkte", "text": "ch: bestehende Signale haben das alte `briefing_risiko`. Briefing-Run neu starten: `python3 content_briefing.py` (ausserhalb des Quickfix-Scope).\n\n---\n## Offene Punkte", "text_hash": "61536c61a10816d709df120459ef8223670ca464ae95ae52236528e320bec907"}, {"chunk_key": "2af7f03d60c8d74d5fa0e98abc40fd92c69f3748f12d4d85da21d28a0e98a43d", "chunk_index": 20, "heading": "REGEL-02: Director/Briefing-Widerspruch", "text": "## Offene Punkte\n### REGEL-02: Director/Briefing-Widerspruch\n\n**Status: Nicht umgesetzt**\n\nAnalyse aus SOL_006_REPAIRABILITY_REPORT:\n- Ursache: Director laeuft VOR Briefing, kein Rueckkanal\n- Loesung A: `content_briefing.py → run()` — nach Briefing-Write, wenn freigabe=zurueckstellen, DB UPDATE director_action=beobachten (~5 Zeilen)\n- Loesung B: `cockpit.html → dirHtml` — visueller Overlay wenn b_freig != dir_action (~8 Zeilen JS)\n- Risiko: Reihenfolge Director → Briefing muss stabil bleiben (ist sie aktuell)\n- Naechste Session: umsetzen wenn REGEL-01 bis REGEL-03 stabil laufen", "text_hash": "ed89a8464d57761e58f951c2d31ee7e899330ab4653cb55e3e656e070f191f69"}, {"chunk_key": "d4dfe9039b2050ed936829e4eadf27bd97e284c6b26f25f436220880c5856d47", "chunk_index": 21, "heading": "REGEL-04: Mallorca-Relevanz zu weich", "text": "\n- Risiko: Reihenfolge Director → Briefing muss stabil bleiben (ist sie aktuell)\n- Naechste Session: umsetzen wenn REGEL-01 bis REGEL-03 stabil laufen\n### REGEL-04: Mallorca-Relevanz zu weich\n\n**Status: Nicht umgesetzt**\n\nAnalyse aus SOL_006_REPAIRABILITY_REPORT:\n- Ursache: mallorca_bonus_raw = 25 fuer jedes \"Mallorca\" im Text, positionsunabhaengig\n- Loesung: Position-Check — first_half = t[:len(t)//2], main_geo_primary nur wenn Mallorca im ersten Textteil\n- Risiko: Erfordert Voll-Rescore aller Signale in DB, und Test-Run vor Produktiv-Einsatz\n- Naechste Session: eigenstaendige Aenderung mit vorgelagertem Test-Batch\n\n---\n\n*Erstellt: 2026-05-28 | Autor: AG (Claude Sonnet 4.6)*\n*Tests: 15/15 PASS | Syntaxcheck: alle OK*", "text_hash": "8e829fb0e72737f18a09056b91626fbf288c8d6d8e228150bb615bf5892b1bec"}], "elapsed_s": 0.059}