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>
15 KiB
ממצאי ביקורת — ארכיטקטורת קורפוס־הפסיקה + מצב הדאטה בפועל
מקור: Claude (Opus 4.8) · תאריך: 2026-06-20 · קונטקסט: חקירה לקראת תכנון־מחדש של קורפוס־הפסיקה. מסמך זה הוא אחד מכמה קלטי־סוכנים שחיים אוסף; ייעודו להזין את שלב־הסינתזה. אינו תכנית — הוא אבחון.
שאלת־המוצא של חיים: "הקורפוס נבנה מראש לא נכון, אני כל הזמן מתעסק בתיקונים. האם כדאי ליצור מחדש את קורפוס־הפסיקה ולהתחיל דף נקי?"
המודל הרצוי (כפי שחיים תיאר אותו): מאגר פסקי־דין והחלטות ועדות־ערר; חוקר־התקדימים מזהה בשלב ניתוח־הערר פס"ד/החלטות שדנו במקרה דומה או הלכה דומה; הסוכן־הכותב משייך ומזכיר אותם בפרק הדיון וההכרעה בסגנון דפנה. שלושה מקורות־הזנה: (1) החלטות דפנה עצמה, (2) ועדות־ערר אחרות שמצטטות פסיקה, (3) פס"ד עליון/מחוזי.
0. תקציר־מנהלים (TL;DR)
מה ש"בנוי לא נכון" אינו הסכמה — היא שכבת־הביצוע. הסכמה כבר תואמת בדיוק את המודל שחיים תיאר: טבלה אחת (case_law) ששלושת המקורות נכנסים אליה דרך source_kind/source_type; שלושת ה־search_* הם שלושה מסננים על אותו מקור, לא שלושה מאגרים מקבילים (G2 מקוים ברמת־הסכמה). רֵבילד של הסכמה ייצר בדיוק את אותה סכמה — ולכן אינו פותר דבר, ומסכן ב־second-system syndrome.
מה שכן מחולל את "התיקונים האינסופיים" — שלושה כשלי־ביצוע מדידים:
- חוזה־קליטה רופף → 66% מהפסיקה בלי
practice_area, 31 רשומות ריקות, אכיפת־שלמות (INV-DM1) מופרת בפועל. - צינור הלכות→קנוני מייצר רעש → 5,472 קנוני, מתוכם 5,456 סינגלטונים, 0 published → השכבה שאמורה להזין את הכותב (INV-G10) אינרטית לגמרי.
- כפילות
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_corpusSoT וה-case_lawנגזר, או הפוך.
5. ההמלצה — לא רֵבילד־סכמה; "איפוס שכבות־נגזרות" אחרי תיקון־חוזה
אסור לשרוף ולהעלות־מחדש את case_law — תבנה אותה סכמה ותאבד מטא־דאטה ידני. כן הגיוני רֵבילד צר של הנגזר, אבל בסדר הזה (G1 — מקור לפני תסמין):
- קודם החוזה: אכוף ב-
*_uploadשדות־חובה (practice_area, summary, full_text); כשל →searchable=false. נקה/מחק את 31 הריקות. - תקן את הקנוניזציה: כוונן סף 0.85, הגדר מתי
published, ובדוק ניסוח־החילוץ. בלי זה אין טעם להריץ מחדש. - רק אז re-derive מהמקור הקיים: chunks → halachot → canonical.
- הכרע 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)