from pathlib import Path
p=Path('/opt/struktur/social-media-agent/publish_ready.py'); s=p.read_text()
needle='''def record_publication_event(package_id: str, platform: str, event_status: str, *, published_at: str = "", external_url: str = "", external_post_id: str = "", note: str = "") -> dict:'''
helper='''def load_experience_rows(limit: int = 3) -> list[dict]:
con = sqlite3.connect(f"file:{CASES_DB.as_posix()}?mode=ro", uri=True); con.row_factory = sqlite3.Row
try:
rows = [dict(r) for r in con.execute("SELECT * FROM mas_experiences WHERE usage_status='available' AND anonymization_status='anonymized' AND evidence_status='documented' ORDER BY updated_at DESC LIMIT ?", (limit,))]
except sqlite3.OperationalError:
rows = []
con.close(); return rows
def experience_to_signal(experience: dict) -> dict:
pillar = _text(experience.get("content_pillar")) or "feuchte_schimmel"
category = "schimmel_risiko" if "schimmel" in pillar or "feuchte" in pillar else "feuchte"
return {
"signal_id": experience["experience_id"], "experience_id": experience["experience_id"], "source_type": "mas_experience",
"source_name": "MAS Experience Pool", "source_url": "", "provenance_path": _text(experience.get("source_ref")),
"topic": _text(experience.get("title")), "topic_de": _text(experience.get("title")), "signal_category": category,
"content_pillar": pillar, "short_summary": _text(experience.get("core_claim")),
"evidence_summary": _text(experience.get("technical_observation")), "relevance": _text(experience.get("core_claim")),
"briefing_winkel": _text(experience.get("title")), "briefing_nutzen": _text(experience.get("core_claim")),
"briefing_freigabe": "geeignet", "briefing_risiko": "Keine personenbezogenen Angaben; Ursachen als Möglichkeit kennzeichnen.",
"cta_type": "messung" if "feuchte" in pillar or "schimmel" in pillar else "objektpruefung",
"mallorca_relevance": 1, "radar_score": 55, "evidence_complete": True, "transformed": True,
"evergreen": False, "image_url": "", "image_found": 0, "image_prompt": "",
"experience_fact": json.loads(experience.get("fact_json") or "{}"),
"experience_inference": json.loads(experience.get("inference_json") or "{}"),
"experience_unknown": json.loads(experience.get("unknown_json") or "{}"),
}
def select_experiences(limit: int = 3) -> list[dict]:
rows = load_experience_rows(limit=limit)
selected=[]; seen=set()
try:
con=sqlite3.connect(f"file:{CASES_DB.as_posix()}?mode=ro",uri=True)
existing=[_text(r[0]).casefold() for r in con.execute("select topic from publication_packages")]
con.close()
except sqlite3.Error: existing=[]
for row in rows:
key=re.sub(r"\\W+"," ",_text(row.get("title")).casefold()).strip()
if not key or key in seen or key in existing: continue
seen.add(key); selected.append(experience_to_signal(row))
return selected
def record_publication_event(package_id: str, platform: str, event_status: str, *, published_at: str = "", external_url: str = "", external_post_id: str = "", note: str = "") -> dict:'''
assert s.count(needle)==1; s=s.replace(needle,helper)
# add experiences in run
old=''' current = select_current_transformations(rows, limit=1)
evergreen_entries = select_evergreen_entries(limit=2)
selected = current + [build_evergreen_candidate(entry) for entry in evergreen_entries]'''
new=''' current = select_current_transformations(rows, limit=1)
evergreen_entries = select_evergreen_entries(limit=2)
experience_candidates = select_experiences(limit=3)
selected = current + [build_evergreen_candidate(entry) for entry in evergreen_entries] + experience_candidates'''
assert s.count(old)==1; s=s.replace(old,new)
# refresh branch needs variable
old=''' selected = select_existing_quality_refresh(limit=5)
else:'''
new=''' selected = select_existing_quality_refresh(limit=5)
experience_candidates = []
else:'''
assert s.count(old)==1; s=s.replace(old,new)
# Return counts
old='''"evergreen_candidates": len(evergreen_entries) if not refresh_quality else len([s for s in selected if s.get("evergreen")]), "publish_ready": len(packages),'''
new='''"evergreen_candidates": len(evergreen_entries) if not refresh_quality else len([s for s in selected if s.get("evergreen")]), "experience_candidates": len(experience_candidates) if not refresh_quality else 0, "publish_ready": len(packages),'''
assert s.count(old)==1; s=s.replace(old,new)
p.write_text(s); print('experience source integrated')