Inline # comments in gitignore are not supported — they were silently breaking three patterns (data/checkpoints/, data/adapter-migration-state.json, .claude/agents/.generated/). Moved comments to their own lines and added missing entries for runtime dirs (data/audit/, data/logs/, etc.) and temp files (.interaction_tmp.json, .design-build/, .taskmaster bak files). Also tracks previously untracked legitimate files: scripts, tests, docs, skills references, .env.example, taskmaster templates. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
171 lines
15 KiB
Markdown
171 lines
15 KiB
Markdown
# ממצאי ביקורת — ארכיטקטורת קורפוס־הפסיקה + מצב הדאטה בפועל
|
||
|
||
> **מקור:** 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)
|