66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
import json, re, hashlib, datetime
|
|
|
|
SEED = "/root/troupe-standup/inbox/seed-2026-09-26.json"
|
|
OUT = "/root/troupe-standup/wizard-work/sol/triage-seed-2026-09-26.json"
|
|
|
|
def grade_of(ev):
|
|
m = re.search(r'Grade:\s*([A-Za-z0-9 ()+-]+)', ev)
|
|
return m.group(1).strip() if m else None
|
|
|
|
def has_flag(ev):
|
|
return bool(re.search(r'Flag\s+\d+\s+of\s+\d+', ev))
|
|
|
|
def tier_of(ev):
|
|
if grade_of(ev):
|
|
return "explicit_grade"
|
|
if has_flag(ev):
|
|
return "flag_only"
|
|
return "unannotated"
|
|
|
|
def sha256_norm(ev):
|
|
s = ev.strip()
|
|
s = re.sub(r'\s+', ' ', s)
|
|
return hashlib.sha256(s.encode('utf-8')).hexdigest()
|
|
|
|
d = json.load(open(SEED))
|
|
items = []
|
|
for it in d["decided"] + d["pending"]:
|
|
ev = it.get("evidence") or ""
|
|
items.append({
|
|
"id": it["id"],
|
|
"escalated_by": it["escalated_by"],
|
|
"tier": tier_of(ev),
|
|
"grade": grade_of(ev) or "",
|
|
"has_flag": has_flag(ev),
|
|
"sha256_evidence": sha256_norm(ev),
|
|
"summary_head": (it.get("summary") or "")[:120],
|
|
})
|
|
|
|
tally = {}
|
|
for it in items:
|
|
tally[it["tier"]] = tally.get(it["tier"], 0) + 1
|
|
|
|
out = {
|
|
"artifact": "triage-seed-2026-09-26.json",
|
|
"source": "inbox/seed-2026-09-26.json",
|
|
"generated_at": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
"lane": "Triage - everyday Q&A and classification",
|
|
"aggregate": {
|
|
"total": len(items),
|
|
"decided": len(d["decided"]),
|
|
"pending": len(d["pending"]),
|
|
"tiers": tally,
|
|
},
|
|
"items": items,
|
|
}
|
|
|
|
with open(OUT, "w") as f:
|
|
json.dump(out, f, indent=2)
|
|
|
|
print("id | escalated_by | tier | grade | sha256prefix")
|
|
for it in items:
|
|
print(f"{it['id']} | {it['escalated_by']} | {it['tier']} | {it['grade']!r} | {it['sha256_evidence'][:12]}")
|
|
print("tally:", tally)
|
|
print("wrote", OUT)
|