#!/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 = "" 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])