feat(X13): אחזור-פסיקה אוטומטי מנט המשפט → קורפוס (Tier 0 + scaffold) #110

Merged
chaim merged 1 commits from worktree-court-fetch into main 2026-06-07 18:13:15 +00:00
Owner

רקע

כשיומון (digest) מצביע על פסק-דין של בית-משפט (בניגוד להחלטת ועדת-ערר שצריך נבו), המערכת צריכה להוריד אוטומטית את הפסק, לחלץ, ולקלוט לקורפוס. ה-PR מניח את תת-מערכת השירות לכך (docs/spec/X13-court-fetch.md).

זו "Phase 2" של תת-מערכת ה-digests (worktree-digests-radar, לא-ממוזג): היומון כבר מחלץ underlying_citation (הדוגמה בספ היא עת"מ 46111-12-22 — תיק-המבחן). חסר היה: סיווג פס"ד-מול-ועדת-ערר, הורדה, וקליטה.

ארכיטקטורה — 3 שכבות, autonomous-first

citation → classify → supreme | admin | skip
  skip(ערר/בל"מ)  → missing_precedent (נבו ידני)
  supreme         → Tier 0: httpx → supremedecisions (ללא CAPTCHA)
  admin           → Tier 1: legal-court-fetch-service (host/pm2) → Camoufox + reCAPTCHA(Whisper)
                    → Tier 2 fallback: VNC ידני / missing_precedent
  (כל ה-tiers)    → precedent_library.ingest_precedent (מסלול-קליטה יחיד)

ממצא מפתח: 46111-12-22 הוא עת"מ מנהלי (לא עליון), שזמין ציבורית רק דרך נט המשפט — ASP.NET WebForms + F5 anti-bot + reCAPTCHA. הורדה אוטונומית-מלאה דורשת דפדפן-אמת + פתרון-CAPTCHA, ולכן Tier 1 host-side (כדפוס legal-chat-service) עם פותר-אודיו open-source (Whisper). בחירת המשתמש: אוטונומי-מלא נטו-קוד-פתוח + fallback אנושי.

מה נכלל

  • spec-first: docs/spec/X13-court-fetch.md (INV-CF1..CF7) + אינדקס בחוקה/README
  • מסווג court_citation.py + 10 בדיקות (tests/test_court_citation.py) — עוברות
  • Tier 0 court_fetch_supreme.py — API של supremedecisions (reverse-engineered: Home/SearchVerdictsHome/Download), httpx + browser-headers (אומת HTTP 200) + politeness
  • תור court_fetch_jobs (SCHEMA_V30) + DB helpers + court_fetch_orchestrator.py
  • Tier 1 scaffold: court_fetch_service/ (aiohttp+Bearer, מראת chat_service) + camofox_client + recaptcha_audio (faster-whisper) + scripts/legal-court-fetch-service.config.cjs
  • Tier 2: fallback חינני (manual + missing_precedent) — אין drop שקט
  • כלי-MCP court_verdict_fetch / court_fetch_status; SCRIPTS.md

Invariants (הצהרה)

מקיים G2 (מסלול-קליטה יחיד → INV-CF1) · G3/G1 (idempotent+נרמול → INV-CF5) · G4/§6 (אין בליעה שקטה → INV-CF2) · G10 (שער-אנושי → INV-CF3) · G5 (source_type=court_ruling → INV-CF6) · G9 (provenance+audit → INV-CF7). מקורות INV-CF4 (politeness): RFC 9309 · Google crawler · OWASP OAT.

אימות

  • pytest tests/test_court_citation.py — 10/10
  • כל המודולים compile + import graph נטען; db helpers נוכחים
  • supremedecisions מחזיר HTTP 200 עם browser-headers (אומת חי)

Follow-ups (טרם אומתו חי — לא חוסם merge של הספ+spine)

  1. Tier-0 live: לאמת מבנה תשובת SearchVerdicts מול עע"מ אמיתי (הקוד raise-on-unexpected, לא בולע)
  2. Tier-1: התקנת camofox-browser + faster-whisper, כיול selectors נט-המשפט מול snapshot חי
  3. סוד: COURT_FETCH_SHARED_SECRET ב-Infisical + Coolify (כדפוס LEGAL_CHAT_SHARED_SECRET)
  4. טריגר: חיווט מ-digest_library.try_autolink (חי ב-worktree-digests-radar)
  5. ⚠ merge: SCHEMA_V30 עלול להתנגש עם digests-radar (שגם משתמש V30) — אם digests ממוזג קודם, למספר מחדש ל-V31

🤖 Generated with Claude Code

## רקע כשיומון (digest) מצביע על **פסק-דין של בית-משפט** (בניגוד להחלטת ועדת-ערר שצריך נבו), המערכת צריכה להוריד אוטומטית את הפסק, לחלץ, ולקלוט לקורפוס. ה-PR מניח את תת-מערכת ה**שירות** לכך (`docs/spec/X13-court-fetch.md`). זו "Phase 2" של תת-מערכת ה-digests (worktree-digests-radar, לא-ממוזג): היומון כבר מחלץ `underlying_citation` (הדוגמה בספ היא **`עת"מ 46111-12-22`** — תיק-המבחן). חסר היה: סיווג פס"ד-מול-ועדת-ערר, הורדה, וקליטה. ## ארכיטקטורה — 3 שכבות, autonomous-first ``` citation → classify → supreme | admin | skip skip(ערר/בל"מ) → missing_precedent (נבו ידני) supreme → Tier 0: httpx → supremedecisions (ללא CAPTCHA) admin → Tier 1: legal-court-fetch-service (host/pm2) → Camoufox + reCAPTCHA(Whisper) → Tier 2 fallback: VNC ידני / missing_precedent (כל ה-tiers) → precedent_library.ingest_precedent (מסלול-קליטה יחיד) ``` **ממצא מפתח:** 46111-12-22 הוא עת"מ מנהלי (לא עליון), שזמין ציבורית **רק** דרך נט המשפט — ASP.NET WebForms + F5 anti-bot + reCAPTCHA. הורדה אוטונומית-מלאה דורשת דפדפן-אמת + פתרון-CAPTCHA, ולכן Tier 1 host-side (כדפוס legal-chat-service) עם פותר-אודיו open-source (Whisper). בחירת המשתמש: אוטונומי-מלא נטו-קוד-פתוח + fallback אנושי. ## מה נכלל - **spec-first**: `docs/spec/X13-court-fetch.md` (INV-CF1..CF7) + אינדקס בחוקה/README - **מסווג** `court_citation.py` + 10 בדיקות (`tests/test_court_citation.py`) — עוברות - **Tier 0** `court_fetch_supreme.py` — API של supremedecisions (reverse-engineered: `Home/SearchVerdicts` → `Home/Download`), httpx + browser-headers (אומת HTTP 200) + politeness - **תור** `court_fetch_jobs` (SCHEMA_V30) + DB helpers + `court_fetch_orchestrator.py` - **Tier 1 scaffold**: `court_fetch_service/` (aiohttp+Bearer, מראת `chat_service`) + `camofox_client` + `recaptcha_audio` (faster-whisper) + `scripts/legal-court-fetch-service.config.cjs` - **Tier 2**: fallback חינני (`manual` + `missing_precedent`) — אין drop שקט - **כלי-MCP** `court_verdict_fetch` / `court_fetch_status`; `SCRIPTS.md` ## Invariants (הצהרה) מקיים **G2** (מסלול-קליטה יחיד → INV-CF1) · **G3/G1** (idempotent+נרמול → INV-CF5) · **G4/§6** (אין בליעה שקטה → INV-CF2) · **G10** (שער-אנושי → INV-CF3) · **G5** (source_type=court_ruling → INV-CF6) · **G9** (provenance+audit → INV-CF7). מקורות INV-CF4 (politeness): RFC 9309 · Google crawler · OWASP OAT. ## אימות - ✅ `pytest tests/test_court_citation.py` — 10/10 - ✅ כל המודולים compile + import graph נטען; db helpers נוכחים - ✅ supremedecisions מחזיר HTTP 200 עם browser-headers (אומת חי) ## Follow-ups (טרם אומתו חי — לא חוסם merge של הספ+spine) 1. **Tier-0 live**: לאמת מבנה תשובת `SearchVerdicts` מול עע"מ אמיתי (הקוד raise-on-unexpected, לא בולע) 2. **Tier-1**: התקנת `camofox-browser` + `faster-whisper`, כיול selectors נט-המשפט מול snapshot חי 3. **סוד**: `COURT_FETCH_SHARED_SECRET` ב-Infisical + Coolify (כדפוס `LEGAL_CHAT_SHARED_SECRET`) 4. **טריגר**: חיווט מ-`digest_library.try_autolink` (חי ב-worktree-digests-radar) 5. **⚠ merge**: `SCHEMA_V30` עלול להתנגש עם digests-radar (שגם משתמש V30) — אם digests ממוזג קודם, למספר מחדש ל-V31 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-07 18:12:31 +00:00
תת-מערכת אחזור-פסיקה אוטומטי: כשיומון מצביע על פס"ד בית-משפט, מסווגים את
הערכאה, מורידים מהמקור הציבורי המתאים, וקולטים דרך צינור-הקליטה הקנוני.

- spec-first: docs/spec/X13-court-fetch.md (INV-CF1..CF7) + אינדקס
- מסווג court_citation.py (supreme/admin/skip) + 10 בדיקות (עת"מ 46111-12-22 → admin)
- Tier 0: court_fetch_supreme.py — supremedecisions API (reverse-engineered), httpx
  + browser-headers (אומת 200) + politeness
- תור court_fetch_jobs (SCHEMA_V30) + DB helpers + court_fetch_orchestrator.py
- Tier 1 scaffold: legal-court-fetch-service (aiohttp+Bearer, מראת legal-chat-service)
  + camofox_client (Camoufox open-source) + recaptcha_audio (Whisper מקומי) + pm2
- Tier 2 fallback חינני: manual + missing_precedent (INV-CF2/CF3 — אין drop שקט)
- כלי-MCP court_verdict_fetch / court_fetch_status; SCRIPTS.md

Invariants: מקיים G2 (מסלול-קליטה יחיד, INV-CF1) · G3/G1 (idempotent+נרמול, INV-CF5)
· G4/§6 (אין בליעה שקטה, INV-CF2) · G10 (שער-אנושי, INV-CF3) · G5 (source_type,
INV-CF6) · G9 (provenance+audit, INV-CF7). מקורות INV-CF4: RFC 9309 · Google
crawler · OWASP OAT.

Follow-ups (טרם אומתו חי): live Tier-0 validation · התקנת camofox-browser+whisper
· כיול selectors Tier-1 · COURT_FETCH_SHARED_SECRET (Infisical+Coolify) · טריגר
מ-digest try_autolink (worktree-digests-radar). V30 עלול להתנגש עם digests-radar.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim force-pushed worktree-court-fetch from 36d10b6a70 to 0990db7a3c 2026-06-07 18:12:31 +00:00 Compare
chaim merged commit acb8e2c206 into main 2026-06-07 18:13:15 +00:00
chaim deleted branch worktree-court-fetch 2026-06-07 18:13:15 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#110