feat(graph): research-gap (ghost) nodes (corpus graph PR C) #131

Merged
chaim merged 1 commits from worktree-graph-gaps into main 2026-06-07 21:22:19 +00:00
Owner

PR C מתוך 4. הופך את הגרף למאתר-פערים: 247 הציטוטים הלא-פתורים (פסיקת-קורפוס מצטטת פסיקה שאינה בקורפוס) מתכווצים ל-230 נקודות-gap ייחודיות — כל אחת בגודל = כמה פסיקות-קורפוס מצטטות אותה = הפסיקה החסרה המבוקשת ביותר.

Backend (read-only, G2):

  • "gap" ל-VALID_NODE_TYPES (לא default → כבוי אלא אם מבוקש).
  • _gap_nodes_and_edges(): gap:<citation מנורמל> מ-precedent_internal_citations WHERE cited_case_law_id IS NULL, בגודל in-degree גלובלי; קשתות cites רק מפסיקות שבתצוגה (dangling-edge invariant נשמר). העשרה best-effort מ-missing_precedents (התאמת citation מנורמל מדויקת) → gap_status + missing_precedent_id. אומת: 230 gaps, מוביל ע"א 3213/97 (5 ציטוטים), 230/230 הותאמו ל-missing_precedents.
  • GraphNode += gap_status, missing_precedent_id. מטריקות מתעלמות מקשתות-gap. אין שינוי ב-app.py (מגודר ב-node_types).

Frontend:

  • toggle "חוסרי מחקר (פסיקה חסרה)" (כבוי).
  • graph-canvas: gaps כעיגול חלול מקווקו חיוור, לא נצבע ע"י color-by, בגודל ציטוטים.
  • graph-node-panel: ענף gap — "מצוטטת ע״י N פסיקות" + badge סטטוס + קישור ל-/missing-precedents.

build+lint עוברים. Invariants: G2 · UI2. api:types אחרי deploy.

🤖 Generated with Claude Code

PR C מתוך 4. הופך את הגרף ל**מאתר-פערים**: 247 הציטוטים הלא-פתורים (פסיקת-קורפוס מצטטת פסיקה שאינה בקורפוס) מתכווצים ל-**230 נקודות-`gap`** ייחודיות — כל אחת בגודל = כמה פסיקות-קורפוס מצטטות אותה = **הפסיקה החסרה המבוקשת ביותר**. **Backend (read-only, G2):** - `"gap"` ל-`VALID_NODE_TYPES` (לא default → כבוי אלא אם מבוקש). - `_gap_nodes_and_edges()`: `gap:<citation מנורמל>` מ-`precedent_internal_citations WHERE cited_case_law_id IS NULL`, בגודל in-degree גלובלי; קשתות `cites` רק מפסיקות שבתצוגה (dangling-edge invariant נשמר). העשרה best-effort מ-`missing_precedents` (התאמת citation מנורמל מדויקת) → `gap_status` + `missing_precedent_id`. **אומת: 230 gaps, מוביל ע"א 3213/97 (5 ציטוטים), 230/230 הותאמו ל-missing_precedents.** - `GraphNode` += `gap_status`, `missing_precedent_id`. מטריקות מתעלמות מקשתות-gap. אין שינוי ב-app.py (מגודר ב-node_types). **Frontend:** - toggle "חוסרי מחקר (פסיקה חסרה)" (כבוי). - `graph-canvas`: gaps כעיגול **חלול מקווקו חיוור**, לא נצבע ע"י color-by, בגודל ציטוטים. - `graph-node-panel`: ענף gap — "מצוטטת ע״י N פסיקות" + badge סטטוס + קישור ל-`/missing-precedents`. build+lint עוברים. Invariants: G2 · UI2. `api:types` אחרי deploy. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-07 21:22:14 +00:00
Turns the graph into a gap-finder: the 247 unresolved internal citations
(a corpus precedent cites a ruling NOT in the corpus) collapse to 230 distinct
"gap" nodes — each sized by how many corpus precedents cite it, i.e. the
most-wanted missing precedent.

Backend (web/graph_api.py — read-only, G2):
- "gap" added to VALID_NODE_TYPES (NOT default → off unless requested).
- New _gap_nodes_and_edges(): gap:<normalized citation> nodes from
  precedent_internal_citations WHERE cited_case_law_id IS NULL, sized by global
  in-degree; cites edges only from precedents present in the view (dangling-edge
  invariant holds). Best-effort enrichment from missing_precedents via exact
  normalized-citation match → gap_status + missing_precedent_id. Validated:
  230 gaps, top ע"א 3213/97 (cited 5×), 230/230 matched to missing_precedents.
- GraphNode += gap_status, missing_precedent_id. Metrics correctly exclude gap
  edges (target not a precedent). No app.py change (gated via node_types).

Frontend:
- graph.ts: GraphNodeType += "gap"; node fields.
- graph-filter-panel: toggle "חוסרי מחקר (פסיקה חסרה)" (off by default).
- graph-canvas: gaps render as faint hollow dashed circles, never recoloured
  by color-by; sized by citation count.
- graph-node-panel: gap branch — "מצוטטת ע״י N פסיקות" + status badge + link
  to /missing-precedents.

web-ui build + lint pass. Invariants: G2 (SELECT-only), UI2 (model grows on
explicit Pydantic). api:types post-deploy.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 8dc0a268fb into main 2026-06-07 21:22:19 +00:00
chaim deleted branch worktree-graph-gaps 2026-06-07 21:22:19 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#131