fix(precedents): נרמול case_number עמיד-להתנגשות — מדלג ומתעד, לא קורס (#145) #266

Merged
chaim merged 1 commits from worktree-backfill-citations-run into main 2026-06-15 04:17:39 +00:00
Owner

הבעיה

ה-backfill של citation_formatted (PR #262) חשף קריסה ב-apply_to_record: כשפסק-דין חיצוני מכיל docket שכבר שייך לרשומה כפולה אחרת, נרמול case_number → docket-נקי נתקל ב-uq_case_law_external_number (אינדקס-יחיד חלקי על non-internal) ומפיל את כל המיזוג — כולל הציטוט. הריצה הראשונה נעצרה אחרי 57 פסקים על 'ע"א 3213/97' → '3213/97' (כפילות נקר, שכבר קיימת מנורמלת עם ציטוט).

התיקון (שורש + הקשחה)

  • db.case_number_collides(case_number, exclude_id) — בודק אם docket כבר שייך לרשומה לא-internal_committee אחרת.
  • apply_to_record — מדלג על נרמול ה-case_number כשיש התנגשות (כפילות לדדופ בעתיד, לא ענייננו בריצה הזו) וממשיך לכתוב את הציטוט ושאר השדות. no-silent-swallow: מתעד warning.
  • scripts/backfill_precedent_citations.pytry/except per-row + מונה שגיאות, כך ששורה בודדת לא מפילה את האצווה.

אימות (ריצה-מחדש מלאה, idempotent)

  • 0 שגיאות, 0 קריסות. ההתנגשות תועדה ודולגה: case_number normalization 'ע"א 3213/97'→'3213/97' skipped — docket already owned by another non-internal row.
  • פסיקת בית-משפט: 224/228 מולאו (109 חדשים בריצה זו); ועדת-ערר 91/91; נותרו 4 פסקים + 31 cited-only שנמנעו נכון (חסר צדדים/תאריך/full_text — abstention, INV-AH, ללא המצאה).
  • דוגמאות: עע"ם 5886/24 **אאורה... נ' הוועדה הארצית...** (נבו 25.12.2024), עמ"נ 56975-09-23 **הוועדה המקומית ת"א-יפו... נ' בלו מרבל בע"מ** (נבו 28.5.2026).
  • pytest test_fu2b_reconcile.py ✓ · py_compile ✓.

הערה: מקצת הקידומות יורשות שיבוש-OCR מהמקור (עמייםעמ"נ מקולקל) — ניתן-לתיקון נקודתי ע"י היו"ר ב-/precedents/[id].

Invariants

  • INV-AH — abstention על חוסר רכיב, אפס המצאה.
  • G1 — נרמול-בכתיבה של case_number נשמר; השינוי רק מונע קריסה בהתנגשות.
  • חוקה §6 — אין בליעה שקטה: הדילוג מתועד warning.

🤖 Generated with Claude Code

## הבעיה ה-backfill של `citation_formatted` (PR #262) חשף קריסה ב-`apply_to_record`: כשפסק-דין חיצוני מכיל docket שכבר שייך לרשומה **כפולה** אחרת, נרמול `case_number` → docket-נקי נתקל ב-`uq_case_law_external_number` (אינדקס-יחיד חלקי על non-internal) ומפיל את **כל** המיזוג — כולל הציטוט. הריצה הראשונה נעצרה אחרי 57 פסקים על `'ע"א 3213/97' → '3213/97'` (כפילות נקר, שכבר קיימת מנורמלת עם ציטוט). ## התיקון (שורש + הקשחה) - **`db.case_number_collides(case_number, exclude_id)`** — בודק אם docket כבר שייך לרשומה לא-`internal_committee` אחרת. - **`apply_to_record`** — מדלג על נרמול ה-`case_number` כשיש התנגשות (כפילות לדדופ בעתיד, לא ענייננו בריצה הזו) וממשיך לכתוב את הציטוט ושאר השדות. **no-silent-swallow:** מתעד `warning`. - **`scripts/backfill_precedent_citations.py`** — `try/except` per-row + מונה שגיאות, כך ששורה בודדת לא מפילה את האצווה. ## אימות (ריצה-מחדש מלאה, idempotent) - **0 שגיאות, 0 קריסות.** ההתנגשות תועדה ודולגה: `case_number normalization 'ע"א 3213/97'→'3213/97' skipped — docket already owned by another non-internal row`. - **פסיקת בית-משפט: 224/228 מולאו** (109 חדשים בריצה זו); ועדת-ערר 91/91; נותרו 4 פסקים + 31 cited-only שנמנעו נכון (חסר צדדים/תאריך/full_text — abstention, INV-AH, ללא המצאה). - דוגמאות: `עע"ם 5886/24 **אאורה... נ' הוועדה הארצית...** (נבו 25.12.2024)`, `עמ"נ 56975-09-23 **הוועדה המקומית ת"א-יפו... נ' בלו מרבל בע"מ** (נבו 28.5.2026)`. - `pytest test_fu2b_reconcile.py` ✓ · `py_compile` ✓. הערה: מקצת הקידומות יורשות שיבוש-OCR מהמקור (`עמיים` ≈ `עמ"נ` מקולקל) — ניתן-לתיקון נקודתי ע"י היו"ר ב-`/precedents/[id]`. ## Invariants - **INV-AH** — abstention על חוסר רכיב, אפס המצאה. - **G1** — נרמול-בכתיבה של `case_number` נשמר; השינוי רק מונע קריסה בהתנגשות. - **חוקה §6** — אין בליעה שקטה: הדילוג מתועד `warning`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-15 04:17:34 +00:00
fix(precedents): נרמול case_number עמיד-להתנגשות — מדלג ומתעד, לא קורס (#145)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 11s
a02b929b5c
ה-backfill של citation_formatted חשף קריסה ב-apply_to_record: כשפסק-דין
חיצוני מכיל docket שכבר שייך לרשומה כפולה אחרת, נרמול case_number → docket-נקי
נתקל ב-uq_case_law_external_number ומפיל את כל המיזוג (כולל הציטוט).
דוגמה: 'ע"א 3213/97' → '3213/97' שכבר קיים (כפילות נקר).

- db.case_number_collides(case_number, exclude_id) — בודק אם docket כבר שייך
  לרשומה לא-internal אחרת (האינדקס החלקי).
- apply_to_record — מדלג על נרמול ה-case_number כשיש התנגשות (כפילות לדדופ
  בהמשך, לא ענייננו כאן) וממשיך לכתוב את הציטוט. no-silent-swallow: מתעד warning.
- scripts/backfill_precedent_citations.py — try/except per-row + מונה שגיאות,
  כך ששורה אחת לא מפילה את האצווה.

אומת: ריצה-מחדש מלאה ללא קריסה (0 שגיאות); ההתנגשות תועדה ודולגה כצפוי;
פסיקת בית-משפט: 224/228 מולאו, 4 נמנעו (חסר צדדים/תאריך — abstention, INV-AH).
test_fu2b_reconcile ✓.

Invariants: INV-AH (abstention) · G1 (נרמול-בכתיבה נשמר, רק לא קורס) ·
חוקה §6 (אין בליעה שקטה — דילוג מתועד).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 9e45e5a46d into main 2026-06-15 04:17:39 +00:00
chaim deleted branch worktree-backfill-citations-run 2026-06-15 04:17:39 +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#266