diff --git a/docs/spec/X13-court-fetch.md b/docs/spec/X13-court-fetch.md index c6f9a96..d942950 100644 --- a/docs/spec/X13-court-fetch.md +++ b/docs/spec/X13-court-fetch.md @@ -17,11 +17,13 @@ **הבחנת-מקור קריטית:** רק **פסקי-דין של בתי-משפט** ניתנים לאחזור ציבורי. **החלטות ועדת-ערר** אינן זמינות ציבורית (נדרש נבו) — מסומנות כפער ולא נשלחות לאחזור. -**שתי דרכי-מקור ציבוריות:** -- **עליון** (עע"מ/בג"ץ/ע"א/רע"א/בר"מ/דנ"א) → `supremedecisions.court.gov.il` — הורדה ישירה (httpx), ללא CAPTCHA. -- **מנהלי/מחוזי/שלום** (עת"מ/עמ"נ/...) → מציג-התיקים של **נט המשפט** — ASP.NET WebForms - (`__doPostBack`/VIEWSTATE), anti-bot של F5, מסמכים מוצגים בצופה-עמודים (turn.js). מחייב - **דפדפן-אמת** (host-side), ולכן שירות-מארח ב-pm2 (כדפוס `legal-chat-service`). +**דרכי-מקור ציבוריות (ניתוב לפי זמינות-פורמט-נט, לא לפי ערכאה):** +- **נט המשפט** (מציג-התיקים) משרת **כל הערכאות** — מחוזי/שלום *וגם עליון* — כל עוד יש מספר + בפורמט תיק-חודש-שנה. ASP.NET WebForms (`__doPostBack`/VIEWSTATE), anti-bot של F5, מסמכים + בצופה-עמודים (turn.js). מחייב **דפדפן-אמת** (host-side) → שירות-מארח ב-pm2 (כדפוס + `legal-chat-service`). **זהו המסלול הראשי המאומת.** +- **עליון בפורמט-סדרתי** (עע"מ/בג"ץ NNNN/YY, ללא חודש — לא ניתן לחיפוש בנט) → `supremedecisions.court.gov.il` + (httpx, ללא CAPTCHA). **⚠ הפורטל טרם פוענח (SearchVerdicts מחזיר לא-JSON); כשל→manual** עד שיפוענח. > **אומת end-to-end (2026-06-07) על עת"מ 46111-12-22** — פס"ד 34 עמ' הורד **אוטונומית מלא, > נטו קוד-פתוח, ללא כרטיס-חכם וללא פתרון-CAPTCHA**. ממצאי-המפתח מהכיול: @@ -41,18 +43,22 @@ ## 1. ארכיטקטורה — שלוש שכבות (tiered) ``` -underlying_citation → [classifier] → tier ∈ {supreme, admin, skip} - skip(ערר/בל"מ) → missing_precedent (נבו ידני) — לא אחזור - supreme → Tier 0: httpx בקונטיינר → supremedecisions — אוטונומי מלא - admin → Tier 1: legal-court-fetch-service (host/pm2 + Xvfb) — אוטונומי-first - → Camoufox(python) → external-search → CaseDetails → פסקי דין - → NGCSViewerPage → GetImages(X-Requested-With) → PNGs → PDF - → Tier 2 fallback: VNC ידני / missing_precedent + התראה — שער-אנושי - (כל ה-tiers) → precedent_library_upload(source_type=court_ruling) → ingest_precedent - → chunks+embeddings+halachot(pending) → relink digest / close gap +underlying_citation → [classifier] → {tier, האם יש פורמט-נט (תיק-חודש-שנה)} + skip(ערר/בל"מ) → missing_precedent (נבו ידני) — לא אחזור + ── ניתוב לפי זמינות-פורמט-נט, לא לפי קידומת (נט המשפט משרת כל הערכאות) ── + פורמט-נט קיים (עמ"נ/עת"מ/עליון-בפורמט-נט כמו בר"מ 72182-06-25) + → Tier 1: legal-court-fetch-service (host/pm2 + Xvfb) — אוטונומי, מאומת + → Camoufox(python) → external-search → CaseDetails → פסקי דין + → NGCSViewerPage → GetImages(X-Requested-With) → PNGs → PDF + עליון סדרתי-בלבד (עע"מ 5886/24, בלי חודש) + → Tier 0: httpx → supremedecisions [⚠ טרם מפוענח — נכשל→manual] + כשל אוטונומי → Tier 2: missing_precedent + התראה (VNC עתידי) — שער-אנושי + (כל ה-tiers) → precedent_library_upload(source_type=court_ruling) → ingest_precedent + → chunks+embeddings+halachot(pending) → relink digest / close gap ``` -מצב-העבודה מנוהל בטבלת-תור `court_fetch_jobs` (idempotent, נצפה, retryable). +מצב-העבודה מנוהל בטבלת-תור `court_fetch_jobs` (idempotent, נצפה, retryable). הניקוז +האוטומטי: `legal-court-fetch-drain` (pm2 cron שעתי) → `orchestrator.drain_pending`. --- @@ -162,5 +168,9 @@ Service / responsible automation) | סטטוס: verified - F5/anti-bot עלול לחסום IP → politeness סדרתי + Camoufox (INV-CF4). - שבירות מול שינויי-אתר → ריכוז selectors במקום אחד + בדיקות-עשן תקופתיות. - גבול-ToS על אתר .gov → INV-CF7 + שיקול-יו"ר. +- **Tier-0 (supremedecisions) טרם מפוענח** — עליון בפורמט-סדרתי (עע"מ NNNN/YY) מוסלם ל-`manual` + (היו"ר מוריד ידנית מהאתר הציבורי — טריוויאלי). רוב תיקי-התכנון הם district/עליון-בפורמט-נט → + Tier-1. **מימוש עתידי:** פענוח זרימת ה-Angular של supremedecisions (SearchVerdicts→Download + עם הכותרות הנכונות) — אופציונלי. - **דליפת-זיכרון מדפדפנים יתומים** (fetch שנתקע/נהרג משאיר `camoufox-bin`) → שלוש שכבות-הגנה: (א) `async with` סוגר את הדפדפן בכל exception; (ב) `asyncio.wait_for` קשיח (`COURT_FETCH_HARD_TIMEOUT_S`, ברירת-מחדל 180ש') מבטל hang + reap; (ג) reaper של `camoufox-bin` יתומים (`ppid=1`) לפני/אחרי כל fetch + דמון `legal-reaper` (pm2) + תקרת `max_memory_restart`. סדרתיות (INV-CF4) מבטיחה שכל דפדפן `ppid=1` הוא שארית בטוחה-להריגה. **הערה:** הדליפה הגדולה בפועל בשרת היא `task-master-mcp` (כלי נפרד), שגם אותו ה-reaper מנקה.