"""AA-045-F3 Patch fuer content_briefing.py – Version 3 mit exakten Ankern."""
p = "/opt/struktur/social-media-radar/content_briefing.py"
s = open(p).read()
# 1. run()-Signatur + Auswahl
old1 = '''def run(limit: int = 500, action_filter: str = "pruefen"):
conn = sqlite3.connect(str(DB_PATH))
conn.row_factory = sqlite3.Row
ensure_columns(conn)
rows = conn.execute(
"SELECT * FROM signals WHERE director_action = ? ORDER BY director_score DESC LIMIT ?",
(action_filter, limit)
).fetchall()'''
new1 = '''def run(limit: int = 500, action_filter: str = ""):
"""AA-045-F3: Briefings fuer ALLE postbaren Signale ohne Briefing.
Idempotent: vorhandene Briefings werden nicht ueberschrieben.
Auswahl: status postbar, mallorca_relevance > 0, briefing_winkel leer.
action_filter gesetzt => altes Verhalten (nur diese director_action).
"""
conn = sqlite3.connect(str(DB_PATH))
conn.row_factory = sqlite3.Row
ensure_columns(conn)
if action_filter:
rows = conn.execute(
"SELECT * FROM signals WHERE director_action = ? ORDER BY director_score DESC LIMIT ?",
(action_filter, limit)
).fetchall()
else:
rows = conn.execute(
"""
SELECT * FROM signals
WHERE status NOT IN ('ignoriert', 'veroeffentlicht')
AND COALESCE(mallorca_relevance, 0) > 0
AND COALESCE(briefing_winkel, '') = ''
ORDER BY radar_score DESC LIMIT ?
""",
(limit,)
).fetchall()'''
assert old1 in s, "anchor1"
s = s.replace(old1, new1)
# 2. Loop mit Fehlerbehandlung
old2 = ''' freigabe_dist = {}
for sig in rows:
result = compute_briefing(dict(sig))
conn.execute("""
UPDATE signals SET
briefing_winkel = ?,
briefing_nutzen = ?,
briefing_zielgruppe = ?,
briefing_post_typ = ?,
briefing_fb_fit = ?,
briefing_fb_reason = ?,
briefing_li_fit = ?,
briefing_li_reason = ?,
briefing_material = ?,
briefing_risiko = ?,
briefing_freigabe = ?
WHERE signal_id = ?
""", (
result["briefing_winkel"],
result["briefing_nutzen"],
result["briefing_zielgruppe"],
result["briefing_post_typ"],
result["briefing_fb_fit"],
result["briefing_fb_reason"],
result["briefing_li_fit"],
result["briefing_li_reason"],
result["briefing_material"],
result["briefing_risiko"],
result["briefing_freigabe"],
sig["signal_id"],
))
freigabe_dist[result["briefing_freigabe"]] = freigabe_dist.get(result["briefing_freigabe"], 0) + 1
# SOL-006 REGEL-02: Briefing-Freigabe neutralisiert Director
# Wenn Briefing zurueckstellt oder verwirft, darf Director nicht aktiv entscheiden.
# director_action wird auf 'beobachten' gesetzt — nur wenn aktuell aktiv (pruefen/veroeffentlichen).
if result["briefing_freigabe"] in ("zurueckstellen", "verwerfen"):
conn.execute(
"UPDATE signals SET director_action = 'beobachten' "
"WHERE signal_id = ? AND director_action IN ('pruefen', 'veroeffentlichen')",
(sig["signal_id"],)
)
conn.commit()'''
new2 = ''' freigabe_dist = {}
errors = 0
for sig in rows:
try:
result = compute_briefing(dict(sig))
conn.execute("UPDATE signals SET briefing_error = '' WHERE signal_id = ?",
(sig["signal_id"],))
conn.execute("""
UPDATE signals SET
briefing_winkel = ?,
briefing_nutzen = ?,
briefing_zielgruppe = ?,
briefing_post_typ = ?,
briefing_fb_fit = ?,
briefing_fb_reason = ?,
briefing_li_fit = ?,
briefing_li_reason = ?,
briefing_material = ?,
briefing_risiko = ?,
briefing_freigabe = ?
WHERE signal_id = ?
""", (
result["briefing_winkel"],
result["briefing_nutzen"],
result["briefing_zielgruppe"],
result["briefing_post_typ"],
result["briefing_fb_fit"],
result["briefing_fb_reason"],
result["briefing_li_fit"],
result["briefing_li_reason"],
result["briefing_material"],
result["briefing_risiko"],
result["briefing_freigabe"],
sig["signal_id"],
))
freigabe_dist[result["briefing_freigabe"]] = freigabe_dist.get(result["briefing_freigabe"], 0) + 1
# SOL-006 REGEL-02: Briefing-Freigabe neutralisiert Director
if result["briefing_freigabe"] in ("zurueckstellen", "verwerfen"):
conn.execute(
"UPDATE signals SET director_action = 'beobachten' "
"WHERE signal_id = ? AND director_action IN ('pruefen', 'veroeffentlichen')",
(sig["signal_id"],)
)
except Exception as exc:
# AA-045-F3: expliziter Fehlerstatus; Retry beim naechsten Lauf
errors += 1
try:
conn.execute(
"UPDATE signals SET briefing_error = ? WHERE signal_id = ?",
(f"briefing-failed: {exc}"[:400], sig["signal_id"])
)
except Exception:
pass
conn.commit()'''
assert old2 in s, "anchor2"
s = s.replace(old2, new2)
# 3. Summary
old3 = ''' print(f"\\n[CONTENT-BRIEFING] Fertig.")'''
new3 = ''' print(f"\\n[CONTENT-BRIEFING] Fertig. fehler={errors}")'''
assert old3 in s, "anchor3"
s = s.replace(old3, new3)
open(p, "w").write(s)
print("content_briefing.py gepatcht v3")