from pathlib import Path
repls={
'/opt/struktur/social-media-radar/content_director.py':(
''' relevance = assess_mas_relevance(" ".join(str(sig.get(k) or "") for k in ("topic", "short_summary", "source_name")), fields={k: sig.get(k) for k in ("topic", "short_summary", "source_name", "source_url", "signal_category")})''',
''' # Fachliche Relevanz darf ausschließlich aus dem Signalinhalt stammen.
# Quelle, Suchphrase und Provenienz sind keine Evidenz.
relevance = assess_mas_relevance(
"",
fields={"topic": sig.get("topic"), "short_summary": sig.get("short_summary")},
)'''),
'/opt/struktur/social-media-agent/publish_ready.py':(
'''def _persist(signal: dict, fb: str, li: str, topic: str, cta: str, assessment: Assessment, media_refs: list[str]) -> dict:
con = sqlite3.connect(CASES_DB)''',
'''def _persist(signal: dict, fb: str, li: str, topic: str, cta: str, assessment: Assessment, media_refs: list[str]) -> dict:
# Letzte Schreibsperre direkt vor jeder Package-/Draft-Persistenz.
if not signal.get("evergreen"):
eligible, reason = _relevance_gate(signal)
if not eligible:
raise ValueError("MAS-Content-Gate blockiert: " + reason)
con = sqlite3.connect(CASES_DB)'''),
}
for fn,(old,new) in repls.items():
p=Path(fn); s=p.read_text()
if old not in s: raise SystemExit(f'pattern missing: {fn}')
p.write_text(s.replace(old,new,1))
# Insert helper before get_packages
p=Path('/opt/struktur/social-media-agent/publish_ready.py'); s=p.read_text()
marker='\ndef get_packages(*, package_status: str | None = None, limit: int = 100) -> list[dict]:\n'
helper='''\ndef _relevance_gate(signal: dict) -> tuple[bool, str]:
"""Kanonischer, fail-closed Gate für persistierte MAS-Signale."""
sys.path.insert(0, str(RADAR_DIR))
from mas_relevance import content_eligibility
return content_eligibility(signal)
'''
if marker not in s: raise SystemExit('get_packages marker missing')
p.write_text(s.replace(marker,'\n'+helper+'def get_packages(*, package_status: str | None = None, limit: int = 100) -> list[dict]:\n',1))