"""Fidelity 0 des Trainers: Fake-E2E-Lauf im Subprozess — Sekunden, null Tokens. Misst mit den CREATOR_PARAMS des Kandidaten: (a) halten die Invarianten? (b) wie viele Agenten-Calls erzeugt die Struktur (Proxy für Tokens/Laufzeit)? Unsinnige Kandidaten fallen hier raus, bevor ein echter Lauf Geld kostet. CLI: python3 train_f0.py (CREATOR_PARAMS im ENV) """ import asyncio import json import sys import tempfile import time from pathlib import Path # WICHTIG: config (mit CREATOR_PARAMS) lädt vor allen Pipeline-Modulen import database from fake_agents import Welt, aktivieren from fsutil import atomic_write_json async def f0(out: str) -> None: tmp = Path(tempfile.mkdtemp(prefix="train-f0-")) database.DB_PATH = tmp / "f0.db" database._db = None await database.init_db() welt = Welt() aktivieren(welt) import board_inventory as bi import qa qa.QA_DIR = tmp / "qa" from pipeline import GenContext work = tmp / "arbeit" work.mkdir() files = {"arbeit": work, "final": tmp / "blocks.md", "sub_roh": tmp / "sub_roh.json", "sidecar": tmp / "subblocks.json", "facts": tmp / "facts.json", "question_pattern": tmp / "question_pattern.json", "artefakte": tmp / "artefakte.json", "outline": tmp / "outline.json", "outline_slots": [tmp / f"outline-{i}.json" for i in (1, 2, 3)], "research": [work / f"research-{i}.md" for i in (1, 2, 3, 4, 5)]} ctx = GenContext(topic="f0", provider="claude", is_cancelled=lambda: False) start = time.monotonic() ok = await asyncio.wait_for( bi.run_boards(ctx, lambda *a, **k: None, files, {"type": "thema"}, None, "", research=True, qa_force=True), timeout=180) from tests.invarianten import pruefe_invarianten fehler = await pruefe_invarianten("f0", files) atomic_write_json(Path(out), { "ok": bool(ok), "invarianten_fehler": fehler, "calls": len(welt.calls), "dauer_s": round(time.monotonic() - start, 1)}, indent=1) await database.close_db() if __name__ == "__main__": if len(sys.argv) != 2: raise SystemExit("Nutzung: python3 train_f0.py ") asyncio.run(f0(sys.argv[1]))