Files
legal-ai/docs/spec/X12-digests-radar.md
Chaim 8171572cdd feat(digests): קורפוס יומונים כשכבת-גילוי (radar) — X12
מאגר חדש ליומוני "כל יום" (עפר טויסטר) כשכבת-גילוי מעל קורפוסי-הפסיקה:
מקור-משני המצביע על פסק הדין המקורי, נקלט לטבלה נפרדת `digests`, נחפש
סמנטית, ומקושר לפסק המקורי בספריית הפסיקה — אך לעולם אינו מצוטט בהחלטה
ואינו מחלץ הלכות.

Phase 0 (spec):
- docs/spec/X12-digests-radar.md — INV-DIG1 (מצביע לא מצוטט) /
  INV-DIG2 (מסלול-קליטה נפרד, לא מקביל — מקיים G2) / INV-DIG3 (קישור-לפסק
  הוא הגשר; חוסר-קישור = פער גלוי). עדכון אינדקס 00/03/README.

Phase 1 (MVP):
- SCHEMA_V30: טבלת `digests` (HNSW על embedding — לא ivfflat, להימנע מ-recall
  cliff בקורפוס קטן/צומח) + GIN/FTS + UNIQUE חלקי ל-idempotent.
- services/digest_metadata_extractor.py — חילוץ-LLM (claude_session local-only,
  ייבוא lazy): תג-מושג, כותרת-הלכה, מראה-מקום, שני-תאריכים מובחנים, תגיות.
- services/digest_library.py — מסלול קצר עצמאי (INV-DIG2): extract→hash→LLM→
  embedding יחיד→autolink. לא משתמש ב-ingest.ingest_document.
- tools/digests.py + רישום 7 כלים ב-server.py (digest_upload/list/get/link/
  relink/delete + search_digests).
- scripts/ingest_digests_batch.py — קליטה ידנית מ-data/digests/incoming.
- legal-researcher.md: שלב 2ב.0 (סריקת-radar לפני אימות) + סעיף-דוח ט +
  3 כלים ב-frontmatter. HEARTBEAT §8: ניתוב יומון→digest_upload.

אומת end-to-end: 4 יומונים נקלטו (מטא-דאטה מדויק), חיפוש סמנטי מדרג נכון
("היטל השבחה"→5160, "תמא 38"→5158), link/relink/autolink/revert + מעטפת-MCP.

Invariants: מוסיף INV-DIG1/2/3 (X12). מקיים G2 (bounded context נפרד, לא
מסלול מקביל), G3 (idempotent upsert), G4 (אין בליעה שקטה — פער-קישור מוצף),
G9 (עקיבוּת — היומון מצביע על מקור עקיב). נוגע G7 (RRF) — נדחה, חיפוש
סמנטי-בלבד בשלב 1 (FTS index מוכן).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 17:49:00 +00:00

13 KiB
Raw Blame History

X12 — יומונים כשכבת-גילוי (Digests Radar)

קובץ-תחום זה כפוף ל-חוקת המערכת. הוא מגדיר שכבת-גילוי (discovery/radar) מעל קורפוסי-הפסיקה: קליטה וחיפוש של יומונים — סיכומי-עמוד-אחד של משרד עפר טויסטר ("כל יום — היומון לענייני תכנון ובנייה") על פסק-דין/החלטה בודדים. היומון הוא מקור משני המצביע על פסק-הדין המקורי; הוא אינו נכנס לאף אחד מ-3 קורפוסי-הציטוט, אינו מצוטט בהחלטה, ואינו מחלץ הלכות. הוא נשען על INV-G2 (אין מסלול מקביל), INV-G4 (שלמות + אין בליעה שקטה) ו-INV-G9 (עקיבוּת-מקור), ומובחן מ-3 הקורפוסים של 03-retrieval.md.

TARGET, לא תיאור-מצב. התת-מערכת כולה היא יעד — אין כיום טבלת digests, כלי-digest_*, ולא אינטגרציית-חוקר. כל רכיב מסומן מפורשות כ-audit-finding לבנייה (§6). כל טענה על הקוד file:line.


1. הרעיון — radar, לא קורפוס-ציטוט

חיים מקבל כמעט יומית מייל עם יומון: PDF של עמוד אחד שמסכם פסק-דין/החלטה בודדים בתחום רישוי-ובנייה / היטל-השבחה / פיצויים(ס'197). היומון אינו הטקסט המשפטי המקורי — הוא ניתוח של צד שלישי (עפר טויסטר), הנושא הבהרה מודפסת: "האמור הוא מידע ראשוני בלבד ואין הוא תחליף לייעוץ משפטי". במונחי-מחקר-משפטי זהו מקור משני (secondary authority): כלי-איתור והכוונה, לא סמכות שמצטטים בהחלטה.

הערך שלו עצום דווקא כ-radar: כל יומון הוא headnote + תג-נושא כתובים-מראש בידי מומחה, המצביע על פסק-דין מקורי. כשמנסחים החלטה, search_digests מחזיר את היומון הרלוונטי → החוקר קורא את ניתוח טויסטר כרקע → מחלץ את מראה-המקום של פסק-הדין המקורי → מביא את הפסק עצמו לקורפוס-הפסיקה הקיים (הזמינות גבוהה) → ומצטט משם. היומון מצביע; הציטוט תמיד נשען על המקור.


2. מה היומון מכיל

מבנה קבוע (אומת מול הקבצים ב-data/precedents/incoming/, יומון 5158/5159/5160/5163):

רכיב דוגמה תפקיד
מספר-יומון + תאריך-גיליון יומון מס' 5163 7 ביוני 2026 מפתח-upsert + digest_date
תג-מושג "שיקול הדעת המצומצם" ציר-נושא לחיפוש
כותרת-הלכה ביהמ"ש - שיקול דעת הוועדה המחוזית אינו מצומצם... הסיכום בשורה
גוף-ניתוח (12 עמ') ניתוח עפר-טויסטר רקע + מקור-embedding
מראה-מקום בתחתית עת"מ 46111-12-22 יכין-אפק... ניתן 3.6.26... שופטת: יעל טויסטר ישראלי השדה הקריטי — הגשר לפסק המקורי

underlying_date (מתן הפסק) שונה מ-digest_date (גיליון היומון) — מקור-באגים נפוץ; חילוץ-המטא-דאטה מבחין ביניהם מפורשות.


3. למה זה לא קורפוס-ציטוט רביעי (הקושיה המרכזית — G2)

03-retrieval.md §1 מגדיר 3 קורפוסי-ציטוט: מסמכי-תיק+סגנון-דפנה, פסיקה-חיצונית, החלטות-ועדה. השאלה: האם יומונים = רביעי, ובכך הפרת INV-G2?

לא — בתנאי המסגור הנכון. G2 אוסר מסלול מקביל ליכולת קיימת. יומונים אינם עוד-מסלול-לאחזור- פסיקה אלא bounded context נפרד: ישות נפרדת (digests, לא case_law), מטרה נפרדת (הצבעה ולא ציטוט), וחוזה נפרד. ההבחנה הקנונית: 3 הקורפוסים הם עקיבים-בפלט (כל ציטוט בהחלטה חוזר אליהם — INV-RET5/G9). היומון לעולם אינו עקיב-אליו בפלט (INV-DIG1) — ולכן אינו קורפוס-ציטוט רביעי, אלא שכבה מקדימה לקורפוסים. הפרדת-הקורפוס מ-INV-RET1 מתקיימת אוטומטית: search_digests שואל רק את digests, ואף כלי-חיפוש-פסיקה אינו נוגע בה (הפרדה פיזית בטבלה, לא תנאי-סינון).


4. המנגנון (TARGET)

קליטה (מסלול קצר עצמאי — INV-DIG2):
  יומון PDF → extract_text → content_hash (idempotent, INV-G3)
           → חילוץ-LLM: תג-מושג / כותרת-הלכה / תקציר / מראה-מקום / שני-תאריכים / תחום / תגיות
           → INSERT digests → embedding יחיד (תג+כותרת+תקציר+ניתוח) לחיפוש סמנטי בלבד
           → try_autolink(underlying_citation → case_law)            [INV-DIG3]
  ⚠ ללא precedent_chunks, ללא halacha-extraction, ללא precedent metadata-extractor.

חיפוש + שימוש (radar — INV-DIG1):
  legal-researcher: search_digests(סוגיה)
    → קורא ניתוח טויסטר + כותרת-הלכה  =  רקע/orientation בלבד
    → מחלץ את מראה-המקום של הפסק המקורי
    → הפסק בקורפוס?  כן → אמת+צטט כרגיל (precedent_attach) + digest_link
                      לא → missing_precedent_create על *הפסק המקורי*
                           (notes="זוהה דרך יומון מס' NNNN")           [INV-DIG3]
    → היומון לעולם אינו נרשם דרך precedent_attach ואינו supporting_quote.  [INV-DIG1]

5. Invariants של התחום

INV-DIG1: היומון מצביע, לא מצוטט

כלל: רשומת-digest לעולם אינה משמשת כ-supporting_quote/provenance בפלט-החלטה; כל ציטוט בהחלטה נגזר מקורפוס-ציטוט (case_law/document_chunks). היומון הוא מקור משני — כלי-איתור, לא סמכות-מצוטטת. החוקר רושם אותו כ-radar (סעיף-דוח נפרד), לא דרך precedent_attach. מקור-סמכות: היו"ר + ההבהרה המודפסת ביומון ("מידע ראשוני בלבד... אינו תחליף לייעוץ משפטי") — invariant תוכן-משפטי/תפעולי, קשור ל-G9. מקורות (פתוחים, להבחנת מקור-ראשוני↔משני): Georgetown Law Library — Secondary Sources research guide ("secondary sources... are not the law") · Amy E. Sloan, Basic Legal Research: Tools and Strategies — primary vs. persuasive/secondary authority · The Bluebook: A Uniform System of Citation — סיווג סמכות-ראשונית מול משנית | סטטוס: verified אכיפה: היעדר FK מ-decision_blocks/ציטוטים ל-digests; ולידציית-QA (05-qa-review.md) שדוחה ציטוט שמקורו digest; הוראת-חוקר מפורשת (X4-agents.md, legal-researcher.md). הפרה ידועה: — (תת-מערכת חדשה)

INV-DIG2: מסלול-קליטה נפרד-בכוונה — לא מסלול-פסיקה מקביל

כלל: קליטת-יומון היא bounded context נפרד, ואינה עוברת ב-precedent pipeline (01-ingest.md): אין precedent_chunks, אין halacha-extraction, אין precedent-metadata-extractor. מסלול קצר עצמאי (digest_library.ingest_digest) הבונה embedding-יחיד לחיפוש סמנטי בלבד. הצהרה זו היא מה שמונע הפרת-G2 — היומון אינו ישות-אחות של case_law ואינו מתפצל ממסלולו. מקורות: Eric Evans, Domain-Driven Design (2003) — Bounded Context (הקשרים שונים = מודלים מובחנים) · Martin Kleppmann, DDIA (2017) — system-of-record מובחן מ-derived/index data · Martin Fowler — Bounded Context / Canonical Data Model | סטטוס: verified אכיפה: טבלה פיזית נפרדת digests; ingest_digest עושה reuse לשירותים אטומיים בלבד (extractor.extract_text, embeddings.embed_texts) ולא ל-ingest.ingest_document; ביקורת- ארכיטקטורה. אוכף את G2

  • כלל-הנדסה "סימטריה" (§6). הפרה ידועה: — (תת-מערכת חדשה)

INV-DIG3: קישור-לפסק-המקורי הוא הגשר — חוסר-קישור הוא פער גלוי

כלל: לכל digest שדה linked_case_law_id (FK ל-case_law, nullable). כשהפסק המקורי בקורפוס — היומון מקושר אליו (אוטומטית בקליטה לפי מראה-המקום, או ידנית ב-digest_link). כל עוד אינו בקורפוס, הקישור ריק והפער מוצף דרך missing_precedent_create על הפסק המקורי — לא נבלע בשקט. מקורות: E.F. Codd — referential integrity (foreign keys, CACM 13(6), 1970) · ISO 8000 — completeness (פער-ידע מתועד) · DAMA-DMBOK2 — data linkage / lineage | סטטוס: verified אכיפה: שדה-FK digests.linked_case_law_id + try_autolink בקליטה + כלי digest_link/ digest_relink; חוסר-קישור → missing_precedent_create (כלל-הנדסה "אין בליעה שקטה", §6). אוכף את G4 + G2. הפרה ידועה: — (תת-מערכת חדשה)


6. מצב קיים מול יעד — audit-findings

התת-מערכת כולה TARGET; אין כיום מימוש. רכיבים לבנייה:

  • טבלת digests + פונקציות-DB — לא קיימות. יעד: SCHEMA_V30 ב-db.py (טבלה + ivfflat/GIN/FTS אינדקסים + UNIQUE חלקי על yomon_number/content_hash ל-idempotent) + create_digest/search_digests/ link_digest_to_case_law (§4, INV-DIG2/DIG3).
  • שירות + חילוץ-LLMservices/digest_library.py + services/digest_metadata_extractor.py לא קיימים. החילוץ נשען על claude_session (local-only — ייבוא lazy בתוך ingest_digest בלבד, לא רץ בקונטיינר; תואם [claude_session local-only]).
  • כלי-MCP digest_* — לא קיימים. יעד: tools/digests.py + רישום ב-server.py, מעטפת-envelope אחידה לפי X9-mcp-tool-contract.md (search_digests מובחן בשם מ-6 כלי- החיפוש הקיימים — INV-TOOL2).
  • אינטגרציית-חוקרlegal-researcher.md ללא search_digests/digest_link ב-tools: וללא שלב- radar. יעד: שלב סריקת-יומונים לפני האימות + סעיף-דוח נפרד "radar — לא ציטוט" (INV-DIG1).
  • UI — אין דף /digests. יעד: דף נפרד (לא כרטיסייה ב-/precedents, לשמור גבול סמכותי/משני), אחרי npm run api:types (X6-ui-api-contract.md).
  • אוטומציית-קליטה (Gmail) + עלון-חודשי רב-נושאי — שלב עתידי; שלב-1 ידני (drop ל- data/digests/incoming/scripts/ingest_digests_batch.py).

7. הפניות-אחיות

  • 00-constitution.md — G2 (אין מסלול מקביל), G4 (שלמות/אין-בליעה), G9 (עקיבוּת).
  • 03-retrieval.md — 3 קורפוסי-הציטוט שהיומון מובחן מהם (§3); הפרדת-קורפוס.
  • 01-ingest.md — צינור-הפסיקה הקנוני שהיומון אינו עובר בו (INV-DIG2).
  • 02-data-model.mdcase_law (יעד-הקישור של linked_case_law_id).
  • 05-qa-review.md — שער-QA שדוחה ציטוט שמקורו digest (INV-DIG1).
  • X4-agents.md — סוכן החוקר שצורך את ה-radar.
  • X9-mcp-tool-contract.md — חוזה כלי-ה-digest_*.