# ממצאי ביקורת — ארכיטקטורת קורפוס־הפסיקה + מצב הדאטה בפועל

> **מקור:** Claude (Opus 4.8) · **תאריך:** 2026-06-20 · **קונטקסט:** חקירה לקראת תכנון־מחדש של קורפוס־הפסיקה.
> מסמך זה הוא **אחד מכמה** קלטי־סוכנים שחיים אוסף; ייעודו להזין את שלב־הסינתזה. אינו תכנית — הוא **אבחון**.
>
> **שאלת־המוצא של חיים:** "הקורפוס נבנה מראש לא נכון, אני כל הזמן מתעסק בתיקונים. האם כדאי ליצור מחדש את קורפוס־הפסיקה ולהתחיל דף נקי?"
>
> **המודל הרצוי (כפי שחיים תיאר אותו):** מאגר פסקי־דין והחלטות ועדות־ערר; חוקר־התקדימים מזהה בשלב ניתוח־הערר פס"ד/החלטות שדנו במקרה דומה או הלכה דומה; הסוכן־הכותב משייך ומזכיר אותם בפרק הדיון וההכרעה בסגנון דפנה. שלושה מקורות־הזנה: (1) החלטות דפנה עצמה, (2) ועדות־ערר אחרות שמצטטות פסיקה, (3) פס"ד עליון/מחוזי.

---

## 0. תקציר־מנהלים (TL;DR)

**מה ש"בנוי לא נכון" אינו הסכמה — היא שכבת־הביצוע.** הסכמה כבר תואמת בדיוק את המודל שחיים תיאר: טבלה אחת (`case_law`) ששלושת המקורות נכנסים אליה דרך `source_kind`/`source_type`; שלושת ה־`search_*` הם שלושה *מסננים* על אותו מקור, לא שלושה מאגרים מקבילים (G2 מקוים ברמת־הסכמה). **רֵבילד של הסכמה ייצר בדיוק את אותה סכמה** — ולכן אינו פותר דבר, ומסכן ב־second-system syndrome.

מה שכן מחולל את "התיקונים האינסופיים" — שלושה כשלי־ביצוע מדידים:
1. **חוזה־קליטה רופף** → 66% מהפסיקה בלי `practice_area`, 31 רשומות ריקות, אכיפת־שלמות (INV-DM1) מופרת בפועל.
2. **צינור הלכות→קנוני מייצר רעש** → 5,472 קנוני, מתוכם 5,456 סינגלטונים, **0 published** → השכבה שאמורה להזין את הכותב (INV-G10) **אינרטית לגמרי**.
3. **כפילות `style_corpus`** → 55 החלטות דפנה חיות בשני נתיבי־אחזור.

**המלצה:** לא לשרוף את הסכמה. כן לבצע "איפוס שכבות־נגזרות" צר (truncate ל-chunks+halachot+canonical והרצה־מחדש), **אבל רק אחרי תיקון החוזה והסף** — אחרת מחזירים את אותו בלגן (G1: תיקון במקור, לא בקריאה). מסמכי־המקור (363 רשומות, 332 עם full_text) נשמרים; הם יקרים ו/או ניתנים לקליטה־מחדש מ־PDF.

---

## 1. מצב הדאטה בפועל (שאילתות חיות מול legal_ai @ localhost:5433, 2026-06-20)

```
┌─────────────────────────────────────┬─────────┬──────────────────────────────────┐
│ Metric                              │ Count   │ Reading                          │
├─────────────────────────────────────┼─────────┼──────────────────────────────────┤
│ case_law (total precedents)         │   363   │ קטן — re-ingestable              │
│   • external_upload (court rulings) │   240   │ מקור (3) — עליון/מחוזי           │
│   • internal_committee (ועדות ערר)  │    92   │ מקור (1)+(2)                     │
│   • (יתר — ללא source_kind מובהק)   │    31   │ = הרשומות הריקות (ראה למטה)      │
│ style_corpus (החלטות דפנה)          │    55   │ כפילות עם internal_committee     │
│ precedent_chunks                    │ 11,904  │ נגזר — מתחדש מ-full_text         │
│ halachot (total)                    │  5,489  │ נגזר                             │
│   • approved/published              │  1,352  │ 25% בלבד                         │
│   • pending_review (backlog ידני)   │  2,402  │ 44% — צוואר־בקבוק                │
│ canonical_halachot (V41)            │  5,472  │ כמעט 1:1 עם halachot ⚠️           │
│   • singletons (instance_count=1)   │  5,456  │ דה־דופ כמעט לא קרה                │
│   • merged (instance_count>=2)      │    16   │ 0.3% מיזוג                       │
│   • published (מגיע לסוכן הכותב)    │     0   │ ⚠️ השכבה אינרטית לחלוטין          │
│ case_law w/o practice_area          │   240   │ 66% — חופף-בדיוק לפסיקה החיצונית │
│ case_law missing summary            │    27   │                                  │
│ case_law w/ 0 chunks / no full_text │    31   │ רשומות שבורות/ריקות              │
│ distinct practice_area              │     4   │ rishuy/betterment/197/(ריק)      │
└─────────────────────────────────────┴─────────┴──────────────────────────────────┘

practice_area breakdown:
  (ריק)            240   ← כל הפסיקה החיצונית ללא סיווג
  rishuy_uvniya     70
  betterment_levy   50
  compensation_197   3
```

**קריאות מפתח:**
- **240 = 240:** מספר הפסיקה־החיצונית שווה־בדיוק למספר חסרי־`practice_area`. כלומר אף פס"ד חיצוני לא סווג לתחום — סינון לפי תחום באחזור פשוט לא עובד עליהם.
- **5,456 / 5,472 סינגלטונים:** מנוע הקנוניזציה (V41) רץ אך לא מאחד. סף 0.85 כנראה הדוק מדי, או שהחילוץ מנסח כל הלכה ייחודית מספיק כדי לא להתלכד.
- **0 published canonical:** לפי INV-G10 רק קנוני `published` מגיע לכתיבה. אפס. **כל מנגנון V41 כרגע מנותק מהכתיבה בפועל.**
- **2,402 pending_review:** צוואר־הבקבוק הוא אישור־אנושי ידני, לא טכנולוגיה.

---

## 2. מפת הארכיטקטורה — קורפוס אחד, שלושה מסננים

**פיזית: טבלה אחת.** כל שלושת המקורות מתכנסים ל-`case_law`, מתחתיה `precedent_chunks` (FK) ו-`halachot` (FK), ומעל ה-`halachot` שכבת `canonical_halachot` (V41).

```
        canonical_halachot   (עקרונות מאוחדים — V41; כיום אינרטי, 0 published)
              ▲ 1:many
         halachot            (מופע-להלכה per precedent; review_status gate)
              ▲ FK
         case_law            (רישום מרכזי — court rulings + ועדות-ערר)
         ├─ source_kind='external_upload'   → פס"ד עליון/מחוזי  [מקור 3]
         └─ source_kind='internal_committee'→ ועדות-ערר + דפנה   [מקור 1+2]
              ▼ FK
         precedent_chunks    (chunks + embedding vector(1024))

  בנפרד:
         style_corpus        (55 החלטות דפנה — נתיב-אחזור מקביל ל-search_decisions)
         document_chunks     (מסמכי-תיק + style; FK→documents→cases)
```

**שלושת נתיבי־האחזור (לא שלושה מאגרים — שלושה scopes):**

```
┌──────────────────────────────┬─────────────────────────┬────────────────────────────┐
│ Tool                         │ Table / filter          │ Purpose                    │
├──────────────────────────────┼─────────────────────────┼────────────────────────────┤
│ search_decisions             │ document_chunks         │ סגנון/קול: החלטות דפנה     │
│                              │ (scoped case/area)      │ + מסמכי-תיק                │
│ search_precedent_library     │ case_law + chunks/halach │ source_kind=external_upload│
│                              │ ot, source_kind filter  │ → פסיקה חיצונית            │
│ search_internal_decisions    │ אותן פונקציות DB,        │ source_kind=internal_      │
│                              │ source_kind אחר         │ committee → ועדות-ערר      │
└──────────────────────────────┴─────────────────────────┴────────────────────────────┘
```

שתי האחרונות קוראות **לאותן פונקציות DB** (`search_precedent_library_semantic`/`_lexical`) עם `source_kind` שונה. זו הפרדה־בשאילתה, לא קוד מקביל.

---

## 3. שלושת המקורות של חיים → איפה הם נופלים היום

```
┌────────────────────────────────────┬───────────────────────────────┬─────────────────────────┐
│ Source (חיים)                      │ Stored as                     │ Retrieval               │
├────────────────────────────────────┼───────────────────────────────┼─────────────────────────┤
│ (1) החלטות דפנה עצמה               │ style_corpus  +  (מהוגר ל-)   │ search_decisions  +     │
│                                    │ case_law internal_committee   │ search_internal_decisions│
│                                    │ chair_name='דפנה תמיר'        │ ← כפילות / נתיב-כפול     │
│ (2) ועדות-ערר אחרות                │ case_law internal_committee   │ search_internal_decisions│
│                                    │ chair_name=<אחר>, district     │                         │
│ (3) פס"ד עליון/מחוזי               │ case_law external_upload      │ search_precedent_library │
│                                    │ source_type='court_ruling'    │                         │
└────────────────────────────────────┴───────────────────────────────┴─────────────────────────┘
```

**מסקנה:** המודל המנטלי של חיים **כבר ממומש בסכמה**. אין צורך להמציא מבנה חדש — צריך לאכוף את המבנה הקיים בקליטה, ולחבר את שכבת־הקנוני לכתיבה.

---

## 4. הדיאגנוזה — מה "בנוי לא נכון" (3 מחוללי־כאב)

### 4.1 חוזה־קליטה רופף (root cause #1)
- 66% מהפסיקה ללא `practice_area`; 27 ללא summary; 31 ללא full_text/chunks.
- אין אכיפה ש"`searchable=false` עד שהמטא שלם" → INV-DM1 מופר בפועל.
- **כל העלאה מוסיפה חוב** במקום רשומה שלמה. זה המקור לתיקונים החוזרים.

### 4.2 צינור הלכות→קנוני מייצר רעש, לא ערך (root cause #2)
- 5,456/5,472 סינגלטונים → דה־דופ לא עובד (סף 0.85? ניסוח־חילוץ?).
- **0 published** → השכבה שאמורה להזין את הכותב (INV-G10) מנותקת.
- 2,402 בתור־אישור־ידני → הצינור מייצר מהר יותר ממה שאדם מאשר.
- **זה בולע את רוב זמן־התחזוקה.**

### 4.3 כפילות style_corpus (root cause #3)
- 55 החלטות דפנה בשני מקומות + שני נתיבי־אחזור.
- צריך מקור־אמת אחד: או `style_corpus` SoT וה-`case_law` נגזר, או הפוך.

---

## 5. ההמלצה — לא רֵבילד־סכמה; "איפוס שכבות־נגזרות" אחרי תיקון־חוזה

**אסור** לשרוף ולהעלות־מחדש את `case_law` — תבנה אותה סכמה ותאבד מטא־דאטה ידני. **כן** הגיוני רֵבילד צר של ה**נגזר**, אבל בסדר הזה (G1 — מקור לפני תסמין):

1. **קודם החוזה:** אכוף ב-`*_upload` שדות־חובה (practice_area, summary, full_text); כשל → `searchable=false`. נקה/מחק את 31 הריקות.
2. **תקן את הקנוניזציה:** כוונן סף 0.85, הגדר מתי `published`, ובדוק ניסוח־החילוץ. בלי זה אין טעם להריץ מחדש.
3. **רק אז** re-derive מהמקור הקיים: chunks → halachot → canonical.
4. **הכרע style_corpus:** מקור־אמת אחד.

**מתי רֵבילד־מלא כן מוצדק:** רק אם יתגלה שמסמכי־המקור עצמם (PDF/full_text של 363) פגומים/חסרים. המספרים *לא* מראים זאת (332/363 עם full_text תקין).

---

## 6. שאלות פתוחות לשלב־הסינתזה
- **למה 0 published בקנוני?** האם זה סף, ניסוח־חילוץ, או שפשוט אף אחד לא אישר? (קריטי — קובע אם V41 שמיש בכלל.)
- **style_corpus מול case_law:** מי SoT? (משפיע על search_decisions מול search_internal_decisions.)
- **practice_area לפסיקה חיצונית:** לחלץ אוטומטית בקליטה, או להשאיר ידני?
- **תור־האישור (2,402):** האם המנגנון (פאנל/active-learning, #133) יכול לסגור את הפער, או שצריך לחתוך את קצב־החילוץ?

---

## 7. נספח — קבצים מרכזיים (file:line)
- סכמה: `mcp-server/src/legal_mcp/services/db.py` (case_law, precedent_chunks, halachot, canonical_halachot)
- קליטה חיצונית: `mcp-server/src/legal_mcp/tools/precedent_library.py` (`precedent_library_upload`)
- קליטה פנימית: `mcp-server/src/legal_mcp/tools/internal_decisions.py` (`internal_decision_upload`)
- הגירת style→case_law: `mcp-server/src/legal_mcp/services/internal_decisions.py` (`migrate_from_style_corpus`, chair/district hardcoded)
- אחזור: `mcp-server/src/legal_mcp/tools/search.py`, `services/hybrid_search.py`, `services/db.py` (`search_precedent_library_semantic`/`_lexical`)
- ספ: `docs/spec/02-data-model.md` (INV-DM1–7), `docs/spec/03-retrieval.md` (INV-RET1–5), `docs/spec/00-constitution.md` (G2/G10)
