Files
troupe-standup/wizard-work/sol/triage_seed_2026_09_26.check.py
T

60 lines
2.1 KiB
Python

#!/usr/bin/env python3
# CHECK -- re-derives the triage-seed-2026-09-26 classification from the
# raw seed and diffs it against the committed artifact. Exit 0 iff identical.
import json, re, sys
SEED = "/root/troupe-standup/inbox/seed-2026-09-26.json"
ART = "/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 = re.sub(r'\s+', ' ', ev.strip())
return __import__('hashlib').sha256(s.encode('utf-8')).hexdigest()
def derive():
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
return {"aggregate": {"total": len(items), "decided": len(d["decided"]),
"pending": len(d["pending"]), "tiers": tally}, "items": items}
a = json.load(open(ART))
e = derive()
errors = []
if a.get("aggregate") != e["aggregate"]:
errors.append("aggregate mismatch\n actual: %r\n expected: %r" % (a.get("aggregate"), e["aggregate"]))
if len(a.get("items", [])) != len(e["items"]):
errors.append("item count mismatch %d vs %d" % (len(a.get("items", [])), len(e["items"])))
for x, y in zip(a.get("items", []), e["items"]):
if x != y:
errors.append("item %s mismatch\n actual: %r\n expected: %r" % (x.get("id"), x, y))
if errors:
print("CHECK FAIL\n" + "\n".join(errors))
sys.exit(1)
print("CHECK PASS: 13/13 items identical to a re-derive of %s" % SEED)