Files
2026-10-30 10:46:26 +00:00

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])