import re, json
def sets(path):
    src=open(path).read(); out={}
    for n in ["CORE","IRRELEVANT","FILM_INDUSTRY","NON_CORE","DEAD","OFFTOPIC","HEALTH","AI_NEWS"]:
        m=re.search(n+r"\s*=\s*[\[\{](.*?)[\]\}]",src,re.S)
        if m: out[n]=re.findall(r'"([^"]+)"',m.group(1))
    return out
R=sets("/home/kiro/.hermes/scripts/x-account-monitor-run.py")
A=sets("/home/kiro/.hermes/scripts/x-account-monitor-analyze.py")
for d,nm in ((R,"runner"),(A,"analyze")):
    print(nm, {k:len(v) for k,v in d.items()})
    dups=[k for k,v in d.items() if len(v)!=len(set(v))]
    print("  dups:",dups)
core=set(R["CORE"]); irr=set(R["IRRELEVANT"]); nc=set(R["NON_CORE"]); film=set(R["FILM_INDUSTRY"]); dead=set(R["DEAD"])
print("overlaps core&irr",core&irr,"core&nc",core&nc,"core&film",core&film,"irr&nc",irr&nc,"dead&core",dead&core)
print("analyze core==runner core:", set(A.get("CORE",[]))==core)
print("analyze irr subset of runner irr:", set(A["IRRELEVANT"])<=irr, "missing from analyze:", sorted(irr-set(A["IRRELEVANT"])))
# recompute core board with new sets
d=json.load(open("/home/kiro/trend-engine/trends/x/raw/scan_results_2026-11-08_FULL.json"))
q=d["qualifying"]
def sc(x): return x["likes"]+x["rt"]*2+x["replies"]*3+x["views"]/100
b={"core":[],"film":[],"irr":[],"nc":[],"other":[]}
for x in q:
    h=x["handle"]
    if h in film: b["film"].append(x)
    elif h in nc or h in irr or h in A.get("OFFTOPIC",[]) or h in A.get("HEALTH",[]): b["irr"].append(x) if h in irr else b["nc"].append(x)
    elif h in core: b["core"].append(x)
    else: b["other"].append(x)
print("buckets",{k:len(v) for k,v in b.items()}, "sum", sum(len(v) for v in b.values()), "of", len(q))
print("unclassified handles:", sorted({x['handle'] for x in b['other']}))
cs=sorted(b["core"],key=sc,reverse=True)
for i,x in enumerate(cs[:11],1):
    print(f"{i}. @{x['handle']} {x['likes']}L/{x['views']}V score={sc(x):.0f} rate={x['likes']/max(x['views'],1)*100:.2f}%")
print("cutoff10", f"{sc(cs[9]):.0f}", "rank11", f"{sc(cs[10]):.0f}")
