fix(precedents): חילוץ מספר-תיק קנוני מהציטוט — לא ציטוט-מלא כמזהה (#137) #260

Merged
chaim merged 1 commits from worktree-case-number-from-citation into main 2026-06-15 03:22:18 +00:00
Owner

הבעיה (#137)

בהעלאה דרך "פסיקה-חסרה" (ענף ועדת-ערר), כשטופס case_number ריק המסלול נפל-לאחור לציטוט המלא:

committee_case_number = case_number.strip() or citation   # ← הבאג

כך מחרוזת-תצוגה עם שמות-צדדים הושתלה בשדה-המזהה — הפרת INV-ID2 (אין ציטוט-מלא כמזהה) ו-INV-ID1 (נרמול-בכתיבה) מ-X1. נצפה על precedent 1bf0bae0 (ערר 85074-04-25 רפאל לוי/חולון): case_number=85074/0425, case_name=ציטוט שלם.

התיקון (G1 — נרמול-במקור · G2 — שימוש-חוזר בפרסר הקנוני)

  1. court_citation.case_number_from_citation(citation) — מחזיר את אסימון-המספר המנורמל בלבד (דרך classify; '' כשאין מספר). חולץ נכון 85074-04-25 גם מתוך ערר (ת"א 85074-04-25) …. שימוש-חוזר בפרסר-הציטוט היחיד, בלי regex מקביל.
  2. web/app.py (ענף ועדת-ערר) — fallback דרך ההלפר; כשאין מספר → HTTPException 400 "נא להזין מספר-תיק ידנית", במקום השתלת ציטוט-מלא.
  3. db._canonical_case_number — מוקשח לחלץ את אסימון-המספר (זורק זנב שמות-צדדים), כך ששדה-המזהה לעולם לא נשמר מזוהם — גם בקריאה ישירה (committee + active cases). מספר נקי חוזר ללא שינוי; חודש לא מומצא (X1 §1).
  4. תיקון-נתוןscripts/fix_137_committee_case_number.py (בוצע על ה-DB החי): 1bf0bae0case_number=85074-04-25, case_name=צדדים, token ב-citation_formatted. אומת היחיד עם canon(num)≠num ב-internal_committee. אידמפוטנטי (re-run = no-op).

מחוץ-לתחום (follow-ups מתועדים)

  • מסלול external (precedent_library) משתמש בציטוט-מלא כמזהה-מורשת — זהו פריט-המיגרציה X1 §5 (138 רשומות external/cited_only עם קידומת), לא הבאג הזה. לא משונה כאן כדי לא לפתור-מחדש GAP ממופה / לשבור dedup.
  • prefill ב-UI של /missing-precedents — דורש שער Claude Design (web-ui/AGENTS.md).

בדיקות

  • test_court_citationcase_number_from_citation: הפשטת-צדדים / צורות / ריק.
  • test_canonical_case_number (חדש) — הקשחה: מספר-נקי ללא-שינוי, קידומת/זנב מוסרים, חודש-מורשת נשמר.
  • כל 339 בדיקות mcp-server עוברות. undefined-names + leak-guard נקיים.

Invariants

  • G1 — נרמול-במקור
  • INV-ID1 / INV-ID2 — מזהה מנורמל בכתיבה, אין ציטוט-מלא כמזהה
  • G2 — פרסר-ציטוט יחיד (אין regex מקביל)
  • G12 — leak-guard נקי

🤖 Generated with Claude Code

## הבעיה (#137) בהעלאה דרך "פסיקה-חסרה" (ענף ועדת-ערר), כשטופס `case_number` ריק המסלול נפל-לאחור לציטוט המלא: ```python committee_case_number = case_number.strip() or citation # ← הבאג ``` כך מחרוזת-תצוגה עם שמות-צדדים הושתלה בשדה-המזהה — הפרת **INV-ID2** (אין ציטוט-מלא כמזהה) ו-**INV-ID1** (נרמול-בכתיבה) מ-[X1](docs/spec/X1-identifiers.md). נצפה על precedent `1bf0bae0` (`ערר 85074-04-25` רפאל לוי/חולון): `case_number=85074/0425`, `case_name`=ציטוט שלם. ## התיקון (G1 — נרמול-במקור · G2 — שימוש-חוזר בפרסר הקנוני) 1. **`court_citation.case_number_from_citation(citation)`** — מחזיר את אסימון-המספר המנורמל בלבד (דרך `classify`; `''` כשאין מספר). חולץ נכון `85074-04-25` גם מתוך `ערר (ת"א 85074-04-25) …`. שימוש-חוזר בפרסר-הציטוט היחיד, **בלי regex מקביל**. 2. **`web/app.py`** (ענף ועדת-ערר) — fallback דרך ההלפר; כשאין מספר → `HTTPException 400` "נא להזין מספר-תיק ידנית", במקום השתלת ציטוט-מלא. 3. **`db._canonical_case_number`** — מוקשח לחלץ את אסימון-המספר (זורק זנב שמות-צדדים), כך ששדה-המזהה לעולם לא נשמר מזוהם — גם בקריאה ישירה (committee + active cases). מספר נקי חוזר ללא שינוי; **חודש לא מומצא** (X1 §1). 4. **תיקון-נתון** — `scripts/fix_137_committee_case_number.py` (**בוצע על ה-DB החי**): `1bf0bae0` → `case_number=85074-04-25`, `case_name`=צדדים, token ב-`citation_formatted`. אומת היחיד עם `canon(num)≠num` ב-`internal_committee`. אידמפוטנטי (re-run = no-op). ## מחוץ-לתחום (follow-ups מתועדים) - **מסלול external** (`precedent_library`) משתמש בציטוט-מלא כמזהה-מורשת — זהו **פריט-המיגרציה X1 §5** (138 רשומות external/cited_only עם קידומת), לא הבאג הזה. לא משונה כאן כדי לא לפתור-מחדש GAP ממופה / לשבור dedup. - **prefill ב-UI** של `/missing-precedents` — דורש שער Claude Design (web-ui/AGENTS.md). ## בדיקות - `test_court_citation` — `case_number_from_citation`: הפשטת-צדדים / צורות / ריק. - `test_canonical_case_number` (חדש) — הקשחה: מספר-נקי ללא-שינוי, קידומת/זנב מוסרים, חודש-מורשת נשמר. - כל **339** בדיקות mcp-server עוברות. `undefined-names` + `leak-guard` נקיים. ## Invariants - ✅ **G1** — נרמול-במקור - ✅ **INV-ID1 / INV-ID2** — מזהה מנורמל בכתיבה, אין ציטוט-מלא כמזהה - ✅ **G2** — פרסר-ציטוט יחיד (אין regex מקביל) - ✅ **G12** — leak-guard נקי 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-15 03:21:38 +00:00
fix(precedents): חילוץ מספר-תיק קנוני מהציטוט — לא ציטוט-מלא כמזהה (#137)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 14s
c27987ba72
בהעלאה דרך "פסיקה-חסרה" (ענף ועדת-ערר), כשטופס case_number ריק המסלול נפל-לאחור
לציטוט המלא (committee_case_number = case_number.strip() or citation), כך שמחרוזת-
תצוגה עם שמות-צדדים הושתלה בשדה-המזהה — הפרת INV-ID2/INV-ID1 (X1). נצפה על
precedent 1bf0bae0 (ערר 85074-04-25 רפאל לוי/חולון): case_number=85074/0425,
case_name=ציטוט שלם.

תיקון (G1 — נרמול-במקור, G2 — שימוש-חוזר בפרסר הקנוני):
- court_citation.case_number_from_citation(citation) — מחזיר את אסימון-המספר
  המנורמל בלבד (classify; '' כשאין מספר). חולץ נכון 85074-04-25 גם מתוך
  "ערר (ת\"א 85074-04-25) ...". reuse של הפרסר היחיד, בלי regex מקביל.
- web/app.py (ענף ועדת-ערר): fallback דרך case_number_from_citation; אם אין
  מספר — HTTPException 400 "נא להזין מספר-תיק ידנית" במקום השתלת ציטוט-מלא.
- db._canonical_case_number: מוקשח לחלץ את אסימון-המספר (זורק זנב שמות-צדדים),
  כך ששדה-המזהה לעולם לא נשמר מזוהם — גם בקריאה ישירה (committee + active cases).
  מספר נקי חוזר ללא שינוי; חודש לא מומצא (X1 §1).
- תיקון-נתון: scripts/fix_137_committee_case_number.py (בוצע) — 1bf0bae0:
  case_number→85074-04-25, case_name→צדדים, token ב-citation_formatted.
  אומת היחיד עם canon(num)≠num ב-internal_committee. אידמפוטנטי.

מחוץ-לתחום (תועד כ-follow-up): מסלול external (precedent_library) משתמש בציטוט-
מלא כמזהה-מורשת — זהו פריט-המיגרציה X1 §5 (138 רשומות external/cited_only),
לא הבאג הזה. prefill ב-UI של /missing-precedents — דורש שער Claude Design.

בדיקות: test_court_citation (case_number_from_citation: party-strip/forms/empty),
test_canonical_case_number (harden). כל 339 בדיקות mcp עוברות. guards נקיים.

Invariants: G1 (נרמול-במקור), INV-ID1/ID2 (מזהה מנורמל, אין ציטוט-מלא כמזהה),
G2 (פרסר יחיד), G12 (leak-guard נקי).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit e552d831bd into main 2026-06-15 03:22:18 +00:00
chaim deleted branch worktree-case-number-from-citation 2026-06-15 03: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#260