"""Zeigt den Stand des laufenden Paper-Runners aus seinem Protokoll: Zeilen je Art, letzter Takt, Phase, Killswitch. Liest nur. Gibt keine Kontowerte aus, nur Zaehler, Zeiten, Phase, Zustand und Stueckzahl der Position. Aufruf: python runner_stand.py [] (ohne Angabe das neueste *-paper.jsonl im echten Projektordner) """ import json import sys from collections import Counter from pathlib import Path ORDNER = Path("/mnt/d/Claude/Code Projekte/active - Trading Plattform/artifacts/paper") ZEIGEN = ("zeit", "phase", "killswitch", "zustand", "position", "frisch", "letzte_kerze", "aktion", "stufe", "grund", "exit_code") def main() -> int: if len(sys.argv) > 1: pfad = Path(sys.argv[1]) else: kandidaten = sorted(ORDNER.glob("*-paper.jsonl"), key=lambda p: p.stat().st_mtime) if not kandidaten: print("kein Protokoll gefunden") return 3 pfad = kandidaten[-1] zeilen = [] with open(pfad, encoding="utf-8") as datei: for zeile in datei: if zeile.strip(): try: zeilen.append(json.loads(zeile)) except ValueError: pass print(f"protokoll: {pfad.name}, {len(zeilen)} Zeilen") arten = Counter(str(z.get("art")) for z in zeilen) print("zeilen je art:", dict(arten)) if zeilen: print("schluessel der ersten zeile:", sorted(zeilen[0])) takte = [z for z in zeilen if z.get("art") == "takt"] if takte: print("schluessel einer taktzeile:", sorted(takte[-1])) print("phasen:", dict(Counter(str(z.get("phase")) for z in takte))) print("killswitch:", dict(Counter(str(z.get("killswitch")) for z in takte))) letzter = takte[-1] print("letzter takt:", {k: letzter[k] for k in ZEIGEN if k in letzter}) for z in zeilen: if z.get("art") in ("order", "ende", "stoerung", "abbruch", "grenze"): print(z.get("art"), {k: z[k] for k in ZEIGEN + ("seite", "menge", "status") if k in z}) return 0 if __name__ == "__main__": raise SystemExit(main())