58 lines
2.5 KiB
Python
58 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""diagnose parse divergence against the pinned ground truth."""
|
|
import importlib.util
|
|
import json, re, sys
|
|
|
|
QUEUE = "/root/troupe-standup/WORK-QUEUE.md"
|
|
SPEC = importlib.util.spec_from_file_location(
|
|
"queue_extract", "/root/troupe-standup/wizard-work/ledger/queue-extract.py")
|
|
qe = importlib.util.module_from_spec(SPEC)
|
|
SPEC.loader.exec_module(qe)
|
|
|
|
QUEUE = "/root/troupe-standup/WORK-QUEUE.md"
|
|
BEGIN = "<!-- queue-index:begin -->"
|
|
END = "<!-- queue-index:end -->"
|
|
doc = open("/root/troupe-standup/docs/queue-index.md", encoding="utf-8").read()
|
|
body = doc.split(BEGIN, 1)[1].split(END, 1)[0]
|
|
m = re.search(r"```json\n(.*?)\n```", body, re.S)
|
|
pinned = json.loads(m.group(1))
|
|
|
|
mine, _, _ = qe.extract()
|
|
|
|
mine_by_key = {(it["id"], it["line"]): it for it in mine}
|
|
pin_by_key = {(it["id"], it["line"]): it for it in pinned["items"]}
|
|
|
|
print("mine=%d pinned=%d" % (len(mine), len(pinned["items"])))
|
|
print("kind mine:", dict((k, sum(1 for v in mine if v["kind"] == k)) for k in ("heading", "record")))
|
|
print("kind pin:", dict((k, sum(1 for v in pinned["items"] if v["kind"] == k)) for k in ("heading", "record")))
|
|
print("role mine:", dict((k, sum(1 for v in mine if v["role"] == k)) for k in ("opening", "continuation", "record")))
|
|
print("role pin:", dict((k, sum(1 for v in pinned["items"] if v["role"] == k)) for k in ("opening", "continuation", "record")))
|
|
|
|
only_mine = [k for k in mine_by_key if k not in pin_by_key]
|
|
only_pin = [k for k in pin_by_key if k not in mine_by_key]
|
|
print("only in mine:", len(only_mine), only_mine)
|
|
print("only in pin:", len(only_pin), only_pin[:40])
|
|
|
|
# shared keys: role mismatch
|
|
role_mismatch = []
|
|
for k in set(mine_by_key) & set(pin_by_key):
|
|
a, b = mine_by_key[k], pin_by_key[k]
|
|
if a["role"] != b["role"] or a["role_detail"] != b["role_detail"]:
|
|
role_mismatch.append((k, a, b))
|
|
print("role mismatches:", len(role_mismatch))
|
|
for k, a, b in role_mismatch[:40]:
|
|
print(" %s mine_role=%s pin_role=%s mine_det=%r pin_det=%r mine_off=%r pin_off=%r" %
|
|
(k, a["role"], b["role"], a["role_detail"], b["role_detail"], a.get("status_line"), b.get("status_line")))
|
|
|
|
# size discrepancy beyond 195/227: compare byte sums
|
|
print("mine byte sum:", sum(it["bytes"] for it in mine))
|
|
print("pin byte sum:", sum(it["bytes"] for it in pinned["items"]))
|
|
|
|
# sample of mine-only items and pin-only items
|
|
print("\n--- mine-only sample ---")
|
|
for k in only_mine[:20]:
|
|
print(" ", k, mine_by_key[k])
|
|
print("--- pin-only sample ---")
|
|
for k in only_pin[:20]:
|
|
print(" ", k, pin_by_key[k])
|