fix(precedents): normalize citation→docket case_number + enforce source_type↔precedent_level #256

Merged
chaim merged 1 commits from worktree-precedent-casenum-sourcetype into main 2026-06-14 20:57:34 +00:00
Owner

הבעיה (התגלתה בתיק 1132-09-24, הועלה דרך "פסקה חסרה")

  1. case_number = ציטוט-מלא במקום דוקט נקי. overwrite_case_number=True הועבר רק לנתיב-הפנימי (internal_decisions.py:282); נתיב-הדריינר ל-external (process_pending_extractions) השאיר את הציטוט שב-case_number (precedent_library.py:73 שם citation כ-case_number). היקף: 122 רשומות external_upload.
  2. source_type לא נאכף מול precedent_level — רק ה-prompt ביקש מה-LLM. כש-LLM פלט level=ועדת_ערר_מחוזית אך source_type=court_ruling, ההחלטה סווגה בספרייה כ"פסיקת בית משפט" במקום ועדת-ערר.

התיקון (ב-apply_to_record — כל הנתיבים נהנים)

  • case_number מנורמל לדוקט הנקי כש-(א) caller כופה, או (ב) הערך הנוכחי ציטוט-צורני (רווח / אורך>20). guard _is_clean_docket מבטיח שלעולם לא נכתב ערך לא-דוקט לשדה-הזהות — LLM-זבל נדחה.
  • _source_type_for_level גוזר source_type מ-precedent_level ודורס אי-עקביות (ועדת_ערר_*appeals_committee; עליון/מנהליcourt_ruling). מקור-אמת דטרמיניסטי, לא הישענות על עקביות-LLM.

בדיקות

  • 18 unit-tests_is_clean_docket (דוקטים תקפים / ציטוטים / זבל) + _source_type_for_level.
  • 3 integration-tests מול apply_to_record עם DB מדומה: נרמול-ציטוט, אי-דריסת-דוקט-תקין, דחיית-זבל, אכיפת-עקביות.
  • py_compile נקי.

היקף-דאטה

  • תיקון-נקודתי כבר בוצע ידנית ל-1132-09-24.
  • Backfill ל-122 ירוץ אחרי המיזוג (TaskMaster #141).

Invariants

  • G1 (תיקון-במקור) · G2 (אותו extractor — בלי מסלול מקביל) · INV-AH (סיווג דטרמיניסטי, לא ניחוש-LLM) · G11 (זהות-תיק נקייה).

🤖 Generated with Claude Code

## הבעיה (התגלתה בתיק 1132-09-24, הועלה דרך "פסקה חסרה") 1. **`case_number` = ציטוט-מלא** במקום דוקט נקי. `overwrite_case_number=True` הועבר רק לנתיב-הפנימי (`internal_decisions.py:282`); נתיב-הדריינר ל-external (`process_pending_extractions`) השאיר את הציטוט שב-`case_number` (`precedent_library.py:73` שם `citation` כ-`case_number`). **היקף: 122 רשומות external_upload.** 2. **`source_type` לא נאכף מול `precedent_level`** — רק ה-prompt ביקש מה-LLM. כש-LLM פלט `level=ועדת_ערר_מחוזית` אך `source_type=court_ruling`, ההחלטה סווגה בספרייה כ"פסיקת בית משפט" במקום ועדת-ערר. ## התיקון (ב-`apply_to_record` — כל הנתיבים נהנים) - **`case_number`** מנורמל לדוקט הנקי כש-(א) caller כופה, או (ב) הערך הנוכחי ציטוט-צורני (רווח / אורך>20). guard **`_is_clean_docket`** מבטיח שלעולם לא נכתב ערך לא-דוקט לשדה-הזהות — **LLM-זבל נדחה**. - **`_source_type_for_level`** גוזר `source_type` מ-`precedent_level` ודורס אי-עקביות (`ועדת_ערר_*`→`appeals_committee`; `עליון`/`מנהלי`→`court_ruling`). מקור-אמת דטרמיניסטי, לא הישענות על עקביות-LLM. ## בדיקות - **18 unit-tests** — `_is_clean_docket` (דוקטים תקפים / ציטוטים / זבל) + `_source_type_for_level`. - **3 integration-tests** מול `apply_to_record` עם DB מדומה: נרמול-ציטוט, אי-דריסת-דוקט-תקין, **דחיית-זבל**, אכיפת-עקביות. - `py_compile` נקי. ## היקף-דאטה - תיקון-נקודתי כבר בוצע ידנית ל-1132-09-24. - **Backfill ל-122** ירוץ אחרי המיזוג (TaskMaster #141). ## Invariants - **G1** (תיקון-במקור) · **G2** (אותו extractor — בלי מסלול מקביל) · **INV-AH** (סיווג דטרמיניסטי, לא ניחוש-LLM) · **G11** (זהות-תיק נקייה). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-14 20:57:29 +00:00
fix(precedents): normalize citation→docket case_number + enforce source_type↔precedent_level
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 3s
Lint — undefined names / undefined-names (pull_request) Successful in 12s
a05df3eb1a
שני באגים בקליטת-פסיקה חיצונית (התגלו בתיק 1132-09-24 שהועלה דרך "פסקה חסרה"):

1. case_number קיבל את מחרוזת-הציטוט המלאה במקום דוקט נקי. הסיבה: overwrite_case_number=True
   הועבר רק לנתיב-הפנימי (internal_decisions); נתיב-הדריינר ל-external השאיר את הציטוט שב-
   case_number (precedent_library: case_number=citation). היקף: 122 רשומות external_upload.
2. source_type לא נאכף מול precedent_level — רק ה-prompt ביקש מה-LLM. כשה-LLM פלט
   level=ועדת_ערר_מחוזית אך source_type=court_ruling, ההחלטה סווגה בספרייה כ"פסיקת בית משפט".

תיקון (ב-apply_to_record, כך שכל הנתיבים נהנים):
• case_number מנורמל לדוקט הנקי כש-(א) caller כופה או (ב) הערך הנוכחי ציטוט-צורני (רווח/אורך>20);
  guard _is_clean_docket מבטיח שלעולם לא נכתב ערך לא-דוקט לשדה-הזהות (LLM-זבל נדחה).
• _source_type_for_level גוזר source_type מ-precedent_level ודורס אי-עקביות (ועדת_ערר_*→
  appeals_committee; עליון/מנהלי→court_ruling) — מקור-אמת אחד, לא הישענות על עקביות-LLM.

נבדק: 18 unit-tests (docket-validation, level→type mapping) + 3 integration-tests מול
apply_to_record עם DB מדומה (נרמול, אי-דריסת-דוקט-תקין, דחיית-זבל, אכיפת-עקביות). py_compile נקי.
תיקון-נקודתי כבר בוצע ידנית ל-1132-09-24. Backfill ל-122 בנפרד (TaskMaster #141).

Invariants: G1 (תיקון-במקור), G2 (אותו extractor — בלי מסלול מקביל), INV-AH (מקור-אמת
דטרמיניסטי לסיווג, לא ניחוש-LLM). G11 (זהות-תיק נקייה).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 7f9f502f29 into main 2026-06-14 20:57:34 +00:00
chaim deleted branch worktree-precedent-casenum-sourcetype 2026-06-14 20:57:35 +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#256