This commit is contained in:
team3
2026-07-06 17:32:52 +02:00
parent cc27e53b9e
commit 73ac3e532f
19 changed files with 565 additions and 523 deletions

View File

@@ -1613,11 +1613,60 @@ async def _mirror_sidecar_db(topic: str, sidecar: dict) -> None:
async def _guide_ebene(topic: str, instructions: str, provider: str, is_cancelled, set_p) -> None:
"""Guide-Ebene der Auto-Sequenz: generieren → QA → „Befunde beheben"-Loop bis
100 %/Stillstand/10×. Fail-open: Fehler überspringen den Guide, blockieren nichts."""
import uuid
from datetime import datetime, timezone
try:
import guide, guide_qa, guide_board
from auto_loop import auto_repair_loop
fmt = "Guide"
now = datetime.now(timezone.utc).isoformat()
guide_id = str(uuid.uuid4())
await db.create_guide({"id": guide_id, "topic": topic, "format": fmt,
"instructions": instructions, "status": "queued",
"progress": None, "created_at": now, "updated_at": now})
set_p("Guide wird generiert…")
await guide.generate_guide(guide_id, topic, fmt, instructions, provider)
if is_cancelled():
return
async def _messen():
rep = await guide_qa.guide_qa_report(topic, llm=True)
return float(rep["note_guide"]) if rep else 10.0
erst = await _messen()
async def _reparieren():
set_p("Befunde beheben (Guide)…")
await guide_board.repair_karten(topic, fmt) # befundtragende Karten → pruefer
await guide.generate_guide(topic=topic, format_name=fmt, guide_id=guide_id,
instructions=instructions, provider=provider) # resumt offene Karten
return await _messen()
res = await auto_repair_loop("Guide", erst, _reparieren)
if res["grund"] != "fertig":
msg = (f"Guide bleibt bei {round(res['note'] * 10)} % ({res['grund']}, "
f"{res['runden']} Runden) — «Befunde beheben» hat keinen Pfad (Systemfehler)")
_blocks_errors[topic] = msg
set_p(msg)
else:
set_p(f"Guide: 100 % nach {res['runden']} Runde(n)")
except Exception as e:
log.exception("[%s] Guide-Ebene fehlgeschlagen", topic)
_blocks_errors[topic] = f"Guide-Ebene: {str(e)[:500]}"
async def generate_blocks(topic: str, instructions: str = "", provider: str = DEFAULT_PROVIDER,
research: bool = True, qa_force: bool = False) -> None:
research: bool = True, qa_force: bool = False,
auto_inventory: bool = True, auto_artefacts: bool = True,
auto_guide: bool = True) -> None:
"""Kanban entry point: source prep, then both boards (inventory + artefacts) until
quiescence. research=False = Continue (drain the existing queue, no new search).
A run on a finished topic ADDS research (live extension) — full rebuild = DELETE /blocks."""
A run on a finished topic ADDS research (live extension) — full rebuild = DELETE /blocks.
auto_* per level: after each level's QA, loop „Befunde beheben" until 100 % / stall / 10×;
if off, stop after that level's QA (control point)."""
if topic in _blocks_progress:
return
_blocks_progress[topic] = "Warten…"
@@ -1646,10 +1695,16 @@ async def generate_blocks(topic: str, instructions: str = "", provider: str = DE
_blocks_errors[topic] = "Cancelled — progress is preserved"
return
import board_inventory # lazy: the boards import blocks
status: dict = {}
ok = await board_inventory.run_boards(ctx, set_p, files, q, folder, instructions,
research=research, qa_force=qa_force)
research=research, qa_force=qa_force,
auto_inventory=auto_inventory, auto_artefacts=auto_artefacts,
status_out=status)
if not ok and is_cancelled():
_blocks_errors[topic] = "Cancelled — progress is preserved"
elif ok and auto_guide and status.get("weiter") and not is_cancelled():
# Auto-Sequenz: Inventar + Artefakte liefen sauber durch → Guide-Ebene.
await _guide_ebene(topic, instructions, provider, is_cancelled, set_p)
except Exception as e:
log.exception("[%s] Blocks generation failed", topic)
_blocks_errors[topic] = str(e)[:2000]