update
This commit is contained in:
@@ -6,7 +6,6 @@ deterministisch, bestätigte Dubletten mergen (Zweitmeinung), Fremd/Unecht nur n
|
||||
Gegen-Judge entfernen (fail-open: Zweifel/Fehler → behalten). Lücken brauchen Recherche,
|
||||
Verwaiste den nächsten Board-2-Lauf — beides wird nur ausgewiesen."""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
@@ -47,7 +46,7 @@ async def repair_befunde(topic: str) -> dict:
|
||||
# blendete sub_dubletten aus und ließ die Note zwischen 10.0 und ~9 pendeln
|
||||
neu = await qa.qa_report(topic, llm=True)
|
||||
if neu:
|
||||
await asyncio.to_thread(qa._write_report, neu)
|
||||
await qa.write_report(neu)
|
||||
return {"hygiene": hygiene, "merges": merges, "sub_merges": sub_merges, "entfernt": entfernt,
|
||||
"aufgeraeumt": aufgeraeumt, "braucht_research": len(report.get("luecken", []))}
|
||||
|
||||
@@ -135,6 +134,31 @@ def _sub_gewinner(a: dict, b: dict) -> tuple[dict, dict]:
|
||||
return (a, b) if score(a) >= score(b) else (b, a)
|
||||
|
||||
|
||||
async def falte_sub(topic: str, files: dict, win: dict, lose: dict) -> None:
|
||||
"""Verlierer-Sub falten: Status variant, Fragen/Artefakte zum Gewinner umhängen (oder
|
||||
löschen, wenn der Typ dort existiert), Sidecar-Dateien bereinigen. Gemeinsamer Kern
|
||||
von QA-Repair und Cross-Block-Dedup (Board 2, Run-Ende) — win/lose sind subblocks-Rows."""
|
||||
await db.set_subblock_fields(topic, lose["block_norm"], lose["sub_norm"], status="variant")
|
||||
w_fragen = {r["sub_norm"] for r in await db.list_question_pattern(topic, win["block_norm"])}
|
||||
for r in await db.list_question_pattern(topic, lose["block_norm"]):
|
||||
if r["sub_norm"] != lose["sub_norm"]:
|
||||
continue
|
||||
if win["sub_norm"] not in w_fragen:
|
||||
await db.upsert_question_pattern(topic, win["block_norm"], win["sub_norm"],
|
||||
win["block"], win["sub_title"], r["question"])
|
||||
await db.delete_frage_row(topic, lose["block_norm"], lose["sub_norm"])
|
||||
w_typen = {r["type"] for r in await db.get_sub_artefakte(topic, block_norm=win["block_norm"])
|
||||
if r["sub_norm"] == win["sub_norm"]}
|
||||
for r in await db.get_sub_artefakte(topic, block_norm=lose["block_norm"]):
|
||||
if r["sub_norm"] != lose["sub_norm"]:
|
||||
continue
|
||||
if r["type"] not in w_typen:
|
||||
await db.put_sub_artifact(topic, win["block_norm"], win["sub_norm"], r["type"],
|
||||
r["data"], win["block"], win["sub_title"])
|
||||
await db.delete_artefakt_row(topic, lose["block_norm"], lose["sub_norm"], r["type"])
|
||||
_entferne_sub_in_files(files, lose["block_norm"], lose["sub_norm"])
|
||||
|
||||
|
||||
async def _merge_sub_dubletten(topic: str, report: dict, files: dict) -> list[str]:
|
||||
"""QA-bestätigte Sub-Paare (llm=ja) nach Zweitmeinung falten: Verlierer → variant,
|
||||
seine Fragen/Artefakte wandern zum Gewinner (oder fallen weg, wenn er den Typ hat).
|
||||
@@ -161,27 +185,8 @@ async def _merge_sub_dubletten(topic: str, report: dict, files: dict) -> list[st
|
||||
wk, lk = (win["block_norm"], win["sub_norm"]), (lose["block_norm"], lose["sub_norm"])
|
||||
if v.get(i) != "ja" or wk in gone or lk in gone:
|
||||
continue
|
||||
await db.set_subblock_fields(topic, lose["block_norm"], lose["sub_norm"], status="variant")
|
||||
await falte_sub(topic, files, win, lose)
|
||||
gone.add(lk)
|
||||
# Fragen/Artefakte des Verlierers: umhängen, wenn der Gewinner den Typ nicht hat
|
||||
w_fragen = {r["sub_norm"] for r in await db.list_question_pattern(topic, win["block_norm"])}
|
||||
for r in await db.list_question_pattern(topic, lose["block_norm"]):
|
||||
if r["sub_norm"] != lose["sub_norm"]:
|
||||
continue
|
||||
if win["sub_norm"] not in w_fragen:
|
||||
await db.upsert_question_pattern(topic, win["block_norm"], win["sub_norm"],
|
||||
win["block"], win["sub_title"], r["question"])
|
||||
await db.delete_frage_row(topic, lose["block_norm"], lose["sub_norm"])
|
||||
w_typen = {r["type"] for r in await db.get_sub_artefakte(topic, block_norm=win["block_norm"])
|
||||
if r["sub_norm"] == win["sub_norm"]}
|
||||
for r in await db.get_sub_artefakte(topic, block_norm=lose["block_norm"]):
|
||||
if r["sub_norm"] != lose["sub_norm"]:
|
||||
continue
|
||||
if r["type"] not in w_typen:
|
||||
await db.put_sub_artifact(topic, win["block_norm"], win["sub_norm"], r["type"],
|
||||
r["data"], win["block"], win["sub_title"])
|
||||
await db.delete_artefakt_row(topic, lose["block_norm"], lose["sub_norm"], r["type"])
|
||||
_entferne_sub_in_files(files, lose["block_norm"], lose["sub_norm"])
|
||||
merged.append(f"{lose['sub_title'][:40]} → {win['sub_title'][:40]}")
|
||||
return merged
|
||||
|
||||
|
||||
Reference in New Issue
Block a user