from pathlib import Path
p=Path('/opt/struktur/social-media-agent/publish_ready.py'); s=p.read_text()
old='from codex_image_qa import CodexImageQAError, qa_passes, run_image_qa'
new='from codex_image_qa import CodexImageQAError, qa_passes, run_image_qa\nfrom human_feedback import feedback_prompt_text, save_variant_feedback'
assert s.count(old)==1; s=s.replace(old,new)
old='def fach_image_prompt(package: dict) -> str:'
new='def fach_image_prompt(package: dict, feedback_text: str = "") -> str:'
assert s.count(old)==1; s=s.replace(old,new)
old=''' "Comicstil, Icons, Diagramm-Fallback, Text im Bild, Fantasieschrift.")'''
new=''' "Comicstil, Icons, Diagramm-Fallback, Text im Bild, Fantasieschrift." + (f" Carlo-Erfahrungsbasis für passende Themen: {feedback_text}." if feedback_text else ""))'''
assert s.count(old)==1; s=s.replace(old,new)
# Add feedback fields to variant schema creation via ensure columns after index
needle=''' CREATE INDEX IF NOT EXISTS idx_package_image_variants_package ON package_image_variants(package_id,variant_order);'''
repl=needle+'''\n for column, definition in {"human_rating": "TEXT NOT NULL DEFAULT ''", "human_reason_verbatim": "TEXT NOT NULL DEFAULT ''", "human_reason_structured_json": "TEXT NOT NULL DEFAULT '{}'", "human_feedback_at": "TEXT NOT NULL DEFAULT ''", "human_feedback_by": "TEXT NOT NULL DEFAULT ''", "feedback_rules_json": "TEXT NOT NULL DEFAULT '[]'"}.items():\n _ensure_column(con, "package_image_variants", column, definition)'''
assert s.count(needle)==1; s=s.replace(needle,repl)
# Persist signature and insert columns
old='def persist_image_variant(con: sqlite3.Connection, package_id: str, group_id: str, order_no: int, generated: dict, prompt: str, qa: dict) -> str:'
new='def persist_image_variant(con: sqlite3.Connection, package_id: str, group_id: str, order_no: int, generated: dict, prompt: str, qa: dict, feedback_rules: list[dict] | None = None) -> str:'
assert s.count(old)==1; s=s.replace(old,new)
old=''' con.execute("INSERT INTO package_image_variants(variant_id,package_id,generation_group_id,variant_order,image_path,origin_path,file_type,file_bytes,sha256,generator,prompt,qa_status,qa_report_json,qa_failure_reasons,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", (variant_id, package_id, group_id, order_no, generated.get("path", ""), generated.get("origin_path", ""), generated.get("file_type", "PNG"), int(generated.get("bytes") or 0), generated.get("sha256", ""), "Codex built-in image_gen", prompt, "passed" if qa.get("overall") == "PASS" else "failed", json.dumps(qa, ensure_ascii=False), "; ".join(qa.get("failure_reasons", [])), _now()))'''
new=''' columns="variant_id,package_id,generation_group_id,variant_order,image_path,origin_path,file_type,file_bytes,sha256,generator,prompt,feedback_rules_json,qa_status,qa_report_json,qa_failure_reasons,created_at"
values=(variant_id, package_id, group_id, order_no, generated.get("path", ""), generated.get("origin_path", ""), generated.get("file_type", "PNG"), int(generated.get("bytes") or 0), generated.get("sha256", ""), "Codex built-in image_gen", prompt, json.dumps(feedback_rules or [], ensure_ascii=False), "passed" if qa.get("overall") == "PASS" else "failed", json.dumps(qa, ensure_ascii=False), "; ".join(qa.get("failure_reasons", [])), _now())
con.execute(f"INSERT INTO package_image_variants({columns}) VALUES ({','.join('?' for _ in values)})", values)'''
assert s.count(old)==1; s=s.replace(old,new)
# use feedback text in generation and persist
old=''' prompt_base = fach_image_prompt(package)
prompt_ok, prompt_reason = image_relevance_gate(package, prompt_base)'''
new=''' feedback_text, feedback_rules = feedback_prompt_text(package)
prompt_base = fach_image_prompt(package, feedback_text)
prompt_ok, prompt_reason = image_relevance_gate(package, prompt_base)'''
assert s.count(old)==1; s=s.replace(old,new)
old='persist_image_variant(con, package_id, generation_group_id, variant_no, generated, prompt, qa)'
new='persist_image_variant(con, package_id, generation_group_id, variant_no, generated, prompt, qa, feedback_rules)'
assert s.count(old)==1; s=s.replace(old,new)
p.write_text(s); print('integrated human feedback')