62 lines
2.7 KiB
Python
62 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Principle-level gold matching driver (importance layer #153, component 1).
|
|
|
|
Flags the specific principle a chair relied on (gold_chair / chair_cited) or a
|
|
digest highlights (gold_digest), by embedding-matching match_context /
|
|
headline_holding to the cited precedent's principles. EMBEDDING-ONLY (no LLM).
|
|
All logic in services/principle_gold (reused by the periodic refresh job, G2).
|
|
|
|
cd ~/legal-ai/mcp-server
|
|
HOME=/home/chaim .venv/bin/python ../scripts/compute_principle_gold.py # dry-run
|
|
HOME=/home/chaim .venv/bin/python ../scripts/compute_principle_gold.py --apply # write flags
|
|
HOME=/home/chaim .venv/bin/python ../scripts/compute_principle_gold.py --threshold 0.75
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import asyncio
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "mcp-server", "src"))
|
|
|
|
from legal_mcp.services import principle_gold # noqa: E402
|
|
|
|
|
|
async def _run(apply: bool, threshold: float | None) -> int:
|
|
mode = "APPLY" if apply else "DRY-RUN"
|
|
print(f"[{mode}] principle-level gold matching (embedding-only)\n", flush=True)
|
|
s = await principle_gold.match_all(threshold=threshold, apply=apply)
|
|
print(f"threshold: {s['threshold']}")
|
|
print(f"\nchair citations processed: {s['chair_citations']}")
|
|
print(f" → gold_chair (our chair, tier-1): {s['gold_chair']}")
|
|
print(f" → chair_cited (other chair, tier-2): {s['chair_cited']}")
|
|
print(f" → no match ≥ threshold: {s['chair_no_match']}")
|
|
print(f"\ndigests processed: {s['digests']}")
|
|
print(f" → gold_digest (tier-1): {s['gold_digest']}")
|
|
print(f" → no match ≥ threshold: {s['digest_no_match']}")
|
|
if s.get("samples"):
|
|
print("\nsample matches (label · sim · halacha):")
|
|
for m in s["samples"]:
|
|
print(f" {m['label']:<18} sim={m['sim']} {m['halacha_id'][:8]}")
|
|
if s.get("coverage"):
|
|
c = s["coverage"]
|
|
print(f"\n── coverage (live original principles: {c['live_original']}) ──")
|
|
print(f" protected (gold_chair OR gold_digest): {c['protected']}")
|
|
print(f" gold_chair={c['gold_chair']} gold_digest={c['gold_digest']} chair_cited={c['chair_cited']}")
|
|
if not apply:
|
|
print("\ndry-run — no flags written. Re-run with --apply to commit.")
|
|
return 0
|
|
|
|
|
|
def main() -> int:
|
|
p = argparse.ArgumentParser(description="Principle-level gold matching (#153)")
|
|
p.add_argument("--apply", action="store_true", help="write gold flags (idempotent)")
|
|
p.add_argument("--threshold", type=float, default=None, help="override match cosine floor")
|
|
a = p.parse_args()
|
|
return asyncio.run(_run(a.apply, a.threshold))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|