"""이번 주행 전체를 훑어 이상을 찾는다 — 재시도·빈 응답·비대 호출·미분류."""
import json,re,sys,datetime as dt
from collections import Counter, defaultdict
sys.path.insert(0,"/Users/manta/Documents/Projects/TheRoad-I1/scratchpad")
from _opik_env import opik_target
from tools.opik_prompt_audit.audit.fetch import fetch_spans
B,W,P=opik_target()
sp=fetch_spans(B,W,P,"2026-08-24T19:00:00","2026-12-31T00:00:00")
print(f"이번 주행(19:00 UTC~) span {len(sp)}건\n")

step=Counter(); size=defaultdict(int); n=defaultdict(int)
empty=[]; retry=Counter(); notag=0; err=[]
def txt(v): return "" if v is None else (v if isinstance(v,str) else json.dumps(v,ensure_ascii=False))
for x in sp:
    tags=x.get("tags") or []
    op=next((t[3:] for t in tags if t.startswith("op:")), None)
    if not op: notag+=1; continue
    step[op]+=1
    i,o = txt(x.get("input")), txt(x.get("output"))
    size[op]+=len(i); n[op]+=1
    if len(o)<80: empty.append((op, x["start_time"][:19], len(o), o[:60]))
    for t in tags:
        if t in ("retry_same","fallback_gpt","primary"): retry[(op,t)]+=1
    if x.get("error_info"): err.append((op, str(x.get("error_info"))[:100]))

print(f"{'스텝':<32}{'호출':>5}{'입력 평균':>10}{'입력 합계':>12}")
for k,c in sorted(step.items(), key=lambda kv:-size[kv[0]])[:14]:
    print(f"{k:<32}{c:>5}{size[k]//max(n[k],1):>9,}자{size[k]:>11,}자")
tot=sum(size.values())
print(f"\n입력 총량 {tot:,}자 · 태그 없는 span {notag}건")

print(f"\n── 재시도·fallback (primary 아닌 것) ──")
alt={k:v for k,v in retry.items() if k[1]!="primary"}
print("  " + (", ".join(f"{k[0]}:{k[1]}×{v}" for k,v in sorted(alt.items())) if alt else "없음"))

print(f"\n── 빈/짧은 응답 {len(empty)}건 ──")
for op,ts,l,o in empty[:8]:
    print(f"  {op:<28}{ts}  {l}자  {o!r}")

print(f"\n── error_info {len(err)}건 ──")
for op,e in err[:6]: print(f"  {op:<28}{e}")
