"""QA→Repair-Loop-Primitiv, DB-frei. Drei Abbruchbedingungen (Lektion 77): Ziel erreicht / echter Stillstand (nichts bewegt UND keine Verbesserung) / hartes Limit. Transiente Verschlechterung ist erlaubt — eine bewegte Runde darf die Note kurzfristig senken.""" import logging from config import LOOP_MAX_ITER log = logging.getLogger("creator2.auto_loop") VOLL = 10.0 async def auto_repair_loop(ebene: str, erst_note: float, reparieren, max_iter: int = LOOP_MAX_ITER) -> tuple[float, str]: """reparieren() → (neue_note, bewegt). → (note, grund fertig|stillstand|limit).""" note = erst_note for i in range(max_iter): if note >= VOLL: return note, "fertig" neue_note, bewegt = await reparieren() log.info("%s: Iteration %d — Note %.1f → %.1f, bewegt=%s", ebene, i + 1, note, neue_note, bewegt) if not bewegt and neue_note <= note: return neue_note, "stillstand" note = neue_note return note, "fertig" if note >= VOLL else "limit"