Files
legal-ai/docs/spec/X12-digests-radar.md
Chaim 85f94a4f3f feat(bulletins): catalog monthly "עו"ד על נדל"ן" bulletins into the radar (X12)
עלון חודשי רב-נושאי (פרסום נפרד מהיומון היומי) → מתפצל ל-N שורות digest באותה
טבלה (publication='עו"ד על נדל"ן', לא קורפוס מקביל — G2):
- bulletin_splitter (LLM local-only, tools=""): מפצל ל-cases[]+articles[];
  עדכוני-חקיקה מדולגים (החלטת יו"ר).
- bulletin_library.ingest_bulletin: כל מצביע-פסיקה → digest_kind='decision'
  + embedding + autolink (כולל X13 court-fetch); כל מאמר → digest_kind='article'
  (טקסט-מלא + embedding, רקע בלבד — INV-DIG1 חל).
- content_hash per-item הוא מפתח-הדדאפ (yomon_number ריק) → אידמפוטנטי.
- db.create_digest: פרמטר digest_kind (זורם ל-INSERT + upsert).
- scripts/ingest_bulletins.py (host, venv) לעיבוד הארכיון.
- spec X12 §2.1.

אומת (dry-run, ללא DB): עלון 180 → 4 cases+1 article · עלון 201 → 4 cases
(כולל ערר-197) +1 article. עדכוני-חקיקה דולגו. claude_session נשאר local-only.

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

16 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 (גיליון היומון) — מקור-באגים נפוץ; חילוץ-המטא-דאטה מבחין ביניהם מפורשות.

digest_kind (סיווג-גיליון, V32): רוב הגיליונות הם decision (סיכום פס"ד → underlying_citation), אך חלקם announcement — עדכון/הודעה ללא הכרעה (חקיקה, נוהל, ברכת-שנה) שאין לו מראה-מקום. החילוץ מסווג כל גיליון ותמיד מחלץ concept_tag/headline/summary (קיימים לכל סוג); underlying_citation רק ל-decision. שימוש קריטי: הגדרת-"כשל" של ה-drain self-heal היא completed עם digest_kind='' (מעולם לא סווג) — כך הודעה (kind=announcement, בלי citation) אינה נחשבת כשל ואינה מנוסה-מחדש לנצח. ההיוריסטיקה הישנה ("שני השדות ריקים") טיפלה בהודעות בטעות כ-retry אינסופי.

2.1 מקור שני ל-radar — העלון החודשי "עו"ד על נדל"ן"

פרסום נפרד מהיומון היומי: עלון חודשי ממוספר (משרדי צבי שוב + רונית אלפר), רב-נושאי — מאמר-עומק, עדכוני-חקיקה, וסט מצביעי-פסיקה מקובצים לפי נושא. נקלט לאותה טבלת digests (לא קורפוס מקביל — G2), מובחן ע"י publication='עו"ד על נדל"ן' (מול 'כל יום'). עלון אחד מתפצל ל-N שורות דרך bulletin_splitter (LLM, local-only) → bulletin_library.ingest_bulletin:

  • מצביעי-פסיקהdigest_kind='decision' — מצטרפים ל-radar ומקושרים לפסק (autolink + X13 כמו היומון).
  • מאמריםdigest_kind='article' — טקסט-מלא + embedding לחיפוש-עומק; רקע בלבד, INV-DIG1 חל (לא מצוטט).
  • עדכוני-חקיקה — לא נקלטים (החלטת יו"ר).

מפתח-הדדאפ לפריט-עלון הוא content_hash (per-פריט), כי yomon_number ריק (ה-upsert על yomon-number לא חל; uq_digests_content_hash תופס re-runs). אידמפוטנטי. סקריפט: scripts/ingest_bulletins.py.


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). מקור-אמת יחיד: מצב-הקליטה נשמר אך-ורק בטבלת digests (סטטוס + content_hash ל-idempotency); תיקיות-קבצים (incoming/) הן staging בלבד, לא state. הפרה ידועה (תוקנה 2026-06-07): ingest_digests_batch.py העביר קבצים ל-data/digests/processed/ — state מבוסס-תיקיות מקביל ל-DB. הוסר; הסקריפט מסתמך על dedup ב-content_hash (G2).

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_*.