#!/usr/bin/env python3
import json, re, sys, pathlib
root=pathlib.Path(sys.argv[1] if len(sys.argv)>1 else ".").resolve()
errors=[]
required=[
"README.md","ADAPTATION-NOTE.md","canonical/00-KB-index.md","canonical/01-KB-principles-and-rule-hierarchy.md",
"canonical/02-KB-editorial-judgment-and-input-analysis.md","canonical/03-KB-sources-and-research.md",
"canonical/04-KB-verification.md","canonical/05-KB-fairness-independence-and-public-interest.md",
"canonical/06-KB-privacy-harm-and-sensitive-content.md","canonical/07-KB-corrections-and-accountability.md",
"canonical/08-KB-ai-editorial-governance.md","canonical/13-KB-workflows-output-control-and-escalation.md",
"canonical/90-KB-application-derivation.md","canonical/91-KB-sources-and-decisions.md",
"canonical/92-KB-tests-and-release-policy.md","governance/rule-registry.json",
"governance/source-registry.json","governance/tests.json"]
for rel in required:
    if not (root/rel).exists(): errors.append("missing:"+rel)
for rel in ["governance/rule-registry.json","governance/source-registry.json","governance/tests.json"]:
    try: json.load(open(root/rel,encoding="utf-8"))
    except Exception as e: errors.append("json:"+rel+":"+str(e))
ids=[]
for p in (root/"canonical").glob("*.md"):
    s=p.read_text(encoding="utf-8")
    ids += re.findall(r"^## ([A-Z]{2,4}-\d{3}):",s,re.M)
    ids += re.findall(r"<!-- EAS-KB rule: ([A-Z]{2,4}-\d{3}) -->",s)
    if re.search(r"(?m)^package:\s*",s): errors.append("development_frontmatter:"+p.name)
    if "<!-- transfer:" in s: errors.append("transfer_marker:"+p.name)
    if re.search(r"\*\*Origin:\*\*",s): errors.append("internal_origin_marker:"+p.name)
if len(ids)!=len(set(ids)): errors.append("duplicate_rule_ids")
try:
    registry=json.load(open(root/"governance/rule-registry.json",encoding="utf-8"))
    reg_ids=[r["rule_id"] for r in registry.get("rules",[])]
    if len(reg_ids)!=len(set(reg_ids)): errors.append("duplicate_rule_ids_registry")
    missing_in_markdown=sorted(set(reg_ids)-set(ids))
    missing_in_registry=sorted(set(ids)-set(reg_ids))
    if missing_in_markdown: errors.append("registry_ids_missing_in_markdown:"+",".join(missing_in_markdown))
    if missing_in_registry: errors.append("markdown_ids_missing_in_registry:"+",".join(missing_in_registry))
except Exception as e:
    errors.append("registry_check:"+str(e))
for d in ["internal-history","working-notes","development-reports"]:
    if (root/d).exists(): errors.append("internal_folder_present:"+d)
print(json.dumps({"ok":not errors,"errors":errors,"rule_ids_in_markdown":len(ids)},ensure_ascii=False,indent=2))
sys.exit(1 if errors else 0)
