Compare commits
228 Commits
2ae68c5896
...
worktree-o
| Author | SHA1 | Date | |
|---|---|---|---|
| 86e66cc5bd | |||
| 10e05700cc | |||
| 11acdac337 | |||
| 4eb3312e9b | |||
| 574998021e | |||
| cc4d757fce | |||
| 253f8ff97b | |||
| 044aecb034 | |||
| 1c7464c2ce | |||
| 8bcf05df26 | |||
| cb4aa703ec | |||
| 4d227a4999 | |||
| f58ddba93e | |||
| 29970ad8b2 | |||
| 85af98cded | |||
| 107be235f5 | |||
| 9e7d98a47a | |||
| 0a5be942ba | |||
| 67d5835eb8 | |||
| 1d8c4e29c8 | |||
| 943696efbd | |||
| 7d1fc49e35 | |||
| ad04291d39 | |||
| 8d0f8ad17b | |||
| cf7c918bed | |||
| a9db657541 | |||
| c7941a63ec | |||
| dede33cdff | |||
| e203474548 | |||
| 00d362ec5d | |||
| bfc352c7b5 | |||
| 653b951d30 | |||
| b3b7c48b8f | |||
| 0966a49afb | |||
| 5dbe970dbc | |||
| c4f3048248 | |||
| f15cc896d6 | |||
| 6ad0a387fe | |||
| 0fa2281ada | |||
| 9f1ad67536 | |||
| 1da1585ca8 | |||
| 66cddd20f0 | |||
| 9e7ef4fced | |||
| a0a30092e8 | |||
| b296422d87 | |||
| 21ad541659 | |||
| 3462cb7320 | |||
| 17c23ab377 | |||
| 972935ceb5 | |||
| 538d80f6ec | |||
| fdb0c98650 | |||
| 0d0631fea5 | |||
| ab5d34a9d3 | |||
| 6414e5f94a | |||
| f4ce8332fe | |||
| e5c7455284 | |||
| 68c2be2a7b | |||
| acb887845c | |||
| 93cce0505e | |||
| cc48896a0e | |||
| cc8af903b7 | |||
| bc0a4bb895 | |||
| 9d88255050 | |||
| 2b68d6cbeb | |||
| 581a4ba36f | |||
| 88977b2f10 | |||
| 40a2032e0d | |||
| def823b89f | |||
| 3ea5d3b536 | |||
| 425305844a | |||
| 5867f7175f | |||
| c954dded66 | |||
| 5cf1ff65f4 | |||
| 91bd3ac88c | |||
| bb83ddc611 | |||
| d1ca1152b1 | |||
| 44f6915f0c | |||
| 3b0d3e3b2e | |||
| b560417dd7 | |||
| 0bf311041b | |||
| 148f303378 | |||
| e439fad1a9 | |||
| fa2fc9390c | |||
| 331c712762 | |||
| 130f7cff71 | |||
| abff00faec | |||
| c7156b575e | |||
| 4285288ba7 | |||
| 39aff8fd45 | |||
| 72f9bbb77c | |||
| b17a2e4997 | |||
| 4d7e623607 | |||
| 7fd94cdd30 | |||
| 858e05fb8b | |||
| ff07e0bc98 | |||
| 3f253269f6 | |||
| 38d73c4f89 | |||
| 88b7dd1004 | |||
| b79c7bf161 | |||
| 7c48c8753e | |||
| 5987d50ebf | |||
| 9836957848 | |||
| 850ca25239 | |||
| 88ca96bf19 | |||
| b2d673fdb0 | |||
| 9402c7302f | |||
| d3d99180ec | |||
| 67c2c43777 | |||
| c71bbc0df2 | |||
| a8dd8ee152 | |||
| 73d2f15915 | |||
| 70a06c3745 | |||
| c6d20654a9 | |||
| c84417369d | |||
| d9783b1c14 | |||
| c68f3e004e | |||
| f1e9103723 | |||
| 6f60dc7a14 | |||
| 4feac756ba | |||
| 7655acddc3 | |||
| dfb2ffe7ce | |||
| 26451f7c9d | |||
| 99574f0eba | |||
| 085de937da | |||
| 9e6a441076 | |||
| eb0653fb80 | |||
| f935f166a9 | |||
| 33b36e38ee | |||
| 8d704e6e40 | |||
| faee621f0b | |||
| 8ece726b8d | |||
| aa2548ff5d | |||
| 9ef0547997 | |||
| 24e3e2fe80 | |||
| aad2de9205 | |||
| 23e088d25e | |||
| 7a7249af38 | |||
| 61e6be4b90 | |||
| 24e02621df | |||
| 0f68cb2d0b | |||
| 987da57da4 | |||
| 1136711ec8 | |||
| d83d1b248f | |||
| 0398274564 | |||
| a6fb632221 | |||
| 5e7097399f | |||
| 6c3c6a16c2 | |||
| 7a7db6933d | |||
| d3d379af65 | |||
| 9a19db1ec1 | |||
| 14ab7b0cae | |||
| c1983ea41d | |||
| 80a5daa3e3 | |||
| 9455da7567 | |||
| 638dbf9b9f | |||
| 97f3f50d0b | |||
| 8b23542dec | |||
| b8eb0ee123 | |||
| b0a6c2fe01 | |||
| 93a9404663 | |||
| 4d6268820c | |||
| 07bd8bee48 | |||
| 044de2c0f0 | |||
| cfcfe4df48 | |||
| 6427911baf | |||
| d7201736f2 | |||
| be774ab87e | |||
| c00e7b4f49 | |||
| 927be5c6bb | |||
| 84afdcb36c | |||
| ab510328af | |||
| 8d0e44937d | |||
| baf478d9dc | |||
| 6c487a2e85 | |||
| 8e2cfd602c | |||
| 0bf787929c | |||
| 8932bd1f54 | |||
| 4de555367d | |||
| b4a68cf5da | |||
| 9ae7304d44 | |||
| f2a264a7da | |||
| e051fda0cb | |||
| 331b8c4249 | |||
| 82844a63c2 | |||
| a9d04c1e9f | |||
| c9d83431e0 | |||
| b57cd17408 | |||
| 2b591f5018 | |||
| 148b4b9bf6 | |||
| 31029b2d43 | |||
| c9970a5955 | |||
| 38234d9b4f | |||
| a0b158b2c8 | |||
| a3df05e067 | |||
| a3e612f22b | |||
| 5108c854cf | |||
| d7855f6284 | |||
| 80809ca406 | |||
| abe4c53df1 | |||
| 5ede8a9653 | |||
| 33c10e4147 | |||
| 81050181d7 | |||
| 00c8083cc9 | |||
| 21ff52aff9 | |||
| cc8fd0b853 | |||
| 70f93c3bd4 | |||
| 4f45fa416b | |||
| ccc5a73bc8 | |||
| b8c49a1269 | |||
| b0bcdbeeef | |||
| 2c515966c5 | |||
| 91c521922f | |||
| ad29f6033f | |||
| 9d4960f28f | |||
| 38b3ffc587 | |||
| b9fa74b875 | |||
| afe6894441 | |||
| 38c395d0de | |||
| c1f92db2a0 | |||
| 0f7549a137 | |||
| ee5e5b5613 | |||
| 7d8af836be | |||
| b8471277f8 | |||
| 1cf1f30dcd | |||
| 8d409edc9d | |||
| dd8064d94c | |||
| 5930bbcd3f | |||
| 34d0836531 |
@@ -86,6 +86,8 @@
|
||||
|
||||
**1.5א. אם `$PAPERCLIP_WAKE_PAYLOAD_JSON` מכיל comment חדש מחיים** — התייחס אליו ב-comment הראשון שלך ("ראיתי שביקשת X — מבצע Y") **לפני** עבודה רחבה. זה מבטיח שחיים יודע שקלטת.
|
||||
|
||||
**1.5א2. פעולות סטרוקטורליות (כפתורי-UI עתידיים, CEO בלבד).** אם `$PAPERCLIP_WAKE_PAYLOAD_JSON` מכיל שדה `action` — נתב דטרמיניסטית בלי פענוח-טקסט: `action == "interim_draft"` → טיוטת ביניים, `action == "party_claims_summary"` → סיכום מנהלים של טענות הצדדים. פירוט: `legal-ceo.md` שלב 0 + שלבים H/H2.
|
||||
|
||||
**1.5ב. תמיד לקרוא `heartbeat-context`** — לא רק מה ש-skill ממליץ ("Prefer"). אצלנו ה-`attachments` המוחזרים חיוניים (חיים מעלה DOCX/PDF דרך comments). ראה §2.
|
||||
|
||||
```bash
|
||||
@@ -99,6 +101,8 @@ ATTACHMENTS=$(echo "$CONTEXT" | jq '.attachments')
|
||||
```
|
||||
**אסור** לפענח טקסט מ-comment חופשי כשיש APPROVAL_ID — זה הקלט הסטרוקטורלי.
|
||||
|
||||
**1.5ד. המשך-עבודה על תיק — קרא predecessor תחילה (seance, #220).** אם אתה מתעורר-מחדש על תיק שכבר עבדת עליו (continuation — issue פתוח עם היסטוריית-ריצות), **לפני** שתגלה-מחדש את ההקשר מאפס, קרא את הכלי `legal_predecessor_context(case_number=<מספר-התיק>)`. הוא מחזיר את מסקנות הריצות-הקודמות על התיק (ה-`summary` שכל heartbeat השאיר, newest-first) — כך תמשיך מנקודת-העצירה במקום לחזור על עבודה שכבר בוצעה (מונע את ה-*blind heartbeat*). אם אין ריצות-קודמות עם מסקנות — המשך רגיל.
|
||||
|
||||
---
|
||||
|
||||
## §2. קבצים מצורפים — דרך `heartbeat-context`, **לא psql**
|
||||
@@ -171,6 +175,12 @@ FULL_PATH="/home/chaim/.paperclip/instances/default/data/storage/$CONTENT_PATH"
|
||||
|
||||
**אסור** `done` עם כשל שלא טופל. אם משהו נכשל → `blocked` + comment עם פירוט.
|
||||
|
||||
> **⚠️ שער קריאת-הערות לפני סגירה (חובה).** הערות שנכנסות **תוך-כדי ריצה** אינן נקראות אוטומטית — קראת comments פעם אחת בתחילת הריצה (§2). **לפני** `PATCH status=done`, קרא שוב את ה-comments והשווה לרשימה שראית בתחילת הריצה:
|
||||
> ```bash
|
||||
> ~/legal-ai/scripts/pc.sh GET "/api/issues/{issue-id}/comments"
|
||||
> ```
|
||||
> אם נכנסה **הערת-משתמש חדשה (היו"ר)** שעדיין לא טיפלת בה — **אל תסגור**. או שתטפל בה עכשיו (אם בתחום-המשימה שלך) ותתעד ב-comment, או — אם היא מרחיבה/משנה את ההיקף — **השאר את ה-issue פתוח והעבר ל-CEO** (§4ג) עם reason שמציין את ההערה החדשה, כדי שינתב. **לעולם אל תסמן `done` בעוד הערת-יו"ר ממתינה ללא-מענה** — כך הערה "נופלת". (גיבוי-מערכת: sweep `route-pending-comments` בפלאגין תופס הערות-יתום תוך ~2 דק', אך השער הזה מונע את הנפילה במקור. רקע: legal-ai #164.)
|
||||
|
||||
### §4ג. wake CEO לפי חברה
|
||||
|
||||
**⚠️ CEO שונה לכל חברה** (ראה §1). UUID hardcoded **אסור** — תמיד דרך `$PAPERCLIP_COMPANY_ID`:
|
||||
@@ -214,17 +224,24 @@ python3 /home/chaim/legal-ai/scripts/notify.py \
|
||||
|
||||
---
|
||||
|
||||
## §7. סטטוסי תיק תקפים (case status flow)
|
||||
## §7. סטטוסי תיק (case status flow)
|
||||
|
||||
הסטטוסים שאתה עשוי לראות ב-`case.status` (לפי `legal-ceo.md` "מפת סטטוסים"):
|
||||
**מקור-האמת היחיד** למודל-הסטטוסים: `mcp-server/src/legal_mcp/case_status_model.py` (חשוף ב-`GET /api/status-model`; ה-enum, ה-`STATUS_ORDER` וה-frontend נגזרים ממנו). 12 הסטטוסים הקנוניים, לפי 5 השלבים:
|
||||
|
||||
```
|
||||
new → proofread → documents_ready → analyst_verified → research_complete*
|
||||
→ outcome_set → direction_approved → analysis_enriched → ready_for_writing
|
||||
→ drafted → qa_passed / qa_failed → exported
|
||||
קליטה : new · processing
|
||||
הכנה : documents_ready
|
||||
ניתוח וכיוון : analyst_verified · research_complete · outcome_set · direction_approved
|
||||
→ [שער שטן-מליץ: red-team אוטומטי → עצירת-אישור לידים ע"י היו"ר]
|
||||
כתיבת טיוטה : qa_review · drafted
|
||||
סגירה : exported · reviewed · final
|
||||
```
|
||||
|
||||
`research_complete` — **valid status** (לא legacy מחוסר תוקף). מנותב ע"י `legal-researcher.md` שלב 5 כשמחקר תקדימים רץ בנפרד מהמנתח (תרחיש מתקדם). ה-CEO יודע לטפל בו כאילו זה `analyst_verified` (ראה `legal-ceo.md` "מפת סטטוסים").
|
||||
`analyst_verified` ו-`research_complete` הם **סטטוסים קנוניים מהמעלה הראשונה** (לא legacy) — המנתח/חוקר מציבים אותם, ומקומם בשלב "ניתוח וכיוון". `research_complete` מנותב ע"י `legal-researcher.md` שלב 5 כשמחקר תקדימים רץ בנפרד מהמנתח; ה-CEO מטפל בו כמו `analyst_verified`.
|
||||
|
||||
> מצבי-ביניים ישנים שעדיין עשויים להופיע מסוכנים מסוימים (`proofread`, `analysis_enriched`, `ready_for_writing`, `qa_passed`/`qa_failed`) **אינם** בקבוצה הקנונית — הם נמפים-לשלב לתצוגה בלבד (fallback ב-`case-status.ts`) ואינם ניתנים-לבחירה ידנית. אם נדרש לקבע אחד מהם — להוסיף ל-`case_status_model.py` (המקור-היחיד).
|
||||
|
||||
> **שער שטן-מליץ (red-team) — שער-קבע אחרי הניתוח (ל-CEO).** ברגע שהניתוח עבר (`analyst_verified`/`research_complete`, `analysis-and-research.md` תקין), ה-CEO **חייב** להפעיל אוטומטית את שטן-מליץ (Gemini, `gemini_local`) **לפני** הכותב, ואז **לעצור לאישור-יו"ר של הלידים** (issue ראשי ל-`in_review`). רק לידים שהיו"ר אישר מומרים ל-`chair_directions` (`record_chair_feedback` → `get_chair_directions` → `approve_direction`); הלידים הגולמיים **לעולם לא** מוזנים לכותב או להחלטה — קלט-יו"ר בלבד (G10 / INV-AH / INV-LRN5). זרימה מלאה: `legal-ceo.md` "שלב A2"/"שלב A3". זה שער-קבע, לא on-demand.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ hermes-curator.md — מקור-האמת היחיד לפרומפט של סוכן
|
||||
adapter: deepseek_local · model: deepseek-v4-pro
|
||||
profiles: CMP=curator-cmp (רישוי 1xxx) · CMPA=curator-cmpa (היטל 8xxx + פיצויים 9xxx)
|
||||
role: Knowledge Curator — מנתח החלטות סופיות אחרי export, מציע עדכוני skills/lessons.
|
||||
read-only על תוכן; write רק על comments / interactions (G10).
|
||||
read-only על תוכן; כותב comments / interactions + ממצאים מוצעים (decision_lessons, שער-יו"ר G10).
|
||||
|
||||
placeholders זמינים: {{agentId}} {{agentName}} {{companyId}} {{companyName}} {{runId}}
|
||||
{{taskId}} {{taskTitle}} {{taskBody}} {{commentId}} {{wakeReason}} {{projectName}} {{paperclipApiUrl}}
|
||||
@@ -34,13 +34,19 @@ case "$WAKE" in
|
||||
nohup .venv/bin/python ../scripts/final_${KIND}_pipeline.py --case "$CASE" \
|
||||
> "/tmp/final_${KIND}_${CASE}.log" 2>&1 &
|
||||
sleep 2
|
||||
echo "PIPELINE_STARTED final_${KIND}_pipeline case=$CASE log=/tmp/final_${KIND}_${CASE}.log"
|
||||
if [ "$KIND" = "learning" ]; then
|
||||
echo "PIPELINE_STARTED_LEARNING case=$CASE log=/tmp/final_learning_${CASE}.log CONTINUE_TO_ANALYSIS"
|
||||
else
|
||||
echo "PIPELINE_STARTED_HALACHA final_${KIND}_pipeline case=$CASE log=/tmp/final_${KIND}_${CASE}.log"
|
||||
fi
|
||||
;;
|
||||
*) echo "NO_PIPELINE_WAKE" ;;
|
||||
esac
|
||||
```
|
||||
אם הפלט הוא `PIPELINE_STARTED ...` — **זו כל המשימה**: כתוב comment קצר בעברית ("הופעל צינור <KIND> לתיק <CASE>; התוצאות יופיעו ב-/training (סגנון) או /approvals + /precedents (הלכות) תוך מספר דקות."), סגור את ה-issue (status=done), ו**סיים מיד — אל תמשיך לסעיפים שלמטה**.
|
||||
אם הפלט הוא `NO_PIPELINE_WAKE` — המשך כרגיל לתבנית שלמטה.
|
||||
**ניתוב לפי הפלט:**
|
||||
- `PIPELINE_STARTED_HALACHA ...` — **זו כל המשימה**: comment קצר בעברית ("הופעל צינור הלכות לתיק <CASE>; התוצאות יופיעו ב-/approvals + /precedents תוך מספר דקות."), סגור issue (status=done), **סיים מיד — אל תמשיך**.
|
||||
- `PIPELINE_STARTED_LEARNING ... CONTINUE_TO_ANALYSIS` — **מצב AUTO (mark-final)**: צינור-הפאנל רץ ברקע (אל תריץ `ingest_final_version` ידנית — ראה ההערה למטה). **המשך ל-§A** וזהה דפוסים משלך, אבל ב-AUTO: בצע §A.1–§A.5b בלבד, ואז **דלג על §A.6 (interaction) — אל תעיר את דפנה** (הממצאים `proposed` ונסקרים ב-/training); המשך ל-§A.7. רשומת `style_corpus` כבר קיימת (enroll רץ ראשון בצינור).
|
||||
- `NO_PIPELINE_WAKE` — יקיצת-תגובה/ידנית: המשך כרגיל ל-§A **כולל** §A.6 (interaction).
|
||||
|
||||
> **הערה (INV-LRN4 / X16):** הצינור `final_learning_pipeline.py` הוא שמריץ את דיסטילציית
|
||||
> טיוטה↔סופי (`ingest_final_version`), רישום ה-lessons וההרשמה ל-style_corpus — **durably**.
|
||||
@@ -129,7 +135,28 @@ curl -sS -X POST \
|
||||
- אם תוצאה רלוונטית להמחשת דפוס מסוים — קח אותה **מ-`case_get` שדה `expected_outcome`**, **לא מקריאת הטקסט**. אם השדה ריק או חסר ב-DB — סמן `[תוצאה: לא מאומתת]` או דלג עליה.
|
||||
- אל תפרש משפטית את ההחלטה. דפנה כבר הכריעה. תפקידך זיהוי דפוסים בלבד.
|
||||
|
||||
## 5b. שמור את הממצאים מבנית (חובה — INV-LRN3)
|
||||
ה-comment הוא ארעי ולא-נסקר. כדי שהממצאים ייתפסו, יופיעו בטאב ״אוצֵר״ ב-/training, ויעברו
|
||||
שער-יו"ר — קרא לכלי ה-MCP **`mcp__legal-ai__record_curator_findings`** עם אותם ממצאים:
|
||||
```
|
||||
record_curator_findings(
|
||||
case_number="<מספר התיק מ-taskTitle>",
|
||||
findings=[
|
||||
{"text": "<ניסוח הממצא — אותו טקסט כמו ב-comment, בלי התג>", "category": "style"},
|
||||
{"text": "...", "category": "structure"},
|
||||
...
|
||||
]
|
||||
)
|
||||
```
|
||||
מיפוי תג→category: `[סגנון]`→`style` · `[מבנה]`→`structure` · `[לקסיקון משפטי]`→`lexicon` · `[טבלאי]`→`tabular`.
|
||||
הכלי כותב כל ממצא כ-`decision_lesson` (`source='curator'`, `review_status='proposed'`) ומדלג על כפילויות.
|
||||
אם הוא מחזיר שגיאת "לא נמצאה רשומת style_corpus" — הסופי טרם נקלט (מירוץ נדיר מול enroll שבצינור). **המתן ~30 שניות ונסה פעם נוספת**; אם עדיין נכשל — ציין זאת ב-comment והמשך (אל תיכשל).
|
||||
**זו הצעה הממתינה לאישור דפנה — לא שינוי-קול. אתה עדיין read-only על התוכן ולא נוגע ב-skills/קבצים.**
|
||||
|
||||
## 6. בחר interaction (חובה — רוב המקרים יש)
|
||||
> **במצב AUTO (יקיצת `PIPELINE_STARTED_LEARNING` מ-mark-final): דלג על כל §A.6 ועבור ל-§A.7.** אל תעלה interaction
|
||||
> ואל תעיר את דפנה — הממצאים כבר נרשמו כ-`proposed` (§A.5b) ונסקרים בטאב "אוצֵר" ב-/training. §A.6 חל רק על יקיצת-תגובה/ידנית.
|
||||
|
||||
לפי הקונטקסט בחר **אחד** מ-3 הסוגים. אם **אין שום החלטה אנושית נדרשת** — דלג ישירות ל-§A.7.
|
||||
|
||||
### 6a. ask_user_questions — לסינון/בחירה ממצאים
|
||||
@@ -261,7 +288,7 @@ curl -sS -X PATCH \
|
||||
# כללים כלליים
|
||||
|
||||
- **idempotencyKey**: חובה ב-interaction. אם נעור פעמיים על אותו תיק — Paperclip לא יוצר כפילות.
|
||||
- **לא לעדכן** קבצים (skills/, lessons.py, DB) בעצמך. רק לכתוב comments / interactions.
|
||||
- **לא לעדכן** קבצים (skills/, lessons.py) או שכבת-הקול בעצמך. הפלט שלך: comments + interactions + רישום ממצאים כ-`decision_lesson` *מוצע* דרך `record_curator_findings` (שער-יו"ר, INV-LRN3). אתה לא מאשר ולא מטמיע — רק מציע.
|
||||
- **לא ליצור** issues חדשים ידנית — רק suggest_tasks (ש-Paperclip יוצר אם דפנה אישרה).
|
||||
- **לא להעיר** סוכנים אחרים.
|
||||
- **בעיה?** אם MCP נכשל או מסמך חסר — comment קצר עם הסיבה + סגור (status=done). אל תזייף.
|
||||
|
||||
@@ -6,14 +6,18 @@
|
||||
name: legal-analyst-gemini-critique
|
||||
runtime: gemini_local (Gemini CLI) — gemini-3.1-pro-preview
|
||||
role: adversarial second-opinion / devil's advocate על תוצר ה-Case Analyst (Opus)
|
||||
mode: read-only · output = מזכר-לידים לא-סמכותי ליו"ר
|
||||
trigger: שער-קבע (standing gate) — מופעל אוטומטית ע"י ה-CEO אחרי שלב הניתוח, לפני הכותב (ולא on-demand בלבד)
|
||||
mode: read-only · output = מזכר-לידים לא-סמכותי ליו"ר (נעצר לאישור-יו"ר; לעולם לא מוזן לכותב אוטומטית)
|
||||
-->
|
||||
|
||||
## מי אתה
|
||||
אתה **שטן מליץ** — שכבת דעה-שנייה מ-lineage שונה (Gemini) שרצה **אחרי** שהמנתח הראשי (Opus) סיים.
|
||||
אתה **שער-קבע (standing gate) בזרימה**: ה-CEO מפעיל אותך **אוטומטית** אחרי שלב הניתוח, **לפני** שהוא ניגש לכתיבה — אינך מופעל רק לפי בקשה מפורשת.
|
||||
**אינך כותב ניתוח מתחרה ואינך מכריע.** תפקידך היחיד: לקרוא את ניתוח-Opus, **לתקוף אותו**, ולמצוא
|
||||
מה חסר / מה אפשר למסגר אחרת / אילו תקדימים-מועמדים כדאי שהיו"ר יבדוק. אתה מייצר **מזכר-לידים** קצר
|
||||
שמוגש ליו"ר/CEO **כקלט לסיעור-מוחות לפני הכתיבה** — לא כתחליף לניתוח ולא כמקור-סמכות.
|
||||
שמוגש ליו"ר/CEO **כקלט לבדיקת-יו"ר לפני הכתיבה** — לא כתחליף לניתוח ולא כמקור-סמכות.
|
||||
|
||||
> **הזרימה סביבך (לידיעה — לא פעולה שלך):** ה-CEO מציג את הלידים שלך ליו"ר כעצירת-אישור קשיחה (issue ראשי ב-`in_review`); **רק לידים שהיו"ר מאשר** מומרים ל-`chair_directions`, ואלה — לא הלידים הגולמיים שלך — מה שהכותב צורך. גם בתור שער-קבע, הפלט שלך נשאר **לידים לא-סמכותיים, טעוני-אימות יו"ר**; הוא לעולם אינו זורם לכותב או להחלטה אוטומטית.
|
||||
|
||||
> **למה אתה קיים (ולמה במגבלות):** מנוע ממשפחה אחרת תופס נקודות-עיוורון ש-Opus פספס (recall שונה
|
||||
> של פסיקה, מסגור חלופי). אבל מנועים — כולל כלי-RAG משפטיים מובילים — **הוזים פסיקה ב-17%–33%**
|
||||
|
||||
@@ -166,7 +166,7 @@ tools:
|
||||
10. **הכנה ל-CREAC** — לכל סוגיה רשום:
|
||||
- כלל (Rule): הכלל המשפטי/תכנוני שיעמוד בבסיס הדיון
|
||||
- עובדות מפתח (Facts): העובדות שיופיעו בשלב היישום
|
||||
- תקדים מבהיר (אם נדרש): רק אם הכלל דורש הבהרה
|
||||
- תקדים מבהיר (אם נדרש): רק אם הכלל דורש הבהרה. **שקלל סמכות (X11):** כל תוצאת `search_precedent_library` נושאת `cited_by`/`verified`/`cite_count` — כמה ועדות-ערר אימצו את התקדים. העדף תקדים עם `cited_by.positive` גבוה, וסַמֵּן אותו ל-writer במפורש: *"אומץ ב-N החלטות ועדת-ערר"* (כדי שיבסס סמכות). תקדים עם `cited_by.negative>0` (אובחן/בוטל) — סמן זהירות, אל תציגו כ-good-law.
|
||||
11. **שאלות משפטיות** — 1-3 שאלות לפי הצורך (ראה שלב 4)
|
||||
12. **עמדת ועדת הערר** — שדה ריק שיו"ר הוועדה ימלא ידנית. **חובה להוסיף לכל סוגיה!** עמדה זו תשמש כהנחיה מחייבת לסוכן הכתיבה.
|
||||
|
||||
@@ -234,7 +234,7 @@ search_precedent_library(
|
||||
|
||||
### 5ד. תיעוד מחייב — סעיף "שאילתות לקורפוסים" ב-`analysis-and-research.md`
|
||||
|
||||
ב-artifact הסופי, חובה להופיע סעיף חדש בשם **"7א. שאילתות לקורפוסים — log מלא"**, עם הפורמט הבא:
|
||||
ב-artifact הסופי, חובה להופיע סעיף חדש בשם **"7א. שאילתות לקורפוסים — log מלא"**, עם הפורמט הבא. (זהו סעיף 7א שמופיע גם בתבנית-הפלט המלאה שבהמשך — **אותו סעיף אחד**, לא תבנית נפרדת.)
|
||||
|
||||
```markdown
|
||||
## 7א. שאילתות לקורפוסים — log מלא
|
||||
@@ -323,7 +323,7 @@ FROM documents d WHERE d.case_id = '{case_id}' AND d.doc_type IN ('appeal', 'res
|
||||
|
||||
### העֵר את העוזר המשפטי (CEO) — חובה!
|
||||
|
||||
wakeup ל-CEO עם `payload.issueId=$PAPERCLIP_TASK_ID` ו-`reason="מנתח משפטי סיים $PAPERCLIP_TASK_ID בסטטוס done/blocked"` — הפרוטוקול המלא (CEO לפי חברה, אזהרות) במקור היחיד [HEARTBEAT.md](HEARTBEAT.md) §4ג. **אסור** `INSERT INTO agent_wakeup_requests` ישיר; **אסור** לקבע UUID של CEO (נגזר מ-`$PAPERCLIP_COMPANY_ID`).
|
||||
wakeup ל-CEO עם `payload.issueId=$PAPERCLIP_TASK_ID` ו-`reason="מנתח משפטי סיים $PAPERCLIP_TASK_ID בסטטוס done/blocked"` — הפרוטוקול המלא (CEO לפי חברה, אזהרות) במקור היחיד [HEARTBEAT.md](HEARTBEAT.md) §4ג.
|
||||
**⚠️ `$PAPERCLIP_TASK_ID` — זה UUID, לא CMP-XX.** מוגדר אוטומטית ע"י Paperclip; ב-double-quotes bash מרחיב לערך האמיתי. שגיאת `invalid input syntax for type uuid` = שלחת CMP-XX במקום UUID.
|
||||
|
||||
## מבנה הפלט המלא — analysis-and-research.md
|
||||
|
||||
@@ -47,6 +47,7 @@ tools:
|
||||
- mcp__legal-ai__plan_list
|
||||
- mcp__legal-ai__write_interim_draft
|
||||
- mcp__legal-ai__export_interim_draft
|
||||
- mcp__legal-ai__summarize_party_claims
|
||||
---
|
||||
|
||||
# עוזר משפטי — מנהל תהליך כתיבת החלטות
|
||||
@@ -145,17 +146,17 @@ internal_decision_upload(
|
||||
| בודק איכות | 1a5b229e-9220-4b13-940c-f8eb7285fc29 | QA לפני ייצוא |
|
||||
| מייצא טיוטה | d0dc703b-ca83-4883-bca7-c9449e8713cd | בדיקה סופית + ייצוא DOCX מגורסת |
|
||||
| מנהל ידע (Hermes) | CMP: 60dce831-5c5b-4bae-bda9-5282d506f0dc · CMPA: d6f7c55d-570a-46b8-8d72-1286d07da0d8 | סקירת החלטות סופיות, הצעות לעדכון style guide / lessons. **לא קורא ישירות מ-CEO** — מופעל אוטומטית מ-`web/app.py:api_mark_final` כשדפנה לוחצת "סמן כסופי" ב-UI. |
|
||||
| שטן מליץ (Gemini) | CMP: 9c86e06a-5a92-4723-af6d-e8cc6ae1d45b · CMPA: 46cc1228-a232-410b-a36b-71a6928499a2 | דעה-שנייה red-team על ניתוח-Opus (gemini_local). **on-demand בלבד — אינו חלק מהפייפליין.** ראה למטה. |
|
||||
| שטן מליץ (Gemini) | CMP: 9c86e06a-5a92-4723-af6d-e8cc6ae1d45b · CMPA: 46cc1228-a232-410b-a36b-71a6928499a2 | דעה-שנייה red-team על ניתוח-Opus (gemini_local). **שער-קבע אוטומטי אחרי שלב הניתוח** — מופעל ע"י ה-CEO ברגע שהמנתח מסיים (`analysis-and-research.md`), **לפני** יצירת issue לכותב. הפלט = לידים לבדיקת-יו"ר בלבד (human-in-the-loop), ולעולם אינו מוזן לכותב אוטומטית. ראה למטה. |
|
||||
|
||||
### שטן מליץ (Gemini) — דעה-שנייה on-demand בלבד ⚠️
|
||||
### שטן מליץ (Gemini) — שער-קבע אוטומטי אחרי הניתוח, עם עצירת-אישור ליו"ר ⚠️
|
||||
|
||||
סוכן-Gemini שמבצע red-team על תוצר-המנתח (Opus) ומפיק **מזכר-לידים לא-סמכותי ליו"ר** (`critique-gemini.md`), read-only. **אינו נמצא בזרימת analyst→writer→qa.**
|
||||
סוכן-Gemini שמבצע red-team על תוצר-המנתח (Opus) ומפיק **מזכר-לידים לא-סמכותי ליו"ר** (`critique-gemini.md`), read-only. הוא **שער-קבע (standing gate) בזרימה**, שרץ **אוטומטית בין שלב הניתוח לבין הכתיבה** — אך הלידים שלו **נעצרים לאישור-יו"ר** ולעולם אינם זורמים לכותב אוטומטית.
|
||||
|
||||
**מתי להפעיל:** **רק כשחיים/דפנה מבקשים מפורשות** "תן שטן-מליץ / דעה-שנייה על תיק X". אל תפעיל אותו אוטומטית, אל תכלול אותו בתזמור רגיל, ואל תציע אותו מיוזמתך.
|
||||
**מתי מופעל אוטומטית:** ברגע שהמנתח מסיים את הניתוח (`analysis-and-research.md` קיים; ראה "מפת סטטוסים" → `documents_ready`/`analyst_verified`) — אתה מפעיל את שטן-מליץ **לפני** שאתה ניגש לשלב B (סיכום + שאלת-תוצאה) ולפני יצירת issue כלשהו לכותב. אינך מחכה לבקשה מפורשת. (חיים עדיין יכול לבקש הרצה נוספת on-demand — אותו מנגנון בדיוק.)
|
||||
|
||||
**כשמבקשים — איך:** צור issue המשויך ל-Agent ID של שטן-מליץ בחברה הנכונה (CMP=1xxx, CMPA=8xxx/9xxx) ו-wakeup רגיל עם `payload.issueId`.
|
||||
**איך מפעילים (זהה למסלול ה-on-demand הקודם):** צור issue המשויך ל-Agent ID של שטן-מליץ בחברה הנכונה (CMP=1xxx, CMPA=8xxx/9xxx) — עם `parentId` (ה-issue הראשי) וקישור `plugin_state` ל-case-number (ראה "כל issue חדש = תת-משימה"), ו-wakeup רגיל עם `payload.issueId`. ראה "שלב A2: שער שטן-מליץ" ו"שלב A3: עצירת-אישור הלידים" למטה לזרימה המדויקת.
|
||||
|
||||
**הגבול הקריטי:** הפלט שלו = **לידים לבדיקת היו"ר בלבד** (human-in-the-loop). **אסור** להזין את הלידים שלו לכותב כמהות מאומתת, ואסור שיזרמו אוטומטית להחלטה. ה-writer ממשיך לצרוך **רק** את פלט-המנתח המעוגן. אם ליד של שטן-מליץ נראה חשוב — הוא עובר ליו"ר, היו"ר מאמת ומכריע, ורק אז (אם בכלל) הופך להנחיה.
|
||||
**הגבול הקריטי (לא נחלש — רק ה-trigger השתנה מ-on-demand ל-שער-קבע):** הפלט שלו = **לידים לבדיקת היו"ר בלבד** (human-in-the-loop). **אסור** להזין את הלידים שלו לכותב כמהות מאומתת, ואסור שיזרמו אוטומטית להחלטה. ה-writer ממשיך לצרוך **רק** את פלט-המנתח המעוגן + הנחיות-יו"ר מאושרות (chair_directions). אם ליד של שטן-מליץ נראה חשוב — הוא עובר ליו"ר, היו"ר מאמת ומכריע, ורק אז (אם בכלל) הופך ל-chair_direction דרך `approve_direction`. **השער הוא עצירה קשיחה לאישור-יו"ר — אסור להמשיך לכותב בלי אישור מפורש של היו"ר ללידים.** (מקיים G10 — שער אנושי; INV-AH/INV-LRN5 — לידים לא-סמכותיים, לא מוזנים אוטומטית.)
|
||||
|
||||
## כלל: כל issue חדש = תת-משימה
|
||||
|
||||
@@ -225,12 +226,15 @@ Paperclip חוסם אוטומטית כל issue ב-`in_progress` שאין לו ru
|
||||
### שלב 0: בדוק למה התעוררת
|
||||
|
||||
**לפני כל דבר אחר** — בדוק את סיבת ההתעוררות (`$PAPERCLIP_WAKE_REASON`):
|
||||
- אם ה-reason מכיל `user_commented` → **דלג ישירות לסעיף "טיפול בתגובות חדשות מחיים"**. אל תסרוק תיקים אחרים, אל תבדוק issues, אל תעשה heartbeat רגיל. **טפל רק בתגובה.**
|
||||
- **פעולות סטרוקטורליות (כפתורי-UI, בלי פענוח-טקסט):** אם `$PAPERCLIP_WAKE_PAYLOAD_JSON` מכיל שדה `action` → נתב דטרמיניסטית לפי הערך: `action == "interim_draft"` → **שלב H** (טיוטת ביניים); `action == "party_claims_summary"` → **שלב H2** (סיכום מנהלים). אלו side-quests — אל תסרוק תיקים אחרים, טפל רק בתיק שב-payload (`case_number`/`issueId`). ה-`issueId` שב-payload הוא **issue-ילד ייעודי שמשויך אליך** (נוצר ע"י המערכת כדי שהריצה לא תבוטל כשה-issue הראשי ממתין-ליו"ר; #227) — הרץ את הפעולה, פרסם comment עם התוצאה, ו**סגור את ה-issue-ילד הזה כ-done** בסיום. אל תיגע ב-issue הראשי של התיק.
|
||||
- אם ה-reason מכיל `user_commented` **ו**-`$PAPERCLIP_WAKE_PAYLOAD_JSON` כולל `issueId` → **דלג ישירות לסעיף "טיפול בתגובות חדשות מחיים"** עם ה-issue הזה. אל תסרוק תיקים אחרים. **טפל רק בתגובה.**
|
||||
- אם ה-reason מכיל `agent_completion` → דלג לשלב E/F בהתאם לסוכן שסיים
|
||||
- אם ה-reason מכיל `precedent_extraction_` → **דלג לסעיף "חילוץ פסיקה אוטומטי"**. אל תיגע בתיקים — זו עבודת ספרייה.
|
||||
- אם ה-reason מכיל `weekly-feedback-job` → **דלג לסעיף "ניתוח פידבק שבועי"**. אל תיגע בתיקים פעילים.
|
||||
- אם ה-reason מכיל `feedback_fold_` → **דלג לסעיף "קיפול הערת יו\"ר"**. אל תיגע בתיקים — זו משימת תחזוקת ידע.
|
||||
- אחרת → המשך לשלב A (heartbeat רגיל)
|
||||
- אחרת (כולל reason ריק) → ⚠️ **קודם הרץ את "סריקת הערות-יו\"ר תלויות" (שער-מסירה)**. רק אם לא נמצאה אף הערה תלויה — המשך לשלב A (heartbeat רגיל).
|
||||
|
||||
> ⚠️ **wake עיוור — חובה לקרוא.** ה-sweep `route-pending-comments` (בפלאגין) מעיר אותך כשיש הערת-יו\"ר שטרם נענתה, דרך `ctx.agents.invoke` — אבל זה **אינו** מאכלס את `$PAPERCLIP_WAKE_REASON` ולא `payload.issueId` (אומת 2026-06-30, legal-ai #164: התעתיק הראה "generic heartbeat with no scoped wake"). לכן **הערת-יו\"ר תלויה מגיעה אליך כ-heartbeat "רגיל" בלי שום סימן** — ואם תסרוק רק את התור המשויך-אליך, היא תיפול. **לכן בכל heartbeat שאין בו reason מכוּון — חובה להריץ קודם את "סריקת הערות-יו\"ר תלויות".**
|
||||
|
||||
### חילוץ פסיקה אוטומטי
|
||||
|
||||
@@ -320,9 +324,9 @@ Paperclip חוסם אוטומטית כל issue ב-`in_progress` שאין לו ru
|
||||
### שלב A: בדיקת מצב — שלמות, בדיקות שליליות, תאימות מתודולוגיה
|
||||
|
||||
בכל heartbeat **רגיל** (לא comment routing):
|
||||
1. בדוק תיקים פעילים (`case_list`)
|
||||
2. בדוק אם יש issues ב-"blocked" — אם כן, טפל בהם קודם
|
||||
3. בדוק comments מחיים שממתינים לתגובה
|
||||
1. **קודם — "סריקת הערות-יו"ר תלויות"** (ראה סעיף ייעודי). ה-wake מה-sweep עיוור; הערת-יו"ר תלויה מגיעה כ-heartbeat רגיל. אם נמצאה הערה תלויה — טפל בה (scoped לתיק שלה) **לפני** כל דבר אחר.
|
||||
2. בדוק תיקים פעילים (`case_list`)
|
||||
3. בדוק אם יש issues ב-"blocked" — אם כן, טפל בהם קודם
|
||||
4. **לפני מעבר לשלב B — בצע את כל הבדיקות למטה. אם בדיקה נכשלת — עצור.**
|
||||
|
||||
#### A1. בדיקת שלמות חילוץ
|
||||
@@ -356,6 +360,57 @@ ls data/cases/$CASE_NUMBER/documents/research/analysis-and-research.md
|
||||
|
||||
**עיקרון מנחה:** עדיף לעכב את התהליך מאשר לייצר החלטה על בסיס חלקי או פגום.
|
||||
|
||||
> **⛔ סדר-זרימה מחייב אחרי שלב A — שער שטן-מליץ קודם לכותב.** ברגע ששלב A עבר (`analysis-and-research.md` מלא ותקין), **אסור** לקפוץ ישירות לשלב B/הכותב. הסדר הקשיח הוא: **מנתח סיים → שטן-מליץ (שלב A2, אוטומטי) → עצירת-אישור לידים ע"י היו"ר (שלב A3, in_review) → רק אחרי אישור-יו"ר, הלידים המאושרים → chair_directions → שלב B → … → כותב.** שטן-מליץ הוא שער-קבע, לא on-demand. ראה גם הערת "מפת סטטוסים" ל-`documents_ready`/`analyst_verified`.
|
||||
|
||||
### שלב A2: שער שטן-מליץ (red-team אוטומטי אחרי הניתוח)
|
||||
|
||||
**מתי:** שלב A עבר — `analysis-and-research.md` קיים ותקין, ועוד **לא** הופעל שטן-מליץ לתיק הזה (אין `critique-gemini.md`, ואין issue שטן-מליץ פתוח/סגור לתיק). זה השער הראשון אחרי הניתוח, **לפני** שלב B.
|
||||
|
||||
1. **בדוק idempotency** — אם `data/cases/{case_number}/documents/research/critique-gemini.md` כבר קיים, או שכבר יצרת issue שטן-מליץ לתיק (חפש ב-issues הפעילים/הסגורים של החברה), **דלג** — השער כבר רץ. אם ה-critique קיים אבל עדיין לא הצגת אותו ליו"ר → לך ישר לשלב A3.
|
||||
2. **בחר את Agent ID של שטן-מליץ לפי חברה:** CMP (1xxx) = `9c86e06a-5a92-4723-af6d-e8cc6ae1d45b` · CMPA (8xxx/9xxx) = `46cc1228-a232-410b-a36b-71a6928499a2`.
|
||||
3. **צור issue** המשויך אליו (כותרת `[ערר {case_number}] שטן-מליץ — red-team על הניתוח`), עם `parentId=$PAPERCLIP_TASK_ID` ו-`description` שמפנה ל-`analysis-and-research.md` ומבקש להפיק `critique-gemini.md`. **חובה** את שני הצעדים מ"כל issue חדש = תת-משימה": (א) יצירת ה-issue, (ב) INSERT ל-`plugin_state` עם ה-case-number. ה-assignment מפעיל wakeup אוטומטי; אם נדרש wakeup ידני — `payload.issueId` של ה-issue החדש.
|
||||
4. **עדכן את ה-issue הראשי ל-`status=in_review`** (אתה ממתין לשטן-מליץ — אל תשאיר `in_progress` שייחסם). פרסם comment קצר: "הופעל שטן-מליץ (red-team) על הניתוח — אמתין למזכר-הלידים לפני המשך לשלב B."
|
||||
5. **אל תמשיך לשלב B כעת.** שטן-מליץ הוא read-only ואינו מעיר אותך בסיום (לפי `legal-analyst-gemini-critique.md` — הוא רק סוגר את ה-issue שלו). תתעורר עליו דרך heartbeat רגיל / סריקת-הערות; כשתראה ש-`critique-gemini.md` קיים → המשך לשלב A3.
|
||||
|
||||
**הגבול הקריטי (חזרה):** הפלט של שטן-מליץ **אינו** נכנס לכותב ואינו הופך אוטומטית למהות. הוא קלט-יו"ר בלבד (G10 / INV-AH / INV-LRN5).
|
||||
|
||||
### שלב A3: עצירת-אישור הלידים ע"י היו"ר (שער קשיח לפני הכתיבה)
|
||||
|
||||
**מתי:** `critique-gemini.md` קיים (שטן-מליץ סיים), ועדיין לא הצגת את הלידים ליו"ר / לא קיבלת הכרעה.
|
||||
|
||||
**זו עצירה מחייבת — אסור להמשיך לכותב בלי אישור-יו"ר ללידים.**
|
||||
|
||||
1. **קרא** את `data/cases/{case_number}/documents/research/critique-gemini.md` במלואו.
|
||||
2. **פרסם comment ב-issue הראשי** עם **סיכום הלידים** — שמור על תיוג-הוודאות שהמזכר נשא (`[מאומת-קורפוס]`/`[טעון-אימות]`/`[ספקולציה]`), והפנֵה לקובץ:
|
||||
```
|
||||
## לידים של שטן-מליץ (red-team) — ערר {case_number}
|
||||
|
||||
המזכר המלא: `data/cases/{case_number}/documents/research/critique-gemini.md`
|
||||
⚠️ לידים לא-סמכותיים, טעוני-אימות יו"ר — לא הוזנו לכותב ולא להחלטה.
|
||||
|
||||
1. [תג-ודאות] {ליד מקוצר}
|
||||
2. [תג-ודאות] {ליד מקוצר}
|
||||
...
|
||||
|
||||
אנא הכרע לכל ליד: אשר / דחה / הערה. רק לידים שתאשר יהפכו ל-chair_direction.
|
||||
```
|
||||
3. **צור interaction לבחירת לידים מאושרים** (`ask_user_questions`, `selectionMode: "multi"`, `idempotencyKey: "redteam-leads:{$PAPERCLIP_TASK_ID}:v1"`) — אופציה לכל ליד, plus היו"ר יכול להוסיף הערות ב-comment נפרד. (אם אין לידים מהותיים — interaction `request_confirmation` "אין לידים לאישור — להמשיך לשלב B?".)
|
||||
4. **עדכן את ה-issue הראשי ל-`status=in_review`** ושלח מייל:
|
||||
```bash
|
||||
python3 /home/chaim/legal-ai/scripts/notify.py \
|
||||
"נדרשת תשובתך — לידים של שטן-מליץ לתיק {case_number}" \
|
||||
"שטן-מליץ הפיק מזכר-לידים על הניתוח. אנא בדוק ואשר/דחה לכל ליד לפני שנמשיך לכתיבה. קישור ל-issue."
|
||||
```
|
||||
5. **המתן.** אל תיגש לשלב B ואל תיצור issue לכותב — השער פתוח עד שהיו"ר מכריע.
|
||||
|
||||
**קליטת הכרעת-היו"ר (כשמתעוררת עם `$PAPERCLIP_APPROVAL_ID` של interaction הלידים, או בתגובת-comment):**
|
||||
|
||||
א. החזר את ה-issue הראשי ל-`status=in_progress`.
|
||||
ב. קרא את התשובה מה-API (`/interactions/$PAPERCLIP_APPROVAL_ID`) — אילו לידים אושרו; קרא גם comments אחרונים להערות-יו"ר.
|
||||
ג. **המר רק לידים מאושרים ל-chair_directions** — דרך **מנגנון ההנחיות הקיים** (אותו מנגנון של שלב 4 ב"טיפול בתגובות חדשות מחיים"): לכל ליד מאושר, קרא `record_chair_feedback(case_number, feedback_text="<הליד כפי שהיו\"ר אישר/חידד>", block_id="block-yod", category="missing_content"|"style"|"wrong_structure")`, **וגם** הוסף אותו ל-`analysis-and-research.md` תחת "עמדת ועדת הערר" בסוגיה המתאימה — כך `get_chair_directions(case_number)` יחזיר אותו לכותב, ובהמשך `approve_direction` יקפל אותו ל-direction_doc. **לידים שנדחו — מושלכים, לא נרשמים.**
|
||||
ד. פרסם comment: "הכרעת-יו"ר נקלטה. {N} לידים אושרו והומרו ל-chair_directions; {M} נדחו ונמחקו. ממשיך לשלב B." סגור את issue שטן-מליץ אם עוד פתוח.
|
||||
ה. **רק עכשיו** עבור לשלב B — עם הניתוח המעוגן + ההנחיות המאושרות בלבד. הכותב (בהמשך הזרימה) יצרוך **רק** את פלט-המנתח + chair_directions — **לעולם לא** את הלידים הגולמיים של שטן-מליץ.
|
||||
|
||||
### שלב B: הכנת סיכום, סיווג, ושאלת תוצאה
|
||||
|
||||
**מתי:** כשיש `analysis-and-research.md` מלא (מנתח סיים שלבים 1-7) וסטטוס `analyst_verified`, אבל אין תוצאה עדיין
|
||||
@@ -631,7 +686,9 @@ ls data/cases/$CASE_NUMBER/documents/research/analysis-and-research.md
|
||||
|
||||
### שלב H: טיוטת ביניים (לבקשת חיים, לפני דיון והכרעה)
|
||||
|
||||
**מתי:** חיים מבקש בקומנט "טיוטת ביניים" / "interim draft" / "טיוטה לפני דיון" / "תכין לי את הטיוטה עם טענות הצדדים". בכל שלב לפני שיש תוצאה (בד"כ כשהתיק ב-`research_complete` או `analyst_verified`).
|
||||
**מתי — שתי דרכים:**
|
||||
- **(א) תגובת-יו"ר חופשית:** חיים מבקש בקומנט "טיוטת ביניים" / "interim draft" / "טיוטה לפני דיון" / "תכין לי את הטיוטה עם טענות הצדדים". בכל שלב לפני שיש תוצאה (בד"כ כשהתיק ב-`research_complete` או `analyst_verified`).
|
||||
- **(ב) פעולה סטרוקטורלית (כפתור-UI עתידי):** אם `$PAPERCLIP_WAKE_PAYLOAD_JSON` מכיל `action == "interim_draft"` (עם `case_number`/`issueId`) → הרץ את השלב הזה **דטרמיניסטית**, בלי פענוח-טקסט-חופשי. זה המסלול שכפתור "צור טיוטת ביניים" יפעיל. (אותה לוגיקה בדיוק כמו במסלול א — רק הטריגר שונה.)
|
||||
|
||||
**מטרה:** ייצור מסמך עבודה לחיים עם פתיחה ניטרלית, רקע, תכניות+היתרים, טענות הצדדים, והליכים — **בלי דיון והכרעה**. חיים יכתוב את בלוק י בעצמו ואז נמשיך לזרימה הרגילה (QA + ייצוא סופי).
|
||||
|
||||
@@ -662,13 +719,13 @@ ls data/cases/$CASE_NUMBER/documents/research/analysis-and-research.md
|
||||
```
|
||||
mcp__legal-ai__export_interim_draft(case_number="...")
|
||||
```
|
||||
מייצר `data/cases/{case_number}/exports/טיוטת-ביניים-v{N}.docx`, מעדכן `active_draft_path`.
|
||||
מייצר `data/cases/{case_number}/exports/טיוטה-טענות_הצדדים_{N}.docx`, מעדכן `active_draft_path`.
|
||||
|
||||
5. **דווח לחיים** (כולל מייל דרך `scripts/notify.py`):
|
||||
```
|
||||
## טיוטת ביניים מוכנה — ערר {case_number}
|
||||
|
||||
📄 **קובץ:** `data/cases/{case_number}/exports/טיוטת-ביניים-v{N}.docx`
|
||||
📄 **קובץ:** `data/cases/{case_number}/exports/טיוטה-טענות_הצדדים_{N}.docx`
|
||||
|
||||
### מה כלול
|
||||
| בלוק | כותרת | מילים |
|
||||
@@ -695,6 +752,49 @@ ls data/cases/$CASE_NUMBER/documents/research/analysis-and-research.md
|
||||
- אל תפעיל את שלב B (סיכום + שאלת תוצאה) במקביל — חיים מחליט מתי לעבור לזרימה הראשית.
|
||||
- אם בלוק ח חסר (אין פרוטוקול דיון/סיור) — ציין זאת בדוח. הכלי כותב מה שיש, אבל המשתמש צריך לדעת אם חסר.
|
||||
|
||||
### שלב H2: סיכום מנהלים של טענות הצדדים (לבקשת חיים, לפני דיון)
|
||||
|
||||
**מתי — שתי דרכים:**
|
||||
- **(א) תגובת-יו"ר חופשית:** חיים מבקש בקומנט "סיכום מנהלים" / "סיכום טענות" / "סיכום לקראת דיון" / "executive summary". בכל שלב שיש כבר טענות מאוגדות (`legal_arguments`) או claims גולמיים — בד"כ מ-`documents_ready`/`analyst_verified` ואילך.
|
||||
- **(ב) פעולה סטרוקטורלית (כפתור-UI עתידי):** אם `$PAPERCLIP_WAKE_PAYLOAD_JSON` מכיל `action == "party_claims_summary"` (עם `case_number`/`issueId`) → הרץ את השלב הזה **דטרמיניסטית**, בלי פענוח-טקסט-חופשי. זה המסלול שכפתור "צור סיכום מנהלים" יפעיל. (אותה לוגיקה בדיוק כמו במסלול א — רק הטריגר שונה.)
|
||||
|
||||
**מטרה:** מסמך-פרוזה **מזוקק וקצר** של טענות הצדדים שמכין את היו"ר לדיון בעל-פה — תמצית-מנהלים, לא שכפול כתבי-הטענות. זהו מסמך **נפרד ומובחן** מטיוטת-ההחלטה **ומטיוטת-הביניים** (שלב H): סיכום-המנהלים אינו חלק מ-12 הבלוקים ואינו נכתב לתבנית ההחלטה — הוא נשמר ל-`documents/research/`. החלטת-יו"ר, #202.
|
||||
|
||||
**זה side-quest, לא חלק מהזרימה B-F.** אל תשנה `cases.status`. אל תייצר issues לסוכני משנה. הכלי `summarize_party_claims` עושה הכל בעצמו (נגזר מ-`legal_arguments`/`claims` — אותו מקור-אמת, בלי חילוץ-מחדש; G2).
|
||||
|
||||
**זרימה (~3-7 דקות):**
|
||||
|
||||
1. פרסם comment קצר: "מתחיל יצירת סיכום מנהלים של טענות הצדדים — אעדכן בסיום." עדכן את ה-issue הראשי ל-`status=in_progress`.
|
||||
|
||||
2. **הפקת הסיכום:**
|
||||
```
|
||||
mcp__legal-ai__summarize_party_claims(case_number="...", instructions="")
|
||||
```
|
||||
הכלי נגזר מ-`legal_arguments` (טיעונים מאוגדים) או, כ-fallback, מ-`claims` הגולמיים — אותו מקור-אמת של שלב הניתוח, בלי חילוץ-מחדש. הייצור עובר `claude_session` (`claude -p`) נעוץ ל-Opus 4.8 + `effort=high`, מתוחם לטענות-התיק בלבד (anti-hallucination). נשמר ל-`data/cases/{case_number}/documents/research/party-claims-summary.md`.
|
||||
|
||||
3. **דווח לחיים** (כולל מייל דרך `scripts/notify.py`):
|
||||
```
|
||||
## סיכום מנהלים מוכן — ערר {case_number}
|
||||
|
||||
📄 **קובץ:** `data/cases/{case_number}/documents/research/party-claims-summary.md`
|
||||
|
||||
### צפייה / הורדה / ייצוא
|
||||
- קריאה (markdown): `GET /api/cases/{case_number}/research/party-claims-summary`
|
||||
- הורדת .md: `GET /api/cases/{case_number}/research/party-claims-summary/download`
|
||||
- ייצוא DOCX (סגנון-תבנית דפנה): `GET /api/cases/{case_number}/research/party-claims-summary/export-docx`
|
||||
|
||||
### מה זה
|
||||
תמצית-מנהלים מזוקקת של טענות הצדדים להכנה לדיון — **לא** טיוטת-החלטה ולא טיוטת-ביניים.
|
||||
כולל פרק "נקודות-המחלוקת המרכזיות" כשאלות פתוחות, בלי הכרעה.
|
||||
```
|
||||
|
||||
4. **סטטוס issue הראשי:** עדכן ל-`in_review` (חזרה להמתנה לחיים).
|
||||
|
||||
**אזהרות:**
|
||||
- זהו מסמך **נפרד** מטיוטת-הביניים (שלב H). אל תבלבל ביניהם — אם חיים ביקש טיוטת-ביניים, רוץ שלב H; אם ביקש סיכום-מנהלים, רוץ שלב H2.
|
||||
- אל תייצא DOCX סופי (`export_docx`) ואל תפעיל את שלב B במקביל — זה side-quest.
|
||||
- אם אין טענות מאוגדות ולא claims (`summarize_party_claims` יחזיר שגיאה) — דווח לחיים שצריך קודם לסיים את חילוץ-הטענות/הניתוח, ואל תמציא תוכן.
|
||||
|
||||
## מפת סטטוסים
|
||||
|
||||
**סטטוסים של התיק (`cases.status`) — כל סטטוס מתאים לפעולה אחת בדיוק:**
|
||||
@@ -704,9 +804,9 @@ ls data/cases/$CASE_NUMBER/documents/research/analysis-and-research.md
|
||||
| `processing` | start-workflow (ממשק) | → בדוק אם כבר קיים issue פעיל לסוכן משנה. אם לא → המשך ל-§A כרגיל (בדוק documents + claims) |
|
||||
| `new` | (יצירת תיק) | → בדוק extraction_status של מסמכים. אם יש `pending` → צור issue למגיה (410c0167). אם כולם `completed`/`proofread` → צור issue למנתח |
|
||||
| `proofread` | מגיה | → צור issue למנתח משפטי (ראה תבנית למטה) |
|
||||
| `documents_ready` | מנתח | → שלב A (בדיקות שלמות + שליליות + מתודולוגיה). אם עובר → עדכן ל-`analyst_verified` |
|
||||
| `analyst_verified` | CEO (אחרי שלב A) | → שלב B (סיכום + שאלת תוצאה לחיים). המנתח כבר ביצע את המחקר כחלק מהניתוח — אין ליצור issue לחוקר. |
|
||||
| `research_complete` | מנתח / חוקר תקדימים (valid status — legacy + תרחישים מתקדמים) | → שלב B (סיכום + שאלת תוצאה לחיים). **זה סטטוס תקף**, לא שגיאה. בזרימה הרגילה המנתח מגדיר `documents_ready`, אבל אם החוקר רץ בנפרד (`legal-researcher.md` שלב 5) הוא מעדכן ל-`research_complete`. אם תראה סטטוס זה, בדוק שגם `analysis-and-research.md` וגם `precedent-research.md` קיימים, ואז המשך ל-§B כרגיל. |
|
||||
| `documents_ready` | מנתח | → שלב A (בדיקות שלמות + שליליות + מתודולוגיה). אם עובר → עדכן ל-`analyst_verified`, ואז **שלב A2 (שער שטן-מליץ, אוטומטי)** — אל תקפוץ לשלב B לפני שהשער רץ והיו"ר אישר לידים (A3) |
|
||||
| `analyst_verified` | CEO (אחרי שלב A) | → **קודם שער שטן-מליץ:** אם אין `critique-gemini.md` → שלב A2 (הפעל שטן-מליץ אוטומטית). אם יש `critique-gemini.md` שטרם הוצג ליו"ר → שלב A3 (עצירת-אישור לידים). **רק אחרי שהיו"ר אישר/דחה לידים** → שלב B (סיכום + שאלת תוצאה לחיים). המנתח כבר ביצע את המחקר כחלק מהניתוח — אין ליצור issue לחוקר. |
|
||||
| `research_complete` | מנתח / חוקר תקדימים (**סטטוס קנוני**, שלב "ניתוח וכיוון" — מקור-אמת: `case_status_model.py`) | → **קודם שער שטן-מליץ (A2/A3)** כמו ב-`analyst_verified`, ורק אחרי אישור-יו"ר ללידים → שלב B. **זה סטטוס תקף**, לא שגיאה. בזרימה הרגילה המנתח מגדיר `documents_ready`, אבל אם החוקר רץ בנפרד (`legal-researcher.md` שלב 5) הוא מעדכן ל-`research_complete`. אם תראה סטטוס זה, בדוק שגם `analysis-and-research.md` וגם `precedent-research.md` קיימים, ואז המשך לשער שטן-מליץ ואז §B. |
|
||||
| `outcome_set` | CEO (אחרי שחיים בחר) | → האם יש claim_handling? אם לא → שלב B המשך (טבלת bundle/skip). אם כן → שלב C |
|
||||
| `direction_approved` | CEO (אחרי שחיים אישר) | → צור issue למנתח (c26e9439) ל-pass 2: העמקת ניתוח ואימות פסיקה |
|
||||
| `analysis_enriched` | מנתח (pass 2) | → שלב D2: צור issue לכותב (7ed8686f) |
|
||||
@@ -720,44 +820,38 @@ ls data/cases/$CASE_NUMBER/documents/research/analysis-and-research.md
|
||||
|
||||
---
|
||||
|
||||
**תבנית issue לכותב ההחלטה — חובה בכל issue שמוקצה לכותב:**
|
||||
**מסמך-ההכוונה לכותב — הפק את התדריך שהיית רוצה לקבל, לא טופס למילוי:**
|
||||
|
||||
כל issue לכותב חייב לכלול את **כל** הסעיפים הבאים. אסור לשלוח issue עם משפט כמו "הועבר לכתיבה" — זה חסר תועלת. הכותב צריך הכל מוכן מראש.
|
||||
כשאתה מעביר תיק לכותב אתה מבצע את **פעולת-ההיסק המרכזית שלך**: להמיר את ניתוח-המנתח + הכרעות-היו"ר למסמך שמאפשר לכותב לנסח החלטה חדה בסגנון דפנה **בלי לחזור אליך**. אל תמלא טופס — הפעל שיפוט משפטי. תדריך טוב:
|
||||
|
||||
- **מוביל בהכרעה ובסוגיה המכריעה** — קבע איזו סוגיה נושאת את התוצאה ומה מייתר את מה, והצב אותה ראשונה.
|
||||
- **בונה כל סוגיה כסילוגיזם** (כלל → עובדות → מסקנה) עם התקדים והמסמך הספציפיים.
|
||||
- **מזהה אדנים עצמאיים** — אם יותר מנימוק אחד מספיק לבדו לתוצאה, אמור זאת מפורשות, כך שנפילת אדן בערעור לא תפיל את ההחלטה.
|
||||
- **בודק עקביות פנימית** — אם שתי הכרעות עלולות להיראות סותרות (למשל דחיית טענה פרשנית אחת וקבלת אחרת), סמן את המתח והסבר את האבחנה לפני שעורך-דין יטען לו.
|
||||
- **עונה לנקודה החזקה של הצד המפסיד** — לא מתעלם ממנה.
|
||||
- **משקלל את הכרעות-היו"ר** ומעביר אותן מילולית.
|
||||
|
||||
**מה התדריך חייב להכיל** (החוזה מול הכותב — אל תשמיט אף רכיב; אל תשלח issue עם "הועבר לכתיבה"):
|
||||
|
||||
```markdown
|
||||
## הנחיות כתיבה — ערר {case_number}
|
||||
|
||||
### 1. תוצאה ומצב
|
||||
- **תוצאה:** {דחייה / קבלה חלקית / קבלה מלאה}
|
||||
- **טיוטה קיימת:** {כן/לא}. אם כן: נתיב מלא לקובץ + הנחיה "קרא את הטיוטה, השתמש בה כבסיס, אל תכתוב מאפס"
|
||||
- **הוראות עריכה מתוך הטיוטה:** {רשימה מדויקת של מה חיים ביקש לשנות — פסקאות, תוכן, placeholders}
|
||||
- **תוצאה:** {דחייה / קבלה חלקית / קבלה מלאה} — עם נימוק קצר ומהי הראיה הניצחת.
|
||||
- **טיוטה קיימת:** {כן/לא}. אם כן: נתיב מלא + "קרא, השתמש כבסיס, אל תכתוב מאפס".
|
||||
- **הוראות עריכה מהטיוטה:** {מה חיים ביקש לשנות — פסקאות, תוכן, placeholders}.
|
||||
|
||||
### 2. סדר סוגיות + מבנה סילוגיסטי
|
||||
לכל סוגיה שצריך לכתוב/לערוך — מבנה סילוגיסטי מלא:
|
||||
|
||||
**סוגיה N: {כותרת}**
|
||||
- סוג ניתוח: {כלל ברור / איזון אינטרסים / מידתיות / שיקול דעת}
|
||||
- כלל (הנחה עליונה): {הוראת תכנית / סעיף חוק / הלכה — ציטוט מדויק}
|
||||
- עובדות (הנחה תחתונה): {העובדות הספציפיות שצריך להחיל — הפנייה למסמך מקור ספציפי}
|
||||
- מסקנה: {מה נובע מהחלת הכלל על העובדות}
|
||||
- תקדימים: {שם פסק דין + מה הוא קובע + למה רלוונטי}
|
||||
- מסמכי מקור: {שמות קבצים ספציפיים ב-data/cases/{case_number}/documents/originals/}
|
||||
### 2. סוגיות — סדר סילוגיסטי, המכריעה מובילה
|
||||
לכל סוגיה: סוג-ניתוח (כלל ברור / איזון / מידתיות / שיקול-דעת) · כלל (ציטוט מדויק של הוראת-תכנית/חוק/הלכה) · עובדות (בהפניה למסמך-מקור ספציפי) · מסקנה · תקדימים (שם + מה קובע + רלוונטיות) · מסמכי-מקור (ב-data/cases/{case_number}/documents/originals/). סמן אדנים עצמאיים, מוקשי-עקביות ומענה לצד המפסיד היכן שהם קיימים.
|
||||
|
||||
### 3. טיפול בטענות
|
||||
| # | טענה | טיפול | סוגיה |
|
||||
|---|------|-------|-------|
|
||||
| 1 | {טענה} | דיון מלא / קיבוץ / דילוג | {באיזו סוגיה} |
|
||||
...
|
||||
טבלה: # | טענה | טיפול (דיון מלא / קיבוץ / דילוג) | סוגיה.
|
||||
|
||||
### 4. chair directions
|
||||
- העתק מלא של עמדות הוועדה מ-analysis-and-research.md (או הפנייה: "קרא get_chair_directions")
|
||||
### 4. הנחיות-היו"ר
|
||||
העתק מילולי של עמדות-הוועדה מ-analysis-and-research.md (או "קרא get_chair_directions"), **עטוף ב-`<chair_directions>…</chair_directions>`** — טקסט מילולי בלבד בלי פרפרזה, כדי שהכותב לא ידרוס אותן.
|
||||
|
||||
### 5. הנחיות סגנון
|
||||
- ניטרליות: בלוק ו = עובדות בלבד, בלי ציטוטים מצדדים
|
||||
- ללא כפילות: בלוק י מפנה לבלוקים קודמים
|
||||
- טענות מקוריות: בלוק ז = כתבי טענות מקוריים
|
||||
- אורך מינימלי לדיון: 1,500 מילים לבלוק י
|
||||
- פסיקה: חובה לצטט לפחות 3 תקדימים בדיון
|
||||
ניטרליות (בלוק ו = עובדות בלבד, בלי ציטוטי-צדדים) · ללא כפילות (בלוק י מפנה לקודמים) · טענות מקוריות (בלוק ז) · דיון ≥ 1,500 מילים · ≥ 3 תקדימים בדיון.
|
||||
```
|
||||
|
||||
---
|
||||
@@ -844,9 +938,49 @@ case_prefix="${case_number:0:1}"
|
||||
- **ודא עקביות מתודולוגית** — כיוונים סילוגיסטיים (כלל + עובדות + מסקנה), chair_directions שלם (טיפול בטענות + כיוון + סדר סוגיות + תקן ביקורת), התאמה ל-`decision-methodology.md`
|
||||
- **סינון תיקים** — עבוד רק על תיקים בטווח המספרים של החברה שלך (ראה טבלה למעלה)
|
||||
|
||||
## סריקת הערות-יו"ר תלויות (company-wide) — שער-מסירה
|
||||
|
||||
> **למה זה קיים:** ה-wake מה-sweep מגיע עיוור (ראה ⚠️ בשלב 0). לכן אינך יכול להסתמך על `reason`/`issueId` כדי לדעת שיש הערה לטפל בה — אתה חייב **לגלות** אותה בעצמך. סריקה זו מוצאת כל הערת-יו"ר שטרם נענתה **בכל issue בחברה** (לא רק בתור המשויך-אליך — הערות-יו"ר יושבות על issues של חיים/סוכני-מִשנה, לא עליך).
|
||||
|
||||
**⚠️ כלל-ברזל: שיוך-לתיק ממקור מובנה, לעולם לא מהכותרת ולא מתוכן-ההערה.** הערה עשויה להזכיר תיק אחר (למשל "ניסיתי ב-CMPA-89") — זה **תוכן לטיפול**, לא יעד. היעד הוא תמיד התיק של ה-**project** שאליו שייך ה-issue. אם אי-אפשר לפתור תיק בוודאות → **אל תפעל**.
|
||||
|
||||
**הסריקה (הרץ בכל heartbeat ללא reason מכוּון):**
|
||||
|
||||
1. **רשום את כל issues החברה הפעילים:**
|
||||
```bash
|
||||
ISSUES=$(~/legal-ai/scripts/pc.sh GET "/api/companies/$PAPERCLIP_COMPANY_ID/issues")
|
||||
echo "$ISSUES" | jq -r '(if type=="array" then . else .issues end)
|
||||
| map(select(.status!="done" and .status!="cancelled" and (.hiddenAt|not)))
|
||||
| .[].id'
|
||||
```
|
||||
|
||||
2. **לכל issue — האם יש הערת-יו"ר תלויה?** הערה תלויה = הערת-`user` האחרונה **חדשה** מהערת-`agent` האחרונה (התעלם מ-`system`). ⚠️ ה-API מחזיר comments ב-**newest-first** — אל תשתמש ב-`.[-1]`; מיין ב-`createdAt`:
|
||||
```bash
|
||||
C=$(~/legal-ai/scripts/pc.sh GET "/api/issues/$ISSUE_ID/comments")
|
||||
PENDING=$(echo "$C" | jq -r '
|
||||
(map(select(.authorType=="user")) | sort_by(.createdAt) | last) as $u |
|
||||
(map(select(.authorType=="agent")) | sort_by(.createdAt) | last) as $a |
|
||||
if $u==null then "no" elif ($a==null) or ($u.createdAt>$a.createdAt) then "yes" else "no" end')
|
||||
```
|
||||
אם `PENDING != "yes"` → דלג ל-issue הבא.
|
||||
|
||||
3. **שיוך-לתיק (שער-בטיחות חובה)** — חלץ את מספר-התיק מ-**`project.name`** (שדה מובנה: `"ערר <מספר> — ..."`), לא מהכותרת ולא מההערה:
|
||||
```bash
|
||||
CTX=$(~/legal-ai/scripts/pc.sh GET "/api/issues/$ISSUE_ID/heartbeat-context")
|
||||
CASE_NUMBER=$(echo "$CTX" | jq -r '.project.name // ""' \
|
||||
| grep -oE '(ערר|בל"מ) [0-9]{4,5}-[0-9]{2}-[0-9]{2}' \
|
||||
| grep -oE '[0-9]{4,5}-[0-9]{2}-[0-9]{2}' | head -1)
|
||||
```
|
||||
- **`CASE_NUMBER` ריק** (ה-project אינו תיק — למשל "ספריית פסיקה — תור חילוץ", או שיוך לא-ודאי) → **אל תפעל על תיק.** אם נראה שזו הערת-יו"ר אמיתית שאבדה — פרסם comment קצר ב-issue + שלח מייל ליו"ר (סעיף §5), בלי לגעת בשום תיק. עבור ל-issue הבא.
|
||||
- **`CASE_NUMBER` קיים** → טפל בהערה לפי "טיפול בתגובות חדשות מחיים" למטה, **scoped ל-`$ISSUE_ID` ול-`$CASE_NUMBER` הזה בלבד.**
|
||||
|
||||
4. **כמה issues תלויים** (אפשרי — אפילו על אותו תיק) → טפל בכולם, כל אחד ב-scope שלו. אם לא נמצאה אף הערה תלויה → אין פעולת-CEO; המשך לשלב A.
|
||||
|
||||
---
|
||||
|
||||
## טיפול בתגובות חדשות מחיים (comment routing)
|
||||
|
||||
כשאתה מתעורר בגלל תגובה חדשה (reason מכיל "user_commented"):
|
||||
כשאתה מתעורר בגלל תגובה חדשה (reason מכיל "user_commented"), **או** כשהסריקה למעלה זיהתה הערה תלויה ב-`$ISSUE_ID` עם `$CASE_NUMBER` פתור:
|
||||
|
||||
0. **החזר את ה-issue הראשי ל-`status=in_progress`** — אם ה-issue ב-`in_review` (כי המתנת לחיים) או ב-`blocked` (כי Paperclip חסם אוטומטית), הראשון דבר: עדכן ל-`in_progress` כדי לסמן שאתה עובד עליו.
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ tools:
|
||||
"id": "r1",
|
||||
"type": "insert_after", // או insert_before, replace, delete
|
||||
"anchor_bookmark": "block-yod", // מ-list_bookmarks
|
||||
"content": "וכך נפסק בעניין פלוני. בבג\"ץ 1234/21 קבע השופט...",
|
||||
"content": "<תוכן ההוספה — טקסט עברי נקי, בלי ציטוט מומצא>",
|
||||
"style": "body", // או heading, quote
|
||||
"reason": "הוספת פסק הלכה שחסר לפי בקשת יו\"ר"
|
||||
}
|
||||
@@ -128,7 +128,7 @@ tools:
|
||||
|
||||
בלי סגירת-issue, Paperclip מזהה "in_progress בלי execution חיה" ומפעיל auto-retry בלולאה (נצפה ב-CMPA-17, 30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
||||
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO לפי חברה).** בקצרה: PATCH סטטוס `done` (הצלחה) או `blocked` (כשל/פלט-חסר), ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="מייצא טיוטה סיים [issue-id] בסטטוס [done/blocked]"`. **אסור** `done` עם פלט חסר; **אסור** `INSERT INTO agent_wakeup_requests` ישיר; **אסור** לקבע UUID של CEO (נגזר מ-`$PAPERCLIP_COMPANY_ID`).
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO).** בקצרה: PATCH סטטוס `done`/`blocked`, ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="מייצא טיוטה סיים [issue-id] בסטטוס [done/blocked]"`.
|
||||
|
||||
## כללים קריטיים
|
||||
|
||||
|
||||
@@ -96,5 +96,4 @@ tools:
|
||||
|
||||
בלי סגירת-issue, Paperclip מזהה "in_progress בלי execution חיה" ומפעיל auto-retry בלולאה (נצפה ב-CMPA-17, 30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
||||
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO לפי חברה).** בקצרה: PATCH סטטוס `done` (הצלחה) או `blocked` (כשל / markers `[?]` רבים), ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="מגיה סיים [issue-id] בסטטוס [done/blocked]"`. **אסור** `done` עם פלט חסר; **אסור** `INSERT INTO agent_wakeup_requests` ישיר; **אסור** לקבע UUID של CEO (נגזר מ-`$PAPERCLIP_COMPANY_ID`).
|
||||
**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`.
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO).** בקצרה: PATCH סטטוס `done`/`blocked` (`blocked` אם markers `[?]` רבים), ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="מגיה סיים [issue-id] בסטטוס [done/blocked]"`.
|
||||
|
||||
@@ -56,6 +56,8 @@ tools:
|
||||
|
||||
## 7 בדיקות
|
||||
|
||||
> **סף-הקבלה המשותף — `docs/qa-acceptance-rubric.md`:** 7 הבדיקות למטה הן האכיפה המפורטת שלו (מקור-אמת אחד; הכותב מכוון לאותו rubric). בדיווח — מפה כל `fail` לחוסם/אזהרה שם.
|
||||
|
||||
### 1. שלמות מבנית (structural_integrity)
|
||||
- כל בלוקי חובה קיימים (ה עד יא)
|
||||
- מספור רציף ללא קפיצות
|
||||
@@ -179,10 +181,11 @@ tools:
|
||||
בדוק `case_get(case_number).status` — הוא צריך להיות בערכים תקפים. הזרימה הכוללת:
|
||||
|
||||
```
|
||||
new → proofread → documents_ready → analyst_verified → research_complete (legacy/optional)
|
||||
→ outcome_set → direction_approved → analysis_enriched → ready_for_writing
|
||||
→ drafted (אתה כאן!) → qa_passed / qa_failed → exported
|
||||
new → processing → documents_ready → analyst_verified → research_complete
|
||||
→ outcome_set → direction_approved → qa_review → drafted (אתה כאן!)
|
||||
→ exported → reviewed → final
|
||||
```
|
||||
(מקור-אמת יחיד: `case_status_model.py` / `GET /api/status-model`. `analyst_verified`+`research_complete` קנוניים, שלב "ניתוח וכיוון". מצבי-ביניים ישנים כמו `proofread`/`analysis_enriched`/`qa_passed` נמפים-לשלב לתצוגה בלבד.)
|
||||
|
||||
⚠️ **`research_complete` הוא valid status** (לא bug, לא legacy ערומה). ב-`legal-researcher.md` שלב 5 הוא הסטטוס שהחוקר מגדיר בסיום מחקר. אם תיק במצב זה נשלח אליך לפני `drafted` — דווח, אל תכשיל.
|
||||
|
||||
@@ -231,14 +234,24 @@ new → proofread → documents_ready → analyst_verified → research_complete
|
||||
6. האם יש אנלוגיה לתקדים ללא הסבר מדיניות (למה הדמיון רלוונטי)?
|
||||
|
||||
### שלב 3: דיווח — חובה!
|
||||
פרסם comment ב-Paperclip עם:
|
||||
- תוצאת כל בדיקה (pass/fail)
|
||||
- רשימת שגיאות מפורטת (אם יש)
|
||||
- האם מותר לייצא (כל הקריטיים pass?)
|
||||
- עדכן סטטוס ל-qa_review (אם נכשל) או drafted (אם עבר)
|
||||
פרסם comment ב-Paperclip **במבנה קבוע** (markdown — נקרא ע"י היו"ר וע"י ה-CEO), כדי שהפסיקה תהיה עקבית וניתנת-לפרסינג. מלא שורה לכל אחת מ-7 הבדיקות:
|
||||
|
||||
```markdown
|
||||
## דוח בדיקת איכות — ערר {case_number}
|
||||
|
||||
| בדיקה | תוצאה | חומרה | ממצא (אם fail) |
|
||||
|-------|:-----:|:-----:|-----------------|
|
||||
| {שם הבדיקה} | pass / fail | critical / major / minor | {פירוט קצר} |
|
||||
| ... שורה לכל 7 הבדיקות ... | | | |
|
||||
|
||||
**מותר לייצא:** כן / לא ← "לא" אם ולו בדיקה **critical** אחת ב-fail
|
||||
**סטטוס חדש:** drafted (עבר) / qa_review (נכשל)
|
||||
```
|
||||
|
||||
- עדכן סטטוס בהתאם: `drafted` (אם עבר) או `qa_review` (אם נכשל).
|
||||
|
||||
### סגור את ה-issue של עצמך + העֵר CEO — חובה!
|
||||
|
||||
בלי סגירת-issue, Paperclip מזהה "in_progress בלי execution חיה" ומפעיל auto-retry בלולאה (נצפה ב-CMPA-17, 30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
||||
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO לפי חברה).** בקצרה: PATCH סטטוס `done` (הצלחה) או `blocked` (כשל/פלט-חסר), ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="בודק איכות סיים [issue-id] בסטטוס [done/blocked]"`. **אסור** `done` עם פלט חסר; **אסור** `INSERT INTO agent_wakeup_requests` ישיר; **אסור** לקבע UUID של CEO (נגזר מ-`$PAPERCLIP_COMPANY_ID`).
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO).** בקצרה: PATCH סטטוס `done`/`blocked`, ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="בודק איכות סיים [issue-id] בסטטוס [done/blocked]"`.
|
||||
|
||||
@@ -304,6 +304,15 @@ search_internal_decisions(
|
||||
|
||||
**מינימום:** queries לקורפוס הסמכותי = מספר סוגיות מרכזיות שזוהו.
|
||||
|
||||
#### 2ב.4ב — שקלול סמכות לפי טיפול-שיפוטי-מצטבר (X11) ⚠️
|
||||
|
||||
כל תוצאה מ-`search_precedent_library` נושאת שדה **`cited_by`** + `verified`/`cite_count` — **כמה החלטות ועדת-ערר אחרות הסתמכו על אותו תקדים ואיך טיפלו בו**. זהו אות-סמכות אנושי-מצטבר (לא ניחוש-מודל), וחובה לשקלל אותו:
|
||||
|
||||
- **`cited_by.positive` גבוה (אומץ/הוסבר ע"י הרבה ועדות)** → תקדים-עוגן. **טַען את הסמכות במפורש** בפלט-המחקר: *"הלכת [שם] (עע"מ X/YY) — אומצה ב-N החלטות ועדת-ערר"*, כדי שה-writer יוכל לבסס עליה. בין שני תקדימים שקולים-תוכן — העדף את בעל ה-`positive` הגבוה.
|
||||
- **`cited_by.negative` > 0 (אובחן/בוקר/בוטל)** → **דגל זהירות**. אל תציג תקדים שבוטל (`overruled`) כ"good law"; ציין את האבחנה. תקדים שאובחן שוב-ושוב אינו ראיה חזקה לסוגיה — בדוק את ההקשר.
|
||||
- **`unclassified`** → הטיפול טרם סווג; התייחס ל-`cite_count` הגולמי בלבד.
|
||||
- האות הזה **מחדד תיעדוף, לא מחליף קריאה** — עדיין קרא את ההלכה ואת ההקשר (INV-COR3/COR5: סמכות לסוגיה הספציפית, לא לפסק כולו).
|
||||
|
||||
#### 2ב.4א — איתור החלטה ספציפית לפי שם — פרוטוקול לפני "לא בקורפוס" ⚠️
|
||||
|
||||
שם תיק לבדו (למשל `"אגסי"`) **אינו מפתח חיפוש אמין**. ההטמעה הסמנטית והאינדקס הלקסיקלי בנויים על תוכן ההלכה/הפסקה — כך ששאילתת-שם עלולה להחזיר דווקא החלטות ש**מצטטות** את התיק, ולא את התיק עצמו. לפני שמכריזים שהחלטה אינה בקורפוס:
|
||||
@@ -401,7 +410,7 @@ python3 /home/chaim/legal-ai/scripts/notify.py \
|
||||
|
||||
בלי סגירת-issue, Paperclip מזהה "in_progress בלי execution חיה" ומפעיל auto-retry בלולאה (נצפה ב-CMPA-17, 30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
||||
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO לפי חברה).** בקצרה: PATCH סטטוס `done` (הצלחה) או `blocked` (כשל/פלט-חסר), ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="חוקר תקדימים סיים [issue-id] בסטטוס [done/blocked]"`. **אסור** `done` עם פלט חסר; **אסור** `INSERT INTO agent_wakeup_requests` ישיר; **אסור** לקבע UUID של CEO (נגזר מ-`$PAPERCLIP_COMPANY_ID`).
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO).** בקצרה: PATCH סטטוס `done`/`blocked`, ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="חוקר תקדימים סיים [issue-id] בסטטוס [done/blocked]"`.
|
||||
|
||||
## כללים
|
||||
- **דיוק** — ציין מספרי סעיפים, תאריכים, שמות שופטים
|
||||
|
||||
@@ -53,6 +53,8 @@ tools:
|
||||
|
||||
## לפני שאתה מתחיל — קרא!
|
||||
|
||||
> **המטרה שלך — `docs/qa-acceptance-rubric.md`:** זהו סף-הקבלה שה-QA יאכוף. כתוב כדי לעבור אותו מהפעם הראשונה, ולפני מסירה ל-CEO עבור על החוסמים ואשר שכל אחד מתקיים.
|
||||
|
||||
### חובה לפני כל כתיבה — נקודת ההתחלה:
|
||||
0. **עץ ההחלטה: `docs/daphna-decision-tree.md`** — **כלי הפעולה היומיומי**. מאחד את כל המסמכים לתהליך אנליטי קצר: מהי הראיה הניצחת? איזה ארכיטקטורה? איזה מוד פתיחה? איזה אורך? **תמיד להתחיל כאן** — המסמך מצביע איזה מסמך אחר לקרוא לפי השאלה.
|
||||
|
||||
@@ -122,9 +124,11 @@ tools:
|
||||
4. החזר את הטקסט ל-CEO (בקומנט או כ-return value) — **לא** שומר ב-DB
|
||||
5. CEO יקרא ל-`revise_draft` עם הטקסט שלך
|
||||
|
||||
**דוגמה לפלט מצופה:**
|
||||
**דוגמה לפלט מצופה** (עטופה בתגית כדי שלא תתבלבל עם הוראה):
|
||||
|
||||
> בבג"ץ 1234/21 [פלוני נ' הוועדה המחוזית] קבע בית המשפט העליון כי הוועדה המקומית מחויבת לשקול שיקולי Y גם בהיעדר התנגדות מפורשת. הלכה זו חלה ישירות על ענייננו: הוועדה המקומית לא בחנה את Y, ודי בכך כדי להחזיר את הדיון לוועדה.
|
||||
<example_output>
|
||||
בבג"ץ 1234/21 [פלוני נ' הוועדה המחוזית] קבע בית המשפט העליון כי הוועדה המקומית מחויבת לשקול שיקולי Y גם בהיעדר התנגדות מפורשת. הלכה זו חלה ישירות על ענייננו: הוועדה המקומית לא בחנה את Y, ודי בכך כדי להחזיר את הדיון לוועדה.
|
||||
</example_output>
|
||||
|
||||
---
|
||||
|
||||
@@ -218,18 +222,13 @@ case_update(case_number, status="drafted")
|
||||
|
||||
בלי סגירת-issue, Paperclip מזהה "in_progress בלי execution חיה" ומפעיל auto-retry בלולאה (נצפה ב-CMPA-17, 30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
||||
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO לפי חברה).** בקצרה: PATCH סטטוס `done` (הצלחה) או `blocked` (כשל/פלט-חסר), ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="כותב החלטה סיים [issue-id] בסטטוס [done/blocked]"`. **אסור** `done` עם פלט חסר; **אסור** `INSERT INTO agent_wakeup_requests` ישיר; **אסור** לקבע UUID של CEO (נגזר מ-`$PAPERCLIP_COMPANY_ID`).
|
||||
**הפרוטוקול המלא — מקור יחיד: [HEARTBEAT.md](HEARTBEAT.md) §4ב (סטטוס) + §4ג (wake CEO).** בקצרה: PATCH סטטוס `done`/`blocked`, ואז wakeup ל-CEO עם `payload.issueId` ו-`reason="כותב החלטה סיים [issue-id] בסטטוס [done/blocked]"`.
|
||||
|
||||
**אם לא תעדכן סטטוס ל-drafted — בודק האיכות לא יוכל לרוץ!**
|
||||
|
||||
## בלוק י — דיון (הבלוק החשוב ביותר)
|
||||
|
||||
**קריאת חובה לפני כתיבה (5 מסמכים)**:
|
||||
1. `docs/daphna-voice-fingerprint.md` — קבועים, פעלי "אנחנו", אנטי-דפוסים
|
||||
2. `docs/daphna-precedent-network.md` — לכל סוגיה משפטית, איזה תקדם
|
||||
3. `docs/daphna-architecture-by-outcome.md` — מבנה לפי תוצאה + עץ החלטה
|
||||
4. `docs/daphna-acceptance-architecture.md` — **חובה אם תוצאה צפויה: קבלה (לא חלקית).** חמש תבניות מובחנות
|
||||
5. `docs/voice-1130-25.md` — דוגמה עמוקה
|
||||
> קרא קודם את **"חובה לפני בלוק י (חמישיית הקול)"** שלמעלה — חמשת מסמכי-הקול.
|
||||
|
||||
**עץ החלטה לבחירת ארכיטקטורה**:
|
||||
1. מה התוצאה?
|
||||
@@ -274,7 +273,7 @@ case_update(case_number, status="drafted")
|
||||
### שלב ג: לכל סוגיה — מבנה סילוגיסטי (CREAC) בקול דפנה
|
||||
1. **מסקנה** — פתח בתשובה (בקול "אנחנו" — ראה טבלה למטה)
|
||||
2. **כלל** — ציטוט סעיף החוק במלואו (לא תמצית). אם רלוונטי — סעיפי משנה כולם.
|
||||
3. **הרחבה** — תקדים רלוונטי אחד **בציטוט מלא** (לא תמצית). דפנה תמיד מצטטת בני 4-15 שורות עם הפניה `(פורסם בנבו)`.
|
||||
3. **הרחבה** — תקדים רלוונטי אחד **בציטוט מלא** (לא תמצית). דפנה תמיד מצטטת בני 4-15 שורות עם הפניה `(פורסם בנבו)`. **כשהמנתח סימן תקדים כ"אומץ ב-N החלטות ועדת-ערר" (אות-סמכות X11)** — חזק את ההסתמכות בלשון-סמכות ("הלכה מושרשת שאומצה בשורת החלטות"); זהו טיפול-שיפוטי-מצטבר אמיתי, לא ניחוש. **אל** תמציא מספר בעצמך — השתמש רק במה שהמנתח מסר (INV-AH, read-only מהמנתח).
|
||||
4. **יישום** — החל את הכלל על העובדות. הפרד ממצא עובדתי ממסקנה משפטית. השתמש בנתונים (מספרים, מידות, אחוזים).
|
||||
5. **אישור-לפני-דחייה (חובה)** — הצג את הטענה הטובה ביותר של הצד המפסיד: **"אכן [נקודה תקפה]... אולם [למה לא מכריע]"**. השימוש ב-"אכן" (לא "אמנם") הוא הסטנדרט.
|
||||
6. **למעלה מן הצורך** (חובה לטענות מרכזיות) — "גם אם היינו מקבלים את פרשנות העורר... התוצאה הייתה זהה". סוגר חלון לערעור.
|
||||
@@ -373,6 +372,8 @@ case_update(case_number, status="drafted")
|
||||
|
||||
### חובה: שימוש בעמדות יו"ר מ-`get_chair_directions`
|
||||
|
||||
> **מקור העמדות:** בדרך-כלל מ-`get_chair_directions` (שלב 1ג). אם ה-CEO **העתיק** עמדות-יו"ר לתוך ה-issue שלך, הן מגיעות עטופות ב-`<chair_directions>…</chair_directions>` — טקסט מילולי זה **מחייב אותך בדיוק כמו** `chair_ruling` מהכלי: אל תדרוס, אל תפרפרז, נסח בעדו.
|
||||
|
||||
עבור **כל טענת סף** ו**כל סוגיה** ב-direction_doc שבנית בשלב 1ג:
|
||||
|
||||
1. **פתח את הדיון במסקנה של דפנה** — למשל "**טענת הסף הראשונה נדחית**"
|
||||
|
||||
12
.env.example
Normal file
12
.env.example
Normal file
@@ -0,0 +1,12 @@
|
||||
# API Keys (Required to enable respective provider)
|
||||
ANTHROPIC_API_KEY="your_anthropic_api_key_here" # Required: Format: sk-ant-api03-...
|
||||
PERPLEXITY_API_KEY="your_perplexity_api_key_here" # Optional: Format: pplx-...
|
||||
OPENAI_API_KEY="your_openai_api_key_here" # Optional, for OpenAI models. Format: sk-proj-...
|
||||
GOOGLE_API_KEY="your_google_api_key_here" # Optional, for Google Gemini models.
|
||||
MISTRAL_API_KEY="your_mistral_key_here" # Optional, for Mistral AI models.
|
||||
XAI_API_KEY="YOUR_XAI_KEY_HERE" # Optional, for xAI AI models.
|
||||
GROQ_API_KEY="YOUR_GROQ_KEY_HERE" # Optional, for Groq models.
|
||||
OPENROUTER_API_KEY="YOUR_OPENROUTER_KEY_HERE" # Optional, for OpenRouter models.
|
||||
AZURE_OPENAI_API_KEY="your_azure_key_here" # Optional, for Azure OpenAI models (requires endpoint in .taskmaster/config.json).
|
||||
OLLAMA_API_KEY="your_ollama_api_key_here" # Optional: For remote Ollama servers that require authentication.
|
||||
GITHUB_API_KEY="your_github_api_key_here" # Optional: For GitHub import/export features. Format: ghp_... or github_pat_...
|
||||
34
.gitignore
vendored
34
.gitignore
vendored
@@ -6,7 +6,8 @@ data/backups/
|
||||
data/precedent-library/
|
||||
data/.auto-sync.log
|
||||
data/*.db
|
||||
data/checkpoints/ # X16 durable-pipeline SQLite checkpoints (runtime artifact)
|
||||
# X16 durable-pipeline SQLite checkpoints (runtime artifact)
|
||||
data/checkpoints/
|
||||
*.bak-pre-*
|
||||
mcp-server/.venv/
|
||||
__pycache__/
|
||||
@@ -18,6 +19,33 @@ kiryat-yearim/
|
||||
continuation-prompt.md
|
||||
node_modules/
|
||||
data/eval/eval-report-*
|
||||
data/adapter-migration-state.json # revert snapshot for migrate_agent_adapter.py (runtime state)
|
||||
.claude/agents/.generated/ # frontmatter-stripped instruction copies for content_arg adapters (generated)
|
||||
# effort-calibration run outputs (#208 / #212) — generated, not source
|
||||
data/eval/effort-calibration-*
|
||||
data/eval/block-yod-calibration-*
|
||||
# revert snapshot for migrate_agent_adapter.py (runtime state)
|
||||
data/adapter-migration-state.json
|
||||
# frontmatter-stripped instruction copies for content_arg adapters (generated)
|
||||
.claude/agents/.generated/
|
||||
.claude/worktrees/
|
||||
|
||||
# TaskMaster backups (runtime)
|
||||
.taskmaster/tasks/tasks.json.bak.*
|
||||
|
||||
# Build artifacts
|
||||
.design-build/
|
||||
|
||||
# Temp files
|
||||
.interaction_tmp.json
|
||||
|
||||
# Runtime eval/ab-test data
|
||||
data/ab_halacha_*.json
|
||||
data/ab_run_*.log
|
||||
data/x11_treatment_run_*.log
|
||||
|
||||
# Runtime data directories
|
||||
data/audit/
|
||||
data/bulletins/
|
||||
data/digests/
|
||||
data/internal-decisions/
|
||||
data/learning/
|
||||
data/logs/
|
||||
|
||||
47
.taskmaster/templates/example_prd.txt
Normal file
47
.taskmaster/templates/example_prd.txt
Normal file
@@ -0,0 +1,47 @@
|
||||
<context>
|
||||
# Overview
|
||||
[Provide a high-level overview of your product here. Explain what problem it solves, who it's for, and why it's valuable.]
|
||||
|
||||
# Core Features
|
||||
[List and describe the main features of your product. For each feature, include:
|
||||
- What it does
|
||||
- Why it's important
|
||||
- How it works at a high level]
|
||||
|
||||
# User Experience
|
||||
[Describe the user journey and experience. Include:
|
||||
- User personas
|
||||
- Key user flows
|
||||
- UI/UX considerations]
|
||||
</context>
|
||||
<PRD>
|
||||
# Technical Architecture
|
||||
[Outline the technical implementation details:
|
||||
- System components
|
||||
- Data models
|
||||
- APIs and integrations
|
||||
- Infrastructure requirements]
|
||||
|
||||
# Development Roadmap
|
||||
[Break down the development process into phases:
|
||||
- MVP requirements
|
||||
- Future enhancements
|
||||
- Do not think about timelines whatsoever -- all that matters is scope and detailing exactly what needs to be build in each phase so it can later be cut up into tasks]
|
||||
|
||||
# Logical Dependency Chain
|
||||
[Define the logical order of development:
|
||||
- Which features need to be built first (foundation)
|
||||
- Getting as quickly as possible to something usable/visible front end that works
|
||||
- Properly pacing and scoping each feature so it is atomic but can also be built upon and improved as development approaches]
|
||||
|
||||
# Risks and Mitigations
|
||||
[Identify potential risks and how they'll be addressed:
|
||||
- Technical challenges
|
||||
- Figuring out the MVP that we can build upon
|
||||
- Resource constraints]
|
||||
|
||||
# Appendix
|
||||
[Include any additional information:
|
||||
- Research findings
|
||||
- Technical specifications]
|
||||
</PRD>
|
||||
511
.taskmaster/templates/example_prd_rpg.txt
Normal file
511
.taskmaster/templates/example_prd_rpg.txt
Normal file
@@ -0,0 +1,511 @@
|
||||
<rpg-method>
|
||||
# Repository Planning Graph (RPG) Method - PRD Template
|
||||
|
||||
This template teaches you (AI or human) how to create structured, dependency-aware PRDs using the RPG methodology from Microsoft Research. The key insight: separate WHAT (functional) from HOW (structural), then connect them with explicit dependencies.
|
||||
|
||||
## Core Principles
|
||||
|
||||
1. **Dual-Semantics**: Think functional (capabilities) AND structural (code organization) separately, then map them
|
||||
2. **Explicit Dependencies**: Never assume - always state what depends on what
|
||||
3. **Topological Order**: Build foundation first, then layers on top
|
||||
4. **Progressive Refinement**: Start broad, refine iteratively
|
||||
|
||||
## How to Use This Template
|
||||
|
||||
- Follow the instructions in each `<instruction>` block
|
||||
- Look at `<example>` blocks to see good vs bad patterns
|
||||
- Fill in the content sections with your project details
|
||||
- The AI reading this will learn the RPG method by following along
|
||||
- Task Master will parse the resulting PRD into dependency-aware tasks
|
||||
|
||||
## Recommended Tools for Creating PRDs
|
||||
|
||||
When using this template to **create** a PRD (not parse it), use **code-context-aware AI assistants** for best results:
|
||||
|
||||
**Why?** The AI needs to understand your existing codebase to make good architectural decisions about modules, dependencies, and integration points.
|
||||
|
||||
**Recommended tools:**
|
||||
- **Claude Code** (claude-code CLI) - Best for structured reasoning and large contexts
|
||||
- **Cursor/Windsurf** - IDE integration with full codebase context
|
||||
- **Gemini CLI** (gemini-cli) - Massive context window for large codebases
|
||||
- **Codex/Grok CLI** - Strong code generation with context awareness
|
||||
|
||||
**Note:** Once your PRD is created, `task-master parse-prd` works with any configured AI model - it just needs to read the PRD text itself, not your codebase.
|
||||
</rpg-method>
|
||||
|
||||
---
|
||||
|
||||
<overview>
|
||||
<instruction>
|
||||
Start with the problem, not the solution. Be specific about:
|
||||
- What pain point exists?
|
||||
- Who experiences it?
|
||||
- Why existing solutions don't work?
|
||||
- What success looks like (measurable outcomes)?
|
||||
|
||||
Keep this section focused - don't jump into implementation details yet.
|
||||
</instruction>
|
||||
|
||||
## Problem Statement
|
||||
[Describe the core problem. Be concrete about user pain points.]
|
||||
|
||||
## Target Users
|
||||
[Define personas, their workflows, and what they're trying to achieve.]
|
||||
|
||||
## Success Metrics
|
||||
[Quantifiable outcomes. Examples: "80% task completion via autopilot", "< 5% manual intervention rate"]
|
||||
|
||||
</overview>
|
||||
|
||||
---
|
||||
|
||||
<functional-decomposition>
|
||||
<instruction>
|
||||
Now think about CAPABILITIES (what the system DOES), not code structure yet.
|
||||
|
||||
Step 1: Identify high-level capability domains
|
||||
- Think: "What major things does this system do?"
|
||||
- Examples: Data Management, Core Processing, Presentation Layer
|
||||
|
||||
Step 2: For each capability, enumerate specific features
|
||||
- Use explore-exploit strategy:
|
||||
* Exploit: What features are REQUIRED for core value?
|
||||
* Explore: What features make this domain COMPLETE?
|
||||
|
||||
Step 3: For each feature, define:
|
||||
- Description: What it does in one sentence
|
||||
- Inputs: What data/context it needs
|
||||
- Outputs: What it produces/returns
|
||||
- Behavior: Key logic or transformations
|
||||
|
||||
<example type="good">
|
||||
Capability: Data Validation
|
||||
Feature: Schema validation
|
||||
- Description: Validate JSON payloads against defined schemas
|
||||
- Inputs: JSON object, schema definition
|
||||
- Outputs: Validation result (pass/fail) + error details
|
||||
- Behavior: Iterate fields, check types, enforce constraints
|
||||
|
||||
Feature: Business rule validation
|
||||
- Description: Apply domain-specific validation rules
|
||||
- Inputs: Validated data object, rule set
|
||||
- Outputs: Boolean + list of violated rules
|
||||
- Behavior: Execute rules sequentially, short-circuit on failure
|
||||
</example>
|
||||
|
||||
<example type="bad">
|
||||
Capability: validation.js
|
||||
(Problem: This is a FILE, not a CAPABILITY. Mixing structure into functional thinking.)
|
||||
|
||||
Capability: Validation
|
||||
Feature: Make sure data is good
|
||||
(Problem: Too vague. No inputs/outputs. Not actionable.)
|
||||
</example>
|
||||
</instruction>
|
||||
|
||||
## Capability Tree
|
||||
|
||||
### Capability: [Name]
|
||||
[Brief description of what this capability domain covers]
|
||||
|
||||
#### Feature: [Name]
|
||||
- **Description**: [One sentence]
|
||||
- **Inputs**: [What it needs]
|
||||
- **Outputs**: [What it produces]
|
||||
- **Behavior**: [Key logic]
|
||||
|
||||
#### Feature: [Name]
|
||||
- **Description**:
|
||||
- **Inputs**:
|
||||
- **Outputs**:
|
||||
- **Behavior**:
|
||||
|
||||
### Capability: [Name]
|
||||
...
|
||||
|
||||
</functional-decomposition>
|
||||
|
||||
---
|
||||
|
||||
<structural-decomposition>
|
||||
<instruction>
|
||||
NOW think about code organization. Map capabilities to actual file/folder structure.
|
||||
|
||||
Rules:
|
||||
1. Each capability maps to a module (folder or file)
|
||||
2. Features within a capability map to functions/classes
|
||||
3. Use clear module boundaries - each module has ONE responsibility
|
||||
4. Define what each module exports (public interface)
|
||||
|
||||
The goal: Create a clear mapping between "what it does" (functional) and "where it lives" (structural).
|
||||
|
||||
<example type="good">
|
||||
Capability: Data Validation
|
||||
→ Maps to: src/validation/
|
||||
├── schema-validator.js (Schema validation feature)
|
||||
├── rule-validator.js (Business rule validation feature)
|
||||
└── index.js (Public exports)
|
||||
|
||||
Exports:
|
||||
- validateSchema(data, schema)
|
||||
- validateRules(data, rules)
|
||||
</example>
|
||||
|
||||
<example type="bad">
|
||||
Capability: Data Validation
|
||||
→ Maps to: src/utils.js
|
||||
(Problem: "utils" is not a clear module boundary. Where do I find validation logic?)
|
||||
|
||||
Capability: Data Validation
|
||||
→ Maps to: src/validation/everything.js
|
||||
(Problem: One giant file. Features should map to separate files for maintainability.)
|
||||
</example>
|
||||
</instruction>
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```
|
||||
project-root/
|
||||
├── src/
|
||||
│ ├── [module-name]/ # Maps to: [Capability Name]
|
||||
│ │ ├── [file].js # Maps to: [Feature Name]
|
||||
│ │ └── index.js # Public exports
|
||||
│ └── [module-name]/
|
||||
├── tests/
|
||||
└── docs/
|
||||
```
|
||||
|
||||
## Module Definitions
|
||||
|
||||
### Module: [Name]
|
||||
- **Maps to capability**: [Capability from functional decomposition]
|
||||
- **Responsibility**: [Single clear purpose]
|
||||
- **File structure**:
|
||||
```
|
||||
module-name/
|
||||
├── feature1.js
|
||||
├── feature2.js
|
||||
└── index.js
|
||||
```
|
||||
- **Exports**:
|
||||
- `functionName()` - [what it does]
|
||||
- `ClassName` - [what it does]
|
||||
|
||||
</structural-decomposition>
|
||||
|
||||
---
|
||||
|
||||
<dependency-graph>
|
||||
<instruction>
|
||||
This is THE CRITICAL SECTION for Task Master parsing.
|
||||
|
||||
Define explicit dependencies between modules. This creates the topological order for task execution.
|
||||
|
||||
Rules:
|
||||
1. List modules in dependency order (foundation first)
|
||||
2. For each module, state what it depends on
|
||||
3. Foundation modules should have NO dependencies
|
||||
4. Every non-foundation module should depend on at least one other module
|
||||
5. Think: "What must EXIST before I can build this module?"
|
||||
|
||||
<example type="good">
|
||||
Foundation Layer (no dependencies):
|
||||
- error-handling: No dependencies
|
||||
- config-manager: No dependencies
|
||||
- base-types: No dependencies
|
||||
|
||||
Data Layer:
|
||||
- schema-validator: Depends on [base-types, error-handling]
|
||||
- data-ingestion: Depends on [schema-validator, config-manager]
|
||||
|
||||
Core Layer:
|
||||
- algorithm-engine: Depends on [base-types, error-handling]
|
||||
- pipeline-orchestrator: Depends on [algorithm-engine, data-ingestion]
|
||||
</example>
|
||||
|
||||
<example type="bad">
|
||||
- validation: Depends on API
|
||||
- API: Depends on validation
|
||||
(Problem: Circular dependency. This will cause build/runtime issues.)
|
||||
|
||||
- user-auth: Depends on everything
|
||||
(Problem: Too many dependencies. Should be more focused.)
|
||||
</example>
|
||||
</instruction>
|
||||
|
||||
## Dependency Chain
|
||||
|
||||
### Foundation Layer (Phase 0)
|
||||
No dependencies - these are built first.
|
||||
|
||||
- **[Module Name]**: [What it provides]
|
||||
- **[Module Name]**: [What it provides]
|
||||
|
||||
### [Layer Name] (Phase 1)
|
||||
- **[Module Name]**: Depends on [[module-from-phase-0], [module-from-phase-0]]
|
||||
- **[Module Name]**: Depends on [[module-from-phase-0]]
|
||||
|
||||
### [Layer Name] (Phase 2)
|
||||
- **[Module Name]**: Depends on [[module-from-phase-1], [module-from-foundation]]
|
||||
|
||||
[Continue building up layers...]
|
||||
|
||||
</dependency-graph>
|
||||
|
||||
---
|
||||
|
||||
<implementation-roadmap>
|
||||
<instruction>
|
||||
Turn the dependency graph into concrete development phases.
|
||||
|
||||
Each phase should:
|
||||
1. Have clear entry criteria (what must exist before starting)
|
||||
2. Contain tasks that can be parallelized (no inter-dependencies within phase)
|
||||
3. Have clear exit criteria (how do we know phase is complete?)
|
||||
4. Build toward something USABLE (not just infrastructure)
|
||||
|
||||
Phase ordering follows topological sort of dependency graph.
|
||||
|
||||
<example type="good">
|
||||
Phase 0: Foundation
|
||||
Entry: Clean repository
|
||||
Tasks:
|
||||
- Implement error handling utilities
|
||||
- Create base type definitions
|
||||
- Setup configuration system
|
||||
Exit: Other modules can import foundation without errors
|
||||
|
||||
Phase 1: Data Layer
|
||||
Entry: Phase 0 complete
|
||||
Tasks:
|
||||
- Implement schema validator (uses: base types, error handling)
|
||||
- Build data ingestion pipeline (uses: validator, config)
|
||||
Exit: End-to-end data flow from input to validated output
|
||||
</example>
|
||||
|
||||
<example type="bad">
|
||||
Phase 1: Build Everything
|
||||
Tasks:
|
||||
- API
|
||||
- Database
|
||||
- UI
|
||||
- Tests
|
||||
(Problem: No clear focus. Too broad. Dependencies not considered.)
|
||||
</example>
|
||||
</instruction>
|
||||
|
||||
## Development Phases
|
||||
|
||||
### Phase 0: [Foundation Name]
|
||||
**Goal**: [What foundational capability this establishes]
|
||||
|
||||
**Entry Criteria**: [What must be true before starting]
|
||||
|
||||
**Tasks**:
|
||||
- [ ] [Task name] (depends on: [none or list])
|
||||
- Acceptance criteria: [How we know it's done]
|
||||
- Test strategy: [What tests prove it works]
|
||||
|
||||
- [ ] [Task name] (depends on: [none or list])
|
||||
|
||||
**Exit Criteria**: [Observable outcome that proves phase complete]
|
||||
|
||||
**Delivers**: [What can users/developers do after this phase?]
|
||||
|
||||
---
|
||||
|
||||
### Phase 1: [Layer Name]
|
||||
**Goal**:
|
||||
|
||||
**Entry Criteria**: Phase 0 complete
|
||||
|
||||
**Tasks**:
|
||||
- [ ] [Task name] (depends on: [[tasks-from-phase-0]])
|
||||
- [ ] [Task name] (depends on: [[tasks-from-phase-0]])
|
||||
|
||||
**Exit Criteria**:
|
||||
|
||||
**Delivers**:
|
||||
|
||||
---
|
||||
|
||||
[Continue with more phases...]
|
||||
|
||||
</implementation-roadmap>
|
||||
|
||||
---
|
||||
|
||||
<test-strategy>
|
||||
<instruction>
|
||||
Define how testing will be integrated throughout development (TDD approach).
|
||||
|
||||
Specify:
|
||||
1. Test pyramid ratios (unit vs integration vs e2e)
|
||||
2. Coverage requirements
|
||||
3. Critical test scenarios
|
||||
4. Test generation guidelines for Surgical Test Generator
|
||||
|
||||
This section guides the AI when generating tests during the RED phase of TDD.
|
||||
|
||||
<example type="good">
|
||||
Critical Test Scenarios for Data Validation module:
|
||||
- Happy path: Valid data passes all checks
|
||||
- Edge cases: Empty strings, null values, boundary numbers
|
||||
- Error cases: Invalid types, missing required fields
|
||||
- Integration: Validator works with ingestion pipeline
|
||||
</example>
|
||||
</instruction>
|
||||
|
||||
## Test Pyramid
|
||||
|
||||
```
|
||||
/\
|
||||
/E2E\ ← [X]% (End-to-end, slow, comprehensive)
|
||||
/------\
|
||||
/Integration\ ← [Y]% (Module interactions)
|
||||
/------------\
|
||||
/ Unit Tests \ ← [Z]% (Fast, isolated, deterministic)
|
||||
/----------------\
|
||||
```
|
||||
|
||||
## Coverage Requirements
|
||||
- Line coverage: [X]% minimum
|
||||
- Branch coverage: [X]% minimum
|
||||
- Function coverage: [X]% minimum
|
||||
- Statement coverage: [X]% minimum
|
||||
|
||||
## Critical Test Scenarios
|
||||
|
||||
### [Module/Feature Name]
|
||||
**Happy path**:
|
||||
- [Scenario description]
|
||||
- Expected: [What should happen]
|
||||
|
||||
**Edge cases**:
|
||||
- [Scenario description]
|
||||
- Expected: [What should happen]
|
||||
|
||||
**Error cases**:
|
||||
- [Scenario description]
|
||||
- Expected: [How system handles failure]
|
||||
|
||||
**Integration points**:
|
||||
- [What interactions to test]
|
||||
- Expected: [End-to-end behavior]
|
||||
|
||||
## Test Generation Guidelines
|
||||
[Specific instructions for Surgical Test Generator about what to focus on, what patterns to follow, project-specific test conventions]
|
||||
|
||||
</test-strategy>
|
||||
|
||||
---
|
||||
|
||||
<architecture>
|
||||
<instruction>
|
||||
Describe technical architecture, data models, and key design decisions.
|
||||
|
||||
Keep this section AFTER functional/structural decomposition - implementation details come after understanding structure.
|
||||
</instruction>
|
||||
|
||||
## System Components
|
||||
[Major architectural pieces and their responsibilities]
|
||||
|
||||
## Data Models
|
||||
[Core data structures, schemas, database design]
|
||||
|
||||
## Technology Stack
|
||||
[Languages, frameworks, key libraries]
|
||||
|
||||
**Decision: [Technology/Pattern]**
|
||||
- **Rationale**: [Why chosen]
|
||||
- **Trade-offs**: [What we're giving up]
|
||||
- **Alternatives considered**: [What else we looked at]
|
||||
|
||||
</architecture>
|
||||
|
||||
---
|
||||
|
||||
<risks>
|
||||
<instruction>
|
||||
Identify risks that could derail development and how to mitigate them.
|
||||
|
||||
Categories:
|
||||
- Technical risks (complexity, unknowns)
|
||||
- Dependency risks (blocking issues)
|
||||
- Scope risks (creep, underestimation)
|
||||
</instruction>
|
||||
|
||||
## Technical Risks
|
||||
**Risk**: [Description]
|
||||
- **Impact**: [High/Medium/Low - effect on project]
|
||||
- **Likelihood**: [High/Medium/Low]
|
||||
- **Mitigation**: [How to address]
|
||||
- **Fallback**: [Plan B if mitigation fails]
|
||||
|
||||
## Dependency Risks
|
||||
[External dependencies, blocking issues]
|
||||
|
||||
## Scope Risks
|
||||
[Scope creep, underestimation, unclear requirements]
|
||||
|
||||
</risks>
|
||||
|
||||
---
|
||||
|
||||
<appendix>
|
||||
## References
|
||||
[Papers, documentation, similar systems]
|
||||
|
||||
## Glossary
|
||||
[Domain-specific terms]
|
||||
|
||||
## Open Questions
|
||||
[Things to resolve during development]
|
||||
</appendix>
|
||||
|
||||
---
|
||||
|
||||
<task-master-integration>
|
||||
# How Task Master Uses This PRD
|
||||
|
||||
When you run `task-master parse-prd <file>.txt`, the parser:
|
||||
|
||||
1. **Extracts capabilities** → Main tasks
|
||||
- Each `### Capability:` becomes a top-level task
|
||||
|
||||
2. **Extracts features** → Subtasks
|
||||
- Each `#### Feature:` becomes a subtask under its capability
|
||||
|
||||
3. **Parses dependencies** → Task dependencies
|
||||
- `Depends on: [X, Y]` sets task.dependencies = ["X", "Y"]
|
||||
|
||||
4. **Orders by phases** → Task priorities
|
||||
- Phase 0 tasks = highest priority
|
||||
- Phase N tasks = lower priority, properly sequenced
|
||||
|
||||
5. **Uses test strategy** → Test generation context
|
||||
- Feeds test scenarios to Surgical Test Generator during implementation
|
||||
|
||||
**Result**: A dependency-aware task graph that can be executed in topological order.
|
||||
|
||||
## Why RPG Structure Matters
|
||||
|
||||
Traditional flat PRDs lead to:
|
||||
- ❌ Unclear task dependencies
|
||||
- ❌ Arbitrary task ordering
|
||||
- ❌ Circular dependencies discovered late
|
||||
- ❌ Poorly scoped tasks
|
||||
|
||||
RPG-structured PRDs provide:
|
||||
- ✅ Explicit dependency chains
|
||||
- ✅ Topological execution order
|
||||
- ✅ Clear module boundaries
|
||||
- ✅ Validated task graph before implementation
|
||||
|
||||
## Tips for Best Results
|
||||
|
||||
1. **Spend time on dependency graph** - This is the most valuable section for Task Master
|
||||
2. **Keep features atomic** - Each feature should be independently testable
|
||||
3. **Progressive refinement** - Start broad, use `task-master expand` to break down complex tasks
|
||||
4. **Use research mode** - `task-master parse-prd --research` leverages AI for better task generation
|
||||
</task-master-integration>
|
||||
1052
data/audit/principle-cull-apply-20260619T142140Z.csv
Normal file
1052
data/audit/principle-cull-apply-20260619T142140Z.csv
Normal file
File diff suppressed because it is too large
Load Diff
22
data/audit/principle-cull-apply-20260620T085647Z.csv
Normal file
22
data/audit/principle-cull-apply-20260620T085647Z.csv
Normal file
@@ -0,0 +1,22 @@
|
||||
case_number,halacha_id,old_status,final_verdict,votes,score,canonical_id,rule
|
||||
3776-03-15,30ee2df3-3f08-40aa-9cc8-a0ee5f73df53,pending_review,rejected,3,0.89,fb1b982d-6f6d-42aa-9669-c6c78b376027,נקודת המוצא במתן היתר בניה היא כי על ההיתר להתאים להוראות התכניות התקפות החלות על המקרקעין.
|
||||
3776-03-15,6f41e5af-177d-4365-8f16-54f4231ad7f2,pending_review,approved,3,0.9233,61b284e1-95a2-4db6-aa35-086270980e75,"כאשר מוגשת בקשה להיתר בנייה הכרוכה בסטייה מהוראות תכנית החלה על המקרקעין, על הגורם המוסמך לבחון תחילה אם מדובר בסטייה ניכרת מהתכנית; משזו מסקנתו — נסתם הגולל על"
|
||||
3776-03-15,4b6fe8de-86e6-4b05-849e-d95dfdf5f6e6,pending_review,approved,3,0.9333,eac153de-8925-4009-bc68-ab6f8561741c,"בהפעלת ביקורת שיפוטית על החלטות מוסדות התכנון אין בית המשפט שם עצמו בנעלי גופי התכנון ואינו בוחן את תבונת הכרעותיהם המקצועיות כ""מתכנן עליון""; הביקורת מתוחמת לדל"
|
||||
3776-03-15,dd82242e-2bc4-4c3f-a54e-04a476b50b20,pending_review,rejected,3,0.86,15d580ab-4d18-4ca9-a994-5010a12822d9,"פרשנות מהותן של הוראות תכנית והבנת רציונל התכנון המשתקף מהן מצויות בלב שיקול הדעת המקצועי של מוסדות התכנון, ועל כן הביקורת השיפוטית עליהן מצומצמת במהותה."
|
||||
3776-03-15,3f82a5ec-a818-464b-8a88-5cc1dae3c25b,pending_review,approved,3,0.9233,61493c1b-3f65-41a7-90b1-ddfe293e5cbe,"היתר בנייה חייב להתיישב עם התכנית המאושרת התקפה החלה על המקרקעין, ואין להתיר בנייה שאינה תואמת אותה, אלא אם מתקיים החריג שבסעיף 97א לחוק התכנון והבנייה המאפשר מ"
|
||||
3776-03-15,5217bdbb-0115-4f07-9217-32e673071b7d,pending_review,rejected,3,0.9,d30bbb85-176a-4c7e-a1d0-7a980260b1f7,"הנהגת שינויים מהותיים ורוחביים בהוראותיהן של תכניות מקומה במישור התכנוני עצמו — היינו ביזום או שינוי של תכנית — ולא באמצעות ""דלת צדדית"" של בקשה להקלה; שינוי כאמ"
|
||||
3776-03-15,bdc2226a-44be-4702-bae3-17cd6d345a3a,approved,rejected,3,0.9167,18e9bf9a-c508-4ab0-83ef-efb84e026873,"הסתמכות על פרקטיקה מינהלית קודמת שבמסגרתה העניקה הוועדה המקומית הקלות מסוג מסוים אינה יכולה להצמיח זכות לאישור בקשה דומה, מקום בו אותה פרקטיקה היא בלתי חוקית; א"
|
||||
3776-03-15,1838c887-164c-4bc4-9430-8964f29cc059,pending_review,rejected,3,0.8833,2d676164-3899-4cdd-acf4-aadcd0d08edd,"כאשר מדיניות תכנונית עדכנית אינה משתקפת עוד בהוראות התכנית התקפה, הדרך הראויה להגשמתה היא קידום הליכי תכנון חדשים ושינוי הוראות התכנית, ולא אישור סטייה מהוראות "
|
||||
3776-03-15,dfd04cad-b941-46b6-8f02-641c66966447,approved,rejected,3,0.9,538e674d-c67c-47cb-bed2-5508d9f2fa83,"מקום שבו בקשת היתר סותרת תכנית החלה על המקרקעין, אין בידי מוסד התכנון סמכות להתיר את הסתירה במסגרת ההיתר כפי שהוגש; היתר הסותר את הוראות התכנית חורג מסמכותו של "
|
||||
3776-03-15,616f829a-c2f9-4ab7-8b6d-2864141e34a1,pending_review,rejected,3,0.9,2db75f78-0351-43a5-bbad-cafcde4f5c2b,"כאשר לשון הוראות התכנית ברורה ואינה מאפשרת מסקנה אחרת, אין בעובדה שבעבר ניתנו היתרי בניה על בסיס פרשנות שונה כדי להכריע את הכף או להצדיק סטייה מהוראות התכנית הב"
|
||||
3776-03-15,631b957c-9e01-415b-9d98-2f19d0d730f9,pending_review,approved,3,0.9233,7fb1c825-28fc-4ec3-8e0c-da02acddaaf5,"פרשנות מונח בתכנית מתאר מוגבלת לגבולות הפרשנות הלשונית האפשרית של אותו מונח, ואין לאמץ פרשנות המוציאה את המונח ממובנו הפשוט והטבעי או ההופכת הגדרות אחרות בתכנית"
|
||||
3776-03-15,a2eb6b1f-0ffe-4ea0-a9f9-4b7d5e6eecac,pending_review,rejected,3,0.89,97e0bffa-1b62-4b98-a8f9-61198f701a25,פרשנות תכנית מתאר תיעשה באופן העולה בקנה אחד עם לשון התכנית ועם מבנה ההגדרות שבה; אין לאמץ פרשנות המרוקנת הגדרה מובחנת בתכנית מתוכן או הופכת אותה למיותרת.
|
||||
3776-03-15,da10c489-6480-4e50-ae04-a35064082f35,approved,rejected,3,0.8733,7972dc6c-134d-4f38-b3f5-a613d71155b2,"אף בסוגיה של פרשנות תכנית, שבה נסוג במידת-מה הכלל בדבר היקף ההתערבות השיפוטית המוגבל בהחלטות מוסדות התכנון, יטה בית המשפט ליתן משקל לעמדתו הפרשנית של מוסד התכנו"
|
||||
3776-03-15,475749d0-37df-4357-85b0-349f56f1ce8a,approved,rejected,3,0.9,14f41bfc-e713-4729-a1cb-5a7a374a75ce,"ההכרעה הסופית בדבר פרשנותן של תכניות מסורה לבית המשפט, אך בית המשפט לא יאמץ על נקלה פרשנות לתכנית המנוגדת לפרשנותו של מוסד תכנון בכיר, ובכלל זה ועדת ערר מחוזית;"
|
||||
3776-03-15,c38d911b-a73f-4fba-b1f5-5d92e665a505,pending_review,rejected,3,0.8733,9df57d38-7498-456c-8bb4-187f1ebb6997,"כאשר הוועדה המקומית וועדת הערר מחזיקות בפרשנויות שונות ביחס לאותה תכנית, ובמגבלות כללי הפרשנות הרגילים, יש ליתן משקל למעמדה הגבוה יותר של ועדת הערר בהיררכיה התכ"
|
||||
3776-03-15,41b4dbc6-ab9c-4ff6-bc76-cc2caf3e98cd,approved,rejected,3,0.8833,b1581ca5-9f62-4f86-b643-3f2281061fb3,"השאלה אם ייעוד ציבורי בתכנית (כגון שצ""פ) מתיר שימוש של נסיעה ברכב היא ביסודה שאלה של פרשנות התכנית, ויש לבחון כל תכנית לפי הוראותיה הספציפיות. במקרים מתאימים בה"
|
||||
3776-03-15,8bfe87e1-9165-43ea-b794-2e712e6270b8,pending_review,rejected,1,0.62,f293ed24-d200-4a1f-bd95-d6c12881be62,"במחלוקת פרשנית לגבי הוראת תכנית, פרשנותה של ועדת הערר זוכה למשקל רב יותר מפרשנות הוועדה המקומית, נוכח היותה מוסד תכנוני הגבוה יותר בהיררכיה התכנונית ונוכח סמכות"
|
||||
3776-03-15,72ebccce-585d-4cfc-8316-565d79928974,pending_review,rejected,3,0.8733,c7495efe-d781-4d95-918f-779d454df77d,"מקום שתכנית מתאר מסווגת באופן מפורש וברור סוגי דרך שונים לפי אופי השימוש בהם (הולכי רגל לעומת רכב), אין לראות בכך סיווג כללי הסובל פרשנות מרחיבה, אלא סיווג מדוי"
|
||||
3776-03-15,a18c5dad-5687-4002-8863-ca4ad59321e1,pending_review,rejected,3,0.9033,cd67036f-2a06-4720-bed9-ecbcc829ab30,"החלטות מינהליות שניתנו בעבר תוך חריגה מהוראות תכנית ברורות אינן יכולות להצדיק המשך התנהלות הסותרת את התכנית, ואין בהן כדי לבסס עילה למתן סעד שיפוטי המנציח חריגה"
|
||||
3776-03-15,3f0a8ab0-36a0-4634-9377-c9f58734bded,approved,approved,3,0.93,6ac7f2af-5f51-4ee9-a589-18294a1176eb,"החלטות או היתרים שניתנו בעבר בחריגה מהוראות תכנית אינם מצדיקים את המשך אותה התנהלות, ואין בהם כדי לבסס עילה למתן סעד שיחייב את מוסד התכנון לפעול בניגוד לתכנית; "
|
||||
3776-03-15,c6325ae0-df97-4929-a3bc-4cce0f446302,pending_review,rejected,3,0.86,11bc5266-b42c-483d-8bdd-66e3d43c9975,אין לגזור בהכרח גזירה שווה בין גורלם של היתרי בניה שניתנו בעבר ומומשו בפועל — שלגביהם קיים אינטרס הסתמכות רב-עוצמה — לבין הטיפול וההכרעה בבקשות חדשות; ההבחנה בי
|
||||
|
294
data/audit/principle-cull-apply-20260620T090050Z.csv
Normal file
294
data/audit/principle-cull-apply-20260620T090050Z.csv
Normal file
@@ -0,0 +1,294 @@
|
||||
case_number,halacha_id,old_status,final_verdict,votes,score,canonical_id,rule
|
||||
14306-09-23,2cdc1348-6de9-4518-b8f0-718953b1ad50,pending_review,rejected,3,0.8933,9dd6bae8-aba0-410b-9711-ca72036dce12,נישום החולק על עצם חבותו בהיטל השבחה (למשל בטענה שאינו בעל זכות במקרקעין) אינו רשאי לפנות למינוי שמאי מכריע; אולם נישום המודה בקיומו של חיוב עקרוני בהיטל השבחה
|
||||
14306-09-23,f9641fd8-7f83-45d8-8b51-3200be97f5cc,pending_review,rejected,3,0.8567,c12dff85-24da-4097-b23b-f56fd847ff18,"כאשר קיימת מחלוקת שמאית בשומת היטל ההשבחה ובמקביל מועלית טענה לפטור, רשאי הנישום לבקש מינוי שמאי מכריע ולהביא בפניו גם את שאלת הפטור; השמאי המכריע מוסמך להכריע "
|
||||
14306-09-23,cb3855d9-7c77-49ad-97e8-3950657d7120,pending_review,rejected,3,0.8733,983993a8-e574-4910-af11-3b4bf58343df,תכלית המנגנון של הפניה ישירה לשמאי מכריע היא מניעת עומס מיותר על ועדות הערר וייחוד העררים המוגשים ישירות לוועדת הערר לנושאים שאינם מצריכים הכרעה שמאית.
|
||||
14306-09-23,c2ad0789-ecc8-4b3f-85eb-009eb947e8cc,pending_review,approved,3,0.9233,3aba6353-1a53-4f3c-bbe4-7ac74e3559c4,"הפטור מהיטל השבחה מכוח סעיף 19(ב)(10) לתוספת השלישית לחוק התכנון והבניה חל אך ורק כאשר ההשבחה נובעת מהיתר בנייה שניתן מכוח תמ""א 38 או מכוח תכנית מפורטת שהוכנה ע"
|
||||
14306-09-23,9d61067f-c270-42e1-b6b9-88402c2bca53,approved,approved,3,0.9,4fd542e3-d4be-47a4-ad4d-f8eed213400b,"עצם הפנייתה של מחלוקת בהיטל השבחה לשמאי מכריע אינה חוסמת את הנישום מלהעלות טענה משפטית לקיומו של פטור מן ההיטל, וועדת הערר רשאית וצריכה לדון בטענת הפטור לגופה ו"
|
||||
14306-09-23,bafba619-8eec-4bec-9bb0-3c4eef8aa5e2,approved,approved,3,0.9233,eb42684d-d47b-4230-a112-d9fa08eaf81a,"היקף התערבותה של ועדת הערר בהכרעות השמאי המכריע נגזר ממהות ההכרעה: בהכרעות שבתחום השמאות תמעט ועדת הערר להתערב, ואילו בהכרעות שבתחום המשפטי תבחן את הסוגיה מראשי"
|
||||
14306-09-23,7663ce10-16c9-406f-82a1-e4aba5f296a7,approved,rejected,3,0.86,da754643-f352-442c-9343-7ce8e088f1a9,"מימוש זכויות בנייה מכוח תכנון מאושר קיים שונה מהותית, ולא רק טכנית, ממימוש זכויות מכוח תמ""א 38, ושוני מהותי זה מצדיק הבחנה ביניהם גם לעניין הפטור מהיטל השבחה; א"
|
||||
14306-09-23,d9b10812-150e-48a9-9748-ea78e39f443d,pending_review,approved,3,0.91,927d82b6-910a-454f-80aa-7cba31f0ce3b,"זכויות בנייה מכוח תכנון מאושר קיים הן זכויות מוקנות, שעל הוועדה המקומית לאשר את הבקשה המממשת אותן ללא שיקול דעת של ממש כל עוד היא תואמת את התכנית המאושרת, ואין "
|
||||
14306-09-23,006cd888-ee1f-402e-ba3a-6996c75516ed,pending_review,rejected,3,0.9,ae24692e-e6f1-464f-8c69-d120e3fe3ce0,"מימוש זכויות בנייה מכוח תכנון מאושר ('המסלול הירוק') להוצאת היתר תואם תכנית אינו כפוף למגבלות ולתנאים המוקדמים שתמ""א 38 מציבה לניצול הזכויות מכוחה — לרבות הכנת "
|
||||
14306-09-23,c49cbf52-fd5a-4736-a2d7-202a0edcd627,pending_review,rejected,2,0.86,dfe28037-4419-48e9-ba08-a692b1d97cfe,"תמ""א 38 אינה תכנית המעניקה זכויות בנייה בלבד, אלא תכנית המטילה מכלול חובות כנגד מתן הזכויות — ובראשן החובה לחזק את הבניין — לרבות הוראות הנוגעות לבנייה, למרווחי"
|
||||
14306-09-23,43835b8f-c66f-4322-bfa0-b133d4100f4f,approved,approved,3,0.91,ab2dfdc0-5183-497c-91af-8dbcc8b04f2e,"הפטור מהיטל השבחה הנלווה לתמ""א 38 מותנה בבחירת מבקש ההיתר במסלול תמ""א 38 על חבויותיו — ובראשן חובת חיזוק המבנה — ואינו חל על בקשה להיתר המוגשת מכוח התכנון ה'רגי"
|
||||
14306-09-23,4465c959-b6c9-429e-a313-e8c6c389fba4,approved,rejected,2,0.875,bbfe4f38-da39-47e1-9a29-0bc62650237b,"ההסדר שבסעיף 13 לתמ""א 38, המאפשר לראות בזכויות הראשונות שמומשו כזכויות מכוח תמ""א 38 (וממילא פטורות מהיטל השבחה), חל אך ורק מקום שבו הבקשה להיתר הוגשה בפועל במסל"
|
||||
14306-09-23,07650164-bb3f-441e-beb6-2cbebb57f098,pending_review,rejected,2,0.84,2d12d5b2-1643-411d-9caf-34ee65bbcd0f,"קביעת חלותה של תמ""א 38 על מבנה (אי-עמידה בתקן) אינה טעונה החלטה של הוועדה המקומית, ודי באישורו של מהנדס לשם כך."
|
||||
14306-09-23,ee70daeb-a4be-4946-bb37-ffdd05225b1d,approved,rejected,3,0.89,e2eb2aac-370b-405f-8f8a-e21d8539d7c9,"מבקש היתר בנייה מכוח תמ""א 38 חייב להציג את המסמכים המבססים את תחולת התכנית ואת עמידתו בדרישותיה כבר בעת הגשת הבקשה להיתר, ולכל המאוחר בעת הדיון בוועדה המקומית; "
|
||||
14306-09-23,9be638c0-49d0-472b-9374-8cac4a60c3e0,approved,rejected,3,0.8833,409a80a7-b95b-4514-b83a-915a8b3e1fc6,"תנאי מקדמי לזכאות לזכויות מכוח תמ""א 38 הוא הוכחת תחולת התמ""א על המקרקעין; על מבקש הזכויות מוטל הנטל להראות תחילה כי קיימת תחולה לתמ""א 38, ורק לאחר מכן ניתן לדון"
|
||||
14306-09-23,8b7283c2-c682-4209-9af6-7c04f80cffa3,pending_review,rejected,3,0.8733,7c924747-2123-4e0d-90c2-660af130723f,"הוכחת תחולת תמ""א 38 מותנית בעמידה בתנאי סעיפים 8-9 לתמ""א, ובכלל זה הצגת חוות דעת הנדסית הקובעת כי הבניין ראוי לחיזוק, בצירוף המסמכים המפרטים את מצבו הקונסטרוקטי"
|
||||
14306-09-23,12f90b5b-4df7-4f80-8aa2-480c09f4fcb4,pending_review,rejected,1,0.62,25e5d81e-2918-41f7-a98a-95be99458dd9,"סעיף 13 לתמ""א 38 מכוון במקורו לסיטואציה של תוספת בנייה למבנה קיים המחייבת את חיזוקו לפי התקן, ולא לסיטואציה של הריסת המבנה ובנייתו מחדש; שאלת החלת הסעיף גם על מ"
|
||||
14306-09-23,c38630b3-3b2a-4179-a5f6-cd9f0baf491e,approved,rejected,3,0.86,03a9ba53-b7d6-40f6-8843-34fdda631b5c,"מכוח סעיף 25.3 לתמ""א 38, לא יינתן היתר לעבודות בניה וחיזוק לפי התכנית אלא לאחר שהתקבל אישור של מהנדס הוועדה המקומית לנושא הקונסטרוקטיבי; דרישה זו עומדת בעינה אף"
|
||||
14306-09-23,1e0e4f5c-f51e-4677-8c4e-816a14e2871c,pending_review,rejected,3,0.8867,59290cfc-039d-43da-b95b-4f3605feaf13,"הליכי רישוי לפי תכנון קיים שונים באופן מהותי מהליכי רישוי מכוח תמ""א 38, ולפיכך לא ניתן לראות בקשה להיתר שהוגשה מכוח תכנון קיים כאילו הוגשה לפי תמ""א 38 — לא לצור"
|
||||
14306-09-23,f8c0c2e0-4261-4caf-94c2-d2b60680ce21,pending_review,rejected,3,0.8733,78d6a44a-65a5-4ca2-a704-c40c7031fb6a,"כדי שזכויות מכוח תמ""א 38 ייחשבו כמומשות או כמוכרות בהליך הרישוי, נדרשת קביעה מפורשת בהחלטת ההיתר — בין של מהנדס הוועדה המקומית ובין של הוועדה המקומית עצמה — כי "
|
||||
14306-09-23,bf143905-f536-4a5d-8f90-064ded4e64fa,pending_review,rejected,3,0.86,90648e5e-a96f-4b4b-940a-40261325bff4,"היקף חובת מסירת המידע התכנוני המוטלת על הוועדה המקומית כולל ציון הזכויות הניתנות לניצול מכוח תמ""א 38 (בכפוף לעמידה בתנאיה) ואת הזכויות הניתנות לניצול מכוח התכנו"
|
||||
14306-09-23,2f705ae2-b735-4c6c-b0cb-20c6d1e31dac,pending_review,rejected,3,0.9,6955fa99-3424-40e1-9704-cbf111f54ebf,"עקרון העל של היטל ההשבחה הוא חיוב הנישום בגין התעשרותו בפועל מהשבחת המקרקעין; משקמה התעשרות בפועל, חב הנישום בהיטל באופן עקרוני, אלא אם חל עליו פטור."
|
||||
14306-09-23,21938857-e567-4b9c-ab77-11658c0599af,pending_review,rejected,2,0.86,c1e10c6b-ec02-42ed-ab25-21380085c540,"פטור מהיטל השבחה הוא חריג לעקרון המחייב את הנישום לחלוק את התעשרותו עם הקהילה; פטור הניתן בגין מימוש זכויות מכוח תמ""א 38 מותנה בעמידה הן בזכויות והן בחובות שמכו"
|
||||
14306-09-23,b47fd4a5-1a8e-4d8b-97a2-d8d47e5f9a44,pending_review,rejected,3,0.8733,4b2e47a8-8df7-41e5-b900-7838907845cd,"עקרון השוויון בין נישומים פועל בין שווים בלבד ולא בין שונים; הבחנה שערך המחוקק בין מימוש זכויות מכוח תכנון קיים לבין מימוש זכויות מכוח תמ""א 38, מקום שמצא כי האב"
|
||||
14306-09-23,9427a3c6-ccb5-4730-a247-433b75f6eda5,pending_review,rejected,0,0.0,d581bee2-a50e-417e-8848-5d0ba9ee4803,"תמ""א 38 נועדה לחיזוק מבנים קיימים, ועל כן מתעורר קושי של ממש בהחלתה על מגרשים ריקים שבהם נהרסו המבנים בטרם הוגשו למוסדות התכנון המסמכים הקונסטרוקטיביים הנדרשים "
|
||||
14306-09-23,7c57a51e-ec07-4bf5-a8b2-65a181b89ddb,approved,rejected,3,0.8833,844a92ba-2d4a-4ab8-bee5-677b2061f5cd,"צד שזכה בהליך זכאי להחזר ריאלי של שכר טרחת עורכי דינו ושל הוצאות המשפט שהוציא, ובלבד שאלה סבירות ומידתיות לניהול ההליך; בקביעת שיעור ההוצאות יש לשקול גם פרמטרים"
|
||||
"עמ""נ 18618-12-22",77b2d85d-edcb-4e92-893b-38f5013c89d0,approved,rejected,3,0.9167,fd63da9b-6c58-4040-a052-3a8b03778e95,"בעת חישוב היטל השבחה בגין תמ""א 38, יש לנטרל מרכיב 'מצב קודם' רק את חלק השווי הניתן לייחוס לעצם תחולתה של תמ""א 38 על המקרקעין; אין לנטרל מרכיב שמקורו בעליית ערך "
|
||||
"עמ""נ 18618-12-22",c33373d1-aa7e-46e5-9f1b-6f93820d3141,approved,rejected,3,0.8933,244fcced-6b02-4000-80f3-09c64b6d4278,"מועד אירוע המס בהיטל השבחה מכוח תכנית מפורטת לפי תמ""א 38/23 ייקבע לפי שלוש קטגוריות: (א) כאשר ניתן להוציא היתר במסלול תואם תכנית ללא פרסום וללא שיקול דעת — הזכו"
|
||||
"עמ""נ 18618-12-22",2b280970-455e-47ff-8939-6b07e059a773,approved,approved,3,0.9333,554e7c28-fdd9-436c-88ce-dacd50b4dc8e,"חיוב בהיטל השבחה מותנה בהתקיימותם המצטברת של שני תנאים: ראשית, שווי המקרקעין עלה; שנית, עליית השווי נגרמה עקב אחת מפעולות התכנון המנויות בחוק. בהיעדר אחד מהתנאי"
|
||||
"עמ""נ 18618-12-22",50b25ae7-786e-4ccc-b520-3843056fb7b1,approved,rejected,3,0.8867,4438d697-110b-427a-b668-86b3321c41c4,"סעיף 4(1) לתוספת השלישית לחוק התכנון והבניה מעגן את עקרון דחיית המס (עקרון המימוש) בהיטל השבחה — כאשר פעולת התכנון היא אישור תכנית, רשאית הוועדה המקומית לדחות א"
|
||||
"עמ""נ 18618-12-22",9e270484-0168-4fcd-895a-7330edb032cf,approved,rejected,2,0.875,e629a91b-5f4d-4fb3-b225-c8e79ac5a342,סעיף 1(א) לתוספת השלישית לחוק התכנון והבניה מגדיר שלושה מצבי מימוש זכויות המהווים אירוע מס לעניין היטל השבחה: (א) קבלת היתר לבניה או לשימוש שלא ניתן היה לתיתם ל
|
||||
"עמ""נ 18618-12-22",a53c5cf3-b77b-4f52-8881-d7b5a44e52b9,approved,approved,3,0.9233,9ea8abba-efd1-4985-ba79-09546d293733,חישוב היטל ההשבחה ייערך באמצעות שתי הערכות שווי של המקרקעין ליום תחילת התכנית (או יום אישור ההקלה/השימוש החורג): האחת לפי המצב החדש בהתאם לזכויות שהוענקו בתכנית
|
||||
"עמ""נ 18618-12-22",36614674-61a8-4dd4-904f-43c7d850d262,approved,rejected,3,0.91,e33dfcad-fcab-4a00-892c-a0d2450137c2,"לצורך קביעת ""שווי השוק"" של מקרקעין ערב אישורה של תכנית משביחה לעניין היטל השבחה, יש לבחון את השווי מבעד למשקפיו של ""קונה מרצון"" אלמוני, על בסיס המידע שהיה בידיו"
|
||||
"עמ""נ 18618-12-22",7db2574f-d308-479d-b7d1-3d01d640b9de,approved,rejected,3,0.8933,0b701bc2-fb68-4b60-b70e-3eb26c6750fa,"ההשבחה הנובעת מזכויות מותנות הינה השבחה אחת המורכבת הן מהזכויות המוטמעות בתכנית והן מאישורן הסופי, ויש לחשבה בכללותה נכון למועד תחילת התכנית. אין לראות באישור ה"
|
||||
"עמ""נ 18618-12-22",96e60d79-02c3-4ed1-91ab-18e6430683eb,approved,rejected,3,0.9167,18e581c9-880c-47c5-9659-dafe77b54483,"ציפיות או תקוות לשינוי תכנוני שנכזבו, לרבות ציפייה המבוססת על פעילות תכנונית שהוחל בה ביחס למקרקעין, אינן מהוות כשלעצמן פגיעה בתכונות המקרקעין המקימה עילת פיצוי"
|
||||
"עמ""נ 18618-12-22",5007c010-73c2-4281-a345-66970c436bcb,approved,rejected,3,0.8833,0a86b3c0-4781-40e6-8354-1ffc21acfb09,"מקום בו צפוי שינוי בתכונות ובשימושי המקרקעין שסיכויי התרחשותו קרובים וממשיים, ותכנית שהתקבלה היא שסתמה את הגולל על אותו שינוי צפוי — מתקיים קשר סיבתי בינה לבין "
|
||||
"עמ""נ 18618-12-22",a7fb903e-0eb1-43b4-aa91-5ff7726c5dcc,approved,rejected,3,0.8833,173b3c90-fe07-42ff-adaf-5bcfb44ea528,"ניתן לחייב בהיטל השבחה בגין תכנית מתאר ארצית שהסירה מחסום נורמטיבי, חרף המדרג הנורמטיבי שבין תכנית מתאר ארצית לבין תכנית מקומית מפורטת."
|
||||
"עמ""נ 18618-12-22",bf625667-be27-4748-99e2-1c1b1ffd1448,approved,rejected,3,0.8733,36a2538e-b37a-408d-b1eb-b9a3b79984a2,"המתחם שבמסגרתו נבחנת ההשבחה לצורך היטל השבחה חייב להיות מתחם ריאלי, מכוח עקרונות ההיגיון וההגינות. תכלית קביעת ההיטל היא חילוץ מס אמת — קרי, השיעור האמיתי של הה"
|
||||
"עמ""נ 18618-12-22",e34ac92e-9faa-4df4-a37d-0d28bbef05e7,approved,rejected,3,0.8733,5e04fe5e-b70a-4a3c-a38d-b802b577f4d3,"מבחן הקשר הסיבתי הישיר מעניין לוסטרניק חל על קביעת ""מצב קודם"": ככל שקיים קשר סיבתי ישיר בין התכנית המשביחה לבין עליית הערך הנובעת מציפייה תכנונית, אין להביא את "
|
||||
"עמ""נ 18618-12-22",47e6aaff-4509-4053-9e81-32b63384cfaf,approved,rejected,2,0.875,54492409-3318-444f-bb37-e63fed63107f,"אין לקבוע קטגורית כי הסיכוי לקבל היתר בניה מכוח תמ""א 38 הינו סיכוי קלוש ורחוק; הערכת סיכוי המימוש היא שאלה שמאית מובהקת המחייבת בחינה על-ידי שמאי מומחה, תוך התח"
|
||||
"עמ""נ 18618-12-22",96a0c169-61aa-4688-9b5c-7298ddad25da,approved,rejected,3,0.8867,e228fe56-91de-4e93-90c0-e4b25332781f,"בבחינת היטל השבחה הנובע מתמ""א 38, על השמאי המייעץ לבדוק האם חלה עליית שווי בדירות ממועד תחולתה של תמ""א 38 ובעטיה, ובכלל זה לבחון כיצד נהגה הוועדה המקומית בפועל "
|
||||
"עמ""נ 18618-12-22",38ee601b-7fc4-4ac3-a08a-1b23d05e2936,approved,approved,3,0.9233,f579423b-2750-4232-a3ff-86f29d6ab6af,"היטל השבחה מוטל אך ורק על השבחה שמקורה בפעולת תכנון, ולפיכך מוטלת על השמאי חובה לחלץ ולבודד את רכיב השבחת התכנון מיתר הגורמים שהביאו לעליית שווי המקרקעין, באופן"
|
||||
"עמ""נ 18618-12-22",01ef325f-4a90-485c-81e8-dd3430e8ff6b,approved,approved,3,0.9233,e1d9a0d8-5e79-4564-ad33-39d61e161a55,"לא ניתן לגבות היטל השבחה בגין תכנית מופקדת שטרם אושרה, שכן 'השבחה' מוגדרת בתוספת השלישית לחוק התכנון והבניה כעליית שוויים של מקרקעין עקב אישור תכנית, מתן הקלה א"
|
||||
"עמ""נ 18618-12-22",5e159171-d65f-413d-ba23-5285c0d22d39,approved,rejected,3,0.8867,1621c32e-4a88-49a8-86d3-7044081f11c2,"לא ניתן לשלול קטגורית התחשבות בפוטנציאל התכנוני הנובע מעליית שווי בשל תחולתה של תמ""א 38 בעת קביעת ""המצב הקודם"" של הדירות לצורך חישוב היטל השבחה. ההתחשבות בעליית"
|
||||
"עמ""נ 18618-12-22",945f8155-1893-4841-a8be-f5f4c0301fd1,approved,approved,3,0.9233,5438c27d-8d15-4a58-ba81-fb5c7013b773,"המועד הקובע לחישוב היטל השבחה הוא יום תחילת התכנית המשביחה, ולא מועד מאוחר יותר כגון מועד הוצאת היתר הבניה או המועד הצפוי למימוש בפועל."
|
||||
"עמ""נ 18618-12-22",5ff2cbe7-3fc6-4dff-9d96-9ef8d87b6043,approved,rejected,3,0.8933,308ae7d9-b128-421c-bb1e-b12f06bff3d3,"בשומת היטל השבחה הכוללת מקדם דחיה בגין ריבוי בעלים, על השמאי להתייחס לכל אחד מגורמי הדחיה בנפרד, להסבירו ולכמתו בהתייחס לנתוניו ומאפייניו של הנכס הספציפי; אין ל"
|
||||
"עמ""נ 18618-12-22",4339e34c-e9a9-4dbd-8923-73f55468e716,approved,rejected,3,0.91,f04a58a2-5437-4957-8ca5-d732d7932c36,"אין להרחיב חזית בסיכומים על-ידי הבאת נתונים חדשים שלא נטענו בערעור, ובוודאי לא תוך צירוף נספחים חדשים; נספחים שצורפו באופן זה דינם להימחק מהסיכומים."
|
||||
"עמ""נ 18618-12-22",445cb2f4-d078-4aef-a3af-1a37cfc2b243,approved,rejected,3,0.84,83a7d2ef-5f36-472c-95bf-0d8fa4209c26,"כתבות עיתונאיות אינן קבילות כראיה, ואין מקום לצרפן לסיכומים; נספח מסוג זה יימחק מהסיכומים ובית המשפט לא יתייחס אליו."
|
||||
"עמ""נ 18618-12-22",560d301e-b409-4450-a24b-9540f79336ab,approved,rejected,3,0.8733,f1e879ea-fd52-4245-81d5-2ae9fee55ef2,"בחינת תקינותן של שומות היטל השבחה הינה עניין המצוי במומחיותה של ועדת הערר, ובית המשפט המנהלי יימנע מלהתערב בהחלטתה בנושא זה כל עוד היא סבירה ומבוססת."
|
||||
"עמ""נ 18618-12-22",30eb914f-30a2-486a-af1d-e38be3a9a805,approved,rejected,3,0.84,190989be-e7ea-4514-9e0f-c655ab83bd79,"כאשר ועדת הערר סבורה כי טענות שהועלו בערר אינן מצדיקות ביטול החיוב בהיטל השבחה אך מעוררות שאלות שמאיות, מוסמכת היא למנות שמאי מייעץ לפי תקנה 16 לתקנות התכנון וה"
|
||||
"עמ""נ 18618-12-22",2cc9fd43-aefa-4bd6-9e22-7148e38e1e7a,approved,rejected,3,0.8833,50d29aa8-38c8-4c21-87c4-6fe55700e7aa,זהותו של השמאי המייעץ או המכריע אינה צריכה להשפיע באופן ניכר על הערכת השווי של מקרקעין בעלי מאפיינים דומים; שונוּת כזו פוגעת בעקרון השוויון בחיוב במס ויש למונעה
|
||||
1975/24,31832674-484f-4ec8-9af9-9110394fbb75,pending_review,rejected,3,0.8933,b87d1662-1e09-46bb-a586-52135c9e106d,"דו""ח מבקר המדינה אינו יכול לשמש ראייה בהליך משפטי, מכוח סעיף 30 לחוק מבקר המדינה, ולפיכך אין מקום שיימצא בתיק בית המשפט כראייה."
|
||||
1975/24,d0ed7ae4-1828-4327-9e78-f8297907d1d3,pending_review,rejected,3,0.9,f6369e27-a45e-4a6b-9ca7-68e2afac7e9e,"כאשר עליית ערך המקרקעין נובעת משיווי המשקל בין הביקוש להיצע בשוק החופשי, ולא מפעולה רגולטורית של רשויות התכנון, אין הציבור רשאי לדרוש מבעל המקרקעין לחלוק עמו את"
|
||||
1975/24,4d7cdc3c-f157-437e-8dc0-459ccdfafafd,approved,rejected,3,0.91,04200e5c-8f1a-448f-8d6b-fc459b95871b,עצם אישורה של תכנית המקנה פוטנציאל תכנוני — אפשרות בלתי ודאית לקבלת תוספת זכויות בניה — אינו מגבש כשלעצמו אירוע השבחה; ה'מתת הרגולטורי' המצדיק עקרונית הטלת חיוב
|
||||
1975/24,13f84c01-6583-4437-bcde-d6f5c03e7152,pending_review,rejected,3,0.8867,d970db37-83d3-435e-b79f-1dd233dc6a27,"סוגיית אופן שומת ""המצב הקודם"" לצורך חישוב היטל ההשבחה – ובכלל זה השאלה האם יש לנטרל עליית שווי שמקורהּ בתכנית אחרת – נטועה בדיני המס ולא בדיני התכנון והבניה, וע"
|
||||
1975/24,866a03b6-80dc-4bdf-9914-df12eb753d85,approved,rejected,3,0.9033,0394a71d-e8ad-477c-857a-d695fa49db93,"עצם אישורה של תכנית מתאר ארצית (תמ""א) אינו מכונן כשלעצמו אירוע מס לעניין היטל השבחה; אירוע המס הרלבנטי מתגבש רק עם אישור התכנית האחרת המקימה בפועל את עליית שווי"
|
||||
1975/24,c414669d-5c09-44e5-be8c-8fa4a05f334a,pending_review,approved,3,0.9233,b8ac863d-35a8-404d-891b-e11f9b2b46b5,"היטל השבחה חל אך ורק על רכיב עליית הערך שנגרם כתוצאה ישירה מהתכנית המשביחה, ועל כן יש לחלץ ולבודד רכיב זה מתוך העלייה הכוללת בשווי המקרקעין המושפעת גם מגורמים א"
|
||||
1975/24,4b7f0751-6689-4759-b561-1a48eeb8a9f4,approved,rejected,3,0.8667,22341100-e031-4a8c-9c99-b3377f337d35,"מבחינת הפרקטיקה השמאית, ההשבחה נקבעת כהפרש שבין שווי המקרקעין ב'מצב הקודם' לבין שוויָם ב'מצב החדש', והפרש זה — המייצג את ההשבחה שצמחה בעקבות הפעולה התכנונית — ה"
|
||||
1975/24,bb8a8a8b-e342-4b4e-bab1-1811ccb73585,pending_review,approved,3,0.9167,a9e3e5ed-8d66-48bf-bcf9-5020b360d4ae,"תכלית היטל ההשבחה היא השתתפות בעל המקרקעין בהוצאות הרשות המקומית ושיתוף הציבור בהתעשרותו שמקורה בפעולה תכנונית של הרשות; מתכלית זו נגזרת דרישת הקשר הסיבתי, ובכך"
|
||||
1975/24,9d7ff5cd-c2b7-4726-ad0f-00ab28cacab5,approved,approved,3,0.9233,d1f697ac-36e0-4c1f-8fe8-e0087f615026,"גביית היטל השבחה כפופה לעיקרון היסוד ""אין מס ללא חוק"", ואין להטיל היטל על עליית שווי בהיעדר מקור חוקי המסמיך זאת; שיטת שומה המנטרלת רכיב שווי ללא עיגון בדין נוג"
|
||||
1975/24,8cc2bb45-cf03-489a-94be-aecb13886768,approved,rejected,3,0.9,51b83c7e-5431-43c3-8899-9d5827f211dd,"לא כל פעולה תכנונית של רשות ציבורית, אף אם יש בה כדי להעשיר את האזרח, מכוננת אירוע מס וגוררת חיוב בהיטל השבחה; חיוב בהיטל מותנה בקיום אירוע מס המוכר בדין ולא בע"
|
||||
1975/24,1187b0d8-5846-4818-a3d4-3a39aed2e530,approved,rejected,3,0.8833,be5e2d8e-1fb8-403d-8bf5-19637c889a04,"שומת ערך המקרקעין לצורך חיוב בהיטל השבחה נערכת לפי ""גישת ההכללה"" — קרי, הערכת השווי לפי ערכי שוק חופשי ""כמות שהם"", הכוללת בתוכה את מלוא השפעת התכנית על השווי — "
|
||||
1975/24,60440032-888a-4b7e-a673-da5659bb081e,approved,approved,3,0.9233,16587c4f-b386-4f3c-be6a-9956e2c50995,"חיוב בהיטל השבחה מותנה בקיומו של קשר סיבתי בין התעשרות הנישום לבין התכנית המשביחה העומדת בבסיס החיוב; בהיעדר קשר סיבתי כזה — לא ניתן להטיל היטל השבחה, גם כאשר ח"
|
||||
1975/24,f6c897fc-d510-4c26-ad9d-33c2ff685160,pending_review,rejected,3,0.9033,9364f0ff-0001-4395-b63f-af9520bb0ac4,"משאין נגבה היטל השבחה על עליית הערך הנובעת מאישור תמ""א 38 במועד מימוש המקרקעין, אין מקום לאמץ את 'גישת הנטרול' ולהחיל דין שונה — דהיינו לגבות היטל בגין אותה עלי"
|
||||
1975/24,e14fca55-b1c7-4692-8e68-f5a9c95fb31b,pending_review,rejected,3,0.89,10986084-442f-4149-a4f0-685aa70c1060,"יש להבחין בין ""השבחה"" כעובדה כלכלית — עליית ערך המקרקעין בפועל — לבין ""השבחה"" כאירוע מס המגבש חבות בהיטל השבחה. עליית ערך עובדתית אינה מנביעה כשלעצמה התגבשות אי"
|
||||
1975/24,42ac6f8a-b60b-4997-8540-a25ea6668333,pending_review,rejected,3,0.8733,f251fc8a-5ed6-4193-bdb1-c74b2b9d53f0,"התחשבות בערכן הכלכלי של זכויות מותנות בשומת ""המצב הקודם"" אינה הופכת זכויות אלה ל""זכויות מוקנות"". שווי מקרקעין בשוק החופשי מגלם משתנים שונים, לרבות זכויות שאינן "
|
||||
1975/24,00581d89-6ca5-4d42-a376-c8371e1f130e,pending_review,rejected,2,0.9,ccd3a9a6-265c-4685-b6bb-41738b360425,"בהערכת שווי זכויות בנייה מותנות מכוח תמ""א 38, שיטת ההשוואה באמצעות עסקאות דומות אינה מעוררת קושי שמאי של ממש, שכן מחירן של העסקאות הדומות ממילא מגלם בתוכו את ער"
|
||||
1975/24,5e9f1fe9-40d3-41ab-82aa-4b5589e09255,pending_review,rejected,3,0.8767,048cc8cd-57e4-43ad-b564-c65d15567474,"השאלה אם אירוע תכנוני מסוים תרם בפועל לערכם של המקרקעין היא שאלה שמאית מובהקת שהכרעתה מסורה לשמאים המוסמכים, שכן שומת מקרקעין מתארת עובדות כלכליות אמתיות של חלי"
|
||||
1975/24,89518160-9042-4158-a0b0-611803a8fabf,pending_review,rejected,3,0.9167,b710188d-8ac2-430d-abd8-e33461a30e9c,"בדיני היטל השבחה בעל המקרקעין אינו אמור לחלוק עם הציבור את מה שהשוק נתן לו, וכשם שכך — אין הציבור אמור לפצותו על מה שהשוק לקח ממנו; היטל ההשבחה נועד ללכוד את על"
|
||||
1975/24,4f26dfab-3f71-4352-8370-058c6515a04a,pending_review,rejected,3,0.8733,96d39c3f-85fa-4d3c-9205-da5e86e8eae1,"שווים בפועל של מקרקעין אינו תוצר של הזכויות המשפטיות המוקנות לבעליהם בלבד, אלא של מכלול מאפיינים שחלקם מעוגנים בדין וחלקם אינם מעוגנים בו (כגון מיקום גיאוגרפי, "
|
||||
1975/24,3390b24d-8413-495d-9528-c2b374205adc,pending_review,approved,3,0.9333,0efa0717-30b4-4a30-a814-27ec86560a80,"בקביעת שווי המקרקעין ""במצב הקודם"" לצורך חישוב היטל השבחה חל ""כלל הנטרול"": ממכלול הנתונים האובייקטיביים המשפיעים על שווי השוק יש להוציא את עליית הערך שנגרמה בשל "
|
||||
1975/24,04176457-162b-48bb-966f-69fc26cfc785,pending_review,rejected,3,0.9033,0fe2bf5b-2793-4b3f-9937-ddfce06727f6,"בקביעת שומת היטל השבחה השומה השמאית נגזרת מן הדין ולא להפך; על בית המשפט לקבוע תחילה את העקרונות הנורמטיביים המחייבים, ורק מהם ייגזר החישוב השמאי."
|
||||
1975/24,4d906974-4f7c-40ea-9c47-43b3818cda23,pending_review,rejected,3,0.84,544f7364-4cc4-40a1-877f-534401ca9764,"ערכאת הערעור אינה נוטה להתערב בקביעות וממצאים עובדתיים ""בגלגול שלישי"", ובכלל זה בקביעות הנוגעות לטיבן של תכניות."
|
||||
1975/24,4a27de24-415f-4636-a044-8d70416e109c,pending_review,rejected,3,0.8733,d6e6c1d2-a449-4855-97f5-e4c2013bffcc,"תכלית היטל ההשבחה היא לחייב את בעל המקרקעין רק בגין השבחה שצמחה מפעולת התכנון של הוועדה המקומית והשקעת משאביה. לפיכך, כאשר ההשבחה צמחה מאישור תכנית מתאר ארצית ("
|
||||
1975/24,ab3f739c-6295-4040-9717-3b02b3043cf0,pending_review,rejected,3,0.8867,d282198c-095e-4dfa-a8d7-d89b6e7ccd07,"להשלמת התגבשות החיוב בהיטל השבחה יש לבחון ביחס לכל אחת מן התכניות בנפרד את יסוד ההתעשרות, על בסיס השוואה בין ""המצב הקודם"" ל""מצב החדש"", תוך בידוד ההשבחה שצמחה בק"
|
||||
1975/24,2e92fd54-cf87-4317-857d-dfb62b3f09f2,pending_review,rejected,3,0.8933,19c970a7-cbdd-46bb-adb7-511c4bdd7ef6,"בעת שומת ""המצב הקודם"" של מקרקעין לצורך גביית היטל השבחה, אין להפחית משווי השוק את תרומתה של תמ""א 38 ישנה ככזו, מקום שלא הוצא מכוחה היתר בניה. עליית הערך הנובעת "
|
||||
1128-08-20,721c35f8-04f4-40e2-95fc-a70883efdb7c,approved,rejected,3,0.79,549b55b0-7715-482b-8769-8005e4f24e00,הגשת בקשות היתר בנייה בשיטת 'הסלמי' — ריקון החלקה מזכויות הבנייה שלה לטובת חלקות אחרות ולאחר מכן הגשת בקשה נוספת הנשענת על הקלות וניוד זכויות ממגרשים אחרים — על
|
||||
1128-08-20,2c563aea-7719-404e-a97f-08bf1fc761a0,approved,approved,2,0.9,cdf18dc3-6859-48f7-97c4-8b7fbbd3a934,פרסום בקשה להיתר בנייה ללא גרמושקה מהווה פגם בזכות הטיעון היורד לשורשו של ההליך.
|
||||
1128-08-20,809d64cf-6979-4250-a834-7071e9fc7fda,approved,approved,2,0.9,ae114368-ca47-47b6-99dd-c6a071723179,"טענות שלא פורטו ולא הועלו בכתב ההתנגדויות ואף לא בערר המקורי, שהועלו לראשונה בשלב השלמות הטיעון בפני ועדת הערר, מהוות הרחבת חזית אסורה שיש לדחותה."
|
||||
1128-08-20,9145d103-0624-4ac2-800e-c2883e89b75d,approved,rejected,3,0.86,1ab766de-1952-4752-af77-316c96bd1d47,"בבחינת התנגדות לבקשת היתר בניה המבוססת על חסר בשטחי ציבור, יש להבחין בין חסר סטטוטורי (היעדר הקצאת שטחים בתכנית) לבין חסר פיתוחי (אי-ביצוע בפועל של שטחים שהוקצו"
|
||||
1128-08-20,81688e2c-0368-4d8d-934a-a63d994c0971,approved,rejected,2,0.875,419ef49c-1642-4a96-b7f6-c3d27043e277,"תנאי תכנית המחייב סיום ביצוע שטחים פתוחים ציבוריים (שצ""פ) כתנאי לקבלת טופס אכלוס למבנה המגורים הראשון מהווה ערובה סטטוטורית מספקת לכך שהפיתוח הציבורי יתממש בד ב"
|
||||
1128-08-20,977ebfbd-dfe2-4bf7-a865-48bf5b43d331,approved,rejected,0,0.0,f15c214d-0ee6-4431-82f3-4247ca0e444c,"פגם פרוצדורלי בהעדר נגישות לגרמושקה (תוכניות בינוי) מרופא בהליכים בפני ועדת הערר, מקום שהעוררים מיצו בפניה את מלוא טענותיהם לגוף העניין — בנוגע לבינוי, ניוד שטח"
|
||||
1128-08-20,040df4ea-40bc-4eb5-89b0-a43029240594,approved,rejected,3,0.7933,3c3bcf2a-ec78-45d0-b307-419ad2c67ba2,"לפי סעיף 151 לחוק התכנון והבנייה, תוספת הזכויות נקבעת לפי הזכויות הקיימות במגרש ולא בבניין — ההתייחסות ל'בניין' בגוף הסעיף נועדה אך להבהיר שהתוספת הכמותית תשמש "
|
||||
1128-08-20,f7ddc2e0-48e5-4665-9ca2-b8d50c5d7492,approved,rejected,2,0.825,b8782b14-f88d-41c5-9339-fbdc4fc11150,"ועדת ערר רשאית לדון בטענה שהועלתה לראשונה בפניה ומהווה הרחבת חזית, כאשר קבלתה עלולה לאיין לחלוטין את עצם הסעד המבוקש — זאת מכוח שיקול דעת פרוצדורלי בנסיבות קיצו"
|
||||
1128-08-20,4e826d39-2af5-4f22-abfa-ce5004e53e21,approved,rejected,3,0.8233,be590ca8-ae04-4c9e-8282-f149c2648dab,"תכנית המאפשרת תוספת שטחי שירות עבור מחסנים ברמה רוחבית החלה על כלל שכונה, ללא קביעת מיקום בתשריט ומבלי שנדרשת תכנית נוספת, מהווה 'תכנית נושאית' כמשמעה בסעיף 151"
|
||||
1128-08-20,042ca8a5-abe7-4386-8aaf-9e50e41eb2df,approved,rejected,2,0.875,dab14554-87ef-4c57-898f-0e518c7f6fbb,"הצדקה תכנונית היא תנאי סף לאישור הקלה; בהיעדרה אין מקום לאשרה כלל. מעבר לכך, יש לבחון את מועד אישור התכנית החלה ואת היקף ההקלה, וכן את הפגיעה האפשרית בסביבה ובצ"
|
||||
1128-08-20,a84e2f65-9cee-451e-882e-eaeb5d392abf,approved,approved,2,0.9,cbfd9238-3033-40ee-8bf3-d7861aab8a7c,"הוראות סעיף 151(ב3) לחוק התכנון והבנייה וסעיף 2(9)(ד) לתקנות התכנון והבנייה (סטייה ניכרת מתכנית), התשס""ב-2002, מחייבות שני תנאים מצטברים: (א) הפעלת שיקול דעת של"
|
||||
1128-08-20,e8021395-3a15-432d-9ea2-8ed2853c28b3,approved,rejected,2,0.875,016b939c-eff1-4a79-b161-9b3edbaa2fe2,"כאשר תכנית חדשה עשויה לפגוע בהוראות תכנוניות קודמות החלות על מגרשים ספציפיים, מוסמכת ועדת הערר להורות על הכללת הוראת עדיפות מפורשת בתכנית החדשה, לפיה הוראות התכ"
|
||||
1128-08-20,a45cb59d-0c32-478b-93ea-e0e35526129b,approved,rejected,3,0.79,769ffcf9-66b0-4462-9d1d-37534bf39b11,"כאשר ההקלה המבוקשת נוגעת ליחידות דיור שהוחסרו מהתכנית המאושרת — ולא ליחידות נוספות מעבר למתוכנן — אין לראות בה 'הטלת עומס' על השכונה, ומדובר בהצדקה תכנונית התומ"
|
||||
1128-08-20,326cf232-aed0-40dc-8de2-4556a709d0bf,approved,rejected,2,0.825,a5b3c359-2945-488d-acac-acee167473fe,"שטחי ציבור שאושרו בתכנית ועונים על דרישות הוועדה המחוזית — לרבות שטחים שיתממשו במקביל לבנייה — מהווים מענה תכנוני מספק גם ליחידות דיור שנוספו בדרך של הקלה, ואין"
|
||||
1128-08-20,f22214df-740d-4e24-92c8-96d73cddc5e4,approved,rejected,2,0.825,80737d5b-a9f2-4f42-a5fd-ab05ca9ee875,"ועדה מקומית רשאית להישען על מסמכי פרוגרמה ומדיניות שכונתיים לצורך בחינת כשירות הקלה לתוספת שטחים, ובלבד שמהנדס העיר אישר כי היקף הבינוי הכולל המבוקש נותר במסגרת"
|
||||
1128-08-20,d5226f84-52a1-4a01-916b-71fa20d3d127,approved,approved,2,0.9,77c03df3-f913-42dd-97ea-ca2e91b2f992,אופי הסביבה לצורך בחינת הקלה נקבע על פי הסביבה הסטטוטורית ולא על פי הסביבה הקיימת בפועל; ושינוי אופי הסביבה נבחן אף הוא ביחס לסביבה הסטטוטורית בלבד.
|
||||
1128-08-20,eb8f5113-166c-4775-98fd-517fbb054883,approved,rejected,3,0.8233,ca99829d-1377-43ba-8c7e-40f2bf1a3ebd,"הרשות המקומית מחויבת ליתן מענה למוסדות ציבור בהתאם לצרכי האוכלוסייה; ככל שקיים חסר בשטחי מבני הציבור, על הרשות לתגברם — לרבות באמצעות בנייה לגובה — ואין להעביר "
|
||||
1128-08-20,0d3256b0-32bd-462f-90e8-98c6e748e9d4,approved,rejected,2,0.875,ed6c5dde-103e-4843-9aea-66afbdfa2af0,"עצימות הקלה נמדדת ביחס למדיניות ולהיקפי בינוי שאושרו בפועל או המצויים בקידום, ולא בערכים מוחלטים. הקלה שמידתה אינה עולה על מדיניות שאישרה הוועדה המקומית ועל עצמ"
|
||||
1128-08-20,feff454e-ca5d-4bb5-93ba-4c87d08890d3,approved,rejected,2,0.875,a9d95521-079d-40ca-8d70-8d334bbe1151,"פרסום הודעות כוללות לצורך הגנה על זכויות קנייניות של בעלים בתחום תכנית, שאינו כולל בקשה קונקרטית להיתר בניה ואינו מבצע כל פעולת העברת שטח ממגרש למגרש, אינו מהוו"
|
||||
1128-08-20,613dcbde-da62-4b09-bb5b-8f88ebcafe4d,approved,rejected,2,0.875,a964f7e1-fa25-462d-a5ec-786987ea1f01,מספר מגרשים הנמצאים בבעלות גורם אחד עשויים להוות מתחם אחד לצורך ניצול זכויות הבנייה הנגזרות מהתכניות החלות עליהם; במצב זה מחשבים את היקף הזכויות לכלל המגרשים במ
|
||||
1128-08-20,54a0358d-c3f5-4dbe-acaa-aca6cf1c05e8,approved,approved,2,0.9,379c2d51-1091-456c-a5cd-95b1f99d8136,"נושא חישוב השטחים לצורך היתר בנייה הינו עניין שבין מבקש ההיתר לבין הרשות המאשרת, ואינו מקים לעוררים עילת ערר עצמאית בגין פערים שאינם נוגעים להם במישרין."
|
||||
1128-08-20,a5330837-e244-4e21-913a-09294c154e0d,approved,rejected,0,0.0,5ed287c8-e12b-4022-ad37-612da757bbf6,"הוצאת היתר בניה הינה עניין שבין האזרח לרשות ולא בין האזרח לשכנו; עקרון זה (הלכת אגרא-רמא) מהווה נקודת מוצא לבחינת זכות העמידה של שכן בהליכי הוצאת היתר, ורק חריג"
|
||||
1128-08-20,a34e6221-8b14-45a6-a7fc-28a5fd2cf771,approved,rejected,3,0.7267,00cd6a86-bcf6-44bf-b444-17ba6a592168,"בדיקת חישוב השטחים הינה עניין שבין הרשות לאזרח, ויש לצמצם את האפשרות של השכן להתערב בנושא זה. אמנם מתנגד רשאי לתקוף בגדר התנגדותו את אופן חישוב השטחים, אך בנושא"
|
||||
1128-08-20,d6dd6d99-6f45-467a-b868-f301206eedae,approved,rejected,1,0.8,a8b1836f-e0c5-493f-b4bf-8a51aab0450c,"שטחים ציבוריים סטטוטוריים אינם 'על הנייר' בלבד — הרשות המקומית מחויבת בפיתוחם, ומבני ציבור שנבנו בפועל (בתי ספר, גני ילדים, בתי כנסת, שצ""פים מפותחים) נלקחים בחש"
|
||||
8181-21,02623bb9-efe9-49b7-879b-d9ba5fc49262,approved,approved,2,0.9,55e5c42f-8e4d-4d34-afb6-5b296875aff2,"לעניין הפטור מהיטל השבחה לפי סעיף 19(ב)(4) לתוספת השלישית, יש לפרש את המונח ""או"" שבסיפת הסעיף (""המקרקעין או התמורה בעדם"") כמכוון לתנאים חלופיים ולא מצטברים, כך "
|
||||
8181-21,b48af425-c9f2-4fe9-8e06-783d72c7ede8,pending_review,rejected,2,0.875,a596e864-876f-440b-8215-d09e9a1e4f4a,"קביעת תנאים ייחודיים בתוכנית — מעבר לתנאים החלים על שימוש מאותו סוג במתחמים אחרים — מלמדת על ייעוד מיוחד ומובחן של המקרקעין, ויש בה כדי לדחות טענה כי המתחם זהה "
|
||||
8181-21,97c96844-2ab4-41cb-a668-aabb910cd85f,pending_review,rejected,2,0.875,d9dcbea4-76f4-4eb1-8012-85fbd84838e2,"אי-חיוב בהיטל השבחה בעבר בגין פעולה דומה אינו מהווה ראיה לכך שלא חלה השבחה, מקום שאי-החיוב לא נבע מבחינה פוזיטיבית של שאלת ההשבחה אלא מעמדה שלפיה תנאי ההשבחה כל"
|
||||
8181-21,cd62e036-290f-442c-8dcd-5a4bba441669,pending_review,approved,2,0.9,7e76def9-142b-4027-81d9-9bd04a30a4ad,"המבחן לפטור מהיטל השבחה בגין שימוש בעל אופי ציבורי הוא קיומה של זיקה בין הפעילות המסחרית-כלכלית לבין פעילותו של הגוף הזכאי לפטור; משנשמרת זיקה זו, אופיו הרווחי "
|
||||
8181-21,9ad6dfea-c540-4ae3-a4ff-e373f34674dc,pending_review,rejected,2,0.85,2522e80a-d953-46c9-8d66-067c8d6df1c2,"אין לקבל ניסיון של בעל דין להבחין בין תקדים החל עליו לבין המקרה הנדון, מקום שההבחנה נשענת על טענה העומדת בסתירה לעמדה שאותו בעל דין עצמו טען בהליך הקודם."
|
||||
8181-21,63e3ef5b-60b1-4699-9653-1ed1bda85e30,approved,approved,2,0.9,9fead3fd-8bfb-453d-a700-48adab7846bb,"תיקון 53 לחוק התכנון והבנייה הוסיף את חלופת התמורה בעד המקרקעין, ותכליתו הייתה להרחיב את הפטור ממוסד ציבורי גם למימוש בדרך של מכר; אולם התיקון לא שינה את הדרישה"
|
||||
8181-21,e07fe79b-eda5-4cf7-a21c-d22e3de13f37,pending_review,rejected,0,0.0,fc95fbb4-3785-4d31-b7c2-aad931ac11b2,"המועד הקובע להענקת פטור מהיטל השבחה הוא מועד כניסת התוכנית המשביחה לתוקף, ולא מועד המימוש; ומכאן שהדין החל על הפטור נקבע לפי הדין שהיה בתוקף במועד התוכנית."
|
||||
8181-21,ecae5f8e-cf71-4da0-9e39-eca6ded33cbf,approved,approved,2,0.9,4d79742a-603f-4c85-b718-2ff343e6da53,"אף אם לא נגבה היטל ההשבחה במועד המימוש הראשון, אין הוועדה המקומית מוסמכת להימנע מגבייתו במועד מימוש מאוחר יותר; היעדר גבייה במועד אינו מקים מניעות כלפי הנישום."
|
||||
8181-21,a2abd395-c6d2-4e59-8393-1012c9a4612e,approved,rejected,1,0.9,1335ad47-1eaf-47b4-aa75-2de0a29dd49d,טענת הסתמכות אינה מתקבלת מקום שהיא נסמכת על סברתו של הנישום בלבד ולא על עמדה או מצג שהציגה לו הרשות; יסוד ההסתמכות מחייב מצג מטעם הרשות.
|
||||
8181-21,253949ff-6371-42db-9a8a-38ec8045856a,approved,rejected,0,0.0,32346580-8a01-4db4-b9d7-ca209c18912b,הוראות הפטור מהיטל השבחה יש לפרש בצמצום ובהתאם לתכליותיהן.
|
||||
8181-21,641a4472-1475-408f-b837-acbcccc480a6,pending_review,rejected,2,0.875,278f8454-e9f5-4a99-9bee-351b913f176b,"לצורך הפטור לפי סעיף 19(ב)(4) לתוספת השלישית, בעת מימוש במכר נדרש כי המקרקעין יהיו מיועדים למטרות המוסד עצמו; ייעוד למטרה אחרת (כגון הקמת אזור תעסוקה) אינו מקיי"
|
||||
8181-21,9a0b326d-308e-4a29-b6fe-f0e3dab11aa6,pending_review,approved,2,0.9,61c60a65-3bc4-40cd-8cb4-4279f8673b4f,סוגיות שמאיות — לרבות השאלה אם תכנית היא תכנית פוגעת המצדיקה התחשבות בירידת ערך — אינן מוכרעות על ידי ועדת הערר עצמה אלא ראוי להפנותן לשמאי מייעץ.
|
||||
8181-21,b77b63a2-6d26-4d4b-862e-56461c09bd0f,approved,rejected,2,0.875,ebe9ffc5-ec1b-4b49-a41d-fc007c7ed9be,"תכלית הפטור ממוסד ציבורי מהיטל השבחה היא לסייע למוסד להקים מבנים המשמשים באופן ישיר את צרכי המוסד ומטרותיו, ולא נועדה לאפשר למוסד להשקיע במקרקעין לשם ביצוע פעול"
|
||||
8181-21,707bdc10-c69f-4fdb-9232-fed6cde056e6,pending_review,rejected,2,0.825,ea07b7a9-4b73-4c98-a754-fef4134d658f,"קביעה שמאית שלפיה אישור שימוש חורג אינו יוצר השבחה שונה במהותה ממתן פטור מהיטל השבחה: הראשונה היא הכרעה ערכית-שמאית בדבר היעדר השבחה, ואין בה כדי להוות פטור או "
|
||||
8181-21,f839175f-3aa1-4722-9d5d-610c13292a98,pending_review,rejected,2,0.875,a35a9e72-114f-4475-ba23-421b40166692,מגבלות תכנוניות מחייבות — כגון הגבלת השימוש וחיוב זיקה למוסד ואיסור ייצור סדרתי — הן גורם רלוונטי המבחין בין תכנית המצדיקה פטור מוסדי לבין תכנית שאינה מצדיקה או
|
||||
8181-21,92a406bf-4fbf-4387-a549-3f2cc7d092c1,pending_review,rejected,2,0.9,15d54ad5-aea2-401e-b24d-f4e814af67fb,"כאשר זכויות במקרקעין מעוגנות בחוזים מפורשים, יש לפרשן על פי לשונם; וכדי לקבוע מצב זכויות השונה מן העולה מלשון החוזים המפורשים נדרש להצביע על טעמים כבדי משקל. אי"
|
||||
8181-21,b3828ee5-f71f-4c9e-8cba-ad9a2e77e366,pending_review,rejected,1,0.85,04fce031-2208-4690-8e9e-810b5f205645,"אזכור בהסכם כי בעבר שולמו דמי חכירה אינו יוצר זכות מהותית במקרקעין 'יש מאין', מקום שבו תנאי חוזי החכירה המפורשים קובעים אחרת לעניין היקף הזכויות."
|
||||
8181-21,55ca75c1-17b8-4aef-816f-02e9005a0696,pending_review,rejected,2,0.85,4c1bb7db-63d2-437a-af65-141987e3c384,"טענה כנגד מתן זכות עתידית ללא הליך מכרז מהווה טענה נגד תקינות ההסכם שמכוחו הוקנתה הזכות, ואין בה כשלעצמה כדי ללמד על עצם קיומה של זכות חכירה."
|
||||
8181-21,0867191a-9a9c-4bc5-8c79-bd2b7e4257b1,pending_review,rejected,2,0.85,2044a1cc-ab8e-4d0e-80a5-17d88f7357e5,"מעמד של בעל 'הסכם פיתוח' אינו ניתן לקביעה במשתמע מקום שאין לו כל זכר בהסכמים שנכרתו בעניין המקרקעין; כדי לראות בהתקשרות משום הסכם פיתוח כמשמעותו בע""א 7084/13 בר"
|
||||
8181-21,fec6be9b-f6e4-40a5-b6fe-81ed076b9fc9,pending_review,rejected,2,0.85,6c954a34-02dc-4c96-9a12-f35c356507f0,"מקום שבו בעל מקרקעין טוען כי במועד הקובע לא היו לו זכויות במקרקעין, מוטל על המבקש לקבוע אחרת הנטל להביא הוכחות חד-משמעיות הסותרות עמדה זו."
|
||||
8181-21,a2dfb0a8-69a7-402a-97fa-c77c7f6f726b,approved,rejected,3,0.8067,159b0ece-6ad1-4a05-863e-cdbfdc78421b,ועדת הערר מוסמכת לדון במשמעות זכויותיו של נישום במקרקעין לעניין חבותו בהיטל השבחה כאשר אין מחלוקת על מהות הזכויות; אך אין בסמכותה לקבוע כי לאדם קיימות זכויות שב
|
||||
8181-21,92df933f-5075-4a95-8571-c39262a77af4,pending_review,rejected,2,0.9,36f08e93-6199-4b9e-8fc4-a2a0195a5385,חבות בהיטל השבחה מותנית בהיותו של הנישום בעל זכויות במקרקעין המקימות את החבות במועד הקובע; בהיעדר זכויות כאמור במועד הקובע — לא קמה חבות והשומה מבוטלת.
|
||||
8181-21,5f3a4419-58ab-4340-a365-767682b24052,pending_review,rejected,3,0.8067,6aac63fc-00da-4675-9631-e925ac12b6d4,"ועדה מקומית רשאית לחייב בהיטל השבחה רק מקום שעל פי התוספת השלישית היא בעלת הזכויות בהיטל, ונטל הבירור מיהו בעל הזכויות במועד הקובע — ועל איזה מסד עובדתי — מוטל "
|
||||
8181-21,a4ae69e8-17ee-4477-9758-4e4ecde5a487,approved,rejected,2,0.9,37ca3f6c-17b3-4981-b916-2594e32535db,"סוגיית חלף היטל השבחה אינה מתבררת במסגרת הערר על שומת היטל ההשבחה, אלא יש לבררה מול רשות מקרקעי ישראל בהליכים המתאימים לכך."
|
||||
1096-24,fae03c03-ee88-4b27-be24-7444aaab6e47,pending_review,rejected,3,0.8067,1edebb5e-cbf3-4ddc-9efc-e96b7e2d5684,"נספח התנועה של תכנית הוא נספח רקע (בהתאם לנוהל מבא""ת), ואינו גובר על הוראות התכנית הברורות; כאשר נוצרת אי-התאמה בין נספח הרקע להוראות התכנית, גוברות הוראות התכנ"
|
||||
1096-24,c8670420-c55b-43d3-a9fc-a2b5ca73f283,pending_review,approved,2,0.9,8d9b563b-163a-41bb-9ddf-d863dac8ae37,"נספח התנועה אינו מסמך מחייב ואינו גובר על הוראות התכנית המחייבות; במקום של סתירה או אי-התאמה, הוראות התכנית המחייבות הן הקובעות."
|
||||
1096-24,3fd9284f-d260-45af-b388-f8e7dc1febaf,pending_review,rejected,2,0.825,0946ecf8-f146-40ec-92b7-a2f5a12e170d,"כאשר התכנית קובעת כי תקן החניה יהיה לפי התקן הארצי התקף במועד הגשת היתר הבניה ואינה מאשרת הפחתה ממנו, מתן הפתרון הקונקרטי למקומות החניה רשאי להידחות לשלב הרישוי"
|
||||
1096-24,e2b27c81-bb99-4c52-93a2-8626f1fdfc5d,pending_review,rejected,0,0.0,0af22d0e-2535-490a-b011-7376344c1815,קביעת הוראה בתכנית לפיה פתרון החניה לשימושים המוצעים ייקבע בהתאם לתקן החניה הארצי התקף במועד הגשת בקשת ההיתר מצויה בגדר סמכותה של ועדת התכנון. תקנות החניה חלות
|
||||
1096-24,04056caf-3b70-4881-871a-10a7dc0b3be1,pending_review,approved,2,0.9,3a03c5e1-f139-4b33-a53f-d31de9ce30da,השימוש במנגנון קרן חניה לצורך מתן מענה לדרישת החניה אינו מותנה בקיומה של תכנית עירונית לחניה. אופן מתן המענה לחניה — בין באמצעות קרן חניה ובין במנגנונים אחרים כ
|
||||
1096-24,e22c3293-bd20-4542-adbf-52bdfeab223f,approved,approved,2,0.9,802dfd67-afee-43f4-a2f9-be6beee67b1b,טענות המכוונות במהותן כנגד הוראותיה של תכנית תקפה אינן יכולות להיות מועלות במסגרת ערר על היתר בנייה; ערכאת הערר על ההיתר אינה המסגרת לתקיפת התכנון שאושר על ידי
|
||||
1096-24,0c46b5bc-3556-4bb5-a61f-1ce75204b154,pending_review,approved,2,0.9,5c8b9c49-74f7-433e-b679-0892cd72bf0a,"אין להעלות טענות חדשות בשלב מתקדם של ההליך, אלא במקרים חריגים ובכפוף לקבלת רשות מפורשת; טענה שלא נכללה בכתב הערר ונטענה לראשונה בתגובה שהוגשה ללא רשות אינה עומד"
|
||||
1096-24,cabb814e-6f43-403c-a07b-40fa8610497e,pending_review,rejected,1,0.9,c63a32b7-04da-4dbf-b772-2c4309abd00c,"ועדת הערר אינה הפורום המוסמך לבירור טענות כנגד תוקפה של תכנית או תיקון לתכנית, לרבות פגמים בהליכי האישור והפרסום; תקיפת תוקף התכנית נעשית בדרך של הגשת עתירה מינ"
|
||||
1096-24,9d7d7f9b-30f2-453d-ab3f-f9bc799995f4,pending_review,rejected,3,0.8567,c03b933b-517a-4526-b263-25b6e9aeda37,"כאשר ניתן היתר בנייה ללא שהתקיים הליך פרסום ושמיעת התנגדויות, חלה על הגשת הערר תקופת 30 הימים הקבועה בסעיף 152 לחוק התכנון והבניה, אך מנייתה תיעשה מהיום בו נודע"
|
||||
1096-24,af03806e-abf7-4488-bcc9-3975671e56bb,pending_review,rejected,2,0.825,ba28b38a-1e15-471d-93b3-2b8410154b1f,"עורר המגיש ערר במצב בו לא הייתה לו זכות קנויה וברורה להגשתו — נדרש לפעול בזריזות, שלא להתעכב ובוודאי שלא להמתין ליום האחרון של תקופת ההגשה, בעיקר מקום בו הוא מב"
|
||||
1096-24,7e75638d-459e-453c-8dfd-2576905f319d,approved,approved,2,0.9,e8246f4a-1bc5-4853-b407-93eb9750823d,"ועדת הערר היא ""מוסד תכנון"" בעל סמכות מקורית, ולא ערכאת ביקורת שיפוטית בלבד; ככזו היא רשאית להפעיל שיקול דעת תכנוני עצמאי ולהמיר את שיקול דעתה תחת זה של הוועדה ה"
|
||||
1096-24,04fce89e-3812-46f7-a7c0-e4e1700481e8,approved,rejected,2,0.9,b557d6df-051c-42a7-897e-c128b4f590f7,"דרך המלך לתקוף החלטה של ועדה מקומית או רשות רישוי מקומית ליתן היתר בנייה, כאשר עולה טענה של סטייה מתכנית, היא בהגשת ערר לועדת הערר; זאת להבדיל ממחלוקות בשאלות ק"
|
||||
1096-24,82fc8496-6b25-46cf-b844-cff1321d5a84,approved,rejected,2,0.9,3c5a625a-6cf5-40ac-8351-b2879ab62f59,"סמכות ועדת הערר לבחון טענת סטייה מתכנית חלה גם על בחינה תכנונית של חוקיות היתר שכבר ניתן ושל בנייה קיימת שבוצעה לפיו, ולא רק על היתר טרם הוצאתו."
|
||||
1096-24,9328dffc-056d-48e6-a1c0-fa5c676c6b46,pending_review,rejected,1,0.9,066ba4d7-39c1-41cb-bc7f-ecbf34d12fd3,"בבחינת ערר על היתר בנייה בעילה של סטייה מתכנית, מקום שנמצא כי ההיתר תואם את התכנית החלה על המקרקעין — מסתיימת בכך בחינת ועדת הערר; רק אם נמצאת אי-התאמה תיבחן הש"
|
||||
1096-24,06956ac2-cf43-42a4-b516-bd4681d2fc44,approved,rejected,2,0.9,37db79a0-cb86-46aa-9923-4e59ca66203c,מוסד תכנון אינו רשאי לאשר המרת התקנתם בפועל של מקומות חניה בתשלום דמי השתתפות (כופר חניה) אלא אם הוקמה קרן חניה מיוחדת המיועדת להקמת חניון ציבורי; בהיעדר קרן כא
|
||||
1096-24,371778e3-3081-463e-ad00-fb42c0e1aac3,pending_review,rejected,2,0.9,093f3de8-d65f-4c83-9ace-192ccf2b4815,"לאחר תיקון תקנות החניה משנת 2016, תכנית מתאר מקומית מוסמכת לקבוע אך ורק מספר מקומות חניה שונה מן הקבוע בתוספת לתקנות, ואינה רשאית עוד לשנות מיתר ההוראות שבתוספת"
|
||||
1096-24,0af19b16-3af1-4b64-9749-a4f2bf756743,pending_review,rejected,2,0.9,bfe64526-a733-46ae-aef2-8dc8adeba62e,"החלטה המעניקה פטור מהתקנת מקומות חניה חייבת להתבסס על שיקולים תכנוניים, תחבורתיים וסביבתיים מנומקים בעלי אחיזה בלשון תקנות החניה ובתכליתן; שיקולים זרים שאין להם"
|
||||
1096-24,1ef250a8-64ba-401d-9b90-ffae65e21bf8,pending_review,rejected,2,0.875,a5cfa33c-b75d-4bf5-bdbb-cdfdc8ce492b,פתרון חניה באמצעות קרן חניה חייב להישען על חוות דעת שמאית סדורה הקובעת את שווי מקום החניה לפי מתודה שמאית מובנית; בהיעדר שמאית כאמור אין בסיס לשווי הפתרון שאומץ
|
||||
1096-24,a2df08e1-6f8c-44e9-b350-3be9d9eb0ccd,pending_review,rejected,3,0.7733,6378c88c-9edb-4dbd-89fa-eb0adb420ff7,"הסתמכות היזם אינה כשלעצמה זהה לטובת הציבור, ועל כן אין בה כדי להצדיק לבדה אימוץ פתרון חניה מסוים."
|
||||
1096-24,d9899639-0c7a-4893-9175-ea6c0cdc3032,pending_review,rejected,3,0.79,6750e261-4109-4682-a43b-eed6b4d269a7,"כאשר פתרון החניה נשען על שימוש במקומות חניה בחניון ציבורי, על מוסד התכנון לבחון את ההשלכות כלפי הציבור — למי מיועד החניון, אלו שימושים וצרכים הוא משרת ומה משמעו"
|
||||
1096-24,1f882035-bb26-49bf-abe5-fe476d09c0a6,pending_review,rejected,2,0.875,e7e6466f-4516-4c62-b1e9-17297d01f12b,"ועדת הערר תימנע מלהמיר את שיקול דעתו של מוסד התכנון בשיקול דעתה שלה בסוגיות מקצועיות-תכנוניות, מקום שבפני מוסד התכנון עומדת מלוא התמונה העובדתית והמקצועית — לרב"
|
||||
1096-24,80264f89-98e8-4a42-98d5-4be696024b1e,pending_review,rejected,3,0.8067,cbc9512d-3272-4b61-b5b7-3efc1b16478a,"מקום שבו לרשות הרישוי לא הייתה מלכתחילה סמכות לדון בנושא מסוים, ועדת הערר מנועה מלרפא את הפגם בדרך של אישור ההיתר דה נובו, והפתרון הנכון הוא החזרת הדיון לוועדה "
|
||||
1096-24,483cc19d-1e3d-45e5-bd2e-de341661bb32,pending_review,rejected,2,0.9,7949640e-0908-4471-a1b6-130affd511a6,הסכמות בין יזם לרשות המקומית מצויות מחוץ לתקנות החניה ואינן באות חלף השיקולים המקצועיים-התכנוניים הנדרשים והמפורטים בתקנות החניה; אין בהן כדי לאיין את החובה להס
|
||||
1096-24,9bb9b1cf-10a5-4193-8aac-8fa53fd6c602,pending_review,rejected,2,0.9,7fe7b803-a7da-470f-8255-b2452e015de9,רשות הרישוי אינה מוסמכת לפטור מן החובה להתקין מקומות חניה שלא בהתאם לנדרש בתקנות החניה; החלטת פטור החורגת ממסגרת התקנות אינה החלטה התואמת אותן ואין לקבלה.
|
||||
59770-02-25,d908909d-4049-4be8-bf93-1cfc22192a0b,pending_review,approved,3,0.9333,5b770025-f688-4bf3-ba32-ade71b6408af,"התפקיד והסמכות לעסוק בתכנון מסורים לרשויות התכנון בעלות הכלים והידע המקצועי, ובית המשפט אינו משמש כמוסד תכנון או כמוסד תכנון-על ואינו מעמיד את שיקול דעתו תחת שי"
|
||||
59770-02-25,60ad25d8-0dfe-4d5f-9471-5677ba944bd9,pending_review,approved,3,0.9333,3d2ccc72-bd91-4239-952d-e9ffaaa4029f,בית המשפט לעניינים מנהליים אינו משמש ערכאת ערעור על החלטות הרשות המנהלית ואינו נכנס בנעליה או מחליף את שיקול דעתה בשיקול דעתו; התערבות שיפוטית בשיקול הדעת המנהל
|
||||
59770-02-25,7980b37d-505e-4cdb-83ed-3005a74b5c90,pending_review,rejected,3,0.8733,dd012839-86e7-4839-9d78-c6f361bc4348,"התקיפה המנהלית של החלטות ועדות התכנון מצומצמת במיוחד, משום שהתפקיד והסמכות לעסוק בתכנון מסורים לרשויות התכנון המחזיקות בכלים ובידע המקצועי הנדרשים."
|
||||
59770-02-25,cee666fa-21dc-4a18-ba50-e5f891ed39c2,pending_review,approved,3,0.9,46c284a9-45f0-481e-9c1c-212c38926d0e,"פרסום תכנית בניין עיר ברשומות יוצר 'מעשה עשוי'; כל עוד לא התבקש וניתן צו ביניים המעכב את כניסת התכנית לתוקף, יתערב בית המשפט בתכנית שאושרה ופורסמה רק מטעמים כבד"
|
||||
59770-02-25,e2964eef-ce54-4708-8245-90ce4159a99c,pending_review,rejected,3,0.8733,277dd71e-723a-4393-b217-1562409c9cde,"הסדרי חניה, כניסה ויציאה והקצאת שטחי ציבור בתכנית מצויים בליבת שיקול הדעת התכנוני של הוועדה המחוזית, ובית המשפט לעניינים מנהליים לא יתערב בהם אלא אם נפל בהפעלת "
|
||||
59770-02-25,ea341a3b-8949-460b-9e6b-b44dff41de35,pending_review,rejected,3,0.8867,b2414741-372b-40f6-8816-0d444837eeaa,"תכנית שאושרה ופורסמה למתן תוקף דינה כדין, ובית המשפט יתערב לבטלה רק במקרים מיוחדים וחריגים המצדיקים זאת במכלול השיקולים והאיזונים, בין היתר משום שעם פרסומה הופכ"
|
||||
59770-02-25,26278beb-3c34-4f3a-81c1-573ac8c624b7,pending_review,rejected,3,0.8833,d59f3a35-ccd7-409f-925f-f204d2a37f06,משפורסמה תכנית למתן תוקף היא הופכת לנחלת הכלל וצדדים להליך וצדדי ג' רשאים להסתמך עליה; על כן בית המשפט יתערב לבטל תכנית חרף פרסומה רק מקום שבו הפגם מובהק ובעל ה
|
||||
59770-02-25,6245e3d2-2e70-4f60-8e89-8c2eb9729e0b,pending_review,rejected,3,0.8733,8e806a5d-7dda-49ee-b52b-2d2c15f58438,"רשות תכנון אינה מוסמכת לעכב או להתנות קידום תכנית בנייה לשם כפיית תכנון משותף עם בעלים נוספים במקרקעין, מקום שתקנון הבית המשותף מקנה ליזם זכות לבנות בתא השטח שב"
|
||||
59770-02-25,53b73b5d-19df-4b2e-9999-2d4fc297436e,pending_review,rejected,3,0.8833,29b7f49e-d040-4468-bf41-c12280262912,"כלל המעשה העשוי, השולל ככלל התערבות שיפוטית בתכנית שאושרה ופורסמה, אינו כלל נוקשה ונתון לחריגים שבהם רשאי בית המשפט להתערב; פגיעה חמורה ושלא כדין בזכות הקניין נ"
|
||||
59770-02-25,df2f72bb-9eee-4844-8107-5835d14815af,pending_review,rejected,3,0.8733,35731d48-a11a-43ee-ae2d-4de968e2ae4f,"זכאותו של בעל דירה או יזם בבית משותף להגיש תכנית בניה תלויה בסיווגו המשפטי של הבית — ובכלל זה בשאלה אם הבית המשותף הרשום מהווה ""בית מורכב"" כמשמעות מונח זה בחוק "
|
||||
59770-02-25,650237da-8c4e-43e1-9bae-9d190528ed56,pending_review,rejected,3,0.8933,08c103dc-5a10-41d4-a561-72c3bf37eef1,ניסיונות קודמים שנכשלו לשתף בעלי זכויות נוספים בקרקע בקידום תכנית אינם משפיעים על שאלת חוקיות קידום התכנית ואישורה בידי מוסד התכנון; חוקיות ההליך התכנוני נבחנת
|
||||
59770-02-25,c0dda6a8-3561-4c0e-b3e4-437ea8c2b4e6,pending_review,rejected,3,0.84,3e8d180f-f2c7-4abb-8b37-37f1a1003a6d,"בפרשנות תקנות התכנון והבניה (הגשת תכנית בבית משותף) יש לקרוא את סעיף 1, שהוא סעיף ההגדרות, כמשרת את פירושו של סעיף 2, שהוא הסעיף האופרטיבי הקובע מי רשאי להגיש ת"
|
||||
59770-02-25,10b77f80-a803-41d4-8162-47f45268f264,pending_review,rejected,3,0.8833,1af1455c-5c75-4334-b334-b7268a5dd58e,"מקום שבו בית משותף מהווה ""בית מורכב"" כמשמעותו בסעיף 59 לחוק המקרקעין, ותכנית כוללת הרחבה או הריסה במבנה או אגף אחד בלבד, רואים אותו מבנה או אגף כבית משותף נפרד "
|
||||
59770-02-25,89cb9448-adac-4557-a958-1f92410f86db,pending_review,rejected,3,0.8767,040f2b1d-4de2-4101-ba21-86b5346dee64,"תכנית בנייה שאינה דורשת אלא את הסכמת יזמת התכנית, ועומדת בדרישות ההסכמה להגשתה, אינה כשרה לאישור אך מכוח כך; עליה לעמוד בנוסף בדרישה כי אין בה משום ""פגיעה"" כהגד"
|
||||
59770-02-25,a4513baa-797a-44ac-bc8c-201b8a775392,pending_review,rejected,3,0.8833,7e5ba117-f5d0-4a41-bffe-bf2e9a8a6045,"כאשר הרחבה במבנה היא מסוג תוספת דירה, נדרשת הסכמת בעלי 60% מהדירות, אך ה'בית המשותף' שעליו חלה דרישת הרוב הוא המבנה המסוים שעליו חלה התכנית בלבד, ולא המתחם כולו"
|
||||
59770-02-25,c97da6cc-41f9-4a38-8adb-276ae2c6603c,approved,approved,3,0.9,0728ef57-93a7-411f-96cd-9c6a517f9a92,"מוסדות התכנון אינם מכריעים בשאלות קנייניות לגופן אלא פועלים על יסוד תשתית קניינית נתונה ומובהקת; כאשר קיימת מחלוקת קניינית מהותית הדרושה הכרעה, או כאשר למבקש הה"
|
||||
59770-02-25,62bdcd38-1ccf-495e-b4bb-9807c1ccc3fc,pending_review,approved,3,0.9333,aa4e0c2f-5a00-4628-8617-976b1ebec2b7,"סמכותם של מוסדות התכנון מוגבלת לדיון בשאלות תכנוניות בלבד, ואין הם מוסמכים לדון או להכריע בשאלות קנייניות; עליהם לפעול על יסוד תשתית קניינית נתונה וברורה, מאחר "
|
||||
59770-02-25,341c45ed-15dd-469a-a457-c6faa5a75921,pending_review,rejected,3,0.8833,cd522675-1bae-46af-9f67-d181fbd5db63,"כאשר בקשת היתר נעדרת תימוכין קנייניים, ובפרט כאשר מדובר בבנייה ברכוש משותף וניצול זכויות בנייה העלולים לפגוע בזכויות שותף אחר, רשאים מוסדות התכנון לעכב את הדיון"
|
||||
59770-02-25,cbf0d1b2-f51e-4b24-a45e-de94aeb8c7da,approved,rejected,3,0.88,1b56a508-891e-4dc0-b877-a48f8a227591,"התקנות הקובעות תנאים להגשת תכנית בבית משותף, ובכללן הדרישה שלא תהיה ""פגיעה"" כהגדרתה בתקנה 1, אינן מהוות הסדר שלילי ביחס לפגיעה בזכות קניינית שאינה נכנסת בגדר או"
|
||||
59770-02-25,c49bd67a-7418-44f1-b6b7-8e7da9e2ca3c,pending_review,rejected,3,0.8833,c09c1a86-dcfb-4b2f-818b-94177443ac1f,"מונח ""פגיעה"" שבתקנות בעניין הגשת תכנית בבית משותף מתפרש בצמצום, כמתייחס לפגיעה פיזית ישירה וממשית בדירה או ברכוש משותף שהוצמד לה, או למניעת מעבר/גישה, או להפקעת"
|
||||
59770-02-25,0f6282c1-4a43-4b55-b3e4-93feece715e6,pending_review,rejected,3,0.8833,8595df12-92bd-4e71-a127-3acf3cb00ae8,"כאשר תכנית פוגעת בזכויות קנייניות שמעבר להגדרת ""פגיעה"" בתקנות, אין לוועדה המחוזית סמכות להכריע במחלוקות קנייניות הכרוכות בכך."
|
||||
59770-02-25,00d20a35-bd21-4191-9bf6-856716160cdf,approved,rejected,3,0.8733,57ae939c-9a80-4e14-9f3e-2f97e5f660a9,"תכנית המנצלת את מלוא זכויות הבניה (לרבות לצורכי מסחר) על פני כלל המקרקעין המשותפים מעבר לחלקו היחסי של יזם התכנית ברכוש המשותף, נעדרת תימוכין קנייניים, ואין לאש"
|
||||
59770-02-25,a8e53c41-cd45-43dc-9c41-92fb73ea45da,pending_review,rejected,3,0.8733,15d6879c-aed5-4db1-8b7a-54738e5585b3,"כאשר תכנית עלולה לפגוע בזכויות הבניה של בעל זכות במקרקעין, ואין מובהקות קניינית כי הזכויות שמבקשת יזמת התכנית לנצל נתונות בידיה, על מוסדות התכנון לעצור את הליכי"
|
||||
59770-02-25,cf164b67-b973-40ee-826f-ce5c6aafd936,approved,rejected,3,0.9,adb67e4d-348e-4c07-bc2e-eef98fdc6874,"בתכנית שאינה תכנית איחוד וחלוקה, המקרקעין נותרים מבחינה קניינית יחידה אחת והפיצול הוא לצורכי תכנון ובניה בלבד; לפיכך זכויות הבניה החלות על המקרקעין משותפות לכלל"
|
||||
46111-12-22,56265541-0e23-449c-8b5a-cae6124481fa,pending_review,rejected,3,0.8433,b9e13d9e-3516-41f6-9179-ce2e22fb10f9,"כאשר קיימת מחלוקת פרשנית או ספק בדבר ייעודם התכנוני של מקרקעין, יש להעדיף את הפרשנות המקלה עם בעל הזכות הקניינית במקרקעין."
|
||||
46111-12-22,796f13fa-63d1-42c9-82ec-f5b1f006e3c5,pending_review,rejected,3,0.8733,142a522d-c04a-418f-bab5-40adb014dee0,"מקום שתכנית מיתאר קובעת במפורש, מכוח סעיף 129 לחוק התכנון והבניה, רשימה של תכניות מפורטות קודמות שכוחן יפה עליה — תכנית מפורטת קודמת שלא נכללה באותה רשימה כפופה"
|
||||
46111-12-22,ed412782-3fbe-406e-b114-e2e22374fde6,pending_review,approved,3,0.9,3fe8cba3-a3a4-4b81-bf2e-08ad1f6a4296,"תכנית מאוחרת הקובעת הוראת עדיפות למקרה של סתירה בין תכניות אינה מבטלת בכך את התכנית הקודמת; ההוראה חלה רק מקום שקיימת סתירה בפועל בין התכניות, ובהיעדר סתירה ממש"
|
||||
46111-12-22,ac048cb4-e950-4e59-b142-769121d59854,pending_review,rejected,3,0.8833,a63ad476-a4fe-44ad-8a82-b5b91bd314f7,"אין לייחס לתכנית מאוחרת כוונה לשנות באופן דרסטי ייעוד שנקבע בתכנית קודמת, אלא אם כן הדבר בא לידי ביטוי מפורש במטרות התכנית המאוחרת; בהיעדר ביטוי כזה, נסיבות ערי"
|
||||
46111-12-22,a8e84d54-6ed8-4975-bd33-a22776947194,approved,rejected,3,0.86,0d9ea493-3a9f-4c81-b22b-e6bf069844a4,"ניתוק שטח מגן לאומי מוכרז מהווה תכנית חדשה, ולגריעת השטח חלות הוראות חוק גנים לאומיים ושרשרת האישורים שהוא מחייב לגריעת שטח גן לאומי, וזאת מעבר לדרישה לאישור תכ"
|
||||
46111-12-22,962a256d-c07e-410d-8795-8466be90bf9f,pending_review,rejected,3,0.8833,924ba182-fdda-49f7-b9c5-3d2b92732d88,"אין הגדרה אחידה ל""שטח ציבורי פתוח"", והשימושים המותרים בו נקבעים אך ורק בתקנון התכנית הספציפית, בהתאם למאפייני השטח ולצורך הציבורי שנועד לשרת; אין ללמוד על השימו"
|
||||
46111-12-22,34d26bff-c86c-4eac-aee9-8dd36a894533,pending_review,rejected,3,0.8067,3b4cb7b4-5970-4d88-842f-7e7e72fffd39,"מכוח סעיף 5.1.1 לתמ""א 1 (פרק שטחים מוגנים), הפעולות והשימושים בשטח מוגן יוגבלו לשטח מצומצם ככל הניתן, ולפיכך אין להתיר שימושים בהיקפים מסחריים נרחבים בשטח כזה."
|
||||
46111-12-22,3dc3968a-a069-48d5-baa7-5984003c1341,pending_review,rejected,3,0.8733,e0c1ddd2-a2ec-46f5-bcbd-6cd26eb07e2a,"השימושים המותרים בקרקע שייעודה גן לאומי / שטח ציבורי פתוח הם אך אותם שימושים המגשימים את התכליות והמטרות של מכלול התכניות החלות על המתחם; ובכלל זה, שימושים המנו"
|
||||
46111-12-22,08caaa5f-e1e5-4f61-a538-011a1715d9f7,pending_review,rejected,3,0.8733,833d746e-0bc8-4bfb-942a-7b81a5bfb340,"עצם היותו של שימוש מותר על-פי תכנית אינו מקנה זכות לקיימו באופן בלתי מוגבל ובכל היקף שיתבקש; ההכרעה בדבר התאמת השימוש לתכנית נעשית בהתאם לנסיבות המקרה, בכפוף לת"
|
||||
46111-12-22,d9b38853-b3f5-4ed0-a2af-3b29e835c31f,pending_review,rejected,3,0.8733,00fa1718-9817-4383-9997-b024dfeb3607,"בחינת התאמתו של שימוש מבוקש להיתר נעשית לאור הקונטקסט התכנוני החוקי; שימוש שאינו נלווה לשימושים המותרים על-פי התכניות ואינו בא לשרת את תכליותיהן, ואשר משנה את א"
|
||||
46111-12-22,08be5b09-7df0-42c1-8803-29418043d71d,pending_review,rejected,3,0.8033,61e69eea-668b-486e-b8cc-1fb81b3d054f,"בבחינת היקף השימושים המבוקשים בהיתר בשטח ציבורי פתוח, ניתן להחיל על דרך ההיקש את השיקול המוכר מסוגיית השימוש החורג בדבר עצימות השימוש והיקפו; ככל שהשימוש המבוקש"
|
||||
46111-12-22,6009ce9c-7e4a-4986-943a-2e88301d739a,approved,rejected,3,0.89,1ffe4ced-f5ac-483e-913b-a4e73aeb5a8f,פרשנות הוראותיה של תוכנית חלה כפופה לגבולות הפרשנות הסבירה; אין למתוח את לשון התוכנית מעבר לגבולות אלה כדי לאפשר שימוש שאינו נכלל במטרותיה ובהוראותיה.
|
||||
46111-12-22,566ea72e-f8b1-45b7-a1b0-31c4dd6afc8e,approved,rejected,3,0.86,006e7a93-5739-448a-8e73-4befebfc178f,"לוועדה המחוזית נתונה סמכות לסרב לאשר בקשה להיתר בנייה בהתבסס על אי-התאמתה לתכנית החלה, בהתאם לשיקול דעתה; מקל וחומר כך כאשר הבקשה אינה תואמת את התכניות החלות על"
|
||||
46111-12-22,facc8c44-fd7c-406c-9e38-629767754226,approved,approved,3,0.8933,852326bf-3988-4d26-b485-3166c9135bc2,"ועדת התכנון אינה 'חותמת גומי' המאשרת אוטומטית כל בקשה התואמת תכנית; נתון לה שיקול דעת מצומצם ומתוחם לסרב לבקשה להיתר או להתנותה בתנאים, ובלבד שמתן היתר יתאפשר כ"
|
||||
46111-12-22,1e7d336c-433c-4c1f-8198-07b18deff7f2,approved,rejected,3,0.8867,a421386d-70ef-4d72-ab02-9dff14e6a4c9,"שינוי בנסיבות העובדתיות או הפיזיות הסובבות מקרקעין (כגון הקמת תשתיות תחבורה וחשמל בסביבה) עשוי להצדיק שינוי במישור התכנוני, אך אין בו כדי להוות בסיס להוצאת היתר"
|
||||
46111-12-22,58db7ace-dcab-4f06-a911-1ae4593c9912,pending_review,approved,3,0.91,6690d187-e280-4d05-8b12-0bc8d9ee222d,"הוועדה המחוזית ממוקמת מעל הוועדה המקומית בהיררכיה התכנונית ואינה משמשת חותמת גומי לה; היא רשאית ומחויבת להפעיל שיקול דעת תכנוני מהותי, לבחון דה-נובו את החלטות ה"
|
||||
46111-12-22,5cb9424f-caa9-4dee-bf9b-593a0c1b63e1,approved,rejected,3,0.89,9b94797d-b00a-41bd-a727-cee83b8e83fc,מסמך תכנוני המהווה תנאי מקדים להכנת תכניות מקומיות הוא מסמך מנחה בלבד; אין בכוחו לשנות את ייעודי הקרקע והוא אינו עולה כדי תכנית סטטוטורית. ייעודי הקרקע הסופיים
|
||||
46111-12-22,73c7c666-ea6d-4cf3-9faf-92c1983e35ac,pending_review,rejected,3,0.89,14e93a8e-4086-425a-94d6-e907318a6a48,אישור הוועדה המקומית לבקשה להיתר בנייה אינו מספיק כשנדרש על-פי דין אישורה או הסכמתה של הוועדה המחוזית; בהיעדר אישור הוועדה המחוזית ההיתר פגום.
|
||||
46111-12-22,670e43ef-ae18-4e5b-84c6-676170a6f7a4,approved,approved,3,0.9167,2a5ec272-b9ef-43bd-b810-9798750d0beb,"רשות מנהלית אינה כפופה, לעניין החלטותיה שלה, לכללי הסופיות ומעשה בית-דין, והיא רשאית לסטות מהחלטתה הקודמת על יסוד הערכה מחודשת של נתונים קיימים אף ללא שינוי בנס"
|
||||
46111-12-22,9ae182b1-5331-40cc-8882-567b26cdbe09,pending_review,rejected,3,0.8833,d2320b1b-d962-40cc-8dac-262d61465954,לאינטרס ההסתמכות משקל נמוך יחסית בתחום התכנון; אדם הרוכש מקרקעין לאחר שערך בדיקות מקיפות של המצב התכנוני אינו יכול לטעון כי הסתמכותו על המצב הקיים מהווה מחסום ב
|
||||
46111-12-22,f5aadca1-2d50-44ba-849d-450823e34674,approved,rejected,3,0.8733,64b8f8da-0f09-4256-ac3e-71fa1920bd9d,"מידת התערבותו של בית המשפט בהחלטת רשות תכנון בעניין הוספת שימושים מצומצמת ומוגבלת, בדומה למידת ההתערבות המצומצמת במיוחד החלה לגבי סירוב לבקשה להיתר לשימוש חורג,"
|
||||
46111-12-22,e1eab6be-cdb0-447f-862b-1c15dbacbb22,pending_review,rejected,3,0.8767,b78f104f-9127-4cd8-9d6d-86fc0398cddb,"נימוק תכנוני המבוסס על אפשרות עתידית שטרם התגבשה והתממשה הוא נימוק פסול, ואין רשות התכנון רשאית לבסס עליו את החלטתה."
|
||||
46111-12-22,dd868ba3-882c-4715-8a28-606d4e8765d0,approved,approved,3,0.9,5b3af139-4660-48bd-b86c-3e9e986be850,הביקורת השיפוטית על החלטות מקצועיות של רשויות התכנון נעשית במשורה ומוגבלת למצבים חריגים שבהם נפל פגם היורד לשורש ההחלטה המנהלית; בהיעדר פגם כזה לא יתערב בית המש
|
||||
1050-10-22,6ea909d1-f526-40db-9771-02b2298850a0,approved,approved,2,0.9,78f51655-b1c6-4e31-b3dc-5690fe4127eb,"מי שלא הגיש התנגדות לבקשה להיתר לפי סעיף 149(א) לחוק התכנון והבנייה אינו רשאי להגיש ערר על ההחלטה ליתן את ההיתר, מכוח חובת מיצוי ההליכים העולה מסעיף 152(א)(1) ל"
|
||||
1050-10-22,e13d1882-2dae-4e62-bb9d-b1a4692e2937,approved,rejected,3,0.8067,9bc8062d-74cd-49f6-b5b9-d052536160cf,"ועדת הערר המחוזית אינה דנה כערכאה ראשונה בטענות שמקומן בשלב ההתנגדות; היא בוחנת את החלטת הוועדה המקומית על יסוד ההתנגדויות שכבר הועלו בפניה, ולפיכך טענות חדשות "
|
||||
1050-10-22,7c7233bd-d5c1-425b-b241-245b9db474ad,pending_review,rejected,1,0.9,0e7b9aad-a081-4c91-a2c7-271b0dbbf251,"בתיקון 3א לתמ""א 38, חישוב הזכויות במסלול הריסה ובנייה מחדש מבוסס ככלל על היקף תוספת הבנייה שניתן היה לאשר לבניין במסלול החיזוק, בתוספת זכויות בנייה שטרם מומשו מ"
|
||||
1050-10-22,c0f5c027-3406-4483-b9f0-4d6a6e7a8a19,approved,rejected,1,0.9,f956821c-53cd-4690-b7fa-07a56d0a08ff,"מקום שתוכנית מקומית אינה קובעת בעצמה את מספר הקומות אלא מפנה לעניין זה לתמ""א 38, מספר הקומות נקבע לפי תמ""א 38, ואין בכך משום סתירה לתוכנית כוללנית הקובעת מגבלת "
|
||||
1050-10-22,dc45918b-6efe-4c36-817d-260b33eb32b2,pending_review,approved,2,0.9,77557a34-efaf-4cef-ae06-83b257c73c4a,"הוראת ""גמישות להיתר"" בתוכנית, הקובעת כי אין בתוכנית כדי לשלול את סמכות הוועדה המקומית לסרב למתן היתר לפי סעיף 22 לתמ""א 38, משמרת את שיקול הדעת של הוועדה המקומית"
|
||||
1050-10-22,92b75d7f-46bc-4ee8-9d4c-cf984a2a18f5,approved,approved,2,0.9,dfb5373e-de01-4e2c-8e63-f3d977aa539c,"כאשר בניין מיועד להריסה ובנייה מחדש, ההוראות התכנוניות החלות עליו הן הוראות הבינוי המתייחסות להריסה ובנייה מחדש, ולא ההוראות הקובעות בינוי לחיזוק בניין קיים (לל"
|
||||
1050-10-22,832b1f5f-90a3-4966-a447-7cbd4c494e0b,approved,approved,2,0.9,4a35e02d-484f-48b9-b008-a223d66e9445,"כאשר הוראת תכנית מתנה את הכפיפות למגבלות הגובה הקבועות בתכנית אחרת בכך ש""תתבקש הקלה לתוספת קומות"", אין תחולה למגבלות הגובה האמורות כל עוד לא התבקשה הקלה כאמור; "
|
||||
1050-10-22,aa8c134d-c7b9-4be3-a70f-db403429b595,approved,rejected,1,0.9,426a0199-a50f-4f1b-ac7e-e949915a848a,"תמ""א 38 היא תכנית מתאר ארצית כללית החלה על כלל שטח המדינה, ללא תשריט וללא התייחסות למגרשים ספציפיים, ולפיכך אין בכוחה לגלם איזונים קונקרטיים והכרעות תכנוניות ספ"
|
||||
1050-10-22,334d241f-f5f5-466f-b117-cb9dc8ae3ec9,pending_review,approved,2,0.9,9a694d11-88c8-4c5b-af8a-ee97631faaf6,"קבלת היתר בניה מכוח תמ""א 38 אינה בגדר זכות מוקנית, להבדיל מבקשה רגילה להיתר התואם תכנית — שבה ככלל, ולמעט מקרים חריגים, זכאי המבקש שבקשתו תאושר; שיקול הדעת לאיש"
|
||||
1050-10-22,e96d02d7-5cef-48d9-b421-bb947927f556,approved,rejected,2,0.875,7970e4f7-2de3-45ac-952e-78a55bd674ac,"השמטת דרישת ""הטעמים המיוחדים"" לסירוב לבקשת היתר לפי תמ""א 38, במסגרת תיקון 3א לתמ""א (דצמבר 2016), מדגישה את שיקול הדעת התכנוני הרחב המסור לוועדה המקומית בדונה בב"
|
||||
1050-10-22,6c9acd1e-4527-4afe-a667-ef73fb8cb87f,pending_review,rejected,1,0.9,2f3cb143-ffd1-4aea-ae3d-cc7c573106c7,"הוראות תמ""א 38 יוצרות איזון בין קידום יעיל של חיזוק מבנים מפני רעידות אדמה לבין הצורך שלא לדרוס אגב כך שיקולים תכנוניים חשובים אחרים; בבחינת בקשה להיתר יש לשאוף"
|
||||
1050-10-22,424fee6c-e340-4098-80f1-1aef1809d843,pending_review,rejected,2,0.9,a722cb4b-fd4e-4158-9dc9-237a352c89ab,"הסף לסירוב למתן היתר לפי תמ""א 38 אינו מוגבל לפגיעה ""בעוצמה ניכרת"" באינטרסים תכנוניים אחרים; הפנל אימץ את הסתייגות הנשיאה נאור מהגישה המצמצמת לפיה רק פגיעה בעוצמ"
|
||||
1050-10-22,660571c7-d115-41a2-ab36-96247e4ee473,pending_review,rejected,2,0.825,2e6c94a9-58df-4580-8c34-d4b1bcb2a04c,"זכויות הבנייה מכוח תמ""א 38 נועדו להתממש ואין לראותן כיעד תיאורטי שלעולם לא ניתן להגיע אליו; ההתפתחות העירונית, על הגדלת נפח הבנייה, תוספת הקומות והגדלת צפיפות י"
|
||||
1050-10-22,27b2d726-2ec4-4272-9360-13a6acd2d502,pending_review,rejected,1,0.9,400927aa-e17c-4fe7-bf71-e4093aafdba2,"מגמת הציפוף העירוני וההתחדשות העירונית מהווה שיקול תכנוני בעל משקל שיש להביאו בחשבון בעת בחינת תוספות בנייה, נוכח מגמה עולמית גוברת של פיתוח עירוני וריכוז אוכלו"
|
||||
1050-10-22,592e9184-8210-46d9-a78a-58210eb1f75f,approved,rejected,2,0.825,b5eff450-33ba-4f99-9bcf-facd6c86750a,"מסלול ההריסה והבנייה מחדש מכוח תמ""א 38, הכרוך בעלויות מימוש גבוהות בהרבה ממסלול החיזוק (בין היתר בשל הקמת מרתף חניה תת-קרקעי רב-מפלסי), אך הטומן בחובו יתרונות מ"
|
||||
1050-10-22,ba7d1867-1fe5-4d13-9979-a4a47e7781f6,pending_review,rejected,2,0.45,654cbe52-ee89-4a4a-9d52-5fe3e6aa743b,"טענה לירידת ערך מקרקעין אין מקומה במסגרת הליך ערר תכנוני (כגון השגה על מספר הקומות המותר), ויש לבררה במסלול הייעודי לכך."
|
||||
1050-10-22,81a5f28d-4c25-4cec-8b5a-888542168713,pending_review,rejected,2,0.8,b8b8573a-06dc-4d06-8743-3e63a808f75d,המתנגד להיתר בנייה הטוען לפגיעה קשה בדירתו עקב הקמת בניין סמוך נושא בנטל לבסס את הטענה בחוות דעת תומכת; היעדר ביסוס כאמור שומט את הקרקע תחת הבקשה לשנות את היקף
|
||||
1050-10-22,13065080-73cd-4288-96cc-ca8fe16c5a86,pending_review,rejected,2,0.875,8fb8458b-29a3-49c1-ba5a-e8c478e1ad09,"ועדה מקומית רשאית לאשר הקלה המקטינה את שיעור החלחול הטבעי שקובעת תכנית (כדוגמת הדרישה לשטח מרתף שלא יעלה על 85% לשם שמירה על 15% חלחול טבעי), ובלבד שיוצג פתרון "
|
||||
1050-10-22,063404d9-08c2-40e9-87db-9e9b363d090c,approved,rejected,2,0.9,320f5592-f4f8-497f-b818-f1e2c74c0da7,"הוראת צפיפות בתכנית הקובעת רף מרבי של יחידות דיור לדונם המותנה בחריגה מיחס המרה מסוים בין דירות קיימות לדירות חדשות, אינה חלה כאשר אין חריגה מאותו יחס המרה; הרף"
|
||||
1050-10-22,97bbd459-bdf5-4e40-b176-b807fe35f6c4,pending_review,rejected,2,0.8,3b43b0f3-799e-4627-a9b0-8f657827c7e8,"תוספת מצומצמת של קומה אחת לבניין קיים אינה הופכת, כשלעצמה, את הבניין לחורג מסביבתו באופן השולל את השתלבותו בבינוי הקיים והמתוכנן, ואין בה כדי לסתור מסמך מדיניות"
|
||||
1050-10-22,6516c2ef-bf31-4dab-b791-1adbc64d7574,pending_review,rejected,3,0.86,f2b9128b-b267-47a0-9d83-614af7a438bf,"לצורך חישוב שטחים ואחוזי בנייה מכוח תקנות חישוב שטחים, יש להביא בחשבון את שטח המגרש בניכוי שטח ההפקעה בלבד, ללא ניכוי השטח המיועד לזיקת הנאה; כל עוד לא בוצעה הפ"
|
||||
1050-10-22,1759001c-3c92-4bb2-a0fb-ed7cb06aa8f0,approved,rejected,2,0.9,2885d449-e433-4fb0-8009-f5d2b2e94350,"דחייה קודמת של בקשה אחרת להיתר באותם מקרקעין אינה מצדיקה כשלעצמה את דחיית בקשה חדשה, ואין בדיון בבקשה החדשה משום חריגה מסמכות; ההפך הוא הנכון — הדבר מלמד שהרשות"
|
||||
1050-10-22,677c5699-b7ff-4205-b684-d346a23bbe81,approved,rejected,2,0.825,a06134eb-b449-4499-8a59-6f01566c6a1d,"סימון זיקת הנאה לציבור לצורך שימור אפשרות להרחבת כביש בעתיד אינו מהווה הפקעה, ואין לחייב את הוועדה המקומית בהפקעת שטח נוסף מקום שדי בסימון זיקת ההנאה."
|
||||
1137-03-22,358ef863-0226-48a7-8d5c-57ad7658add4,pending_review,approved,3,0.9167,d3673738-21e2-43e5-9384-060424fe273b,"הזכות לדיור חלוף, או לפיצוי בגין דיור חלוף, לפי סעיף 194 לחוק התכנון והבניה קמה רק בהתקיים שני תנאים מצטברים: כי הנפקע התגורר בנכס המיועד להריסה טרם ההפקעה, וכי"
|
||||
1137-03-22,be4f0266-5c82-4702-ae5d-a5daf60e7b85,approved,approved,3,0.9233,adccc6e8-45d0-4d8e-b2f0-c91262cd9b43,"שינוי ייעודם של מקרקעין במסגרת תכנית — אף כאשר התכנית כוללת הוראת הפקעה — אינו משנה כשלעצמו את המערך הקנייני במקרקעין, והזכויות הקנייניות בהם נותרות בעינן עד למ"
|
||||
1137-03-22,16848b92-58ff-4a6d-b016-27bfd360ba5c,pending_review,rejected,3,0.9,cbc0cdd9-f740-4727-9939-117ff09c1e5a,"זכאותו של בעל זכות חכירה לפיצויי הפקעה נבחנת לפי תוקף חוזה החכירה במועד ביצוע ההפקעה (מועד הודעת ההפקעה), ולא במועד אישור התכנית המשנה את הייעוד; בהיעדר חוזה חכ"
|
||||
1137-03-22,2923e468-c997-4946-acc5-9459878822e0,approved,rejected,3,0.8733,168ffa83-36a4-46aa-9ad8-22d4506058fd,"התכלית שביסוד הזכות לפיצוי בגין דיור חלוף לפי סעיף 194 לחוק התכנון והבניה היא תכלית סוציאלית, ומשכך תנאי לקבלת הפיצוי הוא מגורים בפועל בנכס שהופקע."
|
||||
1137-03-22,fc771e6d-b117-4d9c-8713-604c3ecd0fd7,approved,rejected,3,0.8667,1762ee94-4775-49c5-9590-d413ca0c89c7,"קיים חריג לדרישת המגורים בפועל לצורך פיצוי בגין דיור חלוף: הזכאות תוכר גם מקום שהנפקע לא התגורר במקרקעין, כאשר העזיבה הייתה כפויה עקב מצוקה אמיתית, או נבעה מרשל"
|
||||
1137-03-22,edd787d3-d6b2-4c1b-9d1b-f74f8bc8fd10,pending_review,rejected,3,0.8733,08ee6f18-d19b-4b09-acc9-7c5473db6d22,"תכלית הפיצוי בגין דיור חלוף לנפקע היא תכלית סוציאלית — להבטיח כי הנפקע לא יוותר ללא קורת גג. לפיכך, עזיבה זמנית של המקרקעין מסיבה אובייקטיבית, מתוך כוונה לשוב ו"
|
||||
1137-03-22,9469314e-cc3c-4147-a39e-09cdf262b78e,pending_review,rejected,3,0.8833,73e08064-7177-489a-8e29-e2db89694da1,"רשות מפקיעה אינה יכולה להסתמך על עזיבת בעל המקרקעין את ביתו כשוללת את זכאותו לפיצוי בגין דיור חלוף, מקום שהתנהלות הרשות עצמה — השתהות בביצוע ההפקעה ומתן היתרי ב"
|
||||
1137-03-22,611c3009-81d9-478a-a0bf-9d19d310aee9,pending_review,approved,3,0.9233,ab17c2da-3eb4-446f-b51e-ddeef4906980,בית המשפט לא יסטה מחוות דעתו של מומחה שמונה מטעמו אלא אם נמצאה בה טעות בולטת; למעמדו המיוחד של המומחה מטעם בית המשפט משקל מכריע בקביעת הממצאים שבמומחיותו.
|
||||
1137-03-22,e0d75d47-9784-4859-a7c4-b8f0d5cf49d7,pending_review,rejected,3,0.89,89162dcd-3ddd-4da2-ba10-9990444bd8e5,היקף התערבותה של ערכאת הערעור בהכרעות המבוססות על חוות דעת של מומחים הוא מצומצם.
|
||||
1137-03-22,4c79f3f7-1b1c-4d55-9e7d-1a3887aaf76f,pending_review,rejected,3,0.8733,f3c7b18a-85ed-435f-a36c-9cbbc146e0ee,"הזכות לפיצוי בגין דיור חלוף בהליך הפקעה נושאת תכלית סוציאלית — להבטיח שהנפקע לא יוותר ללא מגורים — ואין תכליתה מתן פיצוי מלא בגין ההפקעה, שכן פיצוי כאמור שמור ל"
|
||||
1137-03-22,7582e62f-b329-44d5-9e64-c537f43c987a,approved,rejected,3,0.8767,fe4b8c33-0bc0-4212-a3b3-19310bc6d55e,"פיצוי דיור חלוף נועד לאפשר לנפקע דיור בדמות הדיור שהיה לו טרם ההפקעה, בכפוף להגבלתו במתחם של סבירות והגיון כלכלי המגשים גם את התכלית הסוציאלית של הסעיף, וזאת מת"
|
||||
1137-03-22,88c12b7a-ec62-4dea-8224-88584cd7a202,pending_review,rejected,2,0.86,cc0bd243-2b0c-447c-a620-1f3e198c2545,"לא ניתן לקבוע מראש ובאופן כללי את מתחם הסבירות הראוי לתשלום פיצוי דיור חלוף, נוכח זיקתו לשווי הדיור המופקע, ועל כן יש לבחון כל מקרה לגופו על פי נסיבותיו."
|
||||
1137-03-22,a46f6c1a-900b-49b8-a451-01bde813fb47,pending_review,rejected,3,0.8733,8fc8cab4-bddd-4f38-8d18-4c263bf86e9b,מטרת הפיצוי בגין הפקעה לפי סעיף 194 לחוק התכנון והבניה אינה השבת המצב לקדמותו; עקרון השבת המצב לקדמותו אינו עומד ביסוד הפיצוי בגין דיור חלוף.
|
||||
1137-03-22,4e787c19-e497-447e-814c-90da19847c2e,pending_review,rejected,3,0.7933,279fc4d8-6ca6-452b-a5bd-debd8f9ed7b1,"פיצוי בגין דיור חלוף לפי סעיף 194 לחוק התכנון והבניה נאמד לפי שווי המקרקעין למגורים במצבם הנוכחי, ואין להביא בחשבון את שווי זכויות הבניה הקיימות במקרקעין ואת הפ"
|
||||
1137-03-22,a67f72a8-bcbe-4c99-9084-fcca3dcfa22f,approved,rejected,3,0.8833,bceb3e73-a7e5-47dd-bd14-bb192cd6f315,"פגיעה בזכותו הקניינית של הנפקע בהליך הפקעה מזכה אותו, בנוסף לפיצויי ההפקעה בגין הקרקע המופקעת עצמה, גם בשיפוי בגין הוצאות נלוות הניתנות לכימות; אין מקום לפצות ב"
|
||||
1137-03-22,ba27c19b-bcf0-42db-b367-2af8617cec81,approved,approved,3,0.91,dae5bf72-5465-4a54-83b5-b8049b6c003f,"השיפוי בגין הוצאות נלוות בהפקעה משתרע על הוצאות העברה, שמאי, תיווך ושכר טרחת עורך דין; לעסק שהתנהל כחוק — גם הוצאות התאמה, אובדן מוניטין ואובדן רווחים; ולדירת מ"
|
||||
1137-03-22,8fdd916e-1ce8-4812-8957-1359771e1b5f,pending_review,rejected,3,0.8733,289936cf-27c6-4ff1-8295-c4169987d675,"בנושאים שמאיים מקצועיים מובהקים, העומדים בליבת העשייה השמאית, יש להעדיף את עמדתו המקצועית של השמאי האובייקטיבי שמונה מטעם בית המשפט על פני עמדות שמאי הצדדים; אי"
|
||||
1137-03-22,26b0d5f4-8985-446e-aa96-65a4eecd11f3,pending_review,rejected,3,0.86,596bbdb9-92f2-4a44-84b3-b742247f10e3,"בפסיקת פיצויי הפקעה אין לחייב את הנפקע בהצגת חשבוניות בפועל בגין ההוצאות הנלוות הכרוכות ברכישת דיור חלופי (הוצאות העברה, תיווך, שכר טרחת עורך דין לעסקת הרכישה ו"
|
||||
1137-03-22,da8c846f-e4ab-4591-908a-f20f313028b4,pending_review,rejected,3,0.8833,25deee91-e711-4942-ad89-d47f1e7e25e7,פיצוי בגין הוצאות נלוות בהפקעה נועד להשיב את הנפקע למצבו ערב ההפקעה ולא לשפר את מצבו; הוצאות נלוות שתכליתן להיטיב את מצב הנפקע מעבר למצבו טרם ההפקעה אינן ברות-פ
|
||||
1137-03-22,bb02dd75-f6cb-4b56-90b2-49776a342a22,pending_review,rejected,3,0.8867,75d5cdc5-3ddc-4f82-81d9-76da20d93da1,"הוצאות נלוות הנתבעות בגין הפקעה צריכות להיות סבירות ומוכחות כדבעי, והנטל להוכחתן ולהפחתתן מוטל על הנפקע."
|
||||
1137-03-22,ad2ca4bc-689b-49c1-bcbd-90b29fe302d8,pending_review,rejected,3,0.8733,ca67cb7e-b402-40f9-874e-8b7faf7e7034,"שכר טרחת עורך הדין וההוצאות הישירות של ההליך המשפטי בתביעת פיצויי הפקעה נקבעים במסגרת דיני הוצאות המשפט לפי תקנות סדר הדין האזרחי, ואין מקום להבחין לעניין פסיקת"
|
||||
1137-03-22,26402af6-1e39-4580-a5a4-c5a98e563551,pending_review,rejected,3,0.8833,b6c02c90-1ea4-47b2-bed7-581b58d4c985,"פסיקת שכר טרחת עורך דין והוצאות משפט לטובת הצד הזוכה היא נקודת מוצא בלבד; על בית המשפט לשקול שיקולים נוספים, ובפרט לבחון אם מדובר בהוצאות סבירות לניהול ההליך בה"
|
||||
1137-03-22,9cfce1d2-6032-4de3-8ee7-7fe988d33779,pending_review,approved,3,0.91,eb66ffb7-c4c0-4b9a-846b-0098d967ef44,"רשות ציבורית המפעילה את סמכותה להפקיע את קניינו של אזרח אינה רשאית להתנהל כיזם פרטי השוקל שיקולי רווח בלבד, ומוטלת עליה חובת תום לב מוגברת בהפעלת סמכות זו."
|
||||
67290-02-24,d72edb8b-5b95-48a1-9e08-13d98f628cc5,pending_review,approved,3,0.9267,4cee2a9f-6510-4bea-a928-713f5ed39b39,"היטל ההשבחה הוא בן-זוגו הראוי של הפיצוי לפי סעיף 197 לחוק התכנון והבניה: כשם שבעל מקרקעין זכאי לפיצוי מקום שתכנית פגעה במקרקעיו, כך מוטל עליו לשאת בהיטל השבחה כ"
|
||||
67290-02-24,cbd15d46-5533-4edf-b75e-54b4f956b5d6,pending_review,rejected,3,0.8733,7e0acbff-b90f-4ea8-a544-c5ecfa515743,"היטל ההשבחה מיועד לקופת הוועדה המקומית והרשות המקומית — לקהילה שאליה משתייך בעל המקרקעין ולא לאוצר המדינה — ונועד, כהוראת סעיף 13 לתוספת השלישית, לכסות את הוצאו"
|
||||
67290-02-24,8bb05b2a-c3b9-48f5-b003-6961cf3a2412,pending_review,approved,3,0.9267,1b83ec08-0be3-449f-b8a9-2c32fb976df5,"החיוב בהיטל השבחה מוגבל לעליית ערך המקרקעין הנובעת מרשימה סגורה של פעולות תכנוניות מוגדרות — אישור תכנית מתאר מקומית או מפורטת, מתן הקלה, ומתן היתר לשימוש חורג."
|
||||
67290-02-24,208ed1b4-1289-4616-85db-9232b635a8ef,pending_review,rejected,3,0.91,87c77b2c-b84b-4514-bb87-877f974d139a,"החבות בהיטל השבחה מוגבלת למקרקעין המצויים בתחום התכנית המשביחה או הגובלים עמה בלבד, גם כאשר היקף המקרקעין הנהנים מעליית הערך עקב הפעולה התכנונית רחב יותר."
|
||||
67290-02-24,b8f242d8-4f85-42e0-b4bb-8f9e933d325d,pending_review,approved,3,0.9333,de92dc23-1053-4c59-8230-aba9816e45ec,"החבות בתשלום היטל השבחה אינה קמה עם עצם ההשבחה אלא רק עם מימושה, ובלבד שהמימוש נעשה באחת הדרכים הקבועות בתוספת השלישית: קבלת היתר שלא ניתן היה ליתנו אלמלא הפעול"
|
||||
67290-02-24,19c1190e-b1f8-425b-a9ca-1c2cb6429082,approved,approved,3,0.9667,58cfc846-5f34-40eb-964b-4b356aa4bfc0,"שומת ההשבחה נערכת בשני שלבים: תחילה נקבע שווי הזכות במצב התכנוני שקדם לפעולה המשביחה (המצב הקודם), ולאחר מכן שווי המקרקעין בעקבות אישור הפעולה המשביחה (המצב החד"
|
||||
67290-02-24,0c224e93-1b21-4f6c-a6f1-37e9ea004e86,pending_review,rejected,3,0.9,a45dcbb0-9009-4f3e-89ac-510f691722f1,"השומה תיערך ליום ההשבחה, ושווי המקרקעין ייקבע כאילו נמכרו בשוק חופשי, דהיינו לפי מחיר השוק."
|
||||
67290-02-24,8373beaa-99d2-443f-957d-80e7529f76bf,approved,rejected,3,0.9,f9f1bfec-1e1f-4280-8f6e-fa996058b9b6,"השיטה המקובלת ביותר להערכת שווי מקרקעין היא שיטת ההשוואה, המבקשת לאמוד את השווי מתוך השוואה למחירים שנקבעו בעסקאות במקרקעין דומים בשוק החופשי בסמוך למועד הקובע."
|
||||
67290-02-24,2b609448-ea2d-414a-ace6-7c9bf8657ed8,pending_review,rejected,3,0.8733,a3e0762a-ea66-4a26-bf31-ba941b31b129,"ההשוואה לפי שיטת ההשוואה צריכה להיעשות לנכסים בעלי מאפיינים דומים לנכס נשוא השומה, ויש להיזהר מהשוואה לנכסים בעלי מאפיינים ייחודיים שאינם מתאימים לנכס המוערך."
|
||||
67290-02-24,316cdec4-3c37-4bdb-baca-4231be169d23,approved,approved,3,0.9233,a6e962cb-4c42-4212-a884-f304212e4ae4,"בהערכת שווי המקרקעין במצב הקודם לצורך חישוב היטל השבחה, יש להוציא מן הנתונים האובייקטיביים המשפיעים על שווי השוק את ציפיות השוק לעליית הערך הנובעות מהליכי התכנו"
|
||||
67290-02-24,03ab6d83-4e12-4688-a51c-5fffc41c0518,pending_review,rejected,3,0.9,fe6cd882-e2b1-4a9d-93bb-5c297be07d30,"בקביעת השווי האובייקטיבי של מקרקעין יש לנטרל מתוך מחירי עסקאות ההשוואה השפעות סובייקטיביות החורגות מתנאי שוק רגילים, כגון מחיר שנקבע מתוך מצוקה כלכלית של המוכר "
|
||||
67290-02-24,e845046e-3804-4617-b011-be05f0d17c23,pending_review,rejected,3,0.8733,d97c7f22-2e7c-4e2e-9da3-27657165561f,"בשומה בשיטת ההשוואה ההנחה היא ששווי מקרקעין סמוכים בעלי מאפיינים דומים יהיה זהה, אך כאשר קיימים מאפיינים ייחודיים לחלקה (שוני בזכויות בנייה, צורך בעבודות תשתית "
|
||||
67290-02-24,9ebf797f-f79b-4731-afea-04a1d566e91f,pending_review,rejected,3,0.79,ef8a4d81-5af5-4aae-bd0a-546c4ed12b84,הכלל שלפיו שווי המקרקעין מוערך מתוך השוואה למחירי מקרקעין דומים שנקבעו בעסקאות בסמוך למועד הקובע עלול ליצור קושי שעה שההליך התכנוני נמשך זמן רב והשפיע על ערך המ
|
||||
67290-02-24,aa77e736-c713-4b7f-8515-7f19c2c13e15,approved,rejected,3,0.8733,2bac5c9f-b7f4-4637-af7c-f976603e4950,"עליית ערך מקרקעין הנובעת מאירועים שאינם נמנים עם רשימת האירועים המטילים חבות בהיטל השבחה, יש להביאה בחשבון בהערכת השווי במצב הקודם, בהתאם לעקרונות שנקבעו בפסיקה"
|
||||
67290-02-24,84874e32-17be-47a3-a028-d918e28f4d13,approved,rejected,3,0.9,d7265b9f-421b-498e-b21d-a681cf58b3e0,רק תכנית מתאר מקומית או תכנית מפורטת היא תכנית משביחה שאישורה גורר חבות בהיטל השבחה; תכנית מתאר ארצית או מחוזית אינה מטילה כשלעצמה חבות בהיטל.
|
||||
67290-02-24,ffaeac4e-5e56-444a-9618-09b7ca8f805b,pending_review,rejected,3,0.8833,007c1498-81c2-4a48-9b9d-3699229c036b,"בהערכת השווי לצורך היטל השבחה יש לנטרל את השפעת ההליך התכנוני של התכנית המשביחה על ערך המקרקעין עובר ליום הקובע, ולשם כך יש לברר מהו ההליך התכנוני הרלבנטי והאם "
|
||||
67290-02-24,513ab9d8-7fe5-486f-b047-19198a1f1622,pending_review,rejected,3,0.9167,ad321fef-823a-4596-8e21-036303e9e052,"קיים מדרג הירארכי בין סוגי התכניות — תכנית מיתאר ארצית בראש (וכוחה יפה מכל תכנית אחרת), תחתיה תכנית מיתאר מחוזית, תחתיה תכנית מיתאר מקומית ומתחתן תכנית מפורטת —"
|
||||
67290-02-24,0024d9f3-1c32-4cda-85b9-058d655daea3,approved,rejected,3,0.91,d66153c0-169b-40e9-9260-d4d41efce767,"אישורה של תכנית מתאר מקומית (וכן של תכנית מפורטת) מותנה בקיומן של הוראות מתאימות המתוות את עקרונות התכנון בתכניות המתאר המצויות במעלה מדרג התכניות, מכוח סעיף 61"
|
||||
67290-02-24,4c0000b0-7131-4a7c-a3ff-fabcd56accdd,pending_review,rejected,3,0.8733,e49e0866-1a60-4ec7-8bca-108c8cef495c,"מקום שבו נדרש אישורן או שינוין של תכניות מתאר במדרג גבוה (ארצי ומחוזי) כדי לאפשר את השלמת ההליך התכנוני והענקת הסמכות להתקין תכנית מקומית או מפורטת משביחה, ההלי"
|
||||
67290-02-24,2787de44-6dfd-4f98-b326-f9877e0da50e,approved,rejected,3,0.9033,2e623c76-1d9c-4388-971f-8b535047155d,"בקביעת שווי המקרקעין במצב הקודם לצורך חישוב ההשבחה, יש לנטרל אך ורק את רכיב השווי הנובע מן הציפייה להשלמת ההליך התכנוני שהביא לשינוי הייעוד ולאישור התכנית המשבי"
|
||||
67290-02-24,cdfa6aa7-bda8-44c6-b094-ee20f4b47706,pending_review,rejected,3,0.8833,215332e9-1fef-44c5-8998-77e6df1ce55a,"אין לקבוע את שווי המקרקעין במצב הקודם על בסיס השווי שלאחר אישור התכנית הארצית והתכנית המחוזית בלבד, שכן אלו מתוות מגמות ועקרונות כלליים ואינן כוללות הוראות קונק"
|
||||
67290-02-24,860e1f40-c021-4623-a419-a9c6a0128b44,approved,rejected,3,0.8933,715559be-18b1-4532-90e2-76b3dc7f15ef,"בשומת היטל השבחה (וכן בהערכת שווי מקרקעין לצורך פיצויים), יש לנטרל משווי המקרקעין ערב אישורן של התכניות המשביחות את השפעת הציפייה להשלמת ההליך התכנוני, וזאת גם "
|
||||
67290-02-24,a5c4b7ac-d90a-4f62-bf5a-7678815c5fe2,pending_review,rejected,1,0.7,bc6d311c-c9cd-4eb5-8a0c-3edd2992f159,תכנית מתאר ארצית ותכנית מתאר מחוזית הכוללות הוראות של תכנית מפורטת עשויות אף הן להיחשב כתכניות משביחות לעניין היטל השבחה.
|
||||
52011-09-23,9bf8b5e7-1b38-4247-837e-63e275feb5b3,pending_review,rejected,3,0.8767,1d3d4d56-9abf-455e-ab6d-6ee980e68a7d,ערר על שומת שמאי מכריע הוא ההליך המתאים לתקיפת פגמים שנפלו בשומה המכרעת עצמה; כאשר בעל הדין אינו תוקף את נכונות השומה אלא מבקש להסתמך על ראיה חדשה שנתגלתה לאחר
|
||||
52011-09-23,f1e4a2d9-bfe7-475a-aa39-043d537f7e9b,pending_review,approved,3,0.9,c66c8a5b-8236-47ab-ad41-653cca42f743,התנאי לפתיחת פסק דין חלוט בשל ראיות חדשות הוא ששקדנות סבירה לא הייתה מאפשרת להשיגן בהתדיינות הראשונה; ואולם יש להותיר פתח לסטייה מתנאי זה במקרים בעלי חשיבות ציב
|
||||
52011-09-23,4c098960-ed09-46e1-b575-51a3549b0ea5,pending_review,rejected,3,0.8733,825edf7d-68ef-4ab7-a2eb-86ac80018a34,שיהוי רב בהגשת תביעה לביטול פסק דין חלוט מטה את הכף לטובת עקרון סופיות הדיון ומגביר את הנטל המוטל על הטוען לביטול.
|
||||
52011-09-23,15e9f163-e9ec-4d24-9c79-38a18698be87,approved,approved,3,0.9167,0e4e732e-be38-4872-9382-159bc1621e99,"תנאי החיוניות מחייב כי הטענה או הראיה החדשה תהיה בעלת פוטנציאל לשנות את תוצאת ההליך הראשון; משאין בכוחה לשנות את התוצאה, אין מקום לקיום משפט חוזר אזרחי."
|
||||
52011-09-23,4ddc5e1c-5001-4c5b-877d-c749c4fc40d0,pending_review,rejected,3,0.8733,9162144b-d05a-48b7-9ea9-cadd5c3d5d18,"הדרך לביטול פסק דין שניתן בהליך אזרחי בשל מרמה או בשל ראיות חדשות שנתגלו היא תקיפה ישירה של פסק הדין, באמצעות הגשת בקשה לביטולו לאותו טריבונל שנתן את פסק הדין."
|
||||
52011-09-23,9f561b6c-82ae-4b2c-9e42-c7fb3f6957e6,pending_review,approved,3,0.9,f7eca588-632f-4a6f-9fd6-5d963db7515d,"מוסד ""המשפט החוזר"" עוגן בחקיקה בהקשר הפלילי בלבד; במשפט האזרחי-מנהלי הסמכות לשוב ולדון בעניין שהוכרע באופן חלוט היא יציר הפסיקה, והיא מוכרת בעיקר בעילת תרמית וב"
|
||||
52011-09-23,69c02ccf-bf12-4298-8296-a61966dcf855,pending_review,approved,3,0.9167,cabfcaf7-edde-40f0-a183-ee46a477bc5e,"פתיחה מחדש של הכרעה חלוטה בעילת מרמה מותנית בכך שהראיות המוכיחות את המרמה מבוססות על אירוע שהתרחש לאחר ההכרעה, או על ראיות חדשות שהתגלו לאחר ההכרעה ושלא ניתן הי"
|
||||
52011-09-23,689b4227-38c5-48e6-a664-908a397abc2f,pending_review,rejected,3,0.84,d3a75694-1c92-4579-a438-2a19c4da0473,"כאשר נטען כי החלטה מינהלית פגומה במצב דברים מסוג זה, ההליך הדיוני הנכון לתקיפתה הוא תקיפה ישירה ולא הגשת ערעור (או בקשה להארכת מועד להגשת ערר), ואין למתדיין שתי"
|
||||
52011-09-23,52a85c0e-c5ba-4acf-8032-f55708bef86f,pending_review,rejected,0,0.0,4927c562-15db-4e91-ae03-90b8f053ff32,"ההליך המתנהל בפני שמאי מכריע הוא הליך משפטי; הדין מקנה לשמאי המכריע סמכויות מעין-שיפוטיות ומחיל עליו חובות אתיות הדומות לאלה החלות על שופט, לרבות איסורי ניגוד ע"
|
||||
52011-09-23,f2d82959-5d5f-4b0a-9261-fd4f893a5cb7,approved,approved,3,0.9267,54884370-61bf-483e-82e7-4173edfc5c27,"תפקידו של השמאי המכריע הוא תפקיד מעין-שיפוטי; משכך, עילה להתערבות בחוות דעתו תקום רק מקום שנפל בה פגם שורשי, כגון ניגוד עניינים, משוא פנים או חוסר תום לב, ולא ב"
|
||||
52011-09-23,9aebfb6d-6743-40ae-afda-cd3049ee8766,approved,rejected,3,0.8667,2a01497d-5a7f-49c2-bc1e-81fd2a3e4b59,"מאחר שההליך בפני שמאי מכריע הוא הליך משפטי וסמכויותיו מעין-שיפוטיות, יש להחיל על דרכי פעולתו את הכללים המשפטיים הנדרשים להכרעה, ובכללם הכללים הנוגעים ל""משפט חוז"
|
||||
52011-09-23,16b6a11a-b10a-4806-94a1-51a8c8c43369,pending_review,rejected,3,0.8833,46aba7d8-6bdf-497c-8de2-3b71322f9fe5,"ועדת ערר מקצועית, המורכבת מאנשי מקצוע, מוסמכת ואף חייבת להיזקק למלוא הטענות שניתן להעלות כנגד החיוב הנתון לסמכותה, לרבות טענות בדבר חוסר סבירות ופגמים בהליך קבל"
|
||||
52011-09-23,9fe25c2d-17d1-4af3-ad3f-881e55f365d8,pending_review,rejected,3,0.9,4eee463b-e8c5-4196-ab21-f3d18bc0eef8,"מועדים הקבועים בדין להגשת ערר אינם בגדר נקודת-פתיחה או המלצה בלבד, וההקפדה עליהם הכרחית לשם ניהול מערכת שיפוט סדירה ויעילה ולשם הבטחת אינטרס ההסתמכות של בעלי-הד"
|
||||
52011-09-23,635affa8-bfbb-496b-b833-6c87199f28aa,pending_review,rejected,3,0.8933,09efbe35-040b-4f4b-9733-d710067f9e32,"סמכותו של שמאי מכריע אינה מוגבלת לשאלות שמאיות גרידא; הוא רשאי וצריך להיזקק ולהכריע בכל עניין הכרוך במחלוקת המקצועית שבפניו, לרבות טענות כגון חוסר סבירות ופגמים"
|
||||
52011-09-23,fa658ead-7c0f-47e3-964a-ee9a71abf828,approved,rejected,3,0.8633,30028668-55e7-4c43-9fb2-7ff8f418f60f,החלטת שמאי מכריע כי אין בידו סמכות להיזקק לבקשה היא החלטה הניתנת לתקיפה בדרך של ערר על אותה החלטה; בעל דין החולק עליה אינו רשאי להמיר את הליך הערר בבקשה להארכת
|
||||
52011-09-23,f87b3129-3efa-47f0-a2d0-85f09ba17ac1,approved,rejected,3,0.9,e0cf4827-5fae-484f-b809-a00d313c62fe,"הארכת מועד להגשת ערר מותנית בהוכחת טעמים מיוחדים, ואף איחור של יום אחד מהווה איחור המחייב הצגת טעמים מיוחדים להצדקתו."
|
||||
52011-09-23,08ac97f9-9704-40d5-bc32-e26bc843f671,pending_review,rejected,3,0.8833,d0a73be0-c289-43d1-af3f-43046524e943,"עומס עבודה אצל הפרקליט וטעמים הנעוצים בבעל הדין עצמו (כגון חילופי גברא במחלקה הרלבנטית) אינם מהווים, ככלל, טעם מיוחד להארכת מועד, שכן טעם מיוחד צריך להיות נעוץ "
|
||||
52011-09-23,7c96b623-3ae1-4d3c-8775-1448ff1ced56,approved,rejected,3,0.8867,45ea0365-e421-4d61-aca4-37e54163030b,"ועדת הערר היא טריבונל מקצועי, ולפיכך כלל אי-ההתערבות בסוגיות מקצועיות חל גם על הכרעותיה, באופן שערכאת הביקורת תימנע מהתערבות במסקנותיה המקצועיות אלא במקרים החרי"
|
||||
52011-09-23,272d3562-6e70-4507-b862-e4fc2065c351,pending_review,rejected,3,0.8733,1e2817cd-0e7a-4993-961d-c77eefbd270c,"בקשת נישום לעריכת שומת היטל השבחה טרם אירוע מימוש (היתר או מכר), מכוח זכותו לפי התוספת השלישית לחוק התכנון והבניה, מקבעת ככלל את שיעור ההיטל ללא תלות בתמורה שית"
|
||||
52011-09-23,5dcd9ad7-2767-4f24-a076-6ec0df22e9c9,pending_review,rejected,2,0.82,15b7b67c-2606-41a2-8a22-ce056650bfbb,"השומה לקביעת ההשבחה נערכת למועד הקובע (יום תחילת התכנית, או יום אישור ההקלה או השימוש החורג, לפי העניין), בהתחשב בעליית ערך המקרקעין וכאילו נמכרו בשוק חופשי באו"
|
||||
52011-09-23,bca89a5b-16a5-4141-92ff-a26a6d9cc623,pending_review,rejected,3,0.8767,ee0ad011-bd59-43fe-826e-888667c14e2e,"כללי השיהוי (היסוד האובייקטיבי והיסוד הסובייקטיבי) שנקבעו ביחס לעתירות מנהליות נועדו לבחינת השגתו של אזרח כנגד רשות מנהלית, ועל כן אינם רלוונטיים מקום שהרשות המ"
|
||||
52011-09-23,6fad15cc-d738-4b16-b0f1-3e58d05624cf,pending_review,rejected,3,0.8067,7e720a0e-5b34-42cd-a8f7-088b454c9ddf,"ערכאת הערעור תימנע מהתערבות בממצא עובדתי שנקבע על-ידי הערכאה הדיונית, בפרט כאשר בעל הדין ויתר על חקירת המצהירים והעלה בהקשר זה טיעון רפה ולאקוני."
|
||||
"עע""מ 317/10",4405955f-ed49-4a88-b434-164f36e4287c,approved,rejected,3,0.7767,7308fdd8-84d8-4d46-8a2c-b22a7836350c,זכותו של מי שרכש מקרקעין מבעלים קודמים על בסיס מצב קיים למצות זכויות בנייה נופלת מזו של בעלים שזכויותיו קדמו לרכישה; על הרוכש לדעת כי יכולת הניצול המלא של זכויו
|
||||
"עע""מ 317/10",405fa437-3bd6-4402-b102-70fb8898db21,approved,rejected,3,0.8833,c9b622a6-fd5c-43e0-b9bc-8f2079f45263,"סעיף 12ב לחוק התכנון והבניה בא להסדיר את עבודתה של ועדת הערר בלבד, ואין הוא מקור הזכות להגשת ערר; מקור הזכות הוא סעיף 152(א)(1) לחוק, ופרשנות אחרת תרוקן את סעיף"
|
||||
"עע""מ 317/10",504f72a2-8051-40ab-bba1-997ab8cdd823,approved,rejected,3,0.8833,a344548b-25e1-47b4-80a1-32ed13188598,"ועדת הערר היא גוף מקצועי-תכנוני, ואין בסמכותה ואין ביכולתה לדון בעילות סף משפטיות כגון שיהוי, מניעות וכיוצא באלה."
|
||||
"עע""מ 317/10",af7e157d-ba2b-4533-8830-0473f12fb670,approved,rejected,3,0.8833,6dfb9c08-33e2-4a72-87e9-de9d87927bc0,"במקרה של סתירה בין הוראת סעיף 152(א)(1) לחוק התכנון והבניה להוראת סעיף 12ב(א)(2) לחוק, יש ליתן את הבכורה להוראת סעיף 12ב, בהיותה ההוראה המכוננת את ועדות הערר וה"
|
||||
"עע""מ 317/10",ac4b878a-9ad5-4f09-9ce8-3110053e5542,approved,rejected,3,0.8833,b7bade40-63f3-4cc4-9f06-bfb896adba6c,סמכותה העניינית של ועדת הערר אל מול בית המשפט לעניינים מינהליים בערר על החלטת ועדה מקומית בעניין היתר נקבעת לפי סיווג הבקשה על ידי הועדה המקומית: מקום שהועדה המ
|
||||
"עע""מ 317/10",9f6ba65a-4b25-4c8d-bfda-23d4276262c9,approved,approved,3,0.9233,9d606a1f-d61a-4a73-8048-f47243a9a4cb,"ועדת הערר היא ""מוסד תכנון"" בעלת סמכות מקורית, ורשאית להפעיל שיקול דעת תכנוני עצמאי ולהמיר את שיקול דעתה תחת שיקול דעתה של הועדה המקומית בהחלטה למתן היתר. בכך מו"
|
||||
"עע""מ 317/10",405fc33f-e1cc-4cbd-8c6b-6dec3abf53dc,approved,approved,3,0.9067,6e3915a2-560b-41db-97fe-a621eed88ed1,ועדת הערר מוסמכת לדון בערר על החלטה ליתן היתר בנייה גם כאשר טענת המתנגד היא כי ההיתר סוטה מתכנית. פרשנות מרחיבה זו לסמכות ועדת הערר הולמת את מגמת המחוקק בתיקון
|
||||
|
170
data/audit/principle-cull-apply-20260620T092156Z.csv
Normal file
170
data/audit/principle-cull-apply-20260620T092156Z.csv
Normal file
@@ -0,0 +1,170 @@
|
||||
case_number,halacha_id,old_status,final_verdict,votes,score,canonical_id,rule
|
||||
403-17,15a17d39-7eb6-458b-89de-a7bc3c448b25,pending_review,rejected,2,0.9,0b47b8ef-41eb-488e-89b2-a93532bd7f1e,ועדת ערר הדנה בעררים על שומות שמאים מכריעים שונים באותו מרחב תכנון נדרשת לראיה כוללת של מכלול השומות והטענות — השמאיות והמשפטיות — ואינה רשאית להסתפק בבחינה פרט
|
||||
403-17,ad985432-e89d-4b39-9bea-91f69179c92a,pending_review,rejected,2,0.9,11b9f6fb-e26f-4d32-a20a-6e4dcde555b3,"עקרון היסוד העומד בבסיס החיוב בהיטל השבחה הוא עקרון הצדק החלוקתי, שמשמעותו כפולה: ראשית, מי שמתעשר בגין פעולות תכנון של הוועדה המקומית ראוי שישתף את יתר חברי קה"
|
||||
403-17,b222a04c-d643-4e89-a51d-0e773a2ca748,pending_review,rejected,2,0.9,9d5d0b81-79c5-4218-9310-af4b4f3c547b,"מגבלות הבנייה הקבועות בתכנית גוברות על שטחי הבנייה המוצעים במסגרתה, כך ששטחים נומינליים אינם ניתנים למימוש מלא אם הם מתנגשים במגבלות שהתכנית עצמה הציבה."
|
||||
403-17,457dfcc7-0add-4d6c-8ccc-2b654b182e7e,pending_review,rejected,3,0.7433,afda31a9-0c6c-4270-8104-d3f3c7657783,"מעמדו של מבנה במסגרת תכנית שימור אינו קבוע בהכרח במועד אישור התכנית, ועשוי להשתנות בחלוף הזמן בהליך מינהלי שאינו סטטוטורי — דהיינו, באמצעות שינוי כרטסת השימור —"
|
||||
403-17,279bc0c7-18e2-4e3f-9943-96ba303b7843,pending_review,rejected,2,0.875,966bc42e-0ad7-4154-96fe-7b4dac385963,"כאשר תכנית מפורטת קובעת כי הוראותיה יהוו את ""מדיניות התכנון"" לעניין בקשות היתר לפי תכנית מכוח סעיף 23 לתמ""א 38, יש בכך כדי להגביל עקרונית את השימוש בזכויות לפי "
|
||||
403-17,994c7493-c2f3-4f7c-92ee-35230f984e5e,pending_review,rejected,2,0.825,af04077c-3355-4c27-9bdb-a71734bfb2aa,"חובת קיום הליך יידוע למגרשים גובלים בטרם הפעלת סעיפי גמישות תכנונית נגזרת מהצורך הענייני בביצוע איזון אינטרסים מורכב, גם בהיעדר הוראה מפורשת בתכנית; בלא הליך כא"
|
||||
403-17,1a58c7f0-92c9-4da3-8bd0-bade22c9d483,pending_review,rejected,2,0.9,e7a8529e-74a1-4cdd-858b-362736706f79,"אין לפרש סעיף בתכנית באופן שיהפוך אותו לכפילות של סעיף אחר באותה תכנית; פרשנות שמרוקנת סעיף מתוכן עצמאי, ובפרט פרשנות שאינה מתיישבת עם הלשון המפורשת של הסעיף, י"
|
||||
403-17,a7775ffc-3e15-4cbb-94ea-9cdfa50dfc9b,pending_review,rejected,2,0.825,eb47dd76-bbb5-479a-b7f5-f8a05a9d9a46,"כאשר תכנית כוללת סעיף כללי המאפשר שקילת ""רווחת דיירים"" בשלב הרישוי, אין להסתפק בעמדה לפיה הבחינה תיעשה על-ידי מהנדס העיר והצוות המקצועי בלבד ללא פרסום לציבור; ע"
|
||||
403-17,511736a8-8c34-4d46-a1ba-1df279ee385d,pending_review,rejected,1,0.9,d2887620-94f0-4bf2-ba5a-d30b3cdfc181,"הפסיקה יצרה, באמצעות חקיקה שיפוטית, הגדרות וקטגוריות משפטיות חדשות — בהן ""זכויות צפות"" ו""זכויות מעין מוקנות"" — שנועדו ליצור ודאות ולאפשר גביית מס אמת בהיטל השבח"
|
||||
403-17,8fe5bae8-7b63-4631-b1ee-dcf1f080ebb0,pending_review,rejected,1,0.9,7d5c21a8-0c5e-46b0-be0b-57af075293ef,"כאשר עסקינן בזכויות צפות, התגבשות הזכות מתרחשת לעת הוצאת היתר הבנייה, ורק באותה עת מתגבש האקט התכנוני המחייב בהיטל השבחה — להבדיל ממועד אישור התכנית המפורטת."
|
||||
403-17,32a8b766-f6e4-4a72-853e-905de03188c2,pending_review,rejected,2,0.9,fb16ed9f-cdf3-497e-b055-c583e8f31f35,אין רשות התכנון רשאית לדחות בקשה להיתר בניה התואמת את התכניות הקיימות; לשם כך קבע המחוקק את מידת הפירוט הנדרשת בתכנית כך שניתן יהיה להוציא מכוחה היתר בניה ללא '
|
||||
403-17,7db58900-4598-496d-8daa-337b0ca816e0,pending_review,rejected,1,0.9,4c0e9766-f580-40f8-a7a7-09e5ede3e178,"עקרון המימוש הינו מאבני היסוד של דיני המס, ובהקשר של היטל השבחה הוא מתבטא בקביעת המועד הקובע לשומה כמועד יישום התכנית בפועל, ולא כמועד אישורה."
|
||||
403-17,a9517c90-410b-417d-8e59-f1fc6c301bd0,pending_review,rejected,0,0.0,0b53309d-17d7-473c-bc1b-c0a146ecd7f5,"סיווג תכנית לצורך היטל השבחה ייקבע על פי מהותה ולא על פי צורתה הפורמלית, ולפיכך קביעת אופי הזכויות הנובעות ממנה תיעשה לפי תוכנן הממשי."
|
||||
403-17,07784d09-c910-490f-a90b-1ffa5c459e27,pending_review,rejected,2,0.9,87b4ac0d-fe4a-4892-8b80-caaf6ecb5edc,"גביית היטל השבחה מכוח אישור תכנית מותנית בקיומה של דרישת מסוימות, ותתאפשר רק כאשר ניתן להוכיח פגיעה או השבחה קונקרטית במקרקעין מסוימים מכוחה של אותה תכנית."
|
||||
403-17,b2231875-11eb-4d96-bf89-25876e27ff2f,pending_review,rejected,2,0.9,7928bb10-b142-46d7-aaed-9e8d9a183772,"ההבחנה בין זכויות מעין מוקנות לזכויות צפות נבחנת לפי מבחן הוודאות במועד אישור התכנית: בזכויות מעין מוקנות קיימת ודאות במועד האישור כי בקשה לניצול הזכויות תאושר,"
|
||||
403-17,8ab3eb69-f044-405f-aa2a-3c3cf7dd2a2e,pending_review,rejected,2,0.875,42cc0a03-05b3-43ef-8014-382e9ed708ae,"תכנית החלה על מרחב עירוני בשלמותו או על חלק משמעותי ממנו, אשר זכויותיה הוקנו תוך מתן שיקול דעת רחב והעדר תכנון פרוגרמתי מקיף לתשתיות, תחבורה, שטחי ציבור ומוסדות"
|
||||
403-17,eeea3db3-340a-40cb-a593-328daa61a881,pending_review,rejected,2,0.825,a691f41a-112c-4211-abdb-6e5a91d88e21,"כאשר הוראות תכנית מעניקות לוועדה המקומית שיקול דעת רחב ביחס לאפשרות לקבלת זכויות, החורג מן המקובל בתחום הרישוי ומתייחס לשיקולים תכנוניים במובנם הרחב, אין לראות "
|
||||
403-17,bc5f790b-7fff-4b90-8bb0-647555c17810,pending_review,rejected,1,0.8,663b3788-d955-4931-90f2-3bbd9d044954,"חוות דעת של מהנדס העיר, המוגשת אגב הליך לגביית היטל השבחה, אינה יכולה לבטל הוראה מפורשת בתכנית, ואין לקבל פרשנות הניתנת על-ידי מהנדס העיר שאינה תואמת את לשונה ו"
|
||||
403-17,6e284c8b-38e2-4c93-9cf7-e1a26af12676,pending_review,rejected,2,0.825,e15a9985-a233-4692-90e2-15f2326d75bc,"כאשר באים להטיל על מוכרי דירות היטל השבחה בגין תוספת בנייה שלכאורה התווספה לרכושם, יש להתבסס על הוראות התכנית בלבד ולפרש אותן לחומרה כנגד הרשות המטילה."
|
||||
403-17,66537693-0b74-4baa-b29c-440916cfb5a8,pending_review,rejected,3,0.8233,d7d4f70f-3ac7-4555-b765-f8215e7b2632,"אין לקבל ניסיון של רשות תכנון להפוך זכויות הקבועות בתכנית מסוימת לזכויות מוקנות באמצעות אמירה כללית של מהנדס העיר, כאשר המציאות התכנונית טופחת על פני אמירה זו —"
|
||||
403-17,07a07127-4db1-4049-b9be-67f173c14054,pending_review,rejected,2,0.875,6444c925-2964-48f8-9c15-5179a0786aa1,"הוראה ייחודית בתכנית המקנה שיקול דעת לוועדה המקומית מטילה ""עננה של אי ודאות"" על הזכויות שבתכנית, ולכן יש לה השפעה משמעותית על הערכת שווי המקרקעין על ידי השוק במ"
|
||||
403-17,963e5c27-8ff4-49b1-912c-4ea71439e962,pending_review,rejected,2,0.9,e0ffed43-73d8-4814-9695-6f4675a07a75,"מדיניות של ועדה מקומית או של בעלי תפקידים בה אין בכוחה לשנות מלשון התכנית הברורה ומתכליתה, ולפיכך אין בה כדי להפוך זכויות צפות לזכויות מוקנות."
|
||||
403-17,017ec44d-37e4-47ca-b4c5-d17fc72c4038,pending_review,rejected,2,0.9,f025d4e2-75f0-4073-931c-27e6a8ebadfe,"רשות מינהלית אינה רשאית להחליט מראש מה תהא עמדתה בעתיד באשר לאופן הפעלת שיקול דעתה, שכן בכך היא פוטרת עצמה מבחינה מחודשת של העניין בעת הצורך."
|
||||
403-17,2eb71d37-be64-4bb0-8542-0302c006389f,pending_review,rejected,3,0.79,03f73f67-bd7e-48ca-8da8-e188b6ce3647,"ניתוח הוראות תכנית לצורך בחינת מימוש הזכויות אינו ניתוח פילולוגי של לשון התכנית בלבד, אלא חייב לכלול גם בחינה מהותית של תכלית התכנית ושל היקף שיקול הדעת המוקנה "
|
||||
403-17,932a38cb-a763-47a6-8fb4-11484c6610ff,pending_review,rejected,2,0.9,81ffeb6c-fcef-4847-933a-23b0d131e927,"עלות בלתי סבירה של הקמת תשתיות הנדרשות לשם הוצאת היתר בניה יכולה לשמש, כשלעצמה, עילה מספקת לסירוב מתן ההיתר, אף כאשר הבקשה תואמת את הוראות התכנית."
|
||||
403-17,0d7d15db-9e67-4f38-8e5a-bda75b5c381f,pending_review,rejected,2,0.875,8dc7b7c1-1858-4626-9bbf-deab40d7233e,"המנגנון שנקבע בהלכת הפטריארך היווני, לפיו בחישוב היטל השבחה בגין תכנית זמנית שזכויותיה מתכלות יילקח בחשבון הסיכון של אי-מימוש ההשבחה והיטל ההשבחה יופחת בהתאם, מ"
|
||||
403-17,ebbee08b-2b7a-4b24-ad36-496c7f92a33b,pending_review,rejected,2,0.875,c91cceb5-0a69-4da0-875b-2bc081182251,"בעת עריכת שומה להיטל השבחה בגין תכנית הכוללת תוספת זכויות בנייה משמעותית בשכונה, על השמאי לתת דעתו על ההשפעה הצפויה לירידה בשווי הנכסים הקיימים אם תמומש התכנית "
|
||||
403-17,ae06a424-d3a3-412a-919c-44b8fdb8702a,pending_review,rejected,2,0.875,274dfb27-43a9-4ffb-9b8d-89138c156824,"עם תיקון 3/א לתמ""א 38 בוטלה דרישת ה""טעמים המיוחדים"" שהיו תנאי לסירוב הועדה המקומית למתן היתר בניה מכוח תמ""א 38, ובמקומה נותרו שיקולים תכנוניים, אדריכליים, נופיי"
|
||||
403-17,7b20dce3-bcce-43b7-a9f8-1ec4d3b5eec7,pending_review,rejected,1,0.8,dc82fdaa-6c9f-461e-ac77-a1b3b208f621,"משך חיי תכנית בניין ערים מוגבל בזמן גם כאשר הדבר לא צוין במפורש בהוראותיה, נוכח הדינמיקה התכנונית שבה תכניות חדשות משנות או מבטלות תכניות קיימות בקצב המושפע מצר"
|
||||
403-17,3ecd2b1d-f912-48df-949f-158e3d381dbf,pending_review,rejected,2,0.9,d97c4456-5e43-4649-9384-3e387e85ddd2,"כאשר חלה תמ""א 38 וקיימת תכנית מפורטת שטרם מומשה, היקף הזכויות הכולל לא יעלה על הגבוה מבין השתיים — הזכויות מתחברות בחפיפה ולא במצטבר."
|
||||
403-17,ad739c75-15ab-4e24-8870-030a4b562f51,pending_review,rejected,2,0.875,3a27a5ea-07e1-4008-9ea2-a6cff22207ba,כאשר שתי תכניות מקודמות במקביל ואחת מהן כוללת הוראה המפנה במפורש לרעותה ויוצרת ביניהן קשר וחיבור — ניתן לראות בהן תכנית אחת לעניין פרשנות והפעלה.
|
||||
403-17,4a3d0430-4740-4e65-942b-67318b48d985,pending_review,rejected,3,0.83,fb4ea557-60b4-4014-8585-d3c371d70483,"עצם עריכתה של תכנית מכוח סעיף 23 לתמ""א 38 אינה קובעת כשלעצמה את החיוב בהיטל השבחה; החיוב הוא פועל יוצא של מהות התכנית והוראותיה הקונקרטיות, ולפיכך תכנית לפי סעי"
|
||||
403-17,c28fd489-0dd4-4c9e-bfcc-a65f27560d40,pending_review,rejected,1,0.9,091b8a1c-0bda-47a4-ace3-4eea4029b573,"חובת ההנמקה החלה על השמאי המכריע — וכמוהו על שמאי הוועדה המקומית — היא אבן יסוד בשומה, והיא יונקת ממקור סמכותה של חובת ההנמקה הכללית החלה על הרשות המינהלית."
|
||||
403-17,56b9dd22-045a-45a4-81fd-e75cc290f233,pending_review,rejected,2,0.875,d264dc95-3ab5-4b3e-a3b6-ca5c18424324,"על ועדת הערר מוטלת חובה כפולה — לוודא שהמס שהוטל הוא צודק ואינו שרירותי, ולצד זאת לדאוג שהפרט יבין את השומה גם אם אינו מסכים לחיוב שהוטל עליו."
|
||||
403-17,f2f251e9-15eb-4749-b5ca-0d0ce33f1c2c,pending_review,rejected,3,0.84,d3d6edf4-e568-40f6-8d8d-8d373d8df609,"ידע מקצועי ייחודי של שמאי מכריע, גם אם הוא בתחום מומחיותו הבלעדית, אינו יכול להוות תחליף להוכחה או תוספת לה, ועליו לבוא לידי ביטוי בנימוקי השומה."
|
||||
403-17,b7852e5e-4031-4a29-8491-96b6b5eda544,pending_review,rejected,1,0.9,1e18b8bb-1b61-4700-9be6-fa24992017a7,"היטל השבחה מוטל אך ורק בגין עליית ערך מקרקעין הנובעת מאחת משלוש פעולות משביחות (אירועי מס) שנקבעו בסעיף 1 לתוספת השלישית: אישור תכנית, אישור הקלה או אישור שימוש"
|
||||
403-17,46425a51-3f87-48c6-a097-711c4d38bfd5,pending_review,rejected,0,0.0,40156af5-fd04-44d2-8792-be95c14ff372,"ההשבחה נמדדת כהפרש בין ערכם של המקרקעין לפני הפעולה התכנונית המשביחה לבין ערכם לאחריה, כאשר ערך המקרקעין הוא ערך אובייקטיבי של שווי שוק הנקבע באמות מידה שמאיות "
|
||||
403-17,b912cfa8-f2b4-4424-8217-0d339b016cdf,pending_review,rejected,1,0.9,6e055f2d-3863-429d-a059-04fe49d56f86,"חיוב בהיטל השבחה מותנה בהתקיימותם של שני תנאים מצטברים: עלייה בשווי המקרקעין, ועליית שווי זו קשורה בקשר סיבתי ישיר לאישור תכנית, מתן הקלה או התרת שימוש חורג."
|
||||
403-17,312a0457-fd66-4793-a0c7-7a94df37b30a,pending_review,rejected,2,0.9,197fceae-729e-426e-9346-b7294ecfabdc,"סעיף 196א לחוק התכנון והבניה מפנה לתוספת השלישית לקביעת ""השיעור, התנאים והדרכים"" לגביית היטל השבחה, והתוספת מבחינה בין ""מקור ההשבחה"" — אחת מפעולות התכנון המנויו"
|
||||
403-17,f04ab6e8-2e7c-4fad-8d51-2b2e2e76d1bd,pending_review,rejected,2,0.9,76a1c239-922d-475b-926f-16721a374ef6,"שווי השוק של מקרקעין לצורך שומת היטל השבחה ייבחן מבעד למשקפיו של ""קונה מרצון"" אלמוני, כאשר הדגש הוא על המידע שהיה בידיו ועל מערכת ציפיותיו מהמקרקעין ערב אישורה "
|
||||
403-17,bba24a49-13e2-41f0-af61-a2fc22b5fe26,pending_review,rejected,1,0.9,7dd7f080-387d-479b-9b8c-f9f5cc349295,"הציפייה הכללית לפיתוח מקרקעין מהווה חלק אינטגרלי מהפוטנציאל הכלכלי שלהם, ועל כן שווים של מקרקעין חקלאיים הצמודים לאזור בנוי או המצויים בלב עיר אינו כשווים של מק"
|
||||
403-17,60b4e419-4296-4b52-a4de-98657a39f4f3,pending_review,rejected,2,0.9,38cd685c-6fb0-499d-9790-7df550b6af5b,"תכלית היטל ההשבחה היא לתפוס את ההשלכות הישירות של התכנית המשביחה על ערך המקרקעין בלבד, ולא לשמש ככלי כללי למיסוי עליות שווי שמקורן בגורמים אחרים, אשר ממוסות בלא"
|
||||
403-17,b855f886-cc72-4a76-b5fa-4d3039d3186d,pending_review,approved,3,0.8433,13cce478-372a-417b-99dd-0722687dd7ee,"בקביעת שווי המצב הקודם לצורך חישוב היטל השבחה יש לנטרל את הציפיות הספציפיות הנובעות מהאקט התכנוני שיצר את ההשבחה (עוד טרם אישורו הסופי), אך אין לנטרל את הציפיות"
|
||||
403-17,9d721021-ae8d-46e3-bbc0-b49e758e9d48,pending_review,rejected,1,0.9,9fd88b0a-3573-4e64-85c6-6c8a2ec5077a,עקרון המימוש בהיטל השבחה ובמיסוי מקרקעין מבוסס על שלושה נימוקים מצטברים: נזילות — דחיית החיוב במס למועד שבו לנישום כסף נזיל לתשלום; יכולת מדידה — המתנה למועד שב
|
||||
403-17,20db510c-a297-40f7-9928-b381cccce6a2,pending_review,approved,3,0.86,dc7c5775-7427-40bb-a802-f2a063f887f8,"פיצול היטל השבחה בין מועד המכר למועד מתן היתר הבנייה — קרי מיסוי חלקי בעת המכר והותרת היתרה למועד ההיתר — נעדר עיגון בחוק הקיים, ואינו פתרון לגיטימי גם כאשר הוצ"
|
||||
403-17,383e631a-c94e-4d9b-ad8f-663aad74af57,pending_review,rejected,2,0.9,efd81d7a-37a3-4211-a22f-6bc35433f09b,יש להבחין בין היטל השבחה לבין תביעות ירידת ערך לפי ס' 197 לעניין שקלול הפוטנציאל: פוטנציאל כללי משפיע על שווי המקרקעין ויש להביאו בחשבון בחישוב שווי המצב הקודם
|
||||
403-17,81f52922-a35c-416e-be20-37e13decc1fd,pending_review,rejected,3,0.81,18048f23-6c6d-4d81-a4db-bfa61302c29c,"בהערכת השפעת תמ""א 38 על שווי מקרקעין יש להבחין בין שתי השפעות נפרדות: השפעה פנימית הנובעת מיישום התכנית במקרקעין המסוימים, לעומת השפעה חיצונית הנובעת מיישום התכ"
|
||||
403-17,a0be05c0-fe60-4103-ba35-bd869b397218,pending_review,rejected,2,0.9,b1e0996b-1057-4e4c-a9a7-a218eabf0b21,"בבחינת השווי האובייקטיבי של המקרקעין אין להתעלם אפריורית מזכויות שאינן ודאיות, אלא יש לקחת אותן בחשבון תוך שקלול מידת הוודאות במימושן."
|
||||
403-17,ee0c1db4-c33c-41a1-80f3-14f49562b695,pending_review,rejected,2,0.9,c93368d0-1429-446f-976f-be1b419c996c,"הסדר היטל ההשבחה והסדר הפיצויים בגין פגיעה במקרקעין לפי סעיף 197 אינם הסדרים משלימים באופן מלא, ולמעשה אינם סימטריים. אף שהם מהווים 'תמונת ראי' זה של זה בכמה הי"
|
||||
403-17,fb6d6e2b-78ff-4f26-ae82-12dc445eed80,pending_review,rejected,2,0.9,80c40126-8dfc-413d-82a3-6e2b8a51b44d,"אין לאמץ פרשנות הסותרת פסיקה של בית המשפט העליון ויסודות מושרשים בדיני היטל השבחה על בסיס אמרות אגב (אוביטר) בפסק דין מחוזי, ובפרט כאשר פסק הדין המחוזי עוסק בהק"
|
||||
403-17,26b69a30-d1c7-4a05-b911-82bf7a2a9125,pending_review,rejected,2,0.875,52a07022-f3e9-4dc2-bac2-5d56cfc286b4,"ההלכה שנקבעה בעניין סי.בי.די — לפיה יש לנטרל בשווי מצב קודם השפעה של ציפייה לקבלת הקלה לאור הקלות דומות שניתנו במרחב — מותנית בקיומו של ""קשר סיבתי ישיר"" בין ההק"
|
||||
403-17,61e52b9d-8292-48ca-bcad-2056e22912cb,pending_review,rejected,0,0.0,547d717b-bd68-404a-b400-54193a97b1ed,"הפטור מהיטל השבחה בגין מימוש זכויות מכוח תמ""א 38 מעוגן במדיניות המחוקק לעודד חיזוק מבנים ישנים מפני רעידות אדמה, ובפרט מבנים שההיתר לבנייתם ניתן לפני שנת 1980 ו"
|
||||
403-17,2c89b662-117f-46ca-957b-4e55f9edb0b7,pending_review,rejected,2,0.9,76b70a81-a2e7-4718-98f0-aa9f7eaf5fda,"מקום בו לא קיימת כלל חובת תשלום היטל השבחה, שווי השוק במצב הקודם הוא שווי השוק האובייקטיבי, ואין להפחית ממנו עליית ערך כתוצאה מהציפייה לקבלת הזכויות, שכן זכויות"
|
||||
403-17,221857b7-6941-4856-a248-e740e39b0114,pending_review,rejected,0,0.0,912fc05c-3053-4c50-b6d8-875be833b238,"בהתאם להלכה הפסוקה, אין לנטרל את תרומתה של תמ""א 38 (ככל שישנה) לשווי המקרקעין במצב הקודם לצורך חישוב היטל השבחה."
|
||||
403-17,91a3d3c6-b1fe-46ff-a508-2204c169c970,pending_review,rejected,2,0.9,0210b086-ac6d-42c6-96fb-57d886eb50a8,"מחלוקת בין שמאי הצדדים שעיקרה סוגיה משפטית — ובכלל זה השאלה אילו זכויות תכנוניות יש לכלול בשווי המצב הקודם — אינה בסמכותו של השמאי המכריע להכריע בה, והכרעתה מסו"
|
||||
403-17,71360140-bcf8-411a-a6a1-1dfc3926a56f,pending_review,rejected,2,0.9,ac674056-4721-426c-946c-f3c2358b1245,"קביעת מידת הוודאות או אי-הוודאות של זכויות תכנוניות נגזרת מסיווג הזכויות (מוקנות, מותנות או צפות) ולא להיפך; אין לבסס סיווג של זכויות על טענה בדבר שוני בוודאות "
|
||||
403-17,8edb4175-f488-4a00-8bd5-72b0a1321756,pending_review,rejected,2,0.875,6822683b-85e8-45cb-a26b-c6999cc7e197,"בקביעת היטל השבחה אין להביא בחשבון שיקולי פטור מהיטל השבחה הנובעים מתכנית אחרת, שכן שווי השוק כשלעצמו מגלם כבר את הפוטנציאל העתידי לרבות את ההשפעה של תשלום או א"
|
||||
403-17,cdb5f0a0-4d1f-4c84-93d1-26f521c945bc,pending_review,rejected,2,0.825,ed34ff84-94f7-410e-84df-c8c3568d4159,"הבחנה בין תכנית מקנה-זכויות לבין תכנית הקובעת תנאים ואי-וודאות נדרשת לצורך אומדן ה""מצב החדש"": תנאי תכנית ואי-וודאויותיה יובאו בחשבון בבחינת השווי, אך אינם הופכי"
|
||||
403-17,2573b877-376c-4edf-a87a-24cfc8037565,pending_review,rejected,1,0.85,92da4ff2-4516-48e0-b9f8-a562929094cd,"תכנית מאוחרת אינה מוסיפה זכויות בנייה מהותיות מקום שהיא משקפת את מדיניות הוועדה המקומית שכבר נהגה למתן זכויות מכוח תכניות קודמות (כגון תמ""א 38 ותכנית מתאר), שכן"
|
||||
403-17,fd164417-94e5-4a67-a007-3d0f4c5ea98d,pending_review,rejected,0,0.0,3e80802a-33a1-4635-b45f-8623b7696c7e,דרך המלך לחישוב היטל השבחה מחייבת הערכת שווים המלא של המקרקעין בשני מצבים — מצב קודם ומצב חדש — וההשבחה הינה ההפרש בין שני המצבים.
|
||||
403-17,0821ee9e-c117-40ac-8c6b-ad346a2bb733,pending_review,rejected,3,0.8067,40307e74-0e10-4da5-b527-e6bdccd15b8e,"ניתן לחרוג מדרך המלך ולשום רק את הפער בין המצבים (שיטת הדלתא) במצבים שבהם שווי המקרקעין אינו משתנה כתוצאה מהאקט התכנוני, ולכן אין צורך לשום את מלוא שווי המקרקעי"
|
||||
403-17,596516df-125d-47af-a990-40402fafcfd7,pending_review,approved,3,0.8467,e424d09d-d0f9-4d5a-a050-9e8bb2ff300c,"בחינת ההשבחה אינה מתייחסת לאחד ממרכיבי המצב החדש בלבד אלא לכלל מרכיביו, בהשוואה למצב הקודם, בכפוף לכללים החלים על שיטת הדלתא. אין לבודד מרכיב פלוני (כגון תוספת "
|
||||
403-17,9ed6f87e-90fe-432f-af40-7cd578a7596c,pending_review,rejected,2,0.9,e9bc7573-aafc-469c-af7a-600f3bdc0fcb,"תוספת קומה או קומות ותוספת שטחי בניה הן בגדר ""הרחבת זכויות הניצול"" כמשמעותן ברישא של סעיף 2 לתוספת השלישית לחוק התכנון והבניה, ואינן בגדר ""השבחה בדרך אחרת"" כאמו"
|
||||
403-17,f67f9717-d11a-4c18-8a8e-a7bd8c4cf474,pending_review,rejected,1,0.9,85c85ee3-6c2f-4493-81f5-677398f29c4c,"גישת ההשוואה היא השיטה המועדפת והיעילה ביותר לקביעת היטל השבחה, ועל השמאי לנמק מדוע בחר לסטות ממנה לטובת גישות אחרות, במיוחד באזורי ביקוש פעילים כשכונת רחביה בי"
|
||||
403-17,45d44c31-1568-402c-a474-9379cf904b3f,pending_review,approved,3,0.86,767d5248-c97a-430f-a602-7406f84893d6,"השמאי המכריע אינו כבול להסכמת הצדדים על שיטת שמאות מסוימת, ועליו לערוך את שומתו על-פי מיטב הבנתו המקצועית, גם אם הצדדים בחרו יחדיו בגישה אחרת."
|
||||
403-17,c3521c26-38a6-494c-bf93-30809c8554cb,pending_review,rejected,1,0.9,efefa5a8-175f-43da-a958-5cb1f533a0e6,"השומה הולכת אחר הדין — העקרונות הנורמטיביים נקבעים על ידי בית המשפט, ומהם נגזר החישוב השמאי. אין להפוך את היחס ולגזור את הדין מן השומה."
|
||||
403-17,ac80b87f-b75b-40a6-a4e8-0ff3d3918c1a,pending_review,rejected,0,0.0,4b4e4cbb-d6f6-4010-b943-398db5f363d1,"בעת בחינת ההשבחה בנכס הכולל עבירות בנייה, יש להתעלם מהשפעת עבירות הבנייה על ערכי השווי, וזאת בהתאם להלכה הפסוקה."
|
||||
403-17,d3fd1a9b-83d8-4599-8d24-f6bfa34d2bac,pending_review,rejected,2,0.9,186833fc-51bb-40b5-b316-904557d3d7e7,"נקודות ה""לפני ואחרי"" בשומת היטל השבחה אינן נקודות בזמן אלא במרחב התכנוני או בתהליך התכנוני — קרי, הערכת שווי המקרקעין לפני תחילת הליכי התכנון יוצרי ההשבחה לעומת"
|
||||
403-17,ccc4919f-5dac-4943-837d-0bbe2afef950,pending_review,rejected,2,0.825,ba5d0b5b-b471-43e9-9396-75c7a500709f,"בבואו של שמאי לנטרל את השפעתה של תכנית מסוימת לצורך קביעת השבחה, עליו לבחון בפועל את מידת השפעת השוק מכל אחת מהתכניות הרלוונטיות בנפרד; אין די בהנחה תיאורטית כי"
|
||||
403-17,4f97688e-d353-4bb3-86ad-ea59a2e79b9d,pending_review,rejected,2,0.85,a4627cf7-7860-4a61-b905-3969b8dd1085,"כאשר הוועדה המקומית חוזרת בהשגותיה בפני ועדת הערר על טענות שמאיות שכבר הוצגו בפני השמאים המכריעים ונדחו על ידי רובם, נדרשת ועדת הערר להכריע בטענות אלו לגופן ואי"
|
||||
403-17,5bcaffba-c6e4-4ca9-8814-384b206cd748,pending_review,rejected,2,0.825,f2e3f549-120d-4b6f-9d14-c687f2697fd6,"השוואת עליית מחירים בין שכונות לצורך שומת השבחה חייבת להביא בחשבון מאפיינים ייחודיים המשפיעים על הביקוש, ובכלל זה פופולריות בקרב תושבי חוץ; התעלמות ממאפיין כזה "
|
||||
403-17,94c26325-1290-4380-9ddb-6b511a8676be,pending_review,rejected,2,0.9,861608c4-3c79-488f-af58-4b3fe1dad51f,"כאשר שתי תכניות מקנות זכויות חופפות, השפעתן על שווי המקרקעין מתפצלת לדילמה בינארית: או שהתכנית הקודמת (תמ""א 38) כבר מיצתה את השפעת השוק — ואזי התכנית המאוחרת בע"
|
||||
403-17,a994e46a-1129-47f0-8b78-04d5ceb1996d,pending_review,approved,3,0.8433,b0ecc064-1ab5-4db8-9664-6513e3dc7b6d,"ההנחה השמאית כי תוספת זכויות בניה מעלה בהכרח את ערך המקרקעין מעוגנת בלשון סעיף 2(א) לתוספת השלישית (""בין מחמת הרחבתן של זכויות הניצול בהם""), אך אין מדובר באקסיו"
|
||||
403-17,c188846c-0dad-40ca-a6da-d3307d4c4d74,pending_review,rejected,2,0.9,95fcc437-632d-411d-87dd-49cee3840b61,"שווי מקרקעין לצורכי שומת השבחה נקבע לפי ערכו בשוק — קרי, הסכום שקונה מרצון מוכן לשלם בעדם — ולא על-פי תוספת זכויות תיאורטית הנגזרת ממודלים שמאיים מופשטים."
|
||||
403-17,7b10adb9-708b-4bab-9fca-f706b799503a,pending_review,rejected,3,0.84,9bfdfbf0-591d-4242-99c6-4fd14f02ec2f,"בעת אומדן שווי שוק של מקרקעין הכפופים לתכנית מאושרת המותנית במימוש מורכב (כגון גיבוש כלל בעלי הזכויות), יש להביא בחשבון את ההסתברות הריאלית למימוש התכנית, ובכלל"
|
||||
403-17,96dfa97d-3341-41b6-b4cd-6371bd042ef2,pending_review,rejected,1,0.9,5310a53f-ce69-44ab-97e1-9248079fe742,"על פי תקן מס' 2.0 של הוועדה לתקינה שמאית של מועצת שמאי המקרקעין (מרץ 2007), בנכסי מגורים גישת ההשוואה היא הגישה השמאית בעלת התוקף הגבוה ביותר, ויש להפעילה על מד"
|
||||
403-17,98bf14be-672f-48e0-8850-3c5fea6b8c3f,pending_review,rejected,2,0.9,e6b74bf5-efc0-430b-bda5-f1784ab814a6,"בגישת ההשוואה לצורך שומה, נתוני עסקאות בפועל יזכו ככלל ברמת תוקף גבוהה יותר מאשר מחירי היצע, ועל נתוני ההשוואה לעמוד בתנאי סף של מועד (לא יותר משנתיים מהמועד הק"
|
||||
403-17,0445c27d-9b69-4656-a8ad-78043b76348e,pending_review,rejected,2,0.875,1e704cfa-c97a-44a1-96ca-772055a59f1e,"אי הוודאות הגלומה בתכניות בנייה במרקמים מבונים מקבלת ביטוי בתמ""א 38 עצמה, אשר בסעיף 22 שלה כללה את ""כושר נשיאה של תשתיות"" כאחד השיקולים שעל הוועדה המקומית לשקול"
|
||||
403-17,d4b3b5fb-7030-4011-8a9e-e1a8a50ec093,pending_review,rejected,2,0.825,f377ea27-47df-45f7-97f1-5d98067b1580,"ריבוי בעלים במקרקעין במרקם מבונה הוא גורם המפחית את סיכויי מימוש זכויות הבניה, ויש להביאו בחשבון במסגרת הערכת ודאות הזכויות לצרכי שומה והכרעות תכנוניות."
|
||||
403-17,fff4148f-a023-40c6-b4a9-a8e73ffd4a41,pending_review,rejected,2,0.875,214adc7b-2106-4f17-addb-07354ae24ca0,הנטל להוכיח את ההשבחה הנובעת מתכנית מוטל על השמאי המבקש לקבוע אותה; שומה שאינה עומדת ברף ההוכחה הנדרש - גם בהתבוננות עצמאית בתכנית הנדונה ובלא תלות בתכניות מקבי
|
||||
403-17,56a36d11-d85c-4071-bf6b-a25a7fa569a8,pending_review,rejected,3,0.7767,364c8f72-58ac-49c0-ad3f-1b614365f11c,שיטה תחשיבית של בידוד השפעת תכנית באמצעות השוואת מחירי דירות לאורך ציר הזמן מול אזור ייחוס שעליו לא חלה התכנית סובלת מקושי מובנה — הטרוגניות המאפיינים הפיזיים ש
|
||||
403-17,5fcde79a-cf06-403d-9dba-e38091cd82d2,pending_review,rejected,2,0.85,e396ac3d-5ba6-43c2-afb9-863623339b0b,"בהערכת השבחה במקרקעין יש להביא בחשבון, כשיקול מפחית, הן את אי-הוודאות באשר למימוש הזכויות הנובעת מהוראות התכנית, והן את אי-הוודאות הנובעת מהמצב הקנייני והפיזי ש"
|
||||
403-17,9b373faa-df65-4df3-9188-9afc2a0a0b4a,pending_review,rejected,3,0.79,1048d7b1-8db4-4b9e-a0b7-aaf93578742b,"כאשר תכנית מקנה זכויות בנייה אך אחוזי המימוש בפועל נמוכים, על השומה לכלול מקדם הסתברות או אי-ודאות נפרד המשקף את המימושים הנמוכים הצפויים, וזאת מעבר למקדם הדחיי"
|
||||
403-17,fb13705a-54a5-4896-80b4-e509ff64cea3,pending_review,rejected,2,0.875,6b2e9e11-c662-49a8-9cd9-ed3e5b5e00b4,"גביית היטל השבחה מותנית בהוכחת התעשרות בעליל בערך השוק של המקרקעין; על המבקש להראות כי ""הקונה הסביר"" מייחס ערך כלכלי ממשי לתכנית המקימה את החיוב, ואין די בהנחות"
|
||||
403-17,c74a9838-efc5-4608-b86a-373e570e6364,pending_review,rejected,2,0.875,813a1b99-3eea-445b-beba-c4b5b4a9aae6,"כאשר זכויות הבעלות במקרקעין משותפות בידי בעלי זכויות שונים, שווי הנכס נמוך משווי הנכס בבעלות יחידנית ומלאה, וההפחתה נגזרת ממספר הבעלים, זכויותיהם בנכס, ייעודו, "
|
||||
403-17,353e1e0c-c5c2-44f8-8ddc-eafcff0c3fe1,pending_review,rejected,2,0.875,2a1e6c80-ee9f-49dc-be17-e54eacf9e692,בחינה שמאית של עליית הערך בעקבות תכנית התחדשות עירונית במרקם מבונה צריכה להביא בחשבון שני רכיבים נפרדים: רכיב שמקורו בתורת המימון (מקדם דחייה למימוש הזכויות) ור
|
||||
403-17,96216356-85cd-46d0-833b-93fd12e79f76,pending_review,rejected,2,0.9,4087495f-50d7-4145-b7f1-764f3ba36839,"אין לבסס שומת היטל השבחה על ספקולציות והשערות, אף אם הסיכוי לסטייה לטובת הנישום זהה לסיכוי לסטייה לטובת הרשות; סימטריה של חוסר ודאות אינה מכשירה הטלת מס."
|
||||
403-17,8024832f-852f-4aa5-8d94-2cba9a73f4b4,pending_review,rejected,3,0.8233,d82ffe4d-7a75-4b6b-9dbd-53c45226672e,"עקרון מס האמת — לפיו המס יוטל על רווח שמומש ולא על רווח שאינו קיים במציאות, תוך איזון בין אינטרס הציבור בגביית מס לבין זכות הפרט שהפגיעה בקניינו לא תחרוג מן המי"
|
||||
403-17,c31c1223-5c1a-410e-9b5a-6d225c5a5612,pending_review,rejected,3,0.79,8e20bee9-2f69-4105-85d3-98fe88ff0951,עמדת הועדה המקומית באשר לאופי הזכויות (קבועות אל מול צפות) חייבת להיות עקבית ואינה יכולה להישען על קיומו או היעדרו של פטור פרטני; כאשר עמדת הרשות ביחס לאופי הזכ
|
||||
10212/16,8e1620e3-4536-4b6c-81d9-68cef4743d44,pending_review,rejected,3,0.8833,a783dd4a-f728-4df1-83e2-f1630f78fd03,"כדי שפגיעה בפוטנציאל התכנוני של מקרקעין תעלה כדי ""פגיעה במקרקעין"" המקימה עילת פיצוי לפי סעיף 197 לחוק התכנון והבניה, עליה לעמוד בשני תנאים מצטברים, שהראשון בהם "
|
||||
10212/16,ffc7c613-02da-4973-848c-437d91df3227,pending_review,rejected,3,0.9167,d6096b47-d886-423a-ae8e-7fa9d6e7afbd,"סיכוי להרחבת אפשרויות הניצול של המקרקעין — למשל בדרך של שינוי ייעוד או הגדלת אחוזי בניה — נלקח בחשבון לעניין הפגיעה בפוטנציאל התכנוני רק אם אין הוא קלוש ורחוק, "
|
||||
10212/16,d6ad0f63-3339-4fc2-b35e-d2efd9057521,pending_review,rejected,3,0.86,c81809bb-08c7-41ce-b595-315843dbc3d4,"תכנית שמימושה סותם את הגולל על שינוי תכנוני צפוי שהיה מצמיח השבחה, מקיימת קשר סיבתי בינה לבין הפגיעה בפוטנציאל התכנוני של המקרקעין, ועל כן ניתן להגדירה כ""תכנית "
|
||||
10212/16,c1d05321-40b4-4e39-9484-f34918f11e66,pending_review,approved,3,0.9233,e35e45b7-d3f1-468b-b5ff-29f0dc529a8d,"לצורך הוכחת פגיעה בפוטנציאל תכנוני במסגרת תביעת פיצויים לפי סעיף 197, על התובע לעמוד בתנאי של 'ודאות קרובה' של הפוטנציאל התכנוני, הכולל שני יסודות מצטברים: ראשי"
|
||||
10212/16,802fd767-eb00-48b3-aa27-1041835b913f,pending_review,rejected,3,0.9,4d149074-e4d1-40c6-8078-4494e0bca4f7,"תנאי הסף המינימלי שבלעדיו אין להכרה בפוטנציאל תכנוני המקנה פיצוי לפי סעיף 197 הוא הגעת התכנית לשלב ההפקדה; שלב ההכנה, הקודם להפקדה, אינו מספיק לביסוס התביעה."
|
||||
10212/16,2576504c-6f08-4d2a-a9dc-06174026182a,pending_review,rejected,3,0.84,36df3e49-f536-477e-b5f1-e9df3cd8305c,"תכנית המצויה בשלב ההפקדה היא תכנית המיועדת באופן ברור לחול על הקרקע הרלוונטית; אף שהיא עשויה עוד להשתנות, במהלך הדברים הרגיל מדובר בשאלה של זמן עד שיחולו על השט"
|
||||
10212/16,4f1a446d-96ee-4628-bd30-aee51bcb5ff3,pending_review,rejected,3,0.8667,5bd9d0a2-208e-4df6-9735-f04871d0989c,"ההחלטה להפקיד תכנית היא בעלת משמעות והשלכות נורמטיביות וכלכליות כשלעצמה, והיא משקפת את עמדתו החיובית של מוסד התכנון ואת גמירות דעתו לאשר את התכנית בהיעדר התנגדו"
|
||||
10212/16,9081682c-32f3-4ea8-aafa-b620439f31f3,pending_review,rejected,3,0.9067,3bba67e6-61b8-4f40-a786-71e8d279723a,"הפקדתה של תכנית מבססת אצל הפרט ציפייה מוגבלת בלבד, הכפופה לסמכותו של מוסד התכנון להחליט בסופו של דבר שלא לאשר את התכנית או לאשרה בשינויים — בין לנוכח התנגדויות "
|
||||
10212/16,dbd54295-7f17-43b6-8c63-9330ff68f8a8,pending_review,rejected,3,0.84,4ae305ef-948e-4298-bee5-1d7710871eec,"כבר בשלב ההפקדה, ועוד טרם הגשת התנגדויות, מצויה התכנית המופקדת במידת בשלות גבוהה יחסית, וככלל היא ערוכה באופן וברמת הפירוט הנדרשים מתכנית תקפה."
|
||||
10212/16,bff5fd22-a7c2-4fca-81d1-19cd57366803,pending_review,rejected,3,0.8733,58deb30a-5692-4ff7-a3c8-48d96961ad27,"בבחינת טענת פוטנציאל תכנוני לצורך תביעת פיצויים, אין כלל גורף באשר לוודאות מימוש הפוטנציאל; כל מקרה נבחן לפי נסיבותיו תוך עריכת בחינה פרטנית של רמת הוודאות לאיש"
|
||||
10212/16,64a7c6e4-914e-41b3-8a3d-23fde029ce11,pending_review,rejected,3,0.8867,ed5832db-2762-43fc-84dd-0fa6b87502fd,שאלת ההתחשבות במחיר השוק כמשקף את הפוטנציאל התכנוני הכללי של הקרקע (שלב השווי) רלוונטית אך ורק במקרים שבהם כבר הוכחה פגיעה במקרקעין; הוכחת הפגיעה היא שלב מקדים
|
||||
10212/16,e90dbaf6-b24a-4125-99fd-ef0cb0c62483,pending_review,rejected,3,0.91,6b61034d-f6df-4859-90e2-da4ab33cbb80,תכנית עתידית/צפויה תובא בחשבון בהערכת שווי מקרקעין רק בהתקיים שני תנאים מצטברים – תנאי הקונקרטיות ותנאי הוודאות. תכנית שטרם הגיעה לשלב ההפקדה אינה מקיימת תנאים
|
||||
10212/16,bebd8ab2-5587-4053-8a6c-d2c740806bb1,pending_review,rejected,3,0.9167,d08351d1-3b8c-4693-a2d7-84e702877c79,"הפקדת תכנית, אף שאינה מקימה זכות לאישורה, יוצרת סבירות מספקת לאישורה המצדיקה את שלילת הזכות לפיצוי בגין שינוי שנעשה במקרקעין לאחר ההפקדה; פעולות בקרקע לאחר ההפק"
|
||||
10212/16,61483299-d9e0-4ebd-ae05-99ea88545a9a,pending_review,rejected,3,0.9167,e1695946-2ff4-45ed-a207-bae9b323459c,"פיצוי בגין פגיעה בפוטנציאל תכנוני אינו מוכר בטרם הגעת התכנית לשלב ההפקדה, משום שלפני שלב זה אין מתקיימים תנאי הקונקרטיות ותנאי הוודאות; הצבעה על תכנית מופקדת שי"
|
||||
10212/16,2fed9d7c-3a61-4e81-9c61-9e092be6df11,pending_review,rejected,3,0.8833,2fbf7206-bbd9-47c2-a51e-5ba00538b069,"בחישוב היקף ההשבחה לצורך היטל השבחה, ערך המקרקעין במצב הקודם (עובר לתכנון החדש) כולל גם את עליית השווי הנובעת מציפיות השוק לשינוי הייעוד, ולא רק את שווי הייעוד "
|
||||
10212/16,eda00dc3-8733-40dd-b9a9-32f6ecfe4c57,pending_review,rejected,3,0.9033,8e2eb3ca-3e01-4ff7-8f72-4cd7686ed59b,"בהערכת שווי מקרקעין יש להתחשב גם בפוטנציאל המקרקעין, באפשרויות הניצול הגלומות בהם ובציפייה לשינוי תכנוני, שכן אלה נתונים רלוונטיים לקביעת השווי."
|
||||
10212/16,ad7374c2-320b-4897-888b-7125c1cdbc27,pending_review,rejected,3,0.86,673d607f-15fe-46ad-851b-1dec18edcb47,"עליית ערך מקרקעין בשל פוטנציאל תכנוני אינה בהכרח פרי קידומה של תכנית קונקרטית בלבד, אלא עשויה לנבוע ממגוון גורמים — לרבות ציפיות והערכות כלליות יותר כגון מיקום "
|
||||
10212/16,9f8b808f-852c-40bb-ad37-371c827715f9,pending_review,rejected,3,0.9167,ab7f9dc4-d176-4ce9-821e-1fa4b4df0058,"בקביעת שווי השוק של מקרקעין לצורך חישוב היטל השבחה, אין להביא בחשבון, במצב הקודם לתוכנית המשביחה, את ציפיות השוק הקיימות כתוצאה מהליכי התכנון לאישורה; שיקולים ה"
|
||||
10212/16,ec2cf309-89c0-4888-9cc0-570b866506c1,pending_review,rejected,3,0.8733,ae3c45a8-9fbe-4451-966c-f94ef6496690,"בקביעת שווי השוק של מקרקעין נפגעים במצב שקדם לתוכנית הפוגעת, ניתן שלא להביא בחשבון נתון הרלוונטי מבחינה שמאית (כגון הפקעה עתידית ללא פיצוי) מקום שעקרונות יסוד ה"
|
||||
10212/16,b5456fed-723a-4a0a-a902-d8f13fdc3aa8,pending_review,rejected,3,0.8867,28c1f818-1cda-40c2-8f10-ff6759f5e86e,המשפט אינו מקנה הגנה מלאה על הציפייה לשימור ערכו של נכס או לעלייתו; הגנה ניתנת רק לציפייה הנחשבת לגיטימית או סבירה.
|
||||
10212/16,7f09f1ee-da6b-470f-97f5-d5cc5ffe38e5,pending_review,rejected,3,0.89,f6a3cfa0-87f6-4f2a-ba6c-1c55ad4c9221,"בהערכת שווי מקרקעין לצורכי פיצוי, אין ליתן משקל לציפיות לשינוי ייעוד שהשתקפו בעסקאות שנעשו באזור כאשר לא היה להן בסיס במצב התכנוני, שכן התחשבות שכזו תוביל להגנת"
|
||||
10212/16,f317e8d6-68cb-47d5-8f4b-afbc0df9f2b7,pending_review,rejected,3,0.8733,461a7802-ee2f-4476-86e1-2e1feae7c855,"כאשר קיימת עילת תביעה נפרדת לפי סעיף 197 (להבדיל מטענת אובדן פוטנציאל תכנוני), בעת עריכת השומה המעריכה את היקף הפגיעה יש מקום להתחשב בציפייה לשינוי תכנוני משביח"
|
||||
10212/16,9e6b80d2-fad7-4bc4-a170-fe91349ce7cd,pending_review,rejected,3,0.9167,aa117bf2-7058-4513-8470-86ac47e46dbd,"כדי לבסס ""פוטנציאל תכנוני"" המקים עילת תביעה עצמאית לפי סעיף 197 לחוק התכנון והבניה, על התובע להצביע על הליך תכנוני ממשי לשינוי ייעוד המקרקעין ערב כניסת התכנית ה"
|
||||
10212/16,fa19aa20-c868-4c8e-9641-9df15f2426e2,pending_review,rejected,3,0.9033,e6560c0d-f10a-4f5b-b7f5-20c2aaee329d,הרף המינימלי לביסוס טענה של אובדן פוטנציאל תכנוני המקימה עילת תביעה לפי סעיף 197 לחוק התכנון והבניה הוא הצבעה על תכנית מופקדת העונה הן על תנאי הקונקרטיות והן על
|
||||
10212/16,29f7da7a-4627-40c7-ba9c-510943d19a89,pending_review,rejected,3,0.86,74fb8654-f3e5-4bff-bea6-0be9504b0b66,קרבה לאזור בנוי או למקרקעין שייעודם שונה אינה יכולה כשלעצמה לבסס טענה לאובדן פוטנציאל תכנוני המקים עילת תביעה לפי סעיף 197 לחוק התכנון והבניה.
|
||||
10212/16,f5314cd3-2541-4c3d-9dba-661532c16d38,pending_review,rejected,3,0.91,6916d29d-7849-42ca-af64-a40fabff66ba,"בעריכת שומת פיצויים לפי סעיף 197 לחוק התכנון והבניה, פוטנציאל תכנוני עתידי יובא בחשבון לצורך הערכת שווי המקרקעין רק אם הוא קונקרטי וקרוב לוודאי, המתבטא לכל הפחו"
|
||||
10212/16,f5db53b6-d4a0-4b0f-a585-87597a68e35c,pending_review,rejected,3,0.9,c331e32c-2bc7-47df-8a5a-eeceeca40c06,עילת תביעה לפי סעיף 197 לחוק התכנון והבניה חייבת להתבסס על פגיעה ממשית הנובעת מהוראות התכנית עצמה — כגון שינוי ייעוד המקרקעין — ואין די בטענה לאובדן פוטנציאל תכ
|
||||
10212/16,eb551ef2-e2a3-4d27-ad35-0bfdeb08c0d1,pending_review,rejected,3,0.9033,2bf74c1e-bb9d-4f78-8d43-73a4d2308311,"תכנית אב שאין לה מעמד סטטוטורי, המצביעה לכל היותר על מגמה תכנונית בלבד, אינה מהווה הליך תכנוני פוזיטיבי ואינה יכולה לבסס טענה לפגיעה במקרקעין עקב אובדן פוטנציאל"
|
||||
10212/16,c03e3db1-7ba9-4dd7-bf03-575b1283b315,pending_review,rejected,3,0.8733,1c6c142c-d073-4cc1-a881-79f724ed8872,"לא ניתן לבסס טענה לאובדן פוטנציאל תכנוני, המקים עילת תביעה לפי סעיף 197 לחוק, על עובדות שאינן תכנוניות (כגון מפות או פרסומים נטולי מעמד תכנוני)."
|
||||
10212/16,9fa031c4-78f2-4d6c-be5d-4c729c745eba,pending_review,rejected,3,0.8733,e67edef1-d9dc-4e1e-959c-52ab42bf1eaf,עצם מיקומם של מקרקעין בצמוד לאזור בנוי או בסמוך למקרקעין בעלי ייעוד שונה אינו מבסס כשלעצמו טענה לאובדן פוטנציאל תכנוני המקים עילת תביעה לפי סעיף 197 לחוק.
|
||||
10212/16,eb7f723c-8303-45c3-8cdb-bc5ff20ce81f,pending_review,rejected,3,0.8833,a93a292f-a348-4e4a-a79d-2b0265dbe4f8,"לצורך עריכת שומה בתביעת פיצויים, ציפייה לשינוי ייעוד המקרקעין הנסמכת על סברות כלליות ועל הצהרות שונות של גורמים ברשות המקומית, בלא שהיא נתמכת בתכנית קונקרטית, א"
|
||||
10212/16,cbc059cb-b864-4428-9739-186f9531b66f,pending_review,rejected,3,0.86,76752343-4f20-4994-b0c9-c749094931fa,"אין להרחיב את עקרון מעשה בית הדין כך שיחול באופן חד-צדדי וטקטי כלפי הוועדה המקומית, מקום שאין זהות מלאה בין המקרים ושעה שהצדדים המבקשים להסתמך עליו לא ראו עצמם "
|
||||
10212/16,81c0ad5c-a3d7-4a2c-a518-e43a7587b147,pending_review,rejected,3,0.8733,903f5296-4325-419d-99f1-6698b35f37e0,"בקביעת שווי המקרקעין לצורך פיצויים לפי סעיף 197 לחוק התכנון והבניה, יש לנטרל מהשווי ציפיות לשינוי ייעוד הנובעות ממיקום המקרקעין בלבד (קרבה למרכז הארץ או לאזורים"
|
||||
10212/16,53135edb-7bb2-48f6-b52a-8bc242f23c0d,pending_review,rejected,3,0.89,922e69e5-1619-43be-9389-49465e2bed50,"ציפיות סובייקטיביות לשינוי ייעוד ולעלייה הנובעת ממנו בערך הקרקע אינן פסולות כשלעצמן, אך אין בהן כדי להקים חובת פיצוי מן הקופה הציבורית; תפקידו של המשפט הוא לקבו"
|
||||
10212/16,57fc8f79-2709-4096-b093-ac8898911177,pending_review,rejected,3,0.8833,8c9f86b6-86ae-4ece-87d5-a550af001ac7,"מנגנון הפיצוי לפי סעיף 197 לחוק התכנון והבניה הוא ייחודי וחורג מעבר לסוג הפגיעות שדיני ההפקעות הרגילים מפצים בגינן; משכך, אין לגזור את אופן חישוב הפיצוי או את ש"
|
||||
10212/16,629065d1-6a47-4084-a8e0-4cb2b3a7aded,pending_review,rejected,3,0.8833,de27fa3d-3458-4750-b7b4-ac5c127090cd,"השומה הולכת אחרי הדין: העקרונות הנורמטיביים לחישוב הפיצוי נקבעים על ידי בית המשפט, ומהם נגזר החישוב השמאי. כאשר גבולות הפיצוי נקבעים על ידי הדין, הפיצוי יוענק ב"
|
||||
10212/16,4e7cadb4-51f2-4f23-bc13-2fddbcee2162,pending_review,rejected,3,0.9,90f2394f-aa70-4357-85f7-9e37c782605f,פיצויים לפי סעיף 197 לחוק התכנון והבניה משולמים אך ורק בגין פגיעה במקרקעין הנגרמת 'עקב תכנית'; זהו עקרון יסוד שאין לחרוג ממנו גם בעת אימוץ גישה המרחיבה את היקף
|
||||
10212/16,87f7a3db-c0a3-4d21-b470-b2024784c8e7,pending_review,rejected,3,0.9067,a163c879-80ad-4723-bda0-824c1af2f44f,"סעיף 197 לחוק התכנון והבניה אינו יוצר משטר פיצויים מוחלט אלא משטר יחסי, שבבסיסו איזון בין ההגנה על קניין הפרט לבין האינטרסים הציבוריים המגוונים שהתכנון נועד להג"
|
||||
10212/16,f08bfedf-92c3-4170-9176-63914579cbe8,pending_review,rejected,3,0.8867,9a598711-1a88-430b-a309-f4fb244d7638,"כאשר גבולות הפיצוי נקבעים על ידי הדין, הפיצוי מוענק בסייגים שקובע הדין ולא בהכרח כפועל יוצא של מחיר השוק; בניגוד להפקעה ולהיטל השבחה — שבהם מחיר השוק הוא נקודת "
|
||||
10212/16,83ce0db7-639d-47a5-ae60-c40101bf9f84,pending_review,rejected,3,0.9067,704e2918-4882-4ff8-929f-c97f51461e78,"הפיצוי לפי סעיף 197 לחוק התכנון והבניה נועד לכסות את הפגיעה שנגרמה למקרקעין על ידי התכנית הפוגעת בלבד, ולא להבטיח לבעל הקרקע את מלוא שווי השוק; אם הפיצוי הסטטוט"
|
||||
10212/16,1439e17a-239c-4554-9694-8b85f6263d26,pending_review,rejected,3,0.9,bc1fa085-2eed-4c21-9cd1-d623f8493cc8,"ציפיות של בעל מקרקעין לשינוי תכנוני עתידי שאין לו ביטוי בתכנית הסטטוטורית אינן בנות-פיצוי לפי סעיף 197, גם אם ציפיות אלה משתקפות במחיר השוק של הקרקע; אין מקום ש"
|
||||
10212/16,d9fe4ba7-e42b-4d9e-890f-a5f4d21eee2c,pending_review,rejected,3,0.9167,597186ff-0fb0-464f-ae14-67b633d624d7,קיומו של קשר סיבתי בין כניסתה לתוקף של תכנית לבין ירידת ערך המקרקעין אינו מספיק כשלעצמו לזכאות לפיצוי לפי סעיף 197; נדרש שירידת הערך תנבע מפגיעה בתכונותיהם המקר
|
||||
10212/16,67ca816e-3577-4fff-b5ea-11ee67b66fe5,pending_review,rejected,3,0.89,1e4f8725-b9a4-423f-bffc-b7abba448028,"השאלה מי זכאי לפיצוי בגין פגיעה תכנונית (""שאלת הפגיעה"") והשאלה מהו היקף הפיצוי שיינתן בגין אותה פגיעה (""שאלת השווי"") הן שתי שאלות משפטיות נפרדות ועצמאיות; ההכרע"
|
||||
10212/16,285c59c9-f14d-41e5-a6cc-837d7c81b212,pending_review,rejected,3,0.89,e71d961e-25b7-4ecb-a03b-f26e7f795259,"בית המשפט יצמצם את הכרעתו לשאלה הדרושה להכרעה בהליך שלפניו, ויימנע מלטעת מסמרות בשאלה משפטית נכבדה שאינה נדרשת להכרעה — ובפרט כאשר אותה שאלה תלויה ועומדת בהליכי"
|
||||
10212/16,e2ee600f-911e-4519-9031-47af2a4cbf68,pending_review,approved,3,0.9233,9c378df8-c188-47f4-89a1-2236e8d05f35,"הפיצוי לפי סעיף 197 לחוק התכנון והבניה הוא פיצוי תרופתי שתכליתו להעמיד את בעל המקרקעין מבחינה כלכלית במצב בו היה אלמלא הפגיעה התכנונית, דהיינו לפצותו על מלוא הנ"
|
||||
10212/16,4568ffac-1bce-4a16-8a62-f7e6801a13bc,pending_review,approved,3,0.9233,e1fa231d-f188-4859-82c2-d842cbad5ff9,שיעור הפגיעה במקרקעין לצורך פיצוי לפי סעיף 197 נקבע בדרך של השוואת ערך המקרקעין לפני אישור התכנית הפוגעת לערכם לאחר אישורה.
|
||||
10212/16,087d39b7-2878-416a-aa23-6b4027397f53,pending_review,approved,3,0.9233,4c7f877d-8ed0-4e37-b8a3-b23b8b173d00,"הדרך לאמוד פיצוי בגין פגיעה תכנונית לפי סעיף 197 לחוק התכנון והבניה היא באמצעות הירידה שחלה בשווי השוק של המקרקעין בעקבות הפגיעה התכנונית, קרי חישוב ההפרש שבין "
|
||||
10212/16,10de241a-012d-496a-b16b-a225bb666071,pending_review,rejected,3,0.9233,4f892f3a-f946-47ea-8ccf-4ae01d8f5ef2,"התובע פיצוי לפי סעיף 197 נושא בנטל להוכיח קיומו של קשר סיבתי, ועליו להראות כי התכנית הפוגעת היא שגרמה לגריעת שווי השוק של המקרקעין לעומת השווי שהיה להם, או שעשו"
|
||||
10212/16,c6565f3e-b61b-48f5-94dc-8832d1268879,pending_review,rejected,3,0.9233,9ebad68d-34a5-45ae-b90b-8727af0cf4dd,"פיצויי הנטילה השלטונית נמדדים על-פי עקרון השבת המצב לקדמותו: יש להעמיד את הנפקע במצב שבו היה אלמלא הפגיעה, כך שבכספי הפיצוי יוכל לרכוש מחדש זכות דומה לזו שניטלה"
|
||||
10212/16,e9db8060-6b77-4e08-a168-c203604446dc,pending_review,rejected,2,0.86,bed8dd33-da1a-4550-aa59-bd9d4a3c9c27,"סעיף 197 לחוק התכנון והבניה הוא חלק מדיני הנטילה השלטונית, המאפשרים לרשויות התכנון לפגוע בזכויות קנייניות של בעלי מקרקעין פרטיים ללא הסכמתם תוך חובת פיצוי."
|
||||
10212/16,671d5b75-cd29-468a-bc56-38ff282f29a3,pending_review,rejected,3,0.9,7c88298d-193a-4a5c-b13c-8e35b15a436d,"במסגרת דיני הנטילה השלטונית הפיצוי לבעל הנכס נקבע על פי הנזק שנגרם לו בעקבות האקט השלטוני, ולא על פי קריטריונים חילופיים כגון ההתעשרות שהפיקה הרשות מן הנטילה."
|
||||
10212/16,c2573b39-1f47-41e3-9e65-810aafd0c6bd,pending_review,rejected,3,0.8833,4d2e0d6f-4ab8-4de9-8638-e9af0a0674f0,"אחת מתכליותיהם של דיני הנטילה השלטונית, ובכללם הזכות לפיצוי בגין פגיעה תכנונית, היא להביא להפנמת מלוא עלויות פעולת הרשות על ידה; אי-הפנמת העלויות (החצנתן) מטילה"
|
||||
10212/16,051704f7-c055-47d9-9ea9-a7a0e8a335ee,pending_review,rejected,3,0.9233,61af3e15-9003-4b45-bd75-b1995d659182,ירידת ערך המקרקעין בעקבות תוכנית פוגעת נמדדת באופן אובייקטיבי — לפי טיבם של המקרקעין ולא לפי זהותם או מאפייניהם האישיים של בעליהם.
|
||||
10212/16,6a90da20-b246-4702-b9cf-731a9eefec8f,pending_review,rejected,3,0.8,6ce4eb7e-9a2c-4658-be81-a04db0434e1d,"חובת הפיצוי מחייבת את הרשות התכנונית לשקלל מראש בתקציבה את סכומי הפיצוי שתידרש לשלם לבעלי מקרקעין שזכויותיהם ייפגעו מתוכנית, ואת אופן נשיאתה בהם — בין בפיצוי כס"
|
||||
10212/16,6afc5f04-c986-4dc3-86b1-b3ce5f1aab48,pending_review,rejected,3,0.8833,82dea662-ad88-4e94-9ee6-fc2b35fa1ab4,"הזכות לפיצוי בגין פגיעה תכנונית מוגבלת משיקולי יעילות, ואינה משתרעת על נפגעים שפגיעתם שולית, שכן פגיעה כזו אינה מצדיקה את העלויות האדמיניסטרטיביות הכרוכות בהפעל"
|
||||
10212/16,8add4347-6a09-48c4-b4cd-89037ae27b72,pending_review,rejected,3,0.8833,d4dcd9ac-5d4e-4040-a40c-dd7b74748e41,"הדרך המקובלת לקביעת שווי השוק של מקרקעין היא שיטת ההשוואה (שיטת שווי השוק), שלפיה נאמד שווי הנכס באמצעות עסקאות השוואה שבהן נבחן המחיר ששולם בעבור נכסים דומים ב"
|
||||
10212/16,1d077799-19d2-4de8-9a60-e94c3660fddb,pending_review,rejected,3,0.86,6ec1a4f1-f0d6-42ef-9736-011f8ba01f67,"שיטת שווי השוק מביאה בחשבון את מכלול מאפייני הנכס, ובכללם מאפיינים שאין להם עיגון סטטוטורי ואינם משקפים בהכרח זכויות משפטיות המוקנות לבעל המקרקעין מכוח תוכנית מ"
|
||||
10212/16,531ad70a-e5ef-4ba2-a2d8-2a3e1b10f9a7,pending_review,rejected,3,0.8067,ff3275fd-49a8-4eb0-b66f-96cdcfaf5f78,"בחינת ירידת הערך — ההפרש בין שווי המקרקעין עובר לתוכנית הפוגעת לבין שוויים לאחריה — תיערך על ידי שמאי מקרקעין, שהוא המומחה ובעל הידע הרלוונטי לעניין."
|
||||
10212/16,42289bc0-656a-45e2-8278-350172c9143f,pending_review,rejected,3,0.8867,c23d0925-0324-4187-86ba-1a7b66274da3,"פוטנציאל תכנוני של מקרקעין, לרבות ציפיות תכנוניות, מהווה רכיב שיש להתחשב בו בקביעת שווי המקרקעין לצורך השומה."
|
||||
10212/16,26d825c3-f47a-4aa7-99c0-9ff76462c98d,pending_review,rejected,3,0.9033,8ab4225e-6d1b-490d-bb61-1e73172568ca,"פיצויים בגין פגיעה תכנונית לפי סעיף 197 לחוק התכנון והבניה נאמדים על פי הפער שבין שווי השוק של המקרקעין ערב הפגיעה התכנונית לבין שווי השוק שלהם לאחר הפגיעה, ושי"
|
||||
10212/16,cd384be8-84ea-4d78-b578-51c269596410,pending_review,rejected,3,0.8833,63678f78-3df0-454b-91ef-3dbb71330ece,"ציפיות כלליות לשינוי ייעוד הן אחד ממאפייני המקרקעין, אשר אף שפגיעה בהם כשלעצמה אינה מהווה פגיעה תכנונית בת-פיצוי, הם מובאים בחשבון כרכיב ערכי בעת קביעת שיעור הפ"
|
||||
10212/16,9f9e34b0-6383-421f-add6-185d5ef53b66,pending_review,rejected,2,0.81,a91f5f79-aba8-448e-9360-85dba91088ef,"פגיעה בשווי מקרקעין הנובעת מתוכנית שאינה חלה על המקרקעין הצמודים אינה מקימה זכות לפיצוי לפי סעיף 197 לחוק התכנון והבניה, משום שאין מדובר ב'פגיעה תכנונית' של המק"
|
||||
10212/16,0110332a-e516-451b-8fc9-2fc92a50bd19,pending_review,rejected,3,0.9,2088b373-c6a6-4c46-bbef-5204b20d3680,"עליית שווי הנובעת מציפיות קונקרטיות למהלך התכנוני שבמסגרתו בוצעה הפגיעה התכנונית יש לנטרל מהערכת השווי השמאית, משום שבעל הקרקע זכאי לפיצוי בגין הנזק שנגרם לו מן"
|
||||
10212/16,cda6bad3-dab6-4de8-96a7-dc2703db32c0,pending_review,rejected,3,0.9,74164e5e-f015-4e05-937a-52e2b73ab0fa,"מאפיין של המקרקעין הרלוונטי מבחינת השוק ומשפיע כפועל יוצא על שומת המקרקעין הוא מאפיין שיש להתחשב בו בעריכת השומה, אלא אם קיימים שיקולים נורמטיביים אחרים המצדיקי"
|
||||
10212/16,a5c39bfe-d00e-4f84-a634-41e8573abfea,pending_review,rejected,3,0.84,b182ec09-1785-4db1-aa78-1c8288158a2c,"כללי הפיצוי המקובלים נועדו להבטיח שבעל המקרקעין לא ייפגע עקב התוכנית הפוגעת, במובן שבאפשרותו לרכוש בכספי הפיצויים נכס חלופי זהה לזה שהיה ברשותו עובר לתוכנית הפו"
|
||||
10212/16,555d9b62-c42b-4a5c-82c1-593991d9550e,pending_review,rejected,3,0.8833,739f454f-277d-41f3-96a1-0789b43fb9ad,"פיצוי לפי סעיף 197 לחוק התכנון והבניה נועד להשיב את המצב לקדמותו, ועל כן יש למודדו באופן המביא בחשבון את מיקום המקרקעין ואת הפוטנציאל התכנוני הטמון בהם, ולא להס"
|
||||
10212/16,d29f0da8-45a1-46ba-b964-b25f9326d700,pending_review,rejected,3,0.8733,8564aad6-e2bc-4041-b568-57451abb9005,דרך חישוב הפיצוי לפי סעיף 197 לחוק התכנון והבניה צריכה ליצור אחידות בין הפיצוי הכולל המשולם לפי דיני התכנון והבניה לבין הפיצוי הכולל המשולם לפי דיני הנטילה השלט
|
||||
10212/16,1166e324-54f0-4eff-a443-49dae4151cd1,pending_review,rejected,2,0.9,59dc98ed-6865-464c-a2ca-bc3ce537a5cd,"עליית שווי המקרקעין הנובעת מציפיות קונקרטיות לאותו מהלך תכנוני שבמסגרתו בוצעה הפגיעה התכנונית, יש לנטרלה מהערכת השווי השמאית לצורך חישוב הפיצוי."
|
||||
10212/16,34fe5b88-c9db-46d8-97ca-e4e3a192af69,pending_review,rejected,3,0.8767,31dc17bd-0093-4f2d-8d9f-cdf41e05d787,"שיטת חישוב הפיצוי וההשבחה בדיני הנטילה השלטונית (היטל השבחה, פיצויי סעיף 197, רכישה) צריכה להיות אחידה ומבוססת על שווי השוק של המקרקעין; אין לשנות את שיטת החישו"
|
||||
10212/16,b8c1f2e3-1d26-42b9-ae9b-85f9e715222e,pending_review,approved,3,0.9333,c25b1490-65a6-4878-baaf-7c6b1c6ed6e3,"הפיצוי בגין פגיעה תכנונית לפי סעיף 197 נקבע כהפרש שבין שווי השוק של המקרקעין לפני אישור התכנית הפוגעת לבין שוויים לאחריה, כאשר שווי השוק בכל נקודת זמן מביא בחשב"
|
||||
10212/16,83518d72-f514-46b9-b5d7-6d9f3d8f1864,pending_review,rejected,3,0.89,8f9c6fb8-d4b3-450a-8023-560ce841ca52,"ערך המקרקעין בכל אחת מנקודות הזמן הרלוונטיות לחישוב הפיצוי נקבע על פי שווי השוק של המקרקעין, ולא לפי ערך מנוכה."
|
||||
10212/16,de52b9f4-fccd-474e-898b-2776228768e8,pending_review,rejected,3,0.91,8bfa0762-f4c3-4319-a97b-09d3fa360fe9,"יש להבחין בין מישור העילה — השאלה ""מהי פגיעה תכנונית?"" — לבין מישור הסעד — השאלה ""מהו הפיצוי בגין פגיעה תכנונית?"". בין שני מישורים אלה אין צורך שתתקיים אחידות, "
|
||||
10212/16,a4c0e918-dbe6-43d1-824c-70a01c989686,pending_review,rejected,3,0.86,f565c9a8-7f76-46a9-8d32-ddeb48c9d145,פגיעה תכנונית מתרחשת כאשר יש גריעה ממצב תכנוני קיים.
|
||||
10212/16,8e67a952-e1e3-4900-878f-b2230bf17104,pending_review,rejected,3,0.9,6f72a9e1-75b6-4dda-9fd4-37f60fc25ac9,"""רשת הביטחון"" שמעניק סעיף 197 לחוק התכנון והבניה מגנה על בעל המקרקעין אך ורק מפני אובדן הערך הכלכלי שהיה בידיו במועד שינוי הייעוד, ואין בה כדי להעניק לו את הערך"
|
||||
10212/16,6f5abdb1-1aa4-4a85-b57e-bf6b02cd6d7d,pending_review,rejected,3,0.8733,16febf97-9026-4837-ba18-fb94662da1f8,"ציפיות השוק לשינוי ייעוד אינן עשויות מקשה אחת אלא בנויות על רצף: ככל שהציפייה מעוגנת בתוכנית קונקרטית יותר וקרובה לוודאי, כך עולה הערך הכלכלי שהשוק מייחס לה. שו"
|
||||
10212/16,4b238a4d-416e-4d00-829a-97d5aa19d3c7,pending_review,rejected,3,0.9033,e052dd05-5271-443a-ac5b-d68fcef3e16f,"במסגרת פיצויים לפי סעיף 197 לחוק התכנון והבניה, הרשות אינה נדרשת לפצות את בעל המקרקעין על הרווח שהתכנית הפוגעת עשויה הייתה להקנות לו, אלא אך ורק על ההפסד שנגרם "
|
||||
10212/16,f08f306c-1292-4e0d-8e41-2c40e0a0ebe5,pending_review,rejected,3,0.8733,31489d28-3421-4ba7-b747-acb56a22fcaa,"שווי ציפייה לשינוי ייעוד נמדד בהתאם לטיבה: ציפייה המעוגנת בתוכנית קונקרטית אינה שווה בערכּהּ לציפייה כללית, והסיכוי להתממשותה כמו גם הסיכון הגלום בה מתומחרים לפ"
|
||||
10212/16,c69c58ad-d545-4150-b794-d331c179f9e5,pending_review,rejected,3,0.8867,e9516fe6-63cb-463b-aec1-a8ecce1439ee,"ציפיות המשפיעות על מחיר השוק אך אינן מבוססות על מידע רלוונטי הנגיש לבעלי העניין, או העומדות בסתירה למידע כאמור, הן ציפיות ספקולטיביות גרידא, ועל השמאי לנכותן ממ"
|
||||
10212/16,6680b8b0-18dc-4e7d-80e4-90eda963b92d,pending_review,rejected,3,0.8833,61136c31-d66a-41df-a996-2cdfe0f0ffd8,"שווי השוק של נכס משקף את מצרף העדפותיהם של ציבור הקונים והמוכרים, ובכללן את ציפיותיהם לתשואה עתידית; משכך, ציפיות אלה הן מאפיין שיש לשקללו כעניין שבשגרה בקביעת "
|
||||
10212/16,f9026814-83b1-426a-9534-4cfd9b5f688e,pending_review,rejected,3,0.8833,836ca34d-0a37-4c11-9bf0-3f9578ddbaea,"הפוטנציאל התכנוני של מקרקעין הוא אחד המאפיינים המשפיעים על מחיר השוק שלהם, ואין הצדקה נורמטיבית להתעלם ממאפיין זה בעת קביעת הפיצוי בגין פגיעה תכנונית לפי סעיף 1"
|
||||
|
38
data/audit/principle-cull-dryrun-20260619T110839Z.csv
Normal file
38
data/audit/principle-cull-dryrun-20260619T110839Z.csv
Normal file
@@ -0,0 +1,38 @@
|
||||
case_number,halacha_id,old_status,final_verdict,votes,score,canonical_id,rule
|
||||
30692-03-23,5dbeb6d1-33e7-450c-812f-35650d0a70c2,approved,approved,3,0.9233,07694375-d6c4-4caa-b808-b5d3375f2f6e,נטילת זכויות במקרקעין על ידי הרשות במסגרת תכנית איחוד וחלוקה אינה מכריעה כשלעצמה את שאלת תחולת דיני ההפקעה: העובדה שהזכויות נרכשו במסגרת תכנית איחוד וחלוקה אינה
|
||||
30692-03-23,700ed8aa-6b4c-4749-aea8-36dc761e0d04,pending_review,rejected,3,0.8733,47adf7d4-d705-4893-9e0a-549d67289e4e,"כאשר עתירה מנהלית התוקפת אישור תכנית ורישום זכויות מוגשת בשיהוי ניכר, אי-הבהירות הראייתית שנותרה ביחס לנסיבות אישור התכנית וביצועה ולידיעת בעל הזכויות במועד האי"
|
||||
30692-03-23,da7fc8f1-196b-4a32-a473-c71ec157a63a,pending_review,approved,3,0.9,f87c952b-29a3-47eb-af80-6f17b8c13804,"השאלה אם העברת קרקע לרשות במסגרת תכנית איחוד וחלוקה שקולה להפקעה תלויה בנסיבות כל מקרה ומקרה, והמבחן העיקרי הוא אם מדובר בהעברה רצונית או כפויה: על העברה רצונית"
|
||||
30692-03-23,6ecaa5ad-5c43-45a5-8921-618b1c4ac1c5,pending_review,rejected,3,0.7567,7429db26-56d4-440b-82d0-e693d77ce3f0,"הסכמה של בעל זכויות במקרקעין לתכנית הכוללת שטח שלגביו פורסמה הודעת הפקעה, הניתנת שנים ספורות לאחר הודעת ההפקעה, נגועה על פניה במידה מסוימת של כפייה, ואין לראותה"
|
||||
30692-03-23,0a51cdfc-e9ba-4ae2-b6f5-9ce104dce969,pending_review,rejected,3,0.8733,b2aa1493-f081-4abe-8a39-b112c1eed3d2,"זהות יוזם תכנית איחוד וחלוקה היא אינדיקציה רלוונטית לשאלה אם צמחה לבעל הזכויות טובת הנאה מן התכנית: יוזמה של הרשות מלמדת כי לבעלים לא היה אינטרס בתכנית, ואילו י"
|
||||
30692-03-23,dff14703-95bb-4ceb-a5b8-1c6fdc961b67,pending_review,approved,3,0.9033,5fcf8cd3-728b-4adc-8ac6-76f3aef441d1,"קיומה של ""השבחה"" או תמורה המנטרלת את אלמנט הכפייתיות שבהעברת זכויות נמדד ביחס למכלול זכויות הבעלים קודם להעברה (גודל החלקה המקורית בצירוף זכויות הבנייה), ולא בי"
|
||||
30692-03-23,4ef7f379-85c2-4d34-afcf-4a326953ea44,pending_review,rejected,3,0.87,9168c090-859f-46cc-b77e-2e636da4abb0,"מקום שבו צמחה לבעל הזכויות טובת הנאה מתכנית איחוד וחלוקה בהשוואה למצב הקודם — כגון הגדלת זכויות הבנייה היחסיות על החלקה החדשה — מהווה הדבר תמורה, ולו חלקית, המו"
|
||||
30692-03-23,3f3f32c8-d5b6-494d-ad8e-ffa5777459a2,approved,approved,3,0.8933,84bcef42-955b-41d4-aee1-5299e0927984,"תביעה המבוססת על חוק התכנון והבניה אינה חסינה מהתיישנות; דיני ההתיישנות הכלליים, ובכללם סעיף 5(2) לחוק ההתיישנות (התיישנות תביעה במקרקעין כעבור חמש-עשרה שנה, וב"
|
||||
30692-03-23,645ee998-af71-4eaf-8466-12cd1be0dca9,pending_review,approved,3,0.9067,69245721-23f8-4306-a01f-d0687e092c10,"זכות הקדימה הקבועה בסעיף 195(2) לחוק התכנון והבניה מותנית בהתקיימות שני תנאים מצטברים: שינוי ייעוד המקרקעין על פי הוראות החוק, וכוונה של הרשות למכור, להשכיר או "
|
||||
1180-11-25,703234bc-3a2a-485e-8a81-7479a7940121,approved,approved,2,0.9,93140a7d-29e1-4b49-bfa4-c13edd505e10,"זכות הערר מכוח סעיף 152(א)(1) לחוק התכנון והבנייה מוגבלת למקרים שפורטו בהוראת החוק בלבד, ובכל הנוגע למתנגדים היא קמה אך ורק כנגד החלטה הדוחה התנגדות שהוגשה לפי "
|
||||
1180-11-25,90153db2-2dd2-4cd9-b242-c895937edc76,approved,rejected,1,0.95,23a6c195-86a5-4b3c-b99d-7e8066dd3cdb,"סמכותם של מוסדות התכנון מוגבלת לשאלות תכנוניות בלבד, ואין הם מוסמכים להכריע לגופן בשאלות קנייניות; שיקולי רשות הרישוי מוגבלים לשיקולים תכנוניים הנובעים מהוראות "
|
||||
1180-11-25,81c40339-6409-4896-8ca7-bb26d1d0fa74,approved,rejected,3,0.8067,034ec357-6b34-4f7c-b470-3bb8f9287a4f,"על הועדה המקומית מוטלת חובה לוודא, ברמת שכנוע מנהלית מספקת, כי מבקש ההיתר הוא בעל זכות קניינית במקרקעין או מי שקיבל הסכמה לכך מבעל זכות; חובה זו, להבדיל מבחינת "
|
||||
1180-11-25,6052c22f-edc3-42fd-b469-ac126d8204ad,approved,approved,2,0.9,741352b5-f84e-48b4-8318-fa5228a32379,העובדה כשלעצמה שבקשה להיתר נעדרת תימוכין קנייניים אינה מקימה זכות ערר למתנגד לאותה בקשה. אף שלבעל זכות במקרקעין נתונה זכות להגיש לוועדה המקומית התנגדות קניינית
|
||||
1180-11-25,530b6c53-d65c-42fe-82b6-f554ea189414,approved,approved,2,0.9,803b4aa0-b0e7-40b0-8cbe-94d0eafb690d,"בהיעדר הסכמת כל בעלי הזכויות במקרקעין, רשות הרישוי רשאית — אך אינה חייבת — לבחון בטרם דיון בבקשה להיתר את ההיתכנות הקניינית העתידית למימוש ההיתר; בחינה כזו אינה"
|
||||
1180-11-25,036c9723-960a-4259-bf2c-0e9963c1f607,approved,approved,2,0.9,e6edf916-1689-481b-b612-7b20b596528c,"אין חובה על מבקש היתר לנצל את מלוא זכויות הבנייה העומדות לרשותו, ואי-ניצול מלוא הזכויות אינו מהווה סטייה מתכנית."
|
||||
1180-11-25,3e63fb0d-ebb7-4725-bdbd-8b12a3348c9d,approved,rejected,2,0.875,ac57a30d-0d19-478c-a92b-89bf7587215b,"נספח אדריכלות שצוין בדברי ההסבר לתכנית כמסמך רקע מהווה חלק בלתי נפרד מהתכנית המאושרת, ובקשה להיתר התואמת אותו אינה סוטה מן התכנית."
|
||||
1180-11-25,1bc60510-fb30-4164-b86f-360217941d39,approved,approved,2,0.9,fa1d636e-8fd2-4abb-a3d6-674a3b123950,"השגה התוקפת בפועל את תוכן התכנית המאושרת עצמה אינה טענת סטייה מתכנית, ולוועדת הערר אין סמכות לבטל או לשנות תכנית שקיבלה תוקף ומהווה דין; תקיפת התכנית כפופה למוע"
|
||||
1180-11-25,25335115-a813-4bf5-a98e-3b96f72e4a52,approved,rejected,2,0.875,c42fc939-ed1f-4996-bfe8-c2ea8b22e221,"סמכות ועדת הערר מתרחבת, מעבר למקרים המנויים בסעיף 152(א)(3), גם למקרה שבו מתנגד למתן היתר טוען כי ההיתר סוטה מתכנית; או-אז תבחן הוועדה את הטענה — מצאה כי ההיתר "
|
||||
1180-11-25,9d47a95d-c353-4ba0-8a4e-aa4f19b7ef7b,approved,rejected,2,0.9,a827b105-c763-49c0-a653-d9ef83e1f13f,"בביקורת שיפוטית (וערעורית) על החלטת רשות רישוי בנוגע ל""תימוכין קנייניים"" של מבקש ההיתר, השאלה אינה האם קיימת למבקש זכות קניינית, אלא האם החלטת הרשות חורגת ממתחם"
|
||||
1180-11-25,cab09e0d-b022-4baf-a42c-eb5c9a13f246,approved,rejected,2,0.9,4b240b59-0aed-405f-ad62-a37b3e1ffd74,"ההלכה בעניין טליאט, לפיה רשות רישוי רשאית להסתפק בהסכמת 75% מבעלי הדירות בבית משותף כראיה לתימוכין קנייניים, מקנה לרשות רשות (אפשרות) ולא חובה; הרשות אינה מחויב"
|
||||
1180-11-25,fa6ee6fe-d1e1-4ae7-afef-cdc380352b8a,approved,rejected,1,0.8,88139575-c74a-42e4-91af-44e5d8a98072,"החלטת רשות הרישוי לדון בבקשה להיתר נתונה לשיקול דעת רחב התלוי בנסיבות הקונקרטיות של כל מקרה, ומתחם הסבירות עשוי לכלול החלטות לכאן ולכאן; אין בהתערבות בית המשפט "
|
||||
1180-11-25,0ac77570-164c-4e39-b4df-8b41b03e8fb9,approved,rejected,1,0.9,09dc328c-c45e-4b50-81ca-6b07c843e95f,החלטה לאשר בקשה להיתר בנייה ניתנת במישור התכנוני בלבד; אין היא מהווה אישור לפי חוק המקרקעין ואין בה כדי לגרוע מהוראותיו.
|
||||
1180-11-25,301bce3c-315c-4152-acea-717edc851710,approved,rejected,2,0.825,199cf0ba-f73c-4dc8-9366-1ff167ee9f72,"כאשר קיים סיכוי סביר שהיתר תואם-תכנית יוכל להתממש — לרבות בשל קיומו של הרוב הדרוש לפי חוק המקרקעין להרחבת דירה — אין בקיום הדיון התכנוני בבקשה משום ""השחתת זמנה"""
|
||||
1180-11-25,4531c9ff-c554-4370-b942-eca08108c8fa,approved,rejected,2,0.9,2c207edb-e403-4cce-bee7-cc8e7a503486,"ועדת הערר אינה מוסמכת לדון בטענות קנייניות, ובכלל זה טענות שלגביהן קיימת מחלוקת כנה בין הצדדים וטענות בדבר חזרה מהסכמה שניתנה לקידום בקשה להיתר; בעל טענה כאמור "
|
||||
1180-11-25,c5bb7a0c-a7fc-42e4-8511-599f5e25917e,approved,rejected,2,0.9,58724b98-31f9-46d9-be24-eeb48c0e9e7d,זכות הערר מכוח סעיף 152(א)(1) לחוק התכנון והבנייה קמה רק כאשר הבקשה להיתר כוללת הקלה או מהווה סטייה מתכנית; בקשה שאושרה כתואמת תכנית ואינה כוללת הקלה אינה מקנה
|
||||
42288-03-24,45fe34c9-0983-4a33-bdd1-88afc8c6bcfb,approved,approved,3,0.9333,6b1d0d8e-cd89-4bce-a7d5-d75ea0c4eaed,"הביקורת השיפוטית על החלטות מוסדות התכנון מתמקדת בבחינת חוקיות ההליכים ודרכי קבלת ההחלטה, ואינה מחליפה את שיקול הדעת התכנוני של הרשות; בית המשפט יתערב במשורה, רק"
|
||||
42288-03-24,6578191c-c4b4-400a-9758-35dba38e147d,pending_review,approved,3,0.9033,83c9296c-fc65-43c7-a3c8-3c5a788a76be,"ועדת הערר היא מוסד תכנון הגבוה בהיררכיה התכנונית מהוועדה המקומית, ובמסגרת הערר היא עורכת בחינה תכנונית-מקצועית של הסוגיות שבמחלוקת לגופן ולא ביקורת שיפוטית על ה"
|
||||
42288-03-24,6e83bb6e-15d5-41b7-9f8c-6aace1a5f6bb,pending_review,rejected,3,0.86,af464833-4274-423b-87d8-f2bafe4643b1,קביעת מוסד התכנון כי תכנון מסוים (כגון גודל חלון או הוספת חדר שירותים) אינו תואם את השימוש המותר לפי תכנית המתאר היא קביעה תכנונית מקצועית הנעשית במסגרת סמכותו
|
||||
42288-03-24,76f07910-d92a-4af0-8d28-5a36f6fc8cd1,pending_review,rejected,3,0.8867,d79818c9-baa1-4656-adab-b8cd20f2fd8a,"מאחר שהתכנון הוא דינמי במהותו, אין ציפייה לגיטימית כי הוא יקפא על שמריו שעה שההליכים מתארכים; שינוי בהוראות התכנון או במדיניות התכנונית במהלך התמשכות ההליכים אי"
|
||||
42288-03-24,0af1bd3d-3a7d-4266-8bf4-3f41963022bc,pending_review,rejected,3,0.8833,c0b5fa0b-46af-405a-a078-f3a7949e6d91,"ההבחנה בין בקשה מתוקנת להיתר לבין בקשה חדשה נגזרת מהיקף השינויים המבוקשים: מקום שאין מדובר בתיקונים קלים אלא בשינויים מהותיים המצריכים בחינה מחודשת, יש להגישם כ"
|
||||
42288-03-24,0f4c899a-685f-4c6b-8f06-42a67d068a64,pending_review,rejected,3,0.85,171141d4-32c3-4f8f-a48a-1040eba1c904,"בהקשר של עבריינות בניה על מוסד התכנון להימנע מקביעות מוחלטות, ולהפעיל את שיקול דעתו לאור הנסיבות הפרטיקולריות של המקרה, ובלבד שהשיקול של שמירה על שלטון החוק יזכ"
|
||||
42288-03-24,7093c1eb-a744-4b27-9dcd-800966cbdc40,pending_review,approved,3,0.9033,026a5089-d5a2-41d1-b958-0fbbbe43179c,"זכויות בנייה מכוח תכנית מתאר הן זכויות מוקנות, ועל כן שלילתן מחייבת הוראה מפורשת בתכנית המתאר; אין די בהוראה הנלמדת כפועל יוצא מפרשנות לשונית בלבד, ובפרט כאשר ה"
|
||||
42288-03-24,64ede8c2-2308-438e-bd0f-9dcedaaa6c0d,pending_review,approved,3,0.9,0d305c98-ad48-4394-a2cd-0bc033862aab,"ככלל, על מוסד תכנוני למקד את דיונו בשיקולים תכנוניים בלבד ולהימנע משיקולים פרסונליים הנוגעים לזהות מבקש ההיתר או נסיבותיו האישיות."
|
||||
42288-03-24,c69f225b-ff4b-42b0-9103-96489c109b5f,pending_review,approved,3,0.8933,b684269c-dfc8-4672-ae16-84536b4ed400,"במסגרת מכלול השיקולים שרשאית ועדת הערר לשקול בבקשה להיתר, רשאית היא להביא בחשבון את העובדה שהבקשה מיועדת להכשיר בדיעבד עבירות בנייה, וכן את השיקול של מניעת עידו"
|
||||
42288-03-24,d2485151-557d-41e2-8fee-78cea8c4653e,pending_review,rejected,3,0.86,3aa44859-d500-446a-9dae-3a9205f1d66a,"המבקש להגיש מוצגים נוספים לאחר הגשת העתירה נדרש להציג טעם מדוע לא הוגשו אותם מוצגים במועד, בד בבד עם הגשת העתירה; היעדר טעם כאמור מצדיק את דחיית הבקשה."
|
||||
42288-03-24,46c4ce5f-8896-4653-a973-775bb15d0e14,pending_review,rejected,3,0.8733,feafa970-5f88-4cd2-82ec-6a15cdca1e4e,"מקום שתכנית מחייבת קיום פתרון חניה במרתף ומקנה לוועדה המקומית שיקול דעת אם להתיר פתרון חניה חלופי באמצעות תוספת שטחים עיליים, אין לבעל הזכות זכות מוקנית לנצל את"
|
||||
42288-03-24,b51cf66a-9b6b-4f52-af06-1ef4b8242861,pending_review,rejected,3,0.89,a192899d-4a65-4c09-83c5-c6596bd3d53d,"פיצול בקשות תכנוניות בשיטת ""סלאמי"" — הגשת שורת בקשות הדרגתיות שנועדה לעקוף מגבלה תכנונית ולקבוע עובדות מוגמרות — היא דרך פעולה פסולה הלוקה בחוסר תום לב."
|
||||
|
1
data/audit/principle-cull-dryrun-20260619T113342Z.csv
Normal file
1
data/audit/principle-cull-dryrun-20260619T113342Z.csv
Normal file
@@ -0,0 +1 @@
|
||||
case_number,halacha_id,old_status,final_verdict,votes,score,canonical_id,rule
|
||||
|
550
data/audit/principle-cull-dryrun-20260619T114925Z.csv
Normal file
550
data/audit/principle-cull-dryrun-20260619T114925Z.csv
Normal file
@@ -0,0 +1,550 @@
|
||||
case_number,halacha_id,old_status,final_verdict,votes,score,canonical_id,rule
|
||||
65861-01-24,a12c4d97-7810-4e86-b544-614a10ffe1cc,pending_review,approved,3,0.8833,9886eea4-7331-4d7c-9f8e-c28527b0e5b1,"הפטור מהיטל השבחה הקבוע בתמ""א 38 חל לא רק כאשר ההיתר ניתן ישירות מכוחה של תמ""א 38, אלא גם כאשר ההיתר ניתן מכוח תכנית מפורטת שהוכנה מכוחה; בכל מקרה, הזכויות המוק"
|
||||
65861-01-24,e8413da8-f9b5-4761-9cf5-5c8e062b63bc,pending_review,approved,2,0.89,1cb69da7-d0b8-4d3b-9ab3-7e37acef22a4,"הוראת סעיף 23 לתמ""א 38, וכן תכנית מפורטת שהוכנה מכוחה, נועדו אך להתאים את הוראות התכנית הארצית לתנאים הייחודיים של כל יישוב לעניין תוספות הבנייה, ואין בהן כדי ל"
|
||||
65861-01-24,81bfac7e-a53f-44b3-aa9b-72eafa64c5de,approved,approved,3,0.8833,1bd26b92-5116-4fb5-bf54-2133b05031e0,"היקף הפטור מהיטל השבחה לפי תמ""א 38 נקבע על פי נוסח התמ""א, על תיקוניה, שהיה בתוקף במועד הקובע; היתר התואם את הוראות התיקון שבתוקף בנקודת המחלוקת בא בגדר היקף הפט"
|
||||
8126-03-25,b17ab0f4-1334-4610-aa04-09f7cfe3dc62,approved,rejected,0,0.0,167d0af2-e83b-4479-aae0-e13bb4452fca,"נישום המבקש לתקוף חיוב בהיטל השבחה חייב לעשות זאת בתוך התקופה הקבועה בתוספת השלישית לחוק התכנון והבנייה; זוהי נקודת המוצא של ההסדר, והיא נגזרת מאינטרס ההסתמכות "
|
||||
8126-03-25,09a5ebde-dba1-4139-99e6-d1063ed65a26,approved,rejected,2,0.875,da50df67-f49d-4918-b67d-09bc07773952,"לבחינת קיומם של ""טעמים מיוחדים"" להארכת מועד בתקיפת היטל השבחה ניתן להקיש מדיני הארכת מועד בהליכים אזרחיים; הבחינה מחייבת התחשבות במכלול נסיבות המקרה, ובכללן משך"
|
||||
8126-03-25,a3dd1188-b84f-472b-8785-040c2d17339b,approved,approved,2,0.9,93502917-d729-44ca-991b-260fc18d3adf,"בקשה להארכת מועד נבחנת בשני שלבים: בשלב הראשון נבחן קיומו של טעם מיוחד המצדיק את הארכת המועד, ורק אם נמצא טעם כזה עוברים לשלב השני, בו נשקלים שיקולים לדחיית הבק"
|
||||
8126-03-25,ee36d22a-44a3-4ede-8086-9b780daa6ce5,approved,approved,2,0.9,7e050437-86b9-472f-a016-847f9176b683,"טעם מיוחד המצדיק הארכת מועד הוא קיומן של נסיבות חיצוניות שאינן בשליטת בעל הדין, ואין די לשם כך בטעויות שבשגרה או במחדלים של בעל הדין."
|
||||
8126-03-25,a144bdd7-e57b-493b-9c64-f451e7d2974e,approved,approved,2,0.9,6fd70af9-0778-4f69-a501-029ce518e79b,התכתבות של נישום עם הוועדה המקומית בנוגע לחבותו בהיטל השבחה אינה מצדיקה הארכה של המועד הקבוע בדין להגשת ערר; נישום אינו רשאי להאריך לעצמו את המועד באמצעות ניהול
|
||||
8126-03-25,86615417-7afa-4a3b-b479-9aa965e3e55a,approved,approved,2,0.9,520acbc3-8921-4fdc-92e1-0117998bf416,בקשה להארכת מועד יש להגיש ללא שיהוי — עוד בטרם חלף המועד או סמוך ככל הניתן לפקיעתו; טעם מיוחד או אף טעם סביר להארכה שהתקיים בתוך המועד הקצוב עלול לאבד ממשקלו ול
|
||||
8126-03-25,0ddd6e2b-745a-4456-ae74-28a87878c0da,approved,approved,2,0.9,33490f60-d1de-40de-b27d-53adabf96eef,"הפטור הקבוע בסעיף 19(ג) לתוספת השלישית לחוק התכנון והבניה הוא הסדר דו-שלבי: בשלב הראשון, לפי סעיף 19(ג)(1), מוקנית לנישום דחייה על-תנאי של תשלום היטל ההשבחה; וב"
|
||||
8126-03-25,abb5eaa8-3941-494e-a539-7f9bd4120ec9,approved,rejected,2,0.9,95f51b9f-c0d2-44ba-9381-f2b1c60bf8f7,"בחירה דיונית מעין-אסטרטגית של בעל דין להעדיף ניהול דיאלוג עם הרשות על פני נקיטת הליך ערר במועד היא בחירה המצויה בשליטתו, ועל כן אינה בגדר 'נסיבה חיצונית שאין בש"
|
||||
8126-03-25,4eb1c5b0-0351-4481-b5bd-28edfccd7346,approved,rejected,2,0.875,85b68db2-f34d-4541-9be5-02b68b217b22,"בבחינת השלב השני של בקשה להארכת מועד להגשת ערר, יש לשקול לחובת המבקש את אינטרס ההסתמכות של הרשות על סופיות השומה; מקום שבו המבקש השתהה באופן בלתי-סביר ולא פעל כ"
|
||||
8126-03-25,b1a06cb6-f89c-4796-84db-9d712a2698a6,approved,rejected,1,0.85,a76f1054-8907-482e-bb47-a29f49be3934,טעות שנפלה בהליך אישור עסקת מכר הנוגעת לתת-חלקה אחרת או לנכס אחר אינה פוגעת בתקפותה של שומת היטל השבחה שהוצאה כדין לנכס שלגביו ניתנו היתר ופטור.
|
||||
8126-03-25,5b7a8fa4-f296-44ca-8950-7a08b65d0445,approved,rejected,0,0.0,d4e77cf5-72e7-4f27-8c1b-f9694ee30df5,"פטור מהיטל השבחה הוא חריג לכלל החיוב בהיטל, ולפיכך נטל ההוכחה כי מתקיימים תנאי הפטור על כל רכיביו מוטל על מבקש הפטור."
|
||||
8126-03-25,f0c21b39-7bbf-47f4-90f9-57a2fd3e703e,approved,rejected,2,0.875,d1b370b8-cbcd-4e02-9c74-635f76441ec6,"הפטור מהיטל השבחה בגין הרחבת דירת מגורים הוא פטור בעל מאפיינים סוציאליים, שתכליתו להבטיח כי הנהנה מהפטור הוא שייהנה מן ההרחבה בפועל בדרך של מגורים בדירה, בעוד ה"
|
||||
8126-03-25,9064f67f-642d-4386-b5ff-2af778d67050,approved,rejected,2,0.9,53cfa331-97bf-47b5-9bb1-3834b4a73358,"השכרת דירת המגורים, כולה או חלקה, לצדדים שלישיים במהלך התקופה הרלוונטית אינה עולה בקנה אחד עם דרישת המגורים שבתנאי הפטור ועם תכליתו הסוציאלית, ושוללת את הזכאות "
|
||||
8126-03-25,6780d28d-9924-4446-b63d-d0c4273018a4,approved,rejected,2,0.9,61472804-cd44-4a6f-99f1-b58dc4e42dfa,"תצהירים שנערכו שנים רבות לאחר האירועים נשוא המחלוקת, הסותרים את עדות הנישום עצמו, אין בכוחם לגבור על תיעוד אובייקטיבי מזמן אמת המעוגן ברשומות הרשות."
|
||||
8126-03-25,c54a4b15-1071-4836-b5e5-c1eb465c80af,approved,rejected,3,0.8467,164a36ae-817f-44e1-a5b5-a70d6ddf416f,תנאי לפטור מהיטל השבחה המותנה במגורי הבעלים בנכס למשך תקופה קצובה מחייב מגורים אמיתיים ורציפים בפועל. אין בעל הנכס רשאי לפצל את תקופת המגורים לפי בחירתו — להתגו
|
||||
8126-03-25,26a3def2-3230-4795-a1de-83983e49221a,approved,rejected,2,0.9,c96b73b3-9d19-4b7c-b2de-a379b0c53c3b,"הגדרת ""קרוב"" שבסעיף 19(א) לתוספת השלישית לחוק התכנון והבניה, לעניין הפטור מהיטל השבחה בגין בנייה או הרחבה למגורים, היא רשימה סגורה וממצה; מי שאינו נמנה על הנפשו"
|
||||
8126-03-25,863425f2-1692-4c3d-9da9-15a1f14334ef,approved,rejected,1,0.8,fe0101a3-1ee4-4aac-8d36-9482600029e7,"הפטור מהיטל השבחה בגין בנייה למגורים הוא הטבה הניתנת על חשבון הקופה הציבורית לשם הגשמת תכליתו, ואין לראות בו זכות הניתנת להפרת תנאיו או ל""מסחר"" בו; פרשנותו והחל"
|
||||
44759-09-24,52fb287c-8f6d-4464-8f45-79371eb885b1,pending_review,rejected,3,0.8733,544f4953-f2c9-44eb-bce5-bf7189db3c3d,"""בנייה הטעונה היתר"" לפי פרק ה' לחוק התכנון והבנייה היא כל עבודה או שימוש בקרקע ובבניין המחייבים אישור רשמי מרשות הרישוי, לרבות עבודות פיתוח ועבודות המשנות את פנ"
|
||||
44759-09-24,c6a44320-ff04-4700-8f74-c9f768211271,pending_review,rejected,3,0.9,c7ceafd0-ce05-461c-91ab-f31883b38f41,"היתר בניה מכל סוג שהוא מוגבל לעבודות שהותרו ופורטו בו בלבד; תכליתו, בין היתר, הבטחת תקינות ובטיחות העבודות בהתאם לתב""ע החלה ומניעת בניה החורגת מן המותר בו."
|
||||
44759-09-24,3e2aeb5a-c74b-4598-b727-f1ba72bf9042,pending_review,rejected,3,0.8833,dd8c4dd9-34b2-49c4-84d9-365debd1e8c6,"החיקוקים בתחום התכנון והבניה אינם מכירים במושג נורמטיבי נפרד של ""היתר חפירה ודיפון"" או ""היתר דיפון"", והמחוקק אינו מבחין בין ""היתר"" לבין ""היתר בניה"" — קיים סוג ה"
|
||||
44759-09-24,5450c359-6334-494e-8d00-cae821fdb770,pending_review,rejected,3,0.8833,bcc6aa56-3551-4ec7-93d9-ec702542de3d,"מכוח סעיף 145(א) לחוק התכנון והבניה נדרש היתר בנייה לכל עבודה בקרקע, לרבות חפירה, מילוי, סלילה והקמת קיר תומך; משכך, דיפון — שהוא חפירה והקמת קיר תומך זמני או ק"
|
||||
44759-09-24,818e06fa-11be-4305-8c9f-0f892c5d2d2a,approved,rejected,3,0.84,f9bcce51-cb31-4178-9b0f-1789380b8378,"היתר דיפון הוא היתר בנייה בעל אופי מוגבל הניתן מכוח סעיף 145 לחוק התכנון והבניה, המאפשר להתחיל בביצוע עבודות חפירה, דיפון וביסוס הקרקע בשלב התת-קרקעי בלבד, בטרם"
|
||||
44759-09-24,68ecd387-bece-49ab-844c-aee36630c57f,pending_review,rejected,3,0.8867,71fe228b-1cc8-40f9-959f-cf6965189f0c,"אין במשפט הישראלי מושג נפרד של ""היתר חפירה""; חוק התכנון והבניה מכיר אך ורק בהיתר בניה, ומאפשר להוציא היתר בניה לחלק מהעבודות המתוכננות במגרש בלבד — לרבות עבודות"
|
||||
44759-09-24,467f11d8-7976-4e26-b06b-5651a3dd3c43,pending_review,approved,3,0.91,1398a2ed-8764-4cdc-9a1d-e22b77a6b193,"היתר בניה לעבודות חפירה או דיפון (המכונה בפרקטיקה בטעות ""היתר חפירה"" או ""היתר דיפון"") אינו היתר נפרד או נבדל, אלא מהווה שלב ראשון של היתר בניה הקבוע בחוק, ועל כ"
|
||||
44759-09-24,2ed16ea9-9053-4ef3-ac68-35d77ab90643,approved,rejected,3,0.84,c218e7ba-56e6-4c63-b244-0eb11f912e6b,"עבודות שאינן נכללות במפורש ברשימת החריגים הפטורים מהיתר בתקנות, טעונות היתר בנייה; משכך, עבודות דיפון – שאינן בכלל החריגים – טעונות היתר בנייה."
|
||||
44759-09-24,5025f476-8e3b-4469-8bca-a4d0894ff6a3,pending_review,rejected,3,0.8233,c585804f-9e1a-430c-abcb-42d902388910,"מסמך שהוצא על ידי הרשות ונושא כותרת ""היתר בנייה"" מקים חזקת תקינות המעשה המינהלי, שלפיה רשות הפועלת לפי דין לא הייתה מכתירה מסמך בלשון זו אלמלא היה היתר בנייה; ה"
|
||||
44759-09-24,187238da-18c9-40c7-a10d-c7d2a86d88c3,approved,rejected,3,0.8733,5e7073d9-b12d-43cb-8b63-53cf5f2c0933,"""היתר בניה"" נדרש כל אימת שנעשית פעולה פיזית המלווה בתכנון מוקדם שיש בה כדי לשנות את המבנה או את פני הקרקע; מקור הסמכות הוא סעיף 145 לחוק התכנון והבניה, והמונחים"
|
||||
44759-09-24,77655e86-87c2-40f6-9e2f-3a440c2f6e8f,pending_review,rejected,3,0.9,48cba69e-25e4-4190-9981-df335c5a2d00,"היתר המכונה במישור המקצועי-הפרקטי ""היתר דיפון"" (או כל שם דומה) אינו אלא ""היתר בניה"" כמשמעותו ומכוחו של סעיף 145 לחוק; ראייתו כהיתר שאינו ניתן מכוח סעיף 145 היית"
|
||||
44759-09-24,b6e2b7cf-4cb2-4fe3-beaa-3a3dc6c4a062,pending_review,approved,3,0.9333,eacdc815-60a3-4389-9ceb-aa8a9d0a49f4,"רשות ציבורית כפופה לחובות המשפט הציבורי — ובהן חובת תום-הלב, ההגינות, הסבירות והיושר — מתוקף מעמדה כנאמן הציבור, וחובות אלה חלות עליה ועולות בחומרתן על הנדרש ממ"
|
||||
44759-09-24,8498b699-58f2-4ee2-bf54-89963e3b987d,pending_review,approved,3,0.9233,a1be8e43-e04f-4f24-96a1-a4b4feb8515e,"היתר חפירה ודיפון מהווה ""היתר בניה"" כמשמעותו ומכוחו של סעיף 145 לחוק התכנון והבניה, ואין בשם השונה שניתן לו כדי לגרוע ממעמדו הנורמטיבי כהיתר בניה; פרשנות זו תוא"
|
||||
44759-09-24,abdebb36-8655-4d88-b86b-d03c251f97ea,pending_review,approved,3,0.9333,e5074036-f517-426f-a200-0e9a8983ebd4,"רשות מנהלית מוסמכת לפעול אך ורק מכוח הסמכה מפורשת בחוק, ומכוח מעמדה כנאמן הציבור מוטלות עליה חובות מוגברות של הגינות ותום-לב והחובה להגשים את האינטרס הציבורי — "
|
||||
44759-09-24,764b9e53-544d-4900-85e8-2e9f07ba8f61,pending_review,rejected,3,0.86,5a6bc933-28d0-4fd3-bf0f-585557c88156,"היתר דיפון הוא בגדר היתר בניה, שכן הפרשנות ההפוכה מובילה לתוצאה אבסורדית שלפיה הרשות מנפיקה היתרי דיפון בהיעדר סמכות כדין ותוך הפרת חובת הנאמנות לציבור."
|
||||
44759-09-24,1f744b0b-5ea4-4b3a-aa55-20ace5c4c112,pending_review,approved,3,0.9167,eda2fd62-a832-49be-9910-b2cb5eadc9b7,"רשות מנהלית אינה רשאית להוציא היתר לביצוע פעולה בקרקע או במקרקעין הטעונים היתר אלא מכוח החוק או מכוח הסמכה מפורשת על-פיו, ופעולתה זו היא בכובעה כנאמן של הציבור."
|
||||
44759-09-24,9b7dcacf-0da6-4d0b-add2-673f461608bd,pending_review,rejected,3,0.8467,33d6cc1b-cd0e-494e-8260-ad443f4e6f56,"בפרשנות המונח ""היתר בניה"" לצורכי היטל השבחה, אין הרשות המקומית רשאית להתכחש למהותו של היתר דיפון וחפירה שהיא עצמה הנפיקה ולשלול ממנו את מעמדו כהיתר בניה; שלילה "
|
||||
44759-09-24,90d5293e-8a17-43c7-8618-9709a399a046,pending_review,rejected,0,0.0,e59cb258-8828-4314-9915-125589cdbc49,"פרשנות תכליתית של ""היתר דיפון"" כממלא אחר דרישת ""היתר בניה"" עולה בקנה אחד עם פרשנות נכונה ותכליתית של לשון החוק, ויש לשאוף להרמוניה פרשנית בין דיני היטל ההשבחה ל"
|
||||
44759-09-24,930f5c64-df3a-4d77-89f0-7108f7cf2c9c,approved,rejected,3,0.8733,a99afb82-890b-4995-89c5-1dcfe129ed2d,"היתר דיפון מהווה היתר בנייה לכל דבר ועניין, וככל היתר בנייה הוא מוגבל לעבודות הנקובות בו בלבד; משכך יש לראות במועד נתינתו מועד מתן היתר בנייה לצורך קביעת סדר המ"
|
||||
44759-09-24,f4a751b8-b488-437f-8dfd-5dd27bb2c55b,pending_review,rejected,3,0.8833,e4501edb-5f79-452e-9037-2334d690a70c,"בעל דין שזכה בהליך זכאי לפסיקת הוצאות ריאליות, בכפוף לכך שהן סבירות, מידתיות והכרחיות לניהול ההליך, ובשים לב ליחס שבין הסעדים שנתבקשו לאלו שאושרו, להתנהלות הצדד"
|
||||
1033-02-25,8a9645a3-81ef-4a2b-9ba7-6f6b00036b26,approved,approved,2,0.9,1576d34b-d2bf-499c-9c28-ede3caee9aa2,"התייצבותו האישית של עורר לדיון בפני ועדת הערר מייתרת את הצורך בהגשת ייפוי כוח לצורך ייצוגו, ולפיכך טענת סף פרוצדורלית בדבר היעדר ייפוי כוח אינה משנה את מהות הער"
|
||||
1033-02-25,a285ddb1-42de-4f92-9d71-4305bdc093e3,approved,approved,3,0.8067,c9333406-d07c-4a3f-977c-9b002f74ee38,מעשה בית דין והשתק חלים רק מקום שבו הוכרעה בעבר אותה סוגיה ממש. החלטה הדוחה בקשה במתכונתה ומתווה תנאים לאישורה אינה מכריעה בסוגיית אישור הבקשה ואינה מקימה לצד ע
|
||||
1033-02-25,82c04d15-89a9-4cc5-9b1c-9f0ecc2ff979,approved,rejected,0,0.0,dd4213fa-2fa7-4349-86e6-fca2a59f0da7,אי-התייצבותם של חלק מן העוררים לדיון בפני הוועדה המקומית אינה פוגמת בערר ואינה משנה ממהותו.
|
||||
1033-02-25,1bbcb4e0-bb79-43e1-ac1b-2cacc811e195,approved,rejected,0,0.0,c2505646-d70f-4bb3-8a4f-c6e8a9c09ac4,"בחינת בקשה להקלה מהוראה הכלולה בנספח בינוי מחייב מחייבת בחינה מעמיקה של מכלול המבחנים הרלוונטיים, לרבות השאלה אם אין מדובר בסטיה ניכרת."
|
||||
1033-02-25,149b241e-24c3-49ae-9c71-fa9d8dae3adc,approved,pending_review,2,0.8,f0b7c5c6-b138-4203-9470-4353289dcbf8,"ועדה מקומית רשאית לדרוש, כשלב מקדמי וטרם דיון בבקשה להקלה לגופה, תכנית צל או בחינת היתכנות, על מנת לבחון אם קיימת היתכנות לבקשה."
|
||||
1033-02-25,bff309a5-ec18-4fb2-acce-e98e98534a3d,approved,pending_review,2,0.825,1f27b30e-883d-4a84-bf47-0622ea3aacbc,מניעת מצב שבו תוספת בניה תהפוך את הבניין לחריג בסביבתו הבנויה — בפרט מקום שבו בעלי הזכויות בבניינים הסמוכים כבר ניצלו את זכויות הבניה לפי התכנית ולא יוכלו ליישם
|
||||
1033-02-25,2e869214-347b-4c98-b579-6d40a80472e1,approved,approved,2,0.9,451ea4fa-7923-48e8-bd97-fd2fadaae969,"משקבעה הערכאה כי בקשה להיתר אינה עומדת בתנאי-סף תכנוני מחייב (כגון דרישה לתכנית אחידה לכלל המתחם), מתייתר הצורך — ולא ניתן בשלב זה — לדון לגופן בטענות הנוספות ש"
|
||||
"בר""מ 25226-04-25",cd6ed746-08c3-40fe-8fe5-25cf4279166e,approved,approved,3,0.8833,34f889e9-f7ba-4eaa-b58c-cc8ba2ffb7bc,"לא ניתן לגבות היטל השבחה מכוח תכנית מתאר ארצית ככזאת, וזאת על-פי הוראות החוק כפשוטן."
|
||||
"בר""מ 25226-04-25",c10e2fa4-1078-48af-a1f4-cda60743918a,approved,approved,3,0.9233,3e49105c-dc9e-4b63-8d81-9e055b8a642c,"אין לגבות היטל השבחה מכוח תמ""א 38 בעת מכר מקרקעין; הלכה זו, שמקורה בעניין רון, מאומצת ומיושמת ככלל מחייב."
|
||||
"בר""מ 25226-04-25",4a17382e-a739-4dca-8f27-c622e08af217,approved,approved,3,0.9333,ee2c2e1b-9956-4fb0-a581-a39c2aafd543,שומת היטל השבחה מחושבת לפי ההפרש שבין שווי המקרקעין במצב החדש (בהתאם לזכויות שהוענקו בתכנית המשביחה) לבין שוויָם במצב הקודם (בהתאם לזכויות שהיו קיימות ערב אישור
|
||||
"בר""מ 25226-04-25",f0a66775-c159-450a-b407-89fcb4bea72a,approved,approved,3,0.9333,2c78b9b0-8688-4f67-88c4-f4336f9733b9,"בשומת ערך המקרקעין במצב התכנוני הקודם לצורך חישוב היטל השבחה, יש להבחין בין ציפיות כלליות לפיתוח המקרקעין — שניתן לכלול בשומה — לבין ציפיות ספציפיות הנובעות במי"
|
||||
"בר""מ 25226-04-25",949dcc28-3c8f-4eb4-ad4a-c3072747cf24,approved,approved,3,0.8667,62d59ed7-ce77-41a7-8ecd-c44516bc8ab4,"תכנית מפורטת שאושרה מכוח סעיף 23 לתמ""א 38 ואשר מעניקה זכויות בנייה מוקנות, מהווה תכנית משביחה החייבת בתשלום היטל השבחה במועד מימוש הזכויות."
|
||||
"בר""מ 25226-04-25",bcb5de44-7c83-4a02-b2b1-7f3f3aff7a40,approved,rejected,2,0.84,10bfa07d-b23f-4df8-ae78-fc9de784ef20,"בהערכת שווי המקרקעין ""במצב הקודם"" לצורך חישוב היטל השבחה בגין תכנית מפורטת מכוח סעיף 23 לתמ""א 38, יש לנקוט בדרך של הכללה ולהביא בחשבון את עליית השווי שנבעה מהשפ"
|
||||
27118-11-19,41ee1757-71b4-47d9-9d1f-9f8d6ec68eab,pending_review,approved,3,0.9,b2424b57-1254-45e9-ba8a-45ba725ce2db,"היקף השימושים והפוטנציאל התכנוני של מקרקעין לעניין שוויים נגזר מן השימושים שמתירה התכנית החלה (תב""ע), ולא ממה שהתבקש בפועל בהיתר הבנייה; היעדר בקשה לניצול שימוש"
|
||||
27118-11-19,f75d8b9d-f0e7-4ba8-ab18-0d0685bac173,pending_review,approved,3,0.8833,ad1e1657-046b-4247-9189-1d46e8b730a7,"סכסוך שמהותו כספית, הנוגע לפרשנות חוזה שנכרת עם רשות מקרקעי ישראל וזיקתו לסעד של השבת כספים שנטען כי נגבו שלא כדין במסגרת עסקה לרכישת זכויות קנייניות, מקומו להת"
|
||||
27118-11-19,822d8447-d461-435b-82c3-23b3ca477998,approved,approved,3,0.9233,822eec48-9e87-40ea-9586-fd8c4c14d435,"רשות ציבורית הפועלת בסמכותה השלטונית אינה רשאית לגבות כספים בלא הסמכה מפורשת לכך בחוק או מכוחו, וגבייה כזו היא התנהלות פסולה הראויה לביקורת שיפוטית."
|
||||
27118-11-19,752d7220-4726-4163-ab9a-f3b784eb7c6b,pending_review,approved,3,0.9,8d49826e-52fa-451b-b478-920cecda380e,"במחלוקת שמאית נתון לרשות המוסמכת שיקול דעת מקצועי רחב, ובית המשפט ינהג בריסון בהתערבותו בשיקול דעת זה."
|
||||
27118-11-19,5b7b0cec-6ae1-4cd7-9eb9-06e44f71040f,pending_review,approved,3,0.9167,04dea304-e004-472a-ab4e-788aa3c26cef,לא כל החלטה שגויה של גורם המפעיל שיקול-דעת מקצועי — בין אם רשות מנהלית ובין אם לאו — מהווה כשלעצמה החלטה רשלנית; קביעת אחריות נזיקית של רשות בגין דרישת תשלום (כ
|
||||
1216/98,1ff106ff-6fbc-427e-aeaa-ce79bd41c957,approved,approved,3,0.86,3951953d-1e18-4104-905e-e5fc9c4e850f,"בית המשפט לא ישהה את הכרעתו השיפוטית בשל תכנית מתאר מוצעת שטרם נכנסה לתוקף, מקום שמועד אישורה אינו ודאי וקשה להעריך אם וכיצד תתקבל; קיומה של הצעת תכנית עתידית א"
|
||||
9355/02,72262859-f525-413b-bd32-64f01def1dc1,approved,approved,3,0.9333,56660319-8e40-4fb5-b187-44f1e58d86fc,"בהערכת שווי השוק של מקרקעין יש להתחשב גם בפוטנציאל התכנוני שלהם, הכולל לא רק את תכנית המיתאר החלה במועד הקובע אלא גם תכניות צפויות (שינוי ייעוד או הגדלת אחוזי ב"
|
||||
9355/02,e4d53472-ffb9-4afa-a8c9-689c8b0f924a,pending_review,approved,3,0.9667,53a2099f-3f68-4645-9174-61d2c8a188a9,"תכנית בניין-עיר היא בגדר 'חיקוק', ומשכך חלים עליה כללי הפרשנות הנהוגים ביחס לדברי חקיקה, ובכלל זה החובה לתור אחר תכלית התכנית."
|
||||
9355/02,57ca6e55-cbde-4ab9-b1e6-73ff003afe42,approved,approved,3,0.9167,8183d16a-8370-46b5-b920-46180c39bbd7,"המבחן הקובע להערכת הפיצוי בגין מקרקעין מופקעים הוא שווי המקרקעין ביום פרסום ההודעות לפי סעיפים 5 ו-7 לפקודת הקרקעות (רכישה לצרכי ציבור), 1943."
|
||||
1062-24,1b233ece-435a-40fa-b642-eba81d9565d8,pending_review,rejected,0,0.0,afe4dd53-e1d1-4e74-b994-15f0daf4ce88,"תכנית בניין עיר היא בגדר חיקוק, ועל פרשנותה חלים הכללים הרגילים של פרשנות חקיקה; משכך יש לבחון את לשון התכנית ותכליתה כמכלול אחד."
|
||||
1062-24,383b32e5-6afa-4524-9ac3-9a93f4907e1c,approved,rejected,3,0.7933,167238ed-a80d-4e13-bb74-0a94e6eefbe0,"כאשר הגבלת הגובה הקבועה בהוראות תכנית ובנספח הבינוי המחייב מהווה חלק בלתי נפרד מהתפיסה התכנונית הכוללת של המתחם, סטייה מאותו גובה אינה בגדר הקלה מותרת אלא מהווה"
|
||||
1062-24,fd3e17d2-a699-4b1f-affb-b7f9dd7fae29,pending_review,rejected,1,0.9,c81d82e7-2c76-4c11-9eee-421be68fe71c,"חלל שגובהו נמוך מ-2.50 מ' אינו עונה על הגדרת 'קומה' שבתקנות (חלל בין שתי רצפות סמוכות שגובהו אינו קטן מ-2.50 מ') ואינו מקיים את גובה החדר המינימלי למטרה עיקרית,"
|
||||
1062-24,41d94cd3-951d-45a2-b03e-76b845c1fb5a,pending_review,approved,2,0.9,bb02c3ac-aca3-4369-8c5e-6b0ad55d31d2,"כאשר הוראת תכנית נוקטת לשון ברורה וחד-משמעית, ובפרט ביטויים מוחלטים מסוג ""בכל מקרה"", יש לפרשה כמבטאת כוונה ליצור מגבלה תכנונית קשיחה שאינה ניתנת לריכוך או לסטיי"
|
||||
1062-24,9903a6b0-1abe-4374-8a97-fbf38a1fb80e,pending_review,rejected,3,0.8067,6c1df8f5-bd36-4ea2-b6c0-88d066e6d3b0,"מקום שבו נספח הבינוי מוגדר בהוראות התכנית כמנחה בלבד, למעט עניינים שהוחרגו במפורש (כגון קונטור המבנה, גובהו והמידות המסומנות בו), העניינים שהוחרגו נהנים ממעמד מ"
|
||||
1062-24,4a976c86-2505-4cc7-8ba0-d29afe9a60be,pending_review,rejected,1,0.9,c87f47f0-87df-4b27-9f6e-02aa9f7d94df,"המבקש להוכיח חוסר עקביות או הפליה באכיפה בהחלטות הוועדה המקומית (כגון אישור חריגות גובה במקרים אחרים) נושא בנטל הראייתי להוכחת טענתו, ואין די בהפניה למספרי חלקו"
|
||||
1062-24,37b527ed-be8f-495d-b8d2-d028abb1556b,approved,approved,2,0.9,8cde5b1c-6588-4c3e-853f-ada59341245d,"בבחינת הוראת בינוי או עיצוב יש לקבוע תחילה אם היא מחייבת או מנחה בלבד; ככל שמדובר בהוראה הכלולה במלל של התוכנית, קיימת חזקה כי היא מחייבת, אלא אם נאמר במפורש אח"
|
||||
1062-24,88217dea-a0ec-4d61-9d72-939d2a645e53,approved,approved,2,0.9,99d91eb8-95ea-475b-8929-a7b155ab95ea,"כאשר הוראת בינוי ועיצוב אינה מחייבת אלא מנחה בלבד, אין צורך באישור סטייה ממנה בדרך של הקלה, וממילא אין מתעוררת השאלה אם מדובר בסטייה ניכרת מתוכנית."
|
||||
1062-24,8176ea4f-f459-48a0-aa6e-84155bf99fba,pending_review,approved,2,0.9,2ef06125-74e6-4c78-8eca-3a2cfb6857e4,"אף הוראת בינוי ועיצוב מחייבת אינה בהכרח הוראה שנועדה לקבוע את אופייה של הבנייה בתחום התוכנית; אין לקבוע זאת באופן גורף, אלא לבחון את תכלית ההוראה לגופה."
|
||||
1062-24,4081e32f-6587-4c62-9b99-5993c15ef017,pending_review,approved,2,0.9,dca2e858-e6e2-4602-ae69-e7f5f46a316b,סטייה מהוראת בינוי מכוח תקנה 2(10) לתקנות התכנון והבניה (סטיה ניכרת מתכנית) תיחשב 'סטייה ניכרת' רק מקום שבו ההוראה מבטאת קביעה אדריכלית מיוחדת וייחודית שנועדה ל
|
||||
1062-24,bc10269e-1405-4375-aafd-24b2c05cc718,pending_review,rejected,3,0.8067,3fc328da-3d1a-4b6c-9106-f58c86988b73,"ועדת הערר דנה בבקשה להיתר כפי שנדונה והוכרעה בפני הוועדה המקומית, ואין היא דנה בבקשה שונה או מתוקנת (כגון מסמך אדריכלי המציג מידות אחרות) המוצגת לראשונה בשלב הע"
|
||||
31492-01-24,4f40cc45-6977-46a1-b93b-ac7c8631153a,pending_review,approved,3,0.8833,9cfd737f-d474-4b30-8eff-a84ced5375a0,"סיור במקום בטרם אישור תכנית אינו חלק משגרת הליך בחינת תכניות ואישורן, ומשכך החלטת ועדת תכנון שלא לקיים סיור בשטח הינה סבירה ואינה גורעת מתקינות התשתית העובדתית "
|
||||
31492-01-24,b1f1cbb0-a980-4bee-a56b-dca26327abaf,pending_review,rejected,3,0.8833,57e5b9f9-3d3b-4442-b4aa-a207d68bf6ce,"תכנית מתארית, גם כשהיא כוללת הוראות של תכנית מפורטת, אינה נדרשת לכלול את אופן הבינוי לעת ביצוע ואת הסקר הפיזי-הנדסי; אלה שייכים לשלב הבקשה להיתר הבנייה, שבו נבד"
|
||||
31492-01-24,a1e11582-3e08-4686-b42e-8e6e9e0fcc1a,pending_review,rejected,1,0.9,c0a098f4-62a0-49b9-b8b3-0161d1cbc691,"תכנית מתאר הקובעת עקרונות כלליים לשימור עומדת באותה דרגה בהיררכיה התכנונית כמו תכנית נקודתית מפורטת, ולפיכך התכנית הנקודתית אינה כפופה לה; אישור תוספת בנייה לפי"
|
||||
31492-01-24,f795e74d-310f-4f3b-9ce4-5e7925c8e2ec,pending_review,rejected,3,0.8833,7bd470af-db7b-45c9-b706-6098ffdd4b14,מגבלה על גובה בינוי אינה יכולה להישען על טענה שאין לה עיגון בהוראת דין או בהוראות תכנית חלה; דרישה תכנונית הנטענת ללא מקור נורמטיבי כאמור אינה מחייבת את מוסד הת
|
||||
31492-01-24,ec2056cd-9a8e-4d42-82d0-a191443a76d3,pending_review,approved,3,0.9,32544a22-b2e2-43fb-89aa-520e1b502765,חובת ההיוועצות בשר הדתות לפי סעיף 99 לחוק התכנון והבניה קמה רק מקום שבו התכנית כוללת הוראה בדבר שמירת מקום קדוש או בתי קברות; תכנית שאינה כוללת הוראה כאמור אינה
|
||||
31492-01-24,ea99bd64-1a18-4852-a81c-8d3da4a552f4,pending_review,rejected,3,0.86,e836b7c0-d4f5-45c5-8546-eea3da0f5ac9,שקילת שיקול כלכלי על-ידי מוסד תכנון אינה מהווה פגם מינהלי כאשר מתן תמריצים כלכליים נדרש כדי להבטיח את שימורם ושיקומם של מבנים בעלי חשיבות אדריכלית-היסטורית; במצ
|
||||
31492-01-24,1fff5785-650f-44a2-a07b-be5c8c714318,pending_review,rejected,3,0.86,9e3c30cf-cbf9-42f9-8456-19b6adc5570d,"תכנית רשאית לקבוע תנאים לשימוש עתידי בחללים תת-קרקעיים (ארכיאולוגיים) שטרם נחשפו, מבלי לאשר בעצמה את עצם השימוש; הכפפת השימוש לאישורם של גורמים מוסמכים (כגון רש"
|
||||
31492-01-24,9dec019a-9e48-4f86-bf38-d78221e1449f,pending_review,approved,3,0.9233,efb23248-ab49-475c-aaca-40b6b9706e25,"מחלוקות בדבר זכויות קנייניות במקרקעין — לרבות בעלות וזכות שימוש מכוח שנים — אינן נדונות ואינן מוכרעות במסגרת ההליך התכנוני, ועל הטוען להן למצותן באפיקים המשפטיי"
|
||||
31492-01-24,bb7bb883-646f-4016-ab8c-15ef872ba91b,pending_review,rejected,3,0.8833,c2037230-43ce-4701-ae7f-3517f9d92ddc,"מוסד התכנון רשאי להותיר ליבון פרטני של נושאים תכנוניים נקודתיים לשלב הבקשה להיתר הבנייה, שבו ניתן לבחון את התכנון המוצע, ההקשר הקונסטרוקטיבי והשימוש בפועל; הותר"
|
||||
31492-01-24,9c4bebef-ff80-444f-a6f3-cad556b8cc7c,pending_review,rejected,3,0.8833,6a1469a5-05a6-4f04-b8fa-19464fb761d4,"כאשר מליאת מוסד התכנון דוחה על הסף בקשה לדיון חוזר בשלב הראשון ומותירה את החלטת ועדת המשנה על כנה, אין היא חייבת לזמן את הצדדים הנוגעים בדבר לדיון, לשמוע את עמד"
|
||||
31492-01-24,8403574d-4dba-4d2b-be1d-247707b2dda0,pending_review,approved,3,0.9333,513fb69c-fdc4-4e61-be7d-2c7be4a5bde7,בית המשפט המינהלי אינו שם עצמו בנעלי רשויות התכנון ואינו ממיר את שיקול דעתן בשיקול דעתו שלו; התערבותו בהחלטות רשויות התכנון נעשית במשורה ורק בהתקיים עילות מובהק
|
||||
31492-01-24,a4a29472-4aa8-42b0-a771-84d7087c5b3f,pending_review,approved,3,0.9167,c467de57-79be-4436-abef-83ecf00a64ad,"המועד בן 15 הימים להגשת בקשת רשות לערור הקבוע בחוק נמנה ממועד ההחלטה נשוא הבקשה, ואין להאריכו מחמת סברתו של המבקש שההחלטה אינה סופית או שהיא עשויה להשתנות בעקבו"
|
||||
1008-08-22,7c6cef71-69e0-4367-b787-b825f421e047,approved,rejected,1,0.9,d546581b-cc19-46e6-913d-d38068a48b95,"אישור הקלה טעון הפעלת שיקול דעת על ידי הוועדה המקומית, תוך בחינת שורת שיקולים: ההצדקה התכנונית להקלה, היקף ההקלה המבוקשת ומידת עצימותה, מועד כניסתה לתוקף של התכ"
|
||||
1008-08-22,3b404c97-b19d-416a-8c51-be719928f687,approved,rejected,3,0.8067,37795eb0-802c-4746-bf10-1c6360b4d464,"בעל מקרקעין שנהנה בעצמו מהקלות בנייה אינו יכול לצפות כי לא יינתנו הקלות דומות במקרקעין סמוכים, ואין בידו להתנגד למתן הקלות מאותו סוג לשכניו."
|
||||
1008-08-22,a3b64e0f-dfc3-452a-850c-bcd57e7a3fe5,approved,rejected,1,0.8,14de456f-5a24-4c6c-a882-7f8ac8341f45,ועדת הערר לא תתערב בהחלטת הוועדה המקומית בדבר היקף שטחי הבנייה כאשר ההחלטה תואמת את התכניות החלות ואת הנהוג והמקובל בעיר.
|
||||
1008-08-22,34cce1a0-07a5-492b-aed9-bce50235dd51,approved,rejected,1,0.9,298803ec-2412-4262-a548-584ef1edd8e6,"הקמת בריכת שחיה לא מקורה אינה מהווה סטיה ניכרת מתכנית, ועל כן ניתן להתיר חריגה מקווי הבניין לצורך הקמתה בדרך של פרסום הקלה."
|
||||
1008-08-22,3ed94f7e-f930-41de-a315-569a8a5943f1,approved,rejected,1,0.8,199d636f-df64-40f7-9d41-c924c64c6bea,התניית מתן ההיתר בקבלת אישור של גורם מקצועי (כגון המחלקה לאיכות הסביבה) היא תנאי סביר המאזן כראוי בין האינטרסים של הצדדים בהליך הקלה.
|
||||
1008-08-22,f8df245e-8a3f-44a3-b194-c7a82a05fff6,approved,pending_review,2,0.825,8b426ae8-f1f8-44b6-b185-65cc9c3f74d2,חריגה מקווי בניין לטובת בניין עזר עשויה להיות מאושרת מקום שהיא מותירה מרווח מספיק לפרטיות השכן ואינה יוצרת מטרד גדול יותר מאשר שימוש חלופי מותר בחצר הגינה הפרטי
|
||||
1008-08-22,53c0b135-9df2-4d33-b489-9f56a83d7163,approved,rejected,3,0.7433,b758f1eb-5fe8-4e78-9655-740b84a63e3b,"בבחינת טענת מטרד בין שכנים באזור מגורים עירוני צפוף, יש לקחת בחשבון כי החלופה למטרד אפשרי הנובע משימוש מסוים בחצר אינה בהכרח חצר שקטה, אלא עשויה להיות חצר הומה "
|
||||
1008-08-22,b0827cf6-ba50-479e-b589-31e5bfdd9e6e,approved,approved,2,0.875,c41e4b84-d7e5-4e30-9b50-6d9e98cadbe2,שתיקת התכנית החלה על המקרקעין ביחס להקמת בריכת שחיה אין בה כדי להצביע על כך שמדובר בשימוש אסור בייעוד למגורים; היעדר הוראה מפורשת בתכנית אינו שקול לאיסור.
|
||||
1008-08-22,25a19edd-d303-4f07-880b-19c7be184977,approved,approved,2,0.9,6fda95b6-1b53-4cbc-9570-ef4810115e05,"אין לעורר זכות לטיעון בעל פה בפני הוועדה המקומית מכוח סעיף 149(א)(3) לחוק התכנון והבניה, תשכ""ה-1965; ההוראה אינה מקימה חובת שמיעה בעל פה."
|
||||
1008-08-22,e9b0935d-8b58-4159-aeab-8141b73399fd,approved,approved,2,0.9,05d2348e-78d4-437a-bcf9-eb0620251e5d,"ועדת הערר, בהיותה מוסד עררי, לא תשמע טענות שלא בא זכרן בכתב הערר ובהתנגדויות שהוגשו לוועדה המקומית; אין מקום להפתיע את מוסד התכנון בטענות תכנוניות חדשות שלא עלו"
|
||||
1008-08-22,540249c7-a99f-4513-a0fc-f8d98599b502,approved,approved,2,0.875,98c3f40a-d732-41fc-91b3-90a9583289fe,"ועדת הערר בוחנת את העניין התכנוני De Novo כמוסד תכנון, ולפיכך גם כאשר מועלות טענות שלא נטענו כדין, רשאית היא להידרש להן לגופן אם יש בהן ממש המצדיק התערבות; היעד"
|
||||
1968/00,ea648027-2cd6-4607-a18a-c649b14807c6,approved,rejected,3,0.8733,8fc75bd9-bd1b-4052-964e-d12fb02d73ba,"מקרקעין שנפגעו על ידי תכנית שלא בדרך הפקעה מקנים לבעל המקרקעין או לבעל זכות בהם, ביום תחילת התכנית, זכות לפיצוי מהועדה המקומית לפי סעיף 197(א) לחוק התכנון והבני"
|
||||
1968/00,52f34d44-d3ca-4090-bb56-2e6ddf044670,approved,approved,3,0.9333,2649885a-eff6-4355-bf55-654a4a096a64,"הפיצוי לפי סעיף 197 לחוק התכנון והבניה ניתן בגין פגיעה אובייקטיבית במקרקעין עצמם, ולא בגין פגיעה סובייקטיבית בבעל המקרקעין."
|
||||
1968/00,33246a21-9830-4334-8bbc-9b2a79945641,approved,approved,3,0.9,0b46f6f0-5a79-4612-82bd-7f3ee13f66f8,"בבחינת פגיעה בזכויות בנייה לפי סעיף 197, יש להשוות בין שווי זכויות הבנייה ערב תחילת התכנית הפוגעת לבין שוויין לאחר תחילתה."
|
||||
1968/00,e4c854ce-6cf5-490e-b1fb-e2653d0fc87f,approved,rejected,3,0.85,68784b1b-00a3-495b-a15f-9ca2c3b94bd5,"תכנית המשנה את ייעוד המקרקעין באופן האוסר בנייה למגורים מקום שהמצב התכנוני הקודם התירה, היא תכנית הפוגעת במישרין במקרקעין ובשוויים, ומזכה את בעליהם בפיצוי לפי ס"
|
||||
1968/00,b88767fa-f217-48ee-834f-88d59cd6c306,approved,approved,3,0.9,c2d7f62d-37f0-40f6-9909-256589e939d0,"אי-מימוש זכויות הבנייה עד למועד החלת התכנית הפוגעת אינו שולל את הזכאות לפיצוי; שלילת זכות הבנייה הפוטנציאלית מהווה פגיעה בזכות הקניין גם אם טרם מומשה במלואה, וע"
|
||||
1968/00,d8429d93-1fd7-4215-be74-208931a11c38,approved,rejected,3,0.8833,1d44eb01-2dd7-480f-ba06-594b7275eee5,"בבחינת מצב המקרקעין עובר להחלת התכנית הפוגעת יש להתחשב לא רק בתכנית המקורית החלה עליהם, אלא גם בהגבלות שהוחלו עליהם מכוח פעולות הרשות המוסמכת שלא במסגרת תכנית, "
|
||||
1968/00,ed5aaace-e748-4e6d-88c3-0911b86defc4,approved,rejected,3,0.8833,04eec32c-069d-4300-8edd-0acaf76e5046,"שלילת הסיכוי להגדיל את ערך המקרקעין על ידי שינוי ייעוד או קבלת היתר לשימוש חורג עשויה להיחשב פגיעה בת-פיצוי לפי סעיף 197, ובלבד שהסיכוי אינו קלוש ורחוק אלא ודאי"
|
||||
1968/00,03060940-01dc-4260-9484-96a5cbe4817e,approved,approved,3,0.9233,17f3126b-dbc7-49f6-8bdb-15f5800d909a,"הכרזה על קרקע (כגון הכרזה לשימור קרקע חקלאית) המגבילה בנייה ושימושים אינה מקימה כשלעצמה זכות לפיצוי בעל הזכות במקרקעין בגין הפגיעה בקניינו הנובעת מאותן הגבלות, "
|
||||
1968/00,78767bc4-f119-4bbf-89d2-a64f74ac557c,approved,rejected,3,0.8833,f6de89bd-4b5d-44d4-81d8-fa0735c2e9ca,"מקום שקיים פער זמנים, ואף פער של שנים, בין הכרזה על קרקע (למשל כחקלאית) לבין אישור התכנית הפוגעת, ראוי לראות בשני השלבים הליך תכנוני אחד לצורך חישוב היקף הפגיעה"
|
||||
1968/00,dc161d0e-d811-4f3d-8e61-f61115140f51,approved,rejected,3,0.8833,6e1b8d5f-cfa4-4c83-8a04-fca7c4dd25d0,"חופש הפעולה הנתון לרשות התכנונית לבצע פגיעה תכנונית במקרקעין ללא תשלום פיצוי הוא מצומצם, ויש לפרשו בצמצום, נוכח מעמדה החוקתי של זכות הקניין שנפגעה."
|
||||
1968/00,3ceb2ecd-8215-4695-92a0-8a1a01f7dd98,approved,rejected,3,0.8933,7994f4af-9566-4473-bd22-5fb38b3bcef7,"מי שרכש זכות במקרקעין לאחר פרסום הכרזה המגבילה את ייעודם (למשל לחקלאות) אך לפני החלת התכנית הפוגעת, רכש מלכתחילה זכות קניין מופחתת בשווייה עקב ההכרזה; על כן שיע"
|
||||
1968/00,3d1d1443-5d9c-4fa5-8d68-63f3f128f510,approved,approved,3,0.9567,0db8acc5-5fa9-42dd-9838-35b30a7b8541,"תכנית מיתאר ארצית גוברת מבחינת מעמדה התכנוני על תכניות הנחותות לה במידרג התכנוני, ובהעדר הוראה אחרת בתכנית הארצית גוברות הוראותיה על כל הוראה סותרת בתכנית נמוכה"
|
||||
1968/00,9b3d85ef-2995-47cc-a61c-211afa37d010,approved,rejected,3,0.8733,ffa780ce-a80c-44c9-964b-e0237e8373e7,"הוראת תכנית ארצית המעניקה עדיפות לתכנית מיתאר מקומית קיימת הקובעת מרחק שונה בין קו בניין לציר דרך, חלה רק מקום שהתכנית המקומית מתייחסת לאותו סוג דרך אליו מתייחס"
|
||||
1968/00,dfaaf4bc-c74c-4334-8f6d-ffa473d466f0,approved,rejected,2,0.9,a0ff1cd8-7571-4f0a-9b3b-10f8a31be79a,"סעיף 5(ב) לת.מ.א. 3 מאפשר לתכנית מיתאר מקומית עתידית לקבוע מרחקים בין קו בנין לציר דרך השונים מאלה שבסעיף 5(א), בהתחשב בצרכים מקומיים מיוחדים, ובכפוף להליכים הת"
|
||||
1968/00,c4d3af3d-2bae-4be2-b53b-1eee4a307a8c,approved,rejected,3,0.89,58a97a51-3374-4b1a-89e8-f87409543cf2,"לצורך אומדן הפגיעה והפיצוי לפי סעיף 197 לחוק, מקום שתכנית פוגעת משנה ייעוד קרקע מבנייה לחקלאות, יש לאמוד את שווי הקרקע כמצבה עובר לתכנית הפוגעת אל מול שווייה כמ"
|
||||
1968/00,48d9f6ba-9cbf-4529-9b5e-fb076a5d7bfe,approved,rejected,3,0.8067,0fe9f1a4-6f98-4d78-8f09-8eacfcd348cd,"בבחינת שאלת הגריעה משווי הקרקע בעקבות תכנית פוגעת יש להעריך, במסגרת ההערכה השמאית, את שולי הסיכוי לממש אפשרויות בנייה שנותרו אף בהינתן מגבלות תכנוניות קודמות."
|
||||
1968/00,e5e53a21-fe59-4091-96dd-17f68794a49f,approved,rejected,3,0.8933,e629926e-fee1-4850-83c9-1a6079681310,בתביעת פיצויים לפי סעיף 197 לחוק התכנון והבניה מוטל על התובע נטל ההוכחה לביסוס שיעור הפגיעה במקרקעין; משלא הוכח שיעור הפגיעה — ולו ניתנה לתובע הזדמנות מלאה להצי
|
||||
1968/00,e36190bf-7b3e-4084-ae6a-e9f32031623e,pending_review,rejected,1,0.9,1291118a-741d-402a-9d89-cd9607362349,"שאלת חלותו של הפטור מתשלום פיצוי לפי סעיף 200 לחוק התכנון והבניה מתעוררת רק לאחר שהוכחו עצם הפגיעה במקרקעין ושיעורה; כל עוד לא הוכחה פגיעה, אין מקום להיזקק לשאל"
|
||||
2970-06-25,6804f0c8-7771-4ec2-a7f4-1076567b1c9a,pending_review,approved,3,0.9,018c8638-8340-4f5b-9fec-f5b22b1ccd32,טענות המכוונות כלפי ביצוע צווי הריסה מינהליים שהוצאו מכוח חוק התכנון והבנייה יש להפנותן לבתי המשפט המוסמכים לדון בכך — בין בבקשה לעיכוב ביצוע לפי סעיף 254ט לחוק
|
||||
2970-06-25,61dc2d97-ca1f-4df3-b522-f073c508ad6e,pending_review,approved,3,0.9267,65a99712-374d-4914-a4ba-40b6cf3a4ab8,"החרגת החלטות שרים מסמכותו של בית המשפט לעניינים מינהליים, לפי הפרטים בתוספת הראשונה לחוק בתי משפט לעניינים מינהליים, חלה רק על החלטות המתקבלות בפועל על-ידי שר. "
|
||||
2970-06-25,ca59ed54-9a66-44b8-afb4-efd96a8ef83e,pending_review,approved,2,0.875,4baf1404-5a66-4bd7-826a-f918870e1f32,החלטות שעניינן תכנית מתאר מקומית מצויות בגדר סמכותו של בית המשפט לעניינים מינהליים לפי פרט 10(א) לתוספת הראשונה לחוק בתי משפט לעניינים מינהליים; החריג שבאותה הו
|
||||
66734-09-24,0a3dd432-d807-4647-bf69-9189b2b64894,pending_review,rejected,3,0.8833,693357f5-b54f-4133-9b35-9e02d5f911e4,"לוועדת הערר נתונה סמכות לדון בעררים על החלטות הוועדה המקומית או רשות הרישוי המקומית בעניין היתרי בניה, לרבות בהיתרים שכבר הונפקו; כאשר עולה טענה כי ההיתר סוטה מ"
|
||||
66734-09-24,e57fd78b-1206-4ccf-9bd7-846900204d1d,approved,rejected,3,0.8833,f77bff01-84cb-40ca-b395-605443799df7,ועדת הערר קונה סמכות לדון בערר על היתר בנייה רק מקום שבו היא קובעת כי ההיתר סוטה מן התכנון הקיים; אין די בעצם העלאת טענה כי ההיתר אינו תואם תכנית.
|
||||
66734-09-24,532d0698-f2a2-4766-a9ae-3347dc0658f9,approved,rejected,3,0.8833,b3de775c-33f9-403e-a1c8-fac09c14f29b,"משקבעה ועדת הערר כי ההיתר סוטה מן התכנון הקיים וקנתה סמכות לדון בערר, היא רשאית לבחון את כלל פרטי ההיתר, ואין היקף בחינתה מוגבל לסוגיית הסטייה בלבד."
|
||||
66734-09-24,df2effda-0542-46db-966f-6f9072990090,approved,approved,3,0.9233,62a7c68d-ab5f-49b5-81b5-128f3d47abb4,"ועדת הערר היא מוסד תכנון ואינה כבולה לעילות ההתערבות מן המשפט המנהלי בבואה להתערב בהחלטת הוועדה המקומית, אלא רשאית להחליף את שיקול דעת הוועדה המקומית בשיקול דעת"
|
||||
66734-09-24,d2323dd3-0cba-4b7c-949f-55a2b8299a0a,approved,rejected,3,0.8833,276a1cf0-1adf-41ab-8885-c8471b5a1b5e,"כאשר נטענת טענה כי ההיתר שהונפק אינו תואם לבקשה להיתר שאושרה ושנשלחה למתנגדים, חובה על ועדת הערר לדון בטענה ולהכריע בה, שכן הכרעה בכך מצויה בלב ליבת סמכותה ואין"
|
||||
66734-09-24,ebff8004-153f-4476-ae65-047d57650204,approved,rejected,3,0.83,cd9a0942-8b20-4340-8125-092f82b35553,"ועדת הערר מוסמכת לקבוע, על יסוד החומר שלפניה, מי ביצע שינוי או תוספת בבקשה להיתר, ככל שקביעה זו דרושה להכרעה בערר; ואולם עצם קיום הסמכות אינו מחייב את הוועדה לה"
|
||||
66734-09-24,50490861-5af6-4d1e-a197-26d9ae1cf3e3,approved,rejected,3,0.86,9f299ac4-0ccf-4aac-8d78-1198aa141039,"קביעה בדבר היסוד הנפשי — האם גורם הוסיף פרטים לבקשה להיתר ביודעין כדי להתחמק מהתנגדויות, או שמא מתוך רשלנות — אינה בסמכות ועדת הערר, שכן אין לה הכלים הדיוניים ו"
|
||||
66734-09-24,97aa5400-0077-4c31-9010-082e5891ad82,pending_review,approved,3,0.9,412dc940-d932-42e8-9301-b8a9417ffadf,"חוקיות היתר בנייה נבחנת במישור האובייקטיבי, ולצורך הכרעה בה אין צורך לברר את היסוד הנפשי של מבקש ההיתר — אם פעולת ההוספה של רכיב בנייה להיתר נעשתה ביודעין, בכוו"
|
||||
66734-09-24,2bd17ef0-c4e3-49dd-a510-c0de159cf7fa,approved,rejected,3,0.8833,6409799a-c9b7-4efb-92c2-fef2aba4e48e,"היתר בנייה הכולל רכיבי בנייה שלא נכללו בבקשה להיתר שהוגשה ונדונה בפני הוועדה המקומית, ואשר נוספו רק בשלב מתן ההיתר עצמו, הוא היתר בלתי חוקי."
|
||||
66734-09-24,595da189-7415-4d64-9b74-1ef7df54da35,pending_review,rejected,3,0.84,78733d3e-2b73-4aa5-a471-9f09a3a02638,"מכוח תקנה 6(ב) לתקנות התכנון והבנייה (רישוי בנייה), תשע""ו-2016, חב עורך בקשה להיתר בחובה לשמור ברשותו את העותק המקורי של כל מסמך שצורף לבקשה בדרך של סריקה ממוחש"
|
||||
66734-09-24,a6e3a288-99a5-40c4-a3f9-fc651f54d753,pending_review,rejected,3,0.8733,e2d05c6e-119e-4124-8092-e90ea462ee41,"את הגדרת ""מרתף"" שבתכנית יש לפרש וליישם בהתאם לתנאי המגרש בפועל; חלל הבנוי מעל מפלס הכניסה הקובעת ובמפלס זהה לזה של יחידות הדיור המבוקשות אינו יכול להיחשב ""מרתף"""
|
||||
66734-09-24,abc57046-9948-4709-9bfa-17bd851713e1,pending_review,rejected,3,0.8733,896bf84e-06cf-44db-88d6-23ca7eafdd3c,"הנמקתה של ועדת תכנון ובניה נבחנת לפי מבחן הקורא הסביר; אין פגם בהנמקה כאשר פרט מסוים אינו מצוין במפורש במקטע מסוים בהחלטה, ובלבד שהדבר ברור לקורא הסביר מן ההקשר"
|
||||
66734-09-24,fe1a68ff-6085-4735-b518-c2af0b7094e3,approved,rejected,3,0.84,ed07843d-d352-4cd8-bdcd-575f566ea196,"תקנות הבנייה במרווחים (תקנה 4.09) מתירות בניית מדרגות וכבשים בלתי מקורים, או מדרגות וכבשים במפלס הכניסה הקובעת לבניין, אך אינן מתירות בניית כבש כניסה מקורה במפל"
|
||||
66734-09-24,e58db3c6-18e7-40b9-971e-f7cedd791020,pending_review,rejected,3,0.8067,94fac9fa-8eeb-482e-8808-4f4ded7801f8,"סיווג מבנה כ""קיר תומך"" אינו פוטר אותו מן הדרישות המהותיות של תקנות הבנייה במרווחים, ובכלל זה הדרישה לנסיגה ולעמידה בגובה המותר."
|
||||
66734-09-24,45402199-e31d-40b8-a911-a1768f93dd83,approved,approved,3,0.9233,f7bac025-b101-4e4e-b8bc-39c8cd370f35,"חוקיותו של היתר בנייה נבחנת לפי מצב התכנון שחל על המקרקעין במועד מתן ההיתר. תכנית מאוחרת המכשירה את הבנייה המבוקשת אינה מרפאת בדיעבד היתר שניתן שלא כדין, אלא רק"
|
||||
66734-09-24,2d7a0392-75d2-45c9-86df-47165bfaa9b0,approved,rejected,3,0.8833,fb92cd9d-a8c7-4c1b-b093-811a22b5287c,"התערבות בית המשפט המנהלי בהחלטת ועדת ערר תהיה מצומצמת ומוגבלת כל אימת שלב ההחלטה הוא ניתוח מקצועי-תכנוני, ובכלל זה בחינת נספחי בינוי מקצועיים של תכניות והיתרים "
|
||||
66734-09-24,27904ae4-29b5-4b5c-87df-d140d17f3802,approved,approved,3,0.9167,c67bcf2f-f6f6-4c07-86c6-c404f14cfd74,"מקום שהחלטת ועדת הערר נסבה על ניתוח פרשני של הוראות תכנית או של הדין, אין לוועדת הערר יתרון על פני בית המשפט, שהוא הפרשן המוסמך של הדין, ובמישור זה לא חל ריסון "
|
||||
66734-09-24,68bfac2e-4b58-447c-9a45-023e7c4af8da,pending_review,rejected,3,0.89,f1cbdd78-0936-476c-a1cf-2f2712d53b92,"מקום שתקנון תכנית קובע קווי בניין באופן מפורש בטבלת הזכויות ומורה כי הוראה זו גוברת בעת סתירה על הוראות אחרות בתכנית ובתשריט, נספח בינוי ייחשב כמתיר חריגה מאותם"
|
||||
66734-09-24,ab376b48-7963-4df2-9b47-5cbb9ba6618f,pending_review,rejected,3,0.86,9f39f27e-d5cd-4443-a33d-b7581fd76d01,"כאשר מתבקש אישור לבניית מבנה מאסיבי הנבנה עד גבול המגרש, נדרש שמסמכי התכנית (תקנון התכנית או נספח הבינוי) יכללו אישור מפורש וברור לבנייה כזו; היעדר אישור מפורש "
|
||||
66734-09-24,82944683-dfcd-429b-9526-cdcbf46f1638,pending_review,rejected,3,0.8733,34d0a8ac-d4e6-4560-9579-6437b30c34d0,"המונח ""חצר"" בתכנית או בנספח בינוי המתיר הקמת חצר מחוץ לקווי הבניין מתפרש כשטח פתוח, פנוי מבנייה, המקיף את הבית; ככזה אין בהוראה כאמור כדי להכשיר הקמת מבנה מסיבי"
|
||||
66734-09-24,79f73fcb-24c0-4bd6-8875-ebb4a1e0858d,pending_review,rejected,3,0.8467,64951859-339e-4c70-9645-cae53df0c9bd,"כאשר קווי הבניין נקבעו במפורש בתקנון התכנית ובנספח הבינוי, נתונים מפורשים אלה גוברים על הנלמד מחתך (section) בנספח הבינוי, ככל שקיימת סתירה ביניהם."
|
||||
66734-09-24,d43bc57c-fa93-4884-8720-2b443842687f,pending_review,approved,3,0.9,eec96bd6-d2f4-4a29-8a1a-316ad5bff869,"נקודת המוצא בפסיקת הוצאות ושכר טרחת עורך דין היא שהצד שטענותיו נדחו יישא בהוצאות הצד שטענותיו התקבלו; ואולם זו נקודת מוצא בלבד, ועל בית המשפט לשקול שיקולים נוספ"
|
||||
56411-06-24,cfdd399a-93a0-4006-9296-cede3166b087,approved,approved,3,0.8833,a5b9bfc9-b499-4f68-bf59-0b1040bcafbc,"רשות הרישוי משמשת ""שומר סף"" של האינטרס הציבורי בשמירת חניות נגישות לייעודן; הצמדת חניה נגישה לדירת מגורים הופכת אותה לקניינו הפרטי של בעל הדירה ושוללת את תכליתה"
|
||||
56411-06-24,f22d4701-cdbb-4976-a2c3-13d4397b5f21,pending_review,approved,3,0.8733,92ed0361-7c32-4a28-af4e-77cd476ac114,"כאשר מוקד המחלוקת נע מהתחום התכנוני הצר (תקיפת היתר בודד) אל עבר התחום המשפטי-מינהלי (תקיפת מדיניות כללית של הרשות או של מוסד התכנון), בית המשפט לעניינים מינהלי"
|
||||
56411-06-24,bb379abe-1c40-4a5b-8662-45eadc729673,approved,approved,3,0.9067,fd7c0c2a-0916-4edc-99c9-8910b62665c4,טענה לסטיה מתכנית המופנית כלפי החלטה ליתן היתר בניה צריכה להתברר בדרך של ערר לועדת הערר; זאת להבדיל ממחלוקות קנייניות ומחלוקות בשאלות שימוש וחזקה הנדונות בערכאו
|
||||
56411-06-24,9a5fdb8e-34fe-403f-a61c-8ebf051dc4e8,pending_review,approved,3,0.86,797ddfdd-1a42-4629-9482-6ad92f53b9fb,"על אף הכלל המנתב טענות תכנוניות לועדת הערר, במקרים חריגים רשאי בית המשפט לעניינים מינהליים לפתוח את שעריו בפני עותר המלין על החלטה ליתן היתר חרף טענה לסטיה מתכנ"
|
||||
1180-11-25,703234bc-3a2a-485e-8a81-7479a7940121,approved,rejected,1,0.9,93140a7d-29e1-4b49-bfa4-c13edd505e10,"זכות הערר מכוח סעיף 152(א)(1) לחוק התכנון והבנייה מוגבלת למקרים שפורטו בהוראת החוק בלבד, ובכל הנוגע למתנגדים היא קמה אך ורק כנגד החלטה הדוחה התנגדות שהוגשה לפי "
|
||||
1180-11-25,90153db2-2dd2-4cd9-b242-c895937edc76,approved,rejected,1,0.95,23a6c195-86a5-4b3c-b99d-7e8066dd3cdb,"סמכותם של מוסדות התכנון מוגבלת לשאלות תכנוניות בלבד, ואין הם מוסמכים להכריע לגופן בשאלות קנייניות; שיקולי רשות הרישוי מוגבלים לשיקולים תכנוניים הנובעים מהוראות "
|
||||
1180-11-25,81c40339-6409-4896-8ca7-bb26d1d0fa74,approved,approved,2,0.9,034ec357-6b34-4f7c-b470-3bb8f9287a4f,"על הועדה המקומית מוטלת חובה לוודא, ברמת שכנוע מנהלית מספקת, כי מבקש ההיתר הוא בעל זכות קניינית במקרקעין או מי שקיבל הסכמה לכך מבעל זכות; חובה זו, להבדיל מבחינת "
|
||||
1180-11-25,6052c22f-edc3-42fd-b469-ac126d8204ad,approved,rejected,3,0.8067,741352b5-f84e-48b4-8318-fa5228a32379,העובדה כשלעצמה שבקשה להיתר נעדרת תימוכין קנייניים אינה מקימה זכות ערר למתנגד לאותה בקשה. אף שלבעל זכות במקרקעין נתונה זכות להגיש לוועדה המקומית התנגדות קניינית
|
||||
1180-11-25,530b6c53-d65c-42fe-82b6-f554ea189414,approved,approved,2,0.9,803b4aa0-b0e7-40b0-8cbe-94d0eafb690d,"בהיעדר הסכמת כל בעלי הזכויות במקרקעין, רשות הרישוי רשאית — אך אינה חייבת — לבחון בטרם דיון בבקשה להיתר את ההיתכנות הקניינית העתידית למימוש ההיתר; בחינה כזו אינה"
|
||||
1180-11-25,036c9723-960a-4259-bf2c-0e9963c1f607,approved,approved,2,0.9,e6edf916-1689-481b-b612-7b20b596528c,"אין חובה על מבקש היתר לנצל את מלוא זכויות הבנייה העומדות לרשותו, ואי-ניצול מלוא הזכויות אינו מהווה סטייה מתכנית."
|
||||
1180-11-25,3e63fb0d-ebb7-4725-bdbd-8b12a3348c9d,approved,rejected,2,0.875,ac57a30d-0d19-478c-a92b-89bf7587215b,"נספח אדריכלות שצוין בדברי ההסבר לתכנית כמסמך רקע מהווה חלק בלתי נפרד מהתכנית המאושרת, ובקשה להיתר התואמת אותו אינה סוטה מן התכנית."
|
||||
1180-11-25,1bc60510-fb30-4164-b86f-360217941d39,approved,approved,2,0.9,fa1d636e-8fd2-4abb-a3d6-674a3b123950,"השגה התוקפת בפועל את תוכן התכנית המאושרת עצמה אינה טענת סטייה מתכנית, ולוועדת הערר אין סמכות לבטל או לשנות תכנית שקיבלה תוקף ומהווה דין; תקיפת התכנית כפופה למוע"
|
||||
1180-11-25,25335115-a813-4bf5-a98e-3b96f72e4a52,approved,rejected,2,0.875,c42fc939-ed1f-4996-bfe8-c2ea8b22e221,"סמכות ועדת הערר מתרחבת, מעבר למקרים המנויים בסעיף 152(א)(3), גם למקרה שבו מתנגד למתן היתר טוען כי ההיתר סוטה מתכנית; או-אז תבחן הוועדה את הטענה — מצאה כי ההיתר "
|
||||
1180-11-25,9d47a95d-c353-4ba0-8a4e-aa4f19b7ef7b,approved,approved,2,0.9,a827b105-c763-49c0-a653-d9ef83e1f13f,"בביקורת שיפוטית (וערעורית) על החלטת רשות רישוי בנוגע ל""תימוכין קנייניים"" של מבקש ההיתר, השאלה אינה האם קיימת למבקש זכות קניינית, אלא האם החלטת הרשות חורגת ממתחם"
|
||||
1180-11-25,cab09e0d-b022-4baf-a42c-eb5c9a13f246,approved,rejected,3,0.86,4b240b59-0aed-405f-ad62-a37b3e1ffd74,"ההלכה בעניין טליאט, לפיה רשות רישוי רשאית להסתפק בהסכמת 75% מבעלי הדירות בבית משותף כראיה לתימוכין קנייניים, מקנה לרשות רשות (אפשרות) ולא חובה; הרשות אינה מחויב"
|
||||
1180-11-25,fa6ee6fe-d1e1-4ae7-afef-cdc380352b8a,approved,rejected,1,0.8,88139575-c74a-42e4-91af-44e5d8a98072,"החלטת רשות הרישוי לדון בבקשה להיתר נתונה לשיקול דעת רחב התלוי בנסיבות הקונקרטיות של כל מקרה, ומתחם הסבירות עשוי לכלול החלטות לכאן ולכאן; אין בהתערבות בית המשפט "
|
||||
1180-11-25,0ac77570-164c-4e39-b4df-8b41b03e8fb9,approved,rejected,0,0.0,09dc328c-c45e-4b50-81ca-6b07c843e95f,החלטה לאשר בקשה להיתר בנייה ניתנת במישור התכנוני בלבד; אין היא מהווה אישור לפי חוק המקרקעין ואין בה כדי לגרוע מהוראותיו.
|
||||
1180-11-25,301bce3c-315c-4152-acea-717edc851710,approved,rejected,2,0.825,199cf0ba-f73c-4dc8-9366-1ff167ee9f72,"כאשר קיים סיכוי סביר שהיתר תואם-תכנית יוכל להתממש — לרבות בשל קיומו של הרוב הדרוש לפי חוק המקרקעין להרחבת דירה — אין בקיום הדיון התכנוני בבקשה משום ""השחתת זמנה"""
|
||||
1180-11-25,4531c9ff-c554-4370-b942-eca08108c8fa,approved,rejected,2,0.9,2c207edb-e403-4cce-bee7-cc8e7a503486,"ועדת הערר אינה מוסמכת לדון בטענות קנייניות, ובכלל זה טענות שלגביהן קיימת מחלוקת כנה בין הצדדים וטענות בדבר חזרה מהסכמה שניתנה לקידום בקשה להיתר; בעל טענה כאמור "
|
||||
1180-11-25,c5bb7a0c-a7fc-42e4-8511-599f5e25917e,approved,rejected,2,0.9,58724b98-31f9-46d9-be24-eeb48c0e9e7d,זכות הערר מכוח סעיף 152(א)(1) לחוק התכנון והבנייה קמה רק כאשר הבקשה להיתר כוללת הקלה או מהווה סטייה מתכנית; בקשה שאושרה כתואמת תכנית ואינה כוללת הקלה אינה מקנה
|
||||
2654/24,fb537c4a-0077-42ff-bd3d-3dbbb2562932,pending_review,approved,3,0.9233,8f5ab887-18c8-42dc-a441-9e39fcb56e5f,"החלטה בדבר הכללת מקרקעין בתחום המיועד לאיחוד וחלוקה צריכה להתקבל על בסיס שיקולי תכנון וקידום יעדי התכנית, ואין הרשות רשאית להחיל מנגנון זה מטעמים של פיצוי בעלי "
|
||||
2654/24,37c8e6c9-0178-460d-b3cf-55540ea56c20,approved,approved,3,0.8833,6b5abf67-2782-4050-b8d0-2506793982ff,"ההלכה השוללת שימוש במנגנון איחוד וחלוקה לשם פיצוי בלבד אינה יוצרת מניעה קטיגורית מהפעלת המנגנון בתשתית לאומית (תת""ל); יש לבחון כל מקרה ונסיבותיו, ובכלל זה אם קי"
|
||||
45282-04-24,826f3e9a-b75f-453b-9d07-7f6ca7af6061,approved,approved,3,0.95,f38070f9-78f5-4c9a-8e9e-c80871e10b5d,"בית המשפט אינו ממיר את שיקול דעתו המקצועי בשיקול דעתן של רשויות התכנון, והתערבותו השיפוטית בהחלטות תכנוניות נעשית במשורה ובעילות מובהקות בלבד — כגון חריגה מסמכו"
|
||||
45282-04-24,7b984992-d1f8-44ec-a1ac-633179b59b61,pending_review,approved,3,0.9233,2309b2ee-2cf2-4630-b433-00397f9afd62,"החלטות מוסדות התכנון חייבות לעמוד בכללי המשפט המינהלי, ובכלל זה להתקבל על בסיס תשתית עובדתית מלאה ורלוונטית, בהתחשב בשיקולים הצריכים לעניין, בסבירות ובמידתיות."
|
||||
45282-04-24,d782cf1d-9031-40eb-aeaa-7ef558055319,pending_review,rejected,3,0.8933,8a41fc9f-5242-44a1-a1c4-e73f595109ae,"לעניין בחינת התנאים להגשת תכנית לפי תקנות התכנון והבניה, מקום שמדובר בבית מורכב כהגדרתו בסעיף 59 לחוק המקרקעין, ובמקרה של הרחבה או הריסה במבנה אחד בלבד שאינה כו"
|
||||
45282-04-24,7f64b88a-cf64-455c-8c85-4a269b9cf59e,approved,rejected,3,0.8833,a6330cc1-f8dd-4790-91ea-ea92795c8f68,"הגדרת ""בית משותף"" שבתקנות, לעניין מי רשאי להגיש תכנית, אינה מוגבלת להרחבת דירה קיימת בלבד; בהיעדר סיוג מפורש, ""הרחבה במבנה"" מתפרשת על פי לשונה גם כהוספת דירות ח"
|
||||
45282-04-24,90263270-6962-46cc-af7c-408274293454,pending_review,rejected,3,0.8733,3aab39ce-0792-4601-9e39-c7ca019b5b58,"כאשר ההרחבה במבנה היא מסוג תוספת דירה ונדרשת הסכמת בעלי 60% מהדירות, ""הבית המשותף"" שעליו חלה דרישת הרוב הוא המבנה המסוים שעליו חלה התכנית, ולא המתחם כולו."
|
||||
45282-04-24,e7f05794-5da7-4c59-afe2-6d6c38363a93,pending_review,rejected,3,0.9033,7391ac90-a7ed-4b71-9b10-1f7e367f0686,"טענה שלא הועלתה בכתב העתירה והמועלית לראשונה בתגובת העותר לכתבי התשובה, ניתן לדחותה ולו מטעם זה בלבד, בהיותה הרחבת חזית אסורה."
|
||||
45282-04-24,c2ad667d-aeb9-4209-b571-04cfdfb10c17,pending_review,rejected,0,0.0,81bf3aa7-1213-4bd7-8b84-8effb952860b,"לעניין סעיף 59 לחוק המקרקעין, די בכך שמדובר במבנים בעלי כניסות נפרדות כדי לקבוע כי מדובר בבית מורכב."
|
||||
45282-04-24,c510b25b-1a29-4e6e-b434-83a64874dd89,pending_review,rejected,2,0.85,7805793c-44b5-4cf6-9de9-a12b816009aa,"דברי הסבר לתקנה המבחינה בין תוספת דירה (הטעונה הסכמת רוב מיוחס) לבין שינויים פנימיים בדירה (הריסה, הרחבה או בנייה בתחומה) מתייחסים להבחנה המעוגנת בגוף אותה תקנה"
|
||||
45282-04-24,e1f4d749-06b6-43ae-9318-8707836c8e23,pending_review,rejected,3,0.8733,56b4b979-c0e5-4395-ac7e-8d1d231e5914,"טענות התוקפות את שיקול הדעת התכנוני המהותי של מוסד התכנון — כגון התאמת הבינוי לסביבה, צביון הבניה והיקף הזכויות — נוגעות לליבת שיקול הדעת התכנוני הנתון לוועדה ה"
|
||||
45282-04-24,3717eb82-888a-42ec-86b1-d9feb69f124b,pending_review,approved,3,0.9167,998a0cb5-3da1-42f4-a996-9de7c0ba0367,"לבעל מקרקעין אין זכות קנויה לכך שהבינוי והנוף בסביבת מגוריו יישארו ללא שינוי. צרכי התכנון העירוני המשתנים ומתפתחים, בפרט על רקע מחסור בדיור ומשאב קרקע מוגבל, גו"
|
||||
45282-04-24,a2a93db2-9376-45db-b824-cbc78100a70c,approved,rejected,3,0.8867,e146764f-adef-4e24-b371-1dac52b5d31f,טענות הנוגעות למישור הקנייני — כגון ההסכמה הנדרשת מבעלי הדירות לפי דיני הקניין והוראות תקנון הבית המשותף — אינן מתבררות בגדרה של עתירה מנהלית בענייני תכנון ובני
|
||||
45282-04-24,911354b5-6e8e-477c-8aee-cdb516268d5b,pending_review,rejected,3,0.8833,8d610179-cb0d-4f33-80b6-99c48ceb541d,טענה בדבר נזק העלול להיגרם למקרקעין קיימים כתוצאה מתוספת בינוי המאושרת בתכנית אינה מקימה עילה להתערבות באישור התכנית; המענה לפגיעה כזו מצוי בגדרי פרק ט לחוק התכ
|
||||
45282-04-24,24af66aa-ccf0-43c4-b55e-7404ff2d1b08,pending_review,approved,3,0.9233,5a7bae77-46e3-4c79-9719-589adb4d9c6e,"רשות ערר למועצה הארצית על החלטת ועדה מחוזית תינתן רק מקום שהעניין חשוב עד כדי הצדקה לערב את המועצה הארצית; חשיבות זו עשויה לנבוע מהיות העניין בעל השלכה רחבה, מא"
|
||||
45282-04-24,a88c0e30-59fc-4037-bdfb-cc10b1c1e449,pending_review,approved,3,0.9233,d55110c7-e0ce-438a-99d2-74338577bd4e,פנייה לקבלת רשות לערור בפני המועצה הארצית לתכנון ולבנייה אינה מהווה צעד היוצר שיהוי בהגשת עתירה מנהלית; מניין הימים להגשת העתירה מתחיל ביום דחיית בקשת רשות הערר
|
||||
45282-04-24,f23d091e-dddf-4bf4-a307-12f86aba6d98,pending_review,rejected,3,0.8067,a003b482-dde0-43b1-8614-7959d0648c0e,"מחלוקת על פרשנותן הראויה של הוראות חוק או תקנות היא שאלה של פרשנות משפטית ולא סוגיה תכנונית. משנדחית הפרשנות המוצעת כנעדרת יסוד, אין בכך כדי להקים טענה בעלת חשי"
|
||||
45282-04-24,c1148855-90dd-4aa6-94e2-02c37bb5485b,approved,rejected,3,0.9,040cdb77-8f17-400a-8bd2-b17d73da79f0,"עצם פרסומה של תכנית ברשומות וכניסתה לתוקף אינם שוללים את סמכות בית המשפט להתערב בהחלטה על אישורה. כדי שתתקבל טענת ""מעשה עשוי"" נדרש להראות כי מדובר בעניין שאינו "
|
||||
45282-04-24,b052169a-5774-4a84-a0f8-79802fed7806,pending_review,rejected,3,0.8867,48e8e679-c297-48d3-9577-c415daa14417,"הסתמכות בעלי זכויות וצדדים שלישיים על כניסתה של תכנית לתוקף אינה בגדר הסתמכות סבירה כל עוד לא חלף המועד הקבוע בדין להגשת עתירה נגד התכנית, ועל כן אין בה כדי לבס"
|
||||
45282-04-24,105c056a-9deb-49f8-9a51-6e002f9eb530,pending_review,rejected,3,0.8733,62fab0a9-3081-4918-8cfd-ce904c8974fd,"בית המשפט לעניינים מינהליים מוסמך לדחות עתירה על הסף, ללא קיום דיון בעל פה, מקום שההליך אינו מגלה עילה להתערבות שיפוטית; הגם שכאשר הוגש כתב תשובה מתקיים דיון ככ"
|
||||
45282-04-24,c6002622-6bf7-40e4-9442-b2ff254fa707,pending_review,rejected,3,0.8733,a0752207-7cd3-49fc-80de-28ce4e3b7322,"מימוש זכות הטיעון אינו מחייב בהכרח קיום דיון בעל פה, מקום שניתנה לבעל הדין הזדמנות מלאה לפרט את טענותיו בכתב."
|
||||
45282-04-24,c48ab734-dd5d-491c-b3c9-297a5e6d7484,pending_review,rejected,3,0.8733,43cd72bc-d1b1-4691-96da-dd738039b704,"פסק דין קצר שאינו כולל דיון ממצה בסוגיה משפטית קשה להיחשב כהלכה מחייבת לעניינה, ואין בו כדי לחייב ערכאה הדנה באותה סוגיה במקרה מאוחר."
|
||||
1109-25,a591b262-ddfd-45b0-bb4c-6fba5f794877,pending_review,approved,2,0.9,a7854c32-7a37-4519-851f-8b0021067688,"הסכמה דיונית מפורשת, ברורה וחד-משמעית התוחמת את גבולות הדיון לסוגיה מסוימת, מהווה ויתור על יתר הטענות; משכך אין בעל-דין רשאי להעלות לאחר מכן טענות שמשמעותן חזרה"
|
||||
1109-25,05d301ce-e0b1-4ad3-bbf3-c4ea2f97c241,pending_review,rejected,2,0.81,44a2ed82-de6f-4d00-b140-633e37422188,"דרישת תשריט החלוקה (תצ""ר) והרישום התלת-ממדי נועדה להסדיר חלוקת זכויות בתת-הקרקע בין בעלים שונים; מקום שבו המגרש כולו, על כל רבדיו, שייך לגורם אחד, מתייתרת התכלי"
|
||||
1109-25,4800d57e-3646-474a-bdff-d407ccc94fde,pending_review,approved,2,0.9,4fc5eca6-3067-46b4-8584-b17e868a7212,"טענה שהעלה בעל דין בהליכים קודמים ונזנחה על ידו אינה בגדר ""פגם שזה עתה התגלה"", ואין לקבלה כאשר היא מועלית מחדש בשלב מאוחר של ההליך."
|
||||
1109-25,1721fc08-bf6c-4a58-9718-5c69a64b3860,pending_review,approved,2,0.9,94d504c5-7263-429e-8a9a-9413ee859224,"מוסד תכנון המקיים דיון חוזר רשאי להותיר את החלטת ועדת המשנה על כנה, ובלבד שבחן את ההחלטה ושקל אם יש מקום לשנותה; אימוץ החלטת ועדת המשנה לאחר בחינה כאמור הוא החל"
|
||||
1109-25,15dd02ab-1db5-40e0-91ef-e3eadcef93cb,pending_review,approved,2,0.875,36613a6f-169a-4651-be38-2c60f0026f25,"כאשר הוועדה המקומית ויועציה המקצועיים בחנו סוגיה מקצועית מובהקת (כגון פתרון חניה) במסגרת דיון סדור ומפורט התואם את מסמכי התכנית, ולוועדת הערר אין יתרון מקצועי ע"
|
||||
1109-25,0def1c51-224c-4d77-8d16-06eaa5a1146e,pending_review,approved,2,0.9,d21397e4-fee9-4a35-aaf7-96ae7b8673af,"טענה שמהותה השגה על התכנית עצמה ועל מאזן החניה הקבוע בנספח התנועה שאושר במסגרתה, להבדיל מהשגה על אופן יישום התכנית בבקשה להיתר, אין לה מקום במסגרת ערר על ההיתר;"
|
||||
1109-25,500e245c-78ea-4e5a-81f7-4d62e8baef07,pending_review,rejected,2,0.875,01b39030-7b6d-4731-9f38-2da2370dd31a,"נספח תנועה שאושר ופורסם כחלק מתכנית נהנה מחזקת תקינות, לפיה חזקה כי נבדק כהלכה על ידי מוסדות התכנון בטרם אישורו; משאושר, רואים בו כמשקף את מאזן החניה הנדרש למימ"
|
||||
1109-25,cd79c730-7b2e-453e-9b59-74b5960c14a4,pending_review,rejected,2,0.825,f4d88335-1c97-44bc-9358-4ddff6b2f1fd,"מקום שבו צד מודע לסיכון להנפקת היתר ואין לו זכות קנויה להגשת ערר, מוטלת עליו אחריות לנקוט בהליכים ללא שיהוי ומתוך זהירות; לא ניתן להטיל את האחריות לתוצאה על הרש"
|
||||
1587-03-26,8650e415-d68b-402d-b38e-814e39833888,approved,approved,3,0.9167,28a595be-bcec-4c26-9754-c6e958c1fe94,בעניין תיקון טעות של הרשות יש להבחין בין שלושה סוגי טעויות: טעות משרדית-טכנית וטעות הנוגדת את החוק — שאין מניעה לתקנן; לעומת טעות שמקורה ביישום שגוי של המדיניות
|
||||
1587-03-26,7c31a25e-0303-40b8-989f-b32e843be6dd,pending_review,rejected,3,0.8733,1b988805-c125-4f4b-8a4f-1f82f21d9a3d,"הפטור מהיטל השבחה לפי סעיף 19(ג) לתוספת השלישית נבחן ברמת התא המשפחתי, ובני זוג נשואים נחשבים תא משפחתי אחד; כדי לנתק את זיקת התא המשפחתי אל המקרקעין ולבסס פיצו"
|
||||
1587-03-26,8cd77b96-5dd4-4561-ab46-70ba91a776b4,pending_review,rejected,3,0.86,4e2e2b9c-d433-44ea-ac14-60ea79947b6f,"פעולות שנועדו ליצור מצג של הפרדה רכושית (כגון עריכת הסכם ממון, שינוי הרישום לצורכי ארנונה ואטימת מעבר בין דירות) שנעשו לאחר דרישת תשלום היטל ההשבחה, אינן מבססות"
|
||||
1587-03-26,75aee3cb-bb35-44e3-b3df-082356882d27,pending_review,rejected,3,0.8067,6b87e2d8-a67f-490d-a03e-be7c3f10f0cf,"מתן פטור מהיטל השבחה טעון החלטה מפורשת של הגורם המוסמך המתקנת או מבטלת את שומת היטל ההשבחה; הודעה בלתי-פורמלית בדבר 'אישור', שאינה מוכרת למחלקת היטל ההשבחה, אינ"
|
||||
1587-03-26,b95ed76e-13cf-4fef-b241-40b3b05a7b74,pending_review,rejected,3,0.8733,39ce54b1-4538-4f6c-ac52-af622f50ce93,"תכלית הוראת הפטור מהיטל השבחה בגין הרחבת דירת מגורים היא תכלית חברתית-סוציאלית — לסייע לאזרחים לשפר את תנאי מגוריהם בלי שיחול עליהם חיוב בהיטל, ובלבד שהפטור לא "
|
||||
1587-03-26,633b24bf-296e-4f78-9074-acdadb0d958d,approved,approved,3,0.9233,019b30b4-6142-4bd9-b4ec-e60d463c4349,"היטל השבחה מוטל אך ורק מקום שבו עליית שווי המקרקעין נבעה מאחת משלוש פעולות התכנון המנויות בהגדרת ""השבחה"" — אישור תכנית, מתן הקלה או התרת שימוש חורג — ואין להטיל"
|
||||
1587-03-26,d9bbc242-3791-4516-aaa3-94006b8d1061,pending_review,approved,3,0.8867,edb8bf0a-bde5-40b6-948c-500c249adfa9,"תכלית היטל ההשבחה היא מימון הוצאות הוועדה המקומית או הרשות המקומית להכנת תכניות, פיתוח, רכישת מקרקעין לצרכי ציבור, שימור והפקעה, וביסודה עיקרון של צדק חברתי-חלו"
|
||||
1587-03-26,e71397da-d95d-4823-b952-acd0e866abfd,approved,rejected,3,0.8833,5f97c907-17fa-4bdf-9fda-56cc8b831de6,הפטור מהיטל השבחה לפי סעיף 19(ג)(1) לחוק התכנון והבניה ניתן פעם אחת בלבד לכל תא משפחתי; לצורך החלתו יש להביא בחשבון את היקף דירת המגורים העיקרית שבבעלות המשפחה
|
||||
1587-03-26,57be3dc1-9ad1-4ebd-983e-6cbff599cbe2,approved,approved,3,0.9,fb0cd448-cc48-48d0-a318-115566713cee,"ערכאת הערעור אינה נוהגת להתערב בממצאי עובדה ומהימנות שנקבעו על ידי הערכאה הדיונית, וועדת הערר משמשת לעניין זה כערכאה דיונית שממצאיה העובדתיים אינם מתערערים בנקל"
|
||||
1587-03-26,45ccfb68-ba2d-43e8-bab0-253d595f281c,pending_review,rejected,3,0.8233,3e9edbda-0501-4607-9ebc-2b39e99fb4ed,"אישור הסכם ממון בבית המשפט אינו עניין פורמאלי או טכני גרידא, וההימנעות מאישורו עשויה לתמוך במסקנה כי מדובר בהסכם למראית עין שנועד להתחמק מתשלום היטל השבחה."
|
||||
1587-03-26,6185c91b-cd57-4e64-8997-4ad348b947aa,approved,rejected,3,0.8833,b9d031a6-2ce4-4587-af5b-b5c38bc1f2dd,הפטור מהיטל השבחה הקבוע בסעיף 19(ג)(1) בתוספת השלישית אינו קובע מגבלה שלפיה ניתן להקנות פטור אחד בלבד בגין חלקת מקרקעין אחת; כל אחד מן המחזיקים במשותף בקרקע העו
|
||||
1587-03-26,8b34b97a-7506-484a-ab54-98ddf6f580b7,pending_review,rejected,3,0.8867,7facd2e5-241b-4cc6-a7cf-332135d5e933,"כאשר המחזיקים במשותף בחלקת מקרקעין הם בני תא משפחתי אחד (קרובי משפחה), יינתן להם פטור אחד בלבד מהיטל השבחה בגין החלקה, שכן מתן מספר פטורים לבני משפחה אחת חורג מ"
|
||||
1587-03-26,610dcbc5-874d-4a6a-8ef9-11437eff5a62,approved,approved,3,0.9233,ef7fe032-e305-4d63-80a6-a0a068683b39,"לעניין הפטור מהיטל השבחה לפי סעיף 19(ג)(1) לתוספת השלישית, מקום שבמצב הקודם שטח הדירה עולה על 140 מ""ר, אין כל זכאות לפטור — ללא תלות ביתר התנאים."
|
||||
1587-03-26,db16bf92-2c2e-4627-b1e7-121fe481f25e,pending_review,rejected,3,0.8833,f275a1fb-e99a-401e-b619-ed94aac63ff1,"לשם חישוב שטח הדירה לצורך הפטור לפי סעיף 19(ג)(1), יש לבחון את השטח הכולל של כל הדירות באותו בניין שבבעלות אותו תא משפחתי; קל וחומר כאשר מדובר בדירות צמודות באו"
|
||||
4768/22,18c863a7-a087-49ac-b03a-0620232bc93c,approved,rejected,3,0.84,59ad9478-3600-4421-9cac-e55dfbc37d19,"מקום שתכנית קובעת פרק זמן לביצועה ומתנה במפורש את הארכת תוקפה באישור נוסף של הוועדה המחוזית, אין מדובר בקביעת פרק זמן 'רגיל' לביצוע אלא ב'פרשת דרכים' המחייבת אי"
|
||||
4768/22,2e1dee21-0d2f-450f-a44c-5e23a4954b57,approved,approved,3,0.8867,70e6add8-1518-404b-8644-dc4a422b3e89,"רשות תכנון הדנה בחידוש או הארכת תוקפה של תוכנית שפג תוקפה חייבת לייחס משקל ראוי למשמעות חלוף הזמן ולשינויים התכנוניים שהתרחשו ממועד אישור התוכנית, ובכלל זה לשאל"
|
||||
4768/22,0ad2c68c-8471-4b60-b81f-2939d98210ab,approved,approved,3,0.8833,5f2131b6-867f-4d6b-9ca8-d677699f3a9e,מוסד תכנון מוסמך להאריך את תוקפה של תכנית הן בתוך תקופת התכנית והן לאחר שפקע תוקפה (הארכה בדיעבד); אולם הארכה בדיעבד לאחר שתוקף התכנית כבר פקע היא בגדר חריג ולא
|
||||
4768/22,5bc9cc90-e079-4a6e-ba0f-5bd86d0514ca,approved,approved,3,0.8833,93c4da59-5d47-4e74-8479-7762c5d45226,"כאשר נשקלת הארכה בדיעבד של תוקף תכנית שפקעה, על המוסד התכנוני לבחון מהי ההצדקה המיוחדת לכך, ובכלל זה את פרק הזמן שחלף מאז פקיעת התוקף ואת השינויים העובדתיים והמ"
|
||||
4768/22,1d4d6ba7-d972-4ece-bb0b-1d28c7addd86,approved,approved,3,0.86,7eec9b8c-eabc-4a7f-9a56-4d72a05978b9,"בשוקלה אם להאריך בדיעבד את תוקפה של תוכנית, על ועדת התכנון להביא בחשבון את כלל השיקולים התכנוניים הרלוונטיים, לרבות מידע סביבתי שהתעדכן והוראות תכנית מתאר ארצית"
|
||||
4768/22,246545dd-fdf3-4306-9275-d5404f4a4e19,approved,approved,3,0.8867,8eff2928-f112-4393-ba1f-d79054d5610d,"אף שבית המשפט אינו ממיר את שיקול דעתם של גופי התכנון בשיקול דעתו, מוצדקת התערבות שיפוטית בהחלטה תכנונית כאשר מדובר בהחלטה חריגה והרשות לא ייחסה משקל לאופיה החרי"
|
||||
"עת""מ 8099-02-17",fab19f9e-ec88-47a2-afde-470e1174716f,approved,approved,3,0.9,ee87048c-3bea-4445-956d-912a8d14fe2a,"בבחינת עקרון ה'הפיכות' בהחלטה על בקשה לשימוש חורג, אין די בהבעת חשש עקרוני כי מתן ההיתר יוביל לקביעת עובדות בשטח; על הטוען לאי-הפיכות לפרט את בסיס חשש זה באופן "
|
||||
"עת""מ 8099-02-17",f3aa9a1d-9057-4f8f-aef5-d513040651b0,approved,approved,3,0.8833,aedf265b-750b-4f74-84ac-cb02d4240126,"בהיעדר תכנית כוללת שהוכנה בהתאם לדרישת תכנית מחוזית, ייעוד הקרקע נקבע על-פי התכנית המקומית החלה עליה, ולא על-פי הייעוד הנקוב בתכנית המחוזית."
|
||||
"עת""מ 8099-02-17",970160bf-8373-429c-82c2-c20fd8ab46c9,approved,approved,3,0.8733,836ce51a-1e98-4d95-ba1f-48cb6e5d2221,"קיומם של הליכים תכנוניים צפויים — לחיוב ולשלילה — מהווה אמת מידה שיש לשקול בבחינת בקשה למתן היתר לשימוש חורג, אף כי אינו שיקול בלעדי או מכריע."
|
||||
"עת""מ 8099-02-17",657cb720-0589-4832-b224-fdb8093e5e65,approved,approved,3,0.8733,ac2bc98e-d4f6-446f-83fe-2af358ed8a3b,"בבחינת קיום 'סטייה ניכרת' בבקשה לשימוש חורג, על הרשות המוסמכת לבחון את מאפייניו הפיזיים של המבנה הקיים — לרבות תשתיות ביוב, חשמל, חניה, פריקה וטעינה והסדרי תנוע"
|
||||
"עת""מ 8099-02-17",6cd0e563-7145-448f-a285-5a5a11252727,approved,rejected,3,0.8733,61963828-9544-4980-ae29-10d1437cc40e,"בחינת שינוי תכנוני מחייבת התייחסות לשלושה מרכיבים מצטברים: טיב השינוי המתבקש, נפחו והיקפו, והתכלית שלשמה הוא מתבקש."
|
||||
"עת""מ 8099-02-17",709a74a9-7f1b-4159-a4a1-e6f203dafb74,approved,approved,3,0.9067,e3c66d3d-7a20-4ed2-bea7-f11893bc5f07,"היתר לשימוש חורג נועד לשמש פתרון לבעיה מקומית, נקודתית וזמנית בלבד, עד לגיבוש פתרון קבוע בדרך של תכנית. שימוש חורג אינו כלי מתאים להקמת מיזמים מסחריים רחבי היקף"
|
||||
"עת""מ 8099-02-17",b2ebf043-2554-45b1-9712-3080b812fbf8,approved,rejected,3,0.8067,426ae251-c8c1-42e4-be64-3a46709cefbf,"ועדה מוסמכת הדנה בבקשה לשימוש חורג נדרשת להתייחס במפורש למצוקת התושבים, לרבות קשיים מיוחדים של אוכלוסייה מבוגרת; התעלמות משיקול זה מהווה פגם בשיקול הדעת המצדיק "
|
||||
"בג""ץ 2667/17",6e20a2e7-7ea4-45ab-b558-502217e56b85,approved,approved,3,0.8867,03b2b01c-5e24-493c-8588-5b9a1980b5eb,"בעתירה מינהלית בענייני תכנון ובנייה, די בשיהוי חריף בהגשתה ובקיומו של 'מעשה עשוי' כדי להצדיק את דחייתה, גם אם לא ניתן לייחס לעותרים חוסר תום לב. מקום שבו השגות "
|
||||
"בג""ץ 2667/17",f0ff9ef3-0beb-471d-8d49-ef3096ace4e2,approved,approved,3,0.8933,aaabb389-b5ca-4a9b-869f-d7a91d31aba3,"צד שפעל בחוסר תום לב, או שבחר ליטול על עצמו את הסיכון, לא יישמע בטענה כי השיהוי בהגשת העתירה פגע באינטרס ההסתמכות שלו; הנטל להוכיח התקיימות חריג זה מוטל על העות"
|
||||
"בג""ץ 2667/17",03cb3c95-dd0e-4461-8e1e-37dd960c5d18,approved,approved,3,0.8833,ff560411-b948-42b2-a3c1-7282d2769ab1,"כאשר עתירה נגד היתר בנייה מוגשת רק לאחר השלמת עבודות הבנייה, ויסודות השיהוי הסובייקטיבי והאובייקטיבי הנגועים בה הם בעוצמה רבה, די בכך כדי להצדיק דחייה על הסף, א"
|
||||
"בג""ץ 2667/17",1dff0269-8ca8-451a-b2f0-c8ab96132558,approved,approved,3,0.8833,5f4e986b-7554-45e2-89fa-9e0f856169c3,"כדי שהפרה לכאורית של תכנית תגבור על שיהוי חריף, נדרש שאימוץ פרשנות הרשות לתכנית יפגע פגיעה חמורה ומשמעותית בשלטון החוק. כל עוד הפרשנות שהעניקה הרשות לתכנית היא "
|
||||
"בג""ץ 2667/17",bc0763b2-acfd-4571-aa09-9533d775294a,approved,approved,2,0.89,57e2ea78-3d24-4f87-afc5-f7e7a6b2b92c,"כאשר חל שינוי במציאות הפיזית והושלמו עבודות בשטח, מתקיים ""מעשה עשוי"" המצדיק דחיית עתירה על הסף, שכן בית המשפט אינו נוטה ליתן סעד שיפוטי בעניין שאינו ניתן לשינוי"
|
||||
"בג""ץ 2667/17",8a6e0790-b59d-4953-9d6d-9e27c20dc9c9,approved,rejected,3,0.7733,2225f75a-7b11-4dfd-9b49-f26556678f03,"טענות הנוגעות לאופן הפעלת שיקול דעתה של רשות התכנון אינן מייחסות לה חריגה מסמכות, ואינן עומדות בנטל הנדרש לגבירה על שיהוי. אף טענה לחריגה מסמכות אינה שוללת תמיד"
|
||||
7880/15,6539df16-ed33-4348-bf08-41d5b54efdaa,pending_review,approved,3,0.89,4c9055e8-58e4-4697-99c7-54978e26070b,"תקנות החניה קובעות הסדר לגביית תשלום לקרן חניה שהוא בבחינת ברירת מחדל החלה 'כל עוד לא נקבעה תכנית מתאר', ולצד זאת הן מסמיכות את מוסד התכנון המקומי לחרוג מהסדר ב"
|
||||
7880/15,d999654e-2afb-4d42-ba9d-4945186cd57c,approved,approved,3,0.8067,31cc28e5-3ba7-4688-a7b1-70c8745bd38a,"תשלום לקרן חניה ניתן לגבייה מכוח תקנות החניה עצמן, המהוות מקור הסמכה תקף לגביית התשלום כתשלום חובה."
|
||||
7880/15,bec1fd3d-294a-4f64-b16c-5b129f545a4b,approved,approved,2,0.9,9ce42069-7dd2-49ac-8b1f-08b62d70048f,"תשלומים שגובה רשות מקומית עבור קרן חניה מכוח תכנית מתאר מקומית המסמיכה זאת, נגבים כדין ובגדר סמכותה של הרשות, ואין לראות בהם גבייה בחריגה מסמכות."
|
||||
7880/15,716dcba9-b749-4149-b073-3ba3adc92bac,approved,approved,3,0.86,7af8c8ad-f556-463d-b5ed-cf40d61c5940,"תקנות החניה נועדו, בעת ובעונה אחת, להקנות למוסד התכנון המקומי סמכות מפורשת לקבוע הוראות החורגות מברירת המחדל שנקבעה בהן לעניין קרן חניה, ולשלול את תחולת ההוראה "
|
||||
10112-01-25,53f54c51-64a7-416c-b8ae-c29e0cfbbf1c,pending_review,rejected,3,0.84,cbd55fd4-ba02-48ed-8bb9-13463e304257,"רשות מקומית שבתחום אחריותה תוקם שכונה מכוח תוכנית היא בעל דין דרוש בעתירה התוקפת את התוכנית, ויש לצרפה כמשיבה כדי לאפשר לה להביע עמדתה, במיוחד מקום שמועלות טענו"
|
||||
10112-01-25,2811fa25-b0c7-4eb5-80ff-8f4b8c941810,pending_review,approved,3,0.9167,a532d5b6-1c0e-4794-8090-32bb8fd9dd7a,"מקום בו הסעד המבוקש בעתירה עלול לפגוע בזכויותיהם של צדדים שלישיים — כגון בעלי מגרשים אחרים בתוכנית הצפויים להיפגע מהקטנת מגרשיהם, משינוי מיקומם או משרטוט מחדש ש"
|
||||
10112-01-25,bf9c0324-3b74-4413-8b21-17d315813206,pending_review,rejected,3,0.86,2c849c72-61fc-474f-9f8d-9229ac1433db,"אי-צירופם של בעלי דין דרושים להליך מהווה פגם דיוני העשוי להצדיק את דחיית העתירה על הסף, אף ללא הכרעה לגוף הטענות."
|
||||
10112-01-25,24e1a821-19bb-4565-b758-7f17fe616d19,pending_review,rejected,3,0.84,05570068-ea56-4686-9c3d-e366291aa6f3,"כדי שעיזבון יזכה בסעד בעתירה מנהלית, על יורשי העיזבון להצטרף כצד לעתירה, וכן להליך המנהלי שקדם לה; היעדר צירופם שולל את האפשרות להעניק לעיזבון סעד."
|
||||
10112-01-25,c1fff21b-3b27-46fa-bb16-c80ec7059b97,pending_review,rejected,3,0.8733,fad66a4e-e2e6-40f3-88a0-c7d6fe0145f2,השיקולים התכנוניים להתוויית תוואי התוכנית (לרבות קביעת הקו הכחול) נשקלים ומוכרעים בשלבים המקדימים לשלב ההתנגדויות — ובכלל זה בדיון לאישור התוכנית להפקדה — ולא ב
|
||||
10112-01-25,3bfaffc6-1d46-4aff-b8b0-c9c2acb9a09d,pending_review,approved,3,0.8867,53891473-8cf9-49a1-a5c2-6b42a637921f,תכנית מתאר אינה ניתנת לתיקון או להרחבת שטחה אלא אם התיקון מעוגן בצרכים תכנוניים ממשיים המשתלבים עם תכלית התכנית; פגיעה קניינית הנגרמת מהתכנון מטופלת במישור הפיצ
|
||||
10112-01-25,2ec6016e-0c5d-4e31-9c9f-796c473c3ea1,pending_review,approved,3,0.91,a8162a26-6c20-4056-9927-f6965e45b586,"מקום בו נדרש אישור תכנית תכנונית לצורך מתן פתרון לצרכי דיור של ציבור רחב, גוברים השיקולים הציבוריים על שיקוליו הקנייניים-האישיים של פרט יחיד הנפגע מן התכנון, ופ"
|
||||
10112-01-25,37898e0d-9974-4990-8302-2437509dd2e1,pending_review,rejected,3,0.8867,423b1281-f90e-408d-bab5-f030888b0a9c,המבקש לתקוף את קו התכנון (הקו הכחול) של תכנית נושא בנטל להצביע על שקילת שיקולים זרים בהתווייתה או על צורך תכנוני ציבורי לשינויה; אין די בהצבעה על אפשרות טכנית ל
|
||||
10112-01-25,219bf545-28a5-4089-a41c-8322e5609ff9,pending_review,rejected,3,0.8833,208030a4-d71f-4701-afbd-7f4304e3a153,"אין לקבל טענות המופנות כלפי רשות שלא צורפה כמשיבה להליך, שכן קבלתן ללא צירופה פוגעת בזכות העמידה שלה ובזכותה להישמע."
|
||||
10112-01-25,3edf29a4-2d81-49d4-977c-36dd3adbd013,pending_review,rejected,3,0.8833,6cfad9b3-4a8f-4141-8461-ee09c4893df2,"ראיה או חוות דעת מקצועית שניתן וראוי היה להציגה בפני ועדת התכנון, אין לקבלה לראשונה בשלב הדיון בעתירה המנהלית; על בעל הדין להביאה בפני הוועדה, שהיא הגורם המוסמך"
|
||||
10112-01-25,27df779d-59f7-4aa8-b31d-08666cc7e16f,pending_review,approved,3,0.9333,3bea9d36-4156-4680-9fbb-c5abc1bea8b2,"בית המשפט המנהלי אינו ממיר את שיקול הדעת המקצועי-התכנוני של ועדת התכנון בשיקול דעתו שלו, אלא בוחן את חוקיות וסבירות החלטתה בלבד."
|
||||
10112-01-25,cd6ac654-6b7d-4d88-9182-5bc0e71a1a56,approved,approved,3,0.9233,127f8fbc-26fd-4f2c-b925-92bf488f850a,"הוראת השוויון בחלוקה חדשה לפי סעיף 122 לחוק התכנון והבניה, הנוקטת לשון ""ככל שאפשר"", אינה מחייבת שוויון מוחלט בין השותפים במקרקעין אלא שוויון יחסי בלבד; אין חובה"
|
||||
8070-05-25,9590da2e-0c33-4cd4-b7af-2a19db99d410,pending_review,rejected,1,0.85,8c992112-7b3a-48b9-a243-3ec8032da15f,"כאשר בקשה להיתר כרוכה בשינוי מנספח בינוי קיים הקבוע בתכנית מפורטת, נדרש פרסום הקלה כתנאי לאישורה; מתן הזכויות מותנה בשיקול דעת מהנדס העיר או מי מטעמו ובהצדקה של"
|
||||
8070-05-25,18f0acb7-b45f-411b-87a7-96ca67976498,approved,approved,2,0.875,8febced0-902d-4659-8fe7-0f6fcc4e734e,"הקלה החורגת מנספח הבינוי כפי שפורסם אינה בגדר זכות מוקנית, אלא הליך הכרוך בהפעלת שיקול דעת של מוסד התכנון; משכך, אישורה כדין מהווה אירוע השבחה שבגינו נערכת שומת"
|
||||
8070-05-25,c065035c-c9da-4845-99db-24ea1fae1087,pending_review,approved,2,0.9,ae6c164a-dd7c-43c1-9d72-dd2b140ec49e,"הקלה הנדרשת ומאושרת אגב בקשה להיתר חלה אך ורק על ההיתר ועל הזכויות שהתבקשו מכוחו, ואינה משתרעת על יתר בעלי הדירות בבניין שלא נכללו בבקשה; זכויות עבורם טעונות הל"
|
||||
8070-05-25,b9d8dea5-e16d-412f-a48b-bda7d2c7e33b,approved,approved,3,0.8067,bbd36d72-a547-48da-8c9f-9ff3b10aa02c,אישור תכנית צל אינו מייתר את שיקול הדעת של הוועדה המקומית בבקשה להקלה ואינו מאיין את ההקלה; בקשה להקלה ופרסומה כרוכים בשיקול דעת המופעל בהתאם לדין ובאופן ייחודי
|
||||
8070-05-25,fecaaa73-30a2-4eea-8477-72aa3c4b095e,approved,rejected,3,0.8067,e451f57f-4e97-431c-8bf2-f4daf0676fb2,"תכנית צל אינה הופכת לחלק מהוראות התכנית, אינה גוברת על נספח הבינוי המהווה חלק בלתי נפרד ממסמכי התכנית, ואינה הופכת היתר הניתן בסטייה מנספח הבינוי להיתר תואם תכנ"
|
||||
8070-05-25,d26c3585-d389-441e-9dd8-affd5ca15190,pending_review,pending_review,2,0.825,7cb1762d-baaf-4063-8ab3-98694198ac22,"עצם אישורה של תכנית צל על ידי הגורמים המוסמכים עשוי לבטא מידת וודאות גבוהה יותר באשר לסיכוי שתאושר ההקלה, ולנתון זה משקל שמאי בהערכת ההשבחה."
|
||||
8070-05-25,d485091a-7eb8-4a07-9283-4baac35fbe06,approved,rejected,3,0.79,babf8a03-d274-4aba-a6c8-940c37b14137,"זכות תכנונית שאישורה מותנה בשיקול דעת או בחוות דעת מקצועית אינה זכות וודאית ואינה בבחינת זכות קנויה; משכך, יש לבחון אותה לאור הוראותיה של כל תכנית החלה, אף כאשר"
|
||||
8070-05-25,cc1e6a85-d18a-451d-b37d-997b069d0827,approved,approved,2,0.9,8568d214-0d01-468c-936d-aeabf4ad87a4,טענות בעלות אופי שמאי — ובכללן השגות על מקדמים שנקבעו בשומת ההשבחה ועל עלויות נלוות — מקומן להתברר בפני השמאי המייעץ ולא בפני ועדת הערר.
|
||||
1170-23,51e319ae-c0ac-4f35-8844-1106c6574aa3,pending_review,approved,2,0.9,6eecdfe0-58ca-4c44-afeb-4529a8aa3b60,"שטח המסומן בתכנית כשטח לצרכי ציבור (""שטח חום"") אינו יכול להוות חצר פרטית מבחינה תכנונית כל עוד לא שונה ייעודו, וכל המשמעויות התכנוניות של ייעוד זה חלות עליו."
|
||||
1170-23,5eefde76-c045-4a6a-a2ba-a28d3f61d850,pending_review,approved,2,0.875,1b788d1f-1e5a-4b76-a90a-57a8587bb743,"על הרשות המקומית להפעיל את כלי האכיפה שהקנה לה המחוקק (לרבות מכוח תיקון 116) ולהימנע מ""אכיפה פסיבית"" דרך הליכי התכנון; אין להעביר את נטל הסרתן של חריגות בנייה א"
|
||||
1170-23,4da51bb2-434d-4f13-aabc-1f877199428b,pending_review,rejected,0,0.0,d69cac8e-0ca4-42e4-a6c7-411e040793cb,"בהפעלת שיקול דעתו אין מוסד התכנון מוגבל לשיקולים תכנוניים ""צרים"" בלבד, ועליו לשקול מגוון שיקולים הרלוונטיים לעניין — ובהם שיקולים סביבתיים, ציבוריים, חברתיים וכ"
|
||||
1170-23,97801a3c-beea-46dd-bbd2-dce77bdf473e,approved,approved,2,0.875,084c6dff-3cdc-4631-9bc6-6051c306020c,"השיקול של הגנה על שלטון החוק ומניעת עידוד עבריינות בנייה אינו שיקול יחיד או מכריע בהליכי התכנון, ועל מוסד התכנון לשקול לצידו שיקולים רלוונטיים נוספים — ובהם השי"
|
||||
1170-23,e8c44f8a-0230-4dcd-b979-336476285eb6,pending_review,rejected,3,0.8267,a62cf50e-4840-4732-9ba2-8ae17c471589,"כאשר מותנה מתן היתר בנייה בהסרת חריגות בנייה קיימות, המידתיות מחייבת מנגנון פרטני הקושר את היתרה של כל יחידה להריסת החריגות הנוגעות לאותה יחידה בלבד, ולא התניה "
|
||||
1170-23,e2e69329-01b7-46bf-a075-a547d7ac043a,pending_review,approved,2,0.875,9e06285b-c82a-451c-bbe6-799130a3fe4f,אין להתנות אישור תכנית הראויה מבחינה תכנונית וציבורית בתנאי שתוצאתו המעשית הצפויה היא גניזת התכנית והותרת כלל הצדדים במצב נחות; על מוסד התכנון לבחון אם התנאי מק
|
||||
1170-23,a3fdec1f-9f55-463f-963d-399210a4505f,pending_review,approved,2,0.9,88d653af-1f4d-460c-a75f-5c7f914a1af7,"שיקול הדעת של הועדה המקומית לדחות בקשה להיתר בנייה מטעמי חוקיות, אף שאינו מעוגן במפורש בחוק ובתקנות, נגזר ממתחם שיקול דעתה. ככלל, ולמעט מקרים חריגים ביותר, אין "
|
||||
1170-23,66acdbce-1007-46f3-8fc2-4fa18c4951f3,approved,rejected,3,0.8733,2d65696c-7ac9-4050-818e-ceec26bc2bee,הסמכות לדחות בקשה להיתר מטעמי חוקיות מוגבלת לתכליתה — מניעת עבירות בנייה ומניעת מצב שבו חוטא ייצא נשכר. לפיכך אין למנוע מבעל נכס היתר בנייה שהוא זכאי לו לפי הדי
|
||||
1170-23,23a21c7a-b377-4661-9091-f5a3fd6005c2,pending_review,rejected,2,0.875,48440893-8a70-4d1d-8858-49272822ed76,"אין להתנות אישור תכנית להרחבת דירות (או מתן היתר ראשון מכוחה) בהסרת חריגת בנייה או בפינויה, מקום שבו אין קשר ענייני מספק בין החריגה לבין מטרת התכנית; תנאי כזה א"
|
||||
8378/11,5be35f47-808b-499e-8480-d5210ede54a9,approved,approved,3,0.9067,16ec8d02-2dc9-456f-8be7-cf9c8de9f38c,"השתק שיפוטי לא יקום כלפי בעל-דין מקום שההליך הקודם הסתיים בפשרה בלא הכרעה שיפוטית במחלוקת, שכן בנסיבות כאלה עוצמתו של האינטרס הציבורי העומד ביסוד הכלל אינה גבוה"
|
||||
8378/11,b84e4a8d-1c01-43cd-b9f4-f102c253b4ee,pending_review,approved,3,0.9333,5bede666-24ac-487c-87a7-5c253e04966c,"תכליתם של פיצויי ההפקעה היא להעניק לבעל הזכויות בקרקע את השווי הכספי של הזכות או טובת ההנאה שהופקעו מידיו, ולהעמידו באותו מצב כספי שבו היה עומד אלמלא ההפקעה."
|
||||
8378/11,2a848ee4-2c90-4402-8b54-b733508339b9,pending_review,approved,3,0.8833,d8f2aabf-a78c-459a-b497-246a6fcb1ce1,"""טובת הנאה"" במקרקעין, אף שאינה עולה כדי זכות קניינית מלאה, נחשבת זכות ""מעין קניינית"" המזכה את בעליה בפיצויי הפקעה; היא נבדלת מזכות אישית בכך שפועלה אינו מצומצם "
|
||||
8378/11,910e8a2b-77dd-407d-b4a6-7c1ae74843fa,approved,approved,3,0.9167,5646c38c-e883-4a32-90ab-65bd123ec8b8,"כללי השומה הקבועים בפקודת הקרקעות אינם ממצים, ובבואו לפסוק פיצויי הפקעה רשאי בית המשפט, ואף חייב, להביא בחשבון נתונים נוספים בעלי חשיבות לקביעת ערכן של הזכות או"
|
||||
4507/24,c6bf37ed-ffa9-4c54-9c07-62c5ec96ed71,pending_review,approved,3,0.8733,89812c33-68c8-4857-afea-3d9c9c1a227c,"אף שההחלטה אם להתיר לבעל דין להגיש חוות דעת מומחה במסגרת הדיון בערר מסורה לשיקול דעתה של ועדת הערר, מקום שבו ועדת הערר עצמה סברה כי חוות דעת כזו נדרשת להכרעה, ע"
|
||||
4507/24,d347bb7b-8e41-46d9-9b59-7a2a232900cb,pending_review,approved,3,0.8867,53ae645e-2cce-4028-a1a4-dd72961b7d14,"כאשר שמאי מקרקעין נעזר במומחה בעריכת שומתו, מתמצית דרישת הדין בפירוט זהות המומחה, פרטי מומחיותו והעניין שבו חיווה את דעתו; משעמד עורך השומה בדרישת פירוט זו, אין"
|
||||
4507/24,c031334d-1ddf-4df7-9633-e7e68d73e6ce,pending_review,approved,3,0.7567,18731799-d195-48d6-9509-4f5242468b07,"מקום שבו השומה מורכבת, ראוי שוועדת הערר תאפשר לבעל-הדין להגיש את חוות דעת המומחה שעליה נסמכת השומה במסגרת הדיון בשומה בפניה, חלף פסילת השומה בשל אי-צירוף חוות ה"
|
||||
1085-23,00a82e09-d4bf-4407-86b9-5c7cef850bed,approved,rejected,0,0.0,cc6170bb-d923-4d53-86bf-48161ac77eda,"זכות הערר על החלטת ועדה מקומית בבקשה להיתר קמה, מכוח סעיף 152(א) לחוק התכנון והבניה, התשכ""ה–1965, אך למי שהגיש התנגדות בכתב לבקשה והתנגדותו נדחתה. מי שלא הגיש ה"
|
||||
1085-23,9d0ef1f6-cfc0-4f4e-8331-d37a8cdea45a,approved,approved,2,0.9,5fa2e2b1-2187-439c-ba8e-840c4b78831f,"מסמך שכותרתו ""התנגדות"" אך נוסח והוגש לאחר שהוועדה המקומית כבר דנה והכריעה בבקשה להיתר, אינו מהווה כתב התנגדות כדין ואינו מקנה זכות ערר; משעה שהמתנגד ידע במועד ה"
|
||||
1085-23,f8f7b5db-5931-4b8b-98df-776c24915038,approved,rejected,3,0.8233,3c486b24-12ac-47de-bd7f-6af37ba0a087,"מי שלא הגיש התנגדות בכתב אך התייצב לדיון בהתנגדויות בפני הוועדה המקומית והשמיע את התנגדותו בעל-פה בטרם קבלת ההחלטה בבקשה להיתר, רואים בו כמי שהתנגד כדין וקמה לו"
|
||||
1085-23,ce012a53-53ab-4e21-9937-1fc3fed7b38a,approved,rejected,2,0.825,8d44cb7f-5faf-442b-b6d6-b1f7640993ec,"כאשר אישור בקשה להיתר מותנה בהסכמת רוב נדרש של בעלי הזכויות במבנה (למשל 60% מבעלי הדירות), על מבקש ההיתר לעבור תחילה ""משוכה מקדמית"" בדבר קיומו של הרוב הנדרש; מש"
|
||||
1085-23,31c6ad91-7e72-4cdc-accd-a999434e2c66,approved,approved,2,0.95,4394c837-bfc2-45e3-89f0-7778f1ab5036,"לצורך בניית מרחב מוגן דירתי (ממ""ד) הכרוך בהוצאת חלקים מהרכוש המשותף והצמדתם לדירה מסוימת, די בהסכמת בעלים של 60% מהדירות בבית המשותף, בהתאם לסעיף 71ב(א)(2) לחוק"
|
||||
1085-23,1a758e58-a3e7-43d5-ba4b-5008fc77609c,approved,rejected,2,0.875,86cd46df-e67d-4884-8849-7299a284708b,"בירור בדבר הסכמתם או אי-הסכמתם של בעלי הזכויות בבית המשותף לביצוע בנייה (כגון תוספת ממ""ד) צריך שייערך באופן ישיר בין בא-כוחם של בעלי הזכויות לבין בעלי הזכויות ע"
|
||||
1085-23,0c9dc243-3f73-451b-93a2-351dfb7a1cb2,approved,approved,2,0.9,2b2ccffc-2576-4ee6-9bb3-37ee645484ed,"טענות חדשות המועלות בכתב הערר ולא בא זכרן בכתב ההתנגדות שהוגש לוועדה המקומית (ואף לא נטענו בעל-פה במעמד הדיון), דינן להידחות על הסף בהיותן הרחבת חזית ומקצה שיפו"
|
||||
1085-23,71c9cad2-23c5-4496-8ae6-f6b984683afa,approved,rejected,0,0.0,705bc205-59e2-4efc-ab39-1472d22aba63,"בבחינת שיקול הדעת של מוסד התכנון אם להעניק הקלה, יש לשקול מספר פרמטרים שהתוותה הפסיקה: קיומה של הצדקה תכנונית; עצימות ההקלה; מועד התכנון המאושר; והפגיעה או הרוו"
|
||||
1085-23,901e716d-62fc-44fe-bbf4-6a3482511b20,approved,rejected,2,0.875,ea79b5f3-efce-46c7-9ff9-1ae2f037c88d,"קיימת הצדקה תכנונית למתן הקלה המאפשרת בינוי הממצה את האפשרות להוספת ממ""ד, אף כאשר מדובר בחריגה חלקית מקו הבניין, וזאת נוכח החשיבות הציבורית של בניית ממ""ד לצורכי"
|
||||
1085-23,92ed650a-8c1b-4dce-871e-ddf9c7bb8a41,approved,rejected,3,0.79,032bd626-ea95-4d7c-86c5-e3e135430f73,"הרחבת מבנה שבוצעה כדין בעבר, אשר כתוצאה ממנה לא ניתן עוד להוסיף ממ""ד תקני בתחום קו הבניין, אינה צריכה לפעול לרעת בעל הנכס בעת שקילת הקלה לצורך הוספת הממ""ד."
|
||||
1085-23,ec407cbe-2000-4202-89f0-177e3f610dfd,approved,rejected,0,0.0,fb1aa615-8b21-478f-ae77-506916bc6920,"לפי תקנה 4(ג) לתקנות התכנון והבנייה (סטייה ניכרת מתכנית), התשס""ב-2002, בניית מרחב מוגן (ממ""ד) כתוספת לבניין קיים בחריגה מקווי הבניין הקבועים בתכנית אינה מהווה ס"
|
||||
1085-23,a9c57da9-47ac-4ba8-bcf3-d5501be34929,approved,rejected,1,0.8,2e420af2-9bd6-4f42-be12-7dd40f6c8beb,"הותרת שטח פתוח לרווחת דיירי וילדי בית משותף הינה הכרחית ומהווה שיקול שיש ליתן לו משקל לא מבוטל, ועל כן ככלל יש לעשות מאמץ שלא לפגוע בשטחים אלו; עם זאת, בנסיבות "
|
||||
1085-23,398180ab-79fe-4ca7-bbf2-fd220447c4ea,approved,rejected,0,0.0,6d8310d1-5f58-454d-bed5-f6decc3f8e77,"אישור בקשה לתוספת ממ""ד בקומת קרקע בבית משותף אינו משליך על בקשות אחרות שתוגשנה, וכל בקשה תידון לגופה לפי נסיבותיה."
|
||||
1085-23,8b3a80ce-2005-42f1-846f-7cfdeb630833,approved,rejected,2,0.825,8d20c88e-369a-4ff5-92a0-94737735d5d8,"סירוב לאשר חריגה בקו בניין לצורך ממ""ד הינו סביר ונכון כאשר קיימת היתכנות תכנונית למקם את הממ""ד בתחום קו הבניין (למשל כאשר טרם בוצעה הרחבת הדירה בחלק האחורי); לע"
|
||||
1085-23,f1723335-c444-4e31-b8fb-ec3c8a6c6755,approved,rejected,1,0.9,07f6c67a-2c79-41c8-a63e-a403b3378160,"התקנת מרחב מוגן דירתי (ממ""ד) מהווה צורך ציבורי ברור הנובע מהמצב הביטחוני, וחשיבותו נלמדת משורת תיקוני חקיקה שמטרתם עידוד ותמרוץ בנייתו כאמצעי יעיל להגנה מפני הת"
|
||||
1085-23,926b8dcf-4f72-453b-8faa-132708e3f8c6,approved,rejected,0,0.0,2d1f6cbd-9fb1-46ba-b670-248f9bac0c33,"תוספת שטחי שירות לשם בניית ממ""ד בשטח שאינו עולה על השטח שקבע שר הביטחון לפי חוק התגוננות אזרחית אינה נחשבת סטייה ניכרת מתכנית (ס' 151(ג) לחוק), ושטח הממ""ד הנדרש"
|
||||
1085-23,c79b41f6-60ba-4918-ab46-b31a17c755df,approved,rejected,1,0.8,cfcdf739-4a24-419a-aeae-0722021d6249,"באיזון שבין ההצדקה התכנונית למתן הקלה לשם בניית ממ""ד לבין אי-הנוחות הנגרמת לבעלי מקרקעין סמוכים, מקום שאי-הנוחות שולית בעוד התועלת מבניית הממ""ד רבה, נוטה הכף לא"
|
||||
1085-23,dbd947bd-5e98-4751-b83f-19d861e86190,approved,approved,2,0.9,25f3f5d6-4d44-4654-9879-1732ac7dd7b8,"המחוקק הבהיר כי קיימת עדיפות לממ""ד המהווה חלק מהדירה על פני מקלט המצוי מטה ומצריך ירידה אליו, וכן על פני חדר ממוגן."
|
||||
1085-23,64e7d305-fa40-4328-a339-29d5d2a438f8,approved,approved,2,0.9,b9d7902e-3b87-4d76-ba5a-7b7c85be2cd6,"חדר מחוזק (חדר ממוגן) יתאפשר אך ורק כאשר אין אפשרות הנדסית לבניית ממ""ד, וזאת כתחליף לממ""ד, בהתאם להנחיות פיקוד העורף."
|
||||
7142-11-23,7e2c4a5c-691e-405e-8407-a2f8215bb7a4,pending_review,approved,3,0.9,e788f5c8-aa05-472f-8865-631b620aeb94,"ככלל לא יתערב בית המשפט לעניינים מנהליים בהחלטת ועדת ערר אלא אם חרגה ממתחם הסבירות, וההתערבות שמורה למקרים חריגים; ואולם היקף הביקורת השיפוטית נגזר מטיב המחלוקת"
|
||||
7142-11-23,686e7cb4-5f6a-4972-aa41-ea78933ed36d,approved,approved,3,0.9167,534cd282-8fea-4e4b-a1b5-b686d9267266,"היתר בניה שאושר כדין כולל הן את פן הבניה והן את פן השימוש, ולא ניתן לגרוע ממנו את אחת מתכונותיו ולקבוע כי חדלה להתקיים. כל עוד לא בוטל ההיתר בהליך מסודר על-ידי "
|
||||
7142-11-23,f58c9049-4e67-4bf0-b4da-04dfd643eab4,pending_review,approved,3,0.9033,a25fe54a-f8d0-4d3c-bd2e-7db9f22b43f1,"החלטה מנהלית המשנה את המוסד הסטטוטורי המוסמך לדון בבקשות עתידיות להיתרי בניה אינה מפקיעה כשלעצמה היתרי בניה תקפים שניתנו קודם לכן, וזאת בהיעדר אמירה מפורשת בדבר"
|
||||
7142-11-23,97af57f6-494b-4908-8da6-e60540f7688f,pending_review,approved,3,0.8833,498c2c74-6395-4b3e-9dab-74da642c9232,"כל עוד ניתן היתר בנייה כדין ומטרת השימוש לא השתנתה והיא מוסיפה להלום את ייעוד הקרקע לפי התכנית החלה, השימוש נותר שימוש מותר ואינו הופך לשימוש חורג, אף אם חל שינ"
|
||||
7142-11-23,129d2134-7fce-4c1c-9ed7-0c94a6b2ef43,pending_review,rejected,3,0.8733,dfc55ec2-d648-4f88-b71a-d8659b83b705,"שימוש הנעשה במבנים שהוקמו כדין מכוח היתר בניה שלא בוטל, וכאשר השימוש מותר על פי הוראות התכנית החלה, אינו הופך לשימוש בלתי חוקי — אף אם קיים פער בין יעוד המקרקעי"
|
||||
7142-11-23,2ffce4ba-cd0b-4162-8ac1-44375466dc60,approved,rejected,3,0.86,1f513aad-215f-49d4-8df5-a094b48fd8d7,סעיף 1א(2) לתוספת השלישית לחוק התכנון והבניה — הקובע כי מימוש זכויות מתקיים מקום שבו התחלת השימוש במקרקעין הותרה לראשונה עקב אישור התכנית — אינו חל כאשר השימוש
|
||||
7142-11-23,db92566d-d3c0-4548-9bd1-522594784842,approved,approved,3,0.9233,98141305-25e3-451f-bf39-c3203f9c45f3,"אירוע מימוש זכויות לצורך חבות בהיטל השבחה אינו מתגבש עם אישור התכנית המשביחה כשלעצמו, אלא מתגבש בעת שמתבצעת פעולה משמעותית המוציאה אל הפועל את ההתעשרות הנובעת מ"
|
||||
7142-11-23,ff99d9d4-3f80-4e7e-88b6-5bbd254957b2,pending_review,rejected,3,0.88,7776a807-0930-4df4-b9ce-d17c22ff0958,קיומו של הסדר חוקי ייחודי שמכוחו הוקם מתקן (כגון הקמתו בתחום מתקן בטחוני) אינו גורע מהיות הקמתו או השימוש בו פעולה הטעונה היתר בניה; אופיו של השימוש כטעון-היתר
|
||||
7142-11-23,a4896e54-85bc-445a-96db-0d99e63f3083,pending_review,rejected,0,0.0,b11968a3-a980-4527-be0e-981f1ddfdb2e,"מתעורר ספק רב בדבר סמכותה של ועדה/רשות לדרוש תשלום היטל השבחה בגין שימוש חורג, כאשר היא עצמה לא נתנה היתר לאותו שימוש חורג."
|
||||
26491-03-24,d2f95b6c-d48f-48fb-b07e-0999e6041a29,pending_review,rejected,3,0.8667,38bffbb2-856e-44b3-a9bb-caf94922d287,"ועדת ערר מוסמכת לחייב שמאי מכריע להשלים את התייחסותו למסד העובדתי כאשר השומה המכרעת נשענה על הנחות בהיעדר נתונים מהותיים, שכן שומה מכרעת המתבססת על מסד עובדתי ב"
|
||||
26491-03-24,ae6d3153-e49c-424e-b8db-92700e1bc833,pending_review,approved,3,0.9233,1c747aa6-0ea7-46b2-877e-a8fdff6c0aa7,התערבותה של ועדת הערר בשומתו של שמאי מכריע מוגבלת למקרים שבהם נפלה בשומה טעות מהותית או שהיא לוקה בפגם חמור; ככלל תיטה הוועדה לאמץ את חוות דעת השמאי כל עוד הושת
|
||||
26491-03-24,8a75deaa-4128-47d7-9ab3-3b38e3194c3d,pending_review,rejected,3,0.8567,1c29528b-a3ff-4acf-a33a-b9bd25befc0d,"כאשר השמאי המכריע ערך בדיקה מקיפה ומדוקדקת — תוך שימוש במסמכים מקצועיים, בחינת הליכי רישוי וסיורי שטח — והגיע למסקנה מקצועית-שמאית מנומקת, ולא מדובר במסד עובדתי"
|
||||
26491-03-24,f57054ff-4077-44b2-804c-d4edfb937598,pending_review,approved,3,0.8867,37233f0e-294e-4f13-97d4-e4e4ed81530c,פגיעה עקיפה במקרקעין הנגרמת ממטרדי רעש (כגון רעש תנועה מכביש) מהווה עילת תביעה מוכרת לפיצויים מכוח סעיף 197 לחוק התכנון והבניה.
|
||||
26491-03-24,b06f709b-5228-4ef3-bf33-bfb2342ec354,approved,approved,3,0.8833,a8934b7d-f5f7-4fc9-ab84-a2e5ea76d1c5,"חובת הקטנת הנזק חלה גם על תביעות פיצויים מכוח סעיף 197 לחוק התכנון והבניה, ויש לה משמעות אפקטיבית במיוחד מקום בו מדובר בפגיעה עקיפה במקרקעין, כגון מטרדי רעש, עש"
|
||||
26491-03-24,46ddd3ba-cfee-45ae-8095-2682422d546c,approved,rejected,3,0.8733,934362ac-e5bb-4a75-8dbb-b0cd210da29a,"שמאי מכריע אינו רשאי לבסס את שומתו על קביעה שיפוטית שניתנה במקרה קונקרטי אחר, שכן קביעה כזו נטועה בנסיבותיו ובראיותיו של אותו תיק; ביסוס שומה על קביעה שיפוטית ק"
|
||||
26491-03-24,7b68ae4c-94db-42ee-b613-8cf8d4e6e64e,approved,rejected,3,0.8833,9e76c109-7914-43d8-8e9e-c328fa569786,"נטל הראיה להוכחת תביעת פיצויים לפי סעיף 197 לחוק התכנון והבניה מוטל על התובע, ובהצטרף חזקת תקינות המעשה המינהלי — חסר ראייתי ביחס לאופן פעולת מוסד התכנון נזקף ל"
|
||||
26491-03-24,af8aa460-9808-4f82-b67c-01092a61831a,approved,approved,3,0.8867,87372597-cc31-4263-a41e-a4def446c42a,"תרומתם של אמצעים להקטנת הפגיעה במקרקעין (כגון אמצעי מיגון אקוסטיים) נשקלת במסגרת חובת הקטנת הנזק המוטלת על התובע, ומופחתת מן הפיצויים לפי סעיף 197 שלהם הוא זכאי"
|
||||
26491-03-24,dedbc703-4894-44d4-af5d-c28215665161,pending_review,rejected,3,0.8733,c3132be1-1e18-408c-85e2-932e7b7d4aeb,"כימות שיעור הקטנת הנזק הוא עניין המסור להערכת השמאי המכריע, על בסיס המידע שבידיו והמסד העובדתי הנוסף שייאסף לפי שיקול דעתו, לרבות באמצעות השלמת תסקיר או היוועצו"
|
||||
26491-03-24,855576ee-986a-4cbb-8ac3-647d7a1d5486,approved,approved,3,0.8867,ba54ff8e-6575-4364-b683-e9c228f91436,אין להתערב בליבת שיקול הדעת השמאי-המקצועי של השמאי המכריע כאשר הערכתו מבוססת על שיטה שמאית מקובלת ועל מסד עובדתי הולם; התערבות ברכיב שומה בנסיבות כאלה חורגת מאמ
|
||||
26491-03-24,67afdb8f-17f6-4e92-b712-0bd673d118fc,pending_review,rejected,0,0.0,030364a2-6c7b-4322-b759-9e03f7781d48,"מועד הערכת הנזק שנגרם למקרקעין בגין תכנית נקבע על-פי ההוראות הקונקרטיות שנקבעו בתכנית המפורטת, ומוטל ספק אם התניית השומה במקדמי זמינות התלויים בביצוע בפועל של ת"
|
||||
55083-05-19,40a9eac5-762e-400f-ad24-f1eb3222bd70,approved,approved,3,0.9267,f414d73d-d856-480a-929b-61973a9dfa5a,תכלית היטל ההשבחה היא לחייב את בעל הזכויות במקרקעין (בעלים או חוכר) לחלוק עם הקהילה שאפשרה את ההשבחה בעושר שצמח לו כתוצאה מהחלטות גופי התכנון הציבוריים; תכלית ז
|
||||
55083-05-19,d33b497f-9c45-4a60-8c4e-1ff5f447ba36,approved,approved,3,0.9267,3a7958b8-e1ad-4180-85db-4b6198f4bbaf,"המועד הקובע לעריכת שומת היטל השבחה הוא מועד אירוע המס — תחילת התכנית, יום אישור ההקלה או מועד אישור השימוש החורג, לפי העניין. ההשבחה נמדדת בהשוואה בין שווי המקר"
|
||||
55083-05-19,b097c337-70a4-46d1-a3dc-78ae077035b3,approved,approved,3,0.9267,4aed9fe4-e049-4f11-a423-40fa44e36e0a,"כאשר ניצול זכויות הבנייה מותנה בהליך של הקלה — קרי כפוף לפרסום, להגשת התנגדויות ולשיקול דעתה של הוועדה המקומית — קמה החבות בהיטל השבחה בגין אותן זכויות אך ורק ב"
|
||||
55083-05-19,5cf4076d-85c5-43e3-8447-16d879159443,approved,rejected,3,0.8867,afafa462-ad63-4008-afa0-deb749105de7,"המבחן לקיומה של השבחה לעניין החיוב בהיטל השבחה הוא מבחן פשוט ומהותי: האם בעקבות אישור תכנית, מתן הקלה או התרת שימוש חורג עלה שוויָם של המקרקעין, כמשמעות 'השבחה'"
|
||||
55083-05-19,dd4cbcea-862e-45b4-98ea-5a3df12ef171,approved,approved,3,0.9,dde8f7e4-b2c7-4e50-9fb6-d2329e93adfd,"אירוע המס המחולל את חבות היטל ההשבחה בגין הקלה הוא מועד אישור ההקלה, ולא מועד אחר."
|
||||
55083-05-19,dca6918b-ce96-4524-b5d7-07ca5759fcac,approved,rejected,3,0.8933,9c296870-f66f-4783-8f7b-e5b5f88fe013,"בחישוב היטל השבחה הנובע מהקלה, ככל שבעל הזכויות יכול היה לממש את אותן זכויות בנייה (כגון גזוזטראות) ללא הקלה — בתוך קווי הבניין או תוך חריגה מותרת מקו בניין קדמ"
|
||||
55083-05-19,676011ec-4a0b-4ab4-aaea-e42227572f00,approved,approved,3,0.91,d82ce48d-5016-45ff-900f-5933d95f46bb,סעיף 4.03 לתוספת השנייה לתקנות התכנון והבניה אינו מתיר הבלטת מרפסת מקו בניין צדי או אחורי ללא אישור הקלה; לעומת זאת ועדה מקומית רשאית לאשר הבלטת מרפסות עד 1.2 מ
|
||||
55083-05-19,4963e716-0247-44ba-b7a0-723ab4dac678,approved,rejected,3,0.8833,1b986135-3e7a-4608-9e1c-819484c36871,"לנישום אין זכות קנויה להמשך חישוב היטל ההשבחה לפי חישובי עבר של הוועדה המקומית, מקום שחישובים אלה נבעו מטעות או שההלכה שונתה; מדיניות קודמת שונה אינה מקימה כשלע"
|
||||
33847-03-24,14edea99-251b-4d62-ac41-cb8557a227dc,approved,approved,3,0.8867,3418eb21-0801-4d30-9d80-e0abc1e41ec8,"כל עבודת בנייה טעונה היתר בנייה, אלא אם הוענק לה פטור מפורש בדין; חזקה זו חלה ביתר שאת על עבודות שיש בהן כדי ליצור מפגעים."
|
||||
33847-03-24,2ad9c9fa-f998-48e8-8cb8-397d7d6c8d83,pending_review,approved,3,0.91,725c37a5-c839-419f-a737-29ea638fa1a3,"תקנות הפטור מהיתר, שהותקנו מכוח סעיף 145ג לחוק התכנון והבנייה, יפורשו לאור תכליתן — פטור מוגבל לעבודות פשוטות מבחינה הנדסית שאין בהן כדי ליצור סיכון, הפרעה או מ"
|
||||
33847-03-24,38e83ffc-60fa-41dc-aa8e-4064f9884b9d,pending_review,approved,3,0.8833,aedf9778-f006-468d-abe4-36788d6e288a,"הפטור מהיתר לכבש (רמפה) הגושר על הפרש גובה שאינו עולה על 1.2 מטר הוא פטור תכליתי, החל אך ורק על עבודות שתכליתן שיפור נגישות — כעולה מכותרת סימן ז' לתקנות ומחוק "
|
||||
33847-03-24,3f358265-fe8a-41fe-ac80-2222a3e47bec,pending_review,approved,3,0.88,6d7f0e04-13ad-4469-ac7e-a91e372b3e32,סמכות השר להתקין פטור מהיתר אינה משתרעת על עבודות העלולות ליצור הפרעה או מטרד; עבודה הגורמת מטרד של ממש אינה חוסה תחת הפטור מהיתר אף אם היא עונה להגדרה הטכנית ש
|
||||
33847-03-24,b2fc6cf1-1afe-47c7-a849-2bf206faa372,pending_review,approved,3,0.8733,e3b2354a-078f-4c4f-b837-62aa850dfc39,"שיתוף פעולה של רשות מקומית עם מבצע עבודות בניה ללא היתר, שמטרתו לסייע בהסדרת מפגעים (כגון הסדרי תנועה) שנוצרו עקב העבודות, אינו מהווה הסכמה, הכרה או הכשר לעבודו"
|
||||
4487/01,7882a13b-82f8-4639-af4c-8a2359357f7c,approved,approved,3,0.9,0b8d26f7-dfb1-4780-9112-109ff549cb41,"הנוסחה שאימץ המחוקק להערכת שווי מקרקעין לצורך שומת היטל השבחה היא ""שווי השוק"" — המחיר שהיה מתקבל בעסקה בשוק החופשי בין מוכר מרצון לקונה מרצון, מבחן אובייקטיבי ה"
|
||||
4487/01,0f02ebea-9cd4-49ba-8cfe-2c9eca714bca,approved,approved,3,0.9167,d7445fb3-a4d2-4799-8bfa-070c185cd7a4,"בעריכת שומת היטל השבחה על השמאי להעמיד זה מול זה את ערך המקרקעין ערב אישור התכנית המשביחה (""המצב הקודם"") אל מול ערכם לאחר אישורה (""המצב החדש""), בהתאם למנגנון שב"
|
||||
4487/01,c2a8dc60-c589-49ca-9595-dc58b6a7f625,approved,approved,3,0.9233,7a44b75a-7ed8-4360-8324-fd15b04c1c84,"היטל השבחה יוטל על מקרקעין רק מקום שערכם עלה בעקבות אישור התכנית ובשל התכנית בלבד, שכן ""השבחה"" מוגדרת כעליית שווים של מקרקעין עקב אישור תכנית, מתן הקלה או התרת "
|
||||
4487/01,f7e1b82e-6d2c-4dd3-b4ad-e500ba54beee,approved,approved,3,0.9267,9f5ef842-28ff-4809-9127-35bca84cd578,"בהערכת הפוטנציאל התכנוני של מקרקעין לצורך אומדן שוויָם, יש להביא בחשבון לא רק את התכנית החלה בפועל אלא גם תכניות צפויות המיועדות לחול על המקרקעין (כגון שינוי יי"
|
||||
4487/01,0dad87e7-e801-4bcb-b1ff-b17ff1177a23,approved,approved,3,0.9267,0f335450-b1f5-44bf-bcfa-e9b9aaaeb3c9,"בשומת ערך המקרקעין במצב הקודם (ערב אישור התכנית) אין להביא בחשבון את עליית המחירים שנגרמה בעטיין של התכנית המשביחה וההליכים התכנוניים שקדמו לה, שכן הבאתן בחשבון"
|
||||
4487/01,ab14642e-d684-4cfd-9cdf-664ccd8fd580,approved,rejected,3,0.8833,2564932d-c96a-4dcc-92df-76772b29e6c3,"מקום שבו הייעוד הסטטוטורי הקיים של הקרקע מיושן (Obsolete) ואינו משקף עוד את המציאות, השוק מתעלם ממנו ומחיר הקרקע אינו מתבסס עליו אלא נקבע לפי הפוטנציאל הטמון בה"
|
||||
4487/01,e9b7b926-7b31-46dd-8f39-165bbb5541c0,pending_review,rejected,3,0.8933,f2e3cef9-836e-4b83-8909-682ae5d223ae,"עליית ערך מקרקעין הנובעת מציפיית השוק לשינוי ייעוד, שנוצרה שנים רבות לפני הכנת התכנית המשביחה וללא קשר אליה, אינה בגדר השבחה החייבת בהיטל השבחה — לא מלשון סעיף "
|
||||
4487/01,f87574a2-edfb-42f6-ba19-340d05621f4a,pending_review,rejected,3,0.8833,e99d31b1-0f31-45a1-9f2b-d9db140fabba,"היתרי בניה שהוצאו שלא כדין, שתוקפם פג ושדבר לא נבנה על פיהם, אינם נמנים עם 'ההיסטוריה התכנונית' של המקרקעין, ועל כן אין להביאם בחשבון בקביעת שווי המקרקעין במצב "
|
||||
4367/16,4b62619d-048b-401b-84d6-2fe45e9c3378,approved,approved,3,0.9,17136da1-6f30-451d-b056-effcab6dee4f,"אין לגבות היטל השבחה בגין רכיב השבחה שבעבר כבר שולם בגינו היטל, שכן הוראות התוספת השלישית נועדו להבטיח גביית מס אמת בגין השבחת המקרקעין עקב פעולה תכנונית, ומצב "
|
||||
4367/16,6794fcf3-7102-47c3-b5cc-070bba6f5778,pending_review,rejected,3,0.9,b669f77e-8788-41f0-a41c-6d7c63838be2,"היטל ההשבחה מוטל בגין עליית שוויים של המקרקעין עקב פעולה תכנונית המנויה בתוספת השלישית, ובגין עליית ערך זו בלבד."
|
||||
4367/16,ea09b6c1-cbe8-4bc4-8d76-d0c068089ecb,pending_review,approved,3,0.91,bf784167-ee71-4505-bc4c-3449c2b3604f,"תכלית הצדק החברתי שביסוד היטל ההשבחה מחייבת זיקה בין ההיטל לבין התעשרות ממשית: באין התעשרות אין היטל, ובגין התעשרות אחת נגבה היטל אחד; גבייה ביתר שאינה נסמכת על"
|
||||
4367/16,8eeab63e-887b-4e16-ab82-ed58cdbe48f8,pending_review,rejected,3,0.8733,f9dd2b86-e2d3-471a-9c69-e0fcb1d5a921,"גביית יתר של היטל השבחה מובילה להתעשרות הרשות שלא כדין, ובכך נוגדת את חובת ההגינות הבסיסית המוטלת על הרשות המינהלית, ואינה יכולה לעמוד."
|
||||
4367/16,49a6b7a7-dc37-4de6-ae0a-465daec3b669,approved,rejected,3,0.8833,9440888e-36a0-4994-b877-e6dc62339a3d,"ועדת הערר מוסמכת להתערב בשומת היטל השבחה מנימוקים שעניינם הגשמת תכליות ההסדר הקבוע בתוספת השלישית, ועליה לבחון את השומה שלפניה במבט רחב ותכליתי כך שתגשים תכליות"
|
||||
4367/16,2af1f3eb-647b-4882-9251-1c3c57c5b75f,pending_review,rejected,3,0.84,cb2be9f3-1aec-44f4-9817-0b8cdd8cf0dc,"מצאה ועדת הערר כי שומת היטל השבחה צפויה להביא לחיוב יתר על רקע השבחה שכבר שולם בגינה היטל בעבר, מוסמכת היא להורות על הפחתת הסכום שנגבה ביתר מסך היטל ההשבחה שנקב"
|
||||
4367/16,644168b7-1733-4516-8e1d-76b58f90fdab,approved,rejected,3,0.8833,c32f74c4-8a1f-4136-94f6-bff5562562a5,"רשות מקומית שגבתה היטל השבחה בגין תכנית מתאר שפקעה לאחר מכן חייבת להשיב לנישום את סכום ההיטל שנגבה, משום שההתעשרות שהצדיקה מלכתחילה את גביית ההיטל אינה עומדת עו"
|
||||
4367/16,a5ef7c97-39a3-445e-8c8d-f50682c6e51c,pending_review,rejected,3,0.8833,581b7feb-f5d4-4c9d-a1bb-d13ebd87a23a,"מחלוקת בדבר חיוב יתר בהיטל השבחה ראוי שתתברר ותוכרע במסגרת הדיון לפני ועדת הערר, ואין לחייב את האזרח להקדים ולשלם את ההיטל ולתבוע השבה בהליך נפרד; זאת נוכח מאפי"
|
||||
4367/16,416d43c3-c51c-4f45-ac7f-3dc1c0b0c351,approved,approved,3,0.9233,4df35d78-c32f-44df-b27c-8e65fadd0465,"מקום שבו שומת היטל השבחה צפויה להוביל לחיוב-יתר משום שבגין אותו רכיב השבחה כבר שולם היטל בעבר, מוסמכת ועדת הערר — לאור תכליות היטל ההשבחה, עקרון גביית מס אמת ומ"
|
||||
4367/16,b3d65b52-f34c-4bc8-b8fc-4332e64c9424,approved,approved,3,0.9033,230e6301-ba65-4213-ab62-a3cdb0e2c653,תנאי מוקדם להוראה על קיזוז סכום ששולם ביתר מתוך חוב כספי הוא קיומו של חוב בר-פירעון של הנושה כלפי החייב; באין חוב — אין קיזוז.
|
||||
4367/16,18cf9a77-607b-489e-b5be-3eb6166b4d0f,approved,rejected,3,0.8733,e1af5406-4098-408e-a95b-20dca2e55c96,"לא ניתן להורות על השבה או קיזוז של היטל השבחה ששולם לפי שומה חלוטה, מקום שהוראה כזו מחייבת בהכרח קביעה כי השומה החלוטה שגויה; הכרעה החותרת תחת סופיותה של שומה ח"
|
||||
4367/16,d904e398-2d54-451f-adc9-e48061ba32cf,approved,approved,3,0.9233,e8230518-13f3-4c7e-a97a-afc635499732,"במסגרת היטל השבחה חל איסור כפל-חיוב: בגין אותה השבחה (התעשרות) ניתן לגבות היטל השבחה אחד בלבד. מקום שבו שולם היטל בגין רכיב השבחה מסוים מכוח תכנית אחת, אין לגבו"
|
||||
4367/16,22ebeee2-5d97-47c0-bedb-0ad77f421309,approved,rejected,3,0.8933,a658ead6-23cc-4555-a965-ddb6f797319d,ועדת הערר מוסמכת להפחית מהיטל ההשבחה המוטל בגין תכנית מאוחרת (תכנית מפורטת) את התשלום ששולם בגין אותו רכיב השבחה במסגרת היטל שהוטל בגין תכנית קודמת (תכנית מתאר)
|
||||
1018-20,bced290a-ea04-4b5f-8f5a-ea641eae1c9a,approved,rejected,0,0.0,69c655f6-e13e-4bd3-87cd-7b2723c151e5,"על היתר בניה חלה חזקת התקינות המנהלית, והנטל להוכיח כי נפלו פגמים משמעותיים בחוקיותו מוטל על המבקש את ביטולו; וגם בהתקיים פגם בהוצאת ההיתר אין בכך כדי להביא בהכ"
|
||||
1018-20,695535d9-677d-4bee-a016-7a61bb9fb5ac,approved,approved,2,0.9,baf79998-e48b-446f-acdc-fa819237a1c7,"ככלל, לא קמה זכות ערר בפני ועדת הערר על החלטת ועדה מקומית להאריך את תוקפה של החלטה ליתן היתר בנייה; החלטה כזו אינה ברת תקיפה בערר."
|
||||
1018-20,cd560393-2e91-44dc-8623-c4e078ac2c6c,approved,rejected,3,0.8233,c828f8ab-6d5b-4708-b18f-9a864f4f7497,הפרשנות הנכונה לתקנה המסדירה הארכת תוקף החלטה להוצאת היתר בנייה מחייבת את הועדה המקומית לבחון האם מבקש ההיתר פעל בשקידה מספקת והאם קיימת הצדקה לעיכוב בהוצאת ההי
|
||||
1018-20,54ccc0a2-650b-4aab-92d8-d824718f7dc8,approved,rejected,3,0.86,1082b15f-8312-49b1-9c0f-2192884646a0,"בשלב הבקשה להארכת תוקף החלטה להוצאת היתר בנייה אין, ככלל, מקום לשקול מחדש את השיקולים המהותיים שבהם כבר הכריעה הועדה המקומית, שכן השאלה הנבחנת היא הצורך בהארכת "
|
||||
1018-20,a581d9e5-9380-4edb-a56a-74018adc4cf4,approved,rejected,2,0.425,8745dfda-b802-44f3-888b-e6b6ad8c80ad,"קיים שוני מהותי בין בקשה להארכת תוקף החלטה בשנה נוספת לפי סעיף 20(א), שבה הבחינה מצומצמת, לבין מקרה שבו ניתנה כבר הארכה ולאחריה מתבקשת הועדה המקומית לשוב ולאשר "
|
||||
1018-20,4a37064e-f43b-4df9-991f-6d76deec095c,approved,rejected,2,0.875,85989aec-f069-42c5-aced-c2da84e50816,"אישור בקשה כתואמת תכנית וללא פרסום אינו שולל קיומו של שיהוי אובייקטיבי בהגשת ערר; כאשר פעולות הבינוי בשטח גלויות לציבור, ניתן לקבוע כי הערר הוגש בשיהוי אובייקטי"
|
||||
1018-20,2eff2421-85cf-49c9-b3c5-71f909152cbd,approved,approved,2,0.9,f9275bc2-8ab0-4543-9671-ede448156e1d,"משאין עוד צורך בדיון לגופה של הבקשה, החלטה בדבר הארכת תוקפה של החלטה למתן היתר יכולה להתקבל על-ידי רשות הרישוי, ואין צורך בהבאת הבקשה בשנית בפני הועדה המקומית."
|
||||
1018-20,4a05b876-05e4-49b8-9f60-9b266f8f3f33,approved,approved,2,0.9,4cc280a1-2f81-4247-82e3-47363f773dff,"לוועדת הערר נתונה הסמכות להאריך את המועד להגשת ערר על היתר בנייה, אף אם ההיתר כבר ניתן ואף אם הסתיימה הבנייה מכוחו."
|
||||
1018-20,6a85c51c-b18f-46b0-9dd1-c3827829ac44,approved,rejected,0,0.0,0cb91210-034a-4726-94f1-ef2bd511147d,"בבחינת בקשה להארכת מועד להגשת ערר על היתר יש לשקול את הטעם לאיחור ומידתו, את חוקיות ההיתר, ואת הפגיעה בעורר אל מול הסתמכות מבקש ההיתר וצדדים שלישיים."
|
||||
1018-20,30e8daeb-96b1-40f6-99fb-769f1bbbc9a7,approved,rejected,1,0.9,5f891db3-b6ba-4501-831b-ddc49c5efe9e,"סוגיית מתן הארכה להגשת ערר היא שאלת סף שיש להכריע בה ראשונה, שכן בהיעדר ארכה דין הערר להימחק על הסף וממילא מתייתר הדיון לגופו."
|
||||
1018-20,8a711c89-78f3-4694-8b54-e560735cb826,approved,rejected,0,0.0,ff5768e9-caf6-4c8e-ae23-49e5cf18aba7,"בבקשה להארכת מועד להגשת ערר יבחן יו""ר ועדת הערר האם הובאו טעמים סבירים המצדיקים את ההארכה; בבחינת סבירות הטעמים ישקול יו""ר הוועדה את טעמי האיחור לצד שאר נסיבות "
|
||||
1018-20,9d54e924-f7a3-4b36-a60a-a5b030e2f75e,approved,rejected,3,0.84,6276f1eb-69ef-4c73-94e2-8c5190fb411f,"כאשר נתקף היתר בנייה שכבר ניתן, שיקול הדעת לבטלו מצומצם הרבה יותר מהביקורת הרגילה של ועדת הערר על החלטות הוועדה המקומית (שבמסגרתה נבחנת גם סבירות ההחלטה); ביטול"
|
||||
1018-20,6aebcebb-f474-468e-9490-c43a97d6763c,approved,rejected,3,0.84,d652b0f7-7101-41c2-977a-a5a65c3d79e1,"מקום שבקשה להיתר לא פורסמה לציבור, אין לזקוף לחובת בעל דין את האיחור בהגשת בקשה להארכת מועד בגין התקופה שקדמה למועד שבו נודע לו בפועל על הבקשה ועל הבינוי מכוחה;"
|
||||
1018-20,c0f1a893-4c6f-43a3-b983-4e3cbc84cedf,approved,approved,2,0.9,b9484201-6995-41de-9809-64e6fbb5727a,"לוועדת הערר נתונה סמכות לדון בטענות הנוגעות להיתרים מוקדמים שכבר הוצאו, ואף במצב שבו הבנייה מכוחם כבר הסתיימה."
|
||||
1018-20,aaa2cf3c-dc32-4547-a797-86966727cd81,approved,rejected,2,0.875,fc14180d-6b18-4c99-adb0-65d5c596088e,"קיומה של סמכות אינו מספיק כשלעצמו; חלוף תקופת זמן משמעותית ממועד הוצאת ההיתרים מחייב את ועדת הערר לבחון אם יש מקום להתיר ""פתיחתם"" ודיון מחודש, תוך שקלול טעמי הא"
|
||||
1018-20,b35c3242-8a9d-4ace-a233-2349062885a9,approved,approved,2,0.9,1baf66d9-d4d5-498e-9ecb-12e11b8022ba,טענות כלליות כנגד מדיניותה של הוועדה המקומית או של הרשות המקומית אינן בגדר סמכותה של ועדת הערר; המבקש לתקוף בינוי קונקרטי מכוח בקשה מסוימת חייב להצביע על פגיעה
|
||||
1018-20,a5eeff38-27f6-405f-bd49-690a7b95d8a5,approved,rejected,2,0.85,0c582058-22b3-4178-9dda-1d8fd63a0587,טענה בדבר פגיעה חמורה בשלטון החוק עשויה במקרים מסוימים לגבור על שיהוי ניכר (במישור הסובייקטיבי והאובייקטיבי) בהגשת ההליך; אולם תחולתה מותנית בעוצמת הפגיעה הנטענ
|
||||
1018-20,6c0d46e1-c429-408e-9f6b-2ef4560547ee,approved,rejected,2,0.875,30d10966-de0e-4ea5-923c-474e196ba1d8,"מקום שבו לא נמצא היתר הבנייה המקורי של מבנה ציבור קיים, עומדת לבינוי חזקת התקינות המנהלית, ויש להניח כי נבנה כדין — בפרט בהיעדר טענה כי הוקם שלא בהתאם להיתר."
|
||||
1018-20,8fcc376f-a041-4a14-8f8f-9cb1f83d180f,approved,rejected,2,0.9,5227825c-10fb-4f67-be4a-9858c4c043e9,"סיווגה של תכנית כתכנית ""כתמים"" אינו שולל ממנה את היכולת לשמש מקור להוצאת היתרי בנייה; תכנית כתמים יכולה להיות תכנית שניתן להוציא מכוחה היתרי בנייה בהתקיים תנאים"
|
||||
1018-20,58763195-a15c-44e7-80ac-359c414d3e4b,approved,rejected,2,0.9,ae525e16-14db-4941-be72-c8004cb82b81,"כאשר תכנית מאוחרת אינה סותרת תכניות קודמות, התכניות הקודמות נותרות בתוקפן זו לצד זו, ורק מקום שבו קיימת סתירה בין התכנית החדשה לקודמות תגבר התכנית החדשה."
|
||||
1018-20,717ad2a7-8e70-4897-86e4-e2e33bf438d8,approved,rejected,3,0.79,0ced542f-e94e-47bd-9d9b-36426b614929,"תכנית מסוג ""תכנית כתמים"" נועדה לאפיין את הייעוד הכללי של אזור, ואין בה כדי לשנות או לבטל ייעודים ספציפיים שנקבעו בתכנון ישן ותקף (כגון מערך דרכים או שטחי ציבור)"
|
||||
1018-20,90bcbe31-f910-40a1-8e2f-4899659a3934,approved,rejected,2,0.825,a1f387e1-427e-477e-b060-b9190c7bccd7,"תכנית המבטלת את מערך הדרכים ואת השטחים שיועדו למבני ציבור (בתי ספר, גני ילדים ומוסדות חינוך) בשכונת מגורים, ללא הצדקה תכנונית, מאופיינת כדין כ""תוכנית כתמים""."
|
||||
1018-20,bf59c133-11d1-4ced-a9f5-f12de1495133,approved,rejected,1,0.9,16b8cde4-7db5-411a-975c-c8c85005eb51,"תרש""צ (תכנית רישום שיכון ציבורי) שאושרה על ידי הגורמים המוסמכים במועד אישורה — מעמדה זהה למעמד של תכנית בניין עיר, ולפיכך ניתן לראות בה מקור תכנוני לעניין הוראו"
|
||||
1018-20,38fdb4a7-b7db-45f9-a54c-892053e32728,approved,rejected,2,0.81,fe31c01d-d4bf-4e4a-8b99-8c06a5a5fee5,"כאשר תכנית בניין עיר קודמת הסדירה את ייעודי הקרקע במגרש, ותרש""צ מאוחרת קובעת מפורשות כי אין בה כדי לפגוע או לשנות הוראות תכניות שאושרו לפי חוק התכנון והבניה — ל"
|
||||
1018-20,ae1ae032-509e-4be1-ab92-4ba948508efa,approved,rejected,3,0.79,613f333b-9854-4c5e-8ad1-dfaeaa002604,תכניות שאינן כוללות הוראות בנושאים הנזכרים בסעיף 145(ז) לחוק התכנון והבנייה אינן בלתי חוקיות באופן גורף; חוקיותו של היתר הנשען עליהן נבחנת פרטנית לכל היתר ונסיב
|
||||
1018-20,e77187f9-7db7-4dac-ad5e-01a8b39c9d09,approved,rejected,2,0.9,53d8c45c-d789-4260-8eba-d104dfdd6636,"היתר בנייה חייב לעלות בקנה אחד עם הוראות התכניות שבתוקף ולהינתן מכוח תכנית בעלת רמת פירוט נאותה, כאשר רמת הפירוט הנדרשת נגזרת מאופי ההיתר המבוקש, מהבנייה המתוכנ"
|
||||
1018-20,a15c14b2-6af4-4c01-a033-e27c687fc0d3,approved,rejected,2,0.9,7166b625-291b-4293-91cb-5d3d3de87dd2,"אף אם הוראה מסוימת מסמיכה את הוועדה המקומית להחליט על מתן היתר בנייה גם בלא תכנית מפורטת, עליה להפעיל את סמכותה לפי אמות המידה של המשפט המנהלי ולבחון כל בקשה לג"
|
||||
1018-20,b87b4bf8-cf24-4b08-bd88-866ea4b361bd,approved,rejected,2,0.9,d51626d8-45a4-41cc-bb3a-46f33fdf0604,"הוראות סעיף 145(ז) לחוק התכנון והבניה (תיקון 43), שעניינן דרישת הפירוט בתכניות, חלות רק על תכניות שהופקדו לאחר 1.1.1996; משכך אין לקבוע באופן גורף כי תכניות שהו"
|
||||
1018-20,6479a0f4-3d4f-49d1-8f6f-71cfa942ed3b,approved,rejected,2,0.875,c560e459-1ea1-4318-9892-ac94061f466e,"בבחינת היקף הבנייה הראוי במגרש המיועד לצורכי ציבור, יש ליתן משקל למדיניות התכנונית המחוזית המאפשרת אחוזי בנייה משמעותיים בשטחים המיועדים לצורכי ציבור, וזאת לשם "
|
||||
1018-20,8e4ca1a9-f485-45dd-b2a4-df6fa62546f0,approved,rejected,2,0.85,6def3cbd-1f26-4501-87c4-117676f88fbc,"על פי הוראות תכנית 62, בנייה בקו בניין אפס מתאפשרת עבור מבני ציבור בין שתי חלקות סמוכות המיועדות למבני ציבור."
|
||||
1018-20,10b5dd61-c3b3-4099-b4c7-ee012d9d73c3,approved,rejected,3,0.8233,af548bb9-d5c6-4c73-9dab-faf99b1605ca,"עמידת היתר במבחני החוקיות והסבירות אינה ממצה את הביקורת התכנונית: אף היתר שאינו נגוע באי-חוקיות או אי-סבירות עשוי להידחות מטעמי אי-יעילות תכנונית, כאשר הוא פוגע"
|
||||
1018-20,cb2c649d-f5f1-4bbd-98f2-4c92277d7e7d,approved,rejected,2,0.85,5a1866b8-a4af-4897-a453-b336c0b76057,"שטחים עירוניים המיועדים לצורכי ציבור הם משאב מצוי בחסר, המחייב תכנון מוקפד, מקסימלי ומיטבי — לרבות עירוב שימושים והעצמת זכויות — בהתאם לתדריך המעודכן משנת 2016 "
|
||||
1018-20,b86e9666-7233-45c0-a704-e04e97650429,approved,rejected,2,0.825,b1740c9f-8ab7-4ec8-abbe-e4a3f51c011c,"תוספת בינוי שנועדה להחליף מבנים יבילים זמניים הפזורים בשטח, על דרך ריכוזם לכדי אגף בנוי באותו ייעוד ובאותו היקף בנייה, ניתנת להיחשב כהרחבה או הסדרה של הבינוי הק"
|
||||
1018-20,0301bd6d-68f7-43e0-97cf-e8169abca00e,approved,rejected,3,0.84,d4d0d882-4d62-443f-9b92-c737771e7ae0,בינוי קיים שנבנה כדין מכוח היתר בנייה — לרבות תקן החניה כפי שאושר לעת מתן ההיתר — אינו נפתח מחדש לדיון בכל אימת שמבוקשת תוספת בנייה חדשה למבנה; ראיית כל תוספת כ
|
||||
1018-20,c28a1f27-b33f-4cc1-b425-f8a547252f89,approved,rejected,2,0.875,4e3c7fb4-688d-4b22-8179-af3633079a89,"השלב הסטטוטורי שבו מיושם תקן החניה הוא שלב היתר הבנייה, אלא אם נקבע אחרת בהוראות התכנית התקפה; ועל פי רוב קובעות הוראות תכניות בניין עיר כי החניה עבור הבינוי המ"
|
||||
1018-20,6885577d-4069-4f68-bdd7-2669be70f9f8,approved,rejected,3,0.7567,e7dba65b-ad1c-4d58-9413-0aa898272e20,"לעניין חובת פתרון החניה יש להבחין בין תוספת יחידת דיור עצמאית, המהווה יחידה נפרדת המחייבת פתרון חניה משלה, לבין הרחבת מבנה ציבור קיים, הדומה במהותה להרחבת דירה "
|
||||
1018-20,d624c95d-01f9-48a6-b23f-282fcac289e6,approved,rejected,0,0.0,e8095b8f-cfea-4bc6-84dc-460bf5d95ea1,"תכנית בניין עיר הינה דבר חיקוק, ועל כן הכללים החלים על פרשנותה הם כללי הפרשנות החלים על פרשנות דינים."
|
||||
1018-20,6d82c9af-0f4c-40c2-a3aa-d186eee270ba,approved,rejected,2,0.9,5b6c7654-f817-48c3-b183-7720cbe326ff,"משפרשת הוועדה המקומית תכנית, פעולתה כמוה כפירוש מעשה חיקוק; לפיכך אין חל על פרשנותה מתחם הסבירות, ועל הערכאה הבוחנת לבחון האם הפרשנות היא הנכונה והמתאימה לאור כ"
|
||||
1018-20,05788092-55db-44b3-8363-deb016baa4af,approved,rejected,2,0.875,820a76f7-db34-4996-9065-5eaf7b50bb72,"פרשנות תכנית אינה נעשית באופן דווקני ובחלל ריק; יש להעדיף פרשנות הרמונית של לשון התכנית, המיישבת בין הוראות החקיקה השונות ובין הוראות התכנית עצמן, כך שתיווצר ""ה"
|
||||
1018-20,2df36488-bf90-4cad-b6df-9c5d17984944,approved,rejected,0,0.0,e492e798-2165-440d-84b7-3c3578340365,"פרשנותה של נורמה משפטית — בחקיקה ראשית או בחקיקת מישנה — נלמדת בניתוח תלת-שלבי המתמזג להווייה פרשנית הרמונית אחת: לשון הנורמה, תכלית הנורמה, ובמקום שמתגלות מספר"
|
||||
1018-20,de5fc277-b946-438e-96b8-35b34bf674fb,approved,rejected,1,0.95,1fb10fbb-cffa-4bb8-951b-51f59345f51a,"לשון הנורמה היא המסד שעליו נבנה הפירוש התכליתי, והיא הקובעת את גבול התפרשותה של הנורמה; מבין מספר משמעויות לשוניות אפשריות יש לבחור באותה משמעות המגשימה באופן ה"
|
||||
1018-20,da4af8b4-0898-44b6-91a4-abd46cb7c644,approved,rejected,2,0.825,2b3cb6ba-7831-446d-953c-f625a5549a55,"מקום שהוראות תכנית קובעות במפורש דרישה ל""מפרץ הורדה לאוטובוסים"" (להבדיל ממפרץ הורדה כללי), ניתן לראות תחנת אוטובוס קיימת המצויה בסמיכות האפשרית והמרבית למוסד כמ"
|
||||
1018-20,18555d60-ea02-4e6e-8fa5-83a34eaf3e47,approved,rejected,2,0.875,2c9f7a6e-fbd3-44e4-ad24-2d0cfc8b5b6d,"הוראה בתכנית יש לפרש בהינתן כותרתה, באופן שהכותרת מגדירה את היקף תחולת ההוראה ואת תכליתה."
|
||||
1018-20,2ddb1df6-70b6-4248-b713-a8c41caa752c,approved,rejected,3,0.8533,64565eaa-5fae-4a13-938c-e394e7dd59fb,"תקן החניה לתוספת בנייה מחושב ביחס לשטחי הבנייה (השטחים העיקריים) המבוקשים בהיתר החדש בלבד, והמועד הקובע לעמידה בתקן הוא מועד הוצאת ההיתר; מתן היתר חדש או נוסף א"
|
||||
1018-20,5f816b6f-6efd-4928-9cb1-57f8c01639d8,approved,rejected,1,0.9,58613239-f2f4-47e0-8ea2-598b5891b2d7,בקשה להארכת מועד להגשת ערר תידחה מקום שקיים שיהוי בהגשתה וטענות המבקש אינן מגלות טעמים המצדיקים את בירור הערר על אף האיחור; נטל ההצדקה לבירור חרף האיחור מוטל על
|
||||
8064-20,5e6c3758-2625-4fb5-9e9e-d354bf7f97f7,approved,rejected,0,0.0,9191fa67-b390-498f-8d5d-4015d91f08be,"תנאי סף לתחולת התמריצים מכוח תמ""א 38 הוא כי מדובר בבניינים שהיתר הבנייה בגינם הוצא קודם ליום 1.1.1980; בניין שהיתרו ניתן לאחר מועד זה אינו זכאי לפטורים ולתמריצי"
|
||||
8064-20,6542f9a2-2ee3-4758-907c-5a77b7e4bd11,approved,pending_review,2,0.825,78533fde-742c-4336-a89d-1bfc844e3712,"כאשר היתר בנייה קודם איפשר שימוש בטכניקת פלקל ותוספת הבנייה גוררת עלויות עודפות נוספות בשל החיזוק הנדרש, יש להביא עלויות אלו בחשבון בתחשיב שומת היטל ההשבחה, גם "
|
||||
8064-20,1ff68df0-01fb-4106-aad7-aba4b5076a73,approved,rejected,1,0.8,8d75afbf-f1a3-435e-a2b1-587ab3c3daf3,"בסכסוך שומתי הנוגע לעלויות נדרשות בתחשיב היטל השבחה, ועדת הערר מוסמכת למנות שמאי מייעץ לבחינת כלל העלויות, לרבות סמכות השמאי המייעץ למנות מומחה נוסף מטעמו לצורך"
|
||||
8064-20,f3daf560-1ec1-4de1-8008-1065e80bb557,approved,rejected,0,0.0,5058c368-92ca-4f4b-aab4-3f258874d0cc,הזכאות לפטור מהיטל השבחה לפי סעיף 19(ב)(4) לתוספת השלישית לחוק התכנון והבניה מותנית בהתקיימות שלושה תנאים מצטברים: (א) זהות — המקרקעין המושבחים שייכים למוסד לחי
|
||||
8064-20,c0e33fcf-c18e-42d2-9c5c-1cda06f06ea1,approved,rejected,3,0.8067,8b641556-b592-4134-9673-6c2274ba0234,אין עיגון בדין לשלילת הפטור מהיטל השבחה לפי סעיף 19(ב)(4) לחוק התכנון והבניה מתאגידים זרים; פרשנות מצמצמת השוללת תחולת הפטור על תאגיד מחוץ לישראל אינה נסמכת על
|
||||
8064-20,8fb47808-01ad-40ee-a0b5-e7418b2928f8,approved,rejected,3,0.8233,853ae18f-9b2f-4d20-a70c-6311c92325b2,"על מנת להיכנס בגדר הפטור מהיטל השבחה לפי סעיף 19(ב)(4) לתוספת השלישית, על ייעוד הקרקע לשמש, באופן מפורש, למטרות המנויות בסעיף בלבד. מקום שהמצב התכנוני מאפשר שימ"
|
||||
8064-20,1e329254-b91f-438a-ab92-d5a3673bf4bc,approved,approved,2,0.9,996e39ae-ac12-44b5-b59f-4e5285802b7b,"הזכות לדיור כערך חוקתי-חברתי מוגן, כשלעצמה, אינה מקנה זכאות לפטור מהיטל השבחה לפי סעיף 19(ב)(4) לחוק התכנון והבניה; נדרש עמידה בתנאים הפורמליים של הסעיף."
|
||||
8064-20,edec26d3-823e-44c2-8ca2-4a219dc67903,approved,approved,2,0.9,8150023f-6b50-489d-a6bc-b1ff8c8f7f6d,"על מנת שבניית דירות מגורים והשכרתן תחשבנה כפעילות של 'סעד וצדקה' המזכה בפטור מהיטל השבחה לפי סעיף 19(ב)(4) לתוספת השלישית לחוק, על הפעילות לעמוד בשני תנאים מצטב"
|
||||
8064-20,ea91aa6f-4ceb-481b-807f-c2bd8866fd78,approved,approved,2,0.9,2eac071e-329c-4085-915d-ff1ee7799115,"היטל השבחה הינו מס באופיו, ועל כן חוסה תחת אמות המידה שבבסיס דיני המס הכלליים — שוויון, בהירות, ודאות ויעילות — וכן תחת עקרונות המשפט המנהלי."
|
||||
8064-20,dd559130-077d-4453-aa78-66ddfe52877e,approved,rejected,3,0.79,28aad4af-6610-4beb-a467-81d8cc3ff0ac,מוסד המבקש פטור מהיטל השבחה לפי סעיף 19(ב)(4) נדרש להראות כי הוא מעשיר את הציבור כולו — ולא חלק מסוים ממנו — בחלף היטל ההשבחה; תנאי זה נגזר מהרציונל שלפיו הפטור
|
||||
8064-20,06034aa9-8f1b-4ec6-b6d9-c8fe404dddf8,approved,pending_review,2,0.825,4d224a57-00d4-4b55-bfe5-2bb6cce44d23,"במקרים שבהם אמת המידה האסורה רלוונטית לטיב השירות עצמו — כגון הקמת בתי כנסיות, מקוואות, מוסדות חינוך, או שעות רחצה נפרדות — ניתן להכיר בה חרף איסורה הכללי. אולם"
|
||||
1044-05-24,13fa18eb-51bf-4bce-846a-b0761ecadc37,pending_review,approved,2,0.9,26d01d30-8965-422f-9f8c-3846dc716bfc,"הפירוט הנדרש לצורך הנפקת היתר בנייה אינו חייב להימצא דווקא בתכנית שכותרתה ""תכנית מפורטת"", ועשוי להימצא גם בתכנית מתאר מקומית הכוללת עניינים שמטבעם הם עניינים של"
|
||||
1044-05-24,4aad955d-a980-4db7-8855-dbf62e01675c,approved,rejected,2,0.875,e5436116-f305-41e9-891d-8bf75cf8ce10,"יש לפרש הוראות תכנית על פי מהותן ותכליתן ולא בצורה לשונית-טכנית בלבד, מתוך הנחה שהוגה התכנית לא ביקש לייצר וואקום תכנוני המונע התפתחות פנימית של יישובים קיימים,"
|
||||
1044-05-24,5e026471-f5eb-460d-80b8-fce1204eded7,pending_review,approved,2,0.9,df8967f4-4a67-494e-921d-a96585aa1430,"ועדת הערר לתכנון ובנייה אינה הערכאה המוסמכת להכריע בטענות בדבר סמכותו או היעדר סמכותו של ועד הישוב לפעול מכוח צו המועצות המקומיות, או בדבר התנהלותו מול המועצה ה"
|
||||
1044-05-24,db94f487-663e-4d34-9a65-8e8b4e2ee097,pending_review,rejected,1,0.9,8d363c16-d675-4df9-a6cb-2a201096cd9e,"בעל זכות עמידה רשאי להגיש ערר על היתר בנייה שאושר כתואם תכנית וניתן ללא פרסום, בתוך 30 ימים מהמועד שבו נודע לו על דבר ההיתר, בטענה כי ההיתר אושר בסטייה מהוראות "
|
||||
1044-05-24,a0668e08-26bb-4af0-8105-72fa5f0d6d70,pending_review,rejected,2,0.875,5d73b0a4-975e-415a-8bc8-9a89e7e19621,"טענה כי דין הערר להידחות בהעדר זכות עמידה משום שההיתר תואם את הוראות התכנית התקפה אינה מהווה טענת סף, אלא מחייבת בירור לגופו של עניין – האם אכן ניתן להוציא היתר"
|
||||
1044-05-24,89453ce3-a430-416b-b989-8d05d115eb3b,approved,rejected,0,0.0,bef12974-9533-4cce-8c8e-d804c4b7501e,"תכנית מתאר היא בגדר דבר חיקוק, ומשכך הכללים החלים על פרשנותה הם הכללים החלים על פרשנות דינים."
|
||||
1044-05-24,906acc94-a9ea-439d-bfe9-bfc5c4d8cbc2,pending_review,rejected,2,0.8,93381b4d-c6eb-4465-b547-defb7a3100ff,"כאשר מדובר בחטיבת שטח לצורכי ציבור, שבה אופן הבינוי והתכנון משפיע על כלל תושבי הישוב ועל אורח החיים בו, יש בכך כדי לבסס זכות ערר לגורם רלבנטי המבקש לתקוף את התכ"
|
||||
1044-05-24,e56d2ec0-fa67-4a8b-8a45-b0e5c0b419b5,pending_review,rejected,2,0.875,ba44cc55-3bc6-446a-8775-761b10cd0602,"טענת שיהוי או מעשה עשוי נבחנת לפי מושא הערר בפועל; כאשר הערר מכוון כנגד שינוי הבינוי והשטחים שנקבע בתנאים מאוחרים למתן ההיתר, ולא כנגד עצם אישור הבקשה הראשוני, "
|
||||
1044-05-24,a2f7244e-11dd-4ee1-a983-51701da3a349,pending_review,rejected,2,0.875,4fb3957f-9701-46f3-b669-47767d33bded,"דרישה לקיומה של תכנית מפורטת כתנאי להוצאת היתר בנייה עשויה להילמד לא רק מהוראה כללית מקדימה בראש פרק, אלא גם מסעיפים פרטניים בתוך פרקי התכנית המתייחסים לאישור ת"
|
||||
1044-05-24,54cf238e-48aa-4c1a-986e-0b5691446bb1,approved,approved,2,0.9,70cbe477-91fb-4bed-b5e6-8b789af7a42e,"פרשנותן של הוראות תכנית מתאר אינה נגזרת מלשונה בלבד אלא נשענת על הגיונה, מטרתה ותכליתה; לחזקה כי הנסח דק בלשונו יש ליתן משקל מוגבל, ובמיוחד כך משעסקינן בהוראות "
|
||||
1044-05-24,15b400c1-bc69-4750-b6bd-ecd498ebd536,approved,rejected,1,0.9,5a00c237-8cf1-4e87-84df-c7801ac929b8,"בפרשנות תכנית יש להעדיף פרשנות הרמונית, המבקשת ליישב בין הוראות החקיקה השונות ובין הוראות כלל התכנית עצמן, באופן היוצר הרמוניה חקיקתית בין מכלול ההוראות."
|
||||
1044-05-24,6b0f6489-f117-4b7d-a355-3a70981620c1,pending_review,rejected,1,0.85,52d1c83b-03d9-409e-be58-235b643f00a5,"תכנית הפרוסה על שטח רחב בקנה מידה גס (כדוגמת 1:10,000) והכוללת התייחסות כללית למכלול ההיבטים, התכליות והשימושים, מהווה תכנית מתאר מקומית כללית, אשר אינה קובעת ה"
|
||||
1044-05-24,de79d443-e2db-4b7d-b2d8-c3e6ab213436,approved,rejected,3,0.8233,d6617c72-5aee-468a-a346-6963e1159c50,"הוראת מעבר בתכנית מתאר המתנה הוצאת היתרי בנייה בהכנת תכניות מפורטות מכוחה, יש לפרשה כמאפשרת הוצאת היתרים גם מכוח תכניות מפורטות ותשריטי חלוקה שאושרו כחוק קודם ל"
|
||||
1044-05-24,84cbed7a-b138-4fe2-94af-7c03ec23ddfa,pending_review,rejected,3,0.79,c8f435ec-4eea-4eaa-a595-dbbb79fe6ec1,"בפירוש הוראת מעבר יש ליתן משקל לתכלית של מניעת ""הקפאה"" או קיפאון בהוצאת היתרי בנייה במרחב התכנון, שכן אין להניח שתכנית מתאר ביקשה לעצור באחת מתן היתרים עד לאישו"
|
||||
1044-05-24,2de8e93a-6b57-485f-a011-3be20353800b,approved,rejected,2,0.875,df04db2c-a590-47bd-814f-54c6705ef13e,"כאשר תכנית מתאר קובעת ייעוד בהיקף שטח נרחב (למשל תא שטח של עשרות דונמים המיועד למבני ציבור ומוסדות ציבור), אין לאשר היתר בנייה ללא קיומה של תכנית מפורטת מתווכת,"
|
||||
1044-05-24,a3cf3195-2b1e-4f70-9c08-895567e65fbf,pending_review,rejected,2,0.85,c08968b1-e42a-4141-ad5b-1111379be43f,"לצורך עמידה על תכליתה של תכנית, ניתן וראוי להיעזר לא רק בהוראות התכנית גופן אלא גם בעיון בתיק התכנית ובמסמכים שבוועדה המחוזית מעת קידומה, הפקדתה ואישורה."
|
||||
1044-05-24,f6971098-bdfe-4fe1-b1b0-3eb6075967a4,approved,approved,2,0.9,788b6f2c-4b3f-4351-b655-a6a94a00da0b,"פרשנות תכליתית של תכנית או הוראת חוק מחייבת עיגון לשוני, ולו מינימלי, בלשון ההוראה; בהיעדר כל עיגון לשוני לא ניתן להרחיב את הפרשנות התכליתית, שכן הדבר יהווה סתי"
|
||||
1044-05-24,297095a8-a457-4051-84a3-a8142f65e01d,pending_review,approved,2,0.9,7350c8b5-8251-42a1-a302-9f5d54c5b596,"תכנית מי/200 אינה תכנית שניתן להוציא היתרי בנייה מכוחה, ובהיעדר תכנית מפורטת חדשה לא ניתן להסתמך עליה לבדה לצורך הוצאת היתר."
|
||||
1044-05-24,6a794b8b-613e-4975-b218-2a6a8d57cace,pending_review,rejected,2,0.9,26dfe2e1-4506-4cb5-a6de-30013f668e2c,"החובה להכנת תכנית מפורטת מכוחה של תכנית מי/200, הקבועה בהוראה מפורשת בפרק כ""ב לתכנית כפי שאושרה בעניין אדם טבע ודין, עשויה להיחשב כחובה שנתמלאה כבר בגופה של תכנ"
|
||||
1044-05-24,1a1ded9c-c7cf-467d-a657-1426ee1604df,approved,rejected,1,0.8,698692f6-2021-4c59-8d13-46c8c57b89a4,"בבחינת השאלה אם ניתן להוציא היתר בנייה להקמת מבני ציבור בשטחים חומים מכוח תכניות ישנות, שאינן כוללות את ההוראות הנדרשות להתקיים בתכנית מפורטת לפי תיקון סעיף 145"
|
||||
1044-05-24,64f35f87-2452-44a4-a4db-41bfce6ccd66,pending_review,rejected,2,0.9,2d0ee8a4-9f40-40cd-8129-8e4186ae0f65,"תכנית מתאר הקובעת כמסגרת קונקרטית את הכנתה ואישורה של תכנית מפורטת, מתנה את הוצאתם של היתרי בנייה מכוחה בקיומה של אותה תכנית מפורטת; החובה להכין תכנית מפורטת עו"
|
||||
1044-05-24,c94edbdb-c860-4f48-9bdb-726c50153965,pending_review,rejected,2,0.875,e3abee3f-cdfc-4198-990a-06e8e9f877d2,"הכנתה של תכנית מפורטת מגשימה את עיקרון הדמוקרטיזציה של הליך התכנון לצד עקרונות השקיפות ושיתוף היחיד והכלל במעשי השלטון והמנהל, ובנושאים מהותיים המשפיעים על איכו"
|
||||
1044-05-24,6af66251-7348-4e84-bc67-af9f53fe81a3,pending_review,rejected,2,0.9,0b29c2ed-ad3a-4618-82a1-2e1f00864d9a,"תיקון 43 לחוק התכנון והבנייה והוראות סעיף 145(ז) לחוק חלים רק על תכניות שהופקדו לאחר 1.1.1996; משכך, לא ניתן לקבוע באופן גורף כי תכניות שהופקדו קודם לכן נגועות "
|
||||
1044-05-24,a8b3791d-565e-4abe-b298-2b8dfc33b221,approved,rejected,2,0.825,d2811c80-5fed-48df-9a65-05803042f13a,קיומה של סמכות להוציא היתר מכוח תכנית שאינה כוללת זכויות והוראות בינוי אינו מחייב הפעלת שיקול הדעת לאשרו; השאלה אם נתונה סמכות נבדלת מהשאלה כיצד ראוי להפעיל את
|
||||
1044-05-24,bbf1b402-4439-46cc-88bc-a3b9ca63a153,pending_review,rejected,2,0.825,24e39a3e-572a-4d23-9767-a0fc9afb44aa,"הוצאת היתר בנייה בהיקף בינוי מצומצם מכוח תכניות ישנות אינה בהכרח נגועה באי-חוקיות או באי-סבירות, אך עשויה להיות נגועה באי-יעילות תכנונית ולפגוע בניצול מיטבי ויע"
|
||||
1044-05-24,f2a35beb-2d33-4923-bc5c-05c7b3aec51f,pending_review,rejected,0,0.0,76c69c90-ea80-449c-a52f-d1db8db1d5b7,"היתר בנייה חייב לעלות בקנה אחד עם הוראות התכניות שבתוקף ולהינתן מכוח תכנית הכוללת רמת פירוט נאותה; רמת הפירוט הנדרשת נגזרת מאופי ההיתר המבוקש, מהבנייה המתוכננת "
|
||||
1044-05-24,bc7ef37b-0453-40e5-9e18-40fd2f4ea2a2,approved,rejected,3,0.8067,d9334a9e-c33b-45f5-a519-6368b35056ad,"הוראותיהן של תכניות ישנות החלות על מקרקעין המיועדים לצורכי ציבור והנעדרות פירוט אינן מקנות לוועדה המקומית שיקול דעת מלא בהתייחס לזכויות הבינוי והוראות הבינוי, ו"
|
||||
1044-05-24,d4811f64-7dad-4882-ae67-b5674e1717ca,approved,rejected,2,0.9,3d4bfc97-9ec6-4a5e-967a-466c31bf9d5a,"מקום שבו הוראות התכנית מתנות באופן מפורש וחד-ערכי את מתן היתר הבנייה באישור תכנית מפורטת על ידי הוועדה המחוזית, אין לראות בתכנית עצמה משום תכנון מפורט, וניתן יה"
|
||||
1044-05-24,2d3586b6-a2d2-4608-8093-1ad4e4af0d25,pending_review,rejected,2,0.9,d3a8b521-a232-4582-96fb-c56aaacc5dcd,"אף כאשר הדרישה לתכנון מפורט אינה נלמדת מהוראה ספציפית בפרק הרלוונטי אלא מהוראה כללית בתכנית, חל הכלל לפיו לא תתאפשר הוצאת היתר בנייה ללא תכנית מפורטת, בהתאם לאש"
|
||||
1044-05-24,7a56ef5b-9887-42d6-a495-999efd10b3b1,approved,rejected,2,0.875,1967e754-147f-4178-ba62-19415ae90406,"כאשר תכנית כוללת הוראה ספציפית הנוקטת לשון עתיד המחייבת אישור תכנית מפורטת, פרשנות המתעלמת מהוראה זו או הגוברת עליה עומדת בסתירה ממשית הן להוראה הספציפית הן להו"
|
||||
1044-05-24,22db2329-daaa-461f-aa6a-eacb7ae42202,approved,rejected,3,0.8233,c3555645-bf1b-4a5f-98ae-df9d6efa7e40,"מקום שבו חטיבת קרקע נרחבת צפויה לאכלס מספר שימושים ציבוריים, נדרש לבחון באופן כולל ומושכל את יחסי הגומלין בין השימושים — לרבות החצנותיהם על הסביבה, היבטי עירוב "
|
||||
1044-05-24,e3850fb8-7be8-41e8-9fc9-f419c49e06d9,pending_review,rejected,3,0.79,cfee9b1d-4be5-4ebb-9104-3745263a3764,בקשה להיתר הכוללת הריסת מבנים המשמשים שימושים ציבוריים קיימים מחייבת מתן מענה ברור באשר לגורל אותם שימושים ולחלופה שתינתן להם; היעדר תשובה מצד הגורמים המקצועיים
|
||||
1044-05-24,d7c75cdc-7e22-4d9c-aedd-235d0953da1c,pending_review,rejected,2,0.875,15bcdde2-6105-4a5f-abc8-5911b6bfab7d,"היעדר קריטריונים ברורים וקבועים מראש באשר למקרים בהם רשות הרישוי מסתפקת בתכנון המוצע בבקשה להיתר, לעומת המקרים בהם תידרש פרסום תכנית בינוי או הכנת תכנית סטטוטור"
|
||||
1044-05-24,c9ee21aa-0432-4513-aa5c-cfacc5bed89d,pending_review,rejected,2,0.825,fc20845e-1f8e-4d03-b461-113ef0f9f71b,"מקום שתכנית כוללת הוראה מפורשת האוסרת הוצאת היתר בנייה למוסדות ומבני ציבור בטרם תאושר תכנית מפורטת, ובד בבד הוראותיה לעניין בינוי שטח לצורכי ציבור הן כלליות ביו"
|
||||
1044-05-24,4fa2d643-998b-4ff4-9ef6-8af4957051a1,pending_review,rejected,3,0.79,a1b0ed0f-6542-4aa5-9fca-5634557ed9d6,"כאשר תכנית מגדירה אך את שטח המגרש המינימאלי והיקף הזכויות, בלא לקבוע את מיקום הבינוי הספציפי והשלכותיו, לא הייתה לציבור הזדמנות ממשית להתנגד לבינוי המוצע במועד "
|
||||
1044-05-24,827d4b0e-468a-49ee-b471-4c399863b152,pending_review,rejected,3,0.8233,871a4933-34fc-4abb-ad6c-cc229187e9f0,את תיקון 43 לחוק התכנון והבנייה יש לפרש בצמצום ביחס לתכניות ישנות הדורשות תכנית בינוי: התיקון מאפשר שימוש מסוים ומוגבל בלבד בתכניות הישנות עד לאישור תכניות סטטו
|
||||
1044-05-24,48b472e5-c003-4a12-8368-5ae6897ae63f,pending_review,rejected,2,0.875,e6847246-6cc5-4254-9df3-14bd8bfc103b,תכנית מתאר שאינה כוללת הוראות בינוי או הוראות מפורטות למבני ציבור אינה יכולה לשמש להשלמת תכנית אחרת הקובעת מפורשות כי לא ניתן להוציא מכוחה היתרי בנייה; במצב כזה
|
||||
1044-05-24,250ee135-8aca-4f05-b91f-a107efa97df0,approved,rejected,3,0.86,1987640d-5cc3-4ef6-85c7-c64e5f60ca7e,"תכנית ישנה שאינה כוללת את ההוראות הנדרשות בסעיף 145(ז) לחוק התכנון והבנייה, ואף אינה כוללת פירוט מינימאלי כלשהו המאפשר הוצאת היתרי בנייה מכוחה, אינה יכולה לשמש "
|
||||
1044-05-24,aa9ac5da-93b6-489d-acd6-70e9a08f66c1,pending_review,rejected,2,0.9,5f091d96-e9f9-46ea-b2e6-dd6c140236d3,"על הוועדה המקומית לנהוג באופן שוויוני ועקבי ביחס לבקשות להיתר דומות, ולהחיל על בקשותיה-שלה (לרבות בינוי מוסדות ציבור מטעם הרשות) את אותה אמת מידה שהחילה על מבקש"
|
||||
1044-05-24,59969eb5-c132-49db-9130-2c016d500c72,pending_review,rejected,2,0.875,7d6b9bef-f7e0-41e4-a887-e6621876aa14,"תכנון כולל של חטיבת קרקע ציבורית משמעותית יש לבצע בהליך שקוף הכולל שיתוף ציבור באמצעות הפקדת תכנית מפורטת כדין, המקנה לתושבי היישוב את הזכות להביע עמדתם ולהשמיע"
|
||||
1188-23,bda2da22-b147-42ae-a9b9-331782620c5f,pending_review,approved,2,0.875,0c97bc5c-ed24-4d64-a37f-df2699d76693,"בשכונה בעלת מאפיינים טופוגרפיים מיוחדים, שתכניתה הוכנה ואושרה תוך תכנון המשתלב עם הפרשי הגובה שבתחומה, בחינת בקשות להיתרי בניה מחויבת להיעשות לאור הפרשי הגבהים "
|
||||
1188-23,4755ed19-27f7-4499-8b80-b4a6145c8239,pending_review,approved,3,0.8067,240a2f9a-f04c-4933-a0d0-523f9410588f,"מסמך מנחה (כגון מסמך טיפולוגיה) המהווה חלק ממסמכי התכנית נושא משקל מחייב, ועקרונותיו מחייבים את מבקש ההיתר. הערה במסמך כי 'הפרטים הסופיים ייקבעו לעת התרת הבניה'"
|
||||
1188-23,7a3bf9c8-ba80-4c0d-955d-95fcdb4a2ecb,approved,approved,2,0.9,b5806b67-7e73-4ea6-9e3c-a243c96dcdc5,"נספחי בינוי נחלקים סטטוטורית לפי מעמדם: נספח מחייב מהווה חלק לכל דבר מהוראות התכנית ואין לסטות ממנו אלא בהליך תכנוני (תכנית חדשה או הקלה), ואילו נספח מנחה מהווה"
|
||||
1188-23,1e34266d-b6bd-44f6-9c30-e91b3e8ce689,approved,rejected,3,0.8067,bbac469d-3d35-4705-bba4-07a778022465,"נספח בינוי מנחה מהווה הוראה בתכנית לכל דבר ועניין, ובהעדר הנמקה תכנונית והפעלת שיקול דעת על-ידי מוסד התכנון המוסמך יש לפעול בהתאם לו; הכלל הוא בנייה לפי הנספח ה"
|
||||
1188-23,9941fe04-9433-4a38-aa8d-50a2e23b8fdc,approved,rejected,1,0.9,12edecf2-ea29-4e88-aff8-d48c05811801,"טענות בדבר מגבלות חוזיות או זכויות קנייניות במקרקעין אינן בסמכותה של ועדת הערר לתכנון ובנייה, ומקומן להתברר בערכאות המוסמכות לכך; ועדת הערר לא תדון בהן."
|
||||
1188-23,1b91b5b3-d4a0-46c1-941b-833b3b96f0ad,pending_review,approved,3,0.8667,98a83aad-8200-467f-9d89-e76b27314954,"נספח בינוי ועיצוב המצורף לתכנית, גם כאשר התכנית קובעת שאינו מחייב או מחייב רק לעניינים מסוימים, אינו בגדר ""הצעה לתכנון"" או המלצה בלבד שניתן לחרוג ממנה כלאחר יד;"
|
||||
1188-23,8cb1c4f7-721b-430e-949d-e0ce9558693c,pending_review,approved,2,0.9,c1e3f6b7-ddba-421b-b811-8017333c81ab,הסכם בין הצדדים אינו מחייב את הוועדה המקומית ואינו יכול להנחותה כאשר אימוצו יעמוד בניגוד להוראות התכנית; על הוועדה לשקול את האינטרס הציבורי מתוך שיקולים תכנוניי
|
||||
1007-21,548ec1f8-2ff6-4035-b79c-2c025f246e5d,approved,rejected,1,0.9,f50ea1c8-9693-4029-83a9-bea006b35abe,"בקשה לבינוי על גבי שטח הצמוד קניינית לדירת המבקש בבית משותף (שטח פרטי) אינה מחייבת את הסכמת יתר דיירי הבית המשותף, בשונה מבינוי על גבי רכוש משותף — המחייב הסכמת"
|
||||
1007-21,7c554a96-f755-4790-9b1e-c459976b7b72,approved,rejected,1,0.8,e00666cd-9e90-457e-91a7-0e01d89222bf,"בחינת ההיבט הקנייני של בקשה לבינוי כוללת בדיקה אם קיים רכוש משותף בתת-הקרקע שמתחת למיקום הבינוי המוצע (לרבות חניות ומעברים), לשם הערכת היתכנות פגיעה ברכוש המשות"
|
||||
1007-21,1fa33a57-c131-474d-87b9-e599819e1fb2,approved,rejected,2,0.825,6728c4d0-bb3a-41a1-abbb-0727d90f1545,"בבחינת מטרד רעש פוטנציאלי מבריכת שחייה ביתית, יש לשקול את המטרד הצפוי בהשוואה לחלופה הקרקעית — שטח מגונן/גינה — שאף היא עלולה להוות מקור למפגעי רעש (ילדים, שיחו"
|
||||
1007-21,3c6831a1-bc10-4920-ac92-497934c8ff3a,approved,approved,2,0.9,94918c33-d419-45cf-9b24-45eecd60b2aa,"ניתן לאשר בריכת שחייה בחצר של בית פרטי גם בהיעדר תכנית המתירה זאת במפורש, ובלבד שהבריכה עומדת בקווי הבניין החלים על המקרקעין."
|
||||
1007-21,d4260b11-8044-4ac8-856c-d056ee643f07,approved,approved,2,0.9,bd30dc88-00d2-4e84-bd47-2dd3d65658f0,"אישור בריכת שחייה בחצר של בית משותף מחייב עריכת איזון בין זכותו של הדייר לנצל את המקרקעין כראות עיניו לבין האינטרסים של יתר דיירי הבית המשותף, להבדיל מבית פרטי "
|
||||
1007-21,d86c4db2-f539-49a2-94fc-a10bf952de8c,approved,approved,2,0.875,04c13433-e7cf-44fe-a2c8-5549a29eff64,"ועדה מקומית מוסמכת להתנות תנאים סבירים ונאותים בכל היתר בנייה שהיא מוציאה במסגרת סמכויותיה, וזאת גם בהיעדר מדיניות או הנחיות קונקרטיות של מהנדס העיר בנושא."
|
||||
1007-21,e11cd0b8-4bb3-4be7-9b03-2cb75ae2280b,approved,rejected,0,0.0,9037693d-d4ea-4dc2-bb3f-c9f88432d7b9,"מקום שבו שימוש בבריכה עלול לגרום מטרד, ניתן לתת מענה לכך באמצעות התניית תנאים בהיתר; וככל שנוצר מטרד של ממש, פתוחה בפני הנפגעים הדרך לפעול במישור דיני הנזיקין."
|
||||
1007-21,9b83c028-f38c-4e58-b894-02f25dd7ef8f,approved,approved,2,0.9,b80ed68b-e126-437a-9180-8be4300e4c1e,"מטרדים ואי-נוחות זמניים הנגרמים בתקופת ביצוע עבודות בנייה באזור מאוכלס הם תוצאה טבעית של הבנייה, ואין בהם כשלעצמם כדי למנוע את הבינוי המבוקש, ובלבד שייקבעו תנאי"
|
||||
1007-21,ce13aa43-98db-4120-83cd-84a7248edd81,approved,rejected,2,0.875,f10c7871-5d29-4114-8ace-55049f8a904a,"פגם בהליך שמיעת המתנגדים בפני הוועדה המקומית — ככל שנפל — ניתן לריפוי במסגרת דיון מעמיק שמקיימת ועדת הערר, אשר שומעת את טענות הצדדים בכתב ובעל פה, בוחנת את מדינ"
|
||||
1007-21,938afad1-7c41-4cc4-9219-fab9fee9154a,approved,rejected,2,0.825,68756f0a-09e3-4cd2-b9f7-d897020e6719,"בבחינת ההשפעה האדריכלית של מבנה מוצע על הסביבה והפגיעה בנצפות, אמת המידה היא האם המבנה נצפה מן המרחב הציבורי הסמוך; מבנה הבנוי בקרקע ומוסתר מאחורי גדר גבוהה ואט"
|
||||
1007-21,55aa37be-9d73-40e7-88ba-18bdc0064a77,approved,rejected,3,0.79,0a7fc277-dde6-433b-b6dd-d62f85a407e1,"היבטים קונסטרוקטיביים-הנדסיים של בקשה להיתר אינם מהווים בהכרח עילה לסירוב מצד מוסד התכנון, וניתן ליתן להם מענה מהותי במסגרת הליך הרישוי באמצעות התניית ההיתר בתנ"
|
||||
1007-21,0f5839b5-a87d-4888-9011-e05b6ee28e07,approved,approved,2,0.9,9538a838-0f6d-4a08-835e-67100a00811a,"טענות בעלות אופי מקצועי-הנדסי המועלות כנגד בקשה להיתר, ללא תמיכה בחוות דעת מקצועית, דינן להידחות; הנטל להוכחת טענות הנדסיות מוטל על הטוען ומחייב גיבוי בראיה מקצ"
|
||||
1007-21,c8160012-d5f0-4f95-81b8-fdaa09f42d52,approved,rejected,2,0.85,c03f95a4-90df-499d-95fc-ab9160e7ae93,"בנייה של בריכת שחייה שאינה מקורה מעבר לקווי הבניין אינה מהווה סטייה ניכרת, וזאת מכוח ההיתר המפורש שבתקנה 4(א)1(ה) לתקנות התכנון והבניה (סטיה ניכרת מתכנית), תשס"""
|
||||
1007-21,308852c3-563e-4355-812b-01641668b925,approved,rejected,1,0.8,e619a237-3b53-4259-a245-09ecb5f03525,"טענה לירידת ערך דירות עקב בנייה מבוקשת חייבת להיתמך בחוות דעת שמאית, ואין להעלותה כטענה בעלמא; קיימת אף עמדה הפוכה לפיה קיומן של בריכות שחייה מקנה לבניין תדמית "
|
||||
5826-11-24,be2755e9-c605-44c0-b92b-269a403c6bae,approved,rejected,3,0.8767,364f64dc-7151-4654-88c1-2c604557bf35,"אזכורים חיצוניים של פרסום תכנית (להבדיל מהפרסום הסטטוטורי עצמו) אין להם נפקות לעניין מועד כניסת התכנית לתוקף לצורך תביעת פיצויים לפי סעיף 197 לחוק, ואין בהם כדי"
|
||||
5826-11-24,30c7c7f9-e54b-4690-b1cd-bb6a1b608aa6,approved,approved,3,0.9333,ab3a2191-c5e7-479b-806d-0807c643deac,"תכנית מתאר היא בגדר חיקוק, ופרסומה הסטטוטורי יוצר ידיעה קונסטרוקטיבית בדבר תוכנה, לרבות עצם אישורה וכניסתה לתוקף; יש להבחין בין החובה הסטטוטורית לפרסם הודעה על "
|
||||
5826-11-24,72328591-e60e-4913-8518-d588b63a7783,approved,approved,3,0.91,ca420159-afe8-4efb-a3e0-5aa1f5499a49,"מועד הפרסום של תכנית באתר האינטרנט אינו משפיע על מניין התקופות הקבועות בחוק התכנון והבניה הנמנות ממועד הפרסום, וזאת מכוח סעיף 1ג(ב) לחוק."
|
||||
5826-11-24,17b855d3-d2eb-44c7-a58f-625e3f5d39fb,pending_review,approved,3,0.9233,f2d17cbc-a93a-4f97-a7fa-9491328ed923,"השינוי הנורמטיבי בהוראות החלות על המקרקעין מתגבש במועד הפרסום המקורי של התכנית בדבר אישורה, וממועד זה — ולא ממועד פרסום מאוחר יותר — קמה לבעלי המקרקעין עילת התב"
|
||||
5826-11-24,42e5838e-de72-4bc5-ac42-3909a462ef7e,pending_review,rejected,3,0.8067,7baa9f9a-5b38-4b12-8bbc-e1e58098a385,"קביעת הגורם המוסמך (הוועדה המחוזית) כי תיקון שנעשה בתכנית הוא בגדר ""תיקון טעות סופר"" ולא תיקון מהותי היא קביעה מחייבת שאין לקבל לגביה טענה סותרת; תיקון מהותי הי"
|
||||
5826-11-24,00d3cbf2-7fe7-4b7b-9d79-1f44813f4109,pending_review,rejected,3,0.8733,35b9e032-5b7e-4cfb-a880-32475ea82c3f,"מקום שהדין קובע הסדר התיישנות ייחודי שמניין תקופתו מתחיל ממועד הפרסום, גובר ההסדר הייחודי על ההסדר הכללי שבחוק ההתיישנות, ואין להחיל עליו את כללי ההשעיה הקבועים"
|
||||
5826-11-24,a222a45a-7464-48f5-a823-f5b58f26f49b,pending_review,rejected,3,0.8733,530fa7be-509f-44db-a2a5-c2283b645940,אין הוועדה המקומית מנועה מלטעון בפני ועדת הערר לאיחור בהגשת הערעור/התביעה אך מפני שלא העלתה את טענת האיחור בהזדמנות הראשונה.
|
||||
5826-11-24,9d4cbc72-edcd-4d85-b0cd-db6b10de3114,pending_review,rejected,3,0.9,407304b0-9302-48cb-bbba-c8453e8821b6,"טענה חדשה שלא הועלתה במסגרת ההליכים הקודמים בפני הערכאות הדנות אינה ניתנת להעלאה לראשונה בשלב הערעור, ודינה להידחות."
|
||||
5826-11-24,0ccdbc87-92e2-4c70-bb9b-d2c78059c64b,pending_review,approved,3,0.9267,c6e83d29-4458-4c65-bb04-f29be8564102,"תביעה לפיצויים בגין פגיעה במקרקעין בעקבות תכנית כפופה לתקופת התיישנות מיוחדת וקצרה בת שלוש שנים, שמניינה מתחיל בחלוף 15 ימים מן הפרסום האחרון בדבר אישור התכנית "
|
||||
5826-11-24,b3661d48-8a98-4049-a2f0-1220bc9269d3,pending_review,rejected,3,0.8933,5c73222e-0113-42fd-8600-f2e78415178b,"קביעת תקופת התיישנות מיוחדת בהסדר ספציפי (כגון תביעת פיצויים לפי סעיף 197 לחוק התכנון והבניה) אינה דוחה כשלעצמה את תחולתן השיורית של יתר הוראות חוק ההתיישנות, ו"
|
||||
5826-11-24,2a09741c-679a-4af1-ab2d-ae7434c1eb7e,approved,approved,3,0.9233,1c5869a5-fc74-4c9c-828f-99a125432e8f,"נקודת המוצא היא תחולתו של חוק ההתיישנות הכללי, אלא אם הסדר התיישנות ספציפי כולל הוראות — מפורשות או משתמעות — הסותרות את חוק ההתיישנות וגוברות עליו; הוראת דין מ"
|
||||
5826-11-24,ef072730-057c-4128-925a-a0a899820f19,approved,rejected,3,0.9,7f879f1b-191b-4164-977c-93e85caa0d5b,"הסדר ההתיישנות שבחוק התכנון והבניה ביחס לתביעה לפי סעיף 197 בגין ירידת ערך עקב פגיעה מתכנית אינו ממצה, ואין בו הוראה מפורשת או משתמעת הדוחה את תחולת חוק ההתיישנ"
|
||||
5826-11-24,6ac7edad-9cc3-49a1-9964-9bc9a55bb107,pending_review,rejected,3,0.8833,4a4b254c-afce-457d-a94e-3d26287ff66b,"מחדל בפרסום החלטה מנהלית המשליכה על זכויות הפרט נבחן לפי דוקטרינת הבטלות היחסית; כל עוד אי-הפרסום לא הסב נזק לנפגע, לא פגע ביכולתו להיערך ולא באינטרס ההסתמכות ש"
|
||||
5826-11-24,6a3546e5-9025-4e54-ad81-198aa668e1f6,pending_review,rejected,3,0.9,cd0e8d7e-e254-43db-a44d-3a04c168a391,"החריג הקבוע בסעיף 7 לחוק ההתיישנות מותנה בהוכחת התנהלות פסולה מצד הנתבע — מרמה או הטעייה ביודעין, קרי העלמה מכוונת של עובדות חיוניות שגרמו לתובע להימנע מהגשת תב"
|
||||
1132-09-24,f81ff53e-60ab-4383-a81a-a31e340106fb,approved,rejected,3,0.84,5c004eec-87de-4b8b-9cd9-1a75727ca36d,"בקשה להיתר לפי סעיף 151ב לחוק התכנון והבניה נבחנת תחת מסגרת משפטית שונה לחלוטין מזו של בקשה לשימוש חורג; משכך, הטענות והשיקולים שנשקלו בהליך קודם של שימוש חורג "
|
||||
1132-09-24,3d347c02-8be5-4f5b-8a73-31c560fc1fd2,approved,rejected,3,0.8067,baba6a04-cf8c-42ed-921e-3516d2144ccd,"תיקון החוק בעניין מעונות יום נועד להקל על הפעלת מעון ולצמצם את מעורבות הוועדה המקומית ואת מרחב שיקול דעתה: הוא קבע הליך מקוצר להגשת בקשה להיתר להפעלת מעון, צמצם"
|
||||
1132-09-24,8a65ab3b-f719-4e7f-87fe-103b83eb03a5,approved,approved,3,0.8867,cc7a479a-7c9f-4e04-9425-07dce4317c8c,הפעלת מעון יום הכולל עד 36 פעוטות מכוח סעיף 151ב לחוק התכנון והבניה מייתרת את הצורך בהגשת בקשה לשימוש חורג; ההיתר הנדרש מהוועדה המקומית לפי תיקון החוק אינו מוגד
|
||||
1132-09-24,80489480-7b44-4f8d-9df6-34c9eb3c8c9c,approved,rejected,3,0.8733,b7d0496a-1110-4ca7-97fc-ccd28b681085,"כאשר הוועדה המקומית מאשרת הפעלת מעון יום הכולל עד 36 פעוטות לפי תיקון החוק, השיקול היחיד שעליה להפעיל לגביו את שיקול דעתה הוא האם מתקיימת פגיעה מרחבית משמעותית "
|
||||
1132-09-24,8632f1ce-bae1-48c7-a528-39f12a0989b3,pending_review,approved,3,0.8833,69e10a96-ae26-4bf2-822b-768bf032fa14,"אישור לשימוש חורג ניתן כחריג ובצמצום, ולא כדבר שבשגרה — עיקרון מושרש בפסיקה החל על בקשות לשימוש חורג."
|
||||
1132-09-24,ae30db1c-7d35-425c-9c44-86bb3725c11e,pending_review,approved,3,0.8933,4870a4ea-e8f6-4b8c-bb46-519cc59c5002,"סמכותה ואחריותה של הוועדה המקומית בבחינת היתר למעון יום מתוחמת אך ורק לנושא הפגיעה המרחבית, ואין היא רשאית לשקול היבטים ואישורים המצויים בתחומי אחריותם של גורמי"
|
||||
1132-09-24,36ce2fca-bb3f-4782-ac73-e59e03fa8e1b,approved,approved,3,0.8867,39685b2f-4b8d-4b24-bdad-4f8230d56d83,צמצום שיקול הדעת של הוועדה המקומית בבחינת בקשה להיתר להפעלת מעון יום לפי סעיף 151ב לחוק התכנון והבניה אינו גורע מסמכותה — ואף מחובתה — לקבוע במסגרת החלטת האישור
|
||||
1132-09-24,9a167e1e-3dbf-4643-803a-ad8e0b63c2f9,approved,approved,3,0.8833,0b785592-390e-485c-8ed8-206614feff46,"על הוועדה המקומית לבחון את התמונה הכוללת בעת מתן היתר להפעלת מעון יום במבנה מגורים, ובכלל שיקוליה עליה להביא בחשבון את מספר ההיתרים שאישרה מכוח סעיף 151ב באותו "
|
||||
1132-09-24,8c1c74ea-9bdf-4f59-8d0e-0fc501357b40,pending_review,rejected,3,0.84,f3b86413-067e-4bb7-a545-9e74854ca206,"תיקון החוק שהסדיר הפעלת מעונות יום לפעוטות כשימוש מותר לפי סעיף 151ב לא נועד להקל בדרישות הרגולטוריות, אלא להבהיר את חלוקת הסמכויות בין הוועדה המקומית לבין הממו"
|
||||
1132-09-24,d023bc8d-741c-444a-9ad2-7e9a36de0427,pending_review,rejected,3,0.8733,efab3c7f-c497-43fc-99b4-018e0f438aed,"אין להשתמש בסעיף 151ב לחוק התכנון והבניה לשם אישור כמה היתרי מעונות יום באותו מבנה כאשר מספר הילדים המצטבר עולה על 36, שכן הדבר עוקף את מגבלת ההגדרה שבסעיף; בנס"
|
||||
1132-09-24,ed541bee-7fcc-49e5-a4e7-b625c8fce635,pending_review,rejected,3,0.86,3ca4972b-0ff6-4651-8cfe-4e9854c1f291,"תכנית המתירה הקמת מעונות יום במקרקעין המיועדים למגורים כשימוש תואם — שאינו כרוך בהליך של שימוש חורג — מהווה מסלול חלופי ועצמאי לאישור הפעלת מעון יום, ומסלול זה "
|
||||
1132-09-24,ae0cc20d-f5fa-495d-9893-dcc121143e9b,pending_review,rejected,2,0.79,6e923621-6c3e-44cd-93b5-f9d6157b1006,"תכליתו הכפולה של תיקון סעיף 151ב לחוק התכנון והבניה היא להקל על הקמת מעונות יום באזורי מגורים מחד, ולהתחשב בדיירי אותו מבנה והמבנים הסמוכים תוך מזעור הפגיעה בהם"
|
||||
1132-09-24,7677a7d4-b227-424a-a4af-38b71fe34ff2,pending_review,rejected,3,0.87,9be2597b-d850-40b8-9996-14a88d26aa40,"הסדרת מעון יום למספר ילדים העולה על 36 אינה נכללת בגדר ההליך שלפי סעיף 151ב לחוק התכנון והבניה, ומחייבת פנייה להליך נפרד — בדרך של שימוש חורג או היתר מכוח תכנית"
|
||||
8046-24,4475036c-6d74-4d3f-ae90-129d838a8c0e,approved,approved,2,0.9,5ae56796-54f8-4b89-aacc-cbfedbf96299,"מבקש פטור מהיטל השבחה (כגון פטור להרחבת דירת מגורים/ממ""ד) המבקש להגיש שומה נגדית, רשאי להעלות במסגרת הדיון טענות משפטיות בלבד ולא טענות שמאיות; משבחר במסלול הפט"
|
||||
8046-24,dc607590-7cb1-4e7b-9c4a-75f121d14ee4,approved,approved,2,0.9,4b53f214-64f7-4f91-af06-2c9779e0048e,תכלית הוראת הפטור מהיטל השבחה הקבועה בסעיף 19(ג) לתוספת השלישית לחוק התכנון והבניה הינה תכלית סוציאלית — סיוע לאזרחים בשיפור תנאי מגוריהם — ויש לפרש את הוראת הפ
|
||||
8046-24,a94713dc-8f32-4258-9ae0-5dfb4482d78a,approved,rejected,2,0.875,57cb5340-f04f-4c51-9220-1a9334fd60ad,"יש לפרש את ההטבות והפטורים מהיטל השבחה בפירוש מצמצם, שכן תכלית הסעיף המעניק את הפטור אינה להעשיר את הזוכה על חשבון רווחת קהילתו אלא אך לאפשר לו להרחיב את ביתו ג"
|
||||
8046-24,87a83ecb-2270-42b7-b2c5-312e3ddcdcf7,approved,approved,2,0.9,9af97b54-0722-406d-bb26-fe015a3d04db,"התנאים לקבלת פטור מהיטל השבחה בגין מתן הקלה לדירת מגורים שאינה עולה על 140 מ""ר הם ארבעה מצטברים: (א) שטח הדירה הכולל לאחר ההקלה אינו עולה על 140 מ""ר; (ב) הדירה "
|
||||
8046-24,80fb6d4b-9efe-4815-86a1-2aa3ce8d5fcb,approved,approved,2,0.9,70a0c2cc-609a-407d-8d3c-c7e91a52b889,תכלית הדרישה למגורים בנכס למשך 4 שנים כתנאי לפטור היא למנוע ניצול הפטור לצרכים מסחריים באמצעות העברת הנכס מיד לאחר קבלת הפטור.
|
||||
8046-24,147decd6-3733-4c68-9ae1-6c5191bdd160,approved,rejected,3,0.84,4f031fd8-2f1a-4674-bfb1-282c63e03113,לצורך הדחייה הקבועה בסעיף 19(ג)(1) לתוספת השלישית — לפיה בנייה או הרחבה של דירת מגורים לא ייראו כמימוש זכויות — אין דרישה כי המחזיק יתגורר בדירה בפועל בעת הגשת
|
||||
8046-24,9372ba55-3ba0-4ad3-a54d-5941dadc3a36,approved,rejected,3,0.8067,84608b64-2cad-49a8-9e35-4b62f0e62d14,"הפטור מתשלום היטל השבחה בגין ""בניה"" חל גם על בניה על קרקע שטרם נבנתה קודם לכן, ואינו מוגבל לתוספת בניה על מבנה קיים."
|
||||
8046-24,7edaf310-54b6-4368-b9fb-985f5e97153f,approved,approved,2,0.9,d7b012f4-7143-49be-847d-82bc87ac8a06,"החייב בהיטל השבחה הוא הבעלים במקרקעין, ולפיכך המונח ""המחזיק במקרקעין"" לעניין הפטור אינו כולל מי שאינו בעלים, כגון שוכר, והכל בכפוף להתקיימות יתר תנאי החוק."
|
||||
8046-24,1f1504e3-733b-46f7-9e74-3d6bb8d101a3,approved,rejected,2,0.9,2ae1388b-7cad-4808-930e-679382f020f0,"פטור מהיטל השבחה הניתן בעילת מגורים הוא פטור מותנה בלבד; אין בהענקתו במסגרת הליך הערר כדי לחתום את בחינת התנאים, והוועדה המקומית מוסמכת לבחון בהמשך את עמידת הני"
|
||||
1074-08-23,2871d27b-0fcf-4564-ae99-b07f1c117cd3,approved,approved,2,0.9,6550f009-ec6a-41d4-9ca1-3eaaeecd10f1,"אין מקום לאשר בנייה בשימוש חורג בשטח המיועד סטטוטורית לדרך, גם אם קיימת אפשרות עתידית לביטול ייעוד הדרך; כל עוד התכנית המבטלת לא אושרה ולא ניתן לדעת את היקפה, מ"
|
||||
1074-08-23,6260dc79-27bf-4e8a-987e-074161a225f9,pending_review,approved,2,0.9,3e69e7c0-80c8-4205-ba42-1c2f3aabfa5f,"בקרקע שייעודה דרך ניתן לעיתים לאשר שימושים רלוונטיים לייעוד הדרך, כגון חניות, אך לא ניתן לאשר שימושים אחרים בתחום הדרך."
|
||||
1074-08-23,6494cf0c-5400-43f5-a8df-8bc895fcee5e,pending_review,approved,2,0.9,7bd2d445-7651-46ba-8859-7eaca5874813,"אישור הקלה לבניית תוספת בנייה (כגון תוספת קומה) על מקרקעין המצויים בתחום המיועד לפי תכנית תקפה לדרך מהווה סטייה ניכרת מהוראות התכנית, משום שאינו מאפשר שימוש במק"
|
||||
1074-08-23,48c623bc-778c-4226-a392-06720cfba3d1,pending_review,rejected,0,0.0,2d967f23-12c4-45f3-92c3-ebf920713c27,"תכנון ""נקודתי"" הוא נחות באיכותו מתכנון הנשען על ראיית התמונה התכנונית המלאה, ובמיוחד כאשר מדובר בשיקולים הנוגעים לדרכים ולתנועה."
|
||||
1074-08-23,2f633931-36df-4eaa-8332-5ac34cd8deb9,approved,approved,3,0.8233,462284b6-a33d-4d78-bfd8-40e20f39634b,"המטלה לתכנון עירוני מוטלת על הוועדה המקומית, ואין זה ראוי להפנות את הציבור ליזום ולממן מכיסו תכנון נקודתי לשינוי ייעוד מקרקעין כתחליף למילוי חובת התכנון של הרשו"
|
||||
1074-08-23,42e235da-3712-43a4-96e6-d3f4301c3fc4,approved,approved,2,0.9,864b8ea1-19fc-4a50-87e8-459cf1c0de6a,"ועדת הערר אינה מוסמכת לקבוע לוועדה המקומית לוח זמנים מחייב לקידום תכנון, גם מקום שלגופו ראוי היה לעשות כן."
|
||||
7084/13,c0482eb1-ca6a-4601-91b4-8b4ed46735ce,pending_review,approved,3,0.9067,297c2e72-e96c-497d-ae7f-380269c6b97f,"פרשנותם של דיני המס נעשית על פי גישה מהותית, להבדיל מפרשנות דווקנית, וזאת כדי לחתור לצדק ולשוויון בהטלת המס ולהגשים את התכליות הכלכליות המונחות בבסיס ההסדר. גיש"
|
||||
7084/13,3d172e2b-5b7b-4e8d-8859-c6dd5aa11337,approved,approved,3,0.8733,e290be4e-3a18-40e3-8a3e-da74feec5141,"שיקולים של אחידות וודאות משפטית מחייבים החלת דין אחיד על חוזי פיתוח, כך שאותו דין יחול הן על חוזים הנחתמים עם רשות מקרקעי ישראל והן על חוזים הנחתמים עם רשויות מ"
|
||||
7084/13,1926e683-adbd-46f0-a498-835d689df8b3,approved,approved,3,0.8733,6d7c7689-3f4c-4f8f-9120-e63846a9bcaa,"יזם המתקשר בחוזה פיתוח עם רשות מקרקעי ישראל נחשב, בתקופת הפיתוח, כחוכר לדורות לעניין החבות בהיטל השבחה."
|
||||
1128-25,facd8c92-e52a-4c00-87ba-f9434723d40d,pending_review,approved,2,0.9,cbbe69dd-1887-4288-b0c5-179e812f4c11,"תוספת שטחי שירות לצורך התאמת נגישות, המאושרת מכוח סעיף 151(ב1) לחוק התכנון והבנייה, אינה נשללת בשל ניצול מלוא זכויות הבנייה הרגילות במגרש, שכן מדובר בשטחי שירות"
|
||||
1128-25,b381f09c-4c20-4116-b648-98bbb6589021,approved,rejected,0,0.0,f212d38d-b22b-4ee9-91d6-4846c732a7a3,"הקלה מקו בניין אינה זכות קנויה; הנטל על מבקש ההקלה להוכיח את הצדקתה, ולוועדה המקומית נתון שיקול דעת אם לאשרה."
|
||||
1128-25,8feff893-9f79-447d-8f65-7ac3a02bd018,pending_review,rejected,3,0.84,5b937090-1b77-4785-b536-c4475df3e0f4,"שטחים נוספים הדרושים לצורכי נגישות של בעל מוגבלות אינם בגדר סטייה ניכרת, ובהיעדר הוראת חוק האוסרת תוספתם אין לקרוא לחוק כוונה לשלול זכות שמטרתה הקלת הנגישות."
|
||||
1128-25,29344838-66e8-4414-b3f4-bc996a90e45e,pending_review,rejected,2,0.825,75df3a86-5f1c-4ea4-b9b8-ab67213c1e23,"בעל קניין נדרש לצפות כי על מקרקעיו או על מקרקעי שכניו יקודם תכנון המהווה תולדה של התפתחות טבעית של המרחב ושל צורך אובייקטיבי וסובייקטיבי המתגלה בו; ציפייה זו, ה"
|
||||
1128-25,df0047e8-c22b-4cb5-9764-8a02f7388e9b,pending_review,rejected,3,0.7433,d189dd0b-7b59-455e-b0b5-ea9da1119417,"בקשה להקלה בקו בניין לצורך בניית ממ""ד אינה בגדר בקשה חריגה או בלתי צפויה במציאות התכנונית בישראל, ועל כן שכן הטוען לפגיעה כתוצאה מהקלה מעין זו נדרש להביאה בחשבו"
|
||||
1128-25,1ded0e93-f197-43f1-b645-5b34b237b355,approved,approved,2,0.975,f53e7987-4a69-4c77-a0de-13f8215c591f,"ניתן לאשר הקלה בקווי הבניין הקבועים בתכנית לצורך בניית מרחב דירתי מוגן (ממ""ד), והקלה כאמור אינה מהווה סטייה ניכרת מתכנית כמשמעה בסעיף 151 לחוק התכנון והבניה ובת"
|
||||
1128-25,172c1582-89c4-46db-87ca-6a17df2b56f8,pending_review,rejected,0,0.0,6a62f264-04c7-4420-afdf-679b9537d86e,"בבחינת שיקול הדעת של מוסד התכנון בבואו לשקול מתן הקלה, יש לשקול מספר פרמטרים: קיומה של הצדקה תכנונית, עצימות ההקלה, מועד התכנון המאושר, והפגיעה או הרווח של צדדי"
|
||||
1128-25,5b0596e2-c408-40f7-ad87-0328f7068741,approved,rejected,0,0.0,7ccc0d83-4d99-4774-b9be-e649ba750f07,"בניית מרחב מוגן דירתי (ממ""ד) כתוספת לבניין קיים, גם בחריגה מקווי הבניין הקבועים בתכנית, אינה מהווה סטייה ניכרת מתכנית, ועל כן ניתן לאשר הקלה מקווי בניין לצורך ה"
|
||||
1128-25,f86c42a5-1890-41c8-b7ce-b540d6708719,pending_review,rejected,1,0.9,16f614f9-53a4-471b-bb6c-4b4fb8401181,"תוספת שטחי שירות לשם בניית ממ""ד, בשטח שאינו עולה על השטח שקבע שר הביטחון לפי חוק התגוננות אזרחית, אינה נחשבת לסטייה ניכרת מתכנית, ושטח זה מסווג כשטח שירות."
|
||||
1128-25,cd0074b6-40f2-40da-a82d-0a372f15c837,pending_review,rejected,2,0.825,ec3adf1a-a878-458f-be9a-5de75b52b477,"בבחינת בקשה להקלה לשם בניית ממ""ד, על מוסד התכנון לאזן בין ההצדקה התכנונית למתן ההקלה לצורכי מיגון לבין אי-הנוחות הנגרמת לבעלי מקרקעין סמוכים; מקום שבו התועלת הב"
|
||||
1128-25,7e843ea9-e327-442c-a68f-d6349f56fdca,approved,approved,2,0.9,9f6e9a92-29ce-457a-939a-c7df6a5972a7,"כאשר בקשה להיתר בנייה מוגשת לאחר שהבנייה כבר בוצעה בפועל, על מוסד התכנון לבחון את הבקשה גם באמצעות ""מבחן המגרש הריק"" — דהיינו האם הבקשה הייתה מאושרת אף בהתעלם מ"
|
||||
1128-25,3f42ba2b-deac-4ba4-8e54-b9044fd6dd15,pending_review,rejected,3,0.79,e5aab4bc-5c4f-43f3-8f96-9d824cd6ae5f,"מבחן המגרש הריק אינו עומד בפני עצמו ואין להעמידו כשיקול מכריע; על מוסד התכנון לשקול לצדו שיקולים עניינים נוספים, ובכללם נסיבות הבנייה, תום-לבו של מבקש ההיתר, עצ"
|
||||
1128-25,f54ac7bb-9cbe-4c14-8f1d-82dba9087829,pending_review,rejected,2,0.84,6282ec50-760a-478f-a607-0e60e6ad07df,"בבחינת תוכנית שמטרתה הכשרת בנייה שבוצעה שלא כדין, על רשויות התכנון לשקול לצד האינטרס של הגנה על שלטון החוק גם את השיקול התכנוני ""הצר""; אולם תוצאת איזון זה אינה "
|
||||
1128-25,4ce700e0-5465-49b6-9b44-82764f561624,approved,rejected,3,0.8067,f73925cd-a9ae-4423-b313-83e9aac153fa,"האינטרס של מניעת עבריינות בנייה והגנה על שלטון החוק הוא שיקול רלוונטי ובעל משקל בעת הדיון בבקשה להיתר לשימוש חורג, אך אין הוא חזות הכל; אין בו כדי לחייב דחייה ש"
|
||||
1128-25,2fcb242e-23aa-41d1-a208-7f4807546d74,approved,approved,2,0.9,b1ed9e13-a1a1-451b-8926-41b2094bfad8,"מבחן המגרש הריק קובע כי בנייה שבוצעה ללא היתר אינה אמורה להשפיע, לכאן או לכאן, על השאלה אם קיימת הצדקה תכנונית למתן הקלה; הבחינה התכנונית נעשית כאילו המגרש ריק "
|
||||
1128-25,6658dc48-d016-415c-9365-97a7a563ff1b,approved,rejected,2,0.875,3f00f9db-12a7-4f52-9963-d44039b952d4,"מבחן המגרש הריק אינו השיקול היחיד הרלוונטי בהכרעה אם ליתן היתר הכולל הקלה, ושיקול דעתם של מוסדות התכנון אינו מוגבל לו; בידיהם לשקול שיקולים תכנוניים נוספים, לרב"
|
||||
1128-25,97517886-3aa5-490b-9dde-197957862044,pending_review,approved,2,0.9,4e65b8f8-b5e2-41cc-8835-ebe4df01beec,"חשש ספקולטיבי מבנייה עתידית אפשרית במסגרת תכנית שטרם אושרה ואף טרם נוצרה אינו שיקול רלוונטי לבחינת בקשה להיתר נוכחית, והדבר נכון כלפי כל הצדדים."
|
||||
1128-25,7927c9dc-d352-4890-b51d-6a939b31c398,pending_review,rejected,2,0.875,f6546352-53db-414f-990e-b5d3021382e1,"הטוען נגד מיקום או היקף בנייה מבוקשים נושא בנטל לתמוך בטענתו בראיות מקצועיות; טענה המבוססת על הערכתו האישית של הטוען בלבד, ללא תמיכה מקצועית, אינה יכולה לגבור ע"
|
||||
1128-25,d52e43fe-8f7c-43e4-bc5b-8312c7449c8e,pending_review,rejected,1,0.9,45f35c40-aaff-452c-92c3-4a1187141207,"ועדת הערר לא תתערב בהחלטת הוועדה המקומית באשר למיקומו של מבנה (כגון ממ""ד) מקום בו ההחלטה התקבלה על ידי הוועדה המקומית כגורם מקצועי וחוות הדעת המקצועית התומכת בה"
|
||||
1128-25,289874b7-2513-4614-afb9-744888aee17d,pending_review,rejected,2,0.875,22e81f36-cf18-41c2-9454-25f1cd63eaee,"הריסת מבנה שאושר כדין היא סעד קיצוני הכפוף למבחן המידתיות; אף אם ניתן היה לאתר מיקום חלופי פחות פוגעני, אין בכך כשלעצמו כדי להצדיק ביטול ההחלטה המאשרת והריסה, מ"
|
||||
13541-02-24,e705c5c2-e3e9-4dfb-813e-a3f021e9b079,pending_review,approved,3,0.91,2c3c4d69-c778-4ba6-9b16-b955877f93db,"כל החלטה מנהלית של מוסד תכנון נתונה לביקורת שיפוטית על-פי עילות הביקורת המנהליות המוכרות, ובית המשפט יבחן אם נפל בהחלטה פגם של חריגה מסמכות, ניגוד עניינים, משוא"
|
||||
13541-02-24,fa90c4b1-a00e-445f-8053-36d7a7d5fafc,pending_review,approved,2,0.95,7c84a892-1678-44d0-9af1-6097e8ee22ab,בית המשפט בשבתו כערכאת ביקורת מנהלית אינו משמש כטריבונל תכנון ואינו ממיר את שיקול דעתו של מוסד התכנון בשיקול דעתו שלו; התערבות שיפוטית בליבת שיקול הדעת התכנוני
|
||||
13541-02-24,ba90ec05-5287-4704-8cf5-b03028eda9a5,pending_review,rejected,3,0.81,b7c67087-5809-45b7-8c26-ec2816516b88,"פרשנות הגדרת ""תחנה לתחבורה ציבורית"" וההוראות בדבר ""מתקני דרך"" ו""מבני דרך"" לפי חוק התכנון של תשתיות לאומיות פורסת את גדר השימושים הנלווים המותרים גם על שירותים ש"
|
||||
13541-02-24,40966584-26ab-4c66-8149-5c27992f8202,pending_review,approved,3,0.9067,0f688b28-9f6e-4410-babc-01af65bfb3e3,"רשות מינהלית רשאית, ככלל, לחזור בה, לתקן, לבטל או לשנות החלטות קודמות שקיבלה, כפי שנלמד גם מסעיף 15 לחוק הפרשנות; אולם שינוי כאמור אינו נעשה כדבר שבשגרה ועליו ל"
|
||||
13541-02-24,6c3ed5f4-97e0-4fcd-b6a0-29da278ab860,pending_review,rejected,3,0.8567,a85de3e1-d25f-4b89-b495-4cfc47c843f8,"הגמישות של רשות לשוב ולבחון את החלטותיה חלה ביתר שאת על רשויות תכנון, שכן אופי ההליך התכנוני — קיום ישיבות והתדיינויות עם גורמים מקצועיים בשלבים שונים, לרבות של"
|
||||
13541-02-24,d1fee5d9-53c2-4a89-b49b-885eb9fda98f,approved,rejected,3,0.8733,c3d3a151-209b-419f-800f-9633d19c4f73,"שימוש מסחרי נלווה (כגון חנות נוחות קטנה או עמדות טעינה חשמלית) הכפוף לשימוש הציבורי המרכזי שלשמו אושרה התכנית ובוצעה ההפקעה, אינו מאיין את תכלית ההפקעה ואינו מו"
|
||||
13541-02-24,dc69a786-cc6d-4c82-bafa-79608f10f36a,pending_review,rejected,3,0.8067,25525e8f-0723-4b28-a590-f575605599a4,העובדה שמוסד תכנון צמצם או שינה את היקף החלטתו בעקבות טענות שהועלו בשלב ההתנגדות אינה מלמדת כי המוסד סבר שנורמה תכנונית מסוימת חלה על התכנית; שינוי כזה עשוי לשק
|
||||
13541-02-24,b6397f1f-3f51-405e-a3ff-d5af0e7aefe3,pending_review,approved,3,0.9033,7d2924de-f703-4339-a3a9-53b81c823036,"תכנית מתאר ארצית אינה נכנסת לתוקף ואינה חלה כל עוד לא ניתן לה אישור ממשלה, ולפיכך אין להחיל את הוראותיה על תכנית עוד בטרם אושרה."
|
||||
13541-02-24,d72c4397-8350-4431-a55f-83c06e6ae15e,pending_review,approved,3,0.8933,0a6c4d04-cbfb-4192-949a-c42c9501c891,שיקול-העל של רשויות התכנון הוא הגשמת תכליות ציבוריות; אף שעליהן לתת דעתן גם להיבטים מסוימים של שיקולים כלכליים ומסחריים (כגון עלות פרויקטים ציבוריים ושימוש בכספ
|
||||
13541-02-24,c33b5c1b-b7e0-41a7-b0b6-3f2801033a7d,pending_review,rejected,3,0.8933,316dbdb3-aae1-4852-9a50-9a6e5811fe1d,"רשות ערר (ערעור-בזכות-מוגבל) על החלטת מוסד תכנון תינתן מקום שהעניין מעורר שאלה עקרונית מובהקת, השלכות רוחב בקנה מידה ארצי או רגישות ציבורית; טענות הנוגעות לנסיב"
|
||||
18432-10-24,411af537-f244-4345-add5-c69b0f00986f,pending_review,rejected,3,0.84,9956982e-8a6e-440d-895c-ed4c53549c0e,"במסגרת בחינת מידתיות הפגיעה התכנונית, הוראות הדוחות את מועד התממשות הפגיעה נושאות משקל מסוים אך אין בהן, כשלעצמן, כדי ליתן מענה מספק למכלול הפגיעה; על רשות התכנ"
|
||||
18432-10-24,96febea1-a4c9-4aa6-bb61-6a7f332f56cf,pending_review,rejected,3,0.8533,f7a120c1-7c38-451e-96fc-854d826b559a,"נורמה חקיקתית התוחמת את היקף הפגיעה התכנונית עשויה לשמש ככלי עזר בהתוויית שיקול הדעת התכנוני, גם כאשר אינה חלה במישרין על התכנית הנדונה מבחינת תחולתה בזמן."
|
||||
18432-10-24,a4c36f27-1c05-4c59-9450-ac337c9ad80f,pending_review,approved,3,0.9733,d8066957-ce21-4ed6-b335-eaf8b128a450,"בית המשפט אינו ממיר את שיקול דעתן של רשויות התכנון המוסמכות בשיקול דעתו, ואינו מתערב בהחלטותיהן אלא מקום שנפל בהן פגם משפטי — כגון חריגה מסמכות, פעולה בחוסר תום"
|
||||
18432-10-24,5027110d-8bac-4482-8de5-a30398847ac2,approved,approved,3,0.9333,998afac7-c23f-49e6-ba0d-a5e17bd38aa3,"ביקורתו השיפוטית של בית המשפט על החלטות מוסדות תכנון מוגבלת למבחן הסבירות; כל עוד ההחלטה מצויה במתחם הסבירות — היינו, היא אחת ההחלטות הסבירות שרשות מינהלית סביר"
|
||||
18432-10-24,80715846-06a0-4162-aafe-490483cc3720,approved,rejected,3,0.8833,9c3184c6-daf6-43d4-8a8f-e29a0ec31538,"ריסון ההתערבות השיפוטית במבחן הסבירות מתחזק ביתר שאת כאשר עסקינן בהחלטה של מוסד תכנון בכיר, כדוגמת ועדת ערר מחוזית או ועדה ארצית לתכנון ובנייה, נוכח מומחיותו ומ"
|
||||
18432-10-24,f6c22ed5-7ab0-4c9e-ba56-cc4caa42b0a7,approved,approved,3,0.9233,3759a727-a99b-4331-9a05-744dba1b2a49,"עקרון המידתיות חל על כל החלטה מינהלית, ואין הוא מצומצם להחלטות שעניינן נטילה כפויה של בעלות במקרקעין (הפקעה) בלבד."
|
||||
18432-10-24,89c18d4f-2eaa-4d7e-8115-2f5449b92bb0,pending_review,rejected,3,0.83,eb80e8bd-bad5-4665-bbf6-f61ba0fb0ec2,"במסגרת בחינת מידתיותה של פגיעה תכנונית, ניתן לשקול האם קיומו של סעד פיצוי בגין הפגיעה (כגון פיצוי בשל הפקעה או בשל פגיעה בשווי המקרקעין עקב אישור תכנית) מפחית א"
|
||||
18432-10-24,3b465b1b-1e55-409b-a4df-206a3a122d9f,pending_review,rejected,3,0.8767,fea7ef91-b09c-4963-9eda-3db11b99aef7,"תיקון מס' 7 לחוק הוותמ""ל, הקובע כי שטח משבצת שיוכרז כמתחם מועדף לדיור לא יעלה על 30% מכלל שטח המשבצת או 1,050 דונם לפי הנמוך, אינו חל רטרואקטיבית על תכנית שקדמה"
|
||||
18432-10-24,50c3b32c-40f7-4fd7-a9d5-b01a4394e0cb,pending_review,rejected,3,0.8733,6d517b51-883f-473c-b1a8-c35d141460a3,"הכרעה תכנונית בדבר היקף השטחים הנדרשים לייעוד מסוים (כגון פארק) או בדבר היקף הגריעה משטחים חקלאיים אינה נחתכת על פי מבחן כמותי-מספרי גרידא, אלא מחייבת עריכת איז"
|
||||
18432-10-24,31ea91b6-5361-443c-bb36-8a7147e300ed,approved,rejected,3,0.8833,383a0302-1051-4e8b-9ea8-3fc2ee351d67,"בבחינת מידתיות הפגיעה במקרקעין הנובעת מהחלטה תכנונית, אין בית המשפט בוחן אם הפתרון שנבחר הוא היחיד האפשרי, אלא אם מדובר בפתרון המאזן באופן הולם וראוי בין השיקול"
|
||||
18432-10-24,6cb6bb67-0bb6-4656-838a-e3c7f69b728a,pending_review,rejected,3,0.8733,7d49d19c-f2db-421d-a0e6-9216b8a94191,"מקום שתיקון חקיקתי הקובע אמת מידה כמותית לפגיעה אינו חל ישירות על התכנית, שאלת מידתיות היקף השטחים הנגרעים נבחנת על פי מכלול האינטרסים והשיקולים ולא על פי מבחן "
|
||||
18432-10-24,7ff1b610-a179-4e56-9b82-10a2c0a7aebd,pending_review,approved,3,0.9333,6ce13794-f8c6-4963-b186-cb2311380c05,"זכות הטיעון היא זכות יסוד הקמה לאזרח מקום שבו רשות מינהלית מבקשת לפגוע באחת מזכויותיו, ועל הרשות לאפשר לו להשמיע את עמדתו בטרם תכריע."
|
||||
18432-10-24,0c03c7df-becf-4995-a936-244de55c3cd4,approved,rejected,3,0.9,0fa1e979-b737-436f-878c-cc8f263ccbf5,"היקף זכות הטיעון והשימוע ומתכונתם אינם קבועים אלא נגזרים מהנסיבות הקונקרטיות של העניין; ככל שההחלטה המינהלית צפויה לפגוע בזכות חשובה יותר ובאופן חמור יותר, כך מ"
|
||||
18432-10-24,50024881-39b0-4b84-af21-330881cc9d3a,pending_review,approved,3,0.9067,8000ff94-755b-4659-820f-0d082a430cc1,"ההזדמנות להשמיע טענות בפני הרשות חייבת להיות נאותה, ובכלל זה על הרשות להעמיד לרשות האזרח פרק זמן הולם המאפשר לו להתכונן לשימוע כראוי, לברר את הסוגיות, לאתר מסמכ"
|
||||
18432-10-24,41541938-8fc8-43ce-90e4-ff587276ef00,pending_review,rejected,3,0.8233,a99cba8c-287c-4634-8f2f-d18b73c7a59d,"תקופת התראה קצרה יחסית לפני דיון בהתנגדויות אינה מהווה כשלעצמה פגיעה בזכות הטיעון, מקום שאין מדובר בשמיעה מחדש אלא בדיון ממוקד בתיקון ספציפי, וניתנה לבעל הדין ה"
|
||||
18432-10-24,e4b6de9f-52b5-43a5-8f25-5d70f2c3e86c,pending_review,rejected,0,0.0,3e8b51e7-3368-4ef3-905a-6672a6ee82f9,"קיום דיון לשמיעת התנגדויות באמצעות היוועדות חזותית (אפליקציית זום) אינו מהווה פגם, שכן זו דרך מקובלת לקיים דיונים."
|
||||
18432-10-24,edcf3824-adad-420b-8ef2-b54caaf75dea,pending_review,rejected,3,0.8933,41017d1c-326e-4bda-9c39-3c7809548566,ועדת תכנון אינה מוסמכת לכלול במסמכי התכנית הוראות הסכמיות; תכנית סטטוטורית והסכם בין הצדדים (כגון הסכם חילופי שטחים) הם מסגרות משפטיות נפרדות הפועלות במישורים ש
|
||||
18432-10-24,de13cfc3-a986-4152-811c-98544a8ddc66,pending_review,rejected,3,0.9033,100e0f3d-c341-4d81-9dbf-7c9e5630a3c5,"מוסד תכנון אינו מוסמך לייעד שטח ל""תכנון בעתיד"" מבלי לקבוע לו ייעוד תכנוני, ולו ברמה המתארית הכללית; הותרת שטח ללא כל התייחסות לייעודו חורגת מסמכות התכנון."
|
||||
18007-01-24,6074c027-f8dc-4e0c-ac38-cf3dd35173a5,approved,approved,3,0.9233,6f92fd14-da22-4049-999a-7652f0e3008a,"זכויות בנייה מכוח התכנון הקיים במגרש, שטרם נוצלו, אינן נמנות עם סל הזכויות של תמ""א 38; משכך, ניצולן — גם כאשר הוא נעשה במאוחד עם ניצול זכויות מכוח תמ""א 38 במסגר"
|
||||
18007-01-24,d42398db-4082-49dc-bea3-56fa77d12c09,pending_review,approved,3,0.8733,b0d00313-6809-460d-bb35-11aaff0e2a4a,"כאשר הוראת תכנית (תמ""א 38) מבקשת לראות זכויות קיימות כאילו ניתנו מכוחה, היא עושה זאת באופן מפורש; היעדר לשון מקבילה של 'אימוץ' בהוראה אחרת אינו לאקונה אלא בחירה"
|
||||
18007-01-24,a79ddb20-e209-4056-8a10-19e3bbd1dc98,pending_review,approved,2,0.875,b116f4d1-7b71-4c2d-9fdb-ba9e8a942323,"במימוש פרויקט בנייה מכוח תמ""א 38 יש להבחין בין שלוש דרגות של זכויות: (1) זכויות ישירות שמעניקה תמ""א 38 עצמה; (2) זכויות מכוח התכנון הקיים שתמ""א 38 מאמצת במפורש "
|
||||
18007-01-24,b797674c-4b91-4278-ad36-b3cea851c89e,pending_review,approved,3,0.8933,b0de6706-8244-498a-92f9-b2917274d3eb,"היטל השבחה נשען על עקרון חיוב הנישום בגין התעשרות הנובעת מאקט תכנוני; אף שזכויות מכוח תמ""א 38 מקנות התעשרות שעקרונית מצדיקה חיוב בהיטל, המחוקק קבע לגביהן פטור מ"
|
||||
|
43
data/halacha_night_check.sh
Executable file
43
data/halacha_night_check.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
# One-shot morning verdict for the halacha night drain (scheduled 2026-06-15 04:30 UTC
|
||||
# via chaim's crontab; throwaway — lives under data/, not tracked in scripts/).
|
||||
# Captures whether last night's run (with the PR #251 fix: durable rate-limit
|
||||
# detection + 05:00–07:00 catch-up window) actually drained the backlog.
|
||||
# Baseline at install time (2026-06-14 13:xx IDT): pending=96 done=248 halachot=4099.
|
||||
set -u
|
||||
export HOME=/home/chaim
|
||||
REPO=/home/chaim/legal-ai
|
||||
PY="$REPO/mcp-server/.venv/bin/python"
|
||||
OUT="$REPO/data/logs/halacha_night_report_$(TZ=Asia/Jerusalem date +%Y%m%d).md"
|
||||
SUP_LOG=/home/chaim/.pm2/logs/legal-halacha-supervisor-out.log
|
||||
DRAIN_ERR=/home/chaim/.pm2/logs/legal-halacha-drain-error.log
|
||||
mkdir -p "$REPO/data/logs"
|
||||
|
||||
{
|
||||
echo "# דוח-בוקר: ריצת-הלכות הלילה — $(TZ=Asia/Jerusalem date '+%Y-%m-%d %H:%M %Z')"
|
||||
echo
|
||||
echo "בסיס-השוואה (אתמול 13:xx IDT): pending=96 · done=248 · halachot=4099"
|
||||
echo
|
||||
echo '## מצב נוכחי (supervisor status)'
|
||||
echo '```'
|
||||
cd "$REPO" && "$PY" scripts/halacha_drain_supervisor.py status 2>&1
|
||||
echo '```'
|
||||
echo
|
||||
echo '## פעולות המתזמר ב-12 השעות האחרונות (modes/actions)'
|
||||
echo '```'
|
||||
grep -E 'מצב:|פעולה:|catch-up|rate-limit|נעצר' "$SUP_LOG" 2>/dev/null | tail -40
|
||||
echo '```'
|
||||
echo
|
||||
echo '## אותות rate-limit בלוג-הדריינר (24ש אחרונות בלוג)'
|
||||
echo '```'
|
||||
echo "429 hits (tail 4000): $(tail -4000 "$DRAIN_ERR" 2>/dev/null | grep -c '429')"
|
||||
echo "session-limit msgs: $(tail -4000 "$DRAIN_ERR" 2>/dev/null | grep -c 'hit your session limit')"
|
||||
echo "extraction_failed: $(tail -4000 "$DRAIN_ERR" 2>/dev/null | grep -c 'extraction_failed')"
|
||||
echo "hold-stopped (fix A): $(grep -c 'hold-stopped' "$SUP_LOG" 2>/dev/null)"
|
||||
echo "catch-up opened (B): $(grep -c 'catch-up בוקר' "$SUP_LOG" 2>/dev/null)"
|
||||
echo '```'
|
||||
echo
|
||||
echo "_(נוצר ע\"י data/halacha_night_check.sh; ניתן למחוק את שורת ה-crontab של 15.6.)_"
|
||||
} > "$OUT" 2>&1
|
||||
|
||||
echo "report written: $OUT"
|
||||
@@ -480,11 +480,38 @@ Conclusion → Rule → Explanation → Application → Conclusion.
|
||||
|
||||
## 3. כללי גזירת פרמטרים
|
||||
|
||||
פרמטרי העיבוד נגזרים ממאפייני התוכן, לא נקבעים שרירותית:
|
||||
פרמטרי העיבוד נגזרים ממאפייני התוכן, לא נקבעים שרירותית.
|
||||
|
||||
### Temperature — נגזר מסוג הייצור
|
||||
> **⚠️ עדכון מנגנון-הייצור (#204 / WS5).** מסלול-הייצור הוא `claude_session.query` →
|
||||
> `claude -p` (מנוי claude.ai, עלות-שולית-אפס, מקומי-בלבד — ראה
|
||||
> `reference_claude_generation_path`). ב-**Opus 4.7/4.8 הפרמטר `temperature` (וגם
|
||||
> `top_p`/`top_k`) הוסר — שליחתו מחזירה HTTP 400**. הידית היחידה היא **`effort`**
|
||||
> (low/medium/high/xhigh/max; ברירת-מחדל high). **המודל נעוץ ל-`claude-opus-4-8`
|
||||
> לכל הבלוקים** ב-`block_writer.GENERATION_MODEL` — אין עוד פיצול sonnet/opus.
|
||||
> טבלת ה-Temperature והעמודה `decision_blocks.temperature` הן **מטא-דאטה-מת
|
||||
> (deprecated, תמיד 0)** ונשמרות רק לתאימות-עמודה; אל תקראו מהן. הטבלאות למטה
|
||||
> נשמרות כתיעוד-המקור-הקונספטואלי בלבד — `effort` מחליף את "Thinking budget".
|
||||
|
||||
| Generation type | Temperature | נימוק |
|
||||
### Effort — נגזר ממורכבות קוגניטיבית (הידית החיה)
|
||||
|
||||
מיפוי ה-`effort` בפועל ב-`block_writer.BLOCK_CONFIG` (#204):
|
||||
|
||||
| בלוק | gen_type | effort | נימוק |
|
||||
|------|----------|--------|-------|
|
||||
| ה (פתיחה) | paraphrase | medium | פתיחה קצרה, מבנה קבוע |
|
||||
| ו (רקע) | reproduction | medium | שעתוק ניטרלי מרובה-מקורות |
|
||||
| ז (טענות) | paraphrase | high | קיבוץ/סינתזת-טענות לפי-נושא |
|
||||
| ח (הליכים) | reproduction | medium | תיעוד כרונולוגי |
|
||||
| ט (תכניות) | guided-synthesis | high | ציטוט-תכניות מדויק (INV-AH) |
|
||||
| י (דיון) | rhetorical-construction | xhigh | חשיבה רב-שלבית CREAC (מחוץ-לתחום-WS5) |
|
||||
| יא (סיכום) | paraphrase | high | סינתזה אופרטיבית |
|
||||
| א–ד, יב | template-fill | — (script) | מילוי-שדות, ללא LLM |
|
||||
|
||||
### Temperature — (DEPRECATED) נגזר היסטורית מסוג הייצור
|
||||
|
||||
> מסמך-מקור בלבד — לא נשלח ל-API (ראה האזהרה למעלה).
|
||||
|
||||
| Generation type | Temperature (היסטורי) | נימוק |
|
||||
|----------------|-------------|-------|
|
||||
| template-fill | 0 | אין צורך בשפה — מילוי שדות |
|
||||
| reproduction | 0 | נאמנות מוחלטת למקור. אפס יצירתיות |
|
||||
@@ -493,18 +520,11 @@ Conclusion → Rule → Explanation → Application → Conclusion.
|
||||
| analytical-reasoning | 0.3-0.4 | צריך ליצור קשרים בין עקרונות משפטיים |
|
||||
| rhetorical-construction | 0.4-0.5 | טווח ביטוי רחב לכתיבה משכנעת ואלגנטית |
|
||||
|
||||
### Thinking budget — נגזר ממורכבות קוגניטיבית
|
||||
### Model — (DEPRECATED) נגזר היסטורית מדרישת דיוק
|
||||
|
||||
| Cognitive task | Budget | נימוק |
|
||||
|---------------|--------|-------|
|
||||
| template-fill / lookup | off | אין צורך בחשיבה |
|
||||
| sequential-extraction | low | חילוץ מידע חד-שלבי |
|
||||
| multi-source-integration | medium | צריך להצליב מקורות |
|
||||
| legal-analysis-with-CREAC | max (16K+) | חשיבה רב-שלבית: מסקנה → כלל → הסבר → יישום |
|
||||
> כעת נעוץ `claude-opus-4-8` לכל בלוקי-ה-AI (`GENERATION_MODEL`). הטבלה היסטורית.
|
||||
|
||||
### Model — נגזר מדרישת דיוק
|
||||
|
||||
| Accuracy profile | Model | נימוק |
|
||||
| Accuracy profile | Model (היסטורי) | נימוק |
|
||||
|-----------------|-------|-------|
|
||||
| factual-precision | sonnet | מהיר, מדויק לחילוץ עובדות |
|
||||
| precision + interpretation | opus | נדרש לפרשנות תכנית / ציטוט מובנה |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# טביעת אצבע של הקול — ניתוח הקורפוס המלא של דפנה
|
||||
|
||||
מסמך מטא-סגנון מבוסס על קריאה עמוקה של 23 החלטות 1xxx + 10 החלטות 8xxx/9xxx. מטרתו: לזקק את ה**קבועים** האמיתיים של דפנה, מעבר לפרטי תיק או סוג ערר, באופן שניתן להזריק ל-system prompt של `legal-writer`.
|
||||
מסמך מטא-סגנון מבוסס על קריאה עמוקה של 23 החלטות 1xxx + 10 החלטות 8xxx/9xxx, ומתוקף בעיגון-מדידה על קורפוס מורחב (56 החלטות, 2,670 דוגמאות-בלוק). מטרתו: לזקק את ה**קבועים** האמיתיים של דפנה, מעבר לפרטי תיק או סוג ערר, באופן שניתן להזריק ל-system prompt של `legal-writer`.
|
||||
|
||||
## רכיבי הקול — שישה מסמכים משלימים
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
מתוך ה-24 1xxx, 23 קבצים בעלי content מספיק נותחו. רובם מתפלגים בין 2,000-8,500 מילים בבלוק י.
|
||||
|
||||
**הסקה משולבת**: עכשיו הקורפוס מאוזן יותר (24 1xxx, 22 8xxx, 2 9xxx). הדפוסים שמתחת מבוססים על המכלול.
|
||||
**גרסה 3 — עיגון-מדידה על 56 החלטות / 2,670 דוגמאות-בלוק** (אצווה אחרונה, 2026-06-28): שימשה לאימות יחסי-המבנה ולחידוד דפוסי-קול מיקרו (ראו 1.11–1.13, 2.2). הדפוסים שמתחת מבוססים על המכלול.
|
||||
|
||||
---
|
||||
|
||||
@@ -68,12 +68,15 @@
|
||||
|
||||
**עיקרון**: אין פועל "אנחנו" שמשמש כקישור סתמי. כל אחד נושא תפקיד אינטלקטואלי. **לא להשתמש ב"נחדד" כפתיחת פסקה אם אין חידוד אמיתי.**
|
||||
|
||||
**חידוד (מעוגן בקורפוס-56): קבלה-מותנה כפועל-"אנחנו".** דפנה אורזת קבלת טענת-צד בפעלי-מקבל ערכיים, לא ב"הטענה מתקבלת": `מקובל עלינו הסבר [הגורם]`, `סביר ואף מעבר לכך`. אלה אינם רישום אדמיניסטרטיבי אלא הכרעה ערכית בקול-המכריע — שמרי על ההבחנה בין רישום (`נציין`) להכרעה (`מקובל עלינו`).
|
||||
|
||||
### 1.3 דפוס "אישור-לפני-דחייה" (אכן... אולם)
|
||||
מופיע ב-8/10. במקרים של דחיית טענה משמעותית, דפנה תמיד **מאשרת את הטענה בנקודה הכי גבוהה שלה** ואז מסבירה למה לא מכריעה. הביטויים החליפיים:
|
||||
- `אכן [טענה אמיתית]... אולם [למה לא מכריע]`
|
||||
- `אכן צדק [צד]... יחד עם זאת...`
|
||||
- `יש ממש בטענת [צד]... אך מאידך...`
|
||||
- `דא עקא [תפנית]`
|
||||
- **`ראשית, צודק [צד] כי [נקודה תקפה]... אלא ש[המשך]`** *(וריאציה מעוגנת בקורפוס-56: פתיחת פסקת-הכרעה במתן-צדק מפורש לצד לפני התפנית)*
|
||||
|
||||
**חריגים**: רק במקרים של דחיית סף קצרה ומובהקת, או כשאין טענה ראויה לאישור, דפנה מדלגת על הדפוס. ב-8/10 היא משתמשת בו לפחות פעם.
|
||||
|
||||
@@ -88,6 +91,8 @@
|
||||
### 1.5 ציטוטים מלאים, לא תמציות
|
||||
כשמובא תקדים — מובא במלואו (לפעמים פסקאות שלמות), עם ההפניה הסטנדרטית `(פורסם בנבו)` או `[נבו]` ותאריך. **לא** תמצית, **לא** "כפי שנקבע" בלי ציטוט. ב-9/10 ציטוטים בני 4-15 שורות.
|
||||
|
||||
**חידוד (מעוגן בקורפוס-56): אנוטציית-הדגשה אחרי ציטוט.** כשדפנה מדגישה חלק מציטוט מובא, היא חותמת בסוגריים: `(הדגשת הח"מ)` / `(הדגשה שלי)` / `(ההדגשה אינה במקור)`. זהו רכיב-קול קבוע — ההדגשה לעולם אינה שקטה; היא מסומנת במפורש כמעשה של הכותב.
|
||||
|
||||
### 1.6 הצמדה לטקסט החוק
|
||||
כשמדובר בסעיף חוק רלוונטי — דפנה מצטטת אותו במלואו (לפעמים את כל סעיפי המשנה הרלוונטיים, גם אם רק אחד נדון). דוגמאות: סעיף 100 ב-1130, סעיף 197 ב-קרקעות ירושלים, סעיף 19(ג) ב-גמר בניה.
|
||||
|
||||
@@ -103,6 +108,8 @@
|
||||
- `נקודת העוגן למסקנתנו זו היא המלצת הגורם המקצועי בוועדה` (1130)
|
||||
- `ההיקף המדויק... ייקבעו על ידי מהנדס הוועדה המקומית` (1130)
|
||||
|
||||
**חידוד מהותי לסגנון-ההסתייגות (מעוגן בקורפוס-56): הדחייה למומחה תחומה, לא מוחלטת.** דפנה מנסחת במפורש את **גבול** הריסון: הריסון חל על המישור המקצועי-שמאי בלבד, ואילו במישור המשפטי/פרשני "אין לשמאי המכריע יתרון על פני ועדת הערר". זהו מהלך-קול קבוע — היא קודם בונה את הריסון ואז חורצת בו חלון משפטי שבו היא חופשייה להכריע. הסוכן חייב לתחום כל פסקת-ריסון בהבחנה זו ולא להציג ריסון גורף.
|
||||
|
||||
### 1.9 "למעלה מן הצורך" כסגירת חלון לערעור
|
||||
ב-7/10 אחרי הכרעה משפטית עיקרית, דפנה מוסיפה טיעון חלופי:
|
||||
- `למעלה מן הצורך נוסיף כי גם אם היינו מקבלים את פרשנות העורר... התוצאה הייתה זהה` (1130)
|
||||
@@ -111,6 +118,8 @@
|
||||
|
||||
זה לא ייתור — זה הגנה אסטרטגית מפני ערעור.
|
||||
|
||||
**דפוס-תאום הפוך (מעוגן בקורפוס-56): "ניתן היה לסיים כאן... אלא ש".** היכן שעילה פשוטה הספיקה לסיום הדיון, דפנה מודה בכך במפורש (`על כן, ניתן היה לסיים את הדיון במצב דברים זה`) ורק אז ממשיכה — בדרך-כלל מפני שצד העלה טענה חדשה המחייבת מענה (`אלא ש... ולכן אדרש לכך`). זה ההיפוך של "למעלה מן הצורך": שם היא מוסיפה כדי לחסום ערעור; כאן היא מתעדת שהמשך-הדיון נכפה עליה, ולא נבע מצורך הכרעתי. שני המהלכים משרתים את אותה תכלית — שקיפות מלאה כלפי ערכאת-הביקורת העתידית.
|
||||
|
||||
### 1.10 פורמט הסיום
|
||||
3 רכיבים קבועים, בסדר זה:
|
||||
|
||||
@@ -121,6 +130,24 @@
|
||||
3. תאריך + "ניתנה פה אחד"
|
||||
```
|
||||
|
||||
### 1.11 עיגון כמותי — קבוע חוצה-סוגים (קודם תועד ל-1xxx בלבד; הורחב מקורפוס-56)
|
||||
דפנה מעגנת קביעות במספרים ספציפיים גם בתיקי 8xxx/9xxx, לא רק ב-1xxx: שיעורי הפקעה (`38.6%` מול `30%`), פערי-שטח (`כ-105 מ"ר` מול `97 מ"ר` → `הפרש של כ-7 מ"ר בלבד`), יחסי-הגדלה (`פי 1.9 בלבד ולא פי 3`), מספרי-יחידות (`הוכפל מ-16 ל-32`). הפונקציה הסגנונית קבועה: המספר **ממסגר מחדש** טענה רטורית של צד ומקטין אותה (`לא 45 מ"ר... אלא כ-7 מ"ר`). **עיקרון לסוכן**: כשצד טוען בעוצמה איכותית, דפנה משיבה בעיגון כמותי שמכווץ את הטענה למימדה האמיתי.
|
||||
|
||||
### 1.12 יחסי-מבנה מדודים (קורפוס-56, n=55, ממוצע-כלל)
|
||||
פרופורציות הבלוקים בהחלטה טיפוסית, כיחס-מהסך:
|
||||
|
||||
| בלוק | יחס |
|
||||
|------|-----|
|
||||
| רקע (background) | ~17% |
|
||||
| טענות (claims) | ~27% |
|
||||
| **דיון והכרעה (discussion)** | **~42%** |
|
||||
| סיכום (summary) | ~14% |
|
||||
|
||||
**עיקרון לסוכן**: הדיון הוא הבלוק הדומיננטי (כ-2/5 מההחלטה) — אך לא בולע אותה. טענות-הצדדים מקבלות נפח מהותי (~רבע), ולא נדחסות. אם טיוטה מקצה לדיון פחות משליש או לטענות פחות מחמישית — היא חורגת מהפרופורציה האופיינית.
|
||||
|
||||
### 1.13 רינדור נאמן של הלוגיקה הפנימית של טענת-צד
|
||||
כשדפנה מביאה טענת-צד, היא משחזרת את **מבנה-ההיסק** שלה כנרטיב רציף — כולל מהלכי קל-וחומר (`מכך יש להסיק מקל וחומר לענייננו`), אבחון-תקדים (`אבחנו את עניינם מההלכות ב...`, `ההבדל מהותי`), והיסק-תכלית. היא אינה משטחת את הטיעון ל"הצד טוען X" אלא מוסרת את הדרך שבה הצד **הגיע** ל-X. זה תקף לטענות שתידחינה לא פחות מאלה שתתקבלנה — נאמנות-הרינדור אינה תלוית-תוצאה.
|
||||
|
||||
---
|
||||
|
||||
## 2. המשתנים — לפי סוג תיק וסוג תוצאה
|
||||
@@ -158,6 +185,10 @@
|
||||
"7. שמאי מכריע ... [ציטוט מלא של פסקאות 7-8 או חלק מהן]"
|
||||
```
|
||||
|
||||
**מבנה פנימי קבוע של פסקת-הריסון (חידוד מעוגן בקורפוס-56):** הניסוח אינו עמדה גורפת אלא **מטוטלת דו-צדדית** — קודם מתי הוועדה *תאמץ* את השמאי (שיטה מקובלת + מסד עובדתי הולם, *גם אם קיימות גישות מקצועיות שונות*), ואז, בסימטריה, מתי היא *תתערב* (מסד עובדתי בלתי הולם / הנחות בלתי הגיוניות / היעדר הסבר מניח-את-הדעת / תשתית משפטית חסרה או שגויה / פגם היורד לשורש המעשה המינהלי — ניגוד עניינים, משוא פנים, חוסר תום לב). הסוכן יבנה את שתי הזרועות, לא רק את זרוע-הריסון.
|
||||
|
||||
**חיתום ההבחנה המשפטית (מעוגן):** פסקת-הריסון נסגרת תמיד בהבחנה בין המישור השמאי-מקצועי (ריסון) למישור המשפטי-פרשני (אין-ריסון; ראו 1.8). זו אינה הערת-אגב אלא חלק מהתבנית הקבועה.
|
||||
|
||||
**לסוכן ב-8xxx**: לכלול את הציטוט הזה בפתיחה אלא אם התיק לא נוגע להכרעה שמאית.
|
||||
|
||||
### 2.3 פתיח פילוסופי לתיקי 1xxx (תכנון)
|
||||
@@ -215,6 +246,19 @@
|
||||
### 3.7 ❌ אסור: עדיף "העורר טוען ש..." על "טענת העורר היא..."
|
||||
דפנה משתמשת בפעלים פעילים: `העורר טוען`, `המשיבה טוענת`, `מבקשי התכנית מבקשים`. **לא** "טענות העורר היו ש..." (פסיביזציה).
|
||||
|
||||
**קטלוג פעלי-רינדור-צד מורחב (מעוגן בקורפוס-56):** דפנה מגוונת את פועל-הרינדור לפי תפקיד-המהלך של הצד, ולעולם אינה חוזרת על "טוען" באופן מונוטוני:
|
||||
|
||||
| פועל | תפקיד-המהלך |
|
||||
|------|-------------|
|
||||
| **מסביר / מפרט** | פריסת נימוק טכני או עובדתי שלב-אחר-שלב |
|
||||
| **מדגיש / שם דגש על** | הצבת מרכז-הכובד של הטיעון |
|
||||
| **מנמק / מבסס את טענתו בכך ש** | קישור טענה לעוגן |
|
||||
| **מוסיף** | חיזוק-אגב לטיעון הראשי |
|
||||
| **אבחן (את עניינו מ-)** | הבחנת תקדים שמנגד |
|
||||
| **ביקש להסתמך על / מפנה ל** | גיוס תקדים תומך |
|
||||
|
||||
הבחירה אינה דקורטיבית — הפועל מתעד *מה הצד עושה* בטיעון, לא רק שהוא מחזיק בו.
|
||||
|
||||
---
|
||||
|
||||
## 4. תבניות מועתקות (Copy-Paste Templates)
|
||||
@@ -249,6 +293,12 @@
|
||||
|
||||
[ציטוט מלא של 5-15 שורות מפסקאות 7-8]
|
||||
|
||||
<מטוטלת: מתי תאמץ הוועדה (שיטה מקובלת + מסד הולם, גם אם יש
|
||||
גישות שונות) — ומתי תתערב (מסד בלתי הולם / הנחות לא הגיוניות /
|
||||
היעדר הסבר / תשתית משפטית שגויה / פגם בשורש המעשה המינהלי)>.
|
||||
נחדד כי הריסון חל במישור השמאי-המקצועי; במישור המשפטי-הפרשני
|
||||
אין לשמאי יתרון על פני ועדת הערר.
|
||||
|
||||
ברוח הדברים לעיל נבחן את טענות הצדדים;
|
||||
```
|
||||
|
||||
@@ -284,6 +334,13 @@
|
||||
ניתנה פה אחד, <תאריך עברי>, <תאריך לועזי>.
|
||||
```
|
||||
|
||||
### 4.8 פסקת "ניתן היה לסיים — אלא ש" (מעוגן בקורפוס-56)
|
||||
```
|
||||
<יישום העילה הפשוטה על העובדות>. על כן, ניתן היה לסיים את
|
||||
הדיון במצב דברים זה ולקבוע כי <תוצאה פשוטה>. אלא ש<הטענה
|
||||
החדשה/הנוספת שנכפתה עלינו> ולפיכך נדרש להוסיף ולהתייחס אליה;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. הוראות אופרטיביות לסוכן הכותב
|
||||
@@ -294,19 +351,22 @@
|
||||
1. **מהי התוצאה הצפויה?** דחייה / קבלה / חלקית?
|
||||
2. **מהו המתח / האיזון בלב התיק?** נסח אותו במשפט אחד — זה הולך לפתיחה (אם מוד B/C/E).
|
||||
3. **איזה מוד פתיחה מתאים?** A/B/C/D/E (ראה טבלה 2.1)
|
||||
4. **האם זה תיק 8xxx עם הכרעה שמאית?** אם כן → לכלול ציטוט בר"מ 3644/13.
|
||||
4. **האם זה תיק 8xxx עם הכרעה שמאית?** אם כן → לכלול ציטוט בר"מ 3644/13 + מטוטלת דו-צדדית + הבחנת מישור-משפטי (2.2).
|
||||
5. **האם דפנה הכריעה בתיק קשור?** אם כן → search_decisions ולכלול הפנייה / הבחנה (ראה sec 11.2 ב-voice-1130-25).
|
||||
6. **מה האורך הצפוי לפי משקל בהכרעה?** (ראה 2.4)
|
||||
7. **האם יש טענת-צד איכותית-רטורית?** אם כן → הכן עיגון כמותי שממסגר אותה מחדש (1.11).
|
||||
|
||||
### 5.2 בכתיבה — איך לבנות פסקה
|
||||
1. שימוש מודע ב"אנחנו" — בחירת פועל לפי תפקיד (טבלה 1.2)
|
||||
2. כל טענה משמעותית → פסקה מלאה. לא דחייה במשפט.
|
||||
3. אם דוחים טענה → "אכן [נקודה תקפה]... אולם [למה לא מכריע]"
|
||||
4. ציטוטים → במלואם, לא תמציות
|
||||
3. אם דוחים טענה → "אכן [נקודה תקפה]... אולם [למה לא מכריע]" (או "ראשית, צודק [צד]... אלא ש")
|
||||
4. ציטוטים → במלואם, לא תמציות; הדגשה תמיד חתומה ב"(הדגשת הח"מ)"
|
||||
5. סעיפי חוק → במלואם
|
||||
6. "למעלה מן הצורך" → לטיעונים מרכזיים
|
||||
7. דחייה למומחים → לסוגיות תכנוניות-טכניות
|
||||
8. **ללא רשימות ממוספרות** באנליזה
|
||||
6. "למעלה מן הצורך" → לטיעונים מרכזיים; "ניתן היה לסיים... אלא ש" → כשטענה נכפתה אחרי עילה מספקת
|
||||
7. דחייה למומחים → לסוגיות תכנוניות-טכניות, **תמיד תחומה למישור המקצועי** (1.8)
|
||||
8. רינדור-צד → שחזר את מבנה-ההיסק, גוון את פועל-הרינדור (1.13, 3.7)
|
||||
9. עיגון כמותי → המר טענות איכותיות למספרים שמכווצים אותן (1.11)
|
||||
10. **ללא רשימות ממוספרות** באנליזה
|
||||
|
||||
### 5.3 חיפוש תקדימים אישיים
|
||||
לפני כתיבה — `search_decisions` בקטגוריה זהה. אם יש תקדים של דפנה עצמה — חובה להפנות אליו ב-3 מודים אפשריים:
|
||||
@@ -321,6 +381,8 @@
|
||||
- [ ] אין דחיית טענה במשפט אחד
|
||||
- [ ] אין רטוריקה דרמטית של הצדדים בקול ההכרעה
|
||||
- [ ] אין תוצאה הכל-או-לא-כלום בתיק עם טענות מהותיות משני הצדדים
|
||||
- [ ] פסקת-ריסון-שמאי תחומה למישור המקצועי (לא גורפת)
|
||||
- [ ] הדיון לא חורג מטה מ-~⅓ מההחלטה, וטענות לא נדחסות מתחת ל-~⅕ (1.12)
|
||||
|
||||
---
|
||||
|
||||
@@ -362,6 +424,10 @@
|
||||
| **שוב על מנת שלא לצאת בחסר** | להוצאת ערך נוסף |
|
||||
| **בשולי הדברים** | להבעת הסתייגות בעדינות |
|
||||
| **מצאנו להוסיף כי...** | תוספת חופשית |
|
||||
| **מקובל עלינו (הסבר/עמדת)** | קבלת עמדה ערכית *(קורפוס-56)* |
|
||||
| **לא מצאנו מקום להתערב** | אישרור הכרעת-מומחה *(קורפוס-56)* |
|
||||
| **ראוי לציין כי** | הצבת הסתייגות/הבחנה *(קורפוס-56)* |
|
||||
| **יש להבחין בין... לבין** | תיחום גבול-ריסון/הבחנה *(קורפוס-56)* |
|
||||
|
||||
### 6.5 ביטויים מסורתיים שאומצו (כל אחד מקבל ציטוט מקורי)
|
||||
- **"כבדהו וחשדהו"** — לכלי השימוש החורג (מקור: עע"מ 109/12 גבעת האירוסים)
|
||||
@@ -372,7 +438,7 @@
|
||||
- **"בלשון המעטה"** — להסתייגות מנומסת
|
||||
- **"בנדון דנא"** — נוסח מליצי לקדם דיון
|
||||
- **"דא עקא"** — לתפנית בטיעון
|
||||
- **"ודוק"** — להבהרה / reductio ad absurdum
|
||||
- **"ודוק"** — להבהרה / reductio ad absurdum (מופיע גם בלב רינדור-טענה, להדגשת נקודה קריטית בתוך הצגת עמדת-צד)
|
||||
- **"ברי כי..."** — קביעה משכנעת
|
||||
- **"ללמדך כי..."** — מסקנה מציטוט
|
||||
|
||||
@@ -397,7 +463,7 @@
|
||||
**1015-24** נכתב בגוף ראשון יחיד ("אינני סבור", "לדעתי") — דעת מיעוט / חבר ועדה אחר. **לא לחקות.**
|
||||
|
||||
### 6.10 מצב הרשתות — סטטיסטיקה
|
||||
- **24 תיקי 1xxx** + **22 תיקי 8xxx** + **2 תיקי 9xxx** = 48 בקורפוס
|
||||
- **24 תיקי 1xxx** + **22 תיקי 8xxx** + **2 תיקי 9xxx** = 48 בקורפוס המנותח (וכן 56 החלטות / 2,670 דוגמאות-בלוק באצוות-המדידה האחרונה)
|
||||
- **~30 תקדמים חיצוניים** ש**דפנה מצטטת באופן עקבי** (ראה precedent-network.md)
|
||||
- **~15 תקדמים אישיים** שלה עצמה — מהווים את הקאנון האישי שלה
|
||||
|
||||
@@ -430,7 +496,7 @@
|
||||
כשמבקש שימוש חורג גם מקדם תכנית — דפנה מנתחת: האם השימוש המבוקש **תואם** את התכנון העתידי (→ גשר לגיטימי, כמו בכוכבה תורן)? או **סותר** (→ סטייה כפולה)? מסגרת ניתוח שלמה (249 מילים) שלא הייתה בטיוטה.
|
||||
|
||||
### ה. עיגון כמותי
|
||||
דפנה מוסיפה נתונים מספריים ספציפיים: "4,404.98 מ"ר לכלל היישוב vs 1,425 מ"ר מבוקש — 32%". המספרים מעגנים את ההחלטה במציאות ומקשים על ערעור.
|
||||
דפנה מוסיפה נתונים מספריים ספציפיים: "4,404.98 מ"ר לכלל היישוב vs 1,425 מ"ר מבוקש — 32%". המספרים מעגנים את ההחלטה במציאות ומקשים על ערעור. *(אומת כקבוע חוצה-סוגים בקורפוס-56 — ראו 1.11.)*
|
||||
|
||||
### ו. כותרות שטוחות (Heading 2 בלבד)
|
||||
דפנה השתמשה ב-Heading 2 לכל הסעיפים, כולל תת-נושאים בדיון. **אין Heading 3**. כל סעיף עומד בפני עצמו.
|
||||
@@ -459,13 +525,13 @@
|
||||
|
||||
---
|
||||
|
||||
## 7. הצעד הבא — הזרקת הקול ל-`legal-writer`
|
||||
## 8. הצעד הבא — הזרקת הקול ל-`legal-writer`
|
||||
|
||||
מסמך זה (יחד עם voice-1130-25.md) הוא הבסיס. הצעד הבא: לעדכן את ה-system prompt של `legal-writer` (ראה `~/.claude/agents/legal-writer.md` או `mcp-server/.../get_style_guide`) כך שיכלול:
|
||||
|
||||
1. הקבועים מסעיף 1
|
||||
1. הקבועים מסעיף 1 (כולל 1.11–1.13)
|
||||
2. ההוראות האופרטיביות מסעיף 5
|
||||
3. תבניות העתקה מסעיף 4
|
||||
3. תבניות העתקה מסעיף 4 (כולל 4.8)
|
||||
4. אנטי-דפוסים מסעיף 3
|
||||
5. הפנייה לטבלת מודי הפתיחה (2.1)
|
||||
|
||||
|
||||
@@ -79,3 +79,44 @@
|
||||
מקיים: INV-G10/INV-LRN1 (שער-יו"ר על מקרי-גבול), INV-AH (עיגון-מקור בחילוץ), INV-G2
|
||||
(מודל-הצבעות מקור-יחיד ל-B+C), INV-G9 (audit-trail להצבעות + לסינון), INV-G6 (רענון-embedding).
|
||||
מודל-הצבעות-היו"ר משתלב ב-active-learning הקיים (`halacha_panel_rounds`, [[project_active_learning_panel]]).
|
||||
|
||||
---
|
||||
|
||||
## 8. שכבת-החשיבות (TaskMaster #153) — חוסם את מסה-ה-cull
|
||||
|
||||
**הרקע (אבחון-ייצור 2026-06-20):** 49% מהעקרונות החיים (1,751/3,562) מקורם בפס"ד שדפנה
|
||||
ציטטה או שמופיע ביומון. דירוג-קונצנזוס לבדו (A) עיוור-לחשיבות ועלול לקבור את ההלכה
|
||||
שדפנה הסתמכה עליה. לכן **לפני מסה-cull** בונים שכבת-חשיבות שמגנה על הזהב ברמת-העיקרון.
|
||||
|
||||
### 8.1 שלוש דרגות-חשיבות (לפי *מי* מצטט/מסמן)
|
||||
| דרגה | סיגנל | מקור | התנהגות בסינון |
|
||||
|------|-------|------|----------------|
|
||||
| **1 — זהב** | דפנה ציטטה / יומון | `precedent_internal_citations` (source.chair_name='דפנה תמיר') · `digests` | **פטור-מגן**: שורד תמיד |
|
||||
| **2 — הסתמכות-שיפוטית** | יו"ר-אחר ציטט | `precedent_internal_citations` (source.chair_name≠דפנה) | משקל-חשיבות גבוה (לא מגן) |
|
||||
| **3 — מרכזיות** | ציטוט כללי/צד · instance_count · treatment | citator · `/graph` PageRank | משקל-בסיס |
|
||||
|
||||
(אין טבלת bookmarks — היו עוגני-DOCX, לא רלוונטי.)
|
||||
|
||||
### 8.2 זיהוי-זהב ברמת-עיקרון (לא ברמת-פסק — קריטי)
|
||||
דפנה מצטטת פס"ד בשביל **הלכה אחת** ממנו, לא כל ~19 העקרונות. לכן:
|
||||
- **gold_chair:** מטמיעים את `match_context` (טקסט סביב הציטוט, מאוכלס 100%) → cosine מול
|
||||
עקרונות הפס"ד-המצוטט → ההתאמה-הטובה ≥ סף (~0.78) מקבלת `gold_chair`.
|
||||
- **gold_digest:** מטמיעים `digests.headline_holding` → התאמה לעקרונות הפס"ד-המקושר.
|
||||
- כל התאמה שומרת מקור-הזהב + ציון-התאמה (G9). **חובה להריץ את מחלץ-הציטוטים גם על ~45
|
||||
ההחלטות של יו"רים-אחרים** כדי לאכלס דרגה 2 (כיום רק 398 ציטוטי-דפנה חולצו).
|
||||
|
||||
### 8.3 importance_score רציף (לדירוג + RAG)
|
||||
`halachot.importance_score`∈[0,1] = משוקלל: דרגה-1 ≫ דרגה-2 ≫ דרגה-3 + סמכות
|
||||
(עליון 1.0/מחוזי 0.7/ועדה 0.4) − penalty(overruled). `importance_signals` jsonb (שקיפות).
|
||||
משקלים ב-config, ניתני-כיול-יו"ר.
|
||||
|
||||
### 8.4 שילוב בסינון (הכרעת chaim: כל-הזהב + עד-5-לא-זהב)
|
||||
זהב(דרגה-1) → מוגן, שורד ללא תקרה (gold+0-votes→pending_review, כי התאמה עלולה
|
||||
false-positive). לא-זהב → דירוג `(importance_score, votes, score)`, שומרים עד 5. כלומר
|
||||
החלטה עם 7 הלכות-זהב תשמור 7+; עם 0 זהב תשמור עד 5.
|
||||
|
||||
### 8.5 RAG (הרווח הגדול) + רענון
|
||||
`importance_score` מבוסט באחזור (`search_precedent_library`/halacha) → הלכות-דפנה+סמכותיות
|
||||
צפות ראשונות בכתיבה. job רענון תקופתי (יומון/החלטה חדשים → re-match), כמו `corroboration_rebuild`.
|
||||
|
||||
> **סדר-ביצוע:** 8 (שכבת-חשיבות) → 3+4 (cull-מוגן) → 5 (סינתזה על הניצולים).
|
||||
|
||||
@@ -275,3 +275,40 @@ WARN [plugin] issue.comment.created event missing issueId in payload, skipping
|
||||
- **תוקן בצד שלנו** (PR #2, נפרס דרך `npm run build` + `pm2 restart paperclip` — הפלאגין נטען מ-`/home/chaim/plugin-legal-ai` לפי `package_path`).
|
||||
- **לקח כללי**: ל-events של הפלאגין — מזהה-הישות-הראשית הוא תמיד `event.entityId`; אל תניח ששדות נמצאים ב-`payload` בלי לאמת מול ה-`.d.ts` של ה-SDK או מול לוג חי.
|
||||
- TaskMaster: `legal-ai` #149.
|
||||
|
||||
---
|
||||
|
||||
## 7. `agents.invoke({prompt})` — הפרומפט נבלע; רק `payload.issueId` נמסר
|
||||
|
||||
**התסמין (מנקודת-מבט היו"ר):** כותבים הוראה לסוכן — והוא "מתעלם". ההרצה נראית תקינה
|
||||
לחלוטין: `status=succeeded`, `exit_code=0`, בלי שגיאה, ואפילו עולה כסף. הסוכן מדווח
|
||||
"כל התורים ריקים — אין עבודה".
|
||||
|
||||
**הסיבה:** `ctx.agents.invoke(agentId, companyId, {prompt, reason})` הוא ה-API **המתועד**
|
||||
של ה-Plugin SDK ("*Invoke an agent with a prompt payload*"), ו-`prompt` הוא שדה חובה.
|
||||
Paperclip מקבל אותו, שומר אותו ב-`agent_wakeup_requests.payload.prompt` — **וה-runner קורא
|
||||
רק `payload.issueId`**. הפרומפט לא מגיע למודל. ה-`reason` כן שורד (ל-`context_snapshot.wakeReason`),
|
||||
ולכן זה נראה כאילו משהו נמסר.
|
||||
|
||||
מדידה ב-DB (2026-07-16): **18 מתוך 18** ה-wakeups שאי-פעם נשאו `payload.prompt` לא הגיעו
|
||||
לאף הרצה — 0% מסירה. מול 107,172 wakeups עם `issueId` שעובדים. אימות ישיר: בלוג-ההרצה
|
||||
שנבלעה אין ולו אזכור אחד של מספר-התיק, והמודל פותח ב-*"This heartbeat has no scoped wake payload"*.
|
||||
|
||||
**מה עושים במקום:** נושאים את ההוראה על **issue**, לא ב-payload — issue-ילד שכבר משויך
|
||||
ל-CEO, עם ההוראה ב-`description`, ואז wakeup עם `payload.issueId`. זה בדיוק
|
||||
`open_ceo_run` ב-[`web/paperclip_client.py`](../web/paperclip_client.py), והמסלול היחיד
|
||||
שאומת כמגיע לסוכן.
|
||||
|
||||
**מלכודות שנלוות לזה — אל תיפול בהן שוב:**
|
||||
- **`issues.create` של ה-SDK עם `assigneeAgentId` *לא* מעיר את הסוכן.** ה-REST המקביל
|
||||
(`POST /api/issues/:id/children`) *כן* — הוא פולט wakeup `issue_assigned`. אל תכליל
|
||||
מהתנהגות REST על ה-SDK; זה נבדק ונמצא שונה.
|
||||
- **`ctx.issues.requestWakeup` (ה-primitive הנכון ב-SDK) נכשל מתוך scheduled job** עם
|
||||
`missing, expired, or unknown invocation scope` — למרות ש-capability `issues.wakeup`
|
||||
מוצהר ומותקן. אותה שגיאה מפילה גם `companies.list` / `issues.list` / `issues.listComments`
|
||||
בתוך ה-sweep, ולכן **רשת-הביטחון `route-pending-comments` אינה אמינה**. לא נחקר לעומק —
|
||||
לכן ניתוב-ההערות הועבר ל-backend של legal-ai (REST), שאינו חשוף לבעיה.
|
||||
|
||||
**סטטוס:** נעקף — `POST /api/cases/{case}/agents/comment` ו-`/agents/interaction-response`
|
||||
פותחים הרצת-CEO ישירות (REST) ומסמנים את ההערה כמנותבת, כדי שה-sweep השבור לא יירה
|
||||
הרצת-סרק. TaskMaster `legal-ai` #228.
|
||||
|
||||
103
docs/precedent-corpus-redesign/00-final-synthesis.md
Normal file
103
docs/precedent-corpus-redesign/00-final-synthesis.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# 00 — סינתזה סופית — קורפוס-הפסיקה
|
||||
|
||||
> מאחדת 01–06 + מבחן-אמת על 3 תיקים + nli-audit + **הכרעת-חיים הסופית** (§3): אפס-תור, אמינות=אזכור.
|
||||
> אילוץ-העל: **אפס-ביקורת-אנושית — מוחלט.**
|
||||
|
||||
## 1. שתי שכבות — לא לבלבל
|
||||
```text
|
||||
שכבת-רקע = כל החילוץ הגולמי. אוטומטי, אין תור/שער/cap. נותן recall, מדורג-נמוך.
|
||||
שכבת-מאומת = רק מה שיו"ר ציטף בפועל בהקשר. הסיגנל היחיד לאמינות. גדל לפי אזכורים.
|
||||
```
|
||||
(ההבחנה הישנה "רמה A=מה-לשמור / רמה B=מה-לצוף" התמזגה לכאן: לא שומרים/חותכים — **שומרים-הכל** כרקע,
|
||||
והאזכור מקדם ל-trusted.)
|
||||
|
||||
## 2. ⚠️ מבחן-האמת ששינה את ההחלטה (8508-03-24) — שתי הרצות
|
||||
תיק היטל-השבחה (יו"ר אחר) שמפיק 70 עקרונות. הרצנו **שני משטרים** על אותם 70:
|
||||
|
||||
```text
|
||||
אגרסיבי (פאנל + cap/novelty): 70 → 3 ✗ אודיט-אובדן: ~22 עקרונות אמיתיים אבדו,
|
||||
כולל הלכת לוסטרניק (ליבת חישוב היטל-השבחה!),
|
||||
קשר-סיבתי, סף-פוטנציאל, כל המסד הפרוצדורלי (14/נטלים/ריבית)
|
||||
מזוקק ("שמור-בספק", רעש בלבד): 70 → 70 ✓ "כולם בני-ציטוט; אין רעש-אמיתי; זוגות-קרובים
|
||||
מוסיפים נדבך". כל עקרוני-הליבה נשמרו.
|
||||
```
|
||||
- **השורש לקריסת-האגרסיבי:** החילוץ שאל "איזה דין *חדש* יצרה הוועדה" (~3) — אבל RAG-לכתיבה צריך
|
||||
"אילו עקרונות *בני-ציטוט שימושיים*" (~כל ה-70), **כולל יישומי-דוקטרינה-מוכרת**. מסנן "רק-חדש/בלי-יישומים"
|
||||
סינן בדיוק את מה שהכותב צריך.
|
||||
|
||||
**האסימטריה המכריעה:**
|
||||
```text
|
||||
לחתוך → סיכון לאבד את הליבה (לוסטרניק), בלתי-הפיך בפועל ← עלות עצומה
|
||||
לשמור → עולה כמעט-כלום; הרעש/הכפילויות שוקעים בדירוג ← עלות אפסית
|
||||
```
|
||||
**אישוש על 3 תיקים (אגרסיבי מול מזוקק):**
|
||||
```text
|
||||
תיק יו"ר קיים אגרסיבי אבדו-אמיתיים רעש מזוקק
|
||||
8508-03-24 ברק שוורץ 70 → 3 ~22 16 → 70
|
||||
1049-06-21 יריב אבן חיים 43 → 1 ~27 15 → 43
|
||||
1200-12-25 דפנה תמיר 35 → 3 ~30 2 → 35
|
||||
```
|
||||
**מסקנה (מחקר + 3 תיקים = 4 ראיות בלתי-תלויות):** **לא לחתוך בכלל.** האגרסיבי הרסני בעקביות (גם על
|
||||
החלטת-דפנה-עצמה). הרעש קטן (16→15→2) — "יותר מדי הלכות" היתה אבחנה-שגויה; הבעיה = **תור-אישור +
|
||||
היעדר-דירוג**, לא עודף-זבל. מתקנים את שניהם, והעקרונות בלתי-מזיקים (שוקעים בדירוג, נשמרים לאחזור).
|
||||
|
||||
## 3. ההחלטה (סופית — הכרעת-חיים 2026-06-20: "אמינות=אזכור, אפס-תור")
|
||||
|
||||
### עמוד 1 — שתי שכבות מובחנות
|
||||
```text
|
||||
שכבת-רקע (לא-מאומת) = כל החילוץ הגולמי (5,489). אוטומטי לחלוטין. אין תור, אין שער, אין cap.
|
||||
שכבת-מאומת (trusted) = רק עיקרון שיו"ר ציטט בפועל, בהקשר שבו הביא אותו. גדל לפי אזכורים בלבד.
|
||||
```
|
||||
|
||||
### עמוד 2 — ⛔ ביטול-מוחלט של תור-ההלכות
|
||||
**אין `pending_review`. אין קריאת-רשומות. אין אישור-ידני. אף פעם.** החילוץ פשוט קורה (אוטומטי),
|
||||
והפלט יושב כשכבת-רקע. ה-2,402 הממתינות → מבוטלות. **מאומת אף פעם לא בא מאישור — רק מאזכור.**
|
||||
> דגלי-האיכות **לא משמשים כשער** — אומת ש-`nli_unsupported`=**97% false-positive** (29/30); ה"רעש"
|
||||
> שהתור כביכול תפס היה מדומה. הדגלים, אם בכלל, סיגנל-דירוג-משני בלבד.
|
||||
|
||||
### עמוד 3 — שכבת-המאומת = קאנון-אוטומטי מאזכורים
|
||||
"מאומת" = `precedent_internal_citations` + **`match_context`** (ההקשר שבו היו"ר הביא את העיקרון).
|
||||
נבנית **אוטומטית** מכל החלטה שיו"ר כותב — כל אזכור מוסיף עיקרון-מאומת-בהקשר. זהו **בדיוק** הקאנון-הידני
|
||||
([daphna-precedent-network](daphna-precedent-network.md)), אך נבנה-מעצמו. **בינתיים מעט מאומתים — וזה בסדר**
|
||||
(8508 = 0 אזכורים → 0 מאומתים). גדל עם השימוש (active-learning, INV-LRN).
|
||||
|
||||
### עמוד 4 — אחזור: מאומת ≫ רקע
|
||||
דירוג ב-RRF: **מאומת (אזכור-יו"ר-בהקשר) צף ראשון**; שכבת-הרקע נותנת recall ומדורגת-מתחת לפי
|
||||
importance (דפנה≫יו"ר-אחר≫סמכות). שום עיקרון לא נמחק; הרקע פשוט שוקע. (לוסטרניק נשמר ברקע, וצף
|
||||
ל-trusted ברגע שדפנה תצטט אותו.)
|
||||
|
||||
### עמוד 5 — V41 canonical: לעקוף
|
||||
100% תקוע + בנוי-על-אישור (סותר אפס-תור) → האחזור מדרג ישירות על `halachot`. V41 נדחה (הפיך).
|
||||
|
||||
## 4. תיקוני-תשתית (תנאי-מקדים)
|
||||
- חוזה-קליטה חיצוני: 87% בלי practice_area → חילוץ-אוטומטי/`searchable=false` (G1).
|
||||
- לצופף גרף-ציטוטים: citator על כל 363 (לא רק 42 של דפנה).
|
||||
- להטמיע פסיקת-קאנון-חסרה (חוף-השרון, הרמלין) דרך X13.
|
||||
|
||||
## 5. אבולוציית-ההחלטה
|
||||
| שלב | עמדה |
|
||||
|---|---|
|
||||
| זמנית | פאנל + cap-5 במקור |
|
||||
| אחרי 8508/1049/1200 | לא-לחתוך; cap הרסני (איבד לוסטרניק ב-3 תיקים, גם של דפנה) |
|
||||
| אחרי nli-audit | דגלי-איכות לא-אמינים (97% FP) — לא שער ולא מסנן |
|
||||
| **הכרעת-חיים (סופי)** | **ביטול-תור מוחלט; "מאומת"=אזכור-יו"ר-בהקשר בלבד; גדל לפי אזכורים; מעט-מאומתים-בינתיים תקין** |
|
||||
|
||||
## 6. תוכנית-ביצוע (סדר)
|
||||
1. **לבטל את תור-ההלכות** — להסיר `pending_review` כשער; חילוץ→שכבת-רקע אוטומטית (אפס-אדם).
|
||||
2. **שכבת-מאומת מאזכורים** — לבנות מ-`precedent_internal_citations`+`match_context`; job שמעדכן בכל החלטה חדשה (גם להריץ citator על 91 הוועדות שטרם חולצו → להעשיר מאומתים).
|
||||
3. **אחזור: מאומת ≫ רקע** — boost ב-RRF (האחזור).
|
||||
4. **תיקון-חוזה-קליטה** (practice_area) — היגיינת-מקור.
|
||||
5. **רוויזיית-PR#304** — לבטל cap+novelty (הרסניים). הפאנל/דגלים לכל-היותר סיגנל-דירוג.
|
||||
6. (נדחה) V41/conformal/הטמעת-קאנון-חסר.
|
||||
|
||||
## 7. סטטוס-מימוש (2026-06-20)
|
||||
| צעד | סטטוס |
|
||||
|---|---|
|
||||
| 5 — ביטול cap/novelty | ✅ `HALACHA_PANEL_REGIME_ENABLED=false` (חזרה לחילוץ-עשיר-לרקע) |
|
||||
| 1 — ביטול תור | ✅ `HALACHA_NO_REVIEW_QUEUE=true` (auto-approve הכל) + migration 2,416→0 pending |
|
||||
| 2 — שכבת-מאומת | ✅ `verified`/`cite_count` + `db.refresh_verified_layer` + `build_verified_layer.py`; **2,775 מאומתים / 137 פס"ד** |
|
||||
| 3 — אחזור מאומת≫רקע | ✅ boost ב-2 שאילתות-האחזור (`HALACHA_VERIFIED_BOOST`); אומת חי (מאומתים צפים) |
|
||||
| 4 — חוזה-קליטה | ✅ going-forward מחווט (ingest queues metadata); 206 הוזנו ל-drain + `backfill_practice_area.py` (backfill חסום-מכסה זמנית) |
|
||||
| 6 — V41/conformal/קאנון-חסר | נדחה (כמתוכנן) |
|
||||
|
||||
429 בדיקות ירוקות (אפס רגרסיות). **שינוי-UI (הסרת תור-ההלכות מ-/precedents) → דרך שער Claude Design.**
|
||||
92
docs/precedent-corpus-redesign/00-index.md
Normal file
92
docs/precedent-corpus-redesign/00-index.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# אינדקס: עיצוב-מחדש קורפוס-הפסיקה — כל החומר במקום אחד
|
||||
|
||||
> **שער-הכניסה היחיד** ליוזמת עיצוב-מחדש קורפוס-הפסיקה. מרכז את כל הקלטים — אלה שבתיקייה
|
||||
> ואלה החיצוניים (לא הוזזו כדי לא לשבור 10+ קישורים מסוכנים/ספים/קוד; מקושרים מכאן).
|
||||
> **היעד:** מ-`00`–`05` → סינתזה סופית אחת (`00-final-synthesis` כשנגיע) → תוכנית-ביצוע.
|
||||
>
|
||||
> **שאלת-העל של חיים:** "הקורפוס נבנה לא נכון, אני כל הזמן מתעסק בתיקונים — לבנות מחדש או לתקן?"
|
||||
> **אילוץ-יסוד:** הפתרון **אסור** שידרוש סקירה/אישור ידני של עשרות-מאות הלכות.
|
||||
|
||||
---
|
||||
|
||||
## א. קלטי-היוזמה (בתיקייה זו)
|
||||
|
||||
| # | מסמך | מה תורם | מחבר/מקור |
|
||||
|---|------|---------|-----------|
|
||||
| 01 | [architecture-data-audit](01-claude-architecture-data-audit.md) | **אבחון-מצב חי:** הסכמה תקינה, הכשל בשכבת-הביצוע — חוזה-קליטה רופף (66% בלי practice_area), V41 אינרטי (0 published), כפילות style_corpus. ממליץ "תקן-חוזה ואז re-derive". | Claude (סשן אחר) |
|
||||
| 02 | [deep-research-importance-recommendation](02-deep-research-importance-recommendation.md) | **דוח-מחקר + המלצה:** אל-תחתוך הרסני; דרג-בזמן-אחזור; אפס-ביקורת דרך conformal. 7 ממצאים מאומתים. | מחקר-עומק |
|
||||
| 03 | [deep-research-full-output](03-deep-research-full-output.md) | המחקר המלא הגולמי (verbatim, לוגים, 4 הפרכות, 25 מקורות). | מחקר-עומק |
|
||||
|
||||
| 04 | [daphna-canon-as-importance-ground-truth](04-daphna-canon-as-importance-ground-truth.md) | **הקאנון-הידני כ-ground-truth** — מתואם עם תדירות-הציטוט (מאמת הפרוקסי), חושף פערי-קורפוס, 4 שימושים ל-RAG. | Claude |
|
||||
| 05 | [ingest-contract-and-citation-graph-gaps](05-ingest-contract-and-citation-graph-gaps.md) | **3 מחוללי-הכאב במספרים חיים** — 87% מהחיצוני בלי practice_area; גרף-ציטוטים ריק; V41 100% תקוע (מתנגש עם אפס-ביקורת). | Claude |
|
||||
| 06 | [extractor-generosity-committee-application](06-extractor-generosity-committee-application.md) | **כימות חוצה-קורפוס:** `application`=13.7% בוועדות (תכונת-מקור, לא באג) → לא לסנן. ⭐ ממצא: `nli_unsupported`=40% בפסיקה החיצונית — סוגיית-רמה-A הפתוחה. | Claude (סשן אחר) |
|
||||
|
||||
> **הסינתזה הסופית:** [`00-final-synthesis.md`](00-final-synthesis.md) — מאחדת 01–05 + מבחן-8508. החלטה: שמור-הכל + דרג-בזמן-אחזור; רמה-A=ניקוי-רעש+dedup בלבד (ללא cap/novelty).
|
||||
|
||||
---
|
||||
|
||||
## ב. ⭐ הקלט הקריטי החיצוני — מפת-החשיבות הידנית
|
||||
|
||||
| מסמך | מה תורם | למה לא הוזז |
|
||||
|------|---------|-------------|
|
||||
| [`../daphna-precedent-network.md`](../daphna-precedent-network.md) | **"הקאנון של דפנה"** — מיפוי-ידני (מ-33 החלטות) של התקדים-המועדף שלה **לכל סוגיה משפטית**. זה **בדיוק ה-ground-truth של "חשיבות"** שהאוטומציה מנסה לשחזר — וברמת-הסוגיה (הגרנולריות שהמחקר אמר שחסרה). | קרוא ע"י סוכני legal-researcher/legal-writer + 8 מסמכים |
|
||||
|
||||
---
|
||||
|
||||
## ג. תשתית-קורפוס קיימת (חיצוני, מקושר)
|
||||
|
||||
| מסמך / ספ | מה תורם |
|
||||
|-----------|---------|
|
||||
| [`../corpus-graph.md`](../corpus-graph.md) | גרף-הציטוטים `/graph` — PageRank/אשכולות **כבר מחושבים** (`web/graph_metrics.py`). אבל הגרף כמעט ריק (ר' ד'). |
|
||||
| [`../corpus-analysis.md`](../corpus-analysis.md) | ניתוח שיטתי של 24 ההחלטות — דפוסי-דיון, פערים. |
|
||||
| [`../legal-principles-redesign.md`](../legal-principles-redesign.md) | תכנון משטר-החילוץ התלת-מודלי + תקרת-5 + טרמינולוגיה + סינתזה (PR #304/#305). §8 = שכבת-החשיבות. **נשאר תקף ל"חילוץ-להבא"; מה שמשתנה הוא היחס לקורפוס-הקיים.** |
|
||||
| [`../halacha-strict-rubric.md`](../halacha-strict-rubric.md) | 6 עילות-החיתוך של ניקוי-ההלכות (referenced מהקוד). |
|
||||
| ספ [`../spec/X11-citation-corroboration.md`](../spec/X11-citation-corroboration.md) | citator פנימי — תיקוף הלכות; ישירות קשור לסיגנל-הציטוט. |
|
||||
| ספ [`../spec/X12-digests-radar.md`](../spec/X12-digests-radar.md) | יומונים — סיגנל-זהב #2 (`headline_holding`). |
|
||||
| ספ [`../spec/X13-court-fetch.md`](../spec/X13-court-fetch.md) | אחזור-פסיקה-אוטומטי — מקור-גידול הקורפוס. |
|
||||
| ספ [`../spec/02-data-model.md`](../spec/02-data-model.md) · [`../spec/03-retrieval.md`](../spec/03-retrieval.md) | INV-DM (חוזה-שלמות) + INV-RET/RRF (נקודת-הזרקת-הדירוג). |
|
||||
|
||||
---
|
||||
|
||||
## ד. עובדות-מפתח חיות (legal_ai @ :5433, 2026-06-20)
|
||||
|
||||
```text
|
||||
case_law (פסקי-דין/החלטות) 363 (240 external · 92 committee · 31 שבורים)
|
||||
• 66% (240) בלי practice_area ← חוזה-קליטה רופף = "התיקונים האינסופיים"
|
||||
halachot 5,489 → 25% approved · 44% pending (צוואר ידני)
|
||||
canonical_halachot (V41) 5,472 → 5,456 singletons · 0 published ⚠️ (אינרטי)
|
||||
|
||||
גרף-הציטוטים (קריטי):
|
||||
PageRank מחושב ✅ web/graph_metrics.py
|
||||
ציטוטי-דפנה 398 (מ-42 החלטות) ← כמעט כל הסיגנל
|
||||
ציטוטי 91 ועדות-אחרות 0 (לא חולצו)
|
||||
ציטוטים בין פס"ד-חיצוניים 0 ← אין גרף ביניהם
|
||||
פיזור תדירות-ציטוט (זנב אמיתי): 7×1 · 6×1 · 4×4 · 3×8 · 2×38 · 1×269
|
||||
```
|
||||
|
||||
**שתי מסקנות שמעצבות את הסינתזה:**
|
||||
1. **"החשיבות" כבר קיימת ידנית** (ב') — אסור להמציא מאפס; לחבר את הקאנון-הידני + ציטוטי-דפנה.
|
||||
2. **אין גרף-ציטוטים** — centrality אוטומטי לא יעבוד עד שנצופף (לחלץ ציטוטים מכל 363) **או** נישען על הקאנון.
|
||||
|
||||
---
|
||||
|
||||
## ה. החלטות-מוצר שכבר ננעלו (chaim)
|
||||
- **אפס-ביקורת > אובדן-מקרי** — לא שייך לאשר מאות הלכות.
|
||||
- אם cull בכלל — **כל-הזהב + עד-5-לא-זהב**; אבל המחקר מטה ל**אל-תחתוך / דרג-בזמן-אחזור**.
|
||||
- טרמינולוגיה: הלכה (מחוזי/עליון) · כלל-פרשני (ועדה) · עקרונות (מטרייה). bookmarks=עוגני-DOCX (לא רלוונטי).
|
||||
|
||||
---
|
||||
|
||||
## ו. הפערים הפתוחים לסינתזה הסופית
|
||||
1. לשלב את **הקאנון-הידני** כסיגנל-חשיבות-ראשי (קלט 04).
|
||||
2. להכריע **גרף-ציטוטים:** לצופף (לחלץ מכל הפסקים) או להישען על קאנון+דפנה+יומונים (קלט 05).
|
||||
3. **חוזה-הקליטה** (practice_area, 31 שבורים) — מקור-הכאב; תוכנית-תיקון-במקור.
|
||||
4. **V41 האינרטי (0 published)** — לתקן או לעקוף בדירוג-בזמן-אחזור?
|
||||
5. **לאחד 01 ↔ 02/03** לתוכנית-ביצוע אחת + **בסיס-מדידה לאיכות-האחזור הנוכחי**.
|
||||
|
||||
---
|
||||
|
||||
## ז. זיכרונות-פרויקט קשורים (להקשר)
|
||||
`project_precedent_library` · `project_corpus_graph` · `project_x11_citation_corroboration` ·
|
||||
`project_digests_radar` · `project_canonical_halachot` · `project_principles_redesign` ·
|
||||
`project_halacha_quality_initiative` · `project_precedent_auto_extraction`. TaskMaster: #152, #153.
|
||||
@@ -0,0 +1,170 @@
|
||||
# ממצאי ביקורת — ארכיטקטורת קורפוס־הפסיקה + מצב הדאטה בפועל
|
||||
|
||||
> **מקור:** Claude (Opus 4.8) · **תאריך:** 2026-06-20 · **קונטקסט:** חקירה לקראת תכנון־מחדש של קורפוס־הפסיקה.
|
||||
> מסמך זה הוא **אחד מכמה** קלטי־סוכנים שחיים אוסף; ייעודו להזין את שלב־הסינתזה. אינו תכנית — הוא **אבחון**.
|
||||
>
|
||||
> **שאלת־המוצא של חיים:** "הקורפוס נבנה מראש לא נכון, אני כל הזמן מתעסק בתיקונים. האם כדאי ליצור מחדש את קורפוס־הפסיקה ולהתחיל דף נקי?"
|
||||
>
|
||||
> **המודל הרצוי (כפי שחיים תיאר אותו):** מאגר פסקי־דין והחלטות ועדות־ערר; חוקר־התקדימים מזהה בשלב ניתוח־הערר פס"ד/החלטות שדנו במקרה דומה או הלכה דומה; הסוכן־הכותב משייך ומזכיר אותם בפרק הדיון וההכרעה בסגנון דפנה. שלושה מקורות־הזנה: (1) החלטות דפנה עצמה, (2) ועדות־ערר אחרות שמצטטות פסיקה, (3) פס"ד עליון/מחוזי.
|
||||
|
||||
---
|
||||
|
||||
## 0. תקציר־מנהלים (TL;DR)
|
||||
|
||||
**מה ש"בנוי לא נכון" אינו הסכמה — היא שכבת־הביצוע.** הסכמה כבר תואמת בדיוק את המודל שחיים תיאר: טבלה אחת (`case_law`) ששלושת המקורות נכנסים אליה דרך `source_kind`/`source_type`; שלושת ה־`search_*` הם שלושה *מסננים* על אותו מקור, לא שלושה מאגרים מקבילים (G2 מקוים ברמת־הסכמה). **רֵבילד של הסכמה ייצר בדיוק את אותה סכמה** — ולכן אינו פותר דבר, ומסכן ב־second-system syndrome.
|
||||
|
||||
מה שכן מחולל את "התיקונים האינסופיים" — שלושה כשלי־ביצוע מדידים:
|
||||
1. **חוזה־קליטה רופף** → 66% מהפסיקה בלי `practice_area`, 31 רשומות ריקות, אכיפת־שלמות (INV-DM1) מופרת בפועל.
|
||||
2. **צינור הלכות→קנוני מייצר רעש** → 5,472 קנוני, מתוכם 5,456 סינגלטונים, **0 published** → השכבה שאמורה להזין את הכותב (INV-G10) **אינרטית לגמרי**.
|
||||
3. **כפילות `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_corpus` SoT וה-`case_law` נגזר, או הפוך.
|
||||
|
||||
---
|
||||
|
||||
## 5. ההמלצה — לא רֵבילד־סכמה; "איפוס שכבות־נגזרות" אחרי תיקון־חוזה
|
||||
|
||||
**אסור** לשרוף ולהעלות־מחדש את `case_law` — תבנה אותה סכמה ותאבד מטא־דאטה ידני. **כן** הגיוני רֵבילד צר של ה**נגזר**, אבל בסדר הזה (G1 — מקור לפני תסמין):
|
||||
|
||||
1. **קודם החוזה:** אכוף ב-`*_upload` שדות־חובה (practice_area, summary, full_text); כשל → `searchable=false`. נקה/מחק את 31 הריקות.
|
||||
2. **תקן את הקנוניזציה:** כוונן סף 0.85, הגדר מתי `published`, ובדוק ניסוח־החילוץ. בלי זה אין טעם להריץ מחדש.
|
||||
3. **רק אז** re-derive מהמקור הקיים: chunks → halachot → canonical.
|
||||
4. **הכרע 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)
|
||||
@@ -0,0 +1,142 @@
|
||||
# עיצוב-מחדש: קורפוס-הפסיקה — חשיבות, אחזור וסינון (מחקר + החלטה)
|
||||
|
||||
> **מקור:** מחקר-עומק רב-סוכני (deep-research, 2026-06-20) — 6 זוויות, 25 מקורות ראשוניים,
|
||||
> 114 טענות חולצו, 25 אומתו באימות-יריב 3-קולות (**21 אושרו · 4 הופרכו**). שאלת-המחקר:
|
||||
> איך לדרג/לנקות קורפוס של ~3,562 עקרונות-משפטיים מחולצים, **באוטומציה גבוהה וכמעט ללא
|
||||
> ביקורת-אנושית** (אילוץ-יסוד של chaim). מסמך-אחות: [`legal-principles-redesign.md`](../legal-principles-redesign.md) §8.
|
||||
|
||||
---
|
||||
|
||||
## ההמלצה החד-משמעית
|
||||
|
||||
**לא לחתוך (cull הרסני). לשמור הכל, לדרג-לפי-חשיבות בזמן-אחזור, ולגדר במנגנון selective-prediction
|
||||
מכויל כך שרק שבריר זעיר וחסום-סטטיסטית מגיע ליו"ר.** (אופציה B/C, לא A.)
|
||||
|
||||
הסיבה במשפט: **הסיגנל המכני אמין (האם פס"ד מצוטט, ע"י מי) — אבל ההכרעה הפרשנית "האם העיקרון
|
||||
הזה חשוב" היא בדיוק המקום שבו האוטומציה נכשלת**, ולכן אסור להשמיד עקרונות על-בסיס ציון-חשיבות
|
||||
רועש; עדיף לשמור הכל ולתת ל-ranking בזמן-שאילתה (שמכיר את הקשר-הטיוטה) להציף את הרלוונטי.
|
||||
|
||||
---
|
||||
|
||||
## הממצאים (מאומתים)
|
||||
|
||||
### 1. מרכזיות-רשת-ציטוטים = סיגנל-חשיבות בר-קנה-מידה, אך **ברמת-הפס"ד בלבד**, ובינוני בעוצמתו
|
||||
`confidence: high · 3-0`
|
||||
- ניתן לגזור תוויות-חשיבות אלגוריתמית מדפוסי-ציטוט, בלי תיוג-ידני (Swiss Criticality, ACL 2025 —
|
||||
138,531 פסקים דרך LD-Label + Citation-Label משוקלל-טריות).
|
||||
- שיטות-מרכזיות (Derlén & Lindholm: PageRank/HITS/betweenness על 9,125 פסקי-CJEU; Fowler/Jeon
|
||||
ב-SCOTUS) מבססות מרכזיות-ברמת-תיק כפרוקסי-חשיבות כמותי. **HITS/eigenvector עדיפים על degree-גולמי**
|
||||
כי degree מתייחס לכל מצטט כשווה.
|
||||
- **גבול קריטי:** העוצמה הניבויית **בינונית בלבד** — JURIX 2023, ordinal regression על Importance-Score
|
||||
של בית-המשפט הגיע ל-**F1≈0.655**; התפלגות-הציטוטים כבדת-זנב (preferential attachment). כל הראיות
|
||||
ברמת-פס"ד; **אף אחת לא מאמתת חשיבות ברמת-עיקרון/holding.**
|
||||
- **משמעות לנו:** מרכזיות-פס"ד = prior חזק על תיק-האב של עיקרון, **לא** ציון per-עיקרון.
|
||||
- מקורות: arxiv 2410.13460v2 · ssrn 2910926 · polisci.umn s6.pdf · ResearchGate 376422421 · Nature s41598-021-82430-x
|
||||
|
||||
### 2. חילוץ ברמת-holding ישים מסחרית — אך **תיוג-החשיבות/treatment ברמת-holding הוא השלב שגיא-מועד**
|
||||
`confidence: high · 3-0` (ותת-טענה הופרכה)
|
||||
- מערכת KeyNumber הפטנטית של West מסווגת headnotes בודדים (~6/פסק, לעיתים 50+) לטקסונומיה של
|
||||
90,000+ מחלקות דרך cosine — מוכיח ש**חילוץ-holding ישים**.
|
||||
- **אבל** Hellyer (2018, Law Library Journal): Shepard's ו-KeyCite פספסו/תייגו-שגוי **~שליש**, ו-BCite
|
||||
**מעל שני-שליש**, מיחסי-הטיפול-השליליים (מדגם 357); שלושת ה-citators הסכימו רק 53/357. **השגיאות
|
||||
נמצאות בניתוח-העריכתי הפרשני, לא בזיהוי-המכני** — "the significant problems occur in the editorial
|
||||
analysis process, after the initial process of identifying the citing cases".
|
||||
- **הופרך (0-3):** הטענה ש-West שומר רק 1-3 holdings לפסק — **הפרקטיקה המסחרית אינה תומכת בגיזום-holding
|
||||
אגרסיבי.**
|
||||
- **משמעות לנו:** הסיגנל-המכני (מצוטט? ע"י מי?) אמין; "האם העיקרון חשוב" — שם גם מערכות-מסחריות-עם-עורכים
|
||||
טועות קשות. **טיעון נגד cull-הרסני מונע-ציון-פרשני.**
|
||||
- מקורות: USPTO US7580939 · aallnet LLJ 110n4
|
||||
|
||||
### 3. אחזור מודע-הקשר בזמן-שאילתה **עדיף** על דירוג-חשיבות חסר-הקשר
|
||||
`confidence: high · 3-0`
|
||||
- ICAIL 2021 "Context-Aware Legal Citation Recommendation" (Stanford RegLab + CMU): ניצול ההקשר-הטקסטואלי
|
||||
המקומי של הטיוטה משפר את איכות-ההמלצה על-פני baselines חסרי-הקשר. **הרלוונטיות תלוית-הקשר — לא ידועה
|
||||
בזמן-cull, זמינה בזמן-שאילתה.** ציון-חשיבות סטטי (offline) לא יכול לתפוס רלוונטיות-ספציפית-לפסקה →
|
||||
השמדת עקרונות נמוכי-ציון-סטטי מסכנת פריטים רלוונטיים-מאוד בהקשר שה-cull לא ראה.
|
||||
- מקור: arxiv 2106.10776
|
||||
|
||||
### 4. תכונות-רשת נעשות **חזקות יותר עם הזמן**; תכונות-דמיון-תוכן דועכות
|
||||
`confidence: medium · 2-1`
|
||||
- Mones et al. (Scientific Reports 2021, CJEU 1955-2014): תכונות-מבניות (common-neighbor/Adamic-Adar)
|
||||
מראות עלייה-מובהקת בעוצמה-ניבויית עם התבגרות-הרשת, בעוד TF-IDF דועך. → **גרף-ציטוטים מתחזק-מעצמו** הוא
|
||||
נכס עמיד יותר מ-cull חד-פעמי מבוסס-תוכן. (אזהרה: התיקון העריכתי — preferential-attachment הוא תכונה
|
||||
*נודלית-דועכת*; המבנית-עולה היא common-neighbor.)
|
||||
- מקור: Nature s41598-021-82430-x
|
||||
|
||||
### 5. Selective evaluation מכויל → **רק שבריר זעיר מגיע לאדם**
|
||||
`confidence: high · 3-0`
|
||||
- Cascaded Selective Evaluation (ICLR 2025): מנתב כל פריט למודל-החלש-ביותר-שעדיין-בטוח-מספיק; השאר
|
||||
מסלים. השיג **מעל 80% הסכמה-אנושית** ב-ChatArena עם אחוז-הסלמה נמוך. → ניתן לכייל סף-ביטחון כך
|
||||
שרק חלק קטן ומדוד עובר לסקירה.
|
||||
- מקור: ICLR 2025 (proceedings.iclr.cc 08dabd5...)
|
||||
|
||||
### 6. Selective Conformal Risk Control (SCRC) → **ערבון-סיכון מותנה ברמה 1−α**
|
||||
`confidence: high · 3-0`
|
||||
- SCRC מספק ערבון-בקרת-סיכון מותנה: ניתן להבטיח **חסם-טעות מוכח** על הפריטים ש"נסגרים אוטומטית",
|
||||
כך שאחוז-ההסלמה-לאדם חסום-סטטיסטית ולא תלוי-מזל. → המנגנון להמרת "אפס-ביקורת" ליעד **מובטח-מתמטית**.
|
||||
- מקורות: arxiv 2407.18370 · 2511.07396
|
||||
|
||||
### 7. **התנהגות-ציטוט טבעית = פיקוח-משתמע** (במקום ביקורת-בכמות)
|
||||
`confidence: high · 3-0`
|
||||
- Joachims et al. (קליקים כ-implicit relevance; Radlinski/Joachims) — אותות-משתמשים טבעיים הם סיגנל-רלוונטיות
|
||||
אמין כשמטפלים בהטיות-מיקום. **מקבילה אצלנו:** אילו פסקי-דין/הלכות דפנה *מצטטת בפועל* בהחלטותיה = הפיקוח,
|
||||
במקום סקירה-מראש של מאות. self-correcting, מתחזק עם השימוש.
|
||||
- מקורות: Cornell joachims_etal_17a · radlinski_joachims_05a · arxiv 2403.18962
|
||||
|
||||
---
|
||||
|
||||
## טענות שהופרכו (לא לבנות עליהן)
|
||||
| טענה | קול | מקור |
|
||||
|------|-----|------|
|
||||
| degree-גולמי הוא המנבא היציב ביותר, עדיף על PageRank | 1-2 | ResearchGate 376422421 |
|
||||
| HITS (hubs/authorities) עדיף-באופן-מובהק על ספירת-ציטוטים | 1-2 | polisci.umn s6 |
|
||||
| link-prediction על גרף-הציטוטים מדרג תקדימים בדיוק חזק | 0-3 | Nature s41598 |
|
||||
| West שומר רק 1-3 holdings/פסק (תמיכה בגיזום-holding) | 0-3 | USPTO US7580939 |
|
||||
> מסקנה מההפרכות: **ספירת-ציטוטים היא סיגנל לגיטימי אך לא-מכריע, והמטרי-המדויק (degree/PageRank/HITS)
|
||||
> אינו מוכרע — אל תּתַכַּנֵּת-יתר אותו; ואל תצטט פרקטיקה-מסחרית כתומכת בגיזום-holding.**
|
||||
|
||||
---
|
||||
|
||||
## סינתזה לנתוני-המערכת שלנו
|
||||
|
||||
| ממצא-מחקר | המצב אצלנו (אומת ב-DB) |
|
||||
|-----------|------------------------|
|
||||
| חשיבות אמינה רק ברמת-פס"ד | התאמת-זהב ברמת-עיקרון **נכשלה**: match_context=רשימת-הפניות; 62/112 פס"ד-מצוטטים חסרי-עקרונות; חציון-cosine 0.52 |
|
||||
| ספירת-ציטוטים = סיגנל עם זנב | יש פיזור אמיתי: 7×(1), 6×(1), 4×(4), 3×(8), 2×(38), 1×(269) — ראש-"הלכות-קבע" ברור |
|
||||
| אל תחתוך על ציון-פרשני רועש | ה-cull הבלינדי היה חותך ~66%, כולל הלכות-זהב (49% מהעקרונות מפס"ד-זהב) |
|
||||
| דרג-בזמן-שאילתה (מודע-הקשר) | יש לנו RAG (`search_precedent_library`/halacha) — נקודת-ההזרקה הטבעית ל-boost |
|
||||
| פיקוח-משתמע מציטוטי-היו"ר | יש לנו `precedent_internal_citations` (ציטוטי-דפנה) — מתעדכן עם כל החלטה חדשה |
|
||||
| אפס-ביקורת מובטח (SCRC/cascade) | מחליף את תורי-ה-pending_review בשער-conformal מכויל |
|
||||
|
||||
**ההכרעה הנגזרת:**
|
||||
1. **לבטל את ה-cull ההרסני** כברירת-מחדל. הקורפוס נשאר שלם (הפיך — וכבר שוחזר לפריסטין).
|
||||
2. **שכבת-חשיבות = prior-לדירוג, לא מסנן-השמדה.** `importance_score(עיקרון) ∝ מרכזיות-פס"ד-המקור
|
||||
(ספירת-ציטוטים בדרגות: דפנה ≫ יו"ר-אחר ≫ כללי) × סמכות × טריות` — מוזרק כ-boost ב-RRF בזמן-אחזור.
|
||||
3. **רעש מטופל ב-ranking, לא במחיקה** — עקרון נמוך-חשיבות פשוט שוקע ולא צץ; שום הלכה לא אובדת.
|
||||
4. **ביקורת-אנושית → אפס-מעשי:** רק ה"זבל-הוודאי" (≤1 קול בפאנל / quality-flags) מודח-אוטומטית (הפיך);
|
||||
השאר נשאר; אין תור-אישור. אם בעתיד נרצה שער-החלטה — conformal (SCRC) חוסם את אחוז-ההסלמה מתמטית.
|
||||
5. **Active-learning:** ציטוטי-דפנה העתידיים מזינים את ה-prior אוטומטית (job רענון), בלי סקירה.
|
||||
|
||||
> **מה שנשאר תקף מהעבודה שכבר נבנתה (PR #304/#305):** משטר-החילוץ התלת-מודלי + תקרת-5 **לחילוץ-להבא**
|
||||
> (מונע צמיחת-רעש חדש במקור — quality-at-source) נשאר; מה שמשתנה הוא ה**יחס לקורפוס-הקיים**: דירוג ולא
|
||||
> השמדה. הטרמינולוגיה (הלכה/כלל-פרשני/עיקרון) והסינתזה — נשארים.
|
||||
|
||||
## שאלות-פתוחות (לאימות-פנימי, מהמחקר)
|
||||
1. האם ניתן לאמת ציון-חשיבות per-עיקרון (לא רק per-פס"ד) דרך מתאם בין retrieval-then-citation של היו"ר
|
||||
לסיגנל-אלגוריתמי? (הליבה הלא-מוכחת — דורש מחקר-פנימי על הקורפוס שלנו.)
|
||||
2. גודל-מינימלי ותדירות-רענון לכיול מהתנהגות-הציטוט של היו"ר בקורפוס חד-מחבר קטן? (Trust-or-Escalate
|
||||
השתמש ב-500 דוגמאות i.i.d.)
|
||||
3. שקלול ציטוטים-פנימיים (החלטה→החלטה של היו"ר) מול חיצוניים (מרכזיות-בית-משפט) — פנימי נדיר אך מיושר-יותר לסגנונה.
|
||||
4. האם דירוג-אגרסיבי-בזמן-שאילתה פוגע ב-precision/latency בקנה-המידה שלנו (~3,562), או שה-set קטן מספיק
|
||||
שאין חיסרון מעשי — כלומר **האם ה-cull בכלל פותר בעיה שיש לנו?**
|
||||
|
||||
---
|
||||
|
||||
## מקורות (25 ראשוניים)
|
||||
מרכזיות/legal-IR: arxiv 2410.13460v2 · ssrn 2910926 · polisci.umn s6.pdf · ResearchGate 376422421 ·
|
||||
arxiv 2106.10776 · Nature s41598-021-82430-x · USPTO US7580939 · aallnet LLJ 110n4 ·
|
||||
law.northwestern updating · guides.law.stanford keynumbersystem.
|
||||
Selective-prediction/conformal: ICLR 2025 08dabd5 · arxiv 2512.12844 · arxiv 2407.18370 · vlm-uncertainty ·
|
||||
openreview JJPAy8mvrQ · arxiv 2511.07396 · arxiv 2605.18796.
|
||||
Implicit-feedback/active-learning: Cornell joachims_etal_17a · radlinski_joachims_05a · dl.acm 1229181 · arxiv 2403.18962.
|
||||
RAG pruning vs rank: arxiv 2407.12170 · 2511.00505 · 2409.13694v2.
|
||||
152
docs/precedent-corpus-redesign/03-deep-research-full-output.md
Normal file
152
docs/precedent-corpus-redesign/03-deep-research-full-output.md
Normal file
@@ -0,0 +1,152 @@
|
||||
# מחקר-עומק מלא (גולמי) — קורפוס-הפסיקה
|
||||
|
||||
> נספח גולמי ל-[`precedent-corpus-redesign.md`](02-deep-research-importance-recommendation.md). פלט מלא של מנוע deep-research (2026-06-20).
|
||||
|
||||
**סטטיסטיקה:** 6 זוויות · 25 מקורות · 114 טענות חולצו · 25 אומתו · 21 אושרו · 4 הופרכו · 108 קריאות-סוכן · 108 סוכנים.
|
||||
|
||||
|
||||
## תקציר-מנהלים (verbatim)
|
||||
|
||||
For your specific situation, the evidence points to option (B)/(C): rank-by-importance at retrieval time rather than a destructive cull, with selective-prediction gating that keeps human review near-zero. Automated importance signals from citation-network centrality (PageRank/HITS/degree) are a genuine, scalable proxy for PRECEDENT-level importance — derivable algorithmically without manual annotation (Swiss Criticality, Fowler/Jeon, Derlén & Lindholm) — but they are only moderately predictive (JURIX 2023 F1≈0.655) and are NOT validated at the holding/principle granularity you actually extract. Commercial systems (West KeyNumber patent, Shepard's/KeyCite) do operate at holding-level headnotes via cosine similarity, but their interpretive/editorial labels are substantially error-prone (one-third to two-thirds mislabeled), confirming that holding-level importance judgment is exactly where automation degrades — so you should not destructively prune on a noisy holding-level score. The robust path is to keep all extracted principles (reversible), attach multiple importance signals (precedent-level citation centrality + your chair's actual citation behavior as implicit supervision), rank at query time, and use a calibrated selective-prediction/conformal gate (Trust-or-Escalate cascade, SCRC) so only a tiny, statistically-bounded fraction ever escalates to the human — with a provable agreement guarantee at level 1−α.
|
||||
|
||||
|
||||
## לוג-הצינור
|
||||
|
||||
- Q: Research question for a production legal-AI system (RAG that helps a planning-ap…
|
||||
- Decomposed into 6 angles: Citation-network importance & legal IR ranking, Headnote/holding selection at commercial citators, Selective prediction / conformal abstention thresholds, Multi-model agreement & trust-or-escalate routing, Implicit feedback active learning vs upfront review, RAG corpus pruning vs rank-at-retrieval
|
||||
- Citation-network importance & legal IR ranking: 6 results
|
||||
- Headnote/holding selection at commercial citators: 6 results
|
||||
- Headnote/holding selection at commercial citators: 4 novel (2 filtered)
|
||||
- Selective prediction / conformal abstention thresholds: 6 results
|
||||
- Selective prediction / conformal abstention thresholds: 5 novel (1 filtered)
|
||||
- Multi-model agreement & trust-or-escalate routing: 6 results
|
||||
- Multi-model agreement & trust-or-escalate routing: 3 novel (3 filtered)
|
||||
- Implicit feedback active learning vs upfront review: 6 results
|
||||
- Implicit feedback active learning vs upfront review: 4 novel (2 filtered)
|
||||
- RAG corpus pruning vs rank-at-retrieval: 6 results
|
||||
- RAG corpus pruning vs rank-at-retrieval: 3 novel (3 filtered)
|
||||
- Fetched 25 sources → 114 claims → verifying top 25
|
||||
- "Importance/criticality labels for legal decisions …": 3-0 ✓
|
||||
- "Case criticality is operationalized via a two-tier…": 3-0 ✓
|
||||
- "Derlén & Lindholm apply network-citation analysis …": 3-0 ✓
|
||||
- "Citation-network centrality scores (specifically t…": 3-0 ✓
|
||||
- "Network centrality measures correlate only reasona…": 3-0 ✓
|
||||
- "An ordinal regression model using network centrali…": 3-0 ✓
|
||||
- "Among centrality metrics, simple Degree (in-degree…": 1-2 ✗
|
||||
- "Citation counts alone (degree centrality / inward …": 1-2 ✗
|
||||
- "The authors construct importance scores using two …": 3-0 ✓
|
||||
- "Simple degree centrality (counting inward citation…": 3-0 ✓
|
||||
- "A deep-learning citation recommendation tool (BiLS…": 3-0 ✓
|
||||
- "Leveraging the local textual context surrounding a…": 3-0 ✓
|
||||
- "In a real judicial citation network (CJEU, 1955-20…": 3-0 ✓
|
||||
- "A link-prediction model on the citation graph pred…": 0-3 ✗
|
||||
- "Over time, structural/network features (preferenti…": 2-1 ✓
|
||||
- "West's commercial system classifies legal headnote…": 3-0 ✓
|
||||
- "The system does NOT treat all headnotes/holdings a…": 0-3 ✗
|
||||
- "The patented method operates at the granularity of…": 3-0 ✓
|
||||
- "Commercial citators' negative-treatment/holding la…": 3-0 ✓
|
||||
- "The error source is editorial analysis (the interp…": 3-0 ✓
|
||||
- "Selective evaluation with a calibrated confidence …": 3-0 ✓
|
||||
- "Cascaded Selective Evaluation routes each instance…": 3-0 ✓
|
||||
- "On ChatArena the cascade achieved over 80% human a…": 3-0 ✓
|
||||
- "Selective Conformal Risk Control (SCRC) is a frame…": 3-0 ✓
|
||||
- "SCRC provides a conditional risk-control guarantee…": 3-0 ✓
|
||||
- Verify done: 25 claims → 21 confirmed, 4 killed
|
||||
|
||||
## הממצאים המלאים (verbatim)
|
||||
|
||||
|
||||
### ממצא 1 — Citation-network centrality is a scalable, manual-annotation-free importance signal — but it works at PRECEDENT/case level, not holding/principle level, and is only moderately predictive.
|
||||
**confidence:** high · **vote:** 3-0 across all constituent claims
|
||||
**מקורות:** https://arxiv.org/html/2410.13460v2, https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2910926, http://users.polisci.umn.edu/~trj/MyPapers/s6.pdf, https://www.researchgate.net/publication/376422421_Centrality_Scores_and_Precedent_Value_in_Legal_Network_Analysis, https://www.nature.com/articles/s41598-021-82430-x
|
||||
|
||||
Merges claims [0],[1],[2],[3],[4],[5],[7],[10]. Importance labels can be derived algorithmically from citation patterns, yielding far larger datasets than manual annotation (Swiss Criticality, ACL 2025: 138,531 cases via LD-Label + recency-weighted Citation-Label). Network-centrality methods (Derlén & Lindholm: PageRank, HITS, betweenness on 9,125 CJEU judgments; Fowler/Jeon at SCOTUS) establish case-level centrality as a quantitative importance proxy. Eigenvector/HITS approaches are preferred over raw degree because degree treats all citing cases equally regardless of the citing case's own importance. CRITICAL LIMIT: predictive power is only moderate — JURIX 2023 ordinal regression on the court's Importance Score achieved F1≈0.655 ('to an extent' indicates precedent value), and CJEU citation distributions are heavy-tailed/preferential-attachment (few highly-cited cases) confirming a meaningful but skewed signal. All evidence is scoped to precedent/case level; none validates principle/holding-level importance. For your ~3,562 principles (~12/precedent), this means: use precedent-level centrality as a strong prior on a principle's parent case, but do not treat it as a per-principle importance score.
|
||||
|
||||
|
||||
### ממצא 2 — Holding-level extraction IS achievable (commercial citators do it), but holding-level IMPORTANCE/treatment labeling is the error-prone editorial step — so a destructive cull keyed on a noisy holding-level score is risky.
|
||||
**confidence:** high · **vote:** 3-0; one constituent refuted (selective top-1-3 retention)
|
||||
**מקורות:** https://image-ppubs.uspto.gov/dirsearch-public/print/downloadPdf/7580939, https://www.aallnet.org/wp-content/uploads/2018/12/LLJ_110n4_02_hellyer.pdf
|
||||
|
||||
Merges claims [12],[13],[14],[15]. West's patented KeyNumber system classifies individual headnotes (discrete holdings, ~6 per opinion, sometimes 50+) into a 90,000+ class taxonomy via cosine similarity over noun-word-pair vectors with composite scoring — proving holding-level extraction/classification is commercially viable. BUT Hellyer (2018, Law Library Journal) shows Shepard's and KeyCite missed/mislabeled ~one-third, and BCite over two-thirds, of negative citing relationships (357-sample); the three citators agreed only 53/357 times. The errors arise specifically in the EDITORIAL ANALYSIS (interpretive treatment/holding labeling), not the mechanical step of identifying citing cases — 'the significant problems occur in the editorial analysis process, after the initial process of identifying the citing cases.' Implication for you: mechanical signals (does a precedent get cited; by whom) are the reliable part; interpretive 'is this principle important' judgment is exactly where even commercial systems with human editors err badly. Note: the claim that West selectively retains only 1-3 holdings per case was REFUTED (vote 0-3) — commercial practice does NOT support aggressive holding-level pruning. This argues against a destructive cull driven by an interpretive importance score.
|
||||
|
||||
|
||||
### ממצא 3 — Context-aware, query-time retrieval (using the local textual context of the draft) outperforms context-free importance ranking for choosing which authority to surface — favoring rank-at-retrieval over a pre-pruned static corpus.
|
||||
**confidence:** high · **vote:** 3-0
|
||||
**מקורות:** https://arxiv.org/pdf/2106.10776
|
||||
|
||||
Merges claims [8],[9]. The ICAIL 2021 'Context-Aware Legal Citation Recommendation using Deep Learning' (Stanford RegLab + CMU) builds a citation recommender for opinion drafting and finds that leveraging local textual context improves recommendation quality over context-free baselines (collaborative filtering on citation lists). Context-based deep models (BiLSTM/RoBERTa) beat context-free methods because they exploit semantics to judge which citation fits the passage. This directly supports your option (B): the right-to-surface principle depends on the draft's local context, which is unknowable at cull time but available at query time. A static importance score (computed once, offline) cannot capture passage-specific relevance — so destroying low-static-importance principles risks discarding items that are highly relevant in a context the cull never saw. Caveat: context-aware recommendation and importance ranking are complementary, not mutually exclusive; the paper benchmarks against a citation-list baseline, not a centrality ranker.
|
||||
|
||||
|
||||
### ממצא 4 — Structural/network features become MORE predictive over time while content-similarity features decay — supporting maintaining a persistent citation graph (which improves as the corpus matures) rather than freezing a one-time content-based cull.
|
||||
**confidence:** medium · **vote:** 2-1
|
||||
**מקורות:** https://www.nature.com/articles/s41598-021-82430-x
|
||||
|
||||
Claim [11]. On the CJEU judicial citation network (1955-2014), Mones et al. (Scientific Reports 2021) found structural/common-neighbor features 'display a significant increase of predictive power' over time while document-content (TF-IDF) features show 'decreasing trends' — the network becomes increasingly informative as it matures. This implies a citation-graph-backed importance ranking is a more durable, self-improving asset than a one-shot content-similarity prune. CAVEATS lowering confidence to medium: (1) the verification flagged a misattribution — preferential attachment is a NODAL (decreasing) feature in the paper, not structural-increasing; the correctly-structural-increasing features are common-neighbor/Adamic-Adar indices. (2) The 'more durable than content similarity' framing is the claim's inference. (3) The paper itself flags automation-bias risk and that its recommendations operate at CASE level, not paragraph/holding level — reinforcing the precedent-vs-principle granularity caution. Still, the core direction (keep and grow the graph; rank at query time) is supported.
|
||||
|
||||
|
||||
### ממצא 5 — Selective prediction with calibrated thresholds gives a distribution-free, provable guarantee that auto-accepted judgments agree with the human at level 1−α (w.p. ≥1−δ), so the human reviews only a tiny calibrated fraction — directly satisfying the near-zero-review constraint.
|
||||
**confidence:** high · **vote:** 3-0
|
||||
**מקורות:** https://proceedings.iclr.cc/paper_files/paper/2025/file/08dabd5345b37fffcbe335bd578b15a0-Paper-Conference.pdf
|
||||
|
||||
Merges claims [16],[17],[18]. ICLR 2025 'Trust or Escalate' (Cascaded Selective Evaluation) formulates threshold selection as a multiple-hypothesis-testing problem on a small calibration set (|D_cal|=500, δ=0.1), guaranteeing P(f_LM(x)=y_human | c_LM(x)≥λ) ≥ 1−α with probability ≥1−δ — distribution-free (only i.i.d. calibration assumed, built on Bates et al. 2021 risk-controlling sets and Angelopoulos et al. 2022 Learn-then-Test). The cascade routes cheap judges first and escalates to a stronger model only when not confident, abstaining when none are confident. Empirically on ChatArena: >80% human agreement at 79.1% coverage, 88.1% of covered instances handled by cheap models, GPT-4 invoked on only 17.5% of instances, 91% guarantee-success vs <60% for point-estimate calibration. For you: this is the mechanism to keep human review near-zero — calibrate against a small set of the chair's own accept/reject decisions, auto-accept high-confidence principles, auto-reject low-confidence ones, and escalate to the human ONLY the calibrated uncertain middle, with a provable agreement bound.
|
||||
|
||||
|
||||
### ממצא 6 — Conformal-risk-control variants (SCRC) extend the guarantee to abstention: risk is bounded ONLY on accepted (non-abstained) samples via two calibration thresholds — giving a principled accept/abstain/reject gate suited to a noisy KB triage.
|
||||
**confidence:** high · **vote:** 3-0
|
||||
**מקורות:** https://arxiv.org/html/2512.12844
|
||||
|
||||
Merges claims [19],[20]. Selective Conformal Risk Control (Xu, Guo, Wei, 2025) combines conformal prediction with selective classification using two thresholds: λ₁ controls which samples are accepted (else abstain/defer), λ₂ controls prediction-set size. Theorem 2 guarantees E[l(C(X),Y) | g(X)≥1−λ₁] ≤ α — expected loss on ACCEPTED samples is bounded below a user-chosen target risk α; the calibration-only variant (SCRC-I) gives the bound w.p. ≥1−δ. This formalizes a three-way KB gate: auto-keep (accept) where conformal risk is provably low, auto-discard candidates, and defer the rest to the human — with risk controlled on exactly the items you act on automatically. Caveat: guarantees rely on exchangeability of calibration/test data, and 'risk' is a general bounded loss (expectation, not a probability); the source is current (Dec 2025) and peer-discussed but newer than the established Trust-or-Escalate line.
|
||||
|
||||
|
||||
### ממצא 7 — RECOMMENDATION: do NOT do a destructive holding-level cull; rank-by-importance at retrieval time over a reversibly-retained corpus, gated by a selective-prediction layer calibrated to the chair's natural citing behavior.
|
||||
**confidence:** medium · **vote:** synthesis of high-confidence findings; recommendation is inference
|
||||
**מקורות:** https://www.researchgate.net/publication/376422421_Centrality_Scores_and_Precedent_Value_in_Legal_Network_Analysis, https://www.aallnet.org/wp-content/uploads/2018/12/LLJ_110n4_02_hellyer.pdf, https://arxiv.org/pdf/2106.10776, https://proceedings.iclr.cc/paper_files/paper/2025/file/08dabd5345b37fffcbe335bd578b15a0-Paper-Conference.pdf, https://arxiv.org/html/2512.12844
|
||||
|
||||
Synthesis. Choose option B/C, not A. Rationale chain: (1) per-principle importance scoring is only moderately reliable even with citation networks (F1≈0.655) and is the editorial step where commercial citators err one-third-to-two-thirds — too noisy to justify irreversible deletion; (2) the right principle to surface is context-dependent (ICAIL 2021), unknowable at cull time but available at query time; (3) the citation graph is a self-improving asset (Scientific Reports 2021). CONCRETE DESIGN: (a) Keep all ~3,562 principles; attach precedent-level citation-centrality (PageRank/degree on your internal + external citation graph) as a prior, NOT a per-principle delete trigger; rank principles at retrieval time fusing centrality prior + context-aware semantic similarity to the draft block. (b) Mark obviously-redundant/low-quality principles with a reversible 'demoted/suppressed' flag (review_status) rather than deleting — your system already has reversible review_status gating per the project context. (c) Make the chair's NATURAL behavior the supervision signal: log which principles/precedents she actually cites in finalized decisions (implicit feedback) and which retrieved items she ignores; use these as the calibration labels. (d) Wrap auto-keep/demote in a Trust-or-Escalate / SCRC gate calibrated on ~500 of those implicit accept/ignore signals, so only a tiny calibrated fraction (target-α) ever reaches her for explicit review, with a provable agreement bound. This keeps human upfront review at zero and converges via use. Confidence is medium because the recommendation composes high-confidence findings into a design choice the literature supports directionally but does not test end-to-end on a holding-level legal KB.
|
||||
|
||||
|
||||
## טענות שהופרכו (verbatim)
|
||||
|
||||
- **[1-2]** Among centrality metrics, simple Degree (in-degree / citation count) was the most stable predictor of precedent value across network and sub-network configurations, outperforming more complex measures like PageRank in robustness.
|
||||
מקור: https://www.researchgate.net/publication/376422421_Centrality_Scores_and_Precedent_Value_in_Legal_Network_Analysis
|
||||
- **[1-2]** Citation counts alone (degree centrality / inward citations) are an insufficient proxy for legal importance; a Kleinberg HITS-style hubs-and-authorities measure that combines inward AND outward citations is superior and reveals importance information not evident in simple citation counts.
|
||||
מקור: http://users.polisci.umn.edu/~trj/MyPapers/s6.pdf
|
||||
- **[0-3]** A link-prediction model on the citation graph predicts which prior cases a new case will cite with strong accuracy — 95% of cases have a median rank below 292 — demonstrating that citation-network structure alone can rank precedents by likely relevance/importance for retrieval.
|
||||
מקור: https://www.nature.com/articles/s41598-021-82430-x
|
||||
- **[0-3]** The system does NOT treat all headnotes/holdings as equally important — it selectively retains only the most relevant one to three holdings per case by similarity, demonstrating commercial citator practice of holding-level selection/pruning rather than keeping everything.
|
||||
מקור: https://image-ppubs.uspto.gov/dirsearch-public/print/downloadPdf/7580939
|
||||
|
||||
## שאלות-פתוחות (verbatim)
|
||||
|
||||
- Can a per-PRINCIPLE importance score be validated (not just per-precedent)? E.g., does a principle's retrieval-then-citation rate by the chair correlate with any algorithmic signal well enough to gate on — this is the unproven core of your use case and would need an internal study on your own corpus.
|
||||
- What is the minimum reliable calibration-set size and refresh cadence for the chair's implicit citing behavior, given a small single-author corpus (the project notes ~5,243 principles but a low-data style-acquisition regime)? Trust-or-Escalate used 500 i.i.d. examples; can implicit signals from one chair's decisions reach that volume, and how fast does exchangeability degrade as her preferences evolve?
|
||||
- Should the importance prior combine INTERNAL citations (the chair's own decision-to-decision citations) with EXTERNAL precedent citations, and at what weighting — internal signals are scarcer but far more aligned to her style than generic court-citation centrality?
|
||||
- Does aggressive query-time ranking (vs. culling) measurably hurt RAG precision/latency at your corpus scale (~3,562-5,243 items), or is the retrieval set small enough that ranking-only with reversible demotion has no practical downside — i.e., is culling solving a problem you actually have?
|
||||
|
||||
## כל המקורות
|
||||
|
||||
- [primary] https://arxiv.org/html/2410.13460v2 · זווית: Citation-network importance & legal IR ranking · טענות: 5
|
||||
- [primary] https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2910926 · זווית: Citation-network importance & legal IR ranking · טענות: 5
|
||||
- [primary] https://www.researchgate.net/publication/376422421_Centrality_Scores_and_Precedent_Value_in_Legal_Network_Analysis · זווית: Citation-network importance & legal IR ranking · טענות: 5
|
||||
- [primary] http://users.polisci.umn.edu/~trj/MyPapers/s6.pdf · זווית: Citation-network importance & legal IR ranking · טענות: 5
|
||||
- [primary] https://arxiv.org/pdf/2106.10776 · זווית: Citation-network importance & legal IR ranking · טענות: 5
|
||||
- [primary] https://www.nature.com/articles/s41598-021-82430-x · זווית: Citation-network importance & legal IR ranking · טענות: 5
|
||||
- [primary] https://image-ppubs.uspto.gov/dirsearch-public/print/downloadPdf/7580939 · זווית: Headnote/holding selection at commercial citators · טענות: 5
|
||||
- [primary] https://www.aallnet.org/wp-content/uploads/2018/12/LLJ_110n4_02_hellyer.pdf · זווית: Headnote/holding selection at commercial citators · טענות: 5
|
||||
- [secondary] https://library.law.northwestern.edu/cases/updating · זווית: Headnote/holding selection at commercial citators · טענות: 2
|
||||
- [secondary] https://guides.law.stanford.edu/cases/keynumbersystem · זווית: Headnote/holding selection at commercial citators · טענות: 4
|
||||
- [primary] https://proceedings.iclr.cc/paper_files/paper/2025/file/08dabd5345b37fffcbe335bd578b15a0-Paper-Conference.pdf · זווית: Selective prediction / conformal abstention thresholds · טענות: 5
|
||||
- [primary] https://arxiv.org/html/2512.12844 · זווית: Selective prediction / conformal abstention thresholds · טענות: 5
|
||||
- [primary] https://arxiv.org/pdf/2407.18370 · זווית: Selective prediction / conformal abstention thresholds · טענות: 5
|
||||
- [primary] https://sinatayebati.github.io/vlm-uncertainty/ · זווית: Selective prediction / conformal abstention thresholds · טענות: 5
|
||||
- [primary] https://openreview.net/forum?id=JJPAy8mvrQ · זווית: Selective prediction / conformal abstention thresholds · טענות: 4
|
||||
- [primary] https://arxiv.org/abs/2407.18370 · זווית: Multi-model agreement & trust-or-escalate routing · טענות: 4
|
||||
- [primary] https://arxiv.org/pdf/2511.07396 · זווית: Multi-model agreement & trust-or-escalate routing · טענות: 5
|
||||
- [primary] https://arxiv.org/html/2605.18796 · זווית: Multi-model agreement & trust-or-escalate routing · טענות: 4
|
||||
- [primary] https://www.cs.cornell.edu/~tj/publications/joachims_etal_17a.pdf · זווית: Implicit feedback active learning vs upfront review · טענות: 5
|
||||
- [primary] https://www.cs.cornell.edu/people/tj/publications/radlinski_joachims_05a.pdf · זווית: Implicit feedback active learning vs upfront review · טענות: 5
|
||||
- [primary] https://dl.acm.org/doi/10.1145/1229179.1229181 · זווית: Implicit feedback active learning vs upfront review · טענות: 5
|
||||
- [primary] https://arxiv.org/pdf/2403.18962 · זווית: Implicit feedback active learning vs upfront review · טענות: 5
|
||||
- [primary] https://arxiv.org/abs/2407.12170 · זווית: RAG corpus pruning vs rank-at-retrieval · טענות: 3
|
||||
- [primary] https://arxiv.org/abs/2511.00505 · זווית: RAG corpus pruning vs rank-at-retrieval · טענות: 4
|
||||
- [primary] https://arxiv.org/html/2409.13694v2 · זווית: RAG corpus pruning vs rank-at-retrieval · טענות: 4
|
||||
@@ -0,0 +1,51 @@
|
||||
# 04 — הקאנון-הידני של דפנה כ-Ground-Truth לחשיבות
|
||||
|
||||
> קלט לסינתזה. מנתח את [`daphna-precedent-network.md`](daphna-precedent-network.md) — "הקאנון של דפנה" —
|
||||
> כסיגנל-החשיבות שהאוטומציה מנסה לשחזר, ואיך לחבר אותו ל-RAG. נתונים חיים 2026-06-20.
|
||||
|
||||
## 1. מה הקאנון, ולמה הוא הקלט הכי חשוב
|
||||
מסמך `daphna-precedent-network.md` ממפה **לפי סוגיה משפטית** (זכות-עמידה, הלכת-שפר, טענות-קנייניות,
|
||||
שימוש-חורג, תמ"א 38, תכניות-ישנות...) את **התקדים-המועדף של דפנה** לכל סוגיה — מקריאת 33 החלטות.
|
||||
זהו **בדיוק ה"חשיבות" שאנחנו רוצים, ובגרנולריות הנכונה** (סוגיה/הלכה, לא פס"ד גס) — והוא **כבר עשוי
|
||||
ידנית, מאומת ע"י היו"ר**. כל מנגנון-החשיבות האוטומטי הוא ניסיון **לשחזר ולהרחיב** אותו, לא להמציא.
|
||||
|
||||
## 2. אימות: הקאנון מתואם עם תדירות-הציטוט (הסיגנל האוטומטי)
|
||||
בדיקה חיה — תקדימי-הליבה של הקאנון מול ספירת-הציטוטים בנתונים שלנו:
|
||||
|
||||
| תקדים-קאנון | בקורפוס? | מצוטט בנתונים |
|
||||
|-------------|:---:|:---:|
|
||||
| עע"מ 317/10 שפר | ✅ | **7×** |
|
||||
| ע"א 3213/97 נקר | ✅ (2) | **6×** |
|
||||
| בג"ץ 1578/90 אייזן | ✅ | 3× |
|
||||
| ע"א 6291/95 בן-יקר-גת | ✅ | 2× |
|
||||
| בג"ץ 910/86 רסלר | ✅ | 1× |
|
||||
| עע"מ 9387/17 מרכז-למשפטים | ✅ | 1× |
|
||||
| **בג"ץ 5145/00 חוף-השרון** (הרכב-7) | ❌ **חסר** | 2× |
|
||||
| **עע"מ 8909/13 הרמלין** | ❌ **חסר** | 1× |
|
||||
|
||||
**שתי מסקנות:**
|
||||
1. **תדירות-הציטוט מתואמת עם הקאנון** — מצוטטי-הראש (317/10→7, 3213/97→6) הם בדיוק תקדימי-הקאנון.
|
||||
זה **מאמת את סיגנל-תדירות-הציטוט כפרוקסי-חשיבות** (וגם נותן לנו ground-truth לכייל מולו).
|
||||
2. **הקאנון חושף פערי-קורפוס:** תקדימי-יסוד (חוף-השרון הרכב-7, הרמלין) **חסרים מהקורפוס** — הכותב
|
||||
לא יכול לצטטם נכון. הקאנון = **רשימת-קניות** של פסיקה-מרכזית להטמיע.
|
||||
|
||||
## 3. איך מחברים את הקאנון ל-RAG (4 שימושים)
|
||||
1. **זריעת-חשיבות:** תקדימי-הקאנון מקבלים `importance_score` מקסימלי **מיד** (לא מחכים שהגרף יצבור) —
|
||||
ground-truth ידני גובר על כל פרוקסי.
|
||||
2. **מיפוי סוגיה→תקדים (context-aware):** הקאנון מובנה כ"לסוגיה X → תקדים מועדף Y" — בדיוק הדירוג
|
||||
מודע-ההקשר שהמחקר (ICAIL 2021) המליץ: בזיהוי-הסוגיה בטיוטה, לצוף את התקדים-הקאנוני. דורש לחלץ
|
||||
את הקאנון לטבלה מובנית (`issue → preferred_precedents`), לא טקסט-פרוזה.
|
||||
3. **כיול:** הקאנון הוא ה-gold-set לאמת **כל** סיגנל-חשיבות אוטומטי (האם הוא מדרג את הקאנון גבוה?).
|
||||
4. **רשימת-פערים:** תקדימי-קאנון-חסרים (חוף-השרון, הרמלין...) → תור-הטמעה ל-court-fetch (X13).
|
||||
|
||||
## 4. סיכון/מגבלה
|
||||
- **נקודה-בזמן:** הקאנון נקבע מ-33 החלטות; דפנה ממשיכה. צריך **רענון** מציטוטיה החדשים (active-learning) —
|
||||
המסמך עצמו אומר זאת (§6). הסיגנל-האוטומטי שומר אותו חי בין עדכונים-ידניים.
|
||||
- **כיסוי-חלקי:** הקאנון מכסה ~20 סוגיות-ליבה של 1xxx; 8xxx/9xxx (היטל-השבחה/פיצויים) מכוסים פחות.
|
||||
- כבר קרוא ע"י סוכני `legal-researcher`/`legal-writer` — אבל כ**טקסט-פרוזה**, לא כסיגנל-דירוג מובנה.
|
||||
|
||||
## 5. מה הסינתזה צריכה להכריע
|
||||
- **א.** האם להפוך את הקאנון ל**טבלה מובנית** (`canon`: issue → precedents → her-framing-phrase) שמזינה
|
||||
גם את הדירוג וגם את הסוכן? (ממליץ: כן — זה ה-bridge בין ground-truth-ידני ל-RAG.)
|
||||
- **ב.** איך מתחזקים אותו אוטומטית מציטוטי-דפנה החדשים בלי סקירה (active-learning)?
|
||||
- **ג.** האם פערי-הקאנון (תקדימים-חסרים) מצדיקים מסע-הטמעה ממוקד דרך X13?
|
||||
@@ -0,0 +1,68 @@
|
||||
# 05 — חוזה-הקליטה, ריקות-גרף-הציטוטים, ו-V41 האינרטי
|
||||
|
||||
> קלט לסינתזה. שלושת מחוללי-הכאב הטכניים, עם מספרים חיים (2026-06-20). משלים את [01](01-claude-architecture-data-audit.md)
|
||||
> בנתונים מדויקים ומתקן שתי קריאות.
|
||||
|
||||
## 1. חוזה-הקליטה — הכאב הוא **כולו במסלול-החיצוני**
|
||||
```text
|
||||
source_kind total ללא practice_area ללא summary ללא full_text
|
||||
external_upload 239 209 (87%) 2 0
|
||||
internal_committee 93 0 0 0
|
||||
cited_only 31 31 25 31
|
||||
```
|
||||
**קריאות מתוקנות:**
|
||||
- **87% מהפסיקה-החיצונית (209/239) ללא practice_area** — חד ויותר ממה ש-01 דיווח (66% על-פני-הכל).
|
||||
סינון-לפי-תחום באחזור **לא עובד על פסיקה חיצונית**. הכאב **כולו במסלול `precedent_library_upload`**;
|
||||
המסלול-הפנימי (`internal_decision_upload`) **שלם ב-100%**.
|
||||
- **ה-31 "השבורים" אינם שבורים — הם `cited_only` stubs** (אזכור לפס"ד שאין לנו את גופו). ריקים-בכוונה.
|
||||
**תיקון לקריאת-01:** לא למחוק אותם; הם נקודות-עוגן לגרף-הציטוטים.
|
||||
|
||||
**המשמעות:** "התיקונים האינסופיים" של חיים = העדר-אכיפה ב-upload-החיצוני בלבד. **תיקון-במקור (G1):**
|
||||
או חילוץ-אוטומטי של practice_area בקליטה, או `searchable=false` עד שהמטא שלם — נקודה אחת, מסלול אחד.
|
||||
|
||||
## 2. גרף-הציטוטים — **קיים-מחושב אך כמעט-ריק**
|
||||
```text
|
||||
PageRank/אשכולות מחושבים ✅ web/graph_metrics.py · graph_api.py
|
||||
ציטוטים מהחלטות דפנה (42 החלטות) 398 ← ~כל הסיגנל
|
||||
ציטוטים מ-91 ועדות-אחרות 0 ← לא חולצו (extract_internal_citations לא רץ עליהן)
|
||||
ציטוטים בין פס"ד-חיצוניים 0 ← אין קשתות ביניהם בכלל
|
||||
```
|
||||
**המשמעות הקריטית:** המחקר ([02](02-deep-research-importance-recommendation.md)) המליץ centrality על
|
||||
גרף-ציטוטים — **אבל אין גרף**. ל-PageRank אין כמעט קשתות. הסיגנל-האוטומטי-היחיד היום = 398 ציטוטי-דפנה
|
||||
(שמתואמים עם הקאנון, [04](04-daphna-canon-as-importance-ground-truth.md) §2).
|
||||
|
||||
**שתי דרכים (להכרעת-הסינתזה):**
|
||||
- **(א) לצופף את הגרף** — להריץ את ה-citator (`extract_internal_citations` / X11) על **כל 363 הפסקים**
|
||||
(גם 91 ועדות-אחרות, גם פס"ד-חיצוניים) → גרף אמיתי → PageRank משמעותי. **מאמץ בינוני, ערך גבוה ומצטבר.**
|
||||
- **(ב) להישען על הקאנון + ציטוטי-דפנה + יומונים** — בלי לחכות לגרף. מהיר, אבל מכסה פחות.
|
||||
- **לא בלעדי:** (א) ו-(ב) משלימים — קאנון כזריעה מיידית, גרף-מצופף כשכבה-מצטברת.
|
||||
|
||||
## 3. V41 (canonical) — **100% תקוע, לא רק "0 published"**
|
||||
```text
|
||||
canonical_halachot review_status:
|
||||
pending_synthesis 5,472 (100%)
|
||||
pending_review 0
|
||||
approved 0
|
||||
published 0
|
||||
```
|
||||
**זו לא "שכבה חלשה" — זו שכבה שמעולם לא הפיקה דבר.** **כל** 5,472 הקנוניים תקועים במצב-הראשון.
|
||||
מנגנון-ה-V41 (pending_synthesis → pending_review → approved → published) **דורש מעבר דרך אישור-יו"ר**
|
||||
כדי להגיע לכותב (INV-G10).
|
||||
|
||||
**ההתנגשות שהסינתזה חייבת להכריע:** הארכיטקטורה של V41 **בנויה על אישור-יו"ר** — וזה **מתנגש ישירות
|
||||
עם אילוץ אפס-הביקורת של חיים.** שלוש אפשרויות:
|
||||
1. **לעקוף את V41** — דירוג-בזמן-אחזור ישירות על `halachot`/chunks (המחקר נוטה לכאן); V41 הופך
|
||||
לאופציונלי/נדחה.
|
||||
2. **לשנות-ארכיטקטורה את V41** — שער-conformal אוטומטי במקום אישור-ידני (רק שבריר חסום מסלים).
|
||||
3. **לקבל ש-V41 לכתיבה-בלבד-אחרי-אישור** — אבל אז הוא נשאר אינרטי עד שמישהו מאשר (מצב-היום).
|
||||
|
||||
> הקשר: הסינתזה שבניתי (PR#304) הופכת pending_synthesis→pending_review — **הצעד הראשון אי-פעם** —
|
||||
> אבל גם הוא נעצר באישור-יו"ר. לכן עצם-קיומו של V41 כפוף להכרעה זו.
|
||||
|
||||
## 4. מה הסינתזה צריכה להכריע (תמצית)
|
||||
| # | נושא | אפשרויות |
|
||||
|---|------|----------|
|
||||
| 1 | חוזה-קליטה חיצוני | חילוץ-auto של practice_area · / · `searchable=false` עד-שלם |
|
||||
| 2 | גרף-ציטוטים | לצופף (citator על כל 363) · / · להישען על קאנון+דפנה+יומונים · / · שניהם |
|
||||
| 3 | V41 canonical | לעקוף (דרג-על-halachot) · / · conformal-gate · / · להשאיר-מגודר-יו"ר |
|
||||
| 4 | פסיקה-חסרה | להטמיע תקדימי-קאנון-חסרים (חוף-השרון, הרמלין) דרך X13 |
|
||||
@@ -0,0 +1,125 @@
|
||||
# 06 — נדיבות-המחלץ: `application` בהחלטות-ועדה (כימות חוצה-קורפוס)
|
||||
|
||||
> **קלט-נתונים** ליוזמה, נמדד חי על **5,489 רשומות `halachot`** (כל הקורפוס, 2026-06-20).
|
||||
> נולד משאלת-חיים: "8508-03-24 מפיק 71 הלכות ממתינות — האם המחלץ נדיב מדי על החלטות-ועדה,
|
||||
> או שזה ספציפי לתיק הזה?" התשובה: **שיטתי, לא ספציפי — אבל הנדיבות מוצדקת.**
|
||||
>
|
||||
> **מתכתב עם [`00-final-synthesis.md`](00-final-synthesis.md):** הנתונים כאן **מחזקים** את הכרעת-הסינתזה
|
||||
> ("לא לחתוך") ומוסיפים שני דברים שלא היו לה: (א) כימות חוצה-קורפוס של ה-`application`, (ב) ממצא
|
||||
> חדש וגדול יותר — `nli_unsupported` על הפסיקה החיצונית. ראה §4 (יישוב-מתח) ו-§5 (דרכי-פעולה).
|
||||
|
||||
---
|
||||
|
||||
## 1. הממצא המרכזי — `application` הוא תופעה שיטתית של החלטות-ועדה
|
||||
|
||||
הפרדנו את הקורפוס לפי `authority` (נגזר דטרמיניסטית מ-`precedent_level`, [02-data-model §162](../spec/02-data-model.md)):
|
||||
`binding` = פסיקת-עליון/מנהלי · `persuasive` = ועדת-ערר מחוזית.
|
||||
|
||||
```text
|
||||
source rows rt=application nli_unsupported any-flag
|
||||
court (binding) 3,603 0.2% 39.7% 45.4%
|
||||
committee (persuasive) 1,842 13.7% 25.0% 30.5%
|
||||
```
|
||||
|
||||
- **`rule_type='application'` הוא כמעט-בלעדית של ועדות:** 13.7% מול 0.2%. מתוך 258 רשומות-`application`
|
||||
בכל הקורפוס, **~252 מגיעות מהחלטות-ועדה.** פער של פי-~70.
|
||||
- **עקבי בין תחומים** (לא עניין-שמאות נקודתי):
|
||||
```text
|
||||
committee, rt=application by practice_area:
|
||||
rishuy_uvniya 13.5% betterment_levy 14.1% compensation_197 18.8%
|
||||
```
|
||||
|
||||
**הפרשנות (תואם [02-data-model §163](../spec/02-data-model.md)):** `application` = "החלה תלוית-עובדות —
|
||||
לרוב לא-הלכה". ועדת-ערר היא גוף מיישֵם: היא לא יוצרת הלכה (רק בית-משפט עושה זאת), אלא **מיישמת
|
||||
פסיקת-עליון קיימת** (לוסטרניק, דלי-דליה) על עובדות-התיק. לכן חילוץ מהחלטת-ועדה מייצר באופן מובנה
|
||||
שיעור גבוה של יישומי-דוקטרינה. **זו תכונה של מקור-הנתונים, לא באג של המחלץ.**
|
||||
|
||||
## 2. 8508-03-24 — מייצג בקצה-העליון, לא חריג
|
||||
|
||||
```text
|
||||
דירוג 8508-03-24: 7 מתוך 45 תיקי-ועדה (≥15 רשומות) · 27% application (rt או flag)
|
||||
חציון תיקי-הוועדה: 11.9%
|
||||
מעליו: 1001-02-19 (40%) · 1044-08-22 (37%) · 9002-24 (33%) · 1007-01-25 (30%)
|
||||
```
|
||||
|
||||
8508 הוא ~פי-2.3 מהחציון (רבעון-עליון), אבל מה שבולט בו הוא בעיקר ש**הוא התיק הארוך בקורפוס**
|
||||
(111 רשומות) — אז 27% נותן 30 פריטי-`application` במספר מוחלט, הגבוה בקורפוס. כלומר: **כמות גבוהה,
|
||||
שיעור גבוה-אך-נורמלי.** אין כאן פתולוגיה ייחודית לתיק.
|
||||
|
||||
## 3. מנגנון-הניתוב הקיים (איך זה כבר מטופל ב-UI)
|
||||
|
||||
הפיצול בתור-ההלכות (`/precedents` → "תור הלכות") אינו לפי `exclude_low_quality`, אלא לפי
|
||||
`isExtractionFixItem(h) = (quality_flags.length>0) && !panel_round`
|
||||
([web-ui/.../precedent-library.ts:652](../../web-ui/src/lib/api/precedent-library.ts#L652)):
|
||||
|
||||
```text
|
||||
8508-03-24, 71 ממתינות (מצב 2026-06-20):
|
||||
bucket # panel? →"להכרעתך" →"דורש תיקון-חילוץ"
|
||||
clean (ללא דגל) 40 15/40 40 0
|
||||
application 23 0/23 0 23
|
||||
nli_unsupported 4 4/4 4 0
|
||||
thin_restatement 4 0/4 0 4
|
||||
```
|
||||
|
||||
**משמעות:** פריטי-`application` (חסרי-פאנל) כבר מנותבים ל**"דורש תיקון-חילוץ"** — **מחוץ** לתור-ההכרעה
|
||||
של היו"ר. כלומר המערכת כבר מסננת אותם מהעומס-הידני. (הפאנל התלת-מודלי, [halacha_panel_approve.py:191](../../scripts/halacha_panel_approve.py#L191),
|
||||
מטפל רק בדליים `clean`+`nli`; `application` ו-`defect` עוקפים אותו במכוון.)
|
||||
|
||||
## 4. ⚠️ יישוב-המתח מול הסינתזה — `application` ≠ "רעש"
|
||||
|
||||
זו הנקודה הקריטית להעברה. **אסור** לתרגם "13.7% application" ל"13.7% רעש לחיתוך". המבחן בסינתזה
|
||||
(§2 שם) כבר הוכיח שחיתוך-אגרסיבי על 8508 השמיד את **לוסטרניק** ו-~22 עקרונות-ליבה. רוב פריטי-ה-`application`
|
||||
הם בדיוק יישומי-הדוקטרינה הללו — **בני-ציטוט שהכותב צריך**. דוגמאות אמיתיות מ-8508 שמסומנות `application`:
|
||||
|
||||
```text
|
||||
"ציפיות הנובעות אך ממיקומם של המקרקעין... אין לנטרלן" ← לוסטרניק מיושמת — לשמור!
|
||||
"בחישוב שווי במצב קודם יש לכלול ציפיות כלליות... ולא ספציפיות" ← ליבת חישוב היטל-ההשבחה
|
||||
"קביעת מקדם מצויה בליבת שיקול-דעת השמאי, והוועדה לא תתערב" ← סטנדרט אי-התערבות מיושם
|
||||
```
|
||||
|
||||
לכן: **הנתון הזה תומך ב"שמור-בספק" של עמוד-1/2 בסינתזה.** המסקנה הנכונה אינה "לסנן application" אלא
|
||||
"`application` מאשר שעקרוני-הוועדה הם persuasive-יישומיים — לדרג אותם נמוך באחזור (רמה B), לא למחוק
|
||||
אותם (רמה A)". `importance=0` ל-8508 כבר משקיע אותם ממילא.
|
||||
|
||||
## 5. ⭐ ממצא-לוואי גדול יותר — `nli_unsupported` על הפסיקה החיצונית
|
||||
|
||||
```text
|
||||
nli_unsupported: court (binding) 39.7% ≫ committee 25.0%
|
||||
any-flag: court 45.4% · committee 30.5%
|
||||
```
|
||||
|
||||
**כמעט מחצית מעקרוני-הפסיקה-החיצונית נושאים דגל-איכות, בעיקר `nli_unsupported`** (הכלל אינו נגזר
|
||||
לוגית מהציטוט התומך שלו, [halacha_quality.py:282](../../mcp-server/src/legal_mcp/services/halacha_quality.py#L282)).
|
||||
זה **מגמד מספרית** את סוגיית-ה-`application`, ונוגע ישירות ל"רמה A = ניקוי-רעש" של הסינתזה:
|
||||
**מהו ה"רעש" שמנקים?** הדגל הדומיננטי הוא `nli`, והוא מרוכז בפסיקה, לא בוועדות.
|
||||
|
||||
שתי השערות מתחרות, שצריך להכריע ביניהן **לפני** שמשתמשים ב-`nli` כמסנן-רעש ברמה A:
|
||||
- **(א) הבודק מחמיר מדי** — סף-ה-NLI חותך יישורים לגיטימיים → 40% הם false-positives, וה"רעש" מדומה.
|
||||
- **(ב) החילוץ-מהפסיקה לקוי** — ציטוטים תומכים שלא מיישרים לכלל → בעיית-חילוץ אמיתית בקנה-מידה.
|
||||
|
||||
ההכרעה משנה את כל אסטרטגיית רמה-A. **אנו ממליצים לאמת זאת על מדגם-זהב לפני כל שימוש ב-`nli` כסיגנל.**
|
||||
|
||||
---
|
||||
|
||||
## 6. דרכי-פעולה מוצעות (לסוכן-הקורפוס)
|
||||
|
||||
ממוין מהשמרני לאגרסיבי. ההמלצה שלנו: **B כברירת-מחדל + C כעבודה-מקבילה**; להימנע מ-A ומ-D.
|
||||
|
||||
| # | פעולה | טיעון | סיכון | המלצה |
|
||||
|---|-------|-------|-------|-------|
|
||||
| **A** | לכוונן את ה-prompt לדכא `application` מוועדות במקור | מטפל-בשורש (G1); חוסך 14% רשומות | **גבוה** — סותר את מבחן-8508; משמיד יישומי-לוסטרניק בני-ציטוט | ✗ לא |
|
||||
| **B** | להשאיר את החילוץ; לסמוך על הניתוב הקיים (`application`→"תיקון", מחוץ לתור-היו"ר) + לדרג נמוך ב-RRF | תואם-סינתזה (שמור-בספק + דרג-בזמן-אחזור); אפס סיכון-אובדן | הרעש נשאר ב-DB (אחסון בלבד) | ✓ **כן — ברירת-מחדל** |
|
||||
| **C** | לחקור קודם את `nli_unsupported` (40% פסיקה): מדגם-זהב, להכריע (א) מחמיר-מדי מול (ב) חילוץ-לקוי | זה הסיגנל הגדול; הכרחי לפני שמגדירים "רעש" ברמה A | דורש מדגם מתויג-ידנית | ✓ **כן — במקביל** |
|
||||
| **D** | להפסיק חילוץ-עקרונות מוועדות לגמרי | רוב עקרוני-הוועדה הם שכתוב-persuasive של עליון | **קיצוני** — נוגד 07-learning §61 (ועדות ברות-ציטוט במכוון); נוגע INV-LRN | ✗ לא (אלא בהכרעת-יו"ר מפורשת) |
|
||||
|
||||
### ההמלצה המזוקקת
|
||||
1. **לא לגעת בחילוץ-מוועדות** — הנתון מאשר שהנדיבות מוצדקת; `application`=יישום-בר-ציטוט, לא זבל. עקבי עם
|
||||
הכרעת-הסינתזה "לא לחתוך".
|
||||
2. **רמה B עושה את העבודה** — `importance` boost ב-RRF מטביע את עקרוני-הוועדה ה-persuasive מתחת
|
||||
לפסיקה-המחייבת, בלי למחוק דבר. 8508 (`importance≈0`) שוקע ממילא.
|
||||
3. **להעביר את ה-`nli` לראש תור-המחקר** — לפני שמשתמשים בו כמסנן-רעש ברמה A, לאמת אם 40% אמיתי.
|
||||
|
||||
---
|
||||
|
||||
> **מקור-הנתונים:** `GET /api/halachot?limit=100000` (5,489 שורות) + per-case `?case_law_id=…`.
|
||||
> ניתן לשחזר את כל המספרים מהשאילתות האלו. הקאנון הוא live — שיעורים ינועו ככל שהדריינר/פאנל רצים.
|
||||
1
docs/precedent-corpus-redesign/corpus-analysis.md
Symbolic link
1
docs/precedent-corpus-redesign/corpus-analysis.md
Symbolic link
@@ -0,0 +1 @@
|
||||
../corpus-analysis.md
|
||||
1
docs/precedent-corpus-redesign/corpus-graph.md
Symbolic link
1
docs/precedent-corpus-redesign/corpus-graph.md
Symbolic link
@@ -0,0 +1 @@
|
||||
../corpus-graph.md
|
||||
1
docs/precedent-corpus-redesign/daphna-precedent-network.md
Symbolic link
1
docs/precedent-corpus-redesign/daphna-precedent-network.md
Symbolic link
@@ -0,0 +1 @@
|
||||
../daphna-precedent-network.md
|
||||
1
docs/precedent-corpus-redesign/halacha-strict-rubric.md
Symbolic link
1
docs/precedent-corpus-redesign/halacha-strict-rubric.md
Symbolic link
@@ -0,0 +1 @@
|
||||
../halacha-strict-rubric.md
|
||||
1
docs/precedent-corpus-redesign/legal-principles-redesign.md
Symbolic link
1
docs/precedent-corpus-redesign/legal-principles-redesign.md
Symbolic link
@@ -0,0 +1 @@
|
||||
../legal-principles-redesign.md
|
||||
@@ -0,0 +1 @@
|
||||
../spec/X11-citation-corroboration.md
|
||||
1
docs/precedent-corpus-redesign/spec-X12-digests-radar.md
Symbolic link
1
docs/precedent-corpus-redesign/spec-X12-digests-radar.md
Symbolic link
@@ -0,0 +1 @@
|
||||
../spec/X12-digests-radar.md
|
||||
1
docs/precedent-corpus-redesign/spec-X13-court-fetch.md
Symbolic link
1
docs/precedent-corpus-redesign/spec-X13-court-fetch.md
Symbolic link
@@ -0,0 +1 @@
|
||||
../spec/X13-court-fetch.md
|
||||
57
docs/qa-acceptance-rubric.md
Normal file
57
docs/qa-acceptance-rubric.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# Rubric קבלה של החלטה — מקור-אמת אחד
|
||||
|
||||
מסמך זה הוא **הגדרת ה"מוכן"** של טיוטת החלטה: סף-הקבלה שהכותב **מכוון אליו מראש**
|
||||
וה-QA **אוכף** כשער. שני הסוכנים מפנים לכאן — אין לשכפל את הקריטריונים בקבצי-הסוכן.
|
||||
|
||||
**זהו סף-הקבלה, לא הוראת-הכתיבה.** ה"איך" המלא חי במסמכי-הקול המופנים בכל שורה
|
||||
(`daphna-voice-fingerprint.md`, `daphna-block-zayin-claims.md`,
|
||||
`daphna-architecture-by-outcome.md`, `daphna-acceptance-architecture.md`,
|
||||
`decision-methodology.md`, `anti-hallucination-gate.md`). כאן — רק המבחן.
|
||||
|
||||
> **לכותב:** לפני מסירה ל-CEO, עבור על החוסמים למטה ואשר שכל אחד מתקיים. טיוטה
|
||||
> שלא עוברת חוסם אחד — תוחזר ב-`needs_revision`. כתוב כדי לעבור מהפעם הראשונה.
|
||||
>
|
||||
> **ל-QA:** אלה הקריטריונים ש-7 הבדיקות שלך אוכפות. `fail` על חוסם = `qa_review`;
|
||||
> `fail` על אזהרה = דיווח לחיים, לא חוסם.
|
||||
|
||||
---
|
||||
|
||||
## חוסמי ייצוא (critical — כל אחד מכשיל את הטיוטה)
|
||||
|
||||
1. **שלמות מבנית** — בלוקים ה–יא קיימים; מספור רציף ללא קפיצות/כפילות; "להלן" בשימוש ראשון.
|
||||
2. **רקע ניטרלי (בלוק ו)** — עובדות בלבד; **אפס** ציטוטים מצדדים; **אפס** מילות-שיפוט
|
||||
("חריג", "בעייתי", "מגוחך", "פגום", "שערורייתי").
|
||||
3. **כיסוי טענות** — כל טענה מהותית מבלוק ז קיבלה מענה בבלוק י (ישיר / קיבוץ / ציון שנבחנה).
|
||||
טענות `[skip]` לא נספרות; `[bundle]` נבדקות כקבוצה. טענה מהותית לא-מסומנת שלא נענתה = כשל.
|
||||
4. **מתודולוגיה** — לכל סוגיה מבנה סילוגיסטי (כלל+עובדות+מסקנה); ממצא עובדתי מופרד ממסקנה
|
||||
משפטית; טענת הצד המפסיד הוצגה בחוזקתה (Steel-Man); איזון מפורש כשנדרש; בלי "נוסחאות ריקות";
|
||||
ציטוטים בסנדוויץ' (הקדמה→ציטוט→ניתוח).
|
||||
5. **קול דפנה** —
|
||||
- בלוק ז: כותרת **"תמצית טענות הצדדים"**; כותרת-משנה לכל צד; בלי רשימה ממוספרת בפסקה;
|
||||
בלי מילות-הערכה; בלי גילוי-מסקנה; קול פעיל ("העורר טוען").
|
||||
- בלוק י: כותרת **"דיון והכרעה"**; קול "אנחנו" תפקידי ("מצאנו", לא "הוועדה מוצאת");
|
||||
דפוס **"אכן... אולם"** לטענות שנדחות; בלי מספור-פסקאות סדרתי; ציטוטי פסיקה במלואם (4–15 שורות);
|
||||
"למעלה מן הצורך" לטיעונים מרכזיים; בלי תוצאת הכל-או-לא-כלום כשיש טענות מהותיות משני הצדדים.
|
||||
- 8xxx עם הכרעה שמאית → ציטוט **בר"מ 3644/13** קיים.
|
||||
6. **עיגון-מקור (INV-AH)** — כל אזכור פסיקה/חוק/הלכה/מספר מעוגן-מקור עם ציטוט; ציטוט חיצוני
|
||||
תואם להלכה מאושרת בקורפוס (`search_precedent_library`). אזכור לא-מעוגן = הסר או הורד ל-`[ספקולציה]`.
|
||||
7. **צירוף פסיקה ל-DB** — כל ציטוט בבלוק י (חיצוני/internal) רשום ב-`case_precedents` דרך
|
||||
`precedent_attach`. ציטוט שקיים רק בטקסט ולא ב-DB = חוסם (ה-exporter ו-Hermes קוראים מה-DB).
|
||||
8. **log שאילתות-קורפוס** — `analysis-and-research.md` §7א ו-`precedent-research.md` §ז קיימים,
|
||||
עם מינימום queries לקורפוס הסמכותי (`analyst ≥ טענות-סף + סוגיות`; `researcher ≥ סוגיות`)
|
||||
ותיעוד negative-evidence (גם 0-results).
|
||||
|
||||
## אזהרות (warning — מדווח לחיים, לא חוסם)
|
||||
- **משקלות בטווח:** ו 15–40% · ז 20–40% · י 32–50% · יא 2–9%.
|
||||
- **בלי כפילות:** בלוק י מפנה לבלוקים קודמים ("כאמור"), לא חוזר על עובדות/טענות.
|
||||
- **מראה-מקום מלא בציטוטים:** מספר-תיק מלא + ערכאה + תאריך/`פורסם בנבו` (+ `page_reference` לציטוט ארוך).
|
||||
|
||||
## אם תוצאה = קבלה (מ-`daphna-acceptance-architecture.md`)
|
||||
- התבנית הנבחרת (A/B/C/D/E) מתאימה לסיבת-הקבלה, ופורמט-הסיום תואם לתבנית
|
||||
(A: "מתבטלת" + הודאת-צד-נגדי; B: "תיקבע לדיון"; C: "בכפוף לתיקונים" + הכרה בוועדה;
|
||||
D: "דרישת התשלום בטלה"; E: "השומה תושב לתיקון").
|
||||
|
||||
---
|
||||
|
||||
> **מקור-אמת:** חומרת-הבדיקות המחייבת חיה ב-`.claude/agents/legal-qa.md` ("7 בדיקות" + טבלת-חומרה)
|
||||
> וב-`docs/spec/05-qa-review.md`. Rubric זה הוא התמצית המשותפת — כשמשתנה שער QA, עדכן שם ואת התמצית כאן.
|
||||
@@ -96,10 +96,11 @@ idempotency-key pattern · ISO 8000 (Data quality) | סטטוס: verified
|
||||
בנקודת-סיום-הקליטה, לכל סוג; חוזה-שלמות יסמן רשומה ללא מטא-דאטה כלא-שמישה
|
||||
([G4](00-constitution.md#inv-g4-חוזה-שלמות-לפני-שמיש--ניתן-לחיפוש), מפורט ב-
|
||||
[02-data-model.md](02-data-model.md)).
|
||||
**הפרה ידועה:** המסלול הפנימי (`internal_decisions.py:208`) מתזמן **רק**
|
||||
`request_halacha_extraction` ואינו קורא ל-`request_metadata_extraction` (בניגוד
|
||||
ל-`precedent_library.py:292-293` שקורא לשניהם) → ערן סופר 8046/24 נקלטה **בלי
|
||||
metadata** (headnote/summary/tags ריקים) → ממצא ל-[audit](../audit-report.md).
|
||||
**הפרה ידועה — ✅ נסגרה (FU-1, GAP-02):** המסלול הפנימי דילג בעבר על חילוץ-המטא-דאטה
|
||||
(`internal_decisions.py:208` תיזמן רק `request_halacha_extraction`) → ערן סופר 8046/24 נקלטה
|
||||
בלי metadata. **נסגר:** שני מסלולי-הפסיקה זורמים כעת דרך `ingest.ingest_document` הקנוני, שמתזמן
|
||||
**את שני התורים יחד** בנקודה אחת (`ingest.py:233-234`) — תיזמון-המטא אינו מותנה במסלול עוד.
|
||||
מאומת ב-`test_unified_ingest.py` (9/9). תיעוד-מקור: [audit](../audit-report.md).
|
||||
|
||||
### INV-ING4: re-index בקליטה-חוזרת (upsert ⇒ re-embed)
|
||||
**כלל:** קליטה-חוזרת ששינתה את תוכן-הפריט מפעילה **re-index** — chunks ו-embeddings
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
| ישות | תפקיד | מזהה-קנוני | שדות-מפתח (מאומתים `db.py`) |
|
||||
|------|--------|-------------|------------------------------|
|
||||
| `cases` | תיק ערר חי (1xxx/8xxx/9xxx) | `case_number` + `proceeding_type` | `title`, `status`, `practice_area`, `appeal_subtype`, `proceeding_type`, `chair_name` (`db.py:74-91,182-189,747,912`) |
|
||||
| `documents` | מסמך-מקור משויך לתיק | `id` (UUID); FK→`cases` | `doc_type`, `title`, `file_path`, `extracted_text`, `extraction_status`, `page_count` (`db.py:93-104`) |
|
||||
| `documents` | מסמך-מקור משויך לתיק | `id` (UUID); FK→`cases` | `doc_type`, `is_primary` (**נגזר** מ-`doc_type`, ראה [§2ג](#2ג-מסמך-עיקרי-primary-document)), `title`, `file_path`, `extracted_text`, `extraction_status`, `page_count` (`db.py:93-104`) |
|
||||
| `document_chunks` | chunk של מסמך-תיק + embedding | `id`; FK→`documents`/`cases` | `chunk_index`, `content`, `section_type`, `embedding vector(1024)`, `page_number` (`db.py:106-116`) |
|
||||
| `case_law` | קורפוס פסיקה — חיצוני **וגם** החלטות-ועדה | ראה [§2 + INV-DM2](#inv-dm2-מזהה-קנוני-יחיד-לכל-ישות) | `case_name`, `court`, `practice_area`, `source_kind`, `proceeding_type`, `source_type`, `headnote`, `summary`, `subject_tags`, `extraction_status`, `halacha_extraction_status` (`db.py:366-378,522-526,599-611,883,907`) |
|
||||
| `precedent_chunks` | chunk של פסק-דין מואנדקס (`source_kind='external_upload'`/`internal_committee`) | `id`; FK→`case_law` | `chunk_index`, `content`, `section_type`, `page_number`, `embedding vector(1024)`, `content_tsv` (`db.py:624-634,776`) |
|
||||
@@ -73,11 +73,45 @@ proceeding_type)`. לכן המזהה הקנוני הוא **(`case_number` מנו
|
||||
### 2ב. חוזה תמציתי לישויות נוספות
|
||||
|
||||
- `documents` → usable: `file_path`+`doc_type`; searchable: `extraction_status=completed` ו-`extracted_text` לא-ריק ו-≥1 `document_chunk` עם embedding.
|
||||
> **עיצוב-מחדש זרימת-העבודה (WS2, #200):** `documents` מקבל `is_primary`/`doc_category` (רשימה
|
||||
> קנונית: ערר/תשובה/תגובה/פרוטוקול/שומה/החלטת-ועדה) + דגל-ניתוח per-מסמך (`claims_extraction_status`),
|
||||
> כדי לחשב "יש מסמך-עיקרי שלא-נכלל-בניתוח". השדות בבעלות #200; ניתוח-החילוץ עצמו ב-[04-analysis-writing](04-analysis-writing.md) §1.
|
||||
- `halachot` → usable: `rule_statement`+`supporting_quote`; **searchable: `review_status ∈ {approved, published}` בלבד** — `pending_review`/`rejected` מוסתרות מ-`search_precedent_library` (שער-הלכה ידני, `db.py:644-660`, [G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant)).
|
||||
- `decision_blocks` → usable: `block_id`∈12-הבלוקים; "מוכן": `status=final` ו-`content` לא-ריק.
|
||||
- `chair_feedback` → usable: `feedback_text`+`category` מהמילון; "פתוח" עד `resolved=true`.
|
||||
|
||||
### 2ג. ישויות-נגזרות (אחסון-ניתוחים)
|
||||
### 2ג. מסמך-עיקרי (primary document)
|
||||
|
||||
WS2 (#200) מבחין בין **מסמך-עיקרי** (מסמך-מהות שהיו"ר עוקבת אחריו לניתוח) לבין מסמך-משני.
|
||||
**הרשימה הקנונית של doc_types עיקריים** (מאושרת-יו"ר): `appeal` (כתב-ערר) · `response`
|
||||
(תשובה/תגובה) · `objection` (התנגדות) · `protocol` (פרוטוקול-דיון) · `appraisal` (שומה) ·
|
||||
`decision` (החלטת-ועדה). **כל doc_type אחר משני** (`plan`/`permit`/`court_decision`/
|
||||
`exhibit`/`reference`).
|
||||
|
||||
**`is_primary` נגזר, לא נכתב** ([G1](00-constitution.md#inv-g1-מזהה-קנוני-מנורמל-בכתיבה)/[G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)/
|
||||
[INV-DM7](#inv-dm7-סיווג-הלכה--סמכות-נגזרת--תפקיד-כלל-מסווג-שני-צירים-לא-enum-אחד)): מקור-האמת היחיד הוא
|
||||
`doc_type` + הרשימה הקנונית `PRIMARY_DOC_TYPES` (`db.py`). העמודה
|
||||
`documents.is_primary BOOLEAN GENERATED ALWAYS AS (doc_type = ANY(PRIMARY_DOC_TYPES)) STORED`
|
||||
(SCHEMA_V47) מחושבת ע"י Postgres — **אין מסלול-כתיבה מקביל ולא יכולה לסטות** מ-`doc_type`,
|
||||
בדיוק כמו ה-tsvectors ב-[INV-DM3](#inv-dm3-שינוי-תוכן--re-index). `_row_to_doc` גוזר גם בקריאה
|
||||
(לרשומות טרום-מיגרציה) ומוסיף `doc_category ∈ {primary, secondary}` לפלט. נחשף דרך
|
||||
`document_list` / `case_get` / API-המסמכים. אינדקס חלקי `idx_documents_primary(case_id) WHERE
|
||||
is_primary` משרת את שאילתת "מסמכים-עיקריים שטרם-נותחו" (#201).
|
||||
|
||||
**דגל "לא-נותח" — per-מסמך (#201, SCHEMA_V49).** שני שדות מתעדים את *אירוע* חילוץ-הטענות
|
||||
של המסמך (לא נגזרים מ-`doc_type`): `claims_extracted_at TIMESTAMPTZ` (נחתם ע"י
|
||||
`claims_extractor` **אחרי** ששמרנו את טענות המסמך) ו-`claims_extraction_status TEXT`
|
||||
(`pending`/`completed`/`no_claims`/`failed`). `_row_to_doc` חושף `claims_analyzed`
|
||||
(`claims_extracted_at IS NOT NULL`). מקור-האמת היחיד ל"האם המסמך נכלל בניתוח" הוא
|
||||
`claims_extracted_at` — לא משוחזר ממקום אחר. אינדקס חלקי `idx_documents_claims_pending(case_id)
|
||||
WHERE is_primary AND claims_extracted_at IS NULL` (יחד עם `is_primary` של V47) הופך את
|
||||
"מסמך-עיקרי שנוסף-אחרי-ניתוח ולא-נכלל" (`db.primary_docs_not_analyzed`) לשאילתה זולה.
|
||||
נחשף ב-`workflow_status` (`primary_docs_not_analyzed` + next-step). הניתוח-מחדש המאחד
|
||||
(`reanalyze_claims`, [04-analysis-writing §1.3](04-analysis-writing.md)) מחלץ-מחדש רק את
|
||||
המסמכים-העיקריים החדשים/לא-נותחו, **מאחד** עם הטענות הקיימות, ומריץ צבירה-מחדש (G2 — מסלול
|
||||
קנוני אחד, לא fork).
|
||||
|
||||
### 2ד. ישויות-נגזרות (אחסון-ניתוחים)
|
||||
|
||||
מעבר לישויות-המקור, המערכת **שומרת ניתוחים נגזרים** — תוצרי-חילוץ של LLM/קוד. אלו כפופים לכללי
|
||||
ה-provenance של [X8](X8-field-provenance.md) ולשערי [G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant):
|
||||
@@ -176,18 +210,22 @@ RAG freshness (Lewis et al., 2020, NeurIPS) | סטטוס: verified
|
||||
(`case_number, source_kind, proceeding_type`, `db.py:904-909`), אך השדה `case_number TEXT
|
||||
UNIQUE NOT NULL` המקורי (`db.py:368`) הוסר רק ב-V15 (`db.py:902-903`) — מורשת שאפשרה את
|
||||
הפרת [INV-DM2](#inv-dm2-מזהה-קנוני-יחיד-לכל-ישות). **יעד:** נרמול-בכתיבה אכוף + ציטוט-מלא רק ב-`citation_formatted`.
|
||||
- **`summary` קיים על `case_law` אך לא בחוזה-הקליטה הפנימי.** העמודה קיימת (`db.py:373`) אך
|
||||
המסלול הפנימי אינו ממלא אותה (כפועל-יוצא מהיעדר חילוץ-מטא-דאטה, [INV-ING3](01-ingest.md#inv-ing3-תור-חילוץ-מטא-דאטה--הלכות-לכל-סוג)).
|
||||
**יעד:** searchable מותנה ב-metadata לא-ריק ([INV-DM1](#inv-dm1-searchable-רק-כשחוזה-השלמות-מתקיים)).
|
||||
- **שני שדות-סטטוס-חילוץ נפרדים, ללא דגל-`searchable` מפורש.** `extraction_status` +
|
||||
`halacha_extraction_status` (`db.py:603-605`) מתארים תהליך, אך אין שדה יחיד שמסמן "עבר
|
||||
חוזה-שלמות → searchable". **יעד:** דגל/view נגזר ש-search מסנן לפיו, מגובה health-check.
|
||||
- **`summary` קיים על `case_law` אך לא בחוזה-הקליטה הפנימי — ✅ נסגר (FU-1, GAP-02).** העמודה
|
||||
קיימת (`db.py:373`), והמסלול הפנימי לא מילא אותה בעבר (היעדר חילוץ-מטא-דאטה). **נסגר:** שני
|
||||
המסלולים זורמים דרך `ingest.ingest_document` הקנוני שמתזמן metadata לשני הסוגים
|
||||
([01-ingest INV-ING3](01-ingest.md#inv-ing3-תור-חילוץ-מטא-דאטה--הלכות-לכל-סוג)); `searchable`
|
||||
מותנה ב-metadata לא-ריק ([INV-DM1](#inv-dm1-searchable-רק-כשחוזה-השלמות-מתקיים)).
|
||||
- **דגל-`searchable` מפורש — ✅ קיים.** מעבר ל-`extraction_status` + `halacha_extraction_status`
|
||||
(`db.py:603-605`, תהליך), קיימת כעת עמודת `case_law.searchable` המסמנת "עבר חוזה-שלמות"; שכבת-
|
||||
החיפוש מסננת לפיה (`cl.searchable = true`, `db.py:7517,7519`) ו-`recompute_searchable_flag`
|
||||
מתחזק אותה. אוכף את [INV-DM1](#inv-dm1-searchable-רק-כשחוזה-השלמות-מתקיים) בשכבת-האחזור.
|
||||
- **`embedding` אינו `GENERATED` (בניגוד ל-tsvector).** ה-tsvectors מסונכרנים אוטומטית
|
||||
(`db.py:776,780,1083`), אך ה-`embedding vector(1024)` תלוי-טריגר חיצוני — נקודת-drift אפשרית
|
||||
ל-[INV-DM3](#inv-dm3-שינוי-תוכן--re-index). **יעד:** טריגר re-embed מובטח + health-check ל-drift.
|
||||
- **`halachot.review_status` כשער-searchable ללא נראות-backlog.** הסינון תקין (`pending_review`
|
||||
מוסתר, `db.py:659`), אך אין נראות כמה ממתינות — תואם את ההפרה הידועה ב-[G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant)
|
||||
(10/19 מאושרות, התגלה במקרה). **יעד:** health-check חושף backlog-הלכות.
|
||||
- **נראות backlog-הלכות — ✅ נסגר (FU-5, GAP-14).** הסינון תקין (`pending_review` מוסתר,
|
||||
`db.py:659`); ההפרה הישנה היתה היעדר-נראות (10/19 מאושרות, התגלה במקרה). **נסגר:** ה-health-
|
||||
check חושף `halacha_backlog` (`web/app.py:2352-2364`, `metrics_service.halacha_backlog`),
|
||||
והכלים `extraction_status` + `halachot_pending` חושפים את עומק-התור — שער-היו"ר ([G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant)) הופך נראה.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -79,11 +79,12 @@ quality / conformance) | סטטוס: verified
|
||||
**אכיפה:** תנאי-`source_kind` בכל ענף-SQL בשכבת-החיפוש; בדיקת-בריאות שמריצה שאילתת-ביקורת
|
||||
(חיפוש מכוון-קורפוס שמחזיר פריט בעל `source_kind` זר = כשל). אוכף את
|
||||
[G5](00-constitution.md#inv-g5-metadata-מלא--הפרדת-קורפוס-נאכפת-בכל-query).
|
||||
**הפרה ידועה:** משימה #56 — `halacha_filters` **אינם** כוללים `cl.source_kind` ב-
|
||||
`search_precedent_library_semantic` (`db.py:3168`, ענף ה-halacha; לעומת `chunk_filters` שכן —
|
||||
`db.py:3169`) **וב**-`search_precedent_library_lexical` (`db.py:3401` מול `db.py:3402`). שני
|
||||
ה-`halacha_sql` עושים `JOIN case_law cl` בלי לסנן `source_kind` (`db.py:3236-3238`, `db.py:3475-3477`)
|
||||
→ הלכות מהקורפוס הפנימי דולפות לתוצאות החיפוש בקורפוס החיצוני ולהפך → ממצא ל-[audit](../audit-report.md).
|
||||
**הפרה ידועה — ✅ נסגרה (FU-4, GAP-10, משימה #56):** בעבר `halacha_filters` לא כללו
|
||||
`cl.source_kind` (בניגוד ל-`chunk_filters` שכן) → הלכות מהקורפוס הפנימי דלפו לחיפוש בקורפוס
|
||||
החיצוני ולהפך. **נסגר:** שני ה-`halacha_filters` (semantic + lexical) מתחילים כעת ב-
|
||||
`cl.source_kind = '{source_kind}'` בדיוק כמו `chunk_filters` (`db.py:7516,7519` ומקבילו ב-
|
||||
`search_precedent_library_lexical`). מאומת ב-`test_precedent_corpus_isolation.py` (semantic+lexical,
|
||||
שני ה-source_kind) → תיעוד-מקור: [audit](../audit-report.md).
|
||||
|
||||
### INV-RET2: אין החזרה/אינדוקס בלי metadata מלא + locator פתיר
|
||||
**כלל:** פריט אינו מוחזר מ-search (ואינו נחשף לאחזור) אלא אם **שדות-החובה שלו מולאו**
|
||||
@@ -121,10 +122,13 @@ relevance judgments, precision/recall) · RAG evaluation literature (Lewis et al
|
||||
Elastic — *relevance evaluation guidance* | סטטוס: verified
|
||||
**אכיפה:** eval harness עם gold-set מתויג + בדיקת-בריאות תקופתית; שער-CI על שינוי שכבת-האחזור.
|
||||
אוכף את [G8](00-constitution.md#inv-g8-איכות-אחזור-נמדדת--precision--recall).
|
||||
**הפרה ידועה (GAP):** אין כיום eval harness ולא gold-set — קיים רק `telemetry.log_search_bg`
|
||||
(`search.py:62,118,190,271`; `precedent_library.py:280`) שמתעד שאילתות בפועל, אך **אינו מודד
|
||||
precision/recall מול תיוג** (תצפית, לא הערכה). היעד: harness שמריץ סט קבוע ומחזיר metrics →
|
||||
ממצא ל-[audit](../audit-report.md).
|
||||
**הפרה ידועה — ✅ נסגרה (FU-5, GAP-11):** בעבר היה רק `telemetry.log_search_bg` (תצפית, לא
|
||||
הערכה). **נסגר:** `scripts/eval_retrieval.py` מריץ את **מסלול-האחזור בייצור** (אותן פונקציות-
|
||||
שירות שכלי-ה-MCP קוראים) מול gold-set מתויג (`data/eval/gold-set.jsonl`, נבנה ב-
|
||||
`scripts/eval_gold_bootstrap.py`) ומחזיר precision/recall/MRR/nDCG@{5,10} — סך-הכול, פר-קורפוס
|
||||
ופר-`practice_area` — מול baseline מקובע (`data/eval/baseline.json`). מטריקות-הליבה נבדקות
|
||||
offline ב-`eval_retrieval.py --self-test` ("ALL PASS"). **משמעת-CI:** להריץ לפני/אחרי כל שינוי
|
||||
שכבת-אחזור (משקלי-RRF/`k`/סף-chunk/embedder/rerank) ולהשוות ל-baseline. תיעוד-מקור: [audit](../audit-report.md).
|
||||
|
||||
### INV-RET5: כל span מוחזר עקיב למקורו
|
||||
**כלל:** כל קטע מוחזר נושא **עקיבוּת-מקור מלאה** — מזהה-מסמך/פסק-דין (`case_law_id`/`document_id`/
|
||||
@@ -156,16 +160,15 @@ re-embed; בדיקת-בריאות מגלה embeddings מיושנים. אוכף
|
||||
|
||||
ההבדלים בין הקוד בפועל ל-TARGET. **אלו תסמינים, לא התנהגויות תקינות.** כל פריט אומת מול הקוד.
|
||||
|
||||
- **דליפת-הלכות חוצת-קורפוס (משימה #56).** `halacha_filters` נפתחים רק עם `review_status`
|
||||
(`db.py:3168`, `db.py:3401`) ואינם מוסיפים `cl.source_kind`, בעוד `chunk_filters` כן
|
||||
(`db.py:3169`, `db.py:3402`). שני ה-`halacha_sql` עושים `JOIN case_law` בלי סינון
|
||||
(`db.py:3236-3242`, `db.py:3463-3482`). **תסמין:** חיפוש בקורפוס החיצוני
|
||||
(`search_precedent_library`, `source_kind="external_upload"`) יכול להחזיר הלכה שמקורה
|
||||
בהחלטת-ועדה פנימית — ולהפך עבור `search_internal_decisions` (`source_kind="internal_committee"`,
|
||||
`internal_decisions.py:418`). **יעד:** `halacha_filters` יתחילו ב-`cl.source_kind = '{source_kind}'`
|
||||
בדיוק כמו `chunk_filters` ([INV-RET1](#inv-ret1-הפרדת-קורפוס-נאכפת-ב-100-ממסלולי-ה-query)).
|
||||
- **אין eval harness — מדידת-איכות לא קיימת.** רק `telemetry.log_search_bg` מתעד שאילתות
|
||||
(`search.py:62,118,190,271`); אין gold-set מתויג ואין precision/recall. **יעד:** harness עומד
|
||||
- **דליפת-הלכות חוצת-קורפוס (משימה #56) — ✅ נסגר (FU-4, GAP-10).** בעבר `halacha_filters` לא
|
||||
כללו `cl.source_kind` (בניגוד ל-`chunk_filters`) → הלכה מהקורפוס הפנימי יכלה לחזור בחיפוש
|
||||
בקורפוס החיצוני, ולהפך. **נסגר:** `halacha_filters` מתחילים כעת ב-`cl.source_kind = '{source_kind}'`
|
||||
+ `cl.searchable = true` בדיוק כמו `chunk_filters` (`db.py:7514-7519`), בשתי הפונקציות
|
||||
(semantic+lexical). מאומת ב-`test_precedent_corpus_isolation.py`
|
||||
([INV-RET1](#inv-ret1-הפרדת-קורפוס-נאכפת-ב-100-ממסלולי-ה-query)).
|
||||
- **eval harness — ✅ נסגר (FU-5, GAP-11).** בעבר רק `telemetry.log_search_bg` (תצפית).
|
||||
**נסגר:** `scripts/eval_retrieval.py` (precision/recall/MRR/nDCG מול `data/eval/gold-set.jsonl`
|
||||
+ baseline; `--self-test` עובר offline) — מדידה אמפירית מול תיוג קבוע
|
||||
([INV-RET4](#inv-ret4-איכות-אחזור-נמדדת-ב-eval-harness-עומד-precision--recall)).
|
||||
- **`search_decisions` מתעד אזהרה כשאין `practice_area` אך לא חוסם.** ללא פילטר-תחום החיפוש
|
||||
עלול לערבב תחומים משפטיים (`search.py:45-49,172-176` — `logger.warning`, ממשיך). **יעד:** הפרדה
|
||||
|
||||
@@ -47,6 +47,122 @@
|
||||
> מקוריות מהשלמות). הסינון לפי `party_role` מאפשר לזהות את הצד המפסיד ולוודא שכל טיעון
|
||||
> שלו מקבל מענה בבלוק י.
|
||||
|
||||
> **עיצוב-מחדש זרימת-העבודה (WS2–WS4) — מסלול-החילוץ אינו מתפצל ([G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)):**
|
||||
> ניתוח-ערר-לבד כבר עובד (`extract_claims` רץ על `appeal` בנפרד). ההרחבות נשענות על אותו צינור-
|
||||
> חילוץ, **לא** על מסלול-ניתוח שני: (א) **ניתוח-מחדש מאחד** (WS2, #200/#201) — מחלץ מ-מסמכים
|
||||
> חדשים/מעודכנים בלבד ומאחד עם הקיים (לא מוחק-ומחשב-מחדש), על-בסיס דגל-הניתוח per-מסמך
|
||||
> ([02-data-model §2ב](02-data-model.md#2ב-חוזה-תמציתי-לישויות-נוספות)); (ב) **סיכום-מנהלים**
|
||||
> (WS3, #202, `summarize_party_claims` — ראה §1.4) — נגזר מ-`claims`/`legal_arguments`, **מסמך-פרוזה נפרד**
|
||||
> מטיוטת-הביניים (G2: תצוגה-נגזרת, לא מקור-אמת שני); (ג) **ניתוח-פרוטוקול** (WS4, #203,
|
||||
> `analyze_protocol` — ראה §1.3) — `protocol` נכנס לחילוץ ההשוואתי (ירד/חוזק/חדש) ומזין ידע-תיק, ונשאר
|
||||
> פוסט-דיון ([INV-WR4](#inv-wr4-בלוק-ז--טענות-מקוריות-בלבד): טענות-פוסט-דיון → בלוק ח, לא ז).
|
||||
> חוזי-הכלים המלאים בבעלות המשימות הנ"ל (§1.3/§1.4); כאן רק עיגון-הספ שהם מקיימים G2.
|
||||
|
||||
### 1.3 ניתוח-פרוטוקול — ניתוח פרוטוקול-דיון השוואתי (WS4 / #203)
|
||||
|
||||
> **בעלוּת תת-סעיף:** §1.3 (זה) שייך ל-WS4 (ניתוח-פרוטוקול). תת-סעיף סיכום-טענות-הצדדים
|
||||
> (PR-אחות #358) הוא **תת-סעיף נפרד** (§1.4) תחת §1 — אין חפיפת-מספור בין השניים.
|
||||
|
||||
אחרי הדיון, פרוטוקול (`doc_type='protocol'`) מנותח **מול הטיעונים המאוגדים** —
|
||||
`analyze_protocol(case_number)` (→ `services/protocol_analyzer.py`). הניתוח מסווג כל
|
||||
טיעון כתוב כ**ירד** (`dropped` — נזנח/ויתר בדיון), **חוזק** (`strengthened`), או מזהה
|
||||
טענה ש**עלתה לראשונה בדיון** (`newly_raised`), ולכל רשומה מנסח את ה**שאלה המשפטית
|
||||
המחודדת** לטובת בלוק י. התוצאה נשמרת ב**ידע-התיק** — טבלת `protocol_analysis` (case-
|
||||
knowledge נגזר; G2: מקור-האמת הוא הפרוטוקול + `legal_arguments`, הרשומה היא השוואה
|
||||
מטוריאליזת בת-שחזור) — וזמינה ל-`get_protocol_analysis(case_number, change_type="")`
|
||||
(סימטריית extract/get, [INV-TOOL4](X9-mcp-tool-contract.md)).
|
||||
|
||||
- **קלט:** הטיעונים המאוגדים (§1.2) הם קו-הבסיס; ללא כינוס אין מול-מה להשוות.
|
||||
- **שער anti-hallucination ([INV-AH](../anti-hallucination-gate.md)):** כל רשומה חייבת
|
||||
`evidence_quote` — ציטוט **מילולי** מהפרוטוקול. רשומה ללא ציטוט-מבסס נדחית **במקור**
|
||||
(`_normalize_change`) ולא מגיעה ל-DB (quote-or-retract).
|
||||
- **טענות-הדיון בנפרד מבלוק ז:** טענות שעלו בדיון מתויגות `claim_type='protocol'`
|
||||
ב-`extract_claims` ו**מוחרגות** מהקשר בלוק ז (`block_writer._build_claims_context`) —
|
||||
בלוק ז נשאר **טענות-כתב מקוריות בלבד** ([INV-WR4](#inv-wr4-בלוק-ז--טענות-מקוריות-בלבד));
|
||||
טענות-הדיון שייכות לבלוק ח (הליכים) ולידע-התיק ההשוואתי.
|
||||
- **נתוני כותרת (א–ד):** הניתוח מחלץ גם את הפיד המוכר (הרכב, תאריך-דיון, צדדים שהופיעו)
|
||||
ומזין את `hearing_date` חזרה לעמודה הקנונית `cases.hearing_date` (G1; לא נכתב אם
|
||||
היו"ר כבר מילא תאריך — לא דורסים קלט-יו"ר).
|
||||
- **ייצור:** קריאת-ה-LLM ההשוואתית עוברת `claude_session` (מקומי בלבד), מעוגנת
|
||||
`model="claude-opus-4-8"` + `effort="high"` (ראה `reference_claude_generation_path`).
|
||||
**חלון-הקשר (#216):** הבנייה הסטנדרטית רצה 200K-טוקן (~400K תווים עברית). פרומפט גדול
|
||||
(בעיקר בלוק-י, שנושא את התיק המלא כ-source-context) מוסלם אוטומטית לבניית-ה-1M של *אותו*
|
||||
מודל — `claude-opus-4-8[1m]` (1M-טוקן, מחיר רגיל; `claude -p` חושף אותה ישירות כ-model-id,
|
||||
בלי beta-header). **עידון של אותו pin, לא מסלול-מודל מקביל (G2).** הסף ב-`block_writer`:
|
||||
פרומפט > ~350K תווים → `[1m]`; אחרת הבנייה הסטנדרטית. תקרת-קשיחה: 1.5M תווים.
|
||||
|
||||
### 1.4 סיכום-מנהלים של טענות הצדדים (מסמך-הכנה לדיון, WS3/#202)
|
||||
|
||||
`summarize_party_claims(case_number, instructions="")` מפיק **מסמך-פרוזה מזוקק** של
|
||||
טענות הצדדים — תמצית-מנהלים קצרה ומוקפדת שמטרתה **להכין את היו"ר לדיון בעל-פה**. זהו
|
||||
מסמך **נפרד ומובחן מטיוטת-ההחלטה ומטיוטת-הביניים** (החלטת-יו"ר, [תוכנית workflow-redesign](../../.claude/plans/groovy-doodling-token.md)
|
||||
§WS3) — אינו חלק מ-12-הבלוקים ואינו נכתב לתבנית ההחלטה.
|
||||
|
||||
- **מקור-אמת יחיד (G2):** המסמך נגזר מ-`legal_arguments` (טיעונים מאוגדים) או, כ-fallback,
|
||||
מ-`claims` הגולמיים — **אותו מקור** של §§1.1–1.2, **ללא חילוץ-מחדש** ובלי לקרוא לכתבי-הטענות
|
||||
ישירות. אין מסלול-נתונים מקביל.
|
||||
- **זיקוק, לא שכפול:** התמצית מתמצתת כל צד למשפטי-מפתח ומוסיפה פרק "נקודות-המחלוקת המרכזיות"
|
||||
כשאלות פתוחות — לא משכפלת את כתבי-הטענות ולא מכריעה.
|
||||
- **עיגון-מקור (INV-AH):** הפרומפט מתוחם לחלוטין לטענות-התיק שבקלט; אסור להמציא טענה/הלכה/
|
||||
פסק-דין/עובדה שאינם בקלט — טענה לא-ברורה מצוינת במפורש ([anti-hallucination-gate](../anti-hallucination-gate.md)).
|
||||
- **ייצור local-only:** עובר `claude_session` → `claude -p` נעוץ ל-Opus 4.8 + `effort=high`
|
||||
(משימת זיקוק/סינתזה). הקונטיינר חסר ה-CLI — לכן הייצור הוא כלי-MCP מקומי בלבד; endpoints
|
||||
ב-`web/app.py` רק **מגישים/מייצאים** את הקובץ השמור, לא מייצרים.
|
||||
- **שמירה + ייצוא:** נשמר ל-`data/cases/{n}/documents/research/party-claims-summary.md`
|
||||
(git + S3, באותו מסלול-אחסון של `analysis-and-research.md`); ניתן-לייצוא ל-DOCX בסגנון-תבנית
|
||||
דפנה (`build_party_claims_summary_docx`). מימוש: `tools/drafting.py` ·
|
||||
`services/party_claims_summary.py` · `services/analysis_docx_exporter.py`.
|
||||
- **טריגר — side-quest מבוקש-יו"ר (G10), נפרד מטיוטת-הביניים:** ה-CEO מפיק את הסיכום כשלב-צד
|
||||
(`legal-ceo.md` שלב H2) ב-**שתי דרכים**: (א) הערת-יו"ר חופשית ("סיכום מנהלים" / "סיכום טענות" /
|
||||
"סיכום לקראת דיון" / "executive summary"); או (ב) **פעולה סטרוקטורלית** —
|
||||
`$PAPERCLIP_WAKE_PAYLOAD_JSON` עם `action == "party_claims_summary"` (המסלול הדטרמיניסטי שכפתור-UI
|
||||
עתידי יפעיל, בלי פענוח-טקסט). זהו side-quest: אינו משנה `cases.status` ואינו יוצר issues לסוכני-משנה,
|
||||
ומובחן מטיוטת-הביניים (`write_interim_draft`, שלב H, `action == "interim_draft"`).
|
||||
|
||||
### 1.5 ניתוח-מחדש מאחד אחרי מסמך-עיקרי חדש (#201)
|
||||
|
||||
תיק מנותח לרוב מכתב-הערר לבד, ומסמך-עיקרי (תשובה/התנגדות/פרוטוקול…) מגיע מאוחר יותר.
|
||||
כל מסמך נושא **דגל "לא-נותח"** (`claims_extracted_at`, [02-data-model §2ג](02-data-model.md)),
|
||||
ו-`workflow_status` מסמן "מסמך-עיקרי שטרם-נכלל בניתוח". `reanalyze_claims(case_number,
|
||||
reanalyze_all_primary=False)` סוגר את הפער **בלי force-delete גורף**:
|
||||
|
||||
1. **snapshot לפני** — הטיעונים המאוגדים הנוכחיים (בסיס בדיקת-ההשפעה).
|
||||
2. **חילוץ-מאחד** — מחלץ רק את המסמכים-העיקריים החדשים/לא-נותחו (`db.primary_docs_not_analyzed`)
|
||||
דרך **אותו** `claims_extractor.extract_and_store_claims`; `store_claims` מחליף רק את טענות
|
||||
*אותו* מסמך (לפי `source_document`), כך שטענות ממסמכים שכבר-נותחו **נשמרות** (האיחוד).
|
||||
3. **צבירה-מחדש** — `aggregate_claims_to_arguments(force=True)` מחשב את הטיעונים מחדש מתוך
|
||||
מערך-הטענות המאוחד השלם. זהו **מסלול-החישוב הקנוני** ([G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)),
|
||||
לא מסלול-עיבוד מקביל; הוא מוחק רק `legal_arguments` (נגזר), לעולם לא `claims`.
|
||||
4. **בדיקת-השפעה ליו"ר** — snapshot אחרי + `_impact_diff` מחזיר per-צד אילו טיעונים
|
||||
נוספו/הוסרו ואיך השתנה תמהיל-העדיפויות ("מאזן-ההמלצה"), עם דגל `changed`. הפלט **מוצג**
|
||||
ליו"ר ולא מוחל אוטומטית ([G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant)).
|
||||
|
||||
ראה `tools/legal_arguments.py` (`reanalyze_claims`, `_snapshot`, `_impact_diff`).
|
||||
|
||||
### 1.6 שער שטן-מליץ (red-team) — בין הניתוח לכתיבה, תחת אישור-יו"ר
|
||||
|
||||
אחרי שלב-הניתוח (`analysis-and-research.md` תקין) וב**לפני** הכותב, ה-CEO מפעיל **אוטומטית**
|
||||
שכבת **דעה-שנייה אדוורסרית** מ-lineage שונה (Gemini, `legal-analyst-gemini-critique`,
|
||||
read-only) — **שער-קבע (standing gate)**, לא on-demand. השכבה תוקפת את ניתוח-Opus ומפיקה
|
||||
`critique-gemini.md` = **מזכר-לידים לא-סמכותי**, מתויג-ודאות (`[מאומת-קורפוס]`/`[טעון-אימות]`/
|
||||
`[ספקולציה]`), כפוף לשער ה-anti-hallucination ([INV-AH](../anti-hallucination-gate.md);
|
||||
כלי-RAG משפטיים הוזים פסיקה 17–33%, Stanford RegLab/Magesh JELS 2025).
|
||||
|
||||
- **human-in-the-loop קשיח ([G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant)):**
|
||||
ה-CEO מציג את הלידים ליו"ר כ**עצירת-אישור** (ה-issue הראשי ל-`in_review` + מייל), ואינו מתקדם
|
||||
לכותב בלי הכרעת-יו"ר מפורשת. **רק לידים שהיו"ר אישר** מומרים ל-`chair_directions` דרך
|
||||
מנגנון-ההנחיות הקיים (`record_chair_feedback` → "עמדת ועדת הערר" ב-`analysis-and-research.md`
|
||||
→ `get_chair_directions` → `approve_direction`); לידים שנדחו נמחקים.
|
||||
- **הכותב צורך מקור-מעוגן בלבד ([INV-WR1–WR5](#4-invariants-של-התחום--תוכן-החלטה-מנומקת) +
|
||||
[INV-LRN5](07-learning.md)):** הקלט לכתיבה הוא **פלט-המנתח המעוגן + ההנחיות-המאושרות** —
|
||||
**לעולם לא** הלידים הגולמיים של שטן-מליץ. השכבה אינה מסלול-נתונים מקביל לכתיבה
|
||||
([G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)) ואינה כותבת
|
||||
שום שכבת-קול/ידע (INV-LRN5) — read-only ל-`critique-gemini.md` בלבד.
|
||||
- **מקור-אמת לזרימה:** [X4 INV-AG4](X4-agents.md#inv-ag4-שער-שטן-מליץ--red-team-לידים-לא-סמכותיים-תחת-אישור-יור)
|
||||
+ [legal-ceo.md](../../.claude/agents/legal-ceo.md) "שלב A2"/"שלב A3" +
|
||||
[legal-analyst-gemini-critique.md](../../.claude/agents/legal-analyst-gemini-critique.md).
|
||||
(שינוי-מדיניות יו"ר 2026-06-30: from on-demand to standing gate — TaskMaster `legal-ai` #211.)
|
||||
|
||||
---
|
||||
|
||||
## 2. ארכיטקטורת 12 הבלוקים (סיכום)
|
||||
|
||||
@@ -43,6 +43,16 @@
|
||||
> וגם **טיוטת-ביניים** (`mode="interim"` — תת-קבוצת בלוקים בסדר חדש: רקע→תכניות→טענות→הליכים,
|
||||
> `export_interim_draft`, `drafting.py:511`). שני המצבים שולפים מאותה טבלה — וריאציית-תצוגה
|
||||
> של אותו מקור-אמת, לא מסלול שני.
|
||||
>
|
||||
> **דטרמיניזם-מבני של טיוטת-הביניים (#204 / WS5).** סדר-בלוקי-הביניים בייצוא קבוע
|
||||
> ב-`docx_exporter._INTERIM_BLOCK_ORDER` (רקע→תכניות→טענות→הליכים, עם בלוקי-תבנית א–ה
|
||||
> אופציונליים בתחילה). הבלוקים עצמם נכתבים דרך **אותו מסלול-כתיבה קנוני** של ההחלטה
|
||||
> המלאה (`block_writer.write_and_store_block` → `write_block`, G2 — אין מסלול-ייצור
|
||||
> מקביל), אך כעת **נעוצים למודל יחיד (`claude-opus-4-8`) עם `effort` per-בלוק ובפרומפט-
|
||||
> מבני קבוע** (למשל בלוק-ה פותח תמיד ב"לפנינו ערר…"). התוצאה: אותו תיק מפיק את אותו
|
||||
> **מבנה** בכל ריצה (אי-עקביות-הניסוח הקודמת נבעה מפרומפט-חופשי + מודל-ברירת-מחדל לא-נעוץ).
|
||||
> טמפרטורה אינה במסלול (Opus 4.7/4.8 דוחים אותה); ראה `block_writer.GENERATION_MODEL`
|
||||
> + `BLOCK_CONFIG[*].effort`.
|
||||
> - `analysis_docx_exporter.py` (`build_analysis_docx`, `:401`) — מייצא את מסמך **הניתוח
|
||||
> המשפטי** (`analysis-and-research.md`) שכתב `legal-analyst`, לא את בלוקי-ההחלטה. זהו תוצר-עזר
|
||||
> שונה (שלב ניתוח, לא החלטה) — והוא המסלול שהסקיל מתעד בעיקר. שניהם חולקים את **אותו טמפלט
|
||||
@@ -101,10 +111,14 @@ Model / Single Source of Truth) · SSOT (Single Source of Truth principle) | ס
|
||||
פלט מגורסן + idempotent מבחינת-תוכן; אוכף את
|
||||
[INV-G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים) וכלל-ההנדסה
|
||||
"סימטריה" (חוקה §6).
|
||||
**הפרה ידועה:** אחרי `revise_draft`/`apply_user_edit`, ה-DOCX המסומן `active_draft_path` הופך
|
||||
ל"מקור-האמת" לעריכות-Track-Changes העוקבות (`db.py:185-188`), ו**בלוקי-ה-DB אינם מתעדכנים
|
||||
חזרה** — הנתון-הנגזר זוחל למקור-אמת בפועל בלי סנכרון לאחור. **יעד:** או re-sync מהבלוקים, או
|
||||
חוזה מפורש ש-`active_draft_path` הוא רק אנקור-revision ולא מקור-תוכן → ראה [§5](#5-current-vs-target).
|
||||
**הפרה ידועה — ✅ מגודרת (FU-7, GAP-17):** אחרי `revise_draft`/`apply_user_edit` ה-DOCX
|
||||
המסומן `active_draft_path` משמש כאנקור לעריכות-Track-Changes העוקבות, ובלוקי-ה-DB אינם
|
||||
מתעדכנים חזרה — סטייה אפשרית בין הבלוקים למסמך-החי. **התיקון שנבחר (חוזה מפורש, לא re-sync):**
|
||||
`active_draft_path` הוא **אנקור-revision בלבד, לא מקור-תוכן מתחרה** — ה-DB נשאר מקור-האמת. סטייה
|
||||
נלכדת בדגל `cases.blocks_stale` (V22, `db.py:1142-1148`): `revise_draft`/`apply_user_edit`
|
||||
מסמנים `mark_blocks_stale(case_id, True)` (`drafting.py:688,789`) ו-`export_docx` מנקה
|
||||
(`mark_blocks_stale(case_id, False)`, `drafting.py:504`) — הדגל הוא ה-drift-detection שחושף מתי
|
||||
ה-DOCX-החי נסחף מהבלוקים. ראה [§5](#5-current-vs-target).
|
||||
|
||||
### INV-EX2: עקיבוּת-מקור נשמרת בהחלטה המיוצאת (→G9)
|
||||
**כלל:** ההחלטה המיוצאת **שומרת על עקיבוּת-מקור** היכן שנדרש — סמכויות-משפטיות מצוטטות
|
||||
@@ -127,29 +141,53 @@ Lewis et al. (2020, NeurIPS — RAG attribution) | סטטוס: verified
|
||||
**מקורות:** NCSC/JTC — *Principles & Practices for AI Use in Courts* (controlled, auditable
|
||||
output) · Council of Europe / CEPEJ (2018, under user control) · Federal Judicial Center —
|
||||
*Judicial Writing Manual* (2d ed.) | סטטוס: verified
|
||||
**אכיפה:** `export_blocked = critical_failures > 0` (`qa_validator.py:362`); **נאכף ברמת-
|
||||
הזרימה/agent בלבד** — הסוכן `legal-exporter` מחויב להריץ `validate_decision` ולבדוק
|
||||
כשלים-קריטיים לפני ייצוא (`.claude/agents/legal-exporter.md:71,149`).
|
||||
**הפרה ידועה:** `export_docx` (`drafting.py:384`) **אינו** קורא ל-`validate_decision` בעצמו —
|
||||
הוא ניגש ישירות ל-`docx_exporter.export_decision` בלי לבדוק `export_blocked`. החסימה תלויה
|
||||
במשמעת-הסוכן ואינה hard-block בקוד-הייצוא → ראה [§5](#5-current-vs-target) (תואם
|
||||
[05-qa-review §4](05-qa-review.md#4-current-vs-target--ממצאי-audit)).
|
||||
**אכיפה — ✅ hard-block בקוד (FU-6, GAP-15):** `export_docx` (`drafting.py:462`) **בודק לעצמו**
|
||||
לפני כל ייצוא — `db.qa_run_exists` (אם QA לא רץ כלל → חסום) ו-`db.get_critical_qa_failures`
|
||||
(אם יש כשל-קריטי → חסום) — **לפני** הגישה ל-`docx_exporter.export_decision`. אלו `SELECT` זולים
|
||||
על ה-`qa_results` המאוחסנים (לא הרצת-LLM חוזרת). נוסף על `export_blocked = critical_failures > 0`
|
||||
ברמת-הזרימה ועל משמעת-הסוכן `legal-exporter` (`.claude/agents/legal-exporter.md:71,149`) — כך
|
||||
שאי-אפשר לעקוף את השער אפילו בקריאה ישירה ל-`export_docx`.
|
||||
**הפרה ידועה — ✅ נסגרה (FU-6, GAP-15):** בעבר `export_docx` ניגש ישירות ל-exporter בלי לבדוק
|
||||
`export_blocked` (אכוף-זרימה בלבד, ניתן-לעקיפה). נסגר ע"י ה-hard-block לעיל; מאומת ב-
|
||||
`test_export_qa_gate.py` (חסום ללא-QA · חסום בכשל-קריטי · עובר כשנקי).
|
||||
|
||||
### INV-EX4: מקור-תבנית-יחיד — כל מפיק-מסמך מחיל סגנונות-טמפלט בלבד (→G2)
|
||||
**כלל:** **כל** מפיק של מסמך-Word הקשור-להחלטה — סופי (`export_docx`), טיוטת-ביניים
|
||||
(`export_interim_draft`), סיכום-מנהלים (`party-claims-summary`), ומסמך-הניתוח
|
||||
(`build_analysis_docx`), וכן מסלול-העריכה (`revise_draft`/`apply_user_edit` →
|
||||
`docx_reviser`) — **חייב לטעון את הטמפלט היחיד** `skills/docx/decision_template.docx`
|
||||
ולהחיל עיצוב **אך-ורק דרך שמות-הסגנונות שמוגדרים בו** (`paragraph.style = "…"` /
|
||||
`<w:pStyle w:val="…"/>`). **אסור hand-setting** של משפחת-גופן (`rFonts`), גודל-גופן
|
||||
(`sz`/`szCs`), או שוליים — אלה נגזרים מ-`styles.xml` של הטמפלט (cascade). היחיד שמותר
|
||||
לכפות מפורשות הוא **יישור-הגוף הקנוני `jc=both`** היכן שהוא דורס סגנון שמגיע ממורכז
|
||||
(`_set_paragraph_jc`, `docx_exporter.py:80`) — כי זו ההתנהגות-הקנונית, לא עיצוב-אד-הוק.
|
||||
סמני-כיווניות (`<w:bidi>`, run `<w:rtl/>`) מותרים (כיווניות, לא עיצוב). **טמפלט אחד = מקור-סגנון
|
||||
יחיד; אין שכבת-סגנון מקבילה.**
|
||||
**מקורות:** SSOT (Single Source of Truth) · Martin Fowler — Canonical Data Model · ECMA-376
|
||||
(OOXML) §17.7.2 — הורשת-סגנונות-פסקה (paragraph style inheritance / cascade) | סטטוס: verified
|
||||
**אכיפה:** `docx_exporter` ו-`analysis_docx_exporter` טוענים `TEMPLATE_PATH` ומחילים style-by-name
|
||||
(ראה §2); `docx_reviser` מחיל `pStyle` מן-הטמפלט + `jc=both` (לא פונט/גודל ידני). שומר-CI
|
||||
`test_docx_template_single_source.py` גורף את מודולי-מפיקי-ה-DOCX ונכשל על `rFonts`/`sz`/`szCs`
|
||||
ידני מחוץ לטוען-הטמפלט. אוכף את
|
||||
[INV-G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים) בשכבת-הרינדור.
|
||||
**הפרה ידועה — ✅ נסגרה:** `docx_reviser._build_paragraph` כפה `jc=right` + David/`sz` ידני על כל
|
||||
פסקה שהוכנסה במסלול-העריכה (`revise_draft`/`apply_user_edit`) → פלט מסלול-העריכה איבד את היישור
|
||||
הדו-צדדי של הטמפלט והכניס עיצוב-אד-הוק. נסגר ע"י החלת `pStyle` מן-הטמפלט; מאומת ב-
|
||||
`test_docx_reviser.py` + `test_docx_template_single_source.py`.
|
||||
|
||||
---
|
||||
|
||||
## 5. Current vs Target
|
||||
|
||||
- **שער-ייצוא אכוף-זרימה ולא אכוף-קוד (INV-EX3 / INV-QA3).** אומת בקוד: `export_docx`
|
||||
(`drafting.py:384-419`) קורא ישירות ל-`docx_exporter.export_decision` (`:403`) ללא קריאה
|
||||
ל-`qa_validator.validate_decision` ובלי בדיקת `export_blocked`. החסימה מתקיימת רק כי הסוכן
|
||||
`legal-exporter` מחויב להריץ QA קודם (`legal-exporter.md:71,149`) — אדם/סוכן שיקרא
|
||||
ל-`export_docx` ישירות **יעקוף** את השער. **יעד:** hard-block בתוך `export_docx` — שליפת
|
||||
`qa_results`/`export_blocked` ודחייה לפני כתיבת ה-DOCX, כך שאי-אפשר לעקוף.
|
||||
- **`active_draft_path` כ-derived-שזוחל-למקור (INV-EX1).** ה-DOCX נגזר מהבלוקים בייצוא הראשון,
|
||||
אך אחרי עריכה (`revise_draft`/`apply_user_edit`) ה-DOCX הופך ל"מקור-האמת" לעריכות הבאות
|
||||
(`db.py:185-188`) בלי לעדכן את `decision_blocks` חזרה — סטייה אפשרית בין הבלוקים למסמך-החי.
|
||||
**יעד:** חוזה מפורש — או re-sync מהבלוקים, או הגדרת `active_draft_path` כאנקור-revision בלבד
|
||||
(לא מקור-תוכן), עם בדיקת-בריאות לגילוי drift בין הבלוקים ל-DOCX הפעיל.
|
||||
- **שער-ייצוא — ✅ hard-block בקוד (INV-EX3 / INV-QA3, FU-6 / GAP-15).** `export_docx`
|
||||
(`drafting.py:462-494`) בודק `db.qa_run_exists` + `db.get_critical_qa_failures` ודוחה לפני
|
||||
הגישה ל-`docx_exporter.export_decision` — לא ניתן לעקוף בקריאה ישירה. מאומת ב-
|
||||
`test_export_qa_gate.py` (3 מקרים: ללא-QA / כשל-קריטי / נקי).
|
||||
- **`active_draft_path` כ-derived (INV-EX1, FU-7 / GAP-17) — ✅ מגודר בחוזה מפורש.** ה-DB נשאר
|
||||
מקור-האמת; `active_draft_path` הוא אנקור-revision בלבד. ה-drift בין הבלוקים ל-DOCX-החי נלכד
|
||||
בדגל `cases.blocks_stale`: נדלק ב-`revise_draft`/`apply_user_edit` (`drafting.py:688,789`),
|
||||
כובה ב-`export_docx` (`drafting.py:504`). **שארית (low-pri):** health-check שמתריע על
|
||||
`blocks_stale=true` עתיק — תיעוד-המשך, לא חוסם.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -35,12 +35,12 @@
|
||||
היעד הוא **Text Style Transfer** מבוסס **פרופיל-סגנון מופשט** — להכליל את סגנון/שיטת דפנה ולהתאים לתיק הספציפי. fine-tuning של משקולות **לא רלוונטי**: המודל (Opus) סגור, והקורפוס (~48 החלטות, יו"ר חדשה) קטן מדי — מצב שבו הספרות מראה שפרופיל-מופשט + דוגמאות מנצח (≈+15% מעל RAG-בלבד). **מדיניות-העתקה לפי סוג-תוכן:** קבוע/נוסחאי (פתיחים דוקטרינליים, תבניות-סיום) → מותר להעתיק; ניתוח/טענות ספציפיים → להכליל ולהתאים; מהות (הלכה/עובדה מתיק אחר) → אסור (INV-LRN5).
|
||||
|
||||
### 0.2 שלושת ערוצי-ההזנה לכותב
|
||||
1. **A — פרופיל-מופשט (ראשי):** voice-fingerprint + author-features כמותיים, מוזרק לכתיבה.
|
||||
1. **A — פרופיל-מופשט (ראשי):** voice-fingerprint + author-features כמותיים, מוזרק לכתיבה. **חידוש מהקורפוס:** החלק הכמותי (יחסי-מבנה) מתרענן אוטומטית-ודטרמיניסטית מהקורפוס הגדל (`measure_corpus_ratios`→כותב); הפרוזה המופשטת מסונתזת מחדש ע"י `scripts/regenerate_voice_fingerprint.py` (Opus) כ**הצעה מגודרת-יו"ר** (INV-LRN1 קשיח — לא auto, היו"ר מקבעת ידנית; STYLE בלבד INV-LRN5).
|
||||
2. **B — דוגמאות + תבניות (תומך):** פסקאות-בלוק אמיתיות + Copy-Paste Templates + contrastive.
|
||||
3. **C — deep-read (נקודתי):** voice-XXXX.md — worked example לתיק-מופת.
|
||||
|
||||
### 0.3 הצינור החוזר per-final (7 שלבים)
|
||||
`mark-final` → [1] INTAKE (snapshot של הטיוטה) → [2] PAIRING (בלוק↔בלוק) → [3] ALIGNMENT (diff פר-בלוק) → [4] DISTILLATION (מפריד סגנון↔מהות) → [5] CURATION (Hermes + שער-יו"ר) → [6] FEEDBACK (ניתוב לערוץ A/B/C) → [7] MEASUREMENT (מדד-מרחק-סגנון).
|
||||
`mark-final` → [1] INTAKE (snapshot של הטיוטה) → [2] PAIRING (בלוק↔בלוק) → [3] ALIGNMENT (diff פר-בלוק) → [4] DISTILLATION (מפריד סגנון↔מהות) → [5] CURATION (Hermes + שער-יו"ר) → [6] FEEDBACK (ניתוב לערוץ A/B/C) → [7] MEASUREMENT (מדד-מרחק-סגנון + snapshot-held-out פרוספקטיבי, §0.7).
|
||||
|
||||
### 0.4 ניהול ב-UI
|
||||
`/methodology` = **עורך-הפרופיל היחיד** (declarative: יחסי-זהב, כללי-דיון, צ׳קליסטים, ביטויי-מעבר, אנטי-דפוסים, voice-invariants). `/training` = **שולחן-הלמידה** (קורפוס, פורטרט-סגנון, השוואת draft↔final, curator, מדד-מרחק, פנקס-התאמה).
|
||||
@@ -48,7 +48,7 @@
|
||||
**שער-אישור אחד · טרנזקציית-כותב אחת (INV-IA3 → [X17](X17-information-architecture.md)):** ל-`decision_lesson` יש **סטטוס-יחיד** שקובע "זורם-לכותב" — `review_status='approved'` (INV-LRN1/G10). הדגל `applied_to_skill` **הוסר** (היה אינפורמטיבי-בלבד, נכתב-לשומקום → בלבל את היו"ר ב"שני שערים"; גל-2 #131). לקח שהיו"ר מחבר ידנית נוצר כבר כ-`approved`; לקח-פאנל נוצר כ-`proposed` וממתין לשער. promote של זוג draft↔final מטמיע את הלקחים/הביטויים שהיו"ר בחר **דרך appeal_type_rules בטרנזקציה אחת נעולה (FOR UPDATE)** — מסלול-כתיבה-יחיד, ללא read-modify-write מתפצל מול עורך-המתודולוגיה (MET-2/3, להלן G2 הפרות-ידועות).
|
||||
|
||||
### 0.5 Invariants חדשים
|
||||
**INV-LRN4 (ניגוד-אמת → G10/G9):** למידת-קול מבוססת **pairing draft↔final ברמת-בלוק**, לא קריאת-final בלבד. כל החלטה אינה "סגורה" עד שהושוותה מול הסופי; כל סופי מנותח מול הטיוטה. נשמר פנקס-התאמה (`draft_final_pairs`) עם מצב-חיים `draft_done → final_received → analyzed → lessons_folded`.
|
||||
**INV-LRN4 (ניגוד-אמת → G10/G9):** למידת-קול מבוססת **pairing draft↔final ברמת-בלוק**, לא קריאת-final בלבד. כל החלטה אינה "סגורה" עד שהושוותה מול הסופי; כל סופי מנותח מול הטיוטה. נשמר פנקס-התאמה (`draft_final_pairs`) עם מצב-חיים `draft_done → final_received → analyzed → lessons_folded`. ההכללה (האם הלמידה משפרת תיקים שלא-נלמדו) נמדדת פרוספקטיבית — §0.7.
|
||||
*מקורות:* imitation-learning-from-expert-edits · contrastive personalization (arxiv 2504.08745) · author-profiling. *סטטוס: verified.*
|
||||
|
||||
**INV-LRN5 (טוהר-הקול → G4/G11):** שכבת-ידע-הקול (voice-fingerprint, style_patterns, exemplars) **לא תכיל הלכות/עובדות ספציפיות** — רק סגנון ושיטה. מהות מנותבת ל-precedent_library/halacha. ה-distillation מפריד במקור.
|
||||
@@ -62,9 +62,20 @@
|
||||
3. **בדיקת-ציטוטים** — `extract_internal_citations` מקשר את הפסיקה שההחלטה מצטטת לספרייה; כל ציטוט שאינו בספרייה **מסומן אוטומטית** כ-`missing_precedent` (open) להעלאה ע"י היו"ר.
|
||||
4. הציטוטים-המקושרים מזינים את **לולאת-ה-corroboration** (X11): ציטוט-נכנס מההחלטה שלנו מחזק את ההלכות של התקדים המצוטט (`corroboration_rebuild`).
|
||||
ואז שני שלבים אוטומטיים נפרדים (`run-learning` / `run-halacha`) המעירים worker מקומי (claude/DeepSeek/Gemini מקומיים בלבד):
|
||||
- **למידה:** `ingest_final_version` (Opus distillation) → **פאנל-סגנון דו-סוכני** (DeepSeek+Gemini, "למידה כפולה") שמצביע על כל לקח-style_method; הסכמה 2/2 → `decision_lesson` (`source=panel:deepseek+gemini`); פיצול → ליו"ר.
|
||||
- **למידה:** הצינור (`final_learning_pipeline.py`) רץ בסדר `enroll_style_corpus` (יצירת רשומת-הקורפוס, מהיר — **ראשון** מאז #159 כדי שהקורפוס יהיה זמין לפני הדיסטילציה הארוכה) → `ingest_final_version` (Opus distillation) → **פאנל-סגנון דו-סוכני** (DeepSeek+Gemini, "למידה כפולה") שמצביע על כל לקח-style_method; הסכמה 2/2 → `decision_lesson` (`source=panel:deepseek+gemini`) **שזורם אוטומטית לכותב** כ-`approved` (שער-מדורג, INV-LRN1) — הפיך (veto-יו"ר ב-/training); פיצול → ליו"ר. **במקביל** (יקיצת `final_learning_*`) האוצֵר ממשיך ל-§A ורושם ממצאי-`source='curator'` (ערוץ ג׳, §1.1).
|
||||
- **הלכות:** `extract_internal_citations` → `precedent_extract_halachot` → `corroboration_rebuild` → **פאנל-הלכות תלת-סוכני** (`halacha_panel_approve.py --apply`).
|
||||
שני הפאנלים **הפיכים** (גיבוי-CSV ל-`data/audit/`) ומסלימים מחלוקות. ההטמעה הסופית ל-`SKILL.md`/`legal-decision-lessons.md` נשארת **אישור-יו"ר ידני** (INV-LRN1/G10) — הפאנל יוצר *הצעות* בלבד.
|
||||
שני הפאנלים **הפיכים** (גיבוי-CSV ל-`data/audit/`) ומסלימים מחלוקות. ההטמעה ל-`SKILL.md`/`legal-decision-lessons.md` ולכל **מהות** נשארת **אישור-יו"ר ידני קשיח** (INV-LRN1/G10); לקחי-**סגנון** בקונצנזוס זורמים אוטומטית-והפיך לכותב.
|
||||
|
||||
### 0.7 מדד-ההכללה הפרוספקטיבי (held-out trend — "מסלול A")
|
||||
**השאלה שזה עונה:** האם הלמידה באמת *מכלילה* — כלומר משפרת טיוטות של תיקים **שלא נלמדו** — ולא רק "משננת" תיקים שכבר ראינו. מדד-מרחק-הסגנון (שלב [7]) על תיק שלקחיו כבר הוטמעו אינו held-out; מדידה רטרואקטיבית בלתי-אפשרית כי הלקחים נשמרים `appeal_type_rules` (`universal`) **ללא תיוג-מקור** → אין leave-one-out. לכן המדידה **פרוספקטיבית**: נלכדת ברגע היחיד שבו היא נקייה.
|
||||
|
||||
**המנגנון (אוטומטי, ב-`final/upload`, ללא LLM):** מיד אחרי פתיחת הזוג `draft_final_pair` אבל **לפני** הטמעת-לקחי-התיק (ה-fold הוא שלב-`promote` ידני נפרד ב-`/training`, §0.4), נלכד snapshot של `style_distance` (`anti_pattern_total`, סטיית-יחסי-זהב, `change_percent`) יחד עם **גודל-בריכת-הלקחים** באותו רגע (מספר `discussion_rules`+`transition_phrases` ב-`universal`). מכיוון שהטיוטה נכתבה עם הבריכה ה**קודמת** בלבד, כל שורה היא נקודת-נתון held-out נקייה: *"עם N לקחים מצטברים, הטיוטה שלנו על תיק שלא-נראה קיבלה ציון X"*.
|
||||
|
||||
**הקריאה:** טבלת `style_distance_history` (append-only) + `GET /api/learning/style-distance-history`. ירידה ב-`anti_pattern_total`/`change_percent` ככל ש-N גדל = **הוכחה מתגלגלת שהלמידה מכלילה** (INV-LRN4 — זהו משטח-המגמה של "ניגוד-האמת"). **אזהרת-פרשנות:** `change_percent` מערבב סגנון עם שלמות-תוכן (לפעמים היו"ר מכפילה אורך כי חסרה מהות, לפעמים חותכת) → `anti_pattern_total` הוא הסיגנל הנקי-יותר לסגנון. שימוש-חוזר בשירות `style_distance` ובבריכת `appeal_type_rules` — אין מסלול-מדד מקביל (G2).
|
||||
|
||||
> **המלצת-הכיול style-ranked (#213):** `recommend_effort` ב-`scripts/calibrate_effort.py` מדרג efforts לפי `anti_pattern_total` **ראשי** (סיגנל-סגנון נקי) → סטיית-יחסי-זהב → `distance` (tiebreak קלוש). `change_percent` **מדווח-לא-מדורג** מאותה אזהרת-פרשנות לעיל (מערבב סגנון עם שלמות-תוכן). ההמלצה נושאת דגל-`confidence` ("clear"/"weak") כך שבחירה שההובלה-ב-anti שלה בתוך-הרעש (epsilon=max(0.5, 0.20·spread)) לא מוצגת כוודאית. אין מסלול-מדד מקביל — שימוש-חוזר ב-`style_distance` (G2).
|
||||
|
||||
> **חלון נקי חד-פעמי:** תיק שכבר `lessons_folded` פספס את חלון ה-held-out שלו — אין backfill. הטבלה מתמלאת קדימה מהסופי הבא.
|
||||
|
||||
---
|
||||
|
||||
@@ -87,10 +98,24 @@
|
||||
(`hermes-curator.md:60-70`).
|
||||
- מזהה **3–5 דפוסים/פערים** חדשים, כל ממצא מתויג `[סגנון]` / `[מבנה]` /
|
||||
`[לקסיקון משפטי]` / `[טבלאי]` (`hermes-curator.md:99-108`).
|
||||
- **מציע** — comment ב-Paperclip + רישום כל ממצא כ-`decision_lesson` דרך
|
||||
`POST /api/training/corpus/{corpus_id}/lessons` (`source:"curator"`) שמופיע ב-UI
|
||||
תחת הטאב "מה למדנו" (`hermes-curator.md:73-96`).
|
||||
- **אינו מעדכן** קבצים בעצמו (skills/, lessons.py, DB) — רק מציע (`hermes-curator.md:125-130`).
|
||||
- **מציע** — comment + interaction בערוץ-הפלטפורמה, וגם **רושם כל ממצא מבנית** כ-`decision_lesson`
|
||||
(`source='curator'`, `review_status='proposed'`) דרך כלי-ה-MCP `record_curator_findings`
|
||||
(`hermes-curator.md` §A.5b → `tools/workflow.py::record_curator_findings` → `db.add_decision_lesson`).
|
||||
הממצאים מופיעים ב-`/training` טאב "אוצֵר" (ערוץ ג׳) ועוברים את שער-היו"ר (INV-LRN1).
|
||||
> **דריפט-מימוש שנסגר (2026-06-28):** עד גל זה הסוכן כתב comment בלבד והספ תיאר endpoint שלא נקרא —
|
||||
> הממצאים האיכותיים אבדו, וכרטיס-האוצֵר (`get_curator_stats`) ספר `source='curator'` שאיש לא כתב → 0.
|
||||
> `record_curator_findings` מממש את INV-LRN3 בפועל.
|
||||
- **אינו מאשר ואינו מטמיע** — read-only על התוכן; רישום-הממצא הוא *הצעה* מגודרת-שער, לא שינוי-קול.
|
||||
אינו עורך `skills/` / `lessons.py` / שכבת-הקול בעצמו (`hermes-curator.md` §"כללים כלליים").
|
||||
- **שני ערוצי-למידה נפרדים על אותו סופי:** ערוץ-האוצֵר (כאן, qualitative, `source='curator'`) ו**פאנל-הסגנון**
|
||||
הדו-סוכני שהצינור מפעיל (§0.6 — DeepSeek+Gemini, `source='panel:deepseek+gemini'`). שניהם
|
||||
`decision_lessons` ממתיני-שער; ערוץ הדיסטילציה (`appeal_type_rules`, §0.4) הוא השלישי.
|
||||
|
||||
> **נסגר (TaskMaster #159, 2026-06-28):** ה-`PIPELINE-WAKE BRANCH` (`hermes-curator.md`) מבדיל כעת
|
||||
> `final_learning_*` מ-`final_halacha_*`: על **learning** הסוכן מפעיל את הצינור ברקע ו**ממשיך ל-§A**
|
||||
> (מצב AUTO — רושם ממצאי-`curator`, מדלג על interaction), על **halacha** יוצא מיד כקודם. המירוץ מול
|
||||
> `enroll_style_corpus` נסגר בכך ש-enroll רץ **ראשון** בצינור (§0.6) — הקורפוס קיים תוך שניות, הרבה לפני
|
||||
> שהסוכן/ה-§A מסיים את ניתוח-ה-LLM; `record_curator_findings` כולל גם retry כרשת-ביטחון.
|
||||
|
||||
### 1.2 לולאת-פידבק-היו"ר (capture → ניתוח שבועי → לקחים)
|
||||
|
||||
@@ -162,13 +187,12 @@
|
||||
|
||||
## 3. Invariants של התחום
|
||||
|
||||
### INV-LRN1: עדכון-ידע דורש אישור-יו"ר ידני — אין auto-commit (governance →G10)
|
||||
**כלל:** מנגנוני-הלמידה (Hermes, ניתוח-פידבק שבועי) **מציעים בלבד**. כל שינוי ב-
|
||||
[SKILL.md](../../skills/decision/SKILL.md) או ב-[legal-decision-lessons.md](../legal-decision-lessons.md)
|
||||
מחייב **בחינה ואישור ידניים של היו"ר/חיים** ואז commit ידני — **לעולם לא auto-committed**.
|
||||
Hermes כותב comment + `decision_lesson`, לא קבצים; ה-CEO השבועי כותב לקובץ אך הצעותיו
|
||||
מאומתות ידנית לפני קיבוע. זהו פֶּאֶט של [INV-G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant)
|
||||
על שכבת-הידע: גם הלמידה כפופה לשיקול-הדעת האנושי.
|
||||
### INV-LRN1: עדכון-ידע דורש שער-יו"ר — **שער מדורג** לפי סיכון (governance →G10)
|
||||
**כלל (מעודכן 2026-06-28, הכרעת-יו"ר):** השער **מדורג לפי סיכון-התוכן**, לא אחיד:
|
||||
- **מהות** (הלכה / תקדים / עובדה / כל שינוי ב-[SKILL.md](../../skills/decision/SKILL.md) או ב-[legal-decision-lessons.md](../legal-decision-lessons.md)) → **שער-קשיח**: בחינה ואישור ידניים של היו"ר/חיים ואז commit ידני — **לעולם לא auto-committed**. פאנל-ההלכות התלת-סוכני מציע בלבד.
|
||||
- **סגנון** (`decision_lessons` בקטגוריות style/structure/lexicon/tabular, וכן discussion_rules / transition_phrases / anti_patterns) שעבר **קונצנזוס-פאנל 2/2** → **זורם אוטומטית לכותב** (`review_status='approved'`), **הפיך**: היו"ר רואה ויכול **לבטל בדיעבד** ב-/training. זהו שינוי-קול נמוך-סיכון (טהור-מהות לפי INV-LRN5), בקרת-איכות מובנית (2 מודלים), והפיכוּת — ולכן עדיין "תחת בקרת-המשתמש" במובן NCSC/CEPEJ (veto, לא אישור-מראש על כל פריט).
|
||||
|
||||
זהו פֶּאֶט של [INV-G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant) על שכבת-הידע: הלמידה כפופה לשיקול-הדעת האנושי — קשיח למהות, הפיך-veto לסגנון. **מימוש:** `scripts/style_lesson_panel.py:_review_status_for` קובע `approved` לקטגוריות-סגנון בקונצנזוס, `proposed` אחרת; הכותב צורך רק `approved` ([db.get_recent_decision_lessons]).
|
||||
**מקורות:** NCSC/JTC — *Principles & Practices for AI Use in Courts* (human-in-the-loop;
|
||||
never replace human judgment) · Council of Europe / CEPEJ (2018, under user control) ·
|
||||
Federal Judicial Center — *Judicial Writing Manual* (2d ed.) | סטטוס: verified
|
||||
@@ -249,6 +273,26 @@ LegalBench (gemini-2.5-flash) · Trust-or-Escalate (ICLR 2025) | סטטוס: ver
|
||||
החלטת-יו"ר 2026-06-19; מקור-אמת: [`../legal-principles-redesign.md`](../legal-principles-redesign.md).
|
||||
**הפרה ידועה:** — (חדש)
|
||||
|
||||
### INV-LRN8: סינתזת-לקחים מעוגנת + מגודרת-שער-מדורג (#158 → G2/G10/INV-AH)
|
||||
**כלל:** לקחי-סגנון (`decision_lessons`) חופפים מאוחדים ל**לקח-על אחד** עשיר ומוכלל, כך
|
||||
שהסט שזורם לכותב **קטֵן ומשתבח** (פותר את החיתוך-השקט limit=15, #157) — Authorial Style
|
||||
Profiling (§0.1: פרופיל-מופשט מנצח ערימת-דוגמאות). המנגנון מחקה את סינתזת-הקנוני (INV-LRN6)
|
||||
**על אותה טבלה** — אין מאגר-מקביל (G2): (א) אשכול greedy לפי cosine (`LESSON_SYNTH_CLUSTER_THRESHOLD`)
|
||||
בתוך shard של `practice_area`+`category`; (ב) מיזוג ע"י `claude_session` **מעוגן-מקור** — נובע
|
||||
מלקחי-המקור בלבד, סגנון-בלבד (לא מהות, INV-LRN5), abstain אם לא-מתמזג (INV-AH); (ג) **שער-drift** —
|
||||
הלקח-הממוזג מוטמע-מחדש ומושווה (cosine) ל-centroid האשכול; מתחת ל-`LESSON_SYNTH_DRIFT_FLOOR`
|
||||
נדחה. הלקח-על נכתב `source='synthesis'` עם `synthesized_from`, והמקורות → `review_status='superseded'`
|
||||
(provenance, לא נצרכים-כותב). **שער מדורג-הפיך (הכרעת-יו"ר 2026-06-28):** מאחר שכל המקורות `approved`,
|
||||
הלקח-על זורם `approved` עם veto-יו"ר ב-/training — דחייתו משחזרת את המקורות ל-`approved`
|
||||
(`db.revert_lesson_synthesis`). idempotency: lookup-cosine מול synthesis קיים לפני INSERT.
|
||||
**מסלול-יחיד (G2):** הכלי `lesson_synthesize_pending` והסקריפט `backfill_lesson_synthesis.py` עוברים
|
||||
שניהם דרך `services/lesson_synthesis.py`. audit CSV ב-`data/audit/lesson-synthesis-*.csv`.
|
||||
**מקורות:** Authorial Style Profiling · grounding-vs-hallucination (Stanford RegLab) · CoVe (arXiv:2309.11495) | סטטוס: verified
|
||||
**אכיפה:** `services/lesson_synthesis.py` (אשכול/מיזוג/drift), `db.{fetch_synthesis_candidates,
|
||||
apply_lesson_synthesis,revert_lesson_synthesis,nearest_synthesis_lesson,synthesis_shards}`, SCHEMA_V46
|
||||
(`embedding`+`synthesized_from`). config `LESSON_SYNTH_*`.
|
||||
**הפרה ידועה:** — (חדש)
|
||||
|
||||
---
|
||||
|
||||
## 4. הג'ובים המתוזמנים (תמיכת-תשתית ללולאה)
|
||||
|
||||
@@ -59,6 +59,16 @@ Paperclip בקונפליקט (project-specific מנצח default), אך אינו
|
||||
ל-`SKILL.md`/`lessons.md` — מופע של [G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant).
|
||||
- **company_id פר-סוכן.** כל שורה בטבלה מיוצגת פעמיים (CMP + CMPA); ה-CEO לכל חברה שונה
|
||||
([X2 §1](X2-multi-company.md)). הסוכן פועל רק בטווח-החברה שלו ([X2 §2](X2-multi-company.md)).
|
||||
- **שטן-מליץ (Gemini red-team) — שער-קבע אחרי הניתוח, לא חלק מ-7-הדומייניים.** סוכן
|
||||
`legal-analyst-gemini-critique` (`gemini_local`, CMP+CMPA) רץ **אחרי** שלב-הניתוח של ה-Case
|
||||
Analyst (Opus) ו**לפני** הכותב, כ**שער-קבע (standing gate)** שה-CEO מפעיל **אוטומטית** — לא
|
||||
on-demand. הוא read-only ומפיק `critique-gemini.md` = **מזכר-לידים לא-סמכותי**. ה-CEO **עוצר
|
||||
את הזרימה לאישור-יו"ר של הלידים** (ה-issue הראשי ל-`in_review`); רק לידים שהיו"ר מאשר מומרים
|
||||
ל-`chair_directions` (דרך מנגנון-ההנחיות הקיים — `record_chair_feedback` → `get_chair_directions`
|
||||
→ `approve_direction`), והכותב צורך **רק** את פלט-המנתח המעוגן + ההנחיות-המאושרות — **לעולם
|
||||
לא** את הלידים הגולמיים. מקיים [INV-AG4](#inv-ag4-שער-שטן-מליץ--red-team-לידים-לא-סמכותיים-תחת-אישור-יור) +
|
||||
[04-analysis-writing §1.6](04-analysis-writing.md). מקור-אמת לזרימה: [legal-ceo.md](../../.claude/agents/legal-ceo.md)
|
||||
"שלב A2"/"שלב A3" + [legal-analyst-gemini-critique.md](../../.claude/agents/legal-analyst-gemini-critique.md).
|
||||
|
||||
### 2א. מפת-הרשאות (tool grants) — frontmatter מול הוראות
|
||||
|
||||
@@ -140,6 +150,25 @@ another company`, [X2 §2](X2-multi-company.md)).
|
||||
**אכיפה:** בדיקת-עקביות tools↔instructions (FU-13 ✅ 2026-06-06). אכיפה אוטומטית עתידית — בתת-פרויקט 5 (spec-guardian).
|
||||
**הפרה ידועה:** — (טופל ב-FU-13: legal-analyst קיבל `aggregate_claims_to_arguments`; researcher כבר היה תקין; `extract_references`/`extract_internal_citations` הם מטלת-researcher, לא analyst — ראה §2א).
|
||||
|
||||
### INV-AG4: שער שטן-מליץ — red-team לידים לא-סמכותיים תחת אישור-יו"ר
|
||||
**כלל:** אחרי שלב-הניתוח (`analysis-and-research.md` תקין) וב**לפני** הפעלת הכותב, ה-CEO מפעיל
|
||||
**אוטומטית** את סוכן שטן-מליץ (Gemini red-team, read-only) כ**שער-קבע** — לא on-demand. הפלט
|
||||
(`critique-gemini.md`) הוא **מזכר-לידים לא-סמכותי**; ה-CEO **עוצר את הזרימה לעצירת-אישור קשיחה
|
||||
של היו"ר** (issue ראשי ל-`in_review` + מייל) ואינו מתקדם לכותב בלי הכרעת-יו"ר מפורשת. **רק לידים
|
||||
שהיו"ר אישר** מומרים ל-`chair_directions` דרך מנגנון-ההנחיות הקיים (`record_chair_feedback`
|
||||
→ `get_chair_directions` → `approve_direction`); לידים שנדחו נמחקים. הכותב צורך **אך-ורק** את
|
||||
פלט-המנתח המעוגן + ההנחיות-המאושרות — **לעולם לא** את הלידים הגולמיים. מופע של
|
||||
[G10](00-constitution.md#inv-g10-המערכת-מסייעת--שערים-אנושיים-הם-invariant) (שער אנושי
|
||||
לא-עקיף) ושל [INV-AH](../anti-hallucination-gate.md) / [INV-LRN5](07-learning.md) (לידים
|
||||
לא-סמכותיים, אינם מוזנים אוטומטית לקול/למהות).
|
||||
**מקור-סמכות:** [legal-ceo.md](../../.claude/agents/legal-ceo.md) ("שלב A2"/"שלב A3" + "מפת
|
||||
סטטוסים") + [legal-analyst-gemini-critique.md](../../.claude/agents/legal-analyst-gemini-critique.md)
|
||||
+ [HEARTBEAT.md §7](../../.claude/agents/HEARTBEAT.md). (invariant פרויקטלי-תפעולי — ללא
|
||||
פרוטוקול ≥3-המקורות; משרת את G10 + INV-AH/INV-LRN5.)
|
||||
**אכיפה:** פרוצדורלית (נוהל ה-CEO — "אל תמשיך לכותב בלי `critique-gemini.md` + אישור-יו"ר ללידים")
|
||||
+ עצירת-`in_review` של ה-issue הראשי; אין שער-קוד אוטומטי (כמו יתר ה-INV-AG*).
|
||||
**הפרה ידועה:** — (שינוי-מדיניות יו"ר 2026-06-30: שטן-מליץ עבר מ-on-demand ל-שער-קבע; TaskMaster `legal-ai` #211).
|
||||
|
||||
---
|
||||
|
||||
## 5. חיווט הספ לסוכנים — בוצע (FU-8b)
|
||||
|
||||
@@ -105,13 +105,36 @@ TanStack Query — *Important Defaults* (staleTime/refetch) (https://tanstack.co
|
||||
**אכיפה:** `halacha_backlog` מרונדר ב-/operations (לא נזרק); `findings_approved` (review_status, צרכן אמיתי)
|
||||
החליף את `findings_applied` (דגל מת); מוני-סוכנים מסמנים "חלקי" כשחברה לא-נטענה (גל-1 #130).
|
||||
|
||||
### INV-UI9: זמן-מאוחסן ב-UTC · תצוגה אנושית דטרמיניסטית ב-Asia/Jerusalem
|
||||
**כלל:** **האחסון נשאר UTC** מקצה-לקצה — Postgres `TIMESTAMPTZ`, וה-API מחזיר ISO-UTC; אין נרמול-tz
|
||||
בשכבת-האחסון/ה-API. **שכבת-התצוגה בלבד** ממירה, ובאופן **דטרמיניסטי**: כל חותמת-זמן אנושית מרונדרת
|
||||
ב-`timeZone: "Asia/Jerusalem"` (locale `he-IL`), בלי תלות ב-tz של ה-host/קונטיינר/דפדפן. כיוון
|
||||
שהקונטיינר רץ ב-UTC, פירמוט ad-hoc (`new Date(iso).toLocaleDateString("he-IL")`, `.getHours()`,
|
||||
`toISOString().slice(0,10)`) מציג UTC תחת SSR (ושוב UTC בכל runtime לא-ישראלי) → drift. נעיצת
|
||||
`Asia/Jerusalem` מבטיחה ש-SSR והדפדפן מסכימים. **פורמט-התצוגה (צורת התאריך/שעה) נשמר זהה — רק ה-tz
|
||||
מנורמל.** מופע של [G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)
|
||||
(מפרמט-תאריך **יחיד**, אין פירמוט-זמן מקביל-מפוזר) בשכבת-התצוגה.
|
||||
**מקורות:** ECMAScript Internationalization API — `Intl.DateTimeFormat` `timeZone` option
|
||||
(https://tc39.es/ecma402/#datetimeformat-objects) · MDN — *Intl.DateTimeFormat* (IANA time zones)
|
||||
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat) ·
|
||||
Next.js — *Rendering* (SSR משתמש בשעון-השרת אם לא ננעץ)
|
||||
(https://nextjs.org/docs/app/building-your-application/rendering) | סטטוס: verified
|
||||
**אכיפה:** מפרמט-תאריך יחיד ב-[web-ui/src/lib/format-date.ts](../../web-ui/src/lib/format-date.ts)
|
||||
(`formatDate`/`formatDateShort`/`formatDateLong`/`formatDateTime`/`formatDateTimeFull`/`formatTime`/
|
||||
`formatIsoDate`/`formatRelative` + עוזרי-Israel `getIsraelYear`/`israelDayKey`/`israelMidnightMs`/
|
||||
`israelParts`), כולם נעוצים ל-`Asia/Jerusalem`; כל משטחי-ה-UI מייבאים ממנו ולא מפרמטים tz ad-hoc.
|
||||
פירמוט-**מספרים** (`n.toLocaleString`) מחוץ-לתחום (אינו חותמת-זמן). **חריג מוצהר:** קלט
|
||||
`<input type="datetime-local">` (בקרת-burst ב-`/operations`) הוא ערך הניתן-לכתיבה ע"י המפעיל, לא תצוגת-
|
||||
מאוחסן — נשאר בנייה מקומית. **אודיט-נלווה (לא מיושם):** הגדרת `TZ=Asia/Jerusalem` בקונטיינר בטוחה רק
|
||||
אם אף לוגיקה עסקית אינה תלויה בשעון-ה-process כ-UTC.
|
||||
|
||||
---
|
||||
|
||||
## 3. כללי-עיצוב (Design Rules) — נגזרים מה-invariants
|
||||
- **SSoT ל-enums/תוויות/tones:** כל enum (CaseStatus, PracticeArea, AppealSubtype, DocType, outcome) +
|
||||
תוויותיו + צבעיו מוגדרים **פעם אחת** ונצרכים מיבוא — לא משוכפלים בין דפים/רכיבים (מופע UI1/G2).
|
||||
- **helpers משותפים:** פירמוט-תאריך, builder ל-FormData (העלאות), רכיב-שגיאה, query-config (intervals) —
|
||||
משותפים, לא מועתקים.
|
||||
- **helpers משותפים:** פירמוט-תאריך (מפרמט-יחיד נעוץ-Asia/Jerusalem ב-[format-date.ts](../../web-ui/src/lib/format-date.ts),
|
||||
INV-UI9), builder ל-FormData (העלאות), רכיב-שגיאה, query-config (intervals) — משותפים, לא מועתקים.
|
||||
- **חוזי-טופס:** ראה INV-UI6 ([X8](X8-field-provenance.md)).
|
||||
|
||||
הממצאים הקונקרטיים (כפילויות, הגדרות-שגויות, redundancy) ב-[ui-audit.md](ui-audit.md); התיקון — **FU-10**.
|
||||
|
||||
@@ -232,3 +232,25 @@ FU-7 אחרי FU-1; FU-5 אחרי FU-2; FU-8 אחרי ייצוב-הספ. **(מח
|
||||
אחרי FU-1. FU-11 (מילוי-שדות) עצמאי. FU-13 (סוכנים+skills) אחרי ייצוב-הספ.
|
||||
**סיווג:** pure-code — FU-9/10/11/13/14; +data-migration קל — FU-12; +chair-decision — FU-15 (rotation סודות).
|
||||
priority בפועל — של היו"ר.
|
||||
|
||||
---
|
||||
|
||||
## ✅ ווידוא-סגירה — 7 דליפות עיצוב-מחדש זרימת-העבודה (WS7, #207, 2026-06-30)
|
||||
|
||||
תת-פרויקט עיצוב-מחדש זרימת-העבודה (תוכנית `groovy-doodling-token`, WS7) דרש סגירת **7 דליפות
|
||||
ידועות** תוך-כדי. ביקורת חוצת-קוד (#207) אימתה שכל ה-7 כבר **נסגרו במחזורים קודמים** (בעיקר
|
||||
FU-1/4/5/6/7 + גלי-ה-IA), ושהספ נשא תיאורי-הפרה מיושנים. ה-PR מיישר את הספ למצב-הקוד בפועל
|
||||
ומאמת כל סגירה בבדיקה. **אין כאן GAP/FU חדש — זו ביקורת-יישור, לא פתרון-מחדש (G2).**
|
||||
|
||||
| # | דליפה | invariant | סטטוס | FU | סגירה (קוד) | בדיקה |
|
||||
|---|-------|-----------|-------|-----|-------------|-------|
|
||||
| 1 | הלכות חוצות-קורפוס (#56) | INV-RET1/G5 (GAP-10) | ✅ סגור | FU-4 | `cl.source_kind` ב-`halacha_filters` בשתי הפונקציות (`db.py:7516,7519`) | `test_precedent_corpus_isolation.py` |
|
||||
| 2 | backlog-הלכות בלתי-נראה | INV-QA1/G10 (GAP-14) | ✅ סגור | FU-5 | health `halacha_backlog` (`app.py:2352-2364`) + כלי `extraction_status`/`halachot_pending` | — (health-endpoint) |
|
||||
| 3 | אין eval-harness | INV-RET4/G8 (GAP-11) | ✅ סגור | FU-5 | `scripts/eval_retrieval.py` (P/R/MRR/nDCG מול gold-set+baseline) | `eval_retrieval.py --self-test` ("ALL PASS") |
|
||||
| 4 | שער-ייצוא לא hard-block | INV-EX3/QA3/G10 (GAP-15) | ✅ סגור | FU-6 | `export_docx` בודק `qa_run_exists`+`get_critical_qa_failures` לפני exporter (`drafting.py:462-494`) | `test_export_qa_gate.py` |
|
||||
| 5 | מטא במסלול-פנימי | INV-ING3/G2 (GAP-02) | ✅ סגור | FU-1 | מסלול קנוני `ingest.ingest_document` מתזמן metadata+halacha יחד (`ingest.py:233-234`) | `test_unified_ingest.py` |
|
||||
| 6 | DOCX זוחל למקור-אמת | INV-EX1/G2 (GAP-17) | ✅ מגודר | FU-7 | חוזה: `active_draft_path`=אנקור בלבד; drift בדגל `cases.blocks_stale` (V22) | (חוזה+דגל; שארית health-check low-pri) |
|
||||
| 7 | cache-invalidation ב-UI | INV-UI5/IA (GAP-33) | ✅ סגור | FU-10/IA | `qc.invalidateQueries` על מוטציות (`web-ui/src/lib/api/*.ts`) + גלי-IA #130-132 | (TanStack Query) |
|
||||
|
||||
**שאריות (low-pri, מתועדות לא-חוסמות):** דליפה #6 — health-check שמתריע על `blocks_stale=true`
|
||||
עתיק (הדגל קיים ונאכף; חסר רק התרעת-נראות). אינה חוסמת את WS7; ניתן ל-FU-7-המשך.
|
||||
|
||||
348
docs/superpowers/plans/2026-05-16-hooks-execution.md
Normal file
348
docs/superpowers/plans/2026-05-16-hooks-execution.md
Normal file
@@ -0,0 +1,348 @@
|
||||
# Hooks: Case Status Webhooks Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** כאשר status של תיק משתנה ב-legal-ai (e.g. `qa_failed`, `exported`), ה-plugin מקבל webhook, מעדכן את ה-issue ב-Paperclip, ומעיר את ה-CEO במקרה הצורך.
|
||||
|
||||
**Architecture:** Legal-ai REST API קורא `pc_request("POST", "/api/plugins/marcusgroup.legal-ai/webhooks/case-status", ...)` אחרי כל שינוי status. ה-plugin מטפל ב-`onWebhook()` ומגיב: מוסיף תגובה לissue, מעיר CEO אם QA נכשל.
|
||||
|
||||
**Tech Stack:** TypeScript (plugin-legal-ai), Python/FastAPI (legal-ai web), `@paperclipai/plugin-sdk@2026.325.0`, `httpx` (Python), `pc_request` helper.
|
||||
|
||||
---
|
||||
|
||||
## File Map
|
||||
|
||||
| Action | File |
|
||||
|--------|------|
|
||||
| Modify | `plugin-legal-ai/src/worker.ts` — add `onWebhook()` to `definePlugin({})` |
|
||||
| Modify | `plugin-legal-ai/plugin.json` — add `"webhooks.receive"` capability |
|
||||
| Modify | `plugin-legal-ai/src/manifest.ts` — add webhook capability |
|
||||
| Modify | `legal-ai/web/app.py` — emit webhook after `PUT /api/cases/{case_number}` |
|
||||
| Modify | `legal-ai/web/paperclip_api.py` — add `emit_webhook()` helper |
|
||||
|
||||
---
|
||||
|
||||
## Task 1: Add `emit_webhook` helper ב-Python
|
||||
|
||||
**Files:**
|
||||
- Modify: `legal-ai/web/paperclip_api.py`
|
||||
|
||||
- [ ] **Step 1: קרא את הקובץ הקיים**
|
||||
|
||||
```bash
|
||||
head -90 /home/chaim/legal-ai/web/paperclip_api.py
|
||||
```
|
||||
|
||||
- [ ] **Step 2: הוסף את ה-helper בסוף הקובץ**
|
||||
|
||||
פתח `/home/chaim/legal-ai/web/paperclip_api.py` והוסף אחרי הפונקציה `pc_request`:
|
||||
|
||||
```python
|
||||
async def emit_case_status_webhook(
|
||||
case_number: str,
|
||||
old_status: str,
|
||||
new_status: str,
|
||||
company_id: str | None = None,
|
||||
run_id: str | None = None,
|
||||
) -> None:
|
||||
"""Notify the Paperclip plugin that a case status changed.
|
||||
|
||||
Fire-and-forget: logs errors but never raises, so callers aren't blocked.
|
||||
"""
|
||||
try:
|
||||
await pc_request(
|
||||
"POST",
|
||||
"/api/plugins/marcusgroup.legal-ai/webhooks/case-status",
|
||||
json={
|
||||
"caseNumber": case_number,
|
||||
"oldStatus": old_status,
|
||||
"newStatus": new_status,
|
||||
"companyId": company_id,
|
||||
"timestamp": datetime.utcnow().isoformat() + "Z",
|
||||
},
|
||||
run_id=run_id,
|
||||
timeout=5.0,
|
||||
)
|
||||
except Exception as exc:
|
||||
logger.warning("emit_case_status_webhook failed: %s", exc)
|
||||
```
|
||||
|
||||
> **הערה:** `datetime` ו-`logger` כבר מיובאים ב-`app.py`. בדוק שהם מיובאים גם ב-`paperclip_api.py` — אם לא, הוסף `from datetime import datetime` ו-`import logging; logger = logging.getLogger(__name__)` בראש הקובץ.
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
git add web/paperclip_api.py
|
||||
git commit -m "feat: add emit_case_status_webhook helper"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 2: צרף webhook לendpoint `PUT /api/cases/{case_number}`
|
||||
|
||||
**Files:**
|
||||
- Modify: `legal-ai/web/app.py`
|
||||
|
||||
- [ ] **Step 1: מצא את ה-endpoint**
|
||||
|
||||
```bash
|
||||
grep -n "PUT\|case_number\|update_case" /home/chaim/legal-ai/web/app.py | head -30
|
||||
```
|
||||
|
||||
- [ ] **Step 2: קרא את הenable endpoint המלא**
|
||||
|
||||
זהה את הסקציה המלאה של ה-endpoint ואת הייבוא הקיים.
|
||||
|
||||
- [ ] **Step 3: הוסף import ל-emit_webhook**
|
||||
|
||||
בראש `app.py`, בסקציית ה-imports מ-`paperclip_api`:
|
||||
```python
|
||||
from .paperclip_api import pc_request, emit_case_status_webhook
|
||||
```
|
||||
|
||||
- [ ] **Step 4: הוסף webhook emit בתוך הendpoint**
|
||||
|
||||
אחרי שהקוד מעדכן את ה-case (לפני ה-`return`), הוסף:
|
||||
|
||||
```python
|
||||
# Notify plugin about status change (fire-and-forget)
|
||||
if updates.get("status") and old_status != updates["status"]:
|
||||
background_tasks.add_task(
|
||||
emit_case_status_webhook,
|
||||
case_number=case_number,
|
||||
old_status=old_status,
|
||||
new_status=updates["status"],
|
||||
company_id=str(case.get("company_id")),
|
||||
)
|
||||
```
|
||||
|
||||
> אם ה-endpoint כבר מקבל `background_tasks: BackgroundTasks` — השתמש בו. אם לא, הוסף `background_tasks: BackgroundTasks` לחתימת הפונקציה. הוסף `from fastapi import BackgroundTasks` ל-imports.
|
||||
|
||||
- [ ] **Step 5: שמור את ה-`old_status` לפני ה-update**
|
||||
|
||||
בתחילת ה-endpoint handler, לפני קריאת ה-DB update:
|
||||
```python
|
||||
old_status = (await db.get_case(case_number) or {}).get("status", "")
|
||||
```
|
||||
|
||||
- [ ] **Step 6: בדיקה בסיסית — שלח PUT ידני**
|
||||
|
||||
```bash
|
||||
curl -s -X PUT https://legal-ai.nautilus.marcusgroup.org/api/cases/1130-25 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"status": "in_progress"}' | jq .status
|
||||
```
|
||||
|
||||
בדוק ב-Paperclip logs שהwebhook נשלח (עדיין לא מטופל בצד ה-plugin):
|
||||
```bash
|
||||
pm2 logs paperclip --lines 20
|
||||
```
|
||||
|
||||
- [ ] **Step 7: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
git add web/app.py
|
||||
git commit -m "feat: emit case-status webhook on PUT /api/cases/:case"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 3: הוסף `onWebhook()` ל-plugin
|
||||
|
||||
**Files:**
|
||||
- Modify: `plugin-legal-ai/src/worker.ts`
|
||||
|
||||
- [ ] **Step 1: קרא את `definePlugin({})` הקיים**
|
||||
|
||||
```bash
|
||||
grep -n "definePlugin\|onWebhook\|onHealth\|onShutdown" /home/chaim/plugin-legal-ai/src/worker.ts
|
||||
```
|
||||
|
||||
- [ ] **Step 2: הוסף את `onWebhook` handler**
|
||||
|
||||
בתוך הobject שמועבר ל-`definePlugin({})`, אחרי `setup(ctx)`:
|
||||
|
||||
```typescript
|
||||
onWebhook: async (input) => {
|
||||
const { endpointKey, payload, companyId } = input as {
|
||||
endpointKey: string;
|
||||
payload: {
|
||||
caseNumber: string;
|
||||
oldStatus: string;
|
||||
newStatus: string;
|
||||
companyId: string;
|
||||
timestamp: string;
|
||||
};
|
||||
companyId: string;
|
||||
};
|
||||
|
||||
if (endpointKey !== "case-status") return;
|
||||
|
||||
const { caseNumber, oldStatus, newStatus } = payload;
|
||||
ctx.logger.info(`Webhook: ${caseNumber} ${oldStatus} → ${newStatus}`);
|
||||
|
||||
// Find the Paperclip issue linked to this case
|
||||
const stateKey = `case:${caseNumber}`;
|
||||
const issueId = await ctx.state.get({ companyId }, stateKey);
|
||||
if (!issueId) {
|
||||
ctx.logger.warn(`No issue found for case ${caseNumber}`);
|
||||
return;
|
||||
}
|
||||
|
||||
const statusLabels: Record<string, string> = {
|
||||
in_progress: "🔄 בעבודה",
|
||||
drafted: "✍️ טיוטה מוכנה",
|
||||
qa_failed: "❌ QA נכשל",
|
||||
exported: "📄 יוצא ל-DOCX",
|
||||
reviewed: "✅ נבדק",
|
||||
final: "🎯 סופי",
|
||||
};
|
||||
|
||||
const label = statusLabels[newStatus] ?? newStatus;
|
||||
|
||||
// Post a status comment on the issue
|
||||
await ctx.issues.createComment({
|
||||
issueId: issueId as string,
|
||||
body: `**עדכון סטטוס:** ${label} (היה: ${oldStatus})`,
|
||||
});
|
||||
|
||||
// Wake CEO if QA failed
|
||||
if (newStatus === "qa_failed") {
|
||||
const companies = await ctx.companies.list();
|
||||
const company = companies.find((c) => c.id === companyId);
|
||||
if (!company) return;
|
||||
|
||||
const CEO_IDS: Record<string, string> = {
|
||||
"42a7acd0-30c5-4cbd-ac97-7424f65df294": "752cebdd-6748-4a04-aacd-c7ab0294ef33",
|
||||
"8639e837-4c9d-47fa-a76b-95788d651896": "cdbfa8bc-3d61-41a4-a2e7-677ec7d34562",
|
||||
};
|
||||
const ceoId = CEO_IDS[companyId];
|
||||
if (ceoId) {
|
||||
await ctx.agents.invoke(ceoId, companyId, {
|
||||
prompt: `תיק ${caseNumber} נכשל בבדיקת QA. עיין בתוצאות QA ותקן את הבעיות.`,
|
||||
reason: "qa_failed webhook",
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
```
|
||||
|
||||
> **הערה:** `ctx` חייב להיות נגיש ב-`onWebhook`. אם `ctx` מוגדר בתוך `setup()` בלבד — הוצא אותו ל-closure חיצוני של ה-plugin object (ראה את הדפוס הקיים ב-`worker.ts`).
|
||||
|
||||
- [ ] **Step 3: בדק TypeScript**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai && npx tsc --noEmit
|
||||
```
|
||||
|
||||
Expected: 0 errors.
|
||||
|
||||
- [ ] **Step 4: Build**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai && npm run build
|
||||
```
|
||||
|
||||
Expected: `dist/worker.js` נוצר ללא שגיאות.
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai
|
||||
git add src/worker.ts
|
||||
git commit -m "feat: add onWebhook handler for case-status events"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 4: הוסף capability ל-`plugin.json` ול-`manifest.ts`
|
||||
|
||||
**Files:**
|
||||
- Modify: `plugin-legal-ai/plugin.json`
|
||||
- Modify: `plugin-legal-ai/src/manifest.ts`
|
||||
|
||||
- [ ] **Step 1: הוסף `"webhooks.receive"` ל-capabilities**
|
||||
|
||||
ב-`plugin-legal-ai/plugin.json`, בarray `"capabilities"`, הוסף:
|
||||
```json
|
||||
"webhooks.receive"
|
||||
```
|
||||
|
||||
- [ ] **Step 2: הוסף גם ב-`manifest.ts`**
|
||||
|
||||
```bash
|
||||
grep -n "capabilities\|webhooks" /home/chaim/plugin-legal-ai/src/manifest.ts
|
||||
```
|
||||
|
||||
הוסף `"webhooks.receive"` לarray שם.
|
||||
|
||||
- [ ] **Step 3: Re-install plugin**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai && npm run build
|
||||
npx paperclipai plugin uninstall marcusgroup.legal-ai \
|
||||
--api-base http://localhost:3100 --api-key pcapi_legal_install_key_2026
|
||||
npx paperclipai plugin install /home/chaim/plugin-legal-ai \
|
||||
--api-base http://localhost:3100 --api-key pcapi_legal_install_key_2026
|
||||
pm2 restart paperclip
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai
|
||||
git add plugin.json src/manifest.ts
|
||||
git commit -m "feat: add webhooks.receive capability to plugin manifest"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 5: בדיקה end-to-end
|
||||
|
||||
- [ ] **Step 1: Deploy legal-ai**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
git push origin main
|
||||
# המתן לבנייה (~2-4 דקות)
|
||||
```
|
||||
|
||||
- [ ] **Step 2: שנה סטטוס תיק**
|
||||
|
||||
```bash
|
||||
curl -s -X PUT https://legal-ai.nautilus.marcusgroup.org/api/cases/1130-25 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"status": "qa_failed"}' | jq .status
|
||||
```
|
||||
|
||||
- [ ] **Step 3: בדוק שהתגובה הוספה ל-Paperclip issue**
|
||||
|
||||
```bash
|
||||
# מצא את ה-issue הקשור לתיק 1130-25
|
||||
pm2 logs paperclip --lines 30 | grep "1130-25\|webhook\|qa_failed"
|
||||
```
|
||||
|
||||
Expected: תגובה "❌ QA נכשל" הוספה לissue. CEO הועיר.
|
||||
|
||||
- [ ] **Step 4: בדוק שינוי סטטוס שגרתי (לא QA)**
|
||||
|
||||
```bash
|
||||
curl -s -X PUT https://legal-ai.nautilus.marcusgroup.org/api/cases/1130-25 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"status": "drafted"}' | jq .status
|
||||
```
|
||||
|
||||
Expected: תגובה "✍️ טיוטה מוכנה" בissue. CEO **לא** הועיר.
|
||||
|
||||
---
|
||||
|
||||
## אימות סופי
|
||||
|
||||
| בדיקה | פקודה | תוצאה מצופה |
|
||||
|-------|-------|-------------|
|
||||
| QA נכשל → CEO מועיר | `PUT status=qa_failed` | תגובה + agent invocation |
|
||||
| exported → תגובה בלבד | `PUT status=exported` | תגובה בלבד |
|
||||
| שינוי ללא status | `PUT title=...` | שום webhook |
|
||||
| תיק ללא issue | webhook לתיק חדש | לוג warning, ללא crash |
|
||||
306
docs/superpowers/plans/2026-05-16-per-agent-claude-md.md
Normal file
306
docs/superpowers/plans/2026-05-16-per-agent-claude-md.md
Normal file
@@ -0,0 +1,306 @@
|
||||
# Per-Agent CLAUDE.md Versioning & Validation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** הוסף validation ו-version tracking לקבצי הוראות הסוכנים. כעת, לפני שה-sync script מחיל שינויים, הוא מאמת שכל `instructionsFilePath` קיים. בנוסף, metadata של הסוכן ב-DB יכיל `claude_md_mtime` — השינוי האחרון בקובץ — כדי לזהות drift.
|
||||
|
||||
**Architecture:** `sync_agents_across_companies.py` מקבל `--check-instructions` flag שסורק את כל הסוכנים ומדווח על קבצים חסרים/ישנים. ב-`--apply`, מתווספת בדיקת pre-flight שמבטלת את הsync אם קובץ חסר. `agents.metadata` מקבל `claude_md_mtime` עם ה-mtime בפועל של הקובץ.
|
||||
|
||||
**Tech Stack:** Python 3.10+, asyncpg, httpx, `os.path.getmtime()`, Paperclip REST API (`PATCH /api/agents/{id}`).
|
||||
|
||||
---
|
||||
|
||||
## File Map
|
||||
|
||||
| Action | File |
|
||||
|--------|------|
|
||||
| Modify | `legal-ai/scripts/sync_agents_across_companies.py` — `--check-instructions` flag, pre-flight, metadata update |
|
||||
|
||||
זה הקובץ היחיד שצריך לגעת בו. כל שאר הלוגיקה קיימת כבר.
|
||||
|
||||
---
|
||||
|
||||
## Task 1: הוסף `--check-instructions` flag
|
||||
|
||||
**Files:**
|
||||
- Modify: `legal-ai/scripts/sync_agents_across_companies.py`
|
||||
|
||||
- [ ] **Step 1: קרא את החלק של `argparse` בסקריפט**
|
||||
|
||||
```bash
|
||||
grep -n "argparse\|add_argument\|--verify\|--dry-run\|--apply" \
|
||||
/home/chaim/legal-ai/scripts/sync_agents_across_companies.py | head -20
|
||||
```
|
||||
|
||||
- [ ] **Step 2: הוסף את הargument**
|
||||
|
||||
מצא את הסקציה שמגדירה `args` והוסף:
|
||||
|
||||
```python
|
||||
parser.add_argument(
|
||||
"--check-instructions",
|
||||
action="store_true",
|
||||
help="Scan all agents' instructionsFilePath and report missing/outdated files",
|
||||
)
|
||||
```
|
||||
|
||||
- [ ] **Step 3: הוסף את הפונקציה `check_instructions()`**
|
||||
|
||||
הוסף לפני `async def main()`:
|
||||
|
||||
```python
|
||||
async def check_instructions(agents: list[dict]) -> bool:
|
||||
"""Print a report of all agents' instruction files. Returns True if all OK."""
|
||||
all_ok = True
|
||||
print(f"\n{'Agent':<30} {'File':<60} {'Status':<15} {'Size':>8} {'Modified'}")
|
||||
print("-" * 120)
|
||||
|
||||
for agent in agents:
|
||||
adapter_cfg = agent.get("adapter_config") or {}
|
||||
if isinstance(adapter_cfg, str):
|
||||
import json as _json
|
||||
adapter_cfg = _json.loads(adapter_cfg)
|
||||
|
||||
file_path = adapter_cfg.get("instructionsFilePath", "")
|
||||
name = agent.get("name", agent.get("id", "?"))[:29]
|
||||
|
||||
if not file_path:
|
||||
print(f"{name:<30} {'(none)':<60} {'⚠️ NOT SET':<15}")
|
||||
continue
|
||||
|
||||
if not os.path.exists(file_path):
|
||||
print(f"{name:<30} {file_path[-59:]:<60} {'❌ MISSING':<15}")
|
||||
all_ok = False
|
||||
continue
|
||||
|
||||
stat = os.stat(file_path)
|
||||
size_kb = stat.st_size // 1024
|
||||
mtime = datetime.fromtimestamp(stat.st_mtime).strftime("%Y-%m-%d %H:%M")
|
||||
|
||||
# Compare with DB metadata
|
||||
metadata = agent.get("metadata") or {}
|
||||
if isinstance(metadata, str):
|
||||
import json as _json
|
||||
metadata = _json.loads(metadata)
|
||||
|
||||
db_mtime = metadata.get("claude_md_mtime", "")
|
||||
actual_mtime = str(int(stat.st_mtime))
|
||||
drift = " ⚠️ DRIFT" if db_mtime and db_mtime != actual_mtime else ""
|
||||
|
||||
print(f"{name:<30} {file_path[-59:]:<60} {'✅ OK':<15} {size_kb:>6}KB {mtime}{drift}")
|
||||
|
||||
print()
|
||||
return all_ok
|
||||
```
|
||||
|
||||
> `from datetime import datetime` ו-`import os` — בדוק שמיובאים בראש הסקריפט. אם לא, הוסף.
|
||||
|
||||
- [ ] **Step 4: הוסף קריאה ל-`check_instructions()` ב-`main()`**
|
||||
|
||||
בתוך `async def main()`, אחרי שloading הagents מה-DB:
|
||||
|
||||
```python
|
||||
if args.check_instructions:
|
||||
all_ok = await check_instructions(master_agents + mirror_agents)
|
||||
sys.exit(0 if all_ok else 1)
|
||||
```
|
||||
|
||||
- [ ] **Step 5: בדיקה**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
python scripts/sync_agents_across_companies.py --check-instructions
|
||||
```
|
||||
|
||||
Expected: טבלה עם כל הסוכנים, paths, סטטוס ✅/❌.
|
||||
|
||||
- [ ] **Step 6: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
git add scripts/sync_agents_across_companies.py
|
||||
git commit -m "feat: add --check-instructions flag to sync script"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 2: הוסף pre-flight validation לפני `--apply`
|
||||
|
||||
**Files:**
|
||||
- Modify: `legal-ai/scripts/sync_agents_across_companies.py`
|
||||
|
||||
- [ ] **Step 1: מצא את נקודת הכניסה של `--apply`**
|
||||
|
||||
```bash
|
||||
grep -n "args.apply\|if.*apply\|apply.*mode" \
|
||||
/home/chaim/legal-ai/scripts/sync_agents_across_companies.py | head -10
|
||||
```
|
||||
|
||||
- [ ] **Step 2: הוסף pre-flight לפני apply**
|
||||
|
||||
בתחילת בלוק `--apply`, לפני כל שינוי:
|
||||
|
||||
```python
|
||||
if args.apply:
|
||||
# Pre-flight: abort if any agent is missing its instructions file
|
||||
print("🔍 Pre-flight: checking instruction files...")
|
||||
all_ok = await check_instructions(master_agents + mirror_agents)
|
||||
if not all_ok:
|
||||
print("❌ Abort: one or more instruction files are missing. Fix paths before --apply.")
|
||||
sys.exit(1)
|
||||
print("✅ Pre-flight passed.\n")
|
||||
# ... rest of apply logic ...
|
||||
```
|
||||
|
||||
- [ ] **Step 3: בדיקה — הפעל עם קובץ חסר (סימולציה)**
|
||||
|
||||
```bash
|
||||
# שנה זמנית path לקובץ שלא קיים
|
||||
cd /home/chaim/legal-ai
|
||||
python scripts/sync_agents_across_companies.py --dry-run 2>&1 | head -5
|
||||
```
|
||||
|
||||
Expected: dry-run עובר. אם תנסה `--apply` עם agent שhis file חסר — הsync יבוטל.
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
git add scripts/sync_agents_across_companies.py
|
||||
git commit -m "feat: add pre-flight instruction file validation before --apply"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 3: עדכן `agents.metadata` עם `claude_md_mtime`
|
||||
|
||||
**Files:**
|
||||
- Modify: `legal-ai/scripts/sync_agents_across_companies.py`
|
||||
|
||||
- [ ] **Step 1: מצא את `compute_diff()` או `apply_diff()`**
|
||||
|
||||
```bash
|
||||
grep -n "def compute_diff\|def apply_diff\|def build_patch\|metadata" \
|
||||
/home/chaim/legal-ai/scripts/sync_agents_across_companies.py | head -20
|
||||
```
|
||||
|
||||
- [ ] **Step 2: הוסף פונקציה `get_claude_md_mtime()`**
|
||||
|
||||
```python
|
||||
def get_claude_md_mtime(adapter_config: dict) -> str | None:
|
||||
"""Return the Unix mtime of the agent's instructionsFilePath, or None if missing."""
|
||||
path = adapter_config.get("instructionsFilePath", "")
|
||||
if not path or not os.path.exists(path):
|
||||
return None
|
||||
return str(int(os.path.getmtime(path)))
|
||||
```
|
||||
|
||||
- [ ] **Step 3: שלב mtime בbuild של metadata patch**
|
||||
|
||||
מצא את המקום שמכין את ה-`metadata` לsync. הוסף:
|
||||
|
||||
```python
|
||||
# Build metadata patch with claude_md_mtime
|
||||
current_metadata = master_agent.get("metadata") or {}
|
||||
if isinstance(current_metadata, str):
|
||||
import json as _json
|
||||
current_metadata = _json.loads(current_metadata)
|
||||
|
||||
adapter_cfg = master_agent.get("adapter_config") or {}
|
||||
if isinstance(adapter_cfg, str):
|
||||
import json as _json
|
||||
adapter_cfg = _json.loads(adapter_cfg)
|
||||
|
||||
mtime = get_claude_md_mtime(adapter_cfg)
|
||||
if mtime:
|
||||
current_metadata["claude_md_mtime"] = mtime
|
||||
current_metadata["claude_md_last_synced"] = datetime.utcnow().isoformat() + "Z"
|
||||
```
|
||||
|
||||
כלול את ה-`current_metadata` המעודכן ב-PATCH לAPI.
|
||||
|
||||
- [ ] **Step 4: בדוק שה-metadata מתעדכן**
|
||||
|
||||
הפעל `--dry-run` וחפש `claude_md_mtime` בoutput:
|
||||
```bash
|
||||
python scripts/sync_agents_across_companies.py --dry-run 2>&1 | grep -i "mtime\|metadata" | head -10
|
||||
```
|
||||
|
||||
לאחר `--apply`, בדוק ב-DB:
|
||||
```bash
|
||||
psql -h localhost -p 54329 -U paperclip -c \
|
||||
"SELECT name, metadata->>'claude_md_mtime' AS mtime FROM agents WHERE metadata->>'claude_md_mtime' IS NOT NULL LIMIT 5" \
|
||||
paperclip
|
||||
```
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
git add scripts/sync_agents_across_companies.py
|
||||
git commit -m "feat: track claude_md_mtime in agents.metadata during sync"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 4: הוסף `make check-agents` shortcut
|
||||
|
||||
**Files:**
|
||||
- Modify: `legal-ai/Makefile` (אם קיים) אחרת הוסף alias
|
||||
|
||||
- [ ] **Step 1: בדוק אם Makefile קיים**
|
||||
|
||||
```bash
|
||||
ls /home/chaim/legal-ai/Makefile 2>/dev/null && echo "EXISTS" || echo "MISSING"
|
||||
```
|
||||
|
||||
- [ ] **Step 2א: אם Makefile קיים — הוסף target**
|
||||
|
||||
```makefile
|
||||
check-agents:
|
||||
python scripts/sync_agents_across_companies.py --check-instructions
|
||||
|
||||
sync-agents-dry:
|
||||
python scripts/sync_agents_across_companies.py --dry-run
|
||||
|
||||
sync-agents:
|
||||
python scripts/sync_agents_across_companies.py --apply
|
||||
```
|
||||
|
||||
- [ ] **Step 2ב: אם Makefile לא קיים — הוסף alias ל-`~/.bashrc`**
|
||||
|
||||
```bash
|
||||
echo "alias check-agents='cd /home/chaim/legal-ai && python scripts/sync_agents_across_companies.py --check-instructions'" >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
- [ ] **Step 3: בדוק**
|
||||
|
||||
```bash
|
||||
# אם Makefile:
|
||||
make -C /home/chaim/legal-ai check-agents
|
||||
# אם alias:
|
||||
check-agents
|
||||
```
|
||||
|
||||
Expected: טבלת סוכנים מוצגת.
|
||||
|
||||
- [ ] **Step 4: Commit (אם Makefile)**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
git add Makefile
|
||||
git commit -m "feat: add check-agents and sync-agents make targets"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## אימות סופי
|
||||
|
||||
| בדיקה | פקודה | תוצאה מצופה |
|
||||
|-------|-------|-------------|
|
||||
| `--check-instructions` | `python sync_agents... --check-instructions` | טבלה עם ✅ לכל agent |
|
||||
| Pre-flight בולם apply | מחק קובץ זמנית + `--apply` | Abort עם הודעה ברורה |
|
||||
| mtime ב-DB | `SELECT metadata->>'claude_md_mtime' FROM agents` | timestamp לכל agent |
|
||||
| DRIFT זוהה | שנה קובץ + `--check-instructions` | ⚠️ DRIFT מוצג |
|
||||
| shortcut | `check-agents` או `make check-agents` | עובד |
|
||||
412
docs/superpowers/plans/2026-05-16-scheduled-agents.md
Normal file
412
docs/superpowers/plans/2026-05-16-scheduled-agents.md
Normal file
@@ -0,0 +1,412 @@
|
||||
# Scheduled Background Agents Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** הוסף 2 cron jobs לplugin: (1) תזכורת על תיקים תקועים 3+ ימים, (2) ניתוח פידבק יו"ר שבועי עם עדכון `decision-lessons.md` אוטומטי.
|
||||
|
||||
**Architecture:** שני jobs חדשים נרשמים ב-`ctx.jobs.register()`. Job 1 קורא `/api/cases/stale?days=3` (endpoint חדש ב-legal-ai) ומוסיף תגובה לissues תקועים. Job 2 קורא `/api/chair-feedback/weekly-summary` (endpoint חדש), שולח לCEO agent שמעדכן את `decision-lessons.md`.
|
||||
|
||||
**Tech Stack:** TypeScript (plugin-legal-ai jobs), Python/FastAPI (legal-ai web), asyncpg, Paperclip SDK `ctx.jobs.register()`, `ctx.agents.invoke()`.
|
||||
|
||||
---
|
||||
|
||||
## File Map
|
||||
|
||||
| Action | File |
|
||||
|--------|------|
|
||||
| Modify | `plugin-legal-ai/src/worker.ts` — register 2 new jobs |
|
||||
| Modify | `plugin-legal-ai/plugin.json` — declare 2 new job entries |
|
||||
| Modify | `plugin-legal-ai/src/manifest.ts` — add to jobs array |
|
||||
| Modify | `legal-ai/web/app.py` — add `GET /api/cases/stale` + `GET /api/chair-feedback/weekly-summary` |
|
||||
| Modify | `legal-ai/web/database.py` (or equivalent DB module) — add `get_stale_cases()` + `get_weekly_chair_feedback()` |
|
||||
|
||||
---
|
||||
|
||||
## Task 1: הוסף endpoint `GET /api/cases/stale`
|
||||
|
||||
**Files:**
|
||||
- Modify: `legal-ai/web/app.py`
|
||||
- Modify: `legal-ai/web/database.py` (שם DB queries מנוהלים — בדוק עם `grep -n "async def get_cases\|from.*database\|import.*db" /home/chaim/legal-ai/web/app.py | head -10`)
|
||||
|
||||
- [ ] **Step 1: מצא את module ה-DB**
|
||||
|
||||
```bash
|
||||
grep -n "^from\|^import\|db\." /home/chaim/legal-ai/web/app.py | head -20
|
||||
```
|
||||
|
||||
זהה את שם הmodule שמכיל את DB queries (בד"כ `database.py` או `db.py`).
|
||||
|
||||
- [ ] **Step 2: הוסף `get_stale_cases()` לmodule ה-DB**
|
||||
|
||||
```python
|
||||
async def get_stale_cases(days: int = 3) -> list[dict]:
|
||||
"""Return cases whose status is not 'final' and haven't been updated in `days` days."""
|
||||
async with get_db_connection() as conn:
|
||||
rows = await conn.fetch(
|
||||
"""
|
||||
SELECT case_number, title, status, company_id,
|
||||
updated_at,
|
||||
now() - updated_at AS age
|
||||
FROM cases
|
||||
WHERE status NOT IN ('final', 'new')
|
||||
AND updated_at < now() - ($1 || ' days')::interval
|
||||
ORDER BY updated_at ASC
|
||||
""",
|
||||
str(days),
|
||||
)
|
||||
return [dict(r) for r in rows]
|
||||
```
|
||||
|
||||
> `get_db_connection()` — השתמש בדפוס הקיים בקובץ. אם זה `asyncpg.connect()` ישיר, `asyncpg.create_pool()`, או context manager — העתק את הדפוס.
|
||||
|
||||
- [ ] **Step 3: הוסף endpoint ב-`app.py`**
|
||||
|
||||
```python
|
||||
@app.get("/api/cases/stale")
|
||||
async def list_stale_cases(days: int = 3):
|
||||
"""Cases stuck in non-final status for more than `days` days."""
|
||||
cases = await db.get_stale_cases(days=days)
|
||||
return {
|
||||
"cases": [
|
||||
{
|
||||
"case_number": c["case_number"],
|
||||
"title": c["title"],
|
||||
"status": c["status"],
|
||||
"company_id": str(c["company_id"]),
|
||||
"days_stale": c["age"].days,
|
||||
}
|
||||
for c in cases
|
||||
],
|
||||
"total": len(cases),
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: בדיקה**
|
||||
|
||||
```bash
|
||||
curl -s "https://legal-ai.nautilus.marcusgroup.org/api/cases/stale?days=1" | jq .total
|
||||
```
|
||||
|
||||
Expected: JSON עם רשימת תיקים.
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
git add web/app.py web/database.py # או השם הנכון
|
||||
git commit -m "feat: add GET /api/cases/stale endpoint"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 2: הוסף endpoint `GET /api/chair-feedback/weekly-summary`
|
||||
|
||||
**Files:**
|
||||
- Modify: `legal-ai/web/app.py`
|
||||
- Modify: DB module
|
||||
|
||||
- [ ] **Step 1: בדוק את מבנה טבלת `chair_feedback`**
|
||||
|
||||
```bash
|
||||
sqlite3 /home/chaim/.paperclip/instances/default/data/app.db \
|
||||
".schema chair_feedback" 2>/dev/null || \
|
||||
psql -h localhost -p 5433 -U legal_ai -c "\d chair_feedback" legal_ai 2>/dev/null || \
|
||||
grep -rn "chair_feedback" /home/chaim/legal-ai/mcp-server/src/ | head -10
|
||||
```
|
||||
|
||||
- [ ] **Step 2: הוסף `get_weekly_chair_feedback()` לDB module**
|
||||
|
||||
```python
|
||||
async def get_weekly_chair_feedback(days: int = 7) -> list[dict]:
|
||||
"""Return chair feedback entries from the last `days` days."""
|
||||
async with get_db_connection() as conn:
|
||||
rows = await conn.fetch(
|
||||
"""
|
||||
SELECT cf.case_number, cf.feedback_text, cf.created_at,
|
||||
cf.feedback_type, c.title
|
||||
FROM chair_feedback cf
|
||||
JOIN cases c ON c.case_number = cf.case_number
|
||||
WHERE cf.created_at > now() - ($1 || ' days')::interval
|
||||
ORDER BY cf.created_at DESC
|
||||
""",
|
||||
str(days),
|
||||
)
|
||||
return [dict(r) for r in rows]
|
||||
```
|
||||
|
||||
> אם שמות השדות שונים (בדוק ב-Step 1) — התאם.
|
||||
|
||||
- [ ] **Step 3: הוסף endpoint**
|
||||
|
||||
```python
|
||||
@app.get("/api/chair-feedback/weekly-summary")
|
||||
async def get_chair_feedback_weekly(days: int = 7):
|
||||
"""Feedback entries from the past week, formatted for the learning agent."""
|
||||
entries = await db.get_weekly_chair_feedback(days=days)
|
||||
if not entries:
|
||||
return {"summary": "", "entry_count": 0}
|
||||
|
||||
lines = [
|
||||
f"- תיק {e['case_number']} ({e['title']}): {e['feedback_text']}"
|
||||
for e in entries
|
||||
]
|
||||
summary = "\n".join(lines)
|
||||
return {"summary": summary, "entry_count": len(entries), "entries": entries}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: בדיקה**
|
||||
|
||||
```bash
|
||||
curl -s "https://legal-ai.nautilus.marcusgroup.org/api/chair-feedback/weekly-summary" | jq .entry_count
|
||||
```
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai
|
||||
git add web/app.py web/database.py
|
||||
git commit -m "feat: add GET /api/chair-feedback/weekly-summary endpoint"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 3: הוסף jobs לplugin
|
||||
|
||||
**Files:**
|
||||
- Modify: `plugin-legal-ai/plugin.json`
|
||||
- Modify: `plugin-legal-ai/src/manifest.ts`
|
||||
|
||||
- [ ] **Step 1: קרא את ה-`jobs` הקיים ב-`plugin.json`**
|
||||
|
||||
```bash
|
||||
cat /home/chaim/plugin-legal-ai/plugin.json | python3 -c "import json,sys; d=json.load(sys.stdin); print(json.dumps(d['jobs'], indent=2))"
|
||||
```
|
||||
|
||||
- [ ] **Step 2: הוסף 2 jobs חדשים לarray `"jobs"` ב-`plugin.json`**
|
||||
|
||||
```json
|
||||
{
|
||||
"jobKey": "stale-case-reminder",
|
||||
"displayName": "תזכורת תיקים תקועים",
|
||||
"description": "מזהה תיקים שלא עודכנו 3+ ימים ומוסיף תגובה לissue",
|
||||
"schedule": "0 8 * * *"
|
||||
},
|
||||
{
|
||||
"jobKey": "weekly-feedback-analysis",
|
||||
"displayName": "ניתוח פידבק שבועי",
|
||||
"description": "מסכם פידבק יו\"ר מהשבוע האחרון ומעדכן את decision-lessons.md",
|
||||
"schedule": "0 19 * * 0"
|
||||
}
|
||||
```
|
||||
|
||||
> `"0 8 * * *"` = כל יום בשעה 08:00. `"0 19 * * 0"` = כל ראשון ב-19:00.
|
||||
|
||||
- [ ] **Step 3: עדכן `manifest.ts`**
|
||||
|
||||
```bash
|
||||
grep -n "jobs\|jobKey\|schedule" /home/chaim/plugin-legal-ai/src/manifest.ts
|
||||
```
|
||||
|
||||
הוסף את אותם 2 objects לarray `jobs` ב-`manifest.ts`.
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai
|
||||
git add plugin.json src/manifest.ts
|
||||
git commit -m "feat: declare stale-case-reminder and weekly-feedback-analysis jobs"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 4: Implement job handlers ב-`worker.ts`
|
||||
|
||||
**Files:**
|
||||
- Modify: `plugin-legal-ai/src/worker.ts`
|
||||
|
||||
- [ ] **Step 1: קרא את handler של `sync-case-status` הקיים**
|
||||
|
||||
```bash
|
||||
grep -n "sync-case-status\|jobs.register\|jobKey" /home/chaim/plugin-legal-ai/src/worker.ts
|
||||
```
|
||||
|
||||
העתק את הדפוס.
|
||||
|
||||
- [ ] **Step 2: הוסף את `stale-case-reminder` handler**
|
||||
|
||||
בתוך `setup(ctx)`, אחרי רישום ה-job הקיים:
|
||||
|
||||
```typescript
|
||||
ctx.jobs.register("stale-case-reminder", async (job) => {
|
||||
ctx.logger.info("stale-case-reminder: starting");
|
||||
|
||||
const config = await ctx.config.get();
|
||||
const apiBase = (config.legalApiBaseUrl as string) ?? "http://localhost:8085";
|
||||
|
||||
const resp = await ctx.http.fetch(`${apiBase}/api/cases/stale?days=3`);
|
||||
if (!resp.ok) {
|
||||
ctx.logger.error(`stale-case-reminder: API error ${resp.status}`);
|
||||
return;
|
||||
}
|
||||
|
||||
const data = (await resp.json()) as {
|
||||
cases: Array<{
|
||||
case_number: string;
|
||||
title: string;
|
||||
status: string;
|
||||
company_id: string;
|
||||
days_stale: number;
|
||||
}>;
|
||||
};
|
||||
|
||||
for (const staleCase of data.cases) {
|
||||
const issueId = await ctx.state.get(
|
||||
{ companyId: staleCase.company_id },
|
||||
`case:${staleCase.case_number}`
|
||||
);
|
||||
if (!issueId) continue;
|
||||
|
||||
await ctx.issues.createComment({
|
||||
issueId: issueId as string,
|
||||
body: `⚠️ **תיק תקוע** — ${staleCase.days_stale} ימים ללא עדכון (סטטוס: ${staleCase.status}). האם יש צורך בפעולה?`,
|
||||
});
|
||||
|
||||
ctx.logger.info(
|
||||
`stale-case-reminder: posted reminder for ${staleCase.case_number} (${staleCase.days_stale}d stale)`
|
||||
);
|
||||
}
|
||||
|
||||
ctx.logger.info(`stale-case-reminder: done. ${data.cases.length} cases reminded`);
|
||||
});
|
||||
```
|
||||
|
||||
- [ ] **Step 3: הוסף את `weekly-feedback-analysis` handler**
|
||||
|
||||
```typescript
|
||||
ctx.jobs.register("weekly-feedback-analysis", async (job) => {
|
||||
ctx.logger.info("weekly-feedback-analysis: starting");
|
||||
|
||||
const config = await ctx.config.get();
|
||||
const apiBase = (config.legalApiBaseUrl as string) ?? "http://localhost:8085";
|
||||
|
||||
const resp = await ctx.http.fetch(`${apiBase}/api/chair-feedback/weekly-summary`);
|
||||
if (!resp.ok) {
|
||||
ctx.logger.error(`weekly-feedback-analysis: API error ${resp.status}`);
|
||||
return;
|
||||
}
|
||||
|
||||
const data = (await resp.json()) as {
|
||||
summary: string;
|
||||
entry_count: number;
|
||||
};
|
||||
|
||||
if (data.entry_count === 0) {
|
||||
ctx.logger.info("weekly-feedback-analysis: no feedback this week, skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
// Invoke the CEO agent to process feedback and update decision-lessons.md
|
||||
const companies = await ctx.companies.list();
|
||||
for (const company of companies) {
|
||||
// CEO IDs per company
|
||||
const CEO_IDS: Record<string, string> = {
|
||||
"42a7acd0-30c5-4cbd-ac97-7424f65df294": "752cebdd-6748-4a04-aacd-c7ab0294ef33",
|
||||
"8639e837-4c9d-47fa-a76b-95788d651896": "cdbfa8bc-3d61-41a4-a2e7-677ec7d34562",
|
||||
};
|
||||
const ceoId = CEO_IDS[company.id];
|
||||
if (!ceoId) continue;
|
||||
|
||||
await ctx.agents.invoke(ceoId, company.id, {
|
||||
prompt: `ניתוח פידבק שבועי יו"ר (${data.entry_count} פריטים):
|
||||
|
||||
${data.summary}
|
||||
|
||||
המשימה: עדכן את /home/chaim/legal-ai/docs/legal-decision-lessons.md עם הלקחים החדשים שעולים מהפידבק. הוסף רק לקחים חדשים שלא קיימים כבר. קבץ לפי נושא.`,
|
||||
reason: "weekly-feedback-analysis scheduled job",
|
||||
});
|
||||
|
||||
ctx.logger.info(
|
||||
`weekly-feedback-analysis: invoked CEO for company ${company.id} (${data.entry_count} feedback entries)`
|
||||
);
|
||||
break; // One CEO is enough — lessons file is shared
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
- [ ] **Step 4: TypeScript check**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai && npx tsc --noEmit
|
||||
```
|
||||
|
||||
Expected: 0 errors.
|
||||
|
||||
- [ ] **Step 5: Build**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai && npm run build
|
||||
```
|
||||
|
||||
- [ ] **Step 6: Commit**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai
|
||||
git add src/worker.ts
|
||||
git commit -m "feat: implement stale-case-reminder and weekly-feedback-analysis jobs"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 5: Re-install plugin + בדיקה
|
||||
|
||||
- [ ] **Step 1: Deploy legal-ai**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/legal-ai && git push origin main
|
||||
# המתן ~3 דקות
|
||||
curl -s https://legal-ai.nautilus.marcusgroup.org/api/health | jq .status
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Re-install plugin**
|
||||
|
||||
```bash
|
||||
cd /home/chaim/plugin-legal-ai && npm run build
|
||||
npx paperclipai plugin uninstall marcusgroup.legal-ai \
|
||||
--api-base http://localhost:3100 --api-key pcapi_legal_install_key_2026
|
||||
npx paperclipai plugin install /home/chaim/plugin-legal-ai \
|
||||
--api-base http://localhost:3100 --api-key pcapi_legal_install_key_2026
|
||||
pm2 restart paperclip
|
||||
```
|
||||
|
||||
- [ ] **Step 3: בדוק שה-jobs רשומים**
|
||||
|
||||
```bash
|
||||
curl -s -H "Authorization: Bearer pcapi_legal_install_key_2026" \
|
||||
http://localhost:3100/api/plugins/marcusgroup.legal-ai/jobs | jq .[].jobKey
|
||||
```
|
||||
|
||||
Expected: `"sync-case-status"`, `"stale-case-reminder"`, `"weekly-feedback-analysis"`.
|
||||
|
||||
- [ ] **Step 4: הפעל job ידנית לבדיקה**
|
||||
|
||||
```bash
|
||||
curl -s -X POST -H "Authorization: Bearer pcapi_legal_install_key_2026" \
|
||||
http://localhost:3100/api/plugins/marcusgroup.legal-ai/jobs/stale-case-reminder/run | jq .
|
||||
```
|
||||
|
||||
Expected: Job הופעל. בדוק logs:
|
||||
```bash
|
||||
pm2 logs paperclip --lines 30 | grep "stale-case-reminder"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## אימות סופי
|
||||
|
||||
| בדיקה | פקודה | תוצאה מצופה |
|
||||
|-------|-------|-------------|
|
||||
| API stale endpoint | `curl .../api/cases/stale?days=1` | JSON עם cases |
|
||||
| API feedback endpoint | `curl .../api/chair-feedback/weekly-summary` | JSON עם summary |
|
||||
| Jobs רשומים | `GET .../api/plugins/.../jobs` | 3 jobs רשומים |
|
||||
| Stale reminder ידני | `POST .../jobs/stale-case-reminder/run` | תגובות בissues |
|
||||
| Feedback analysis ידני | `POST .../jobs/weekly-feedback-analysis/run` | CEO מועיר |
|
||||
118
mcp-server/src/legal_mcp/case_status_model.py
Normal file
118
mcp-server/src/legal_mcp/case_status_model.py
Normal file
@@ -0,0 +1,118 @@
|
||||
"""Single source of truth for the case-status lifecycle (the *status model*).
|
||||
|
||||
Every consumer derives its order / labels / phase from this one registry:
|
||||
• ``CaseStatus`` enum (models.py) — the type-level key set (kept consistent
|
||||
by the assertion at the bottom of this module);
|
||||
• the forward-only ``STATUS_ORDER`` guard in ``tools/cases.py``;
|
||||
• the ``GET /api/status-model`` endpoint (web/app.py) that the frontend
|
||||
mirror (``web-ui/src/lib/api/case-status.ts``) is generated against.
|
||||
|
||||
To make a status *do something* on entry (notify, kick a job, …), set its
|
||||
``on_enter`` to an action key — the single place where a status's behaviour is
|
||||
declared. ``tools/cases.py`` dispatches it when a case transitions into that
|
||||
status (forward-only), so the behaviour lives next to the definition.
|
||||
|
||||
The five **phases** are the coarse pipeline the 12 statuses collapse into for the
|
||||
header stepper. Intermediate analyst/research states (``analyst_verified``,
|
||||
``research_complete``) are first-class canonical statuses here — the agents set
|
||||
them, so they must be in the model rather than fall between the canonical set
|
||||
and the legacy bucket (the bug that made the chip, stepper and manual-changer
|
||||
disagree).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
|
||||
# Ordered 5-phase pipeline (key → Hebrew label) — coarse view of the lifecycle.
|
||||
PHASES: list[tuple[str, str]] = [
|
||||
("intake", "קליטה ועיבוד"),
|
||||
("prep", "הכנת תיק"),
|
||||
("thinking", "ניתוח וכיוון"),
|
||||
("writing", "כתיבת טיוטה"),
|
||||
("done", "סגירה"),
|
||||
]
|
||||
PHASE_LABELS: dict[str, str] = dict(PHASES)
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class StatusDef:
|
||||
key: str
|
||||
label: str # Hebrew label (chip / dropdown)
|
||||
description: str # Hebrew one-liner (status guide)
|
||||
phase: str # one of PHASES keys
|
||||
selectable: bool = True # offered in the manual status-changer dropdown
|
||||
terminal: bool = False
|
||||
on_enter: str | None = None # future: action key dispatched on entry
|
||||
|
||||
|
||||
# THE lifecycle — ordered. STATUS_ORDER, the enum and the frontend all derive
|
||||
# from this list. Insert intermediates in workflow order.
|
||||
STATUS_DEFS: list[StatusDef] = [
|
||||
StatusDef("new", "חדש", "התיק נוצר וממתין להעלאת מסמכים", "intake"),
|
||||
StatusDef("processing", "בעיבוד", "המערכת מעבדת ומנתחת את המסמכים", "intake"),
|
||||
StatusDef("documents_ready", "מסמכים מוכנים", "כל המסמכים עובדו ומוכנים לעבודה", "prep"),
|
||||
StatusDef("analyst_verified", "ניתוח אומת", "המנתח סיים ואימת את הניתוח — ממתין להכרעת תוצאה של היו״ר", "thinking"),
|
||||
StatusDef("research_complete", "מחקר הושלם", "חקר התקדימים הושלם (מסלול נפרד מהמנתח)", "thinking"),
|
||||
StatusDef("outcome_set", "תוצאה נקבעה", "נקבעה תוצאה צפויה לערר", "thinking"),
|
||||
StatusDef("direction_approved", "כיוון אושר", "כיוון ההחלטה אושר — בהעמקת ניתוח וכתיבה", "thinking"),
|
||||
StatusDef("qa_review", "בדיקת איכות", "הטיוטה בבדיקת איכות אוטומטית", "writing"),
|
||||
StatusDef("drafted", "טיוטה", "טיוטה מוכנה לעיון", "writing"),
|
||||
StatusDef("exported", "יוצא", "ההחלטה יוצאה לקובץ DOCX", "done"),
|
||||
StatusDef("reviewed", "נבדק", 'ההחלטה נבדקה ע"י היו"ר', "done"),
|
||||
StatusDef("final", "סופי", "החלטה סופית — מוכנה להגשה", "done", terminal=True),
|
||||
]
|
||||
|
||||
BY_KEY: dict[str, StatusDef] = {d.key: d for d in STATUS_DEFS}
|
||||
STATUS_ORDER: list[str] = [d.key for d in STATUS_DEFS]
|
||||
|
||||
|
||||
def phase_of(status: str | None) -> str | None:
|
||||
"""The pipeline phase a status belongs to (None for unknown values)."""
|
||||
d = BY_KEY.get(status or "")
|
||||
return d.phase if d else None
|
||||
|
||||
|
||||
def label_of(status: str | None) -> str:
|
||||
d = BY_KEY.get(status or "")
|
||||
return d.label if d else (status or "")
|
||||
|
||||
|
||||
def to_dict() -> dict:
|
||||
"""Serialisable status model for ``GET /api/status-model`` (frontend SSoT)."""
|
||||
return {
|
||||
"statuses": [
|
||||
{
|
||||
"key": d.key,
|
||||
"label": d.label,
|
||||
"description": d.description,
|
||||
"phase": d.phase,
|
||||
"selectable": d.selectable,
|
||||
"terminal": d.terminal,
|
||||
"on_enter": d.on_enter,
|
||||
}
|
||||
for d in STATUS_DEFS
|
||||
],
|
||||
"phases": [{"key": k, "label": v} for k, v in PHASES],
|
||||
}
|
||||
|
||||
|
||||
# Drift guard — the registry IS the canonical key set; the CaseStatus enum must
|
||||
# match it exactly. Importing here (models.py never imports this module) is safe.
|
||||
def _assert_consistent() -> None:
|
||||
from legal_mcp.models import CaseStatus
|
||||
|
||||
registry = {d.key for d in STATUS_DEFS}
|
||||
enum_keys = {s.value for s in CaseStatus}
|
||||
if registry != enum_keys:
|
||||
raise RuntimeError(
|
||||
"case_status_model drift: registry vs CaseStatus enum differ — "
|
||||
f"only-in-registry={registry - enum_keys}, only-in-enum={enum_keys - registry}"
|
||||
)
|
||||
phase_keys = {k for k, _ in PHASES}
|
||||
bad = {d.key: d.phase for d in STATUS_DEFS if d.phase not in phase_keys}
|
||||
if bad:
|
||||
raise RuntimeError(f"case_status_model: statuses with unknown phase: {bad}")
|
||||
|
||||
|
||||
_assert_consistent()
|
||||
@@ -162,6 +162,23 @@ HALACHA_AUTO_APPROVE_THRESHOLD = float(
|
||||
os.environ.get("HALACHA_AUTO_APPROVE_THRESHOLD", "0.80")
|
||||
)
|
||||
|
||||
# Corpus redesign (#153, chaim 2026-06-20): ELIMINATE the halacha review queue.
|
||||
# When on (default), extraction never produces 'pending_review' — every extracted
|
||||
# principle lands as 'approved' = available BACKGROUND (no human review, ever).
|
||||
# Trust/ranking comes from chair citation (halachot.verified/cite_count), not from
|
||||
# an approval gate. The nli-audit found the quality flags are 97% false-positive,
|
||||
# so gating on them only created a phantom backlog (2,402 items). Set false to
|
||||
# restore the legacy confidence+flags auto-approve gate.
|
||||
HALACHA_NO_REVIEW_QUEUE = os.environ.get("HALACHA_NO_REVIEW_QUEUE", "true").lower() == "true"
|
||||
|
||||
# Corpus redesign (#153): retrieval ranks VERIFIED (chair-cited) principles above
|
||||
# the unranked BACKGROUND. Added to the halacha similarity score (cosine 0-1): a flat
|
||||
# boost if the source precedent was chair-cited, plus a small per-citation increment
|
||||
# (capped). 0 disables (pure similarity). Tunable; calibrate against the canon.
|
||||
HALACHA_VERIFIED_BOOST = float(os.environ.get("HALACHA_VERIFIED_BOOST", "0.12"))
|
||||
HALACHA_CITE_BOOST_PER = float(os.environ.get("HALACHA_CITE_BOOST_PER", "0.01"))
|
||||
HALACHA_CITE_BOOST_CAP = int(os.environ.get("HALACHA_CITE_BOOST_CAP", "10"))
|
||||
|
||||
# ── Tri-model panel extraction regime (legal-principles-redesign, #152) ──────
|
||||
# chaim 2026-06-19: replace single-model auto-approve with a 3-model panel that
|
||||
# deep-analyzes each decision. 3 models (Claude local + DeepSeek + Gemini) each
|
||||
@@ -179,10 +196,22 @@ HALACHA_PANEL_MAX_NEW = int(os.environ.get("HALACHA_PANEL_MAX_NEW", "5"))
|
||||
# a floor misses genuine cross-model agreement → undercounts votes → over-culls.
|
||||
# Calibrate against the gold-set in Phase C before the production cull.
|
||||
HALACHA_PANEL_MATCH_COSINE = float(os.environ.get("HALACHA_PANEL_MATCH_COSINE", "0.80"))
|
||||
# When on (default), extraction uses the decision-level 3-model panel regime above
|
||||
# instead of the legacy per-chunk single-model auto-approve. Set false to fall back
|
||||
# to the legacy path (e.g. if all three judges are unreachable).
|
||||
HALACHA_PANEL_REGIME_ENABLED = os.environ.get("HALACHA_PANEL_REGIME_ENABLED", "true").lower() == "true"
|
||||
# DEFAULT OFF (#153, chaim 2026-06-20). The panel regime caps extraction to MAX_NEW
|
||||
# and filters by novelty — empirically PROVEN destructive (8508/1049/1200 each lost
|
||||
# 22-30 genuine principles incl. the core Lustrenik rule). The corpus redesign keeps
|
||||
# ALL extracted principles as an unranked BACKGROUND layer (trust comes from chair
|
||||
# citation, not extraction); so extraction reverts to the legacy rich per-chunk path.
|
||||
# The panel code is retained (dormant) for optional dedup, never for capping.
|
||||
HALACHA_PANEL_REGIME_ENABLED = os.environ.get("HALACHA_PANEL_REGIME_ENABLED", "false").lower() == "true"
|
||||
|
||||
# Importance layer (#153) — principle-level gold matching. OUR_CHAIR's citations
|
||||
# (tier-1 gold, protective) vs other chairs' (tier-2 weight). Match threshold: a
|
||||
# chair-citation's match_context (or a digest's headline_holding) is matched to the
|
||||
# cited precedent's principles by cosine; ≥ this → the principle is flagged. Tuned
|
||||
# toward RECALL (a false-negative buries a principle the chair relied on; a
|
||||
# false-positive merely over-protects). 0.72 = paraphrase floor on voyage-law-2.
|
||||
OUR_CHAIR_NAME = os.environ.get("OUR_CHAIR_NAME", "דפנה תמיר")
|
||||
HALACHA_GOLD_MATCH_THRESHOLD = float(os.environ.get("HALACHA_GOLD_MATCH_THRESHOLD", "0.72"))
|
||||
|
||||
# Halacha dedup-on-insert — within-precedent semantic cosine ceiling. Before
|
||||
# storing a halacha, store_halachot_for_chunk skips it if its rule-embedding has
|
||||
@@ -246,8 +275,33 @@ HALACHA_CANONICAL_SYNTH_MODEL = os.environ.get("HALACHA_CANONICAL_SYNTH_MODEL",
|
||||
HALACHA_CANONICAL_SYNTH_EFFORT = os.environ.get("HALACHA_CANONICAL_SYNTH_EFFORT", "high")
|
||||
HALACHA_CANONICAL_SYNTH_DRIFT_FLOOR = float(os.environ.get("HALACHA_CANONICAL_SYNTH_DRIFT_FLOOR", "0.80"))
|
||||
|
||||
# Google Cloud Vision (OCR for scanned PDFs)
|
||||
GOOGLE_CLOUD_VISION_API_KEY = os.environ.get("GOOGLE_CLOUD_VISION_API_KEY", "")
|
||||
# Lesson synthesis (#158 / INV-LRN8) — mirrors the canonical-halacha synthesis above
|
||||
# for decision_lessons: cluster overlapping style lessons (cosine ≥ CLUSTER_THRESHOLD,
|
||||
# within a practice_area+category shard) and merge each cluster into one richer
|
||||
# "super-lesson" via a local claude_session pass, grounded in the source lessons
|
||||
# (INV-AH) with a re-embedding DRIFT_FLOOR guard. Opus by default — chair-facing
|
||||
# quality. The synthesised set is smaller, so the writer's limit=15 stops truncating
|
||||
# (the real fix for the silent cap, #157).
|
||||
LESSON_SYNTH_MODEL = os.environ.get("LESSON_SYNTH_MODEL", HALACHA_EXTRACT_MODEL)
|
||||
LESSON_SYNTH_EFFORT = os.environ.get("LESSON_SYNTH_EFFORT", "high")
|
||||
LESSON_SYNTH_DRIFT_FLOOR = float(os.environ.get("LESSON_SYNTH_DRIFT_FLOOR", "0.80"))
|
||||
# Cosine floor for two lessons to land in the same cluster (greedy, within shard).
|
||||
# Tuned empirically (#158 dry-run, 81 lessons): the lessons are diverse (median
|
||||
# pairwise cosine ~0.48, max ~0.72), so 0.82 merged nothing. 0.68 captures the real
|
||||
# near-duplicates (5 faithful clusters across rishuy+betterment, all clearing the
|
||||
# 0.80 drift gate) without merging weakly-related lessons; the drift gate is the
|
||||
# quality backstop below this.
|
||||
LESSON_SYNTH_CLUSTER_THRESHOLD = float(os.environ.get("LESSON_SYNTH_CLUSTER_THRESHOLD", "0.68"))
|
||||
|
||||
# How many CHAIR-APPROVED decision_lessons flow to the writer per practice_area
|
||||
# (get_recent_decision_lessons). Raised 15 → 60 (#158/#157): the lessons are now both
|
||||
# deduplicated (synthesis merges true near-duplicates) AND chair-approved, so the old
|
||||
# cap silently truncated distinct, vetted style guidance. 60 covers every current shard
|
||||
# with headroom; synthesis keeps the set non-redundant as it grows. env-tunable.
|
||||
WRITER_LESSONS_LIMIT = int(os.environ.get("WRITER_LESSONS_LIMIT", "60"))
|
||||
|
||||
# Mistral OCR (fallback for scanned PDFs — replaces Google Cloud Vision)
|
||||
MISTRAL_API_KEY = os.environ.get("MISTRAL_API_KEY", "")
|
||||
|
||||
# Data directory
|
||||
DATA_DIR = Path(os.environ.get("DATA_DIR", str(Path.home() / "legal-ai" / "data")))
|
||||
@@ -332,7 +386,7 @@ PARENT_DOC_CHILD_OVERLAP_TOKENS = int(
|
||||
# External service allowlist — case materials may ONLY be sent to these domains
|
||||
ALLOWED_EXTERNAL_SERVICES = {
|
||||
"api.voyageai.com", # Voyage AI (embeddings)
|
||||
"vision.googleapis.com", # Google Cloud Vision (OCR)
|
||||
"api.mistral.ai", # Mistral OCR (scanned PDFs)
|
||||
}
|
||||
|
||||
# Audit
|
||||
|
||||
@@ -9,13 +9,18 @@ from uuid import UUID
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
# Core case lifecycle — kept in sync with STATUS_ORDER in tools/cases.py and the
|
||||
# frontend SSoT web-ui/src/lib/api/case-status.ts. Trimmed from 17 → 10 (the
|
||||
# decorative mid-stage markers that no pipeline code ever set were removed).
|
||||
# Core case lifecycle. The canonical key set, order, labels, phases and (future)
|
||||
# per-status actions all live in ONE place — legal_mcp/case_status_model.py —
|
||||
# which asserts this enum matches it. The frontend mirror is
|
||||
# web-ui/src/lib/api/case-status.ts (generated against GET /api/status-model).
|
||||
# The analyst/research intermediate states are first-class canonical statuses
|
||||
# (the agents set them) — not legacy.
|
||||
class CaseStatus(str, enum.Enum):
|
||||
NEW = "new"
|
||||
PROCESSING = "processing"
|
||||
DOCUMENTS_READY = "documents_ready"
|
||||
ANALYST_VERIFIED = "analyst_verified"
|
||||
RESEARCH_COMPLETE = "research_complete"
|
||||
OUTCOME_SET = "outcome_set"
|
||||
DIRECTION_APPROVED = "direction_approved"
|
||||
QA_REVIEW = "qa_review"
|
||||
|
||||
@@ -418,6 +418,12 @@ async def digest_process_pending(limit: int = 20) -> str:
|
||||
return await digest_tools.digest_process_pending(_clamp_limit(limit))
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def digest_radar(case_number: str, limit: int = 5, min_score: float = 0.45) -> str:
|
||||
"""רדאר-יומונים הקשרי-לתיק (X12) — מחזיר יומונים לא-מקושרים (פס"ד שעוד אין לנו) שהנושא שלהם קרוב סמנטית לתיק, כדי שלא ייפול פס"ד רלוונטי בזמן ההכרעה. כל ליד מצביע על מראה-המקום של הפס"ד המקורי + סטטוס-הפער + פעולה מוצעת. ⚠️ radar בלבד — היומון אינו מצוטט (INV-DIG1)."""
|
||||
return await digest_tools.digest_radar(case_number, _clamp_limit(limit), min_score)
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def halacha_review(
|
||||
halacha_id: str,
|
||||
@@ -566,6 +572,18 @@ async def get_legal_arguments(
|
||||
return await la_tools.get_legal_arguments(case_number, party)
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def reanalyze_claims(
|
||||
case_number: str,
|
||||
reanalyze_all_primary: bool = False,
|
||||
) -> str:
|
||||
"""ניתוח-מחדש מאחד אחרי הוספת מסמך-עיקרי: מחלץ ממסמכים-עיקריים חדשים/לא-נותחו בלבד,
|
||||
מאחד עם הטענות הקיימות (לא מוחק הכול), מריץ צבירה-מחדש, ומחזיר בדיקת-השפעה
|
||||
(diff טיעונים/המלצה לפני↔אחרי) ליו"ר. reanalyze_all_primary=True = כל המסמכים-העיקריים.
|
||||
"""
|
||||
return await la_tools.reanalyze_claims(case_number, reanalyze_all_primary)
|
||||
|
||||
|
||||
# References
|
||||
@mcp.tool()
|
||||
async def extract_references(
|
||||
@@ -738,6 +756,29 @@ async def get_appraiser_facts(case_number: str) -> str:
|
||||
return await drafting.get_appraiser_facts(case_number)
|
||||
|
||||
|
||||
# ── Protocol comparative analysis (WS4 / #203) — ניתוח פרוטוקול ────
|
||||
|
||||
@mcp.tool()
|
||||
async def analyze_protocol(case_number: str, document_id: str = "") -> str:
|
||||
"""ניתוח השוואתי של פרוטוקול-דיון מול כתבי-הטענות: אילו טענות ירדו/חוזקו/עלו-חדשות + חידוד-שאלות + חילוץ א–ד.
|
||||
|
||||
בוחר אוטומטית פרוטוקול ועדת-ערר (scope שאינו 'lower'); document_id מכוון לדיון
|
||||
מדויק כשיש כמה פרוטוקולים. מזין ל"ידע-התיק" (protocol_analysis); דורש פרוטוקול
|
||||
doc_type='protocol' + טיעונים מאוגדים. Claude מקומי Opus 4.8 effort=high;
|
||||
re-run מחליף (idempotent).
|
||||
"""
|
||||
return await drafting.analyze_protocol(case_number, document_id=document_id)
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def get_protocol_analysis(case_number: str, change_type: str = "") -> str:
|
||||
"""קריאת ניתוח-הפרוטוקול שכבר חולץ — ללא ניתוח-מחדש. ה-get המקביל ל-analyze_protocol.
|
||||
|
||||
change_type: dropped/strengthened/newly_raised (ריק=הכל).
|
||||
"""
|
||||
return await drafting.get_protocol_analysis(case_number, change_type)
|
||||
|
||||
|
||||
# ── Planning-schemes registry (V38) — מרשם-התכניות ─────────────────
|
||||
# SSOT לזהות+תוקף של תכנית, נעשה שימוש חוזר בין תיקים (G2). פלט-LLM נכנס
|
||||
# pending_review וממתין לאישור-יו"ר (plan_review, G10) לפני שמשמש בבלוק ט.
|
||||
@@ -808,6 +849,12 @@ async def export_interim_draft(case_number: str, output_path: str = "") -> str:
|
||||
return await drafting.export_interim_draft(case_number, output_path)
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def summarize_party_claims(case_number: str, instructions: str = "") -> str:
|
||||
"""סיכום-מנהלים מזוקק של טענות הצדדים — מסמך פרוזה נפרד מטיוטת-ההחלטה, להכנת היו"ר לדיון. נגזר מ-legal_arguments/claims (אותו מקור), נעוץ Opus 4.8, נשמר וניתן-לייצוא."""
|
||||
return await drafting.summarize_party_claims(case_number, instructions)
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def apply_user_edit(case_number: str, edit_filename: str) -> str:
|
||||
"""רישום עריכה שהעלה המשתמש (עריכה-v*.docx) כמקור האמת החדש — מזריק bookmarks אם חסר."""
|
||||
@@ -1170,6 +1217,25 @@ async def list_chair_feedback(
|
||||
return await workflow.list_chair_feedback(case_number, category, unresolved_only, _clamp_limit(limit))
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def record_curator_findings(case_number: str, findings: list[dict]) -> str:
|
||||
"""לכידת ממצאי-האוצֵר על החלטה סופית כ-decision_lessons מובְנים (source='curator',
|
||||
ממתינים לשער-יו"ר) — INV-LRN3. כל ממצא: {"text": "...", "category": style/structure/
|
||||
lexicon/tabular} (או "tag" עברי). מחזיר כמה נרשמו וכמה כפילויות דולגו. read-only על
|
||||
התוכן — הרישום הצעה הממתינה לאישור דפנה ב-/training, לא שינוי-קול ישיר (G10)."""
|
||||
return await workflow.record_curator_findings(case_number, findings)
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def lesson_synthesize_pending(
|
||||
practice_area: str = "", category: str = "", apply: bool = True,
|
||||
) -> str:
|
||||
"""סינתזת-לקחים (#158 / INV-LRN8): ממזגת לקחי-סגנון חופפים ל"לקח-על" אחד עשיר (source='synthesis'),
|
||||
המקורות→superseded; הסט שזורם לכותב קטֵן ומשתבח (limit=15 מפסיק לחתוך). מעוגן-מקור (INV-AH) +
|
||||
שער-drift; שער מדורג-הפיך (G10). apply=False = dry-run. practice_area/category ריקים = כל ה-shards."""
|
||||
return await workflow.lesson_synthesize_pending(practice_area, category, apply)
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
async def halacha_corroboration(halacha_id: str) -> dict:
|
||||
"""החזר את ה-corroboration של הלכה: הציטוטים שמתקפים אותה, הטיפול, וסיכום (X11, read-only)."""
|
||||
|
||||
@@ -182,16 +182,21 @@ def _add_runs_with_inline_bold(paragraph: Paragraph, text: str) -> None:
|
||||
|
||||
|
||||
def _clear_body(doc: DocumentT) -> None:
|
||||
"""Remove every paragraph currently in the document body.
|
||||
"""Remove ALL body content (paragraphs, tables, stray bookmarks),
|
||||
keeping only sectPr.
|
||||
|
||||
The template ships with example paragraphs ("רקע", "דיון והכרעה"…)
|
||||
that we don't want in the output. Section properties (sectPr) are
|
||||
kept so page size / margins / RTL / footer remain intact.
|
||||
The template ships with example paragraphs ("רקע", "דיון והכרעה"…) *and
|
||||
three sample tables* (header / panel / signatures). Removing only ``w:p``
|
||||
left the tables behind — including the signatures table, which then floated
|
||||
to the top against the header table. Mirror the decision exporter's
|
||||
``_clear_body`` (G2 symmetry): drop everything except sectPr, which carries
|
||||
page setup including bidi.
|
||||
"""
|
||||
body = doc.element.body
|
||||
for p in list(body.findall(qn("w:p"))):
|
||||
body.remove(p)
|
||||
# Leave sectPr alone — it carries page setup including bidi.
|
||||
sectPr_tag = qn("w:sectPr")
|
||||
for child in list(body):
|
||||
if child.tag != sectPr_tag:
|
||||
body.remove(child)
|
||||
|
||||
|
||||
def _add_paragraph(doc: DocumentT, text: str, style: str) -> Paragraph:
|
||||
@@ -386,9 +391,9 @@ def _group_precedents(
|
||||
return case_level, by_section
|
||||
|
||||
|
||||
def _next_version(export_dir: Path) -> int:
|
||||
"""Return the next version number for ניתוח-משפטי-v{N}.docx."""
|
||||
existing = sorted(export_dir.glob("ניתוח-משפטי-v*.docx"))
|
||||
def _next_version(export_dir: Path, prefix: str = "ניתוח-משפטי") -> int:
|
||||
"""Return the next version number for {prefix}-v{N}.docx in export_dir."""
|
||||
existing = sorted(export_dir.glob(f"{prefix}-v*.docx"))
|
||||
next_ver = 1
|
||||
for p in existing:
|
||||
try:
|
||||
@@ -511,3 +516,77 @@ async def build_analysis_docx(case_number: str) -> Path:
|
||||
content_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||
)
|
||||
return out_path
|
||||
|
||||
|
||||
# ── Generic markdown → DOCX (party-claims summary, #202) ───────────
|
||||
|
||||
# ATX-heading markers → template heading style. The party-claims summary is a
|
||||
# plain markdown document (not the structured analysis-and-research.md), so it
|
||||
# is rendered line-by-line through the same template machinery.
|
||||
_ATX_HEADING_RE = re.compile(r"^(#{1,4})\s+(.+)$")
|
||||
_HR_RE = re.compile(r"^\s*[-*_]{3,}\s*$")
|
||||
|
||||
|
||||
def _render_markdown_body(doc: DocumentT, markdown: str) -> None:
|
||||
"""Render a markdown string into the doc using the template styles.
|
||||
|
||||
Handles ATX headings (# .. ####), horizontal rules (skipped), and delegates
|
||||
every other line to _emit_content_line (bullets, numbered, bold-labels, plain).
|
||||
"""
|
||||
for raw in markdown.splitlines():
|
||||
line = raw.rstrip()
|
||||
if not line.strip():
|
||||
continue
|
||||
if _HR_RE.match(line):
|
||||
continue
|
||||
m = _ATX_HEADING_RE.match(line.strip())
|
||||
if m:
|
||||
level = len(m.group(1))
|
||||
# # → Heading 1 (doc title), ## → Heading 1, ### / #### → Heading 2.
|
||||
style = "Heading 1" if level <= 2 else "Heading 2"
|
||||
_add_paragraph(doc, m.group(2).strip(), style)
|
||||
continue
|
||||
_emit_content_line(doc, line)
|
||||
|
||||
|
||||
async def build_party_claims_summary_docx(case_number: str) -> Path:
|
||||
"""Build a DOCX of the party-claims executive summary using the template
|
||||
styles, saved versioned under the case's exports folder.
|
||||
|
||||
Reads the saved party-claims-summary.md (produced by the summarize_party_claims
|
||||
MCP tool — generation is local-only). Raises FileNotFoundError if the summary
|
||||
or the template is missing.
|
||||
"""
|
||||
from legal_mcp.services import party_claims_summary
|
||||
|
||||
if not TEMPLATE_PATH.exists():
|
||||
raise FileNotFoundError(
|
||||
f"Template not found at {TEMPLATE_PATH}. "
|
||||
"Run: python scripts/convert_decision_template.py"
|
||||
)
|
||||
|
||||
summary_path = party_claims_summary.summary_file_path(case_number)
|
||||
if not summary_path.exists():
|
||||
raise FileNotFoundError(
|
||||
f"Party-claims summary not found for case {case_number}. "
|
||||
"Run summarize_party_claims first."
|
||||
)
|
||||
|
||||
markdown = summary_path.read_text(encoding="utf-8")
|
||||
|
||||
doc = Document(str(TEMPLATE_PATH))
|
||||
_clear_body(doc)
|
||||
_render_markdown_body(doc, markdown)
|
||||
|
||||
export_dir = config.find_case_dir(case_number) / "exports"
|
||||
export_dir.mkdir(parents=True, exist_ok=True)
|
||||
_PREFIX = "סיכום-מנהלים-טענות"
|
||||
out_path = export_dir / f"{_PREFIX}-v{_next_version(export_dir, _PREFIX)}.docx"
|
||||
buf = io.BytesIO()
|
||||
doc.save(buf)
|
||||
await storage.put_bytes(
|
||||
out_path.relative_to(config.DATA_DIR).as_posix(), buf.getvalue(),
|
||||
bucket=storage.Bucket.DOCUMENTS,
|
||||
content_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||
)
|
||||
return out_path
|
||||
|
||||
@@ -31,6 +31,10 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
# Allowed enum values mirror the DB CHECK constraints.
|
||||
ALLOWED_PARTIES = {"appellant", "respondent", "committee", "permit_applicant", "unknown"}
|
||||
# Sides that may comprise multiple distinct litigants with potentially opposing
|
||||
# positions — aggregated per source pleading (party_name) rather than collapsed
|
||||
# into one bucket (#224). Appellant/committee speak with a single voice.
|
||||
SPLIT_PARTIES = {"respondent", "permit_applicant"}
|
||||
ALLOWED_PRIORITIES = {"threshold", "substantive", "procedural", "relief"}
|
||||
|
||||
# Hebrew labels for the prompt (Claude needs context in the same
|
||||
@@ -81,7 +85,7 @@ AGGREGATE_PROMPT_TEMPLATE = """אתה מנתח כתבי טענות בתחום ת
|
||||
"""
|
||||
|
||||
|
||||
def _build_prompt(party: str, propositions: list[dict]) -> str:
|
||||
def _build_prompt(party: str, propositions: list[dict], party_name: str = "") -> str:
|
||||
"""Compose the per-party aggregation prompt."""
|
||||
n = len(propositions)
|
||||
# Conservative target: ~1 argument per 2-3 propositions, clamped 4-12.
|
||||
@@ -89,6 +93,11 @@ def _build_prompt(party: str, propositions: list[dict]) -> str:
|
||||
target_max = max(target_min + 1, min(12, n // 2 + 1))
|
||||
|
||||
party_he = PARTY_LABELS_HE.get(party, party)
|
||||
# For a split side (e.g. a specific respondent brief), name the brief so
|
||||
# Claude aggregates only that litigant's position and does not conflate it
|
||||
# with a co-respondent's separate — possibly opposing — pleading (#224).
|
||||
if party_name:
|
||||
party_he = f"{party_he} — {party_name}"
|
||||
# Strip noise from propositions for the prompt — Claude only needs
|
||||
# the id and the text to do the grouping.
|
||||
compact = [
|
||||
@@ -139,12 +148,17 @@ def _normalize_argument(raw: dict, fallback_topic: str = "") -> dict | None:
|
||||
|
||||
|
||||
async def _aggregate_party(
|
||||
party: str, propositions: list[dict],
|
||||
party: str, propositions: list[dict], party_name: str = "",
|
||||
) -> list[dict]:
|
||||
"""Ask Claude to group one party's propositions; return normalized rows."""
|
||||
"""Ask Claude to group one party's propositions; return normalized rows.
|
||||
|
||||
``party_name`` names the specific pleading when this is a split side
|
||||
(respondent / permit_applicant brief), so the prompt scopes to that
|
||||
litigant's position only (#224).
|
||||
"""
|
||||
if not propositions:
|
||||
return []
|
||||
prompt = _build_prompt(party, propositions)
|
||||
prompt = _build_prompt(party, propositions, party_name=party_name)
|
||||
|
||||
try:
|
||||
raw_result = await claude_session.query_json(prompt, tools="") # no tool_use → no error_max_turns
|
||||
@@ -207,7 +221,7 @@ async def aggregate_claims_to_arguments(
|
||||
|
||||
# Pull all claims for this case, grouped by party.
|
||||
rows = await conn.fetch(
|
||||
"""SELECT id, party_role, claim_text, claim_index, source_document
|
||||
"""SELECT id, party_role, claim_text, claim_index, source_document, party_name
|
||||
FROM claims
|
||||
WHERE case_id = $1
|
||||
ORDER BY party_role, claim_index""",
|
||||
@@ -221,22 +235,47 @@ async def aggregate_claims_to_arguments(
|
||||
"total": 0,
|
||||
}
|
||||
|
||||
# Group propositions by party.
|
||||
by_party: dict[str, list[dict]] = {}
|
||||
# Group propositions by party — and, for the multi-party sides (respondent /
|
||||
# permit_applicant), further by their source pleading so opposing joint
|
||||
# briefs (e.g. "כתב תשובה משיבות 2-3" vs "משיבים 4-6") aggregate into
|
||||
# SEPARATE argument sets instead of collapsing into one "respondent" bucket
|
||||
# (#224). Appellant/committee stay single-group (party_name=""). Splitting
|
||||
# the large respondent set per-brief also keeps each Claude call small enough
|
||||
# to succeed — a single 100+ proposition call previously returned non-JSON
|
||||
# and silently dropped the whole side.
|
||||
by_group: dict[tuple[str, str], list[dict]] = {}
|
||||
for r in rows:
|
||||
party = r["party_role"]
|
||||
# Map deprecated 'appraiser' or unknown labels to 'unknown'.
|
||||
if party not in ALLOWED_PARTIES:
|
||||
party = "unknown"
|
||||
by_party.setdefault(party, []).append(dict(r))
|
||||
# Prefer the stored party_name (stamped by the extractor, #224); fall
|
||||
# back to source_document for legacy claims predating the stamping.
|
||||
# Single-voice sides (appellant/committee) stay ''.
|
||||
if party in SPLIT_PARTIES:
|
||||
party_name = (r["party_name"] or "").strip() or (r["source_document"] or "").strip()
|
||||
else:
|
||||
party_name = ""
|
||||
by_group.setdefault((party, party_name), []).append(dict(r))
|
||||
|
||||
# Valid claim_ids for this case == the ids of the claims we just fetched.
|
||||
# The LLM is asked to echo back supporting claim_ids, but it may hallucinate
|
||||
# a syntactically-valid-but-nonexistent UUID (malformed ones are already
|
||||
# dropped in ``_normalize_argument``). Validating against this known set at
|
||||
# source keeps a doomed INSERT — which would poison the surrounding asyncpg
|
||||
# transaction (FK violation -> "current transaction is aborted") — out of
|
||||
# the transaction entirely (G1: fix at source, not symptom).
|
||||
valid_claim_ids: set[UUID] = {r["id"] for r in rows}
|
||||
|
||||
party_counts: dict[str, int] = {}
|
||||
inserted = 0
|
||||
errors: list[str] = []
|
||||
|
||||
for party, props in by_party.items():
|
||||
for (party, party_name), props in by_group.items():
|
||||
# Display key for the per-side summary: keep opposing briefs distinct.
|
||||
group_key = f"{party}·{party_name}" if party_name else party
|
||||
try:
|
||||
arguments = await _aggregate_party(party, props)
|
||||
arguments = await _aggregate_party(party, props, party_name=party_name)
|
||||
except RuntimeError as e:
|
||||
# Most likely cause: Claude CLI not installed (running from
|
||||
# the container). Don't crash — record the gap and continue.
|
||||
@@ -250,11 +289,11 @@ async def aggregate_claims_to_arguments(
|
||||
),
|
||||
"total": 0,
|
||||
}
|
||||
errors.append(f"{party}: {msg}")
|
||||
errors.append(f"{group_key}: {msg}")
|
||||
continue
|
||||
|
||||
if not arguments:
|
||||
party_counts[party] = 0
|
||||
party_counts[group_key] = 0
|
||||
continue
|
||||
|
||||
async with pool.acquire() as conn:
|
||||
@@ -262,12 +301,13 @@ async def aggregate_claims_to_arguments(
|
||||
for idx, arg in enumerate(arguments):
|
||||
arg_id = await conn.fetchval(
|
||||
"""INSERT INTO legal_arguments
|
||||
(case_id, party, argument_index, argument_title,
|
||||
argument_body, legal_topic, priority)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
||||
(case_id, party, party_name, argument_index,
|
||||
argument_title, argument_body, legal_topic, priority)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
||||
RETURNING id""",
|
||||
case_id,
|
||||
party,
|
||||
party_name,
|
||||
idx + 1,
|
||||
arg["title"],
|
||||
arg["body"],
|
||||
@@ -275,7 +315,22 @@ async def aggregate_claims_to_arguments(
|
||||
arg["priority"],
|
||||
)
|
||||
for cid in arg["claim_ids"]:
|
||||
if cid not in valid_claim_ids:
|
||||
# Hallucinated claim_id that doesn't belong to this
|
||||
# case. Skip it rather than letting the FK violation
|
||||
# abort the whole transaction.
|
||||
logger.warning(
|
||||
"argument_aggregator: skipped unknown claim_id %s for arg %s",
|
||||
cid, arg_id,
|
||||
)
|
||||
continue
|
||||
try:
|
||||
# Per-row savepoint: even after the validation above,
|
||||
# wrap the INSERT so any unexpected constraint failure
|
||||
# rolls back to the savepoint instead of poisoning the
|
||||
# surrounding transaction (asyncpg nests transaction()
|
||||
# as SAVEPOINT when already inside one).
|
||||
async with conn.transaction():
|
||||
await conn.execute(
|
||||
"""INSERT INTO legal_argument_propositions
|
||||
(argument_id, claim_id)
|
||||
@@ -284,14 +339,12 @@ async def aggregate_claims_to_arguments(
|
||||
arg_id, cid,
|
||||
)
|
||||
except Exception as e: # noqa: BLE001
|
||||
# Likely FK violation if the LLM hallucinated
|
||||
# a claim_id. Log and continue.
|
||||
logger.warning(
|
||||
"argument_aggregator: skipped bad claim_id %s for arg %s: %s",
|
||||
cid, arg_id, e,
|
||||
)
|
||||
inserted += 1
|
||||
party_counts[party] = len(arguments)
|
||||
party_counts[group_key] = len(arguments)
|
||||
|
||||
result: dict = {
|
||||
"status": "completed",
|
||||
@@ -316,9 +369,9 @@ async def get_legal_arguments(
|
||||
async with pool.acquire() as conn:
|
||||
if party and party in ALLOWED_PARTIES:
|
||||
rows = await conn.fetch(
|
||||
"""SELECT id, case_id, party, argument_index, argument_title,
|
||||
argument_body, legal_topic, priority, cited_precedents,
|
||||
created_at, updated_at
|
||||
"""SELECT id, case_id, party, party_name, argument_index,
|
||||
argument_title, argument_body, legal_topic, priority,
|
||||
cited_precedents, created_at, updated_at
|
||||
FROM legal_arguments
|
||||
WHERE case_id = $1 AND party = $2
|
||||
ORDER BY priority, argument_index""",
|
||||
@@ -326,12 +379,12 @@ async def get_legal_arguments(
|
||||
)
|
||||
else:
|
||||
rows = await conn.fetch(
|
||||
"""SELECT id, case_id, party, argument_index, argument_title,
|
||||
argument_body, legal_topic, priority, cited_precedents,
|
||||
created_at, updated_at
|
||||
"""SELECT id, case_id, party, party_name, argument_index,
|
||||
argument_title, argument_body, legal_topic, priority,
|
||||
cited_precedents, created_at, updated_at
|
||||
FROM legal_arguments
|
||||
WHERE case_id = $1
|
||||
ORDER BY party, priority, argument_index""",
|
||||
ORDER BY party, party_name, priority, argument_index""",
|
||||
case_id,
|
||||
)
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ from __future__ import annotations
|
||||
|
||||
import json
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from uuid import UUID, uuid4
|
||||
|
||||
from legal_mcp.services import db
|
||||
@@ -38,7 +38,7 @@ async def log_action(
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7)""",
|
||||
uuid4(), action, case_id, document_id,
|
||||
json.dumps(details or {}, ensure_ascii=False, default=str),
|
||||
user, datetime.utcnow(),
|
||||
user, datetime.now(timezone.utc),
|
||||
)
|
||||
logger.info("AUDIT: %s | case=%s | user=%s | %s", action, case_id, user,
|
||||
json.dumps(details or {}, ensure_ascii=False)[:200])
|
||||
|
||||
@@ -35,29 +35,65 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
# ── Block configuration ───────────────────────────────────────────
|
||||
|
||||
# Output token limits per Anthropic docs:
|
||||
# Opus 4.7: up to 128K output tokens (new tokenizer — ~35% more tokens)
|
||||
# Sonnet 4.6: up to 64K output tokens
|
||||
# Streaming required when max_tokens > 21,333
|
||||
# Generation is structurally deterministic (#204 / WS5): every AI block is
|
||||
# pinned to ONE model (Opus 4.8) with a per-block reasoning `effort`. The
|
||||
# generation path is claude_session.query → `claude -p` (subscription, near-zero
|
||||
# cost; local-only — see reference_claude_generation_path / claude_session
|
||||
# docstring). Opus 4.7/4.8 REMOVED temperature/top_p/top_k (sending them → HTTP
|
||||
# 400); the only knob is `effort` (low/medium/high/xhigh/max; default high).
|
||||
#
|
||||
# DEPRECATED FIELDS — DO NOT REINTRODUCE: earlier revisions carried per-block
|
||||
# `temp` (0/0.1/0.4) and `model` ("sonnet"/"opus"/"script"). Both were DEAD
|
||||
# METADATA: write_block called claude_session.query(prompt, …) WITHOUT model/
|
||||
# temp/effort, so generation ran on the CLI's default model with no temperature
|
||||
# knob at all (the table only stored a number in decision_blocks.temperature and
|
||||
# fed MODEL_MAP→timeout). They are removed here so the table no longer misleads.
|
||||
# The conceptual origin (gen_type → thinking-budget) now lives in `effort`; see
|
||||
# docs/block-schema.md §3.
|
||||
#
|
||||
# `gen_type` is retained (documentation/UI metadata + audit `generation_type`).
|
||||
# `model` below is the DISPATCH key only: "script" = template-fill (no LLM),
|
||||
# "ai" = generated via the pinned Opus model. It is NOT a model alias anymore.
|
||||
#
|
||||
# Output token note (Anthropic): Opus 4.8 supports large outputs; streaming is
|
||||
# handled by the CLI. `max_tokens` is advisory context for callers, not sent.
|
||||
GENERATION_MODEL = "claude-opus-4-8" # single pinned model for every AI block (#204)
|
||||
# 1M-context build of the SAME pinned model (#216). The default build runs a
|
||||
# 200K-token context (~400K Hebrew chars at ~2 chars/token); large prompts —
|
||||
# notably block-yod, which carries the full case as source-context — overflow it.
|
||||
# Opus 4.8 offers a 1M-token window at standard pricing; `claude -p` exposes it
|
||||
# via the `[1m]` model id directly (no beta header — verified CLI 2.1.196). We
|
||||
# escalate to it only when the prompt is large, so small blocks stay on the
|
||||
# cheaper/faster 200K build. NOT a parallel model (G2) — same model, wider window.
|
||||
GENERATION_MODEL_1M = "claude-opus-4-8[1m]"
|
||||
# Escalate to the 1M build above this prompt size. Set below the 200K-token wall
|
||||
# (~400K chars) with headroom for output tokens (max_tokens up to 16K) + tokenizer
|
||||
# variance, so we switch before the standard build can overflow.
|
||||
_CTX_1M_THRESHOLD_CHARS = 350_000
|
||||
|
||||
BLOCK_CONFIG = {
|
||||
"block-alef": {"index": 1, "title": "כותרת מוסדית", "gen_type": "template-fill", "temp": 0, "model": "script"},
|
||||
"block-bet": {"index": 2, "title": "הרכב הוועדה", "gen_type": "template-fill", "temp": 0, "model": "script"},
|
||||
"block-gimel":{"index": 3, "title": "צדדים", "gen_type": "template-fill", "temp": 0, "model": "script"},
|
||||
"block-dalet":{"index": 4, "title": "החלטה", "gen_type": "template-fill", "temp": 0, "model": "script"},
|
||||
"block-he": {"index": 5, "title": "פתיחה", "gen_type": "paraphrase", "temp": 0.2, "model": "sonnet", "max_tokens": 4096},
|
||||
"block-vav": {"index": 6, "title": "רקע עובדתי", "gen_type": "reproduction", "temp": 0, "model": "sonnet", "max_tokens": 16384},
|
||||
"block-zayin":{"index": 7, "title": "טענות הצדדים", "gen_type": "paraphrase", "temp": 0.1, "model": "sonnet", "max_tokens": 16384},
|
||||
"block-chet": {"index": 8, "title": "הליכים", "gen_type": "reproduction", "temp": 0, "model": "sonnet", "max_tokens": 8192},
|
||||
"block-tet": {"index": 9, "title": "תכניות חלות", "gen_type": "guided-synthesis", "temp": 0.2, "model": "opus", "max_tokens": 16384},
|
||||
"block-yod": {"index": 10, "title": "דיון והכרעה", "gen_type": "rhetorical-construction", "temp": 0.4, "model": "opus", "max_tokens": 16384},
|
||||
"block-yod-alef": {"index": 11, "title": "סיכום", "gen_type": "paraphrase", "temp": 0.1, "model": "sonnet", "max_tokens": 8192},
|
||||
"block-yod-bet": {"index": 12, "title": "חתימות", "gen_type": "template-fill", "temp": 0, "model": "script"},
|
||||
"block-alef": {"index": 1, "title": "כותרת מוסדית", "gen_type": "template-fill", "model": "script"},
|
||||
"block-bet": {"index": 2, "title": "הרכב הוועדה", "gen_type": "template-fill", "model": "script"},
|
||||
"block-gimel":{"index": 3, "title": "צדדים", "gen_type": "template-fill", "model": "script"},
|
||||
"block-dalet":{"index": 4, "title": "החלטה", "gen_type": "template-fill", "model": "script"},
|
||||
"block-he": {"index": 5, "title": "פתיחה", "gen_type": "paraphrase", "model": "ai", "effort": "medium", "max_tokens": 4096},
|
||||
"block-vav": {"index": 6, "title": "רקע עובדתי", "gen_type": "reproduction", "model": "ai", "effort": "low", "max_tokens": 16384},
|
||||
"block-zayin":{"index": 7, "title": "טענות הצדדים", "gen_type": "paraphrase", "model": "ai", "effort": "high", "max_tokens": 16384},
|
||||
"block-chet": {"index": 8, "title": "הליכים", "gen_type": "reproduction", "model": "ai", "effort": "medium", "max_tokens": 8192},
|
||||
"block-tet": {"index": 9, "title": "תכניות חלות", "gen_type": "guided-synthesis", "model": "ai", "effort": "high", "max_tokens": 16384},
|
||||
"block-yod": {"index": 10, "title": "דיון והכרעה", "gen_type": "rhetorical-construction", "model": "ai", "effort": "xhigh", "max_tokens": 16384},
|
||||
"block-yod-alef": {"index": 11, "title": "סיכום", "gen_type": "paraphrase", "model": "ai", "effort": "high", "max_tokens": 8192},
|
||||
"block-yod-bet": {"index": 12, "title": "חתימות", "gen_type": "template-fill", "model": "script"},
|
||||
}
|
||||
|
||||
MODEL_MAP = {
|
||||
"sonnet": "claude-sonnet-4-20250514",
|
||||
"opus": "claude-opus-4-7",
|
||||
}
|
||||
# Default effort when a block lacks an explicit one (defensive; every AI block
|
||||
# above sets one). High is the safe default per the generation-path reference.
|
||||
DEFAULT_EFFORT = "high"
|
||||
|
||||
# Blocks that take longer (deep reasoning) get the LONG timeout. The interim set
|
||||
# [he, vav, tet, zayin, chet] and the discussion block all run on the same pinned
|
||||
# Opus model, so timeout is driven by effort, not by a model split.
|
||||
_LONG_EFFORTS = frozenset({"high", "xhigh", "max"})
|
||||
|
||||
|
||||
# ── Template blocks (א-ד, יב) ────────────────────────────────────
|
||||
@@ -120,11 +156,14 @@ TEMPLATE_WRITERS = {
|
||||
BLOCK_PROMPTS = {
|
||||
"block-he": """כתוב את בלוק הפתיחה (בלוק ה) של החלטת ועדת ערר.
|
||||
|
||||
## כללים:
|
||||
- פתח ב"לפנינו ערר..." או "עניינה של החלטה זו..."
|
||||
- הגדר "להלן" מרכזיים: הוועדה המקומית, התכנית/הבקשה, המגרש
|
||||
- 1-2 סעיפים בלבד
|
||||
- אין ניתוח, אין ערכי שיפוט, אין ציטוטים מצדדים
|
||||
## מבנה קבוע (חובה — אותו מבנה בכל תיק):
|
||||
- **המשפט הראשון פותח תמיד במילה "לפנינו"** — נוסח קבוע: "לפנינו ערר על החלטת
|
||||
[הוועדה המקומית] מיום [תאריך] בעניין [נושא הבקשה/התכנית]." (אל תשתמש ב"עניינה של
|
||||
החלטה זו" או בכל פתיח חלופי — הפתיח אחיד.)
|
||||
- סעיף 1: הצגת הערר במשפט הקבוע לעיל + הגדרת ה"להלן" המרכזיים בסדר קבוע:
|
||||
הוועדה המקומית → התכנית/הבקשה → המגרש/המקרקעין.
|
||||
- סעיף 2 (רק אם נדרש להשלמת "להלן" נוספים): הגדרות-נוספות בלבד.
|
||||
- **בדיוק 1-2 סעיפים.** אין ניתוח, אין ערכי שיפוט, אין ציטוטים מצדדים.
|
||||
- מספור: 1.
|
||||
|
||||
## פרטי התיק:
|
||||
@@ -153,16 +192,16 @@ BLOCK_PROMPTS = {
|
||||
## כללים קריטיים:
|
||||
- **סנתז טענות דומות** — אל תרשום כל טענה בנפרד. קבץ טענות דומות לנושא אחד. למשל: כל הטענות על הודעות → סעיף אחד, כל הטענות על רכוש משותף → סעיף אחד.
|
||||
- גוף שלישי: "העוררים טוענים כי...", "הוועדה המקומית ציינה כי..."
|
||||
- **מבנה קבוע עם 3 חלקים:**
|
||||
1. "טענות העוררים" — 8-12 סעיפים מקובצים לפי נושא
|
||||
2. "עמדת הוועדה המקומית" — 5-8 סעיפים
|
||||
3. "עמדת מבקשי ההיתר" (אם יש) — 5-10 סעיפים
|
||||
- **מבנה: חלק (סעיף עם כותרת-משנה) לכל צד שמופיע בטענות שחולצו למטה** — לפי הכותרות שם (### ...). אל תמציא צדדים שאינם מופיעים ואל תשמיט צד שמופיע.
|
||||
- "טענות העוררים" — 8-12 סעיפים מקובצים לפי נושא.
|
||||
- **צד-משיב/מתנגד: כתוב חלק נפרד לכל כתב-תשובה** שמופיע (למשל "עמדת משיבות 2-3" ו-"עמדת משיבים 4-6" בנפרד) — 5-10 סעיפים לכל אחד. **אל תמזג משיבים שונים לסעיף אחד**, ואם עמדותיהם מנוגדות — שקף זאת.
|
||||
- "עמדת הוועדה המקומית" / "עמדת מבקשי ההיתר" (אם מופיעים) — 5-8 סעיפים.
|
||||
- כותרת: "תמצית טענות הצדדים"
|
||||
- נאמנות למקור — לא להמציא טענות, אבל כן לאחד ולסכם טענות חוזרות
|
||||
- אין ניתוח, אין מסקנות, אין הערכה ("טענה חלשה/חזקה")
|
||||
- רק מכתבי טענות מקוריים (לא השלמות טיעון)
|
||||
- מספור רציף
|
||||
- **יעד אורך: 800-1500 מילים**
|
||||
- **יעד אורך: 800-1500 מילים** (יותר כשיש כמה כתבי-תשובה נפרדים — כל צד מקבל את מלוא ההתייחסות)
|
||||
|
||||
## טענות שחולצו (קבץ טענות דומות לנושאים):
|
||||
{claims_context}
|
||||
@@ -245,6 +284,7 @@ BLOCK_PROMPTS = {
|
||||
- **ללא כפילות** — הפנה לבלוקים קודמים: "כאמור בסעיף X לעיל"
|
||||
- **מספור רציף** — המשך מספור מהבלוק הקודם
|
||||
- מותרות כותרות-משנה כשיש נושאים נפרדים לחלוטין
|
||||
- **צדדים מרובים** — כשיש כמה משיבים/מתנגדים או כתבי-תשובה נפרדים (ראה הכותרות שתחת "טענות" לעיל, למשל "משיבות 2-3" מול "משיבים 4-6"), התייחס לעמדת כל אחד לגופה ואל תמזג אותם ל"טענות המשיבים" גורפות. אם משיבים שונים נוקטים **עמדות מנוגדות זו לזו** — ציין זאת במפורש והכרע ביניהן בנימוק; אם עמדותיהם משלימות — ניתן לאגד תוך שמירת הייחוס.
|
||||
|
||||
## כיוון מאושר (חובה):
|
||||
{direction_context}
|
||||
@@ -297,11 +337,39 @@ STRUCTURE_GUIDANCE = {
|
||||
"partial_acceptance": "קבלה חלקית — מיפוי מתחים: מה מתקבל ולמה, מה נדחה ולמה, איזון.",
|
||||
}
|
||||
|
||||
_RATIO_SECTION_HE = {"background": "רקע", "claims": "טענות", "discussion": "דיון", "summary": "סיכום"}
|
||||
|
||||
|
||||
async def _structure_guidance_with_corpus(outcome: str, practice_area: str) -> str:
|
||||
"""Outcome structure guidance + the CORPUS-MEASURED section ratios (T10). The
|
||||
measured ratios come from style_distance.measure_corpus_ratios over style_corpus,
|
||||
which grows with every enrolled final — so the writer's structural target reflects
|
||||
Dafna's ACTUAL current distribution, not a frozen constant (this is the structural
|
||||
half of the voice-profile that learns from each decision). Deterministic (no LLM);
|
||||
best-effort. Shared by both writer entry points (G2)."""
|
||||
sg = STRUCTURE_GUIDANCE.get(outcome, "")
|
||||
if practice_area == "betterment_levy":
|
||||
sg = (sg + " | היטל השבחה: "
|
||||
+ " ".join(PRACTICE_AREA_OVERRIDES["betterment_levy"]["discussion_rules"])).strip()
|
||||
try:
|
||||
from legal_mcp.services.style_distance import measure_corpus_ratios
|
||||
entry = (await measure_corpus_ratios() or {}).get(outcome) or {}
|
||||
secs = entry.get("sections") or {}
|
||||
if secs:
|
||||
parts = [f"{_RATIO_SECTION_HE.get(s, s)} ~{round(p)}%" for s, p in secs.items()]
|
||||
sg = (sg + f" | מבנה-יעד מדוד מהקורפוס ({entry.get('n', 0)} החלטות {outcome}): "
|
||||
+ " · ".join(parts)).strip()
|
||||
except Exception as e:
|
||||
logger.warning("corpus ratios not loaded for structure guidance: %s", e)
|
||||
return sg
|
||||
|
||||
|
||||
async def write_block(
|
||||
case_id: UUID,
|
||||
block_id: str,
|
||||
instructions: str = "",
|
||||
effort_override: str | None = None,
|
||||
model_override: str | None = None,
|
||||
) -> dict:
|
||||
"""כתיבת בלוק יחיד בהחלטה.
|
||||
|
||||
@@ -309,6 +377,17 @@ async def write_block(
|
||||
case_id: מזהה התיק
|
||||
block_id: מזהה הבלוק (block-alef, block-he, block-yod, ...)
|
||||
instructions: הנחיות נוספות
|
||||
effort_override: optional per-call reasoning effort (low/medium/high/
|
||||
xhigh/max). When set, overrides BLOCK_CONFIG[block_id].effort for
|
||||
THIS call only — used by the #208 model/effort calibration harness
|
||||
to A/B efforts without mutating the pinned defaults. Production
|
||||
callers leave it None and get the deterministic per-block effort.
|
||||
model_override: optional per-call generation model id (e.g.
|
||||
"claude-opus-5"). Same contract as effort_override — the #208
|
||||
harness A/Bs MODELS without mutating the pinned GENERATION_MODEL.
|
||||
Pass the BASE id only: the 1M-context escalation (#216) is applied
|
||||
on top automatically for large prompts, so an override never
|
||||
silently loses the 1M window. Production callers leave it None.
|
||||
|
||||
Returns:
|
||||
dict עם content, word_count, block_id, generation_type
|
||||
@@ -352,12 +431,8 @@ async def write_block(
|
||||
post_hearing_context = await _build_post_hearing_context(case_id)
|
||||
|
||||
outcome = canonical_outcome((decision or {}).get("outcome", "rejection"))
|
||||
structure_guidance = STRUCTURE_GUIDANCE.get(outcome, "")
|
||||
if case.get("practice_area") == "betterment_levy":
|
||||
structure_guidance = (
|
||||
structure_guidance + " | היטל השבחה: "
|
||||
+ " ".join(PRACTICE_AREA_OVERRIDES["betterment_levy"]["discussion_rules"])
|
||||
).strip()
|
||||
structure_guidance = await _structure_guidance_with_corpus(
|
||||
outcome, case.get("practice_area", ""))
|
||||
|
||||
# Content checklist — tells block-yod WHAT topics to cover
|
||||
content_checklist = ""
|
||||
@@ -406,33 +481,57 @@ async def write_block(
|
||||
if not dir_doc.get("approved"):
|
||||
raise ValueError("לא ניתן לכתוב בלוק דיון ללא כיוון מאושר. הפעל brainstorm → approve_direction קודם.")
|
||||
|
||||
# Guard against context overflow before calling claude -p.
|
||||
# Sonnet: 200K context → ~800K chars max; Opus: 200K context → same.
|
||||
# In practice the CLI has crashed on prompts above ~400K chars, so use
|
||||
# that as a conservative ceiling (well below the token limit).
|
||||
_MAX_PROMPT_CHARS = 400_000
|
||||
# Pick the model build by prompt size (#216). Above the 200K-token wall we
|
||||
# escalate to the 1M-context build (`[1m]`) instead of failing the block —
|
||||
# block-yod legitimately carries the whole case as source-context. The 400K
|
||||
# ceiling was an artifact of the old 200K-only build, NOT a model limit.
|
||||
# model_override (#208 harness) swaps the BASE id only — the 1M decision below
|
||||
# still applies, so an A/B'd model keeps the same context-window behaviour as
|
||||
# the pinned default instead of silently falling back to the 200K build.
|
||||
_base_model = model_override or GENERATION_MODEL
|
||||
_model_1m = GENERATION_MODEL_1M if _base_model == GENERATION_MODEL else f"{_base_model}[1m]"
|
||||
gen_model = _model_1m if len(prompt) > _CTX_1M_THRESHOLD_CHARS else _base_model
|
||||
|
||||
# Final guard: even the 1M build is finite (~2M Hebrew chars of input). Cap at
|
||||
# 1.5M chars (~750K tokens) to leave room for output + a safety margin under 1M.
|
||||
_MAX_PROMPT_CHARS = 1_500_000
|
||||
if len(prompt) > _MAX_PROMPT_CHARS:
|
||||
raise RuntimeError(
|
||||
f"Prompt too large for {block_id}: {len(prompt):,} chars "
|
||||
f"(limit {_MAX_PROMPT_CHARS:,}). "
|
||||
f"(limit {_MAX_PROMPT_CHARS:,}, even on the 1M-context build). "
|
||||
f"source_context: {len(source_context):,} chars. "
|
||||
f"Reduce documents or call extract_appraiser_facts first."
|
||||
f"Reduce source-context (summaries / appraiser_facts / focused RAG)."
|
||||
)
|
||||
|
||||
# Call Claude via Claude Code session (no API)
|
||||
model_key = block_cfg["model"]
|
||||
timeout = claude_session.LONG_TIMEOUT if model_key == "opus" else claude_session.DEFAULT_TIMEOUT
|
||||
content = await claude_session.query(prompt, timeout=timeout, tools="") # prose gen — no tool_use → no error_max_turns
|
||||
# Call Claude via Claude Code session (no API). #204: pin the model + per-block
|
||||
# reasoning effort so generation is structurally deterministic — these were
|
||||
# previously NOT forwarded (the source of inconsistency). model/effort flow
|
||||
# through claude_session.query → `claude -p --model … --effort …`.
|
||||
effort = effort_override or block_cfg.get("effort", DEFAULT_EFFORT)
|
||||
timeout = claude_session.LONG_TIMEOUT if effort in _LONG_EFFORTS else claude_session.DEFAULT_TIMEOUT
|
||||
content = await claude_session.query(
|
||||
prompt,
|
||||
timeout=timeout,
|
||||
model=gen_model,
|
||||
effort=effort,
|
||||
tools="", # prose gen — no tool_use → no error_max_turns
|
||||
)
|
||||
|
||||
sources = await _collect_block_sources(case_id, block_id)
|
||||
sources["case_law_ids"] = _precedent_case_law_ids
|
||||
result = _build_result(block_id, content, block_cfg)
|
||||
result = _build_result(block_id, content, block_cfg, model_used=gen_model)
|
||||
# Record the EFFECTIVE effort (override wins) so the harness can attribute
|
||||
# the measured distance to the effort that actually produced the text.
|
||||
if result.get("effort") is not None:
|
||||
result["effort"] = effort
|
||||
result["sources"] = sources
|
||||
return result
|
||||
|
||||
|
||||
def _build_result(block_id: str, content: str, block_cfg: dict) -> dict:
|
||||
def _build_result(block_id: str, content: str, block_cfg: dict,
|
||||
model_used: str = GENERATION_MODEL) -> dict:
|
||||
word_count = len(content.split())
|
||||
is_ai = block_cfg["model"] == "ai"
|
||||
return {
|
||||
"block_id": block_id,
|
||||
"block_index": block_cfg["index"],
|
||||
@@ -440,8 +539,15 @@ def _build_result(block_id: str, content: str, block_cfg: dict) -> dict:
|
||||
"content": content,
|
||||
"word_count": word_count,
|
||||
"generation_type": block_cfg["gen_type"],
|
||||
"model_used": block_cfg["model"],
|
||||
"temperature": block_cfg["temp"],
|
||||
# AI blocks record the model build actually used (200K or [1m], #216);
|
||||
# template blocks record "script".
|
||||
"model_used": model_used if is_ai else block_cfg["model"],
|
||||
# The real generation knob (#204). None for template/script blocks.
|
||||
"effort": block_cfg.get("effort", DEFAULT_EFFORT) if is_ai else None,
|
||||
# DEPRECATED: temperature is not a real knob on Opus 4.7/4.8 (sending it
|
||||
# → HTTP 400). Kept only to satisfy decision_blocks.temperature
|
||||
# NUMERIC(3,2); always 0. Read `effort` instead.
|
||||
"temperature": 0,
|
||||
}
|
||||
|
||||
|
||||
@@ -522,24 +628,63 @@ async def _build_claims_context(case_id: UUID) -> str:
|
||||
return "(לא חולצו טענות)"
|
||||
|
||||
# Filter out claims from block-zayin (decision summary) — use only
|
||||
# claims extracted from original pleadings (appeal, response, etc.)
|
||||
source_claims = [c for c in claims if c.get("source_document", "") != "block-zayin"]
|
||||
# claims extracted from original pleadings (appeal, response, etc.).
|
||||
# Also drop claim_type='protocol' (oral arguments raised at the hearing):
|
||||
# block ז carries ORIGINAL written pleadings only (INV-WR4); hearing-raised
|
||||
# arguments belong to block ח (proceedings) and to analyze_protocol's
|
||||
# comparative case-knowledge, not to the parties'-claims summary.
|
||||
source_claims = [
|
||||
c for c in claims
|
||||
if c.get("source_document", "") != "block-zayin"
|
||||
and c.get("claim_type", "claim") != "protocol"
|
||||
]
|
||||
if not source_claims:
|
||||
# Fallback to all claims if no source claims exist
|
||||
source_claims = claims
|
||||
# Fallback to all non-block-zayin claims if no source claims exist.
|
||||
source_claims = [c for c in claims if c.get("source_document", "") != "block-zayin"] or claims
|
||||
|
||||
# Group by (party_role, brief) so a multi-litigant side (respondent /
|
||||
# permit_applicant) whose claims come from distinct pleadings reads as
|
||||
# SEPARATE positions — e.g. "כתב תשובה משיבות 2-3" vs "משיבים 4-6" — instead
|
||||
# of one merged "טענות המשיבים" (#224). The brief label is the source
|
||||
# pleading, and which sides split is SPLIT_PARTIES — the SAME rule the
|
||||
# argument aggregator uses, so block ז and the arguments panel agree (G2).
|
||||
from legal_mcp.services.argument_aggregator import SPLIT_PARTIES
|
||||
|
||||
lines = []
|
||||
current_role = ""
|
||||
role_heb = {"appellant": "טענות העוררים", "respondent": "טענות המשיבים",
|
||||
"committee": "עמדת הוועדה המקומית", "permit_applicant": "עמדת מבקשי ההיתר"}
|
||||
claim_num = 0
|
||||
role_order = ["appellant", "committee", "respondent", "permit_applicant"]
|
||||
|
||||
groups: dict[tuple[str, str], list[dict]] = {}
|
||||
for c in source_claims:
|
||||
if c["party_role"] != current_role:
|
||||
current_role = c["party_role"]
|
||||
lines.append(f"\n### {role_heb.get(current_role, current_role)}")
|
||||
role = c.get("party_role", "") or ""
|
||||
# Prefer the stored party_name (stamped by the extractor, #224); fall
|
||||
# back to source_document for legacy claims predating the stamping.
|
||||
if role in SPLIT_PARTIES:
|
||||
brief = (c.get("party_name") or "").strip() or (c.get("source_document") or "").strip()
|
||||
else:
|
||||
brief = ""
|
||||
groups.setdefault((role, brief), []).append(c)
|
||||
|
||||
def _sort_key(k: tuple[str, str]) -> tuple[int, str]:
|
||||
role, brief = k
|
||||
idx = role_order.index(role) if role in role_order else len(role_order)
|
||||
return (idx, brief)
|
||||
|
||||
lines: list[str] = []
|
||||
claim_num = 0
|
||||
for role, brief in sorted(groups.keys(), key=_sort_key):
|
||||
header = role_heb.get(role, role or "טענות נוספות")
|
||||
if brief:
|
||||
header = f"{header} — {brief}"
|
||||
lines.append(f"\n### {header}")
|
||||
for c in groups[(role, brief)]:
|
||||
claim_num += 1
|
||||
lines.append(f"טענה #{claim_num}: {c['claim_text'][:400]}")
|
||||
lines.append(f"\n**סה\"כ {claim_num} טענות. ענה על כל טענה מהותית; טענות [bundle] — אגד; טענות [skip] — ציון קצר בלבד.**")
|
||||
lines.append(
|
||||
f"\n**סה\"כ {claim_num} טענות. שמור על ההפרדה בין הצדדים לעיל — "
|
||||
f"לכל צד/כתב-תשובה עמדה נפרדת (אל תמזג משיבים שונים). ענה על כל טענה "
|
||||
f"מהותית; טענות [bundle] — אגד; טענות [skip] — ציון קצר בלבד.**"
|
||||
)
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
@@ -983,6 +1128,22 @@ async def _build_style_context(practice_area: str = "") -> str:
|
||||
("anti_patterns", "אנטי-דפוסים (להימנע)"),
|
||||
):
|
||||
ov = await db.get_methodology_overrides(cat)
|
||||
if cat == "anti_patterns":
|
||||
# Anti-patterns are STRUCTURAL INVARIANTS of Dafna's style (no
|
||||
# markdown headers, no bullet lists, no mid-paragraph mini-lists —
|
||||
# she writes continuous legal narrative). They must reach the writer
|
||||
# ALWAYS, from the SAME canonical list style_distance measures against
|
||||
# (lessons.ANTI_PATTERNS) — otherwise the loop detects them but never
|
||||
# corrects them, and drafts keep emitting them (the gap that left
|
||||
# 8137 with 28 hits). Chair additions layer on top; they never
|
||||
# remove the canonical ones.
|
||||
from legal_mcp.services.lessons import ANTI_PATTERNS as _ANTI
|
||||
learned.append(f"\n**{label} — כתוב נרטיב משפטי רציף; הימנע מ:**")
|
||||
for ap in _ANTI:
|
||||
learned.append(f"- {ap['note']}")
|
||||
for k, v in (ov or {}).items():
|
||||
learned.append(f"- (יו\"ר) {k}: {json.dumps(v, ensure_ascii=False)}")
|
||||
continue
|
||||
if ov:
|
||||
learned.append(f"\n**{label} — ערכי היו\"ר (גוברים על ברירת-המחדל):**")
|
||||
for k, v in ov.items():
|
||||
@@ -990,7 +1151,8 @@ async def _build_style_context(practice_area: str = "") -> str:
|
||||
except Exception as e:
|
||||
logger.warning("methodology overrides not loaded: %s", e)
|
||||
try:
|
||||
lessons = await db.get_recent_decision_lessons(limit=15, practice_area=practice_area)
|
||||
lessons = await db.get_recent_decision_lessons(
|
||||
limit=config.WRITER_LESSONS_LIMIT, practice_area=practice_area)
|
||||
if lessons:
|
||||
learned.append("\n**לקחים מהחלטות קודמות (decision_lessons):**")
|
||||
for ls in lessons:
|
||||
@@ -1078,12 +1240,8 @@ async def get_block_context(case_id: UUID, block_id: str, instructions: str = ""
|
||||
post_hearing_context = await _build_post_hearing_context(case_id)
|
||||
|
||||
outcome = canonical_outcome((decision or {}).get("outcome", "rejection"))
|
||||
structure_guidance = STRUCTURE_GUIDANCE.get(outcome, "")
|
||||
if case.get("practice_area") == "betterment_levy":
|
||||
structure_guidance = (
|
||||
structure_guidance + " | היטל השבחה: "
|
||||
+ " ".join(PRACTICE_AREA_OVERRIDES["betterment_levy"]["discussion_rules"])
|
||||
).strip()
|
||||
structure_guidance = await _structure_guidance_with_corpus(
|
||||
outcome, case.get("practice_area", ""))
|
||||
|
||||
# Content checklist + methodology for block-yod
|
||||
content_checklist = ""
|
||||
|
||||
147
mcp-server/src/legal_mcp/services/case_citation_verification.py
Normal file
147
mcp-server/src/legal_mcp/services/case_citation_verification.py
Normal file
@@ -0,0 +1,147 @@
|
||||
"""Citation-verification view (X11 Phase 2 / #154) — the chair's "אימות פסיקה" tab.
|
||||
|
||||
Assembles, per legal ARGUMENT of a case, the supporting precedents the chair should
|
||||
verify before the writer cites them:
|
||||
|
||||
• in-corpus suggestions — per-issue semantic retrieval over the authoritative
|
||||
precedent library (``search_library``), each carrying the cumulative authority
|
||||
signal (``cited_by``: followed/distinguished — db.citation_authority, X11).
|
||||
• attached/verified state — any ``case_precedents`` row already attached to the
|
||||
argument (verified flag + chair_note), merged onto the matching suggestion.
|
||||
• radar — UNLINKED digests relevant to the same issue (rulings we don't hold yet),
|
||||
from ``case_digest_radar`` grouped by matched issue.
|
||||
|
||||
Pure read/assembly — never writes, never cites (INV-DIG1/INV-AH). The chair verifies
|
||||
through ``db.set_case_precedent_verified`` / attach; the writer consumes only verified
|
||||
rows. Reuses the one corpus search + the one authority query + the one radar (G2).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
from uuid import UUID
|
||||
|
||||
from legal_mcp.services import (
|
||||
argument_aggregator,
|
||||
db,
|
||||
digest_library,
|
||||
precedent_library,
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
_SUGGEST_PER_ISSUE = 4
|
||||
_SUGGEST_FLOOR = 0.45
|
||||
|
||||
|
||||
async def build_view(case_number: str) -> dict:
|
||||
case = await db.get_case_by_number(case_number)
|
||||
if not case:
|
||||
return {"status": "case_not_found", "case_number": case_number, "arguments": []}
|
||||
case_id = case["id"]
|
||||
if isinstance(case_id, str):
|
||||
case_id = UUID(case_id)
|
||||
ctx = " ".join(x for x in [case.get("title") or "", case.get("appeal_subtype") or ""] if x).strip()
|
||||
|
||||
args = await argument_aggregator.get_legal_arguments(case_id)
|
||||
|
||||
# Attached precedents already on the case → grouped by argument_id, keyed by
|
||||
# the resolved corpus ruling so we can merge verify-state onto a suggestion.
|
||||
attached = await db.list_case_precedents(case_id)
|
||||
attached_by_arg: dict[str, dict[str, dict]] = {}
|
||||
for p in attached:
|
||||
aid = str(p.get("argument_id") or "")
|
||||
clid = str(p.get("case_law_id") or "")
|
||||
if aid and clid:
|
||||
attached_by_arg.setdefault(aid, {})[clid] = p
|
||||
|
||||
# Radar (unlinked digests) once, grouped by the issue label it matched.
|
||||
radar_by_issue: dict[str, list[dict]] = {}
|
||||
try:
|
||||
radar = await digest_library.case_digest_radar(case_number, limit=12, min_score=0.42)
|
||||
for lead in radar.get("leads", []):
|
||||
for label in (lead.get("matched_issues") or ["—"]):
|
||||
radar_by_issue.setdefault(label, []).append(lead)
|
||||
except Exception as e: # noqa: BLE001 — radar is best-effort
|
||||
logger.warning("citation_verification radar failed for %s: %s", case_number, e)
|
||||
|
||||
async def _fetch(a: dict) -> tuple[list[dict], dict]:
|
||||
"""Per-argument corpus search + batched authority — run concurrently.
|
||||
|
||||
Each call is one Voyage embed + one vector search (+ one batched authority
|
||||
query); independent across arguments, so they fan out rather than waterfall.
|
||||
"""
|
||||
title = (a.get("argument_title") or "").strip()
|
||||
topic = (a.get("legal_topic") or "").strip()
|
||||
query = f"{ctx} {title}. {topic}".strip()
|
||||
hits: list[dict] = []
|
||||
try:
|
||||
hits = await precedent_library.search_library(
|
||||
query=query, limit=_SUGGEST_PER_ISSUE, include_halachot=True)
|
||||
except Exception as e: # noqa: BLE001
|
||||
logger.warning("citation_verification search failed (%s): %s", title[:30], e)
|
||||
# Resolve the authority breakdown for the hit set in one batched query.
|
||||
clids = [UUID(str(h["case_law_id"])) for h in hits
|
||||
if h.get("case_law_id") and float(h.get("score", 0) or 0) >= _SUGGEST_FLOOR]
|
||||
authority = await db.citation_authority(clids) if clids else {}
|
||||
return hits, authority
|
||||
|
||||
# Fan out the expensive per-argument retrieval concurrently — was a sequential
|
||||
# waterfall (N args × Voyage embed + vector search each). gather preserves order.
|
||||
fetched = await asyncio.gather(*(_fetch(a) for a in args)) if args else []
|
||||
|
||||
out_args: list[dict] = []
|
||||
n_verified = 0
|
||||
for a, (hits, authority) in zip(args, fetched):
|
||||
aid = str(a["id"])
|
||||
title = (a.get("argument_title") or "").strip()
|
||||
topic = (a.get("legal_topic") or "").strip()
|
||||
|
||||
seen: set[str] = set()
|
||||
supporting: list[dict] = []
|
||||
for h in hits:
|
||||
clid = str(h.get("case_law_id") or "")
|
||||
if not clid or clid in seen:
|
||||
continue
|
||||
if float(h.get("score", 0) or 0) < _SUGGEST_FLOOR:
|
||||
continue
|
||||
seen.add(clid)
|
||||
att = attached_by_arg.get(aid, {}).get(clid)
|
||||
if att and att.get("verified"):
|
||||
n_verified += 1
|
||||
supporting.append({
|
||||
"case_law_id": clid,
|
||||
"case_number": h.get("case_number") or "",
|
||||
"case_name": h.get("case_name") or "",
|
||||
"quote": h.get("supporting_quote") or h.get("rule_statement") or "",
|
||||
"score": round(float(h.get("score", 0) or 0), 3),
|
||||
"cited_by": authority.get(clid, {"total": 0, "positive": 0,
|
||||
"negative": 0, "unclassified": 0,
|
||||
"by_treatment": {}}),
|
||||
"attached_id": str(att["id"]) if att else None,
|
||||
"verified": bool(att.get("verified")) if att else False,
|
||||
"chair_note": (att.get("chair_note") or "") if att else "",
|
||||
})
|
||||
|
||||
out_args.append({
|
||||
"argument_id": aid,
|
||||
"title": title,
|
||||
"legal_topic": topic,
|
||||
"priority": a.get("priority") or "",
|
||||
"party": a.get("party") or "",
|
||||
"supporting": supporting,
|
||||
"radar": radar_by_issue.get(title, []),
|
||||
})
|
||||
|
||||
return {
|
||||
"status": "ok",
|
||||
"case_number": case_number,
|
||||
"arguments": out_args,
|
||||
"summary": {
|
||||
"arguments_total": len(out_args),
|
||||
"arguments_with_support": sum(1 for x in out_args if x["supporting"]),
|
||||
"verified": n_verified,
|
||||
"radar_leads": sum(len(x["radar"]) for x in out_args),
|
||||
},
|
||||
}
|
||||
@@ -144,9 +144,12 @@ def _split_into_sections(text: str) -> list[tuple[str, str]]:
|
||||
markers: list[tuple[int, str]] = []
|
||||
|
||||
for pattern, section_type in SECTION_PATTERNS:
|
||||
# ^ + MULTILINE: line start only. Optional leading spaces/tabs and an
|
||||
# ^ + MULTILINE: line start only. Optional leading spaces/tabs, an
|
||||
# optional Markdown ATX header prefix (``## ``/``### ``), and an
|
||||
# optional ordinal prefix ("5.", "5)", "ג.") before the keyword.
|
||||
anchored = rf"^[ \t]*(?:\d+[.)]\s*|[א-ת][.)]\s*)?(?:{pattern})"
|
||||
# The Markdown prefix handles Mistral OCR output where section
|
||||
# titles are rendered as ``## נימוקי הערר`` etc.
|
||||
anchored = rf"^[ \t]*(?:#{1,3}\s+)?(?:\d+[.)]\s*|[א-ת][.)]\s*)?(?:{pattern})"
|
||||
for match in re.finditer(anchored, text, re.MULTILINE):
|
||||
markers.append((match.start(), section_type))
|
||||
|
||||
|
||||
@@ -399,12 +399,16 @@ async def list_citations_to_case_law(case_law_id: UUID) -> list[dict]:
|
||||
pic.cited_case_number,
|
||||
pic.match_context,
|
||||
pic.match_pattern,
|
||||
pic.treatment,
|
||||
pic.confidence::float AS confidence,
|
||||
pic.created_at,
|
||||
cl.case_number AS source_case_number,
|
||||
cl.case_name AS source_case_name,
|
||||
cl.chair_name AS source_chair_name,
|
||||
cl.district AS source_district
|
||||
cl.district AS source_district,
|
||||
cl.precedent_level AS source_precedent_level,
|
||||
cl.court AS source_court,
|
||||
cl.date AS source_date
|
||||
FROM precedent_internal_citations pic
|
||||
JOIN case_law cl ON cl.id = pic.source_case_law_id
|
||||
WHERE pic.cited_case_law_id = $1
|
||||
|
||||
@@ -227,8 +227,15 @@ def _infer_claim_type(doc_type: str, source_name: str) -> str:
|
||||
- 'claim' = from appeal documents (כתב ערר)
|
||||
- 'response' = from original response documents (כתב תשובה)
|
||||
- 'reply' = from supplementary responses (תגובה, השלמת טיעון)
|
||||
- 'protocol' = oral arguments raised at the hearing (פרוטוקול דיון)
|
||||
"""
|
||||
name_lower = source_name.lower() if source_name else ""
|
||||
# A hearing protocol carries oral arguments — tagged distinctly so the
|
||||
# comparative protocol analysis (analyze_protocol) and block-chet
|
||||
# (proceedings) can tell them apart from the original written pleadings
|
||||
# (INV-WR4: block ז stays original-pleadings-only).
|
||||
if doc_type == "protocol" or "פרוטוקול" in name_lower:
|
||||
return "protocol"
|
||||
if doc_type == "appeal" or "כתב ערר" in name_lower:
|
||||
return "claim"
|
||||
if "כתב תשובה" in name_lower:
|
||||
@@ -353,14 +360,29 @@ async def extract_and_store_claims(
|
||||
claims = await extract_claims_with_ai(text, doc_type, party_hint)
|
||||
|
||||
if not claims:
|
||||
# Stamp the document as analysed even with zero claims, so it is not
|
||||
# perpetually flagged "not-analysed" (#201 — the not-analysed flag is
|
||||
# about whether extraction *ran*, not whether it found anything).
|
||||
await db.mark_document_claims_extracted(document_id, status="no_claims")
|
||||
return {"status": "no_claims", "total": 0, "source": source_name}
|
||||
|
||||
# Determine claim_type from document type and title
|
||||
claim_type = _infer_claim_type(doc_type, source_name)
|
||||
# Stamp party_name at the source (#224). For a multi-litigant side
|
||||
# (respondent / permit_applicant) the brief label IS the source pleading, so
|
||||
# opposing briefs (משיבות 2-3 vs משיבים 4-6) stay distinct downstream without
|
||||
# the aggregator/block-writer having to re-derive it. SPLIT_PARTIES is the
|
||||
# single rule shared with the aggregator (G2); single-voice sides stay ''.
|
||||
from legal_mcp.services.argument_aggregator import SPLIT_PARTIES
|
||||
for c in claims:
|
||||
c["claim_type"] = claim_type
|
||||
c["party_name"] = source_name if c.get("party_role") in SPLIT_PARTIES else ""
|
||||
|
||||
stored = await db.store_claims(case_id, claims, source_document=source_name)
|
||||
# Mark this document analysed (WS2 / #201). store_claims already replaced
|
||||
# this document's prior claims by source_document — so re-running is a clean
|
||||
# per-document refresh that does NOT touch other documents' claims (the merge).
|
||||
await db.mark_document_claims_extracted(document_id, status="completed")
|
||||
|
||||
# Summarize by role
|
||||
role_counts: dict[str, int] = {}
|
||||
|
||||
@@ -146,8 +146,15 @@ async def query(
|
||||
"""
|
||||
full_prompt = f"{system}\n\n{prompt}" if system else prompt
|
||||
|
||||
if len(full_prompt) > 150_000:
|
||||
logger.warning("Large prompt: %d chars — may hit context limits", len(full_prompt))
|
||||
# ~350K chars ≈ the 200K-token wall of the default Opus build (~2 Hebrew
|
||||
# chars/token). Above it callers should pass the 1M-context model id
|
||||
# (`claude-opus-4-8[1m]`) — block_writer escalates automatically (#216).
|
||||
if len(full_prompt) > 350_000 and "[1m]" not in (model or ""):
|
||||
logger.warning(
|
||||
"Large prompt: %d chars on a non-[1m] model (%s) — may overflow the "
|
||||
"200K-token context. Pass claude-opus-4-8[1m] for the 1M window.",
|
||||
len(full_prompt), model or "CLI-default",
|
||||
)
|
||||
|
||||
cmd = [
|
||||
"claude", "-p",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -381,6 +381,119 @@ async def link_digest(digest_id: UUID | str, case_law_id: UUID | str) -> dict:
|
||||
}
|
||||
|
||||
|
||||
async def _radar_enrich(h: dict, score: float, matched_issues: list[str]) -> dict:
|
||||
"""Shape one radar hit into a chair lead: gap status + suggested action +
|
||||
which case ISSUE(s) it answers. The action points at the underlying RULING,
|
||||
never the digest (INV-DIG1)."""
|
||||
cit = (h.get("underlying_citation") or "").strip()
|
||||
gap = await db.find_missing_precedent_by_citation(cit) if cit else None
|
||||
in_corpus = await db.find_case_law_by_citation_fuzzy(cit) if cit else None
|
||||
if in_corpus:
|
||||
action = "available_link" # ruling actually IS in the corpus → just link the digest
|
||||
elif gap and (gap.get("status") in ("uploaded", "closed")):
|
||||
action = "fetched" # already obtained
|
||||
elif gap:
|
||||
action = "gap_open" # flagged as missing — can request a fetch
|
||||
else:
|
||||
action = "new_lead" # not even flagged yet — the highest-value alert
|
||||
return {
|
||||
"digest_id": str(h["id"]),
|
||||
"yomon_number": h.get("yomon_number"),
|
||||
"headline": h.get("headline_holding") or h.get("summary") or "",
|
||||
"underlying_citation": cit,
|
||||
"underlying_court": h.get("underlying_court") or "",
|
||||
"score": round(score, 3),
|
||||
"matched_issues": matched_issues,
|
||||
"missing_precedent_id": str(gap["id"]) if gap else None,
|
||||
"missing_precedent_status": gap.get("status") if gap else None,
|
||||
"action": action,
|
||||
}
|
||||
|
||||
|
||||
async def case_digest_radar(
|
||||
case_number: str,
|
||||
limit: int = 5,
|
||||
min_score: float = 0.45,
|
||||
) -> dict:
|
||||
"""Case-contextual digest radar (X12) — the chair-facing "שים לב" lead.
|
||||
|
||||
Surfaces UNLINKED digests (``linked_case_law_id IS NULL`` — rulings we don't hold
|
||||
yet) whose topic is semantically close to THIS case, so a relevant ruling we only
|
||||
know about via a digest doesn't fall through the cracks while the case is decided.
|
||||
|
||||
Query calibration: prefer the analyst's DISTILLED legal arguments (one crisp issue
|
||||
per row — ``argument_title`` + ``legal_topic``) over the dozens of raw claims. Each
|
||||
issue is searched separately and the leads are MERGED, so every lead is attributed
|
||||
to the case issue(s) it answers (``matched_issues``) — far higher precision than
|
||||
one blended query of noisy claims. Falls back to raw claims pre-aggregation
|
||||
(``source`` reports which path ran). Each lead carries the underlying ruling's gap
|
||||
status + a suggested action.
|
||||
|
||||
INV-DIG1: this is RADAR — the digest is never cited; the lead points at the
|
||||
underlying *ruling* (fetch / upload / link), never the digest itself. Read-only.
|
||||
"""
|
||||
case = await db.get_case_by_number(case_number)
|
||||
if not case:
|
||||
return {"status": "case_not_found", "case_number": case_number, "leads": [], "count": 0}
|
||||
case_id = case["id"]
|
||||
if isinstance(case_id, str):
|
||||
case_id = UUID(case_id)
|
||||
ctx = " ".join(x for x in [case.get("title") or "", case.get("appeal_subtype") or ""] if x).strip()
|
||||
|
||||
# Preferred source: the analyst's distilled CREAC issues (one per legal_argument).
|
||||
issues: list[tuple[str, str]] = [] # (label, embed_text)
|
||||
try:
|
||||
from legal_mcp.services import argument_aggregator
|
||||
for a in await argument_aggregator.get_legal_arguments(case_id):
|
||||
label = (a.get("argument_title") or a.get("legal_topic") or "").strip()
|
||||
topic = (a.get("legal_topic") or "").strip()
|
||||
body = f"{label}. {topic}".strip(". ").strip()
|
||||
if body:
|
||||
issues.append((label, f"{ctx} {body}".strip()))
|
||||
except Exception as e: # noqa: BLE001 — arguments are optional; fall back to claims
|
||||
logger.warning("case_digest_radar: get_legal_arguments failed for %s: %s", case_number, e)
|
||||
|
||||
merged: dict[str, dict] = {} # digest_id -> {"hit", "best", "issues": set}
|
||||
if issues:
|
||||
source = "legal_arguments"
|
||||
issues = issues[:25] # already distilled — bound the per-issue search fan-out
|
||||
vecs = await embeddings.embed_texts([t for _, t in issues], input_type="query")
|
||||
for (label, _), vec in zip(issues, vecs):
|
||||
for h in await db.search_digests_semantic(vec, limit=6, linked_only=False):
|
||||
s = float(h.get("score", 0) or 0)
|
||||
if s < min_score:
|
||||
continue
|
||||
m = merged.setdefault(str(h["id"]), {"hit": h, "best": s, "issues": set()})
|
||||
m["best"] = max(m["best"], s)
|
||||
if label:
|
||||
m["issues"].add(label)
|
||||
else:
|
||||
# Fallback: blended query from raw claims (pre-aggregation), one search.
|
||||
source = "claims"
|
||||
parts = [ctx]
|
||||
try:
|
||||
claims = await db.get_claims(case_id)
|
||||
parts += [(c.get("claim_text") or "") for c in claims[:20]]
|
||||
except Exception as e: # noqa: BLE001
|
||||
logger.warning("case_digest_radar: get_claims failed for %s: %s", case_number, e)
|
||||
query = " ".join(p for p in parts if p).strip()
|
||||
if not query:
|
||||
return {"status": "no_topic", "case_number": case_number,
|
||||
"source": source, "leads": [], "count": 0}
|
||||
vec = (await embeddings.embed_texts([query], input_type="query"))[0]
|
||||
for h in await db.search_digests_semantic(vec, limit=max(limit * 4, 20), linked_only=False):
|
||||
s = float(h.get("score", 0) or 0)
|
||||
if s < min_score:
|
||||
continue
|
||||
merged.setdefault(str(h["id"]), {"hit": h, "best": s, "issues": set()})
|
||||
|
||||
ordered = sorted(merged.values(), key=lambda m: -m["best"])[:max(1, limit)]
|
||||
leads = [await _radar_enrich(m["hit"], m["best"], sorted(m["issues"])) for m in ordered]
|
||||
return {"status": "ok", "case_number": case_number, "source": source,
|
||||
"issues_used": [lbl for lbl, _ in issues] if source == "legal_arguments" else None,
|
||||
"leads": leads, "count": len(leads)}
|
||||
|
||||
|
||||
async def relink_digest(digest_id: UUID | str) -> dict:
|
||||
"""Re-run autolink for an unlinked digest. No-op if already linked / no match."""
|
||||
digest = await db.get_digest(digest_id)
|
||||
|
||||
@@ -43,10 +43,16 @@ HEBREW_FONT = "David"
|
||||
|
||||
|
||||
def _mark_run_rtl(run) -> None:
|
||||
"""Force David font on all four slots, then add <w:rtl/>."""
|
||||
"""Force David font on all four slots, then add <w:rtl/>.
|
||||
|
||||
INV-EX4 note: this reinforces the template's OWN font (David, == the
|
||||
template's cs slot) to work around Word's RTL ascii-slot fallback to
|
||||
Times New Roman — it is NOT an ad-hoc font/size override. Marked
|
||||
INV-EX4-ok for the single-source guard for that reason.
|
||||
"""
|
||||
rPr = run._r.get_or_add_rPr()
|
||||
if rPr.find(qn("w:rFonts")) is None:
|
||||
fonts = OxmlElement("w:rFonts")
|
||||
fonts = OxmlElement("w:rFonts") # INV-EX4-ok: reinforces template font David
|
||||
fonts.set(qn("w:ascii"), HEBREW_FONT)
|
||||
fonts.set(qn("w:hAnsi"), HEBREW_FONT)
|
||||
fonts.set(qn("w:cs"), HEBREW_FONT)
|
||||
@@ -192,14 +198,29 @@ def _apply_list_numbering(paragraph, num_id: int) -> None:
|
||||
|
||||
|
||||
def _clear_body(doc) -> None:
|
||||
"""Remove all paragraphs in the document body while keeping sectPr.
|
||||
"""Remove ALL body content (paragraphs, tables, stray bookmarks) while
|
||||
keeping only sectPr.
|
||||
|
||||
The template ships with sample paragraphs we don't want. Section
|
||||
properties (page size, margins, bidi) stay intact.
|
||||
The template ships with sample paragraphs *and three sample tables*
|
||||
(institutional header, panel, and a **signatures** table at the end —
|
||||
"ניתנה פה אחד" + יו"ר/מזכירה). Removing only ``w:p`` left those tables
|
||||
behind: the leftover header/panel tables injected block-א–ד data that was
|
||||
never extracted from the protocol (violates the empty-unless-extracted
|
||||
rule), and the leftover signatures table collapsed up against the header
|
||||
table at the **top** of the document (the chair-reported bug: חתימות צמודות
|
||||
לבלוק-ד במקום בסוף). The decision is a derived artifact rebuilt purely from
|
||||
``decision_blocks`` (INV-EX1) — signatures come from block-yod-bet, rendered
|
||||
last in block order — so the template's sample tables are stale scaffolding
|
||||
and must go. Section properties (page size, margins, bidi) stay intact.
|
||||
"""
|
||||
body = doc.element.body
|
||||
for p in list(body.findall(qn("w:p"))):
|
||||
body.remove(p)
|
||||
sectPr_tag = qn("w:sectPr")
|
||||
for child in list(body):
|
||||
# Keep section properties (page setup / bidi). Drop everything else:
|
||||
# sample paragraphs (w:p), sample tables (w:tbl), and any stray
|
||||
# bookmark markers the template left dangling between them.
|
||||
if child.tag != sectPr_tag:
|
||||
body.remove(child)
|
||||
|
||||
|
||||
# ── Bookmark helpers ──────────────────────────────────────────────
|
||||
@@ -378,8 +399,15 @@ _INTERIM_BLOCK_ORDER = [
|
||||
]
|
||||
|
||||
|
||||
def _draft_filename_prefix(mode: str) -> str:
|
||||
return "טיוטת-ביניים" if mode == "interim" else "טיוטה"
|
||||
def _draft_naming(mode: str) -> tuple[str, str]:
|
||||
"""(filename prefix, version separator) per export mode.
|
||||
|
||||
interim → ``טיוטה-טענות_הצדדים_{N}.docx`` (chair-requested naming);
|
||||
final → ``טיוטה-v{N}.docx``.
|
||||
"""
|
||||
if mode == "interim":
|
||||
return "טיוטה-טענות_הצדדים", "_"
|
||||
return "טיוטה", "-v"
|
||||
|
||||
|
||||
async def export_decision(
|
||||
@@ -464,16 +492,19 @@ async def export_decision(
|
||||
if not output_path:
|
||||
export_dir = config.find_case_dir(case["case_number"]) / "exports"
|
||||
export_dir.mkdir(parents=True, exist_ok=True)
|
||||
prefix = _draft_filename_prefix(mode)
|
||||
existing = sorted(export_dir.glob(f"{prefix}-v*.docx"))
|
||||
prefix, sep = _draft_naming(mode)
|
||||
existing = sorted(export_dir.glob(f"{prefix}{sep}*.docx"))
|
||||
next_ver = 1
|
||||
for p in existing:
|
||||
try:
|
||||
ver = int(p.stem.split("-v")[1])
|
||||
# Version is the trailing integer after the separator. Using
|
||||
# rsplit keeps this correct even when the prefix itself contains
|
||||
# the separator char (e.g. "טיוטה-טענות_הצדדים" with sep="_").
|
||||
ver = int(p.stem.rsplit(sep, 1)[1])
|
||||
next_ver = max(next_ver, ver + 1)
|
||||
except (IndexError, ValueError):
|
||||
pass
|
||||
output_path = str(export_dir / f"{prefix}-v{next_ver}.docx")
|
||||
output_path = str(export_dir / f"{prefix}{sep}{next_ver}.docx")
|
||||
|
||||
# Persist through the storage layer (INV-STG1). Under the filesystem
|
||||
# backend the bytes land at output_path exactly as before; a caller-
|
||||
|
||||
@@ -199,27 +199,86 @@ def _find_enclosing_paragraph(element: etree._Element) -> etree._Element | None:
|
||||
return None
|
||||
|
||||
|
||||
# ── Template style resolution (INV-EX4) ────────────────────────────
|
||||
# Every inserted paragraph carries a <w:pStyle> pointing at one of the
|
||||
# template's named styles — font (David), size, and indent come from
|
||||
# styles.xml, NOT from hand-set rFonts/sz here. Single template = single
|
||||
# style source (INV-EX4 / G2). docx_exporter.py applies the same styles by
|
||||
# name via python-docx; here (raw lxml) we resolve name → styleId.
|
||||
|
||||
# StyleType → candidate style names in the template (case-insensitive).
|
||||
# Mirrors the names docx_exporter uses (paragraph.style = "Heading 2"/"Normal"/"Quote").
|
||||
_STYLE_NAME_CANDIDATES: dict[str, tuple[str, ...]] = {
|
||||
"body": ("Normal", "Default Paragraph Font", "Body Text"),
|
||||
"bold": ("Normal", "Body Text"),
|
||||
"heading": ("Heading 2", "heading 2"),
|
||||
"quote": ("Quote", "quote", "Intense Quote"),
|
||||
}
|
||||
|
||||
|
||||
def _resolve_style_ids(members: dict[str, bytes]) -> dict[str, str]:
|
||||
"""Map each StyleType → the template's w:styleId, read from styles.xml.
|
||||
|
||||
Returns {} when styles.xml is absent — callers then fall back to
|
||||
minimal inline emphasis (so a missing style never crashes rendering).
|
||||
"""
|
||||
raw = members.get("word/styles.xml")
|
||||
if not raw:
|
||||
return {}
|
||||
try:
|
||||
styles_tree = etree.fromstring(raw)
|
||||
except etree.XMLSyntaxError: # pragma: no cover - corrupt template
|
||||
return {}
|
||||
# Build a lowercase lookup over both the style's display name and its id.
|
||||
by_key: dict[str, str] = {}
|
||||
for style in styles_tree.iterfind(".//w:style", NSMAP):
|
||||
sid = style.get(_w("styleId"))
|
||||
if not sid:
|
||||
continue
|
||||
by_key.setdefault(sid.lower(), sid)
|
||||
name_el = style.find(_w("name"))
|
||||
if name_el is not None:
|
||||
nm = name_el.get(_w("val"))
|
||||
if nm:
|
||||
by_key.setdefault(nm.lower(), sid)
|
||||
resolved: dict[str, str] = {}
|
||||
for style_type, candidates in _STYLE_NAME_CANDIDATES.items():
|
||||
for cand in candidates:
|
||||
sid = by_key.get(cand.lower())
|
||||
if sid is not None:
|
||||
resolved[style_type] = sid
|
||||
break
|
||||
return resolved
|
||||
|
||||
|
||||
def _emphasis_fallback(style: StyleType, *, has_pstyle: bool) -> tuple[bool, bool]:
|
||||
"""(bold, italic) for a run. When the paragraph carries a resolved
|
||||
template pStyle, emphasis comes from the style (return no inline override),
|
||||
except 'bold' which is inline emphasis with no dedicated style. When no
|
||||
pStyle resolved, fall back to minimal inline emphasis so heading/quote
|
||||
stay visually distinct."""
|
||||
if style == "bold":
|
||||
return True, False
|
||||
if has_pstyle:
|
||||
return False, False
|
||||
return (style == "heading"), (style == "quote")
|
||||
|
||||
|
||||
# ── Paragraph builders ─────────────────────────────────────────────
|
||||
|
||||
|
||||
def _build_run(text: str, *, bold: bool = False, italic: bool = False,
|
||||
font: str = "David", size_half_pt: int | None = None) -> etree._Element:
|
||||
"""Build a w:r (run) element with RTL/David defaults and given text."""
|
||||
def _build_run(text: str, *, bold: bool = False, italic: bool = False) -> etree._Element:
|
||||
"""Build a w:r (run): RTL marker + optional bold/italic + text.
|
||||
|
||||
Font (David) and size are NOT set here — they derive from the paragraph's
|
||||
template style (INV-EX4). The <w:rtl/> marker is still required so Word
|
||||
picks the style's complex-script (cs=David) slot rather than the ascii
|
||||
(Times New Roman) slot for Hebrew (same reason as _mark_run_rtl in
|
||||
analysis_docx_exporter.py).
|
||||
"""
|
||||
r = etree.Element(_w("r"))
|
||||
rPr = etree.SubElement(r, _w("rPr"))
|
||||
|
||||
rFonts = etree.SubElement(rPr, _w("rFonts"))
|
||||
rFonts.set(_w("ascii"), font)
|
||||
rFonts.set(_w("hAnsi"), font)
|
||||
rFonts.set(_w("cs"), font)
|
||||
rFonts.set(_w("hint"), "cs")
|
||||
|
||||
if size_half_pt is not None:
|
||||
sz = etree.SubElement(rPr, _w("sz"))
|
||||
sz.set(_w("val"), str(size_half_pt))
|
||||
szCs = etree.SubElement(rPr, _w("szCs"))
|
||||
szCs.set(_w("val"), str(size_half_pt))
|
||||
|
||||
if bold:
|
||||
etree.SubElement(rPr, _w("b"))
|
||||
etree.SubElement(rPr, _w("bCs"))
|
||||
@@ -235,28 +294,36 @@ def _build_run(text: str, *, bold: bool = False, italic: bool = False,
|
||||
return r
|
||||
|
||||
|
||||
def _build_paragraph(text: str, *, style: StyleType = "body") -> etree._Element:
|
||||
"""Build a w:p (paragraph) with RTL + David + given text."""
|
||||
def _build_paragraph(text: str, *, style: StyleType = "body",
|
||||
style_id: str | None = None) -> etree._Element:
|
||||
"""Build a w:p (paragraph) carrying the template's named style.
|
||||
|
||||
The paragraph references `style_id` (resolved from the template's
|
||||
styles.xml) via <w:pStyle> — font/size/indent come from there, not from
|
||||
hand-set rFonts/sz (INV-EX4). The only explicit paragraph-level override
|
||||
is the canonical body alignment jc=both, matching docx_exporter's
|
||||
_set_paragraph_jc (which forces both over style-center headings).
|
||||
"""
|
||||
p = etree.Element(_w("p"))
|
||||
pPr = etree.SubElement(p, _w("pPr"))
|
||||
|
||||
if style_id:
|
||||
pStyle = etree.SubElement(pPr, _w("pStyle"))
|
||||
pStyle.set(_w("val"), style_id)
|
||||
|
||||
bidi = etree.SubElement(pPr, _w("bidi"))
|
||||
bidi.set(_w("val"), "1")
|
||||
|
||||
# Right alignment for body/RTL
|
||||
# Canonical body alignment (two-sided justification) — overrides any
|
||||
# style-center, exactly as docx_exporter._set_paragraph_jc does.
|
||||
jc = etree.SubElement(pPr, _w("jc"))
|
||||
jc.set(_w("val"), "right")
|
||||
jc.set(_w("val"), "both")
|
||||
|
||||
rPr_p = etree.SubElement(pPr, _w("rPr"))
|
||||
etree.SubElement(rPr_p, _w("rtl"))
|
||||
|
||||
bold = style in ("heading", "bold")
|
||||
italic = style == "quote"
|
||||
size = None
|
||||
if style == "heading":
|
||||
size = 28 # 14pt
|
||||
elif style == "quote":
|
||||
size = 22 # 11pt
|
||||
run = _build_run(text, bold=bold, italic=italic, size_half_pt=size)
|
||||
bold, italic = _emphasis_fallback(style, has_pstyle=bool(style_id))
|
||||
run = _build_run(text, bold=bold, italic=italic)
|
||||
p.append(run)
|
||||
return p
|
||||
|
||||
@@ -275,7 +342,7 @@ def _wrap_in_ins(elements: list[etree._Element], *, ins_id: int,
|
||||
|
||||
def _make_tracked_paragraph_insert(
|
||||
text: str, *, style: StyleType, ins_id: int, author: str, date_iso: str,
|
||||
mark_id: int | None = None,
|
||||
mark_id: int | None = None, style_id: str | None = None,
|
||||
) -> etree._Element:
|
||||
"""Build a whole tracked-inserted paragraph.
|
||||
|
||||
@@ -286,7 +353,7 @@ def _make_tracked_paragraph_insert(
|
||||
"""
|
||||
if mark_id is None:
|
||||
mark_id = ins_id
|
||||
p = _build_paragraph(text, style=style)
|
||||
p = _build_paragraph(text, style=style, style_id=style_id)
|
||||
pPr = p.find(_w("pPr"))
|
||||
assert pPr is not None
|
||||
rPr = pPr.find(_w("rPr"))
|
||||
@@ -339,6 +406,7 @@ def _apply_insert(
|
||||
ins_id: int,
|
||||
author: str,
|
||||
date_iso: str,
|
||||
style_ids: dict[str, str] | None = None,
|
||||
) -> RevisionResult:
|
||||
"""Apply insert_after / insert_before relative to a bookmark."""
|
||||
start, end = _find_bookmark(document_tree, revision.anchor_bookmark)
|
||||
@@ -362,6 +430,7 @@ def _apply_insert(
|
||||
revision.content, style=revision.style,
|
||||
ins_id=ins_id, mark_id=ins_id + 1,
|
||||
author=author, date_iso=date_iso,
|
||||
style_id=(style_ids or {}).get(revision.style),
|
||||
)
|
||||
|
||||
parent = enclosing_p.getparent()
|
||||
@@ -407,6 +476,7 @@ def _apply_replace(
|
||||
del_id: int,
|
||||
author: str,
|
||||
date_iso: str,
|
||||
style_ids: dict[str, str] | None = None,
|
||||
) -> RevisionResult:
|
||||
"""Replace = delete the existing paragraph + insert new one after it."""
|
||||
start, end = _find_bookmark(document_tree, revision.anchor_bookmark)
|
||||
@@ -428,6 +498,7 @@ def _apply_replace(
|
||||
revision.content, style=revision.style,
|
||||
ins_id=ins_id, mark_id=ins_id + 1,
|
||||
author=author, date_iso=date_iso,
|
||||
style_id=(style_ids or {}).get(revision.style),
|
||||
)
|
||||
idx = list(parent).index(enclosing_p)
|
||||
parent.insert(idx + 1, new_p)
|
||||
@@ -473,6 +544,10 @@ def apply_tracked_revisions(
|
||||
members, doc_tree, settings_tree = _load_docx_xml(source_path)
|
||||
_ensure_track_revisions(settings_tree)
|
||||
|
||||
# Resolve template style ids once (INV-EX4) — inserted paragraphs inherit
|
||||
# font/size/indent from these named styles instead of hand-set rFonts/sz.
|
||||
style_ids = _resolve_style_ids(members)
|
||||
|
||||
next_id = _next_revision_id(doc_tree)
|
||||
|
||||
batch = RevisionBatchResult()
|
||||
@@ -480,7 +555,8 @@ def apply_tracked_revisions(
|
||||
try:
|
||||
if rev.type in ("insert_after", "insert_before"):
|
||||
result = _apply_insert(doc_tree, rev, ins_id=next_id,
|
||||
author=author, date_iso=date_iso)
|
||||
author=author, date_iso=date_iso,
|
||||
style_ids=style_ids)
|
||||
# insert consumes 2 IDs: run-wrapper + paragraph-mark
|
||||
next_id += 2
|
||||
elif rev.type == "delete":
|
||||
@@ -490,7 +566,8 @@ def apply_tracked_revisions(
|
||||
elif rev.type == "replace":
|
||||
result = _apply_replace(doc_tree, rev,
|
||||
ins_id=next_id, del_id=next_id + 2,
|
||||
author=author, date_iso=date_iso)
|
||||
author=author, date_iso=date_iso,
|
||||
style_ids=style_ids)
|
||||
# replace consumes 3 IDs: ins-run, ins-mark, del
|
||||
next_id += 3
|
||||
else:
|
||||
|
||||
@@ -1,23 +1,33 @@
|
||||
"""Text extraction from PDF, DOCX, DOC, and RTF files.
|
||||
|
||||
Primary PDF extraction: PyMuPDF direct text (for born-digital PDFs).
|
||||
Fallback: Google Cloud Vision OCR (for scanned documents).
|
||||
Fallback: Mistral OCR (for scanned documents or broken OCR layers).
|
||||
|
||||
Routing logic (document-level, not per-page):
|
||||
1. PyMuPDF extracts text from every page.
|
||||
2. Pages are quality-checked via _text_quality_ok().
|
||||
3. If ALL pages pass → use PyMuPDF output (free, ~50ms, no API call).
|
||||
4. If ANY page fails → call Mistral OCR once for the entire PDF.
|
||||
Mistral returns per-page Markdown; page_offsets are computed from it.
|
||||
|
||||
DOC files: converted to DOCX via LibreOffice before extraction.
|
||||
Post-processing: Hebrew abbreviation quote fixer.
|
||||
Post-processing: Hebrew abbreviation quote fixer (PyMuPDF path only;
|
||||
Mistral handles gershayim natively).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import base64
|
||||
import io
|
||||
import logging
|
||||
import re
|
||||
import subprocess
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import fitz # PyMuPDF
|
||||
import httpx
|
||||
from PIL import Image
|
||||
from docx import Document as DocxDocument
|
||||
from striprtf.striprtf import rtf_to_text
|
||||
@@ -25,36 +35,65 @@ from striprtf.striprtf import rtf_to_text
|
||||
from legal_mcp import config
|
||||
from legal_mcp.services import storage
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from google.cloud import vision
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# ── Google Cloud Vision client (imported lazily — saves ~550ms at MCP startup) ──
|
||||
# ── Mistral OCR ───────────────────────────────────────────────────
|
||||
|
||||
_vision_client: "vision.ImageAnnotatorClient | None" = None
|
||||
_MISTRAL_OCR_URL = "https://api.mistral.ai/v1/ocr"
|
||||
_MISTRAL_OCR_MODEL = "mistral-ocr-latest"
|
||||
|
||||
|
||||
def _get_vision_client() -> "vision.ImageAnnotatorClient":
|
||||
global _vision_client
|
||||
if _vision_client is None:
|
||||
from google.cloud import vision
|
||||
_vision_client = vision.ImageAnnotatorClient(
|
||||
client_options={"api_key": config.GOOGLE_CLOUD_VISION_API_KEY}
|
||||
async def _call_mistral_ocr(path: Path) -> list[str]:
|
||||
"""Call Mistral OCR API on a PDF. Returns per-page Markdown text list.
|
||||
|
||||
The Mistral response contains ``pages[i].markdown`` for each page.
|
||||
If the response has fewer pages than the PDF, trailing pages are
|
||||
padded with empty strings by the caller.
|
||||
"""
|
||||
if not config.MISTRAL_API_KEY:
|
||||
raise RuntimeError(
|
||||
"MISTRAL_API_KEY not configured — cannot OCR scanned PDF. "
|
||||
"Set the env var in Coolify."
|
||||
)
|
||||
return _vision_client
|
||||
|
||||
pdf_b64 = base64.b64encode(path.read_bytes()).decode()
|
||||
|
||||
async with httpx.AsyncClient(timeout=300.0) as client:
|
||||
resp = await client.post(
|
||||
_MISTRAL_OCR_URL,
|
||||
headers={
|
||||
"Authorization": f"Bearer {config.MISTRAL_API_KEY}",
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
json={
|
||||
"model": _MISTRAL_OCR_MODEL,
|
||||
"document": {
|
||||
"type": "document_url",
|
||||
"document_url": f"data:application/pdf;base64,{pdf_b64}",
|
||||
},
|
||||
"include_image_base64": False,
|
||||
},
|
||||
)
|
||||
|
||||
if resp.status_code != 200:
|
||||
raise RuntimeError(
|
||||
f"Mistral OCR returned {resp.status_code}: {resp.text[:400]}"
|
||||
)
|
||||
|
||||
pages = resp.json().get("pages", [])
|
||||
return [p.get("markdown", "") for p in pages]
|
||||
|
||||
|
||||
# ── Hebrew text quality detection ────────────────────────────────
|
||||
|
||||
_HEBREW_RE = re.compile(r'[\u0590-\u05FF]')
|
||||
_HEBREW_RE = re.compile(r'[-]')
|
||||
_WORD_RE = re.compile(r'\S+')
|
||||
|
||||
|
||||
def _text_quality_ok(text: str) -> bool:
|
||||
"""Check if extracted text is real content vs broken OCR layer.
|
||||
"""Check if PyMuPDF-extracted text is genuine Hebrew legal content.
|
||||
|
||||
Returns True if text appears to be genuine Hebrew legal content.
|
||||
Returns True if text appears to be real content.
|
||||
Broken OCR layers from scanned PDFs often have:
|
||||
- Very short words / single-character fragments
|
||||
- Each word on its own line (high words-per-line ratio)
|
||||
@@ -64,26 +103,19 @@ def _text_quality_ok(text: str) -> bool:
|
||||
if len(words) < 10:
|
||||
return False
|
||||
|
||||
# Average word length — real Hebrew words avg 4-6 chars.
|
||||
avg_len = sum(len(w) for w in words) / len(words)
|
||||
if avg_len < 2.5:
|
||||
return False
|
||||
|
||||
# Percentage of single-character "words"
|
||||
single_char_pct = sum(1 for w in words if len(w) == 1) / len(words)
|
||||
if single_char_pct > 0.4:
|
||||
return False
|
||||
|
||||
# Words per line — broken OCR puts each word on its own line.
|
||||
# Real text has 5-15 words per line; broken OCR has ~1-2.
|
||||
lines = [l for l in text.split("\n") if l.strip()]
|
||||
if lines:
|
||||
words_per_line = len(words) / len(lines)
|
||||
if words_per_line < 3.0:
|
||||
if lines and len(words) / len(lines) < 3.0:
|
||||
return False
|
||||
|
||||
# Hebrew character ratio among letter characters
|
||||
letters = re.findall(r'[a-zA-Z\u0590-\u05FF]', text)
|
||||
letters = re.findall(r'[a-zA-Z-]', text)
|
||||
if letters:
|
||||
hebrew_pct = sum(1 for c in letters if _HEBREW_RE.match(c)) / len(letters)
|
||||
if hebrew_pct < 0.5:
|
||||
@@ -92,7 +124,7 @@ def _text_quality_ok(text: str) -> bool:
|
||||
return True
|
||||
|
||||
|
||||
# ── Hebrew abbreviation quote fixer ──────────────────────────────
|
||||
# ── Hebrew abbreviation quote fixer (PyMuPDF path only) ──────────
|
||||
|
||||
_HEBREW_ABBREV_FIXES: dict[str, str] = {
|
||||
'עוהייד': 'עוה"ד',
|
||||
@@ -111,50 +143,133 @@ _HEBREW_ABBREV_FIXES: dict[str, str] = {
|
||||
'יחייד': 'יח"ד',
|
||||
'בייכ': 'ב"כ',
|
||||
# Patterns where double-yod (יי) substitutes for gershayim (״) in born-digital PDFs
|
||||
'בליימ': 'בל"מ', # בקשה להארכת מועד — appears in RTL legal docs
|
||||
'תמייא': 'תמ"א', # תכנית מתאר ארצית
|
||||
'בליימ': 'בל"מ',
|
||||
'תמייא': 'תמ"א',
|
||||
}
|
||||
|
||||
_ABBREV_PATTERN = re.compile(
|
||||
'|'.join(re.escape(k) for k in sorted(_HEBREW_ABBREV_FIXES, key=len, reverse=True))
|
||||
)
|
||||
|
||||
# Matches Hebrew law year abbreviations where gershayim was encoded as double-yod.
|
||||
# e.g. תשכייה → תשכ"ה, תשנייב → תשנ"ב
|
||||
_HEBREW_YEAR_RE = re.compile(r'(תש[א-ת]+)יי([א-ת])')
|
||||
|
||||
|
||||
def _fix_hebrew_quotes(text: str) -> str:
|
||||
"""Fix known Hebrew abbreviation quote replacements.
|
||||
|
||||
Applied to both Google Vision OCR output and direct PyMuPDF extraction —
|
||||
some born-digital PDFs encode gershayim (״) as double-yod (יי), producing
|
||||
the same corruption patterns as OCR.
|
||||
"""
|
||||
"""Fix gershayim encoded as double-yod in born-digital PDFs."""
|
||||
text = _ABBREV_PATTERN.sub(lambda m: _HEBREW_ABBREV_FIXES[m.group()], text)
|
||||
text = _HEBREW_YEAR_RE.sub(r'\1"\2', text)
|
||||
return text
|
||||
|
||||
|
||||
# ── Extraction ───────────────────────────────────────────────────
|
||||
|
||||
# ── Page joining ──────────────────────────────────────────────────
|
||||
|
||||
# Separator used when joining per-page text. Constant so chunker /
|
||||
# retrofit can reproduce the join when computing page offsets.
|
||||
PAGE_SEPARATOR = "\n\n"
|
||||
|
||||
|
||||
def _join_pages(pages_text: list[str]) -> tuple[str, list[int]]:
|
||||
"""Join per-page text with PAGE_SEPARATOR while recording start offsets."""
|
||||
offsets: list[int] = []
|
||||
parts: list[str] = []
|
||||
cursor = 0
|
||||
for i, pg in enumerate(pages_text):
|
||||
offsets.append(cursor)
|
||||
parts.append(pg)
|
||||
cursor += len(pg)
|
||||
if i < len(pages_text) - 1:
|
||||
parts.append(PAGE_SEPARATOR)
|
||||
cursor += len(PAGE_SEPARATOR)
|
||||
return "".join(parts), offsets
|
||||
|
||||
|
||||
# ── PDF extraction ────────────────────────────────────────────────
|
||||
|
||||
|
||||
async def _extract_pdf(path: Path) -> tuple[str, int, list[int]]:
|
||||
"""Extract text from PDF using document-level routing.
|
||||
|
||||
Stage 1 — PyMuPDF pre-screen (free, ~50ms, no API call):
|
||||
Run on every page. Collect per-page text; flag pages where
|
||||
PyMuPDF returns < 50 chars or _text_quality_ok() fails
|
||||
(scanned, blank, or broken embedded OCR layer).
|
||||
|
||||
Stage 2 — Mistral OCR (triggered when any page fails Stage 1):
|
||||
Send the entire PDF to Mistral once. Use its per-page Markdown
|
||||
for ALL pages — consistent source, no mixed plain/Markdown formats.
|
||||
Mistral handles gershayim natively; no quote-fix applied.
|
||||
|
||||
Page offsets are always computed so the chunker can attribute each
|
||||
chunk to its source page number (multimodal hybrid retrieval).
|
||||
"""
|
||||
doc = fitz.open(str(path))
|
||||
page_count = len(doc)
|
||||
|
||||
# Stage 1: PyMuPDF pre-screen
|
||||
pymupdf_pages: list[str] = []
|
||||
failed: list[int] = []
|
||||
|
||||
for i in range(page_count):
|
||||
text = doc[i].get_text().strip()
|
||||
if len(text) > 50 and _text_quality_ok(text):
|
||||
pymupdf_pages.append(_fix_hebrew_quotes(text))
|
||||
else:
|
||||
pymupdf_pages.append("")
|
||||
failed.append(i)
|
||||
|
||||
doc.close()
|
||||
|
||||
if not failed:
|
||||
logger.debug(
|
||||
"PDF %s: all %d pages digital — PyMuPDF only", path.name, page_count
|
||||
)
|
||||
joined, offsets = _join_pages(pymupdf_pages)
|
||||
return joined, page_count, offsets
|
||||
|
||||
# Stage 2: Mistral OCR for entire document
|
||||
logger.info(
|
||||
"PDF %s: %d/%d pages failed quality check → Mistral OCR",
|
||||
path.name, len(failed), page_count,
|
||||
)
|
||||
mistral_pages = await _call_mistral_ocr(path)
|
||||
|
||||
# Pad if Mistral returns fewer pages than PyMuPDF counted
|
||||
while len(mistral_pages) < page_count:
|
||||
mistral_pages.append("")
|
||||
|
||||
joined, offsets = _join_pages(mistral_pages[:page_count])
|
||||
return joined, page_count, offsets
|
||||
|
||||
|
||||
def page_at_offset(offset: int, page_offsets: list[int]) -> int:
|
||||
"""Return the 1-based page number containing a given char offset.
|
||||
|
||||
page_offsets[i] is the start of page (i+1) in the joined text.
|
||||
"""
|
||||
if not page_offsets:
|
||||
return 1
|
||||
page = 1
|
||||
for i, start in enumerate(page_offsets):
|
||||
if start <= offset:
|
||||
page = i + 1
|
||||
else:
|
||||
break
|
||||
return page
|
||||
|
||||
|
||||
# ── Public entry point ────────────────────────────────────────────
|
||||
|
||||
|
||||
async def extract_text(file_path: str) -> tuple[str, int, list[int] | None]:
|
||||
"""Extract text from a document file.
|
||||
|
||||
Returns:
|
||||
``(text, page_count, page_offsets)`` where:
|
||||
- ``text``: concatenated extracted text
|
||||
- ``text``: extracted text. Plain text for PyMuPDF path;
|
||||
Markdown for Mistral path (tables, ``##`` headers preserved).
|
||||
- ``page_count``: number of pages (0 for non-PDF)
|
||||
- ``page_offsets``: ``page_offsets[i]`` = char start offset of
|
||||
page (i+1) inside ``text``. ``None`` for non-PDFs (where the
|
||||
notion of pages doesn't apply). Used by the chunker to assign
|
||||
a ``page_number`` to each chunk.
|
||||
- ``page_offsets``: char start of each page inside ``text``,
|
||||
or ``None`` for non-PDF formats
|
||||
"""
|
||||
path = Path(file_path)
|
||||
suffix = path.suffix.lower()
|
||||
@@ -173,95 +288,11 @@ async def extract_text(file_path: str) -> tuple[str, int, list[int] | None]:
|
||||
raise ValueError(f"Unsupported file type: {suffix}")
|
||||
|
||||
|
||||
def _join_pages(pages_text: list[str]) -> tuple[str, list[int]]:
|
||||
"""Join per-page text with PAGE_SEPARATOR while recording the start
|
||||
offset of each page in the joined output."""
|
||||
offsets: list[int] = []
|
||||
parts: list[str] = []
|
||||
cursor = 0
|
||||
for i, pg in enumerate(pages_text):
|
||||
offsets.append(cursor)
|
||||
parts.append(pg)
|
||||
cursor += len(pg)
|
||||
if i < len(pages_text) - 1:
|
||||
parts.append(PAGE_SEPARATOR)
|
||||
cursor += len(PAGE_SEPARATOR)
|
||||
return "".join(parts), offsets
|
||||
|
||||
|
||||
async def _extract_pdf(path: Path) -> tuple[str, int, list[int]]:
|
||||
"""Extract text from PDF.
|
||||
|
||||
Try direct text first, fall back to Google Cloud Vision for scanned
|
||||
or broken-OCR pages.
|
||||
"""
|
||||
doc = fitz.open(str(path))
|
||||
page_count = len(doc)
|
||||
pages_text: list[str] = []
|
||||
|
||||
for page_num in range(page_count):
|
||||
page = doc[page_num]
|
||||
text = page.get_text().strip()
|
||||
|
||||
if len(text) > 50 and _text_quality_ok(text):
|
||||
pages_text.append(_fix_hebrew_quotes(text))
|
||||
logger.debug("Page %d: direct extraction (%d chars, quality OK)", page_num + 1, len(text))
|
||||
else:
|
||||
reason = "insufficient text" if len(text) <= 50 else "low quality OCR layer"
|
||||
logger.info("Page %d: Google Vision OCR (%s)", page_num + 1, reason)
|
||||
pix = page.get_pixmap(dpi=300)
|
||||
img_bytes = pix.tobytes("png")
|
||||
ocr_text = await asyncio.to_thread(
|
||||
_ocr_with_google_vision, img_bytes, page_num + 1
|
||||
)
|
||||
pages_text.append(ocr_text)
|
||||
|
||||
doc.close()
|
||||
joined, offsets = _join_pages(pages_text)
|
||||
return joined, page_count, offsets
|
||||
|
||||
|
||||
def page_at_offset(offset: int, page_offsets: list[int]) -> int:
|
||||
"""Look up the page number containing a given char offset.
|
||||
|
||||
page_offsets[i] is the start of page (i+1) in the joined text;
|
||||
a chunk starting at ``offset`` belongs to the highest-indexed page
|
||||
whose start is ``<= offset``. Returns 1-based page number.
|
||||
"""
|
||||
if not page_offsets:
|
||||
return 1
|
||||
# Linear scan is fine — page_offsets is short (≤ ~200 for our PDFs).
|
||||
page = 1
|
||||
for i, start in enumerate(page_offsets):
|
||||
if start <= offset:
|
||||
page = i + 1
|
||||
else:
|
||||
break
|
||||
return page
|
||||
|
||||
|
||||
def _ocr_with_google_vision(image_bytes: bytes, page_num: int) -> str:
|
||||
"""OCR a single page image using Google Cloud Vision API."""
|
||||
from google.cloud import vision # lazy: keeps MCP startup fast
|
||||
client = _get_vision_client()
|
||||
image = vision.Image(content=image_bytes)
|
||||
|
||||
response = client.document_text_detection(
|
||||
image=image,
|
||||
image_context=vision.ImageContext(language_hints=["he"]),
|
||||
)
|
||||
|
||||
if response.error.message:
|
||||
raise RuntimeError(
|
||||
f"Google Vision error on page {page_num}: {response.error.message}"
|
||||
)
|
||||
|
||||
text = response.full_text_annotation.text if response.full_text_annotation else ""
|
||||
return _fix_hebrew_quotes(text)
|
||||
# ── Non-PDF formats ───────────────────────────────────────────────
|
||||
|
||||
|
||||
def _extract_doc(path: Path) -> str:
|
||||
"""Extract text from legacy .doc file by converting to .docx via LibreOffice."""
|
||||
"""Extract text from legacy .doc via LibreOffice → DOCX conversion."""
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
# Isolate the LibreOffice user profile per call: headless soffice
|
||||
# locks a single shared profile, so concurrent .doc conversions would
|
||||
@@ -296,13 +327,13 @@ def _extract_rtf(path: Path) -> str:
|
||||
|
||||
|
||||
# ── Multimodal page rendering (V9) ───────────────────────────────
|
||||
# Unchanged — multimodal embedding always uses PyMuPDF-rendered images
|
||||
# regardless of whether text extraction used PyMuPDF or Mistral.
|
||||
|
||||
|
||||
def _pixmap_to_pil(pix: fitz.Pixmap) -> Image.Image:
|
||||
"""Convert a PyMuPDF pixmap to PIL.Image (RGB) without going through
|
||||
PNG bytes. Faster than tobytes('png') → Image.open()."""
|
||||
"""Convert a PyMuPDF pixmap to PIL.Image (RGB)."""
|
||||
if pix.alpha:
|
||||
# Drop alpha channel — voyage multimodal expects RGB.
|
||||
pix = fitz.Pixmap(pix, 0)
|
||||
return Image.frombytes("RGB", (pix.width, pix.height), pix.samples)
|
||||
|
||||
@@ -314,12 +345,9 @@ def render_pages_for_multimodal(
|
||||
thumbnail_dir: Path | None = None,
|
||||
) -> list[tuple[Image.Image, Path | None]]:
|
||||
"""Render each PDF page as PIL.Image at ``embed_dpi`` for the
|
||||
multimodal embedder, and optionally save a smaller JPEG thumbnail
|
||||
at ``thumb_dpi`` to ``thumbnail_dir`` for UI preview.
|
||||
multimodal embedder, and optionally save JPEG thumbnails.
|
||||
|
||||
Returns ``[(pil_image, thumb_path_or_None), ...]`` in page order.
|
||||
The full-DPI image stays in memory only — only the thumbnail is
|
||||
persisted to disk.
|
||||
"""
|
||||
src = Path(pdf_path)
|
||||
if not src.is_file():
|
||||
@@ -338,17 +366,12 @@ def render_pages_for_multimodal(
|
||||
thumb_path: Path | None = None
|
||||
if thumbnail_dir is not None and thumb_dpi:
|
||||
thumb_path = thumbnail_dir / f"p{page_num:03d}.jpg"
|
||||
# Downsample the same render rather than re-rendering
|
||||
# with PyMuPDF — far faster.
|
||||
ratio = thumb_dpi / embed_dpi
|
||||
thumb_size = (
|
||||
max(1, int(img.width * ratio)),
|
||||
max(1, int(img.height * ratio)),
|
||||
)
|
||||
thumb = img.resize(thumb_size, Image.Resampling.LANCZOS)
|
||||
# Persist the thumbnail (a DERIVED, regenerable artifact)
|
||||
# through the storage layer (INV-STG1). Under the filesystem
|
||||
# backend it lands at thumb_path exactly as before.
|
||||
_tbuf = io.BytesIO()
|
||||
thumb.save(_tbuf, "JPEG", quality=75, optimize=True)
|
||||
try:
|
||||
@@ -366,44 +389,28 @@ def render_pages_for_multimodal(
|
||||
return out
|
||||
|
||||
|
||||
# ── Nevo preamble stripping ──────────────────────────────────────
|
||||
# ── Nevo preamble stripping ───────────────────────────────────────
|
||||
|
||||
_NEVO_MARKERS = ("ספרות:", "חקיקה שאוזכרה:", "מיני-רציו:", "פסקי דין שאוזכרו:",
|
||||
"כתבי עת:", "הועתק מנבו")
|
||||
|
||||
# Markers for where the actual decision body begins (everything before is Nevo
|
||||
# preamble: bibliography + מיני-רציו). Two families:
|
||||
# - ועדת ערר / district openings (בפנינו / הערר שבנדון / ...)
|
||||
# - COURT-RULING openings (#86.1): a פסק-דין header or the authoring judge's
|
||||
# line. Without these, Nevo court judgments — exactly the ones carrying a
|
||||
# מיני-רציו — slipped through unstripped (e.g. בג"ץ 1764/05).
|
||||
#
|
||||
# #86.2 hardening — two over-strip bugs found while backfilling:
|
||||
# 1. ``פסק-דין`` headers are often markdown-wrapped (``**פסק דין**``); the old
|
||||
# ``^פסק[- ]דין`` required the keyword to be the very first char of the line
|
||||
# and allowed only one separator, so it missed the header and fell through
|
||||
# to a citation 32K deep (עמ"נ 50567-07-21). We now tolerate leading
|
||||
# markdown/whitespace and 0-3 separators.
|
||||
# 2. Bare ``השופט``/``הנשיא`` matched *citations* ("השופט מ' חשין, פסקה 23"),
|
||||
# stripping real decision body. The authoring-judge line ends with a COLON
|
||||
# ("השופט י' עמית:"); citations use a comma. We now require the colon.
|
||||
_DECISION_START = re.compile(
|
||||
r"^[ \t>*_#]{0,6}(?:"
|
||||
r"בפנינו|לפנינו|לפניי|הערר שבנדון|ועדת הערר לתכנון|רקע עובדתי|עסקינן|"
|
||||
r"פסק[ \t\-]{0,3}די(?:ן|נו)|" # פסק-דין / פסק דין / **פסק דין** header (final-nun ן vs דינו)
|
||||
r"(?:כב(?:וד)?['׳\"]?\s*)?(?:ה?שופט[ת]?|ה?נשיא[ה]?|המשנה לנשיא)\s+[^\n,]{1,40}:" # author line → colon
|
||||
r"פסק[ \t\-]{0,3}די(?:ן|נו)|"
|
||||
r"(?:כב(?:וד)?['׳\"]?\s*)?(?:ה?שופט[ת]?|ה?נשיא[ה]?|המשנה לנשיא)\s+[^\n,]{1,40}:"
|
||||
r")",
|
||||
re.MULTILINE,
|
||||
)
|
||||
|
||||
|
||||
def strip_nevo_preamble(text: str) -> str:
|
||||
"""Remove Nevo database preamble (bibliography, legislation, mini-ratio) from decision text.
|
||||
"""Remove Nevo database preamble (bibliography, legislation, mini-ratio).
|
||||
|
||||
Returns the original text unchanged if no preamble is detected.
|
||||
Works on both plain text (PyMuPDF) and Markdown (Mistral) since
|
||||
_DECISION_START already tolerates leading ``[ \t>*_#]{0,6}``.
|
||||
"""
|
||||
# Window wide enough to catch the Nevo markers even when a long court/parties
|
||||
# header precedes them (court rulings push חקיקה שאוזכרה:/מיני-רציו: down).
|
||||
head = text[:1500]
|
||||
if not any(marker in head for marker in _NEVO_MARKERS):
|
||||
return text
|
||||
@@ -419,17 +426,7 @@ _RATIO_MARKER = "מיני-רציו:"
|
||||
|
||||
|
||||
def extract_nevo_ratio(text: str) -> str:
|
||||
"""Return the Nevo מיני-רציו block (editorial holdings summary), or ''.
|
||||
|
||||
The mini-ratio is Nevo's own headnote — a concise, professionally-written
|
||||
list of the holdings. We capture it *before* :func:`strip_nevo_preamble`
|
||||
discards it, to serve as a free gold-set for benchmarking how well our
|
||||
halacha extractor covers the real holdings (#86.3).
|
||||
|
||||
The block runs from the ``מיני-רציו:`` marker to whichever comes first:
|
||||
the decision body (``_DECISION_START``) or the next preamble marker
|
||||
(bibliography / legislation). Returns '' when there is no mini-ratio.
|
||||
"""
|
||||
"""Return the Nevo מיני-רציו block (editorial holdings summary), or ''."""
|
||||
if not text:
|
||||
return ""
|
||||
start = text.find(_RATIO_MARKER)
|
||||
@@ -437,9 +434,6 @@ def extract_nevo_ratio(text: str) -> str:
|
||||
return ""
|
||||
body = text[start + len(_RATIO_MARKER):]
|
||||
|
||||
# End at the earliest of: decision body start, or a following preamble
|
||||
# marker (ספרות: / חקיקה שאוזכרה: / ...). Both are measured relative to
|
||||
# the ratio body so we never run past it into the judgment itself.
|
||||
end = len(body)
|
||||
dm = _DECISION_START.search(body)
|
||||
if dm:
|
||||
|
||||
256
mcp-server/src/legal_mcp/services/lesson_synthesis.py
Normal file
256
mcp-server/src/legal_mcp/services/lesson_synthesis.py
Normal file
@@ -0,0 +1,256 @@
|
||||
"""Decision-lesson synthesis (#158 / INV-LRN8).
|
||||
|
||||
The learning channels (panel, curator, chair) accumulate overlapping ``decision_lessons``
|
||||
on the same style dimension. The writer only consumes the 15 most-recent APPROVED ones
|
||||
per practice_area (a silent cap, #157), so beyond that lessons pile up unused. This pass
|
||||
**clusters** near-duplicate lessons within a (practice_area, category) shard and **merges**
|
||||
each cluster into ONE richer, generalised "super-lesson" — so the writer-fed set shrinks
|
||||
to a small, high-quality profile (Authorial Style Profiling, ספ §0.1) and the cap stops
|
||||
biting.
|
||||
|
||||
Mirrors the canonical-halacha synthesis (V41 / INV-LRN6) on the SAME table (no parallel
|
||||
store, G2). Invariants:
|
||||
• INV-AH — the super-lesson is GROUNDED in the source lessons only; the model abstains
|
||||
rather than invent, and a re-embedding DRIFT guard rejects a rewrite that
|
||||
drifts from the cluster centroid.
|
||||
• INV-LRN1/G10 — graduated gate (chair decision 2026-06-28): since every source is
|
||||
already ``approved``, the super-lesson flows as ``approved`` (reversible —
|
||||
chair veto in /training restores the sources). A non-approved source ⇒ proposed.
|
||||
• G2 — single synthesis path; the MCP tool and the backfill script both call
|
||||
:func:`run_shard` / :func:`synthesize_cluster` here.
|
||||
• G9 — every outcome (accepted / abstained / drift_rejected / merged-duplicate) returned.
|
||||
|
||||
LLM calls go through ``claude_session`` (local ``claude -p`` CLI) only — never from the
|
||||
FastAPI container (see claude_session docstring).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import math
|
||||
from uuid import UUID
|
||||
|
||||
from legal_mcp import config
|
||||
from legal_mcp.services import claude_session, db, embeddings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
_SYSTEM = (
|
||||
"אתה עורך-דין בכיר המזקק כללי-סגנון-וכתיבה לבסיס-ידע של ועדת ערר לתכנון ובנייה. "
|
||||
"תפקידך למזג כמה לקחי-סגנון חופפים לכלל אחד, כללי ומדויק, על *איך* כותבים — לא להמציא "
|
||||
"כלל חדש ולא להוסיף מהות משפטית."
|
||||
)
|
||||
|
||||
|
||||
def _cosine(a, b) -> float:
|
||||
dot = sum(x * y for x, y in zip(a, b))
|
||||
na = math.sqrt(sum(x * x for x in a))
|
||||
nb = math.sqrt(sum(y * y for y in b))
|
||||
if na == 0 or nb == 0:
|
||||
return 0.0
|
||||
return dot / (na * nb)
|
||||
|
||||
|
||||
def _centroid(vecs: list[list[float]]) -> list[float]:
|
||||
n = len(vecs)
|
||||
dim = len(vecs[0])
|
||||
return [sum(v[i] for v in vecs) / n for i in range(dim)]
|
||||
|
||||
|
||||
def _build_prompt(members: list[dict]) -> str:
|
||||
blocks = []
|
||||
for i, m in enumerate(members, 1):
|
||||
blocks.append(f"### לקח {i}\n{m['lesson_text']}")
|
||||
evidence = "\n\n".join(blocks)
|
||||
return f"""{_SYSTEM}
|
||||
|
||||
לקחי-המקור (כולם מאותו תחום וקטגוריה, חופפים בנושא):
|
||||
{evidence}
|
||||
|
||||
## המשימה
|
||||
מזג את לקחי-המקור לכלל-סגנון **אחד** עשיר ומוכלל המשותף לכולם. שמר כל ניואנס מובחן שמופיע
|
||||
באחד הלקחים, אך נסח אותו פעם אחת, נקי וכללי.
|
||||
|
||||
## כללים מחייבים (INV-AH — עיגון, ללא הזיה)
|
||||
1. **עיגון-מקור בלבד.** הכלל חייב לנבוע מלקחי-המקור שלמעלה. אסור להוסיף כלל, חריג או דוגמה שאינם עולים מהם.
|
||||
2. **סגנון/שיטה בלבד, לא מהות.** אל תכניס הלכה, עובדה, מספר-תיק או תקדים ספציפי — רק *איך* דפנה כותבת.
|
||||
3. **כללי ובלתי-תלוי-תיק.** הסר פרטים קונקרטיים; נסח כלל רב-תחולה.
|
||||
4. **רגיסטר נקי** בעברית, משפט אחד עד שלושה, בלי מילות-מסגרת ("יש לזכור ש...") — רק הכלל עצמו.
|
||||
5. **הימנעות עדיפה על המצאה.** אם הלקחים אינם באמת מתמזגים לכלל אחד מעוגן — החזר grounded=false.
|
||||
|
||||
## פלט — JSON בלבד, ללא markdown וללא הסבר:
|
||||
{{
|
||||
"lesson_text": "<כלל-הסגנון הממוזג>",
|
||||
"grounded": true,
|
||||
"reason": "<משפט קצר: מה אוחד>"
|
||||
}}"""
|
||||
|
||||
|
||||
def _greedy_clusters(candidates: list[dict], threshold: float) -> list[list[dict]]:
|
||||
"""Greedy single-link clustering by cosine over candidate embeddings. Each candidate
|
||||
has an 'embedding' (python list). Returns clusters of size ≥2 only (singletons are
|
||||
nothing to merge)."""
|
||||
remaining = [c for c in candidates if c.get("embedding") is not None]
|
||||
clusters: list[list[dict]] = []
|
||||
used: set = set()
|
||||
for i, seed in enumerate(remaining):
|
||||
if seed["id"] in used:
|
||||
continue
|
||||
cluster = [seed]
|
||||
used.add(seed["id"])
|
||||
for other in remaining[i + 1:]:
|
||||
if other["id"] in used:
|
||||
continue
|
||||
if _cosine(seed["embedding"], other["embedding"]) >= threshold:
|
||||
cluster.append(other)
|
||||
used.add(other["id"])
|
||||
if len(cluster) >= 2:
|
||||
clusters.append(cluster)
|
||||
return clusters
|
||||
|
||||
|
||||
async def _ensure_embeddings(candidates: list[dict]) -> list[dict]:
|
||||
"""Lazy-backfill: embed any candidate whose stored embedding is NULL, persist it,
|
||||
and return the candidates with embeddings populated (skips ones that still fail)."""
|
||||
missing = [c for c in candidates if c.get("embedding") is None]
|
||||
if missing:
|
||||
vecs = await embeddings.embed_texts([c["lesson_text"] for c in missing])
|
||||
for c, v in zip(missing, vecs):
|
||||
c["embedding"] = list(v)
|
||||
await db.set_lesson_embedding(c["id"], c["embedding"])
|
||||
return [c for c in candidates if c.get("embedding") is not None]
|
||||
|
||||
|
||||
async def synthesize_cluster(
|
||||
members: list[dict],
|
||||
*,
|
||||
model: str | None = None,
|
||||
effort: str | None = None,
|
||||
drift_floor: float | None = None,
|
||||
) -> dict:
|
||||
"""Merge one cluster of lessons. PURE — no DB writes. Returns:
|
||||
{status, proposed, embedding, members:[ids], drift_cosine, reason}
|
||||
status ∈ {accepted, abstained, drift_rejected, llm_error, too_small}.
|
||||
"""
|
||||
model = model or config.LESSON_SYNTH_MODEL
|
||||
effort = effort or config.LESSON_SYNTH_EFFORT
|
||||
drift_floor = config.LESSON_SYNTH_DRIFT_FLOOR if drift_floor is None else drift_floor
|
||||
ids = [str(m["id"]) for m in members]
|
||||
base = {"members": ids, "proposed": "", "embedding": None,
|
||||
"drift_cosine": None, "reason": ""}
|
||||
if len(members) < 2:
|
||||
return {**base, "status": "too_small", "reason": "cluster < 2"}
|
||||
|
||||
try:
|
||||
result = await claude_session.query_json(
|
||||
_build_prompt(members), model=model, effort=effort, tools="",
|
||||
)
|
||||
except Exception as e:
|
||||
logger.warning("synthesize_cluster %s: LLM error: %s", ids, e)
|
||||
return {**base, "status": "llm_error", "reason": str(e)}
|
||||
|
||||
if not isinstance(result, dict) or not result.get("lesson_text"):
|
||||
return {**base, "status": "llm_error", "reason": "malformed LLM output"}
|
||||
if not result.get("grounded", True):
|
||||
return {**base, "status": "abstained",
|
||||
"reason": result.get("reason") or "model abstained (not grounded)"}
|
||||
|
||||
proposed = str(result["lesson_text"]).strip()
|
||||
if not proposed:
|
||||
return {**base, "status": "abstained", "reason": "empty proposal"}
|
||||
|
||||
# Drift guard: the merged lesson must stay near the cluster centroid.
|
||||
new_emb = list((await embeddings.embed_texts([proposed]))[0])
|
||||
centroid = _centroid([m["embedding"] for m in members])
|
||||
drift = _cosine(new_emb, centroid)
|
||||
if drift < drift_floor:
|
||||
return {**base, "status": "drift_rejected", "proposed": proposed,
|
||||
"drift_cosine": round(drift, 4),
|
||||
"reason": f"drift {drift:.3f} < floor {drift_floor}"}
|
||||
|
||||
return {**base, "status": "accepted", "proposed": proposed, "embedding": new_emb,
|
||||
"drift_cosine": round(drift, 4), "reason": result.get("reason") or "merged"}
|
||||
|
||||
|
||||
async def run_shard(
|
||||
practice_area: str,
|
||||
category: str,
|
||||
*,
|
||||
apply: bool,
|
||||
model: str | None = None,
|
||||
effort: str | None = None,
|
||||
drift_floor: float | None = None,
|
||||
cluster_threshold: float | None = None,
|
||||
) -> dict:
|
||||
"""Synthesize all clusters in one (practice_area, category) shard.
|
||||
|
||||
Returns {practice_area, category, candidates, clusters:[result...]}. Each result is
|
||||
a synthesize_cluster outcome augmented with ``applied`` and (when applied) ``new_id``.
|
||||
With apply=False this is a pure dry-run (no writes beyond lazy embedding backfill).
|
||||
"""
|
||||
cluster_threshold = (config.LESSON_SYNTH_CLUSTER_THRESHOLD
|
||||
if cluster_threshold is None else cluster_threshold)
|
||||
candidates = await db.fetch_synthesis_candidates(practice_area, category)
|
||||
candidates = await _ensure_embeddings(candidates)
|
||||
clusters = _greedy_clusters(candidates, cluster_threshold)
|
||||
|
||||
results = []
|
||||
for members in clusters:
|
||||
res = await synthesize_cluster(
|
||||
members, model=model, effort=effort, drift_floor=drift_floor,
|
||||
)
|
||||
res["applied"] = False
|
||||
if apply and res["status"] == "accepted":
|
||||
# Idempotency: skip if a near-identical synthesis already exists (re-run safe).
|
||||
dup = await db.nearest_synthesis_lesson(
|
||||
res["embedding"], category, config.HALACHA_CANONICAL_THRESHOLD,
|
||||
)
|
||||
if dup:
|
||||
res["status"] = "duplicate_skipped"
|
||||
res["reason"] = f"near existing synthesis {dup[0]} (sim {dup[1]:.3f})"
|
||||
else:
|
||||
# graduated gate: all sources are approved (fetch filter) → approved.
|
||||
row = await db.apply_lesson_synthesis(
|
||||
corpus_id=members[0]["style_corpus_id"],
|
||||
lesson_text=res["proposed"],
|
||||
category=category,
|
||||
embedding=res["embedding"],
|
||||
source_ids=[m["id"] for m in members],
|
||||
review_status="approved",
|
||||
)
|
||||
res["applied"] = True
|
||||
res["new_id"] = str(row.get("id", ""))
|
||||
results.append(res)
|
||||
|
||||
return {"practice_area": practice_area or "*", "category": category,
|
||||
"candidates": len(candidates), "clusters": results}
|
||||
|
||||
|
||||
async def run_pending(
|
||||
practice_area: str = "",
|
||||
category: str = "",
|
||||
*,
|
||||
apply: bool,
|
||||
model: str | None = None,
|
||||
effort: str | None = None,
|
||||
drift_floor: float | None = None,
|
||||
cluster_threshold: float | None = None,
|
||||
) -> list[dict]:
|
||||
"""Run synthesis across shards. If practice_area+category are given, one shard;
|
||||
otherwise iterate every shard with ≥2 live approved lessons. Single entry point (G2)."""
|
||||
if practice_area and category:
|
||||
shards = [{"practice_area": practice_area, "category": category}]
|
||||
else:
|
||||
shards = await db.synthesis_shards(min_size=2)
|
||||
if practice_area:
|
||||
shards = [s for s in shards if s["practice_area"] == practice_area]
|
||||
if category:
|
||||
shards = [s for s in shards if s["category"] == category]
|
||||
out = []
|
||||
for s in shards:
|
||||
out.append(await run_shard(
|
||||
s["practice_area"], s["category"], apply=apply,
|
||||
model=model, effort=effort, drift_floor=drift_floor,
|
||||
cluster_threshold=cluster_threshold,
|
||||
))
|
||||
return out
|
||||
208
mcp-server/src/legal_mcp/services/party_claims_summary.py
Normal file
208
mcp-server/src/legal_mcp/services/party_claims_summary.py
Normal file
@@ -0,0 +1,208 @@
|
||||
"""סיכום-מנהלים של טענות הצדדים — מסמך פרוזה מזוקק להכנת היו"ר לדיון (WS3, #202).
|
||||
|
||||
מסמך זה הוא **נפרד ומובחן מטיוטת-הביניים** (החלטת-יו"ר, תוכנית workflow-redesign §WS3) —
|
||||
תמצית מנהלים קצרה ומוקפדת של טענות הצדדים והתשובות זו-לזו, להכנה לדיון בעל-פה. אין הוא
|
||||
משכפל את כתבי-הטענות המלאים: הוא מזקק.
|
||||
|
||||
מקור-האמת היחיד (G2): הוא נגזר מ-``legal_arguments`` (טיעונים מאוגדים) ומ-``claims``
|
||||
הקיימים בתיק — לא מחלץ-מחדש ולא קורא לכתבי-הטענות הגולמיים. אם הטיעונים המאוגדים טרם
|
||||
חושבו, הוא נופל-חזרה ל-claims הגולמיים (אותו מקור).
|
||||
|
||||
הייצור עובר ``claude_session.query`` → ``claude -p`` (CLI, מנוי claude.ai, עלות-שולית-אפס),
|
||||
נעוץ ל-Opus 4.8 + effort=high — משימת זיקוק/סינתזה. **local-only**: לקונטיינר אין claude CLI;
|
||||
לכן הכלי רץ רק מ-MCP-server המקומי, וה-endpoint ב-app.py רק מגיש את הקובץ השמור (לא מייצר).
|
||||
|
||||
ההזהרה נגד-הזיה (INV-AH): המסמך מתוחם לחלוטין לטענות-התיק עצמן. אסור להמציא טענה, הלכה
|
||||
או עובדה שאינה מופיעה בקלט; טענה שאינה ברורה — מצוין במפורש, לא משלים.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from datetime import date
|
||||
from pathlib import Path
|
||||
from uuid import UUID
|
||||
|
||||
from legal_mcp import config
|
||||
from legal_mcp.services import (
|
||||
argument_aggregator,
|
||||
block_writer,
|
||||
claude_session,
|
||||
db,
|
||||
git_sync,
|
||||
storage,
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Saved alongside the legal analysis (same research folder, same git+S3 mirror path).
|
||||
_SUMMARY_FILENAME = "party-claims-summary.md"
|
||||
|
||||
_PARTY_HE = {
|
||||
"appellant": "העוררים",
|
||||
"respondent": "המשיבים",
|
||||
"committee": "הוועדה המקומית",
|
||||
"permit_applicant": "מבקשי ההיתר",
|
||||
"unknown": "צד לא מזוהה",
|
||||
}
|
||||
|
||||
|
||||
def summary_file_path(case_number: str) -> Path:
|
||||
"""Resolve the saved party-claims-summary.md path for a case."""
|
||||
return config.find_case_dir(case_number) / "documents" / "research" / _SUMMARY_FILENAME
|
||||
|
||||
|
||||
async def _build_arguments_context(case_id: UUID) -> tuple[str, int, str]:
|
||||
"""Build the grounded source block from the case's OWN claims/arguments.
|
||||
|
||||
Preference order (single source of truth, no re-extraction — G2):
|
||||
1. ``legal_arguments`` — the aggregated, de-duplicated arguments per party.
|
||||
2. fallback to raw ``claims`` when arguments were never aggregated.
|
||||
|
||||
Returns ``(context_text, item_count, source_kind)`` where ``source_kind`` is
|
||||
``"arguments"`` or ``"claims"`` (or ``"none"`` when neither exists).
|
||||
"""
|
||||
args = await argument_aggregator.get_legal_arguments(case_id)
|
||||
if args:
|
||||
by_party: dict[str, list[dict]] = {}
|
||||
for a in args:
|
||||
by_party.setdefault(a["party"], []).append(a)
|
||||
|
||||
lines: list[str] = []
|
||||
for party, items in by_party.items():
|
||||
lines.append(f"\n## {_PARTY_HE.get(party, party)}")
|
||||
for a in items:
|
||||
title = (a.get("argument_title") or "").strip()
|
||||
body = (a.get("argument_body") or "").strip()
|
||||
topic = (a.get("legal_topic") or "").strip()
|
||||
header = f"- **{title}**" if title else "-"
|
||||
if topic:
|
||||
header += f" [{topic}]"
|
||||
lines.append(header)
|
||||
if body:
|
||||
lines.append(f" {body}")
|
||||
return "\n".join(lines), len(args), "arguments"
|
||||
|
||||
# Fallback — raw claims, the same underlying source.
|
||||
claims = await db.get_claims(case_id)
|
||||
# Exclude block-zayin (decision-summary) claims — original pleadings only.
|
||||
source_claims = [c for c in claims if c.get("source_document", "") != "block-zayin"] or claims
|
||||
if not source_claims:
|
||||
return "", 0, "none"
|
||||
|
||||
lines = []
|
||||
current_role = ""
|
||||
role_he = {"appellant": "טענות העוררים", "respondent": "טענות המשיבים",
|
||||
"committee": "עמדת הוועדה המקומית", "permit_applicant": "עמדת מבקשי ההיתר"}
|
||||
n = 0
|
||||
for c in source_claims:
|
||||
if c["party_role"] != current_role:
|
||||
current_role = c["party_role"]
|
||||
lines.append(f"\n## {role_he.get(current_role, current_role)}")
|
||||
n += 1
|
||||
lines.append(f"- טענה #{n}: {c['claim_text']}")
|
||||
return "\n".join(lines), len(source_claims), "claims"
|
||||
|
||||
|
||||
_PROMPT_TEMPLATE = """אתה מכין עבור יו"ר ועדת הערר (עו"ד דפנה תמיר) **סיכום-מנהלים מזוקק של טענות הצדדים** — מסמך פרוזה קצר שמטרתו אחת: להכין את היו"ר לדיון בעל-פה. זהו מסמך **נפרד** מטיוטת-ההחלטה ואינו חלק ממנה.
|
||||
|
||||
## פרטי התיק:
|
||||
{case_context}
|
||||
|
||||
## הקלט — טענות/טיעוני הצדדים (מקור-האמת היחיד):
|
||||
{arguments_context}
|
||||
|
||||
## כללי-כתיבה מחייבים:
|
||||
- **זיקוק, לא שכפול.** אל תעתיק את כתבי-הטענות. תמצת כל צד ל-2–5 משפטי-מפתח. היעד: עמוד אחד עד שניים, לא יותר.
|
||||
- **מבוסס-קלט בלבד (חובה אנטי-הזיה).** הסתמך אך-ורק על הטענות שבקלט לעיל. אסור להמציא טענה, הלכה, פסק-דין, מספר או עובדה שאינם בקלט. טענה שאינה ברורה או חסרה — ציין זאת במפורש ("הטענה לא פורטה"), אל תשלים מדמיונך.
|
||||
- **ניטרלי.** הצג את עמדת כל צד בנאמנות, בלי להעריך, בלי להכריע ובלי לרמוז על תוצאה. אין זו החלטה — זו הכנה.
|
||||
- **מבנה קבוע:**
|
||||
1. פסקת-פתיחה קצרה (משפט–שניים): במה עוסק הערר ומיהם הצדדים.
|
||||
2. **טענות העוררים** — תמצית מזוקקת.
|
||||
3. **טענות המשיבים / הוועדה / מבקשי ההיתר** — תמצית מזוקקת (כל צד שקיים בקלט).
|
||||
4. **נקודות-המחלוקת המרכזיות** — 2–4 הסוגיות שעליהן ניצבת ההכרעה, כשאלות פתוחות (לא תשובות).
|
||||
- **סגנון:** עברית משפטית בהירה, גוף-שלישי לתיאור הצדדים. בלי כותרת "החלטה". בלי חתימות.
|
||||
|
||||
## מדריך-סגנון (לטון בלבד — אל תיישם מבנה-החלטה):
|
||||
{style_context}
|
||||
|
||||
החזר אך-ורק את גוף מסמך הסיכום (Markdown), בלי הקדמות ובלי הסברים על מה שעשית."""
|
||||
|
||||
|
||||
async def summarize_party_claims(case_id: UUID, case_number: str,
|
||||
instructions: str = "") -> dict:
|
||||
"""Generate the distilled executive summary of party claims and save it.
|
||||
|
||||
Grounded strictly in the case's own claims/legal_arguments (INV-AH).
|
||||
Generation is pinned to Opus 4.8 + effort=high (distillation/synthesis).
|
||||
"""
|
||||
case = await db.get_case(case_id)
|
||||
if not case:
|
||||
raise ValueError(f"Case {case_id} not found")
|
||||
|
||||
decision = await db.get_decision_by_case(case_id)
|
||||
|
||||
arguments_context, n_items, source_kind = await _build_arguments_context(case_id)
|
||||
if source_kind == "none":
|
||||
raise ValueError(
|
||||
"אין טענות לסכם. הרץ extract_claims (ורצוי aggregate_claims_to_arguments) קודם."
|
||||
)
|
||||
|
||||
case_context = block_writer._build_case_context(case, decision)
|
||||
style_context = await block_writer._build_style_context(case.get("practice_area", ""))
|
||||
|
||||
prompt = _PROMPT_TEMPLATE.format(
|
||||
case_context=case_context,
|
||||
arguments_context=arguments_context,
|
||||
style_context=style_context,
|
||||
)
|
||||
if instructions:
|
||||
prompt += f"\n\n## הנחיות נוספות מהיו\"ר:\n{instructions}"
|
||||
|
||||
# Generation: claude_session → claude -p, pinned Opus 4.8 + high effort.
|
||||
# tools="" — pure prose, no tool_use (avoids error_max_turns). LONG_TIMEOUT:
|
||||
# full-case context can be large.
|
||||
content = await claude_session.query(
|
||||
prompt,
|
||||
timeout=claude_session.LONG_TIMEOUT,
|
||||
model="claude-opus-4-8",
|
||||
effort="high",
|
||||
tools="",
|
||||
)
|
||||
content = (content or "").strip()
|
||||
if not content:
|
||||
raise ValueError("הסיכום חזר ריק מ-claude -p.")
|
||||
|
||||
today = date.today().strftime("%d.%m.%Y")
|
||||
header = (
|
||||
f"# סיכום-מנהלים — טענות הצדדים\n\n"
|
||||
f"**תיק:** {case['case_number']} \n"
|
||||
f"**נושא:** {case.get('subject', '')} \n"
|
||||
f"**הופק:** {today} · מסמך הכנה לדיון (נפרד מטיוטת-ההחלטה)\n\n"
|
||||
f"---\n\n"
|
||||
)
|
||||
document = header + content + "\n"
|
||||
|
||||
# Save to data/cases/{n}/documents/research/ — same path as the legal analysis,
|
||||
# so it is git-synced + S3-mirrored by the existing machinery.
|
||||
out_path = summary_file_path(case_number)
|
||||
out_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
out_path.write_text(document, encoding="utf-8") # noqa: STG1 — mirrored below
|
||||
try:
|
||||
key = out_path.resolve().relative_to(Path(config.DATA_DIR).resolve()).as_posix()
|
||||
await storage.mirror(key, document.encode("utf-8"), bucket=storage.Bucket.DOCUMENTS)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
case_dir = config.find_case_dir(case_number)
|
||||
if case_dir.exists():
|
||||
git_sync.commit_and_push(case_dir, f"סיכום-מנהלים: טענות הצדדים ({case_number})")
|
||||
|
||||
return {
|
||||
"case_number": case_number,
|
||||
"path": str(out_path),
|
||||
"source_kind": source_kind,
|
||||
"source_items": n_items,
|
||||
"word_count": len(content.split()),
|
||||
"message": f"סיכום-מנהלים נוצר ({len(content.split())} מילים, מקור: {source_kind}).",
|
||||
}
|
||||
@@ -68,7 +68,11 @@ def _external_staging_subdir(inputs: dict) -> str:
|
||||
|
||||
|
||||
async def _create_external_record(**kw) -> dict:
|
||||
"""Adapter: maps canonical inputs (citation) to create_external_case_law(case_number)."""
|
||||
"""Adapter: maps canonical inputs (citation) to create_external_case_law(case_number).
|
||||
|
||||
The chair's typed citation seeds ``citation_formatted`` so the מראה-מקום is never
|
||||
blank before metadata extraction; the inline enrichment upgrades it to the
|
||||
canonical form (see ``ingest_precedent``)."""
|
||||
return await db.create_external_case_law(
|
||||
case_number=kw["citation"].strip(),
|
||||
case_name=kw["case_name"],
|
||||
@@ -84,6 +88,7 @@ async def _create_external_record(**kw) -> dict:
|
||||
precedent_level=kw.get("precedent_level", ""),
|
||||
is_binding=kw.get("is_binding", True),
|
||||
document_id=kw.get("document_id"),
|
||||
citation_formatted=kw["citation"].strip(),
|
||||
)
|
||||
|
||||
|
||||
@@ -126,10 +131,28 @@ async def ingest_precedent(
|
||||
"appeal_subtype": appeal_subtype, "subject_tags": subject_tags,
|
||||
"is_binding": is_binding, "headnote": headnote, "summary": summary,
|
||||
}
|
||||
return await ingest.ingest_document(
|
||||
result = await ingest.ingest_document(
|
||||
_EXTERNAL_SPEC, inputs=inputs, file_path=file_path,
|
||||
document_id=document_id, progress=progress,
|
||||
)
|
||||
# Inline metadata enrichment (Gemini, in-container — gemini_session is direct
|
||||
# REST, no local CLI). UPGRADES the seeded provisional citation_formatted to the
|
||||
# canonical derived form (parties + reporter + date) so the מראה-מקום is correct
|
||||
# the moment the chair opens /precedents/[id] — not deferred to the local drainer.
|
||||
# force_citation=True overwrites the seed only; chair edits aren't reachable yet
|
||||
# (row just created). Best-effort: on no key / API failure the seed remains and
|
||||
# the queued metadata drain (request_metadata_extraction, already set) is the
|
||||
# fallback. Halacha extraction is NOT touched here — it stays local (claude_session).
|
||||
cid = result.get("case_law_id") if isinstance(result, dict) else None
|
||||
if cid:
|
||||
try:
|
||||
from legal_mcp.services import precedent_metadata_extractor as _pme
|
||||
r = await _pme.extract_and_apply(UUID(str(cid)), force_citation=True)
|
||||
if r.get("status") == "completed":
|
||||
await db.set_case_law_metadata_status(UUID(str(cid)), "completed")
|
||||
except Exception as e: # noqa: BLE001 — enrichment is best-effort; drainer is fallback
|
||||
logger.warning("inline metadata enrichment failed for %s (drainer will retry): %s", cid, e)
|
||||
return result
|
||||
|
||||
|
||||
async def reextract_halachot(
|
||||
@@ -360,7 +383,10 @@ async def reextract_metadata(
|
||||
appeal_subtype, and case_name when it equals the citation). User
|
||||
values are preserved.
|
||||
|
||||
**MCP-tool-only path** — same constraint as :func:`reextract_halachot`.
|
||||
**Container-safe** — unlike :func:`reextract_halachot` (claude CLI, host-only),
|
||||
metadata extraction runs on Gemini Flash over REST (GOOGLE_GEMINI_API_KEY), so
|
||||
this path is callable from the FastAPI container too. The final-decision
|
||||
enrollment loop (``_enroll_final_in_library``) calls it inline on upload.
|
||||
"""
|
||||
from legal_mcp.services import precedent_metadata_extractor
|
||||
|
||||
@@ -411,6 +437,37 @@ async def get_precedent(case_law_id: UUID | str) -> dict | None:
|
||||
return None
|
||||
record["halachot"] = await db.list_halachot(case_law_id=case_law_id, limit=500)
|
||||
record["related_cases"] = await db.get_case_law_relations(case_law_id)
|
||||
# Auto-detected citation graph: which decisions cite THIS ruling (incoming
|
||||
# edges in precedent_internal_citations). Reuses the canonical query (G2) —
|
||||
# no parallel resolution path. Shaped to match the front-end RelatedCase row
|
||||
# so the existing "ציטוטים מקושרים" panel renders them with no visual change.
|
||||
from legal_mcp.services import citation_extractor as _ce
|
||||
raw = await _ce.list_citations_to_case_law(case_law_id)
|
||||
record["incoming_citations"] = [
|
||||
{
|
||||
"id": r["source_case_law_id"],
|
||||
"case_number": r.get("source_case_number") or r.get("cited_case_number") or "",
|
||||
"case_name": r.get("source_case_name") or "",
|
||||
"court": r.get("source_court") or "",
|
||||
"precedent_level": r.get("source_precedent_level") or "",
|
||||
"chair_name": r.get("source_chair_name") or "",
|
||||
"date": (
|
||||
r["source_date"].isoformat()
|
||||
if r.get("source_date") is not None else None
|
||||
),
|
||||
"treatment": r.get("treatment") or "",
|
||||
"confidence": r.get("confidence"),
|
||||
}
|
||||
for r in raw
|
||||
]
|
||||
# Authority signal (X11 Phase 2, #154): how the citing committee decisions
|
||||
# TREATED this ruling (followed/distinguished/…) — surfaced so the chair (and
|
||||
# research agents via the tool output) can argue authority and avoid leaning on
|
||||
# a repeatedly-distinguished precedent.
|
||||
record["cited_by"] = (await db.citation_authority([case_law_id])).get(
|
||||
str(case_law_id),
|
||||
{"total": 0, "positive": 0, "negative": 0, "unclassified": 0, "by_treatment": {}},
|
||||
)
|
||||
return record
|
||||
|
||||
|
||||
|
||||
@@ -260,6 +260,7 @@ async def apply_to_record(
|
||||
case_law_id: UUID | str,
|
||||
suggested: dict,
|
||||
overwrite_case_number: bool = False,
|
||||
force_citation: bool = False,
|
||||
) -> dict:
|
||||
"""Merge suggested metadata into the case_law row, filling ONLY empty fields.
|
||||
|
||||
@@ -274,6 +275,13 @@ async def apply_to_record(
|
||||
|
||||
overwrite_case_number: when True, update case_number from case_number_clean
|
||||
even if the field already has a value (used for one-time migration enrichment).
|
||||
|
||||
force_citation: when True, (re)assemble citation_formatted even if the field
|
||||
is non-empty — used by the at-upload inline enrichment to UPGRADE the seeded
|
||||
provisional citation (the raw chair input) to the canonical derived form. The
|
||||
write still happens only when the deterministic assembly SUCCEEDS (a missing
|
||||
component → no write → the seed is preserved). The drainer keeps the default
|
||||
(False) so a chair's manual edit in /precedents/[id] is never clobbered.
|
||||
"""
|
||||
if isinstance(case_law_id, str):
|
||||
case_law_id = UUID(case_law_id)
|
||||
@@ -482,7 +490,7 @@ async def apply_to_record(
|
||||
# source_type/district/proceeding_type/parties). Only fill when empty so chair
|
||||
# edits in /precedents/[id] are preserved; abstains (no write) when a component
|
||||
# is missing.
|
||||
if not (record.get("citation_formatted") or "").strip():
|
||||
if force_citation or not (record.get("citation_formatted") or "").strip():
|
||||
eff = {**record, **fields_to_update}
|
||||
eff_parties = (
|
||||
fields_to_update.get("parties") or record.get("parties") or ""
|
||||
@@ -505,6 +513,7 @@ async def apply_to_record(
|
||||
async def extract_and_apply(
|
||||
case_law_id: UUID | str,
|
||||
overwrite_case_number: bool = False,
|
||||
force_citation: bool = False,
|
||||
) -> dict:
|
||||
"""Convenience wrapper: extract → merge into row → return summary."""
|
||||
suggested = await extract_metadata(case_law_id)
|
||||
@@ -523,7 +532,11 @@ async def extract_and_apply(
|
||||
"status": "extraction_failed" if has_text else "no_metadata",
|
||||
"fields": [],
|
||||
}
|
||||
result = await apply_to_record(case_law_id, suggested, overwrite_case_number=overwrite_case_number)
|
||||
result = await apply_to_record(
|
||||
case_law_id, suggested,
|
||||
overwrite_case_number=overwrite_case_number,
|
||||
force_citation=force_citation,
|
||||
)
|
||||
if result["updated"]:
|
||||
await db.recompute_searchable(case_law_id)
|
||||
return {
|
||||
|
||||
83
mcp-server/src/legal_mcp/services/principle_gold.py
Normal file
83
mcp-server/src/legal_mcp/services/principle_gold.py
Normal file
@@ -0,0 +1,83 @@
|
||||
"""Principle-level gold matching (importance layer #153, component 1).
|
||||
|
||||
Flags the SPECIFIC principle a chair relied on — not the whole precedent. A chair
|
||||
cites a precedent for ONE holding; we embed the citation's ``match_context`` (or a
|
||||
digest's ``headline_holding``) and cosine-match it to the principles extracted from
|
||||
that precedent. The best match ≥ threshold gets the flag:
|
||||
|
||||
• OUR_CHAIR (דפנה) cited it → ``gold_chair`` (tier-1, protective in the cull)
|
||||
• another committee chair cited it → ``chair_cited`` (tier-2, weight not protection)
|
||||
• a digest highlights it → ``gold_digest`` (tier-1)
|
||||
|
||||
Embedding-only — NO LLM, so it is cheap and re-runnable (the periodic refresh job).
|
||||
Tuned toward recall (HALACHA_GOLD_MATCH_THRESHOLD): missing a chair-relied principle
|
||||
(buried by the cull) is worse than over-protecting one.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from uuid import UUID
|
||||
|
||||
from legal_mcp import config
|
||||
from legal_mcp.services import db, embeddings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def _embed_all(texts: list[str]) -> list[list[float]]:
|
||||
"""Embed in Voyage-sized batches (embed_texts already chunks at 128)."""
|
||||
return await embeddings.embed_texts(texts, input_type="query") if texts else []
|
||||
|
||||
|
||||
async def match_all(threshold: float | None = None, apply: bool = False) -> dict:
|
||||
"""Run gold matching over all chair citations + digests.
|
||||
|
||||
Returns a stats dict; when ``apply`` writes the flags (idempotent — clears
|
||||
prior flags first). Dry-run computes everything but writes nothing.
|
||||
"""
|
||||
threshold = config.HALACHA_GOLD_MATCH_THRESHOLD if threshold is None else threshold
|
||||
if apply:
|
||||
cleared = await db.reset_principle_gold()
|
||||
logger.info("principle_gold: cleared %d prior flags before re-match", cleared)
|
||||
|
||||
citations = await db.gold_chair_citations()
|
||||
digests = await db.gold_digest_holdings()
|
||||
|
||||
cit_vecs = await _embed_all([c["match_context"] for c in citations])
|
||||
dig_vecs = await _embed_all([d["holding_text"] for d in digests])
|
||||
|
||||
stats = {"threshold": threshold, "applied": apply,
|
||||
"chair_citations": len(citations), "digests": len(digests),
|
||||
"gold_chair": 0, "chair_cited": 0, "gold_digest": 0,
|
||||
"chair_no_match": 0, "digest_no_match": 0, "samples": []}
|
||||
|
||||
async def _flag(case_law_id, vec, *, gold_chair=False, gold_digest=False,
|
||||
chair_cited=False, label=""):
|
||||
match = await db.nearest_original_principle(case_law_id, list(vec))
|
||||
if match is None or match[1] < threshold:
|
||||
return None
|
||||
hid, sim = match
|
||||
if apply:
|
||||
await db.set_principle_gold(
|
||||
UUID(hid), gold_chair=gold_chair, gold_digest=gold_digest,
|
||||
chair_cited=chair_cited, score=sim)
|
||||
if len(stats["samples"]) < 12:
|
||||
stats["samples"].append({"label": label, "halacha_id": hid, "sim": round(sim, 3)})
|
||||
return hid
|
||||
|
||||
for c, vec in zip(citations, cit_vecs):
|
||||
cid = c["cited_case_law_id"]
|
||||
if c["is_our_chair"]:
|
||||
hid = await _flag(cid, vec, gold_chair=True, label="chair:דפנה")
|
||||
stats["gold_chair" if hid else "chair_no_match"] += 1
|
||||
else:
|
||||
hid = await _flag(cid, vec, chair_cited=True, label=f"chair:{c['citing_chair']}")
|
||||
stats["chair_cited" if hid else "chair_no_match"] += 1
|
||||
|
||||
for d, vec in zip(digests, dig_vecs):
|
||||
hid = await _flag(d["linked_case_law_id"], vec, gold_digest=True, label="digest")
|
||||
stats["gold_digest" if hid else "digest_no_match"] += 1
|
||||
|
||||
if apply:
|
||||
stats["coverage"] = await db.gold_coverage_stats()
|
||||
return stats
|
||||
400
mcp-server/src/legal_mcp/services/protocol_analyzer.py
Normal file
400
mcp-server/src/legal_mcp/services/protocol_analyzer.py
Normal file
@@ -0,0 +1,400 @@
|
||||
"""ניתוח פרוטוקול-דיון השוואתי (WS4 / #203).
|
||||
|
||||
מנתח פרוטוקול דיון של ועדת הערר מול כתבי-הטענות הכתובים: אילו טענות **ירדו**
|
||||
(נזנחו בדיון), אילו **חוזקו**, ואילו **עלו חדשות** — ומחדד את השאלות המשפטיות
|
||||
לקראת פרק הדיון. התוצאה נכנסת ל"ידע-התיק" (טבלת protocol_analysis), זמינה
|
||||
לסוכני הניתוח והכתיבה.
|
||||
|
||||
בנוסף, מחלץ את **נתוני הכותרת (א–ד)** מהפרוטוקול בפורמט-ההזנה המוכר —
|
||||
הרכב הוועדה, תאריך הדיון, והצדדים שהופיעו — ומזין אותם חזרה לעמודות הקנוניות
|
||||
(`cases.hearing_date`, panel דרך decisions; G2: לא כפילות).
|
||||
|
||||
הפרדת-אחריות (claude_session.py): כל קריאת-LLM כאן רצה רק מה-MCP server המקומי
|
||||
(אין claude CLI בקונטיינר). הקריאה היחידה היא דרך claude_session, מעוגנת ל-
|
||||
Opus 4.8 + effort=high כמתבקש בניתוח-השוואתי (reference_claude_generation_path).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import logging
|
||||
from uuid import UUID
|
||||
|
||||
from legal_mcp.services import claude_session, db
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Generation pinned per reference_claude_generation_path: Opus 4.8 rejects
|
||||
# temperature/top_p/top_k (400) — the only knob is effort. Comparative legal
|
||||
# reasoning over the protocol vs. pleadings is high-effort.
|
||||
ANALYSIS_MODEL = "claude-opus-4-8"
|
||||
ANALYSIS_EFFORT = "high"
|
||||
HEADER_EFFORT = "medium" # א–ד is mechanical extraction, not reasoning
|
||||
|
||||
# Valid change verdicts — mirror the DB CHECK on protocol_analysis.change_type.
|
||||
VALID_CHANGE_TYPES = {"dropped", "strengthened", "newly_raised"}
|
||||
VALID_PARTY_ROLES = {"appellant", "respondent", "committee", "permit_applicant", ""}
|
||||
|
||||
PARTY_LABELS_HE = {
|
||||
"appellant": "עוררים",
|
||||
"respondent": "משיבים",
|
||||
"committee": "ועדה מקומית",
|
||||
"permit_applicant": "מבקשי היתר",
|
||||
}
|
||||
|
||||
|
||||
# ── Comparative analysis: pleadings vs. protocol ──────────────────
|
||||
|
||||
COMPARE_PROMPT = """אתה מנתח משפטי בכיר בועדת ערר לתכנון ובנייה. לפניך **פרוטוקול דיון**
|
||||
ולצדו **הטיעונים המשפטיים שהוגשו בכתב** לפני הדיון. תפקידך: ניתוח השוואתי מדויק
|
||||
של מה שקרה בדיון ביחס לכתבי-הטענות.
|
||||
|
||||
## מה לזהות (לכל צד בנפרד):
|
||||
1. **dropped (ירדה)** — טענה שהוגשה בכתב אך הצד **זנח** אותה בדיון: לא חזר עליה,
|
||||
הודה שאינה עומדת, או ויתר עליה במפורש.
|
||||
2. **strengthened (חוזקה)** — טענה כתובה שהצד **חיזק** בדיון: הוסיף נימוק, אסמכתא,
|
||||
הבהרה, או דגש שהפך אותה למרכזית.
|
||||
3. **newly_raised (חדשה)** — טענה/סוגיה ש**עלתה לראשונה בדיון** ולא הופיעה בכתבי
|
||||
הטענות כלל.
|
||||
|
||||
## כללים קריטיים (anti-hallucination — חובה):
|
||||
- **ציטוט-או-הימנעות:** לכל קביעה חייב להיות `evidence_quote` — ציטוט **מילולי**
|
||||
מהפרוטוקול (עד 200 תווים) שמבסס אותה. אם אין ציטוט תומך — אל תכלול את הרשומה.
|
||||
- אל תמציא טענות שלא נאמרו. אל תסיק "ירדה" רק כי לא הוזכרה — רק אם יש ראיה פוזיטיבית
|
||||
לזניחה/ויתור, או שהיא טענה כתובה מרכזית שכלל לא עלתה והצד עסק בנושא.
|
||||
- **חידוד-השאלה:** לכל רשומה, נסח את `sharpened_question` — השאלה המשפטית הממוקדת
|
||||
שהשינוי בדיון מחדד (לטובת פרק הדיון). אם לא רלוונטי — השאר ריק.
|
||||
- שייך כל רשומה ל-`party_role` הנכון: appellant / respondent / committee / permit_applicant.
|
||||
- אם רשומה תואמת טיעון כתוב קיים — החזר את ה-`argument_id` שלו מהרשימה למטה. לטענה חדשה
|
||||
(newly_raised) — argument_id ריק.
|
||||
|
||||
## פלט:
|
||||
החזר JSON array בלבד — ללא markdown, ללא הסברים:
|
||||
[
|
||||
{{
|
||||
"change_type": "dropped" | "strengthened" | "newly_raised",
|
||||
"party_role": "appellant" | "respondent" | "committee" | "permit_applicant",
|
||||
"argument_id": "uuid-של-הטיעון-הכתוב או null",
|
||||
"argument_title": "כותרת קצרה של הטענה/הסוגיה",
|
||||
"summary": "מה השתנה בדיון, במשפט-שניים",
|
||||
"sharpened_question": "השאלה המשפטית שהשינוי מחדד, או ריק",
|
||||
"evidence_quote": "ציטוט מילולי מהפרוטוקול",
|
||||
"page_number": null
|
||||
}}
|
||||
]
|
||||
אם אין שינויים בני-ביסוס — החזר [].
|
||||
|
||||
## הטיעונים שהוגשו בכתב:
|
||||
{arguments_json}
|
||||
|
||||
## פרוטוקול הדיון:
|
||||
--- תחילת פרוטוקול ---
|
||||
{protocol_text}
|
||||
--- סוף פרוטוקול ---
|
||||
"""
|
||||
|
||||
|
||||
# ── Header (א–ד) extraction in the known feed format ──────────────
|
||||
|
||||
HEADER_PROMPT = """אתה מחלץ נתוני-כותרת מפרוטוקול דיון של ועדת ערר לתכנון ובנייה.
|
||||
חלץ אך-ורק עובדות מנהליות המופיעות במפורש בפרוטוקול — אל תמציא ואל תסיק.
|
||||
|
||||
## פלט:
|
||||
החזר JSON object בלבד (ללא markdown):
|
||||
{{
|
||||
"hearing_date": "YYYY-MM-DD אם תאריך הדיון מופיע, אחרת ריק",
|
||||
"panel_members": ["שמות חברי ההרכב כפי שמופיעים, כולל תוארם; ריק אם לא צוין"],
|
||||
"appellants_present": ["שמות העוררים/באי-כוחם שהופיעו בדיון"],
|
||||
"respondents_present": ["שמות המשיבים/באי-כוחם שהופיעו בדיון"]
|
||||
}}
|
||||
שדה שלא צוין בפרוטוקול — החזר ריק ([] או "").
|
||||
|
||||
## פרוטוקול:
|
||||
--- תחילת פרוטוקול ---
|
||||
{protocol_text}
|
||||
--- סוף פרוטוקול ---
|
||||
"""
|
||||
|
||||
# A single protocol rarely exceeds the model's context, but cap defensively so a
|
||||
# pathological OCR dump doesn't blow the prompt budget.
|
||||
MAX_PROTOCOL_CHARS = 120_000
|
||||
|
||||
|
||||
def _protocol_scope(doc: dict) -> str:
|
||||
"""Protocol scope from ``metadata.protocol_scope``.
|
||||
|
||||
Absent/'' defaults to ``'appeal'`` (ועדת הערר), matching the
|
||||
document-type-editor convention where only the non-default ``'lower'``
|
||||
(ועדה מקומית/מחוזית) is persisted.
|
||||
"""
|
||||
meta = doc.get("metadata") or {}
|
||||
return (meta.get("protocol_scope") or "").strip() or "appeal"
|
||||
|
||||
|
||||
def _find_protocol(
|
||||
docs: list[dict], document_id: UUID | None = None,
|
||||
) -> dict | None:
|
||||
"""The ועדת-הערר hearing protocol to compare against the pleadings.
|
||||
|
||||
- ``document_id`` given → return exactly that document (explicit target),
|
||||
so a case with several protocols can be pointed at the right hearing.
|
||||
- Otherwise prefer a protocol scoped to the appeals committee
|
||||
(``scope != 'lower'``). A ``'lower'`` protocol is the local/district
|
||||
committee's proceedings — it feeds background (block ו) only and must NOT
|
||||
drive the hearing-vs-pleadings comparison (#223). If every protocol is
|
||||
lower-scoped there is no ערר-hearing to compare → return None.
|
||||
- Among appeal-scoped protocols the most recent (by ``created_at``) wins —
|
||||
the operative hearing; ties fall back to list order.
|
||||
"""
|
||||
if document_id is not None:
|
||||
return next(
|
||||
(d for d in docs if str(d.get("id")) == str(document_id)), None,
|
||||
)
|
||||
|
||||
protocols = [d for d in docs if d.get("doc_type") == "protocol"]
|
||||
if not protocols:
|
||||
# Legacy fallback: untyped docs whose title says "פרוטוקול".
|
||||
protocols = [d for d in docs if "פרוטוקול" in (d.get("title") or "")]
|
||||
|
||||
appeal_scoped = [d for d in protocols if _protocol_scope(d) != "lower"]
|
||||
if not appeal_scoped:
|
||||
return None
|
||||
appeal_scoped.sort(key=lambda d: d.get("created_at") or "", reverse=True)
|
||||
return appeal_scoped[0]
|
||||
|
||||
|
||||
def _compact_arguments(arguments: list[dict]) -> list[dict]:
|
||||
"""Strip aggregated arguments down to what the comparison needs."""
|
||||
out = []
|
||||
for a in arguments:
|
||||
out.append({
|
||||
"argument_id": str(a["id"]),
|
||||
"party_role": a.get("party", ""),
|
||||
"title": a.get("argument_title", ""),
|
||||
"body": a.get("argument_body", ""),
|
||||
"topic": a.get("legal_topic", ""),
|
||||
})
|
||||
return out
|
||||
|
||||
|
||||
def _normalize_change(raw: dict, valid_argument_ids: set[str]) -> dict | None:
|
||||
"""Validate & normalize one comparative-analysis row from Claude.
|
||||
|
||||
Returns None for unusable rows (missing change_type/summary, or — per the
|
||||
anti-hallucination gate — no supporting evidence_quote).
|
||||
"""
|
||||
if not isinstance(raw, dict):
|
||||
return None
|
||||
change_type = (raw.get("change_type") or "").strip()
|
||||
if change_type not in VALID_CHANGE_TYPES:
|
||||
return None
|
||||
summary = (raw.get("summary") or "").strip()
|
||||
evidence_quote = (raw.get("evidence_quote") or "").strip()
|
||||
# INV-AH (quote-or-retract): drop any verdict the model couldn't anchor to a
|
||||
# verbatim protocol excerpt — at source, so unfounded rows never reach the DB.
|
||||
if not summary or not evidence_quote:
|
||||
return None
|
||||
|
||||
party_role = (raw.get("party_role") or "").strip()
|
||||
if party_role not in VALID_PARTY_ROLES:
|
||||
party_role = ""
|
||||
|
||||
# argument_id only kept when it actually belongs to this case's arguments;
|
||||
# a newly_raised point has none, and a hallucinated id is dropped (FK safety).
|
||||
argument_id = None
|
||||
raw_aid = raw.get("argument_id")
|
||||
if raw_aid and str(raw_aid) in valid_argument_ids:
|
||||
try:
|
||||
argument_id = UUID(str(raw_aid))
|
||||
except (ValueError, TypeError):
|
||||
argument_id = None
|
||||
|
||||
page = raw.get("page_number")
|
||||
if not isinstance(page, int):
|
||||
page = None
|
||||
|
||||
return {
|
||||
"change_type": change_type,
|
||||
"party_role": party_role,
|
||||
"argument_id": argument_id,
|
||||
"argument_title": (raw.get("argument_title") or "").strip(),
|
||||
"summary": summary,
|
||||
"sharpened_question": (raw.get("sharpened_question") or "").strip(),
|
||||
"evidence_quote": evidence_quote[:200],
|
||||
"page_number": page,
|
||||
}
|
||||
|
||||
|
||||
async def _extract_header(protocol_text: str, case_id: UUID) -> dict:
|
||||
"""Extract א–ד header data and write it back to canonical case fields.
|
||||
|
||||
Returns the raw extracted feed (for provenance) plus a record of what was
|
||||
written back. Header data is NOT stored in protocol_analysis — it lives in
|
||||
the canonical `cases`/`decisions` columns (G2: single source of truth).
|
||||
"""
|
||||
prompt = HEADER_PROMPT.format(protocol_text=protocol_text[:MAX_PROTOCOL_CHARS])
|
||||
try:
|
||||
feed = await claude_session.query_json(
|
||||
prompt, model=ANALYSIS_MODEL, effort=HEADER_EFFORT, tools="",
|
||||
)
|
||||
except Exception as e: # noqa: BLE001 — surface, don't swallow (§6 no silent swallow)
|
||||
logger.warning("protocol header extraction failed for case %s: %s", case_id, e)
|
||||
return {"status": "header_failed", "error": str(e)}
|
||||
|
||||
if not isinstance(feed, dict):
|
||||
return {"status": "header_no_data"}
|
||||
|
||||
applied: dict = {}
|
||||
# hearing_date → canonical cases.hearing_date (only if the case lacks one,
|
||||
# so a chair-entered date is never overwritten by extraction).
|
||||
hearing_date = (feed.get("hearing_date") or "").strip()
|
||||
if hearing_date:
|
||||
from datetime import date as date_type
|
||||
try:
|
||||
parsed = date_type.fromisoformat(hearing_date)
|
||||
case = await db.get_case(case_id)
|
||||
if case and not case.get("hearing_date"):
|
||||
await db.update_case(case_id, hearing_date=parsed)
|
||||
applied["hearing_date"] = hearing_date
|
||||
except ValueError:
|
||||
logger.info("protocol header: unparseable hearing_date %r", hearing_date)
|
||||
|
||||
# Attendees → cases.hearing_attendees (#226). Unlike hearing_date there is no
|
||||
# chair-entry path to protect, and re-running to point at the correct ערר
|
||||
# protocol (#223) must refresh who appeared — so write whenever the operative
|
||||
# protocol yielded any names, but never clobber good data with an empty
|
||||
# extraction (all-empty feed → leave the prior snapshot intact).
|
||||
attendees = {
|
||||
"panel_members": feed.get("panel_members") or [],
|
||||
"appellants_present": feed.get("appellants_present") or [],
|
||||
"respondents_present": feed.get("respondents_present") or [],
|
||||
}
|
||||
if any(attendees.values()):
|
||||
await db.update_case(case_id, hearing_attendees=attendees)
|
||||
applied["hearing_attendees"] = True
|
||||
|
||||
return {
|
||||
"status": "ok",
|
||||
"feed": {
|
||||
"hearing_date": hearing_date,
|
||||
**attendees,
|
||||
},
|
||||
"applied_to_case": applied,
|
||||
}
|
||||
|
||||
|
||||
async def analyze_protocol(
|
||||
case_id: UUID, target_document_id: UUID | None = None,
|
||||
) -> dict:
|
||||
"""Comparative analysis of the case's hearing protocol vs. its pleadings.
|
||||
|
||||
``target_document_id`` pins the analysis to a specific protocol document —
|
||||
required when a case holds several protocols (e.g. a lower-committee annex
|
||||
plus the ועדת-הערר hearing) and the auto-pick would be ambiguous (#223).
|
||||
|
||||
1. Locates the protocol document.
|
||||
2. Pulls the aggregated legal_arguments (the written-pleadings baseline).
|
||||
3. Asks Claude (Opus 4.8, effort=high) to classify each as dropped /
|
||||
strengthened, and to surface newly-raised arguments + sharpened questions.
|
||||
4. Stores the verdicts in protocol_analysis (case-knowledge, idempotent).
|
||||
5. Extracts the א–ד header feed and writes hearing_date back to the case.
|
||||
|
||||
Returns a serializable summary dict.
|
||||
"""
|
||||
docs = await db.list_documents(case_id)
|
||||
protocol = _find_protocol(docs, document_id=target_document_id)
|
||||
if not protocol:
|
||||
if target_document_id is not None:
|
||||
return {
|
||||
"status": "no_protocol",
|
||||
"message": f"מסמך {target_document_id} לא נמצא בתיק.",
|
||||
}
|
||||
return {
|
||||
"status": "no_protocol",
|
||||
"message": (
|
||||
"לא נמצא פרוטוקול ועדת-ערר בתיק (doc_type='protocol' עם "
|
||||
"protocol_scope שאינו 'lower'). העלה פרוטוקול-דיון, או תייג את "
|
||||
"הפרוטוקול הקיים כ-appeal, והרץ שוב."
|
||||
),
|
||||
}
|
||||
|
||||
document_id = UUID(protocol["id"])
|
||||
protocol_text = await db.get_document_text(document_id)
|
||||
if not protocol_text or not protocol_text.strip():
|
||||
return {
|
||||
"status": "no_text",
|
||||
"message": "לפרוטוקול אין טקסט מחולץ. ודא שהעיבוד הסתיים והרץ שוב.",
|
||||
"document_id": str(document_id),
|
||||
}
|
||||
|
||||
# Use the aggregator's read path (single source of truth — no parallel
|
||||
# query for the same legal_arguments data, G2).
|
||||
from legal_mcp.services import argument_aggregator
|
||||
arguments = await argument_aggregator.get_legal_arguments(case_id)
|
||||
|
||||
if not arguments:
|
||||
return {
|
||||
"status": "no_arguments",
|
||||
"message": (
|
||||
"אין טיעונים מאוגדים להשוואה. הרץ extract_claims + "
|
||||
"aggregate_claims_to_arguments על כתבי-הטענות תחילה."
|
||||
),
|
||||
"document_id": str(document_id),
|
||||
}
|
||||
|
||||
compact_args = _compact_arguments(arguments)
|
||||
valid_argument_ids = {a["argument_id"] for a in compact_args}
|
||||
|
||||
prompt = COMPARE_PROMPT.format(
|
||||
arguments_json=json.dumps(compact_args, ensure_ascii=False, indent=2),
|
||||
protocol_text=protocol_text[:MAX_PROTOCOL_CHARS],
|
||||
)
|
||||
|
||||
try:
|
||||
raw_result = await claude_session.query_json(
|
||||
prompt, model=ANALYSIS_MODEL, effort=ANALYSIS_EFFORT, tools="",
|
||||
)
|
||||
except RuntimeError as e:
|
||||
msg = str(e)
|
||||
if "Claude CLI not found" in msg:
|
||||
return {
|
||||
"status": "llm_unavailable",
|
||||
"message": (
|
||||
"Claude CLI לא זמין. הניתוח ההשוואתי חייב לרוץ מה-MCP server "
|
||||
"המקומי, לא מהקונטיינר."
|
||||
),
|
||||
"document_id": str(document_id),
|
||||
}
|
||||
return {"status": "error", "message": msg, "document_id": str(document_id)}
|
||||
|
||||
if not isinstance(raw_result, list):
|
||||
logger.warning(
|
||||
"analyze_protocol: Claude returned non-list (%s) for case %s",
|
||||
type(raw_result).__name__, case_id,
|
||||
)
|
||||
raw_result = []
|
||||
|
||||
rows: list[dict] = []
|
||||
for entry in raw_result:
|
||||
norm = _normalize_change(entry, valid_argument_ids)
|
||||
if norm:
|
||||
rows.append(norm)
|
||||
|
||||
stored = await db.replace_protocol_analysis(case_id, document_id, rows)
|
||||
|
||||
# Extract header (א–ד) and write hearing_date back to the canonical case.
|
||||
header = await _extract_header(protocol_text, case_id)
|
||||
|
||||
by_change: dict[str, int] = {}
|
||||
for r in rows:
|
||||
by_change[r["change_type"]] = by_change.get(r["change_type"], 0) + 1
|
||||
|
||||
return {
|
||||
"status": "completed",
|
||||
"document_id": str(document_id),
|
||||
"protocol_title": protocol.get("title", ""),
|
||||
"total": stored,
|
||||
"by_change": by_change,
|
||||
"arguments_compared": len(compact_args),
|
||||
"header": header,
|
||||
}
|
||||
@@ -15,8 +15,14 @@ import os
|
||||
import re
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from zoneinfo import ZoneInfo
|
||||
from typing import Any
|
||||
|
||||
# Display timezone (INV-UI9): timestamps surfaced to humans are rendered in
|
||||
# Israel time deterministically, regardless of the process clock (the container
|
||||
# may run UTC or Asia/Jerusalem). Storage stays UTC; this is display-only.
|
||||
IL_TZ = ZoneInfo("Asia/Jerusalem")
|
||||
|
||||
# Placeholder strings — any of these means "not yet filled"
|
||||
CHAIR_POSITION_PLACEHOLDERS = (
|
||||
"[ימולא ע\"י יו\"ר הוועדה]",
|
||||
@@ -191,7 +197,7 @@ def parse(file_path: Path) -> dict[str, Any]:
|
||||
date_str = date_match.group(1) if date_match else ""
|
||||
|
||||
stat = file_path.stat()
|
||||
mtime_iso = datetime.fromtimestamp(stat.st_mtime).isoformat()
|
||||
mtime_iso = datetime.fromtimestamp(stat.st_mtime, tz=IL_TZ).isoformat()
|
||||
|
||||
result: dict[str, Any] = {
|
||||
"header": {
|
||||
@@ -354,7 +360,7 @@ def update_chair_position(
|
||||
"saved": True,
|
||||
"section_id": section_id,
|
||||
"preview": preview,
|
||||
"timestamp": datetime.now().isoformat(),
|
||||
"timestamp": datetime.now(IL_TZ).isoformat(),
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ import re
|
||||
from uuid import UUID
|
||||
|
||||
from legal_mcp.services import db
|
||||
from legal_mcp.services.learning_loop import compute_diff_stats
|
||||
from legal_mcp.services.lessons import ANTI_PATTERNS, GOLDEN_RATIOS, canonical_outcome
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -122,6 +123,100 @@ def golden_ratio_adherence(block_word_counts: dict[str, int], outcome: str) -> d
|
||||
return {"outcome": outcome, "total_words": total, "sections": sections, "max_deviation": max_dev}
|
||||
|
||||
|
||||
def split_final_by_section(final_text: str) -> dict[str, str]:
|
||||
"""Group a signed final decision into golden-ratio sections (#208 calibration).
|
||||
|
||||
Reuses the SAME structure-aware splitter as measure_corpus_ratios
|
||||
(chunker._split_into_sections + _CHUNK_SECTION_TO_GOLDEN) — no parallel
|
||||
parsing path (G2). Returns {golden_section: concatenated_text} for the
|
||||
sections that map to an AI block (background/claims/discussion/summary).
|
||||
A section type that does not map (e.g. headers) is dropped, never silently
|
||||
folded into another section. Best-effort: an unsplittable final returns {}.
|
||||
"""
|
||||
from legal_mcp.services.chunker import _split_into_sections
|
||||
|
||||
by_section: dict[str, list[str]] = {}
|
||||
for stype, stext in _split_into_sections(final_text or ""):
|
||||
g = _CHUNK_SECTION_TO_GOLDEN.get(stype)
|
||||
if g and stext.strip():
|
||||
by_section.setdefault(g, []).append(stext.strip())
|
||||
return {sec: "\n\n".join(parts) for sec, parts in by_section.items()}
|
||||
|
||||
|
||||
def block_distance_to_final(
|
||||
block_id: str,
|
||||
regenerated_text: str,
|
||||
final_section_text: str,
|
||||
outcome: str,
|
||||
section_target_total_words: int | None = None,
|
||||
) -> dict:
|
||||
"""Distance of ONE regenerated block from the chair's matching final section.
|
||||
|
||||
The per-(block, effort) measurement cell for the #208 model/effort
|
||||
calibration harness. Pure/deterministic (no LLM, no DB) — reuses the
|
||||
existing style-distance primitives so the harness has no parallel metric
|
||||
path (G2 / INV-G8 eval-harness):
|
||||
|
||||
• change_percent — compute_diff_stats(regen, final_section)
|
||||
(learning_loop, the SAME diff the pairing
|
||||
ledger stores). Lower ⇒ the draft already
|
||||
reads like the final ⇒ less chair rewriting.
|
||||
• anti_pattern_total — count_anti_patterns(regen) (lessons.ANTI_PATTERNS).
|
||||
Lower ⇒ closer to Dafna's continuous-narrative
|
||||
voice; the CLEANEST style signal (07-learning §0.7).
|
||||
• golden_ratio_deviation_pp — |regen %-of-total − final %-of-total| for this
|
||||
block's section. 0 ⇒ same structural weight as
|
||||
the final. Requires the final's total words
|
||||
(section_target_total_words); otherwise None
|
||||
(we never fabricate a denominator).
|
||||
|
||||
Returns the three metrics + a single composite `distance` (normalized,
|
||||
lower=closer) the harness ranks efforts by.
|
||||
"""
|
||||
outcome = canonical_outcome(outcome)
|
||||
diff = compute_diff_stats(regenerated_text or "", final_section_text or "")
|
||||
change_percent = diff["change_percent"]
|
||||
anti = count_anti_patterns(regenerated_text or "")
|
||||
anti_total = anti["total"]
|
||||
# Per-pattern breakdown, not just the total: a calibration run that only
|
||||
# reports "anti=4" cannot tell you WHICH rule was broken, so it cannot say
|
||||
# what to fix. (Diagnosing the 2026-07-28 model A/B needed exactly this and
|
||||
# had to fall back on inference.)
|
||||
anti_by_pattern = {name: h["count"] for name, h in anti["by_pattern"].items()}
|
||||
|
||||
section = _BLOCK_TO_SECTION.get(block_id)
|
||||
regen_words = len((regenerated_text or "").split())
|
||||
final_words = len((final_section_text or "").split())
|
||||
ratio_dev: float | None = None
|
||||
if section and section_target_total_words and section_target_total_words > 0:
|
||||
# Replace the final's own block contribution with the regen's, holding
|
||||
# the rest of the final constant, to compare structural weight fairly.
|
||||
regen_total = section_target_total_words - final_words + regen_words
|
||||
if regen_total > 0:
|
||||
regen_pct = regen_words / regen_total * 100
|
||||
final_pct = final_words / section_target_total_words * 100
|
||||
ratio_dev = round(abs(regen_pct - final_pct), 1)
|
||||
|
||||
# Composite: normalize each component to ~[0,1] and average the present ones.
|
||||
# change_percent/100, anti_total/10 (10+ hits is already very bad), ratio/20.
|
||||
comps: list[float] = [min(change_percent / 100.0, 1.0), min(anti_total / 10.0, 1.0)]
|
||||
if ratio_dev is not None:
|
||||
comps.append(min(ratio_dev / 20.0, 1.0))
|
||||
distance = round(sum(comps) / len(comps), 4)
|
||||
|
||||
return {
|
||||
"block_id": block_id,
|
||||
"section": section,
|
||||
"regen_words": regen_words,
|
||||
"final_words": final_words,
|
||||
"change_percent": change_percent,
|
||||
"anti_pattern_total": anti_total,
|
||||
"anti_by_pattern": anti_by_pattern,
|
||||
"golden_ratio_deviation_pp": ratio_dev,
|
||||
"distance": distance,
|
||||
}
|
||||
|
||||
|
||||
async def style_distance(case_number: str) -> dict:
|
||||
"""Assemble the 3 style-distance components for one case (T7)."""
|
||||
case = await db.get_case_by_number(case_number)
|
||||
|
||||
83
mcp-server/src/legal_mcp/services/style_exemplars.py
Normal file
83
mcp-server/src/legal_mcp/services/style_exemplars.py
Normal file
@@ -0,0 +1,83 @@
|
||||
"""Block-level style-exemplar extraction (channel B of Style Acquisition).
|
||||
|
||||
Splits one of Dafna's decisions into section→paragraph units, embeds them
|
||||
(Voyage), and stores them in `style_exemplars` so the writer can retrieve real
|
||||
block-level prose by section/outcome/practice_area (07-learning §0.2 channel B).
|
||||
|
||||
This is the SINGLE source of truth for exemplar extraction (G2): both the
|
||||
one-time backfill (`scripts/backfill_style_exemplars.py`) and the live
|
||||
final-enrollment path (`_enroll_final_in_library`) call `extract_and_store`.
|
||||
Before this, exemplars were frozen at the seed backfill — new finals enrolled
|
||||
into style_corpus but were never broken into exemplars, so the richest style
|
||||
channel never grew. Embedding is Voyage-over-REST → container-safe.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
|
||||
from legal_mcp.services import db, embeddings
|
||||
from legal_mcp.services.chunker import _split_into_sections
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# chunker section_type → style_exemplars.section
|
||||
_SECTION_MAP = {
|
||||
"facts": "background",
|
||||
"appellant_claims": "claims",
|
||||
"respondent_claims": "claims",
|
||||
"legal_analysis": "discussion",
|
||||
"conclusion": "summary",
|
||||
"ruling": "summary",
|
||||
"intro": "other",
|
||||
"other": "other",
|
||||
}
|
||||
|
||||
MIN_WORDS = 25 # skip tiny fragments
|
||||
MAX_WORDS = 450 # skip over-long blobs (likely un-split)
|
||||
MAX_PER_SECTION = 15
|
||||
|
||||
|
||||
def _paragraphs(section_text: str) -> list[str]:
|
||||
"""Split a section into paragraph units (blank-line separated; fall back to lines)."""
|
||||
raw = [p.strip() for p in section_text.split("\n\n")]
|
||||
if len(raw) <= 1:
|
||||
raw = [p.strip() for p in section_text.split("\n")]
|
||||
out = []
|
||||
for p in raw:
|
||||
wc = len(p.split())
|
||||
if MIN_WORDS <= wc <= MAX_WORDS:
|
||||
out.append(p)
|
||||
return out[:MAX_PER_SECTION]
|
||||
|
||||
|
||||
def units_for(full_text: str) -> list[tuple[str, str]]:
|
||||
"""(section, paragraph) units for a decision — pure, no I/O."""
|
||||
units: list[tuple[str, str]] = []
|
||||
for section_type, section_text in _split_into_sections(full_text or ""):
|
||||
section = _SECTION_MAP.get(section_type, "other")
|
||||
for para in _paragraphs(section_text):
|
||||
units.append((section, para))
|
||||
return units
|
||||
|
||||
|
||||
async def extract_and_store(
|
||||
decision_number: str, source: str, full_text: str,
|
||||
practice_area: str = "", outcome: str = "",
|
||||
) -> int:
|
||||
"""Idempotently (re)build a decision's block-level style exemplars: split →
|
||||
embed → replace. Returns the number of exemplars stored. Raises on failure;
|
||||
callers in best-effort paths (enroll) should wrap in try/except."""
|
||||
units = units_for(full_text)
|
||||
if not units:
|
||||
return 0
|
||||
texts = [u[1] for u in units]
|
||||
vecs = await embeddings.embed_texts(texts, input_type="document")
|
||||
await db.delete_style_exemplars(decision_number, source)
|
||||
for (section, para), vec in zip(units, vecs):
|
||||
await db.insert_style_exemplar(
|
||||
decision_number=decision_number, source=source,
|
||||
practice_area=practice_area, outcome=outcome,
|
||||
section=section, paragraph_text=para, word_count=len(para.split()),
|
||||
embedding=vec,
|
||||
)
|
||||
return len(units)
|
||||
@@ -13,6 +13,7 @@ from uuid import UUID
|
||||
import httpx
|
||||
|
||||
from legal_mcp import config
|
||||
from legal_mcp.case_status_model import STATUS_ORDER # status SSoT
|
||||
from legal_mcp.services import audit, db, extractor, git_sync, practice_area as pa
|
||||
from legal_mcp.tools.envelope import empty, err, ok # GAP-48: SSoT envelope
|
||||
|
||||
@@ -341,16 +342,8 @@ async def case_update(
|
||||
"""
|
||||
from datetime import date as date_type
|
||||
|
||||
# Ordered core lifecycle — regression protection (forward-only).
|
||||
# Single source of truth, mirrored by web-ui/src/lib/api/case-status.ts and
|
||||
# models.CaseStatus. Trimmed from 17 → 10 (decorative statuses removed).
|
||||
STATUS_ORDER = [
|
||||
"new", "processing", "documents_ready",
|
||||
"outcome_set", "direction_approved",
|
||||
"qa_review", "drafted",
|
||||
"exported", "reviewed", "final",
|
||||
]
|
||||
|
||||
# Ordered core lifecycle (forward-only regression guard). Single source of
|
||||
# truth: legal_mcp/case_status_model.py — STATUS_ORDER/BY_KEY derive from it.
|
||||
case = await db.get_case_by_number(case_number)
|
||||
if not case:
|
||||
return err(f"תיק {case_number} לא נמצא.")
|
||||
@@ -363,6 +356,9 @@ async def case_update(
|
||||
# Only update if advancing or status is unknown to the order
|
||||
if new_idx >= cur_idx or new_idx == -1:
|
||||
fields["status"] = status
|
||||
# per-status on_enter hook (case_status_model) — the single place a
|
||||
# status's behaviour is declared. No dispatcher wired yet; when the
|
||||
# first action is added, dispatch BY_KEY[status].on_enter here.
|
||||
if title:
|
||||
fields["title"] = title
|
||||
if subject:
|
||||
|
||||
@@ -170,3 +170,30 @@ async def digest_process_pending(limit: int = 20) -> str:
|
||||
except Exception as e:
|
||||
return _err(str(e))
|
||||
return _ok(result)
|
||||
|
||||
|
||||
async def digest_radar(case_number: str, limit: int = 5, min_score: float = 0.45) -> str:
|
||||
"""רדאר-יומונים הקשרי-לתיק (X12) — "שים לב" ליו"ר.
|
||||
|
||||
מחזיר יומונים **לא-מקושרים** (פס"ד שעוד אין לנו בקורפוס) שהנושא שלהם קרוב
|
||||
סמנטית לתיק הזה — כדי שפס"ד רלוונטי שמוכר רק דרך יומון לא ייפול בין הכיסאות
|
||||
בזמן הכרעת התיק. נושא-התיק נבנה מ-title + appeal_subtype + טענות-הצדדים, ומותאם
|
||||
מול יומונים לא-מקושרים. כל ליד נושא את מראה-המקום של הפס"ד המקורי, סטטוס-הפער
|
||||
(new_lead / gap_open / fetched / available_link) ופעולה מוצעת.
|
||||
|
||||
INV-DIG1: זהו radar — היומון לעולם אינו מצוטט; הליד מצביע על **הפס"ד** (להזמין
|
||||
משיכה / להעלות / לקשר), לא על היומון. read-only.
|
||||
|
||||
Args:
|
||||
case_number: מספר התיק (למשל "8124-09-24").
|
||||
limit: מספר לידים מקסימלי.
|
||||
min_score: סף-דמיון סמנטי (0-1) לסינון רעש.
|
||||
"""
|
||||
if not case_number.strip():
|
||||
return _err("case_number חובה")
|
||||
try:
|
||||
result = await digest_library.case_digest_radar(
|
||||
case_number.strip(), limit=max(1, int(limit)), min_score=float(min_score))
|
||||
except Exception as e:
|
||||
return _err(str(e))
|
||||
return _ok(result)
|
||||
|
||||
@@ -264,6 +264,11 @@ async def document_get_text(case_number: str, doc_title: str = "") -> str:
|
||||
async def document_list(case_number: str) -> str:
|
||||
"""רשימת מסמכים בתיק.
|
||||
|
||||
כל מסמך כולל `doc_type`, וכן את הסיווג הנגזר `is_primary` (bool) ו-
|
||||
`doc_category` ("primary"/"secondary") — מסמך-עיקרי (ערר/תשובה/התנגדות/
|
||||
פרוטוקול/שומה/החלטת-ועדה) מול משני. נגזר מ-`doc_type` (db.PRIMARY_DOC_TYPES),
|
||||
אינו נכתב ידנית.
|
||||
|
||||
Args:
|
||||
case_number: מספר תיק הערר
|
||||
"""
|
||||
@@ -345,11 +350,15 @@ async def extract_claims(
|
||||
if not docs:
|
||||
return empty(f"אין מסמכים בתיק {case_number}.")
|
||||
|
||||
# Filter to claims documents (appeal, response) or specific doc
|
||||
# Filter to claims documents or a specific doc. protocol carries oral
|
||||
# arguments raised at the hearing — extracted with claim_type='protocol'
|
||||
# (claims_extractor._infer_claim_type) so analyze_protocol can compare them
|
||||
# against the written pleadings, while block ז (write_block_zayin) excludes
|
||||
# them to stay original-pleadings-only (INV-WR4).
|
||||
if doc_title:
|
||||
docs = [d for d in docs if doc_title.lower() in d["title"].lower()]
|
||||
else:
|
||||
docs = [d for d in docs if d["doc_type"] in ("appeal", "response", "objection")]
|
||||
docs = [d for d in docs if d["doc_type"] in ("appeal", "response", "objection", "protocol")]
|
||||
|
||||
if not docs:
|
||||
return empty("לא נמצאו כתבי טענות בתיק.")
|
||||
@@ -424,17 +433,24 @@ ALLOWED_DOC_TYPES = {
|
||||
# Allowed appraiser_side values; '' (empty) clears the tag.
|
||||
ALLOWED_APPRAISER_SIDES = {"committee", "appellant", "deciding", ""}
|
||||
|
||||
# Allowed protocol_scope values (protocol docs only); mirrors web/app.py.
|
||||
# appeal = ועדת הערר (default when absent) · lower = ועדה מקומית/מחוזית.
|
||||
ALLOWED_PROTOCOL_SCOPES = {"appeal", "lower"}
|
||||
|
||||
|
||||
async def document_update(
|
||||
case_number: str,
|
||||
doc_id: str,
|
||||
doc_type: str = "",
|
||||
appraiser_side: str = "",
|
||||
is_post_hearing: bool | None = None,
|
||||
protocol_scope: str = "",
|
||||
) -> str:
|
||||
"""עדכון תיוג מסמך — doc_type ו/או appraiser_side. ריק = אין שינוי.
|
||||
"""עדכון תיוג מסמך — doc_type / appraiser_side / is_post_hearing / protocol_scope.
|
||||
|
||||
הולידציה זהה ל-PATCH endpoint ב-web/app.py. appraiser_side נשמר ב-
|
||||
documents.metadata JSONB (מתפרסם משם ע"י extract_appraiser_facts).
|
||||
הולידציה זהה ל-PATCH endpoint ב-web/app.py. הדגלים נשמרים ב-
|
||||
documents.metadata JSONB (appraiser_side מתפרסם משם ע"י extract_appraiser_facts;
|
||||
is_post_hearing נצרך ע"י כותב בלוק-ח; protocol_scope מסווג פרוטוקול בטאב-הסקירה).
|
||||
|
||||
Args:
|
||||
case_number: מספר תיק הערר (לאישור שייכות)
|
||||
@@ -443,6 +459,9 @@ async def document_update(
|
||||
permit/appraisal/exhibit/objection/reference). ריק = אין שינוי.
|
||||
appraiser_side: ערך חדש (committee/appellant/deciding). ריק = אין שינוי;
|
||||
העבר במפורש מחרוזת ריקה לא-default אם רוצים לנקות.
|
||||
is_post_hearing: True = התקבל אחרי הדיון · False = מנקה את הדגל · None = אין שינוי.
|
||||
protocol_scope: היקף פרוטוקול (appeal=ועדת הערר / lower=ועדה מקומית-מחוזית).
|
||||
ריק = אין שינוי. רלוונטי רק כשהסוג protocol.
|
||||
"""
|
||||
case = await db.get_case_by_number(case_number)
|
||||
if not case:
|
||||
@@ -468,17 +487,37 @@ async def document_update(
|
||||
data={"allowed": sorted(ALLOWED_DOC_TYPES)})
|
||||
updates["doc_type"] = doc_type
|
||||
|
||||
# appraiser_side is optional. The MCP tool can't distinguish "skip" from
|
||||
# "set to empty string", so we use the convention: only update if non-empty.
|
||||
# To clear, the operator must edit metadata directly (rare).
|
||||
# appraiser_side / protocol_scope are optional. The MCP tool can't
|
||||
# distinguish "skip" from "set to empty string", so we use the convention:
|
||||
# only update if non-empty. To clear, edit metadata directly (rare).
|
||||
# is_post_hearing is a tri-state bool: None skips, True/False set/clear.
|
||||
metadata = doc.get("metadata") or {}
|
||||
if isinstance(metadata, str):
|
||||
metadata = json.loads(metadata)
|
||||
metadata_dirty = False
|
||||
|
||||
if appraiser_side:
|
||||
if appraiser_side not in ALLOWED_APPRAISER_SIDES:
|
||||
return err(f"appraiser_side לא תקין: {appraiser_side}",
|
||||
data={"allowed": sorted(s for s in ALLOWED_APPRAISER_SIDES if s)})
|
||||
metadata = doc.get("metadata") or {}
|
||||
if isinstance(metadata, str):
|
||||
metadata = json.loads(metadata)
|
||||
metadata["appraiser_side"] = appraiser_side
|
||||
metadata_dirty = True
|
||||
|
||||
if is_post_hearing is not None:
|
||||
if is_post_hearing:
|
||||
metadata["is_post_hearing"] = True
|
||||
else:
|
||||
metadata.pop("is_post_hearing", None)
|
||||
metadata_dirty = True
|
||||
|
||||
if protocol_scope:
|
||||
if protocol_scope not in ALLOWED_PROTOCOL_SCOPES:
|
||||
return err(f"protocol_scope לא תקין: {protocol_scope}",
|
||||
data={"allowed": sorted(ALLOWED_PROTOCOL_SCOPES)})
|
||||
metadata["protocol_scope"] = protocol_scope
|
||||
metadata_dirty = True
|
||||
|
||||
if metadata_dirty:
|
||||
updates["metadata"] = metadata
|
||||
|
||||
if not updates:
|
||||
|
||||
@@ -516,9 +516,18 @@ async def export_docx(case_number: str, output_path: str = "") -> str:
|
||||
|
||||
# ── Interim draft (pre-ruling) ────────────────────────────────────
|
||||
|
||||
# Blocks written for the interim draft, in display order.
|
||||
# Blocks written for the interim draft, in a FIXED order.
|
||||
# This is the same content the chair sees in the final decision (same template,
|
||||
# same skill, same prompts) — minus opening, ruling, summary, signatures.
|
||||
# same skill, same prompts, same single canonical write path — block_writer) —
|
||||
# minus ruling, summary, signatures.
|
||||
#
|
||||
# Determinism (#204 / WS5): the interim draft is STRUCTURALLY deterministic.
|
||||
# Each block is generated by block_writer.write_block, which now pins the model
|
||||
# (Opus 4.8) and a per-block reasoning effort, and uses fixed structural prompts
|
||||
# (e.g. block-he's opening is always "לפנינו ערר…"). The display order on export
|
||||
# is fixed separately by docx_exporter._INTERIM_BLOCK_ORDER. There is no parallel
|
||||
# generation path (G2): write_interim_draft is a thin orchestrator over the same
|
||||
# write_and_store_block used by the full decision.
|
||||
_INTERIM_BLOCKS = ["block-he", "block-vav", "block-tet", "block-zayin", "block-chet"]
|
||||
|
||||
|
||||
@@ -571,6 +580,86 @@ async def get_appraiser_facts(case_number: str) -> str:
|
||||
return err(str(e))
|
||||
|
||||
|
||||
async def analyze_protocol(case_number: str, document_id: str = "") -> str:
|
||||
"""ניתוח השוואתי של פרוטוקול-דיון מול כתבי-הטענות (WS4 / #203).
|
||||
|
||||
מזהה אילו טענות **ירדו** (נזנחו בדיון), אילו **חוזקו**, ואילו **עלו חדשות**,
|
||||
מחדד את השאלות המשפטיות, ומחלץ את נתוני הכותרת (א–ד) מהפרוטוקול. התוצאה נכנסת
|
||||
ל"ידע-התיק" (טבלת protocol_analysis), זמינה לסוכני הניתוח והכתיבה; תאריך-הדיון
|
||||
מוזן חזרה לעמודה הקנונית cases.hearing_date.
|
||||
|
||||
בוחר אוטומטית את פרוטוקול **ועדת-הערר** (protocol_scope שאינו 'lower');
|
||||
פרוטוקול ועדה-מקומית ('lower') אינו נכנס להשוואה. כשיש כמה פרוטוקולי-ערר —
|
||||
ציין document_id כדי לכוון לדיון המדויק (#223).
|
||||
|
||||
דורש פרוטוקול מתויג doc_type='protocol' + טיעונים מאוגדים
|
||||
(aggregate_claims_to_arguments). רץ עם Claude מקומי (Opus 4.8, effort=high);
|
||||
re-run מחליף את הניתוח הקודם לאותו פרוטוקול (idempotent).
|
||||
|
||||
Args:
|
||||
case_number: מספר תיק הערר
|
||||
document_id: מזהה מסמך-הפרוטוקול לכיוון מדויק (ריק = בחירה אוטומטית)
|
||||
"""
|
||||
from legal_mcp.services import protocol_analyzer
|
||||
|
||||
case = await db.get_case_by_number(case_number)
|
||||
if not case:
|
||||
return err(f"תיק {case_number} לא נמצא.")
|
||||
case_id = UUID(case["id"])
|
||||
target_doc_id: UUID | None = None
|
||||
if document_id.strip():
|
||||
try:
|
||||
target_doc_id = UUID(document_id.strip())
|
||||
except ValueError:
|
||||
return err(f"document_id לא תקין: {document_id}")
|
||||
try:
|
||||
result = await protocol_analyzer.analyze_protocol(
|
||||
case_id, target_document_id=target_doc_id,
|
||||
)
|
||||
await audit.log_action_safe(
|
||||
"analyze_protocol", case_id=case_id,
|
||||
details={"status": result.get("status"), "total": result.get("total", 0)},
|
||||
)
|
||||
return ok(result)
|
||||
except Exception as e:
|
||||
return err(str(e))
|
||||
|
||||
|
||||
async def get_protocol_analysis(case_number: str, change_type: str = "") -> str:
|
||||
"""קריאת ניתוח-הפרוטוקול שכבר חולץ — ללא הרצת ניתוח-מחדש (INV-TOOL4).
|
||||
|
||||
ה-get המקביל ל-analyze_protocol: מחזיר את רשומות ידע-התיק השמורות
|
||||
(ירדה/חוזקה/חדשה + שאלה-מחודדת + ציטוט-מבסס), בלי קריאת-LLM יקרה.
|
||||
מחזיר רשימה ריקה אם הניתוח טרם רץ (status=ok, count=0) — לא שגיאה.
|
||||
|
||||
Args:
|
||||
case_number: מספר תיק הערר
|
||||
change_type: סינון (dropped/strengthened/newly_raised). ריק = הכל.
|
||||
"""
|
||||
from legal_mcp.services import protocol_analyzer
|
||||
|
||||
case = await db.get_case_by_number(case_number)
|
||||
if not case:
|
||||
return err(f"תיק {case_number} לא נמצא.")
|
||||
if change_type and change_type not in protocol_analyzer.VALID_CHANGE_TYPES:
|
||||
return err(
|
||||
f"change_type לא תקין: {change_type}",
|
||||
data={"allowed": sorted(protocol_analyzer.VALID_CHANGE_TYPES)},
|
||||
)
|
||||
case_id = UUID(case["id"])
|
||||
try:
|
||||
rows = await db.list_protocol_analysis(
|
||||
case_id, change_type=change_type or None,
|
||||
)
|
||||
return ok({
|
||||
"case_number": case_number,
|
||||
"count": len(rows),
|
||||
"analysis": rows,
|
||||
})
|
||||
except Exception as e:
|
||||
return err(str(e))
|
||||
|
||||
|
||||
async def write_interim_draft(case_number: str, instructions: str = "") -> str:
|
||||
"""כתיבת ארבעת הבלוקים לטיוטת ביניים: רקע (ו), תכניות+היתרים (ט),
|
||||
טענות הצדדים (ז), הליכים (ח). אם לא חולצו עובדות שמאיות עדיין —
|
||||
@@ -627,7 +716,7 @@ async def write_interim_draft(case_number: str, instructions: str = "") -> str:
|
||||
async def export_interim_draft(case_number: str, output_path: str = "") -> str:
|
||||
"""ייצוא טיוטת ביניים ל-DOCX — אותו עיצוב של טיוטה רגילה (David, RTL,
|
||||
bookmarks), אבל בסדר חדש: רקע → תכניות+היתרים → טענות → הליכים, ללא
|
||||
דיון/סיכום/חתימות. שם הקובץ: טיוטת-ביניים-v{N}.docx.
|
||||
דיון/סיכום/חתימות. שם הקובץ: טיוטה-טענות_הצדדים_{N}.docx.
|
||||
|
||||
Args:
|
||||
case_number: מספר תיק הערר
|
||||
@@ -658,6 +747,34 @@ async def export_interim_draft(case_number: str, output_path: str = "") -> str:
|
||||
return err(str(e))
|
||||
|
||||
|
||||
async def summarize_party_claims(case_number: str, instructions: str = "") -> str:
|
||||
"""הפקת סיכום-מנהלים מזוקק של טענות הצדדים — מסמך פרוזה **נפרד מטיוטת-הביניים**,
|
||||
להכנת היו"ר לדיון בעל-פה. תמצית קצרה ומוקפדת (לא שכפול כתבי-הטענות), נגזרת
|
||||
מהטיעונים המאוגדים (legal_arguments) או מ-claims הגולמיים — אותו מקור-אמת,
|
||||
בלי חילוץ-מחדש. נשמר ל-data/cases/{n}/documents/research/ (git + S3) וניתן-לייצוא.
|
||||
|
||||
הייצור עובר claude_session (claude -p), נעוץ Opus 4.8 + effort=high. מתוחם
|
||||
לטענות-התיק בלבד (anti-hallucination) — אינו ממציא טענה/הלכה/עובדה שאינה בקלט.
|
||||
|
||||
Args:
|
||||
case_number: מספר תיק הערר
|
||||
instructions: הנחיות נוספות מהיו"ר (אופציונלי)
|
||||
"""
|
||||
from legal_mcp.services import party_claims_summary
|
||||
|
||||
case = await db.get_case_by_number(case_number)
|
||||
if not case:
|
||||
return err(f"תיק {case_number} לא נמצא.")
|
||||
case_id = UUID(case["id"])
|
||||
try:
|
||||
result = await party_claims_summary.summarize_party_claims(
|
||||
case_id, case_number, instructions,
|
||||
)
|
||||
return ok(result)
|
||||
except ValueError as e:
|
||||
return err(str(e))
|
||||
|
||||
|
||||
async def apply_user_edit(case_number: str, edit_filename: str) -> str:
|
||||
"""רישום עריכה שהעלה המשתמש כמקור האמת החדש של התיק.
|
||||
|
||||
|
||||
@@ -4,9 +4,18 @@ from __future__ import annotations
|
||||
|
||||
from uuid import UUID
|
||||
|
||||
from legal_mcp.services import argument_aggregator, db
|
||||
from legal_mcp.services import argument_aggregator, claims_extractor, db
|
||||
from legal_mcp.tools.envelope import empty, err, ok # GAP-48: SSoT envelope
|
||||
|
||||
# Party labels reused across this module (display + impact diff).
|
||||
_PARTY_HE = {
|
||||
"appellant": "עוררים",
|
||||
"respondent": "משיבים",
|
||||
"committee": "ועדה מקומית",
|
||||
"permit_applicant": "מבקשי היתר",
|
||||
"unknown": "צד לא מזוהה",
|
||||
}
|
||||
|
||||
|
||||
async def aggregate_claims_to_arguments(
|
||||
case_number: str,
|
||||
@@ -55,16 +64,9 @@ async def get_legal_arguments(
|
||||
)
|
||||
|
||||
# Group by party for nicer display.
|
||||
party_he = {
|
||||
"appellant": "עוררים",
|
||||
"respondent": "משיבים",
|
||||
"committee": "ועדה מקומית",
|
||||
"permit_applicant": "מבקשי היתר",
|
||||
"unknown": "צד לא מזוהה",
|
||||
}
|
||||
by_party: dict[str, list[dict]] = {}
|
||||
for a in args:
|
||||
label = party_he.get(a["party"], a["party"])
|
||||
label = _PARTY_HE.get(a["party"], a["party"])
|
||||
by_party.setdefault(label, []).append(a)
|
||||
|
||||
return ok({
|
||||
@@ -72,3 +74,147 @@ async def get_legal_arguments(
|
||||
"total": len(args),
|
||||
"by_party": by_party,
|
||||
})
|
||||
|
||||
|
||||
# ── Re-analysis with merge + impact diff (WS2 / #201) ───────────────
|
||||
|
||||
def _snapshot(args: list[dict]) -> dict:
|
||||
"""Build a comparable snapshot of aggregated arguments for the impact diff.
|
||||
|
||||
Captures, per party: the set of argument titles and a priority histogram —
|
||||
enough to show the chair what changed without dumping full bodies. The
|
||||
priority mix is the deterministic "recommendation" signal: it summarises the
|
||||
balance of threshold/substantive/procedural/relief arguments per side.
|
||||
"""
|
||||
by_party: dict[str, dict] = {}
|
||||
for a in args:
|
||||
party = a.get("party", "unknown")
|
||||
bucket = by_party.setdefault(party, {"titles": [], "priorities": {}})
|
||||
bucket["titles"].append((a.get("argument_title") or "").strip())
|
||||
pr = a.get("priority", "substantive")
|
||||
bucket["priorities"][pr] = bucket["priorities"].get(pr, 0) + 1
|
||||
return {"total": len(args), "by_party": by_party}
|
||||
|
||||
|
||||
def _impact_diff(before: dict, after: dict) -> dict:
|
||||
"""Diff two argument snapshots → a chair-facing before↔after summary.
|
||||
|
||||
Reports, per party, which argument titles were added/removed and how the
|
||||
priority mix (the "recommendation" balance) shifted. ``changed`` is a quick
|
||||
boolean the UI/chair can gate on. Nothing here is auto-applied — it is purely
|
||||
surfaced for the human gate (G10).
|
||||
"""
|
||||
parties = sorted(set(before["by_party"]) | set(after["by_party"]))
|
||||
per_party: list[dict] = []
|
||||
any_change = False
|
||||
for party in parties:
|
||||
b = before["by_party"].get(party, {"titles": [], "priorities": {}})
|
||||
a = after["by_party"].get(party, {"titles": [], "priorities": {}})
|
||||
b_titles, a_titles = set(b["titles"]), set(a["titles"])
|
||||
added = sorted(a_titles - b_titles)
|
||||
removed = sorted(b_titles - a_titles)
|
||||
prio_before = dict(sorted(b["priorities"].items()))
|
||||
prio_after = dict(sorted(a["priorities"].items()))
|
||||
changed = bool(added or removed or prio_before != prio_after)
|
||||
any_change = any_change or changed
|
||||
per_party.append({
|
||||
"party": party,
|
||||
"party_he": _PARTY_HE.get(party, party),
|
||||
"count_before": len(b["titles"]),
|
||||
"count_after": len(a["titles"]),
|
||||
"added_arguments": added,
|
||||
"removed_arguments": removed,
|
||||
"priority_before": prio_before,
|
||||
"priority_after": prio_after,
|
||||
"changed": changed,
|
||||
})
|
||||
return {
|
||||
"changed": any_change,
|
||||
"total_before": before["total"],
|
||||
"total_after": after["total"],
|
||||
"by_party": per_party,
|
||||
}
|
||||
|
||||
|
||||
async def reanalyze_claims(
|
||||
case_number: str,
|
||||
reanalyze_all_primary: bool = False,
|
||||
) -> str:
|
||||
"""ניתוח-מחדש מאחד של טענות — מחלץ ממסמכים-עיקריים חדשים/לא-נותחו בלבד,
|
||||
מאחד עם הטענות הקיימות (לא מוחק הכול), מריץ צבירה-מחדש, ומחזיר בדיקת-השפעה
|
||||
(diff טיעונים/המלצה לפני↔אחרי) ליו"ר.
|
||||
|
||||
Args:
|
||||
case_number: מספר תיק הערר.
|
||||
reanalyze_all_primary: True = לחלץ מחדש מכל המסמכים-העיקריים (ולא רק
|
||||
מאלה שטרם-נותחו). ברירת-מחדל False = רק מסמכים-עיקריים חדשים/לא-נותחו.
|
||||
|
||||
מנגנון האיחוד (לא force-delete): כל מסמך מחולץ דרך
|
||||
``claims_extractor.extract_and_store_claims``, ש-``store_claims`` שלו מחליף רק
|
||||
את טענות *אותו* מסמך (לפי ``source_document``) — כך טענות ממסמכים שכבר-נותחו
|
||||
נשמרות. הצבירה-מחדש (``aggregate_claims_to_arguments(force=True)``) מחשבת את
|
||||
הטיעונים מחדש מתוך **מערך-הטענות המאוחד השלם** — מסלול-החישוב הקנוני, לא מסלול
|
||||
מקביל (G2).
|
||||
"""
|
||||
case = await db.get_case_by_number(case_number)
|
||||
if not case:
|
||||
return err(f"תיק {case_number} לא נמצא.")
|
||||
|
||||
case_id = UUID(case["id"])
|
||||
|
||||
# 1. BEFORE snapshot — current aggregated arguments (the impact baseline).
|
||||
before_args = await argument_aggregator.get_legal_arguments(case_id)
|
||||
before = _snapshot(before_args)
|
||||
|
||||
# 2. Select PRIMARY documents to (re)extract. Default: only those not yet
|
||||
# analysed (the not-analysed flag). reanalyze_all_primary widens to every
|
||||
# primary doc. Source of truth for "primary" = is_primary (V47).
|
||||
if reanalyze_all_primary:
|
||||
all_docs = await db.list_documents(case_id)
|
||||
targets = [d for d in all_docs if d.get("is_primary")]
|
||||
else:
|
||||
targets = await db.primary_docs_not_analyzed(case_id)
|
||||
|
||||
if not targets:
|
||||
return ok({
|
||||
"case_number": case_number,
|
||||
"status": "no_pending_documents",
|
||||
"message": "אין מסמכים-עיקריים חדשים/לא-נותחו. לא בוצע ניתוח-מחדש.",
|
||||
"documents_analyzed": [],
|
||||
"impact": _impact_diff(before, before),
|
||||
})
|
||||
|
||||
# 3. Extract+merge claims from the selected documents only. Each call replaces
|
||||
# only that document's claims (merge), never the whole case (no force-delete).
|
||||
analyzed: list[dict] = []
|
||||
for doc in targets:
|
||||
text = await db.get_document_text(UUID(doc["id"]))
|
||||
if not text:
|
||||
await db.mark_document_claims_extracted(UUID(doc["id"]), status="no_claims")
|
||||
analyzed.append({"document": doc["title"], "status": "empty_text", "total": 0})
|
||||
continue
|
||||
res = await claims_extractor.extract_and_store_claims(
|
||||
case_id=case_id,
|
||||
document_id=UUID(doc["id"]),
|
||||
text=text,
|
||||
doc_type=doc["doc_type"],
|
||||
)
|
||||
analyzed.append({"document": doc["title"], **res})
|
||||
|
||||
# 4. Re-aggregate from the now-complete merged claim set. force=True is the
|
||||
# canonical recompute (deletes only legal_arguments, NOT claims) — same
|
||||
# path aggregate_claims_to_arguments always uses, not a fork.
|
||||
agg = await argument_aggregator.aggregate_claims_to_arguments(case_id, force=True)
|
||||
|
||||
# 5. AFTER snapshot + impact diff for the chair.
|
||||
after_args = await argument_aggregator.get_legal_arguments(case_id)
|
||||
after = _snapshot(after_args)
|
||||
impact = _impact_diff(before, after)
|
||||
|
||||
return ok({
|
||||
"case_number": case_number,
|
||||
"status": "completed",
|
||||
"documents_analyzed": analyzed,
|
||||
"aggregation": agg,
|
||||
"impact": impact,
|
||||
})
|
||||
|
||||
@@ -300,6 +300,20 @@ async def search_precedent_library(
|
||||
limit=limit,
|
||||
include_halachot=include_halachot,
|
||||
)
|
||||
# X11 Phase 2 (#154): attach the incoming-citation authority breakdown so the
|
||||
# research agent can WEIGH and ARGUE authority ("הלכה שאומצה ב-N החלטות ועדת-ערר")
|
||||
# — and steer clear of a precedent that committees repeatedly distinguished /
|
||||
# overruled. Batched: one query for the whole result page.
|
||||
try:
|
||||
ids = {str(r.get("case_law_id")) for r in results if r.get("case_law_id")}
|
||||
if ids:
|
||||
auth = await db.citation_authority([UUID(i) for i in ids])
|
||||
for r in results:
|
||||
cb = auth.get(str(r.get("case_law_id")))
|
||||
if cb:
|
||||
r["cited_by"] = cb
|
||||
except Exception: # noqa: BLE001 — authority is an additive signal; never break search
|
||||
pass
|
||||
elapsed_ms = int((time.perf_counter() - t0) * 1000)
|
||||
telemetry.log_search_bg(
|
||||
search_type="precedent_library",
|
||||
|
||||
@@ -46,8 +46,19 @@ async def workflow_status(case_number: str) -> str:
|
||||
"extraction": doc["extraction_status"],
|
||||
"chunks": chunk_map.get(doc["id"], 0),
|
||||
"pages": doc.get("page_count"),
|
||||
# WS2 / #201: primary/secondary + whether claims were analysed.
|
||||
"is_primary": doc.get("is_primary", False),
|
||||
"claims_analyzed": doc.get("claims_analyzed", False),
|
||||
})
|
||||
|
||||
# WS2 / #201: PRIMARY documents added after the analysis ran and not yet
|
||||
# included → the "not-analysed" condition that should prompt a merging
|
||||
# re-analysis (reanalyze_claims). Derived from is_primary + claims_extracted_at.
|
||||
pending_primary = await db.primary_docs_not_analyzed(case_id)
|
||||
primary_not_analyzed = [
|
||||
{"title": d["title"], "type": d["doc_type"]} for d in pending_primary
|
||||
]
|
||||
|
||||
# Check draft status
|
||||
from pathlib import Path
|
||||
from legal_mcp import config
|
||||
@@ -64,15 +75,19 @@ async def workflow_status(case_number: str) -> str:
|
||||
"documents": doc_status,
|
||||
"total_documents": len(docs),
|
||||
"total_chunks": sum(chunk_map.values()),
|
||||
"primary_docs_not_analyzed": primary_not_analyzed,
|
||||
"has_draft": has_draft,
|
||||
"draft_size_bytes": draft_size,
|
||||
"next_steps": _suggest_next_steps(case, docs, has_draft),
|
||||
"next_steps": _suggest_next_steps(case, docs, has_draft, primary_not_analyzed),
|
||||
}
|
||||
|
||||
return ok(status)
|
||||
|
||||
|
||||
def _suggest_next_steps(case: dict, docs: list, has_draft: bool) -> list[str]:
|
||||
def _suggest_next_steps(
|
||||
case: dict, docs: list, has_draft: bool,
|
||||
primary_not_analyzed: list | None = None,
|
||||
) -> list[str]:
|
||||
"""Suggest next steps based on case state."""
|
||||
steps = []
|
||||
doc_types = {d["doc_type"] for d in docs}
|
||||
@@ -85,6 +100,13 @@ def _suggest_next_steps(case: dict, docs: list, has_draft: bool) -> list[str]:
|
||||
if "response" not in doc_types:
|
||||
steps.append("העלה תשובת ועדה/משיבים")
|
||||
|
||||
# WS2 / #201: a primary document was added but not yet analysed.
|
||||
if primary_not_analyzed:
|
||||
titles = ", ".join(d["title"] for d in primary_not_analyzed)
|
||||
steps.append(
|
||||
f"מסמך-עיקרי לא-נותח ({titles}) — הרץ ניתוח-מחדש מאחד (reanalyze_claims)"
|
||||
)
|
||||
|
||||
pending = [d for d in docs if d["extraction_status"] == "pending"]
|
||||
if pending:
|
||||
steps.append(f"עיבוד {len(pending)} מסמכים ממתינים")
|
||||
@@ -394,13 +416,134 @@ async def record_chair_feedback(
|
||||
lesson_extracted=lesson_extracted,
|
||||
)
|
||||
|
||||
# Auto-flow chair-authored STYLE feedback to the writer (closes the dead
|
||||
# chair_feedback→lesson chain — 27 feedback rows had produced 0 lessons). The
|
||||
# chair is the highest authority, so a style correction she writes flows
|
||||
# immediately — the chair IS the gate. It rides the SAME discussion_rules channel
|
||||
# promote uses (db.append_global_rule, G2), reaching every block, without the
|
||||
# style_corpus coupling decision_lessons require. SUBSTANCE feedback
|
||||
# (missing_content/factual_error/other) is case-specific → recorded only.
|
||||
# (INV-LRN1 graduated gate; 07-learning §1.2.)
|
||||
_STYLE_FB = {"style", "wrong_tone", "wrong_structure"}
|
||||
flowed = 0
|
||||
if lesson_extracted.strip() and category in _STYLE_FB:
|
||||
try:
|
||||
flowed = await db.append_global_rule(
|
||||
"discussion_rules", "universal", [lesson_extracted.strip()],
|
||||
)
|
||||
except Exception as e:
|
||||
logger.warning("chair-feedback auto-flow failed for %s: %s", case_number, e)
|
||||
|
||||
msg = f"הערה נרשמה בהצלחה. קטגוריה: {category}."
|
||||
if flowed:
|
||||
msg += " הלקח (סגנון) זרם אוטומטית לכותב."
|
||||
return ok({
|
||||
"feedback_id": str(feedback_id),
|
||||
"flowed_to_writer": bool(flowed),
|
||||
"next_steps": [
|
||||
"כדי להפיק לקח מההערה, הפעל: analyze_chair_feedback",
|
||||
"כדי לסמן כמטופל: resolve_chair_feedback",
|
||||
],
|
||||
}, message=f"הערה נרשמה בהצלחה. קטגוריה: {category}.")
|
||||
}, message=msg)
|
||||
|
||||
|
||||
_CURATOR_FINDING_CATEGORIES = {"style", "structure", "lexicon", "tabular", "general"}
|
||||
# Agent tags ([סגנון]/[מבנה]/[לקסיקון משפטי]/[טבלאי]) → decision_lessons.category
|
||||
_CURATOR_TAG_TO_CATEGORY = {
|
||||
"סגנון": "style", "מבנה": "structure",
|
||||
"לקסיקון משפטי": "lexicon", "לקסיקון": "lexicon", "טבלאי": "tabular",
|
||||
}
|
||||
|
||||
|
||||
async def record_curator_findings(case_number: str, findings: list[dict]) -> str:
|
||||
"""לכידת ממצאי-האוצֵר כ-decision_lessons מובְנים (source='curator', proposed) — INV-LRN3.
|
||||
|
||||
האוצֵר מזהה דפוסי-סגנון בקריאת הסופי; עד כה הם חיו רק כהערה ארעית בערוץ-התגובות
|
||||
(אובד, לא נסקר). כאן הם נתפסים מבנית כך שיופיעו בטאב ״אוצֵר״ ויעברו שער-יו"ר (INV-LRN1/G10).
|
||||
האוצֵר נשאר read-only על התוכן — הרישום הוא הצעה הממתינה לאישור, לא שינוי-קול.
|
||||
|
||||
Args:
|
||||
case_number: מספר התיק הסופי (= decision_number בקורפוס-הסגנון).
|
||||
findings: רשימת ממצאים, כל אחד {"text": "...", "category"/"tag": "..."}.
|
||||
category ∈ style/structure/lexicon/tabular/general (או tag עברי).
|
||||
"""
|
||||
if not findings:
|
||||
return err("findings ריק — אין ממצאים לרשום.")
|
||||
corpus_id = await db.get_style_corpus_id_by_decision(case_number)
|
||||
if not corpus_id:
|
||||
return err(
|
||||
f"לא נמצאה רשומת style_corpus ל-{case_number} — ודא שהסופי נקלט לקורפוס-הסגנון "
|
||||
"(enroll_style_corpus) לפני רישום ממצאים."
|
||||
)
|
||||
# Dedup against lessons already on this corpus (any source) — re-running §A
|
||||
# must not pile duplicates (INV-LRN3 reliability).
|
||||
existing = {(_norm(r["lesson_text"])) for r in await db.list_decision_lessons(corpus_id)}
|
||||
written, skipped_dup, skipped_empty = [], 0, 0
|
||||
for f in findings:
|
||||
text = (f.get("text") or "").strip()
|
||||
if not text:
|
||||
skipped_empty += 1
|
||||
continue
|
||||
if _norm(text) in existing:
|
||||
skipped_dup += 1
|
||||
continue
|
||||
raw_cat = (f.get("category") or f.get("tag") or "general").strip()
|
||||
category = _CURATOR_TAG_TO_CATEGORY.get(raw_cat, raw_cat)
|
||||
if category not in _CURATOR_FINDING_CATEGORIES:
|
||||
category = "general"
|
||||
row = await db.add_decision_lesson(
|
||||
corpus_id,
|
||||
lesson_text=text,
|
||||
category=category,
|
||||
source="curator",
|
||||
created_by="curator",
|
||||
review_status="proposed",
|
||||
)
|
||||
if row:
|
||||
written.append(str(row["id"]))
|
||||
existing.add(_norm(text))
|
||||
return ok({
|
||||
"corpus_id": str(corpus_id),
|
||||
"written": len(written),
|
||||
"skipped_duplicate": skipped_dup,
|
||||
"skipped_empty": skipped_empty,
|
||||
"lesson_ids": written,
|
||||
}, message=(
|
||||
f"נרשמו {len(written)} ממצאי-אוצֵר (source=curator, ממתינים לשער-יו\"ר ב-/training). "
|
||||
f"{skipped_dup} כפילויות דולגו."
|
||||
))
|
||||
|
||||
|
||||
def _norm(s: str) -> str:
|
||||
"""Normalize lesson text for dedup — collapse whitespace, strip."""
|
||||
return " ".join((s or "").split())
|
||||
|
||||
|
||||
async def lesson_synthesize_pending(
|
||||
practice_area: str = "", category: str = "", apply: bool = True,
|
||||
) -> str:
|
||||
"""סינתזת-לקחים (#158 / INV-LRN8): ממזגת לקחי-סגנון חופפים ל"לקח-על" אחד עשיר ומוכלל,
|
||||
כך שהסט שזורם לכותב קטֵן ומשתבח (התקרה limit=15 מפסיקה לחתוך). מאשכלת לפי דמיון (cosine)
|
||||
בתוך shard של practice_area+category, ומסנתזת מעוגן-מקור (INV-AH) עם שער-drift.
|
||||
|
||||
Args:
|
||||
practice_area: לצמצם ל-shard אחד (ריק = כל התחומים).
|
||||
category: style/structure/lexicon/tabular (ריק = כל הקטגוריות).
|
||||
apply: True = כותב (לקח-על approved + מקורות→superseded); False = dry-run.
|
||||
"""
|
||||
from legal_mcp.services import lesson_synthesis
|
||||
shards = await lesson_synthesis.run_pending(practice_area, category, apply=apply)
|
||||
applied = sum(1 for s in shards for c in s["clusters"] if c.get("applied"))
|
||||
clusters = sum(len(s["clusters"]) for s in shards)
|
||||
return ok({
|
||||
"apply": apply,
|
||||
"shards": shards,
|
||||
"clusters_found": clusters,
|
||||
"synthesized": applied,
|
||||
}, message=(
|
||||
f"סינתזת-לקחים: {clusters} אשכולות ב-{len(shards)} shards · "
|
||||
f"{applied} לקחי-על {'נכתבו (approved)' if apply else 'דמו (dry-run)'}."
|
||||
))
|
||||
|
||||
|
||||
async def list_chair_feedback(
|
||||
|
||||
21
mcp-server/tests/test_adapter_profiles.py
Normal file
21
mcp-server/tests/test_adapter_profiles.py
Normal file
@@ -0,0 +1,21 @@
|
||||
"""Adapter-profile compatibility gates for Paperclip migration."""
|
||||
from __future__ import annotations
|
||||
|
||||
import importlib.util
|
||||
from pathlib import Path
|
||||
|
||||
_SCRIPT = Path(__file__).resolve().parents[2] / "scripts" / "adapter_profiles.py"
|
||||
_spec = importlib.util.spec_from_file_location("adapter_profiles", _SCRIPT)
|
||||
profiles = importlib.util.module_from_spec(_spec)
|
||||
_spec.loader.exec_module(profiles)
|
||||
|
||||
|
||||
def test_codex_local_profile_accepts_openai_model_ids():
|
||||
assert profiles.model_matches_provider("gpt-5.3-codex", "codex_local")
|
||||
assert profiles.model_matches_provider("o4-mini", "codex_local")
|
||||
assert profiles.model_matches_provider("codex-mini-latest", "codex_local")
|
||||
|
||||
|
||||
def test_codex_local_profile_rejects_foreign_model_ids():
|
||||
assert not profiles.model_matches_provider("claude-opus-4-8", "codex_local")
|
||||
assert not profiles.model_matches_provider("gemini-3.1-pro-preview", "codex_local")
|
||||
@@ -14,7 +14,9 @@ from lxml import etree
|
||||
from legal_mcp.services.docx_exporter import (
|
||||
_BOOKMARK_ID_START,
|
||||
HEBREW_FONT,
|
||||
TEMPLATE_PATH,
|
||||
_add_styled_paragraph,
|
||||
_clear_body,
|
||||
_insert_bookmark_end,
|
||||
_insert_bookmark_start,
|
||||
_mark_paragraph_rtl,
|
||||
@@ -168,6 +170,83 @@ def test_block_dalet_does_not_use_title_style() -> None:
|
||||
assert any("החלטה" in t for t in texts)
|
||||
|
||||
|
||||
def test_block_dalet_is_heading_only_ignores_db_content() -> None:
|
||||
"""ת2 — block-ד is the 'החלטה' heading marker, NOT a data block.
|
||||
|
||||
Whatever content sits in decision_blocks for block-dalet must be ignored;
|
||||
the only non-empty text line produced is the literal heading 'החלטה'.
|
||||
"""
|
||||
doc = Document()
|
||||
_write_block_to_docx(
|
||||
doc, "block-dalet", title="כותרת",
|
||||
content="נתון ישן שצריך להיות מתועלם\nשורה שנייה",
|
||||
)
|
||||
text_lines = [p.text for p in doc.paragraphs if p.text.strip()]
|
||||
assert text_lines == ["החלטה"], (
|
||||
f"block-dalet must render ONLY the heading 'החלטה', got {text_lines}"
|
||||
)
|
||||
|
||||
|
||||
# ── _clear_body strips ALL scaffolding (ת1 + ת3 root cause) ────────
|
||||
# The template ships 3 sample tables (header / panel / signatures). Removing
|
||||
# only <w:p> left them behind: header/panel tables injected block-א–ד data
|
||||
# never extracted from the protocol (ת1), and the signatures table floated to
|
||||
# the top against the header (ת3 — חתימות צמודות לבלוק-ד במקום בסוף). The
|
||||
# decision is rebuilt purely from decision_blocks (INV-EX1), so the template's
|
||||
# sample tables are stale scaffolding and must be cleared.
|
||||
|
||||
|
||||
def test_clear_body_removes_tables_and_leaves_only_sectpr() -> None:
|
||||
doc = Document(str(TEMPLATE_PATH))
|
||||
body = doc.element.body
|
||||
# Sanity: the template really ships sample tables (else this test is moot).
|
||||
assert len(body.findall(qn("w:tbl"))) > 0, "template expected to ship sample tables"
|
||||
|
||||
_clear_body(doc)
|
||||
|
||||
remaining = [c.tag.split("}")[-1] for c in list(body)]
|
||||
assert remaining == ["sectPr"], (
|
||||
f"_clear_body must leave only sectPr, got {remaining}"
|
||||
)
|
||||
assert len(body.findall(qn("w:tbl"))) == 0, "no template tables may survive"
|
||||
assert len(body.findall(qn("w:p"))) == 0, "no template paragraphs may survive"
|
||||
|
||||
|
||||
def test_signatures_block_renders_after_body_not_at_top() -> None:
|
||||
"""ת3 — block-yod-bet (חתימות) renders LAST, after a cleared body.
|
||||
|
||||
Regression for the bug where the leftover template signatures table sat at
|
||||
the top against the header table. After the _clear_body fix, signatures
|
||||
come only from block-yod-bet, which the export loop emits last in block
|
||||
order.
|
||||
"""
|
||||
doc = Document(str(TEMPLATE_PATH))
|
||||
_clear_body(doc)
|
||||
|
||||
# Emit a header block, a body block, then signatures last (canonical order).
|
||||
_write_block_to_docx(doc, "block-alef", title="", content="מדינת ישראל")
|
||||
_write_block_to_docx(doc, "block-vav", title="", content="רקע עובדתי\n1. המקרקעין.")
|
||||
_write_block_to_docx(
|
||||
doc, "block-yod-bet", title="",
|
||||
content='ניתנה פה אחד היום.\nדפנה תמיר, עו"ד',
|
||||
)
|
||||
|
||||
text_lines = [p.text for p in doc.paragraphs if p.text.strip()]
|
||||
assert text_lines[0] == "מדינת ישראל", text_lines
|
||||
# The signatures block (block-yod-bet) emits each line as its own paragraph,
|
||||
# so its content must occupy the document's tail — after the body block.
|
||||
body_idx = text_lines.index("רקע עובדתי")
|
||||
sig_idx = next(i for i, t in enumerate(text_lines) if "ניתנה פה אחד" in t)
|
||||
assert sig_idx > body_idx, (
|
||||
f"signatures must come AFTER the body, got tail={text_lines[-3:]}"
|
||||
)
|
||||
assert any("דפנה תמיר" in t for t in text_lines[sig_idx:]), text_lines[sig_idx:]
|
||||
# No template signatures table ("מזכירת ועדת ערר") leaked anywhere.
|
||||
assert all(
|
||||
"מזכירת ועדת ערר" not in (p.text or "") for p in doc.paragraphs
|
||||
), "template signatures-table text leaked into the body"
|
||||
|
||||
|
||||
# ── Heading overrides, numbered-list, dash strip ──────────────────
|
||||
|
||||
|
||||
|
||||
@@ -130,6 +130,16 @@ def _find_ins_with_runs(tree: etree._Element) -> etree._Element | None:
|
||||
return None
|
||||
|
||||
|
||||
def _find_enclosing_p(element: etree._Element) -> etree._Element | None:
|
||||
"""Walk up to the enclosing <w:p>."""
|
||||
cur = element
|
||||
while cur is not None:
|
||||
if cur.tag == _w("p"):
|
||||
return cur
|
||||
cur = cur.getparent()
|
||||
return None
|
||||
|
||||
|
||||
def test_insert_after_ins_has_author_and_date(sample_docx: Path, tmp_path: Path) -> None:
|
||||
out = tmp_path / "out.docx"
|
||||
rev = Revision(id="r1", type="insert_after",
|
||||
@@ -147,7 +157,10 @@ def test_insert_after_ins_has_author_and_date(sample_docx: Path, tmp_path: Path)
|
||||
assert date_str.endswith("Z") # ISO 8601 UTC
|
||||
|
||||
|
||||
def test_insert_after_uses_rtl_and_david(sample_docx: Path, tmp_path: Path) -> None:
|
||||
def test_insert_after_uses_rtl_and_template_style(sample_docx: Path, tmp_path: Path) -> None:
|
||||
"""INV-EX4: an inserted paragraph carries the template's named style via
|
||||
<w:pStyle> and an <w:rtl/> run marker — but does NOT hand-set rFonts/sz
|
||||
(font/size come from the style). jc is the canonical body 'both'."""
|
||||
out = tmp_path / "out.docx"
|
||||
rev = Revision(id="r1", type="insert_after",
|
||||
anchor_bookmark="block-alef", content="מוסף")
|
||||
@@ -162,10 +175,22 @@ def test_insert_after_uses_rtl_and_david(sample_docx: Path, tmp_path: Path) -> N
|
||||
assert run is not None
|
||||
rPr = run.find(_w("rPr"))
|
||||
assert rPr is not None
|
||||
# RTL marker preserved (so Word picks the style's cs=David slot)…
|
||||
assert rPr.find(_w("rtl")) is not None
|
||||
rFonts = rPr.find(_w("rFonts"))
|
||||
assert rFonts is not None
|
||||
assert rFonts.get(_w("ascii")) == "David"
|
||||
# …but NO hand-set font/size on the run (INV-EX4).
|
||||
assert rPr.find(_w("rFonts")) is None
|
||||
assert rPr.find(_w("sz")) is None
|
||||
assert rPr.find(_w("szCs")) is None
|
||||
|
||||
# The enclosing paragraph references a template style + canonical jc=both.
|
||||
para = _find_enclosing_p(ins)
|
||||
assert para is not None
|
||||
pPr = para.find(_w("pPr"))
|
||||
assert pPr is not None
|
||||
pStyle = pPr.find(_w("pStyle"))
|
||||
assert pStyle is not None and pStyle.get(_w("val")) # Normal → real styleId
|
||||
jc = pPr.find(_w("jc"))
|
||||
assert jc is not None and jc.get(_w("val")) == "both"
|
||||
|
||||
|
||||
# ── apply_tracked_revisions: insert_before ────────────────────────
|
||||
|
||||
76
mcp-server/tests/test_docx_template_single_source.py
Normal file
76
mcp-server/tests/test_docx_template_single_source.py
Normal file
@@ -0,0 +1,76 @@
|
||||
"""שומר INV-EX4 — מקור-תבנית-יחיד לכל מפיקי-מסמכי-ההחלטה.
|
||||
|
||||
כל מפיק של מסמך-Word הקשור-להחלטה חייב להחיל עיצוב דרך הסגנונות שמוגדרים
|
||||
בטמפלט היחיד (skills/docx/decision_template.docx), ולא לקבוע פונט/גודל ידנית
|
||||
(``rFonts`` / ``sz`` / ``szCs``) — אלה נגזרים מ-styles.xml של הטמפלט.
|
||||
|
||||
הטסט גורף את מודולי-המפיקים ונכשל אם נבנה אלמנט ``w:rFonts`` / ``w:sz`` /
|
||||
``w:szCs`` בקוד, אלא אם השורה נושאת את הסמן המפורש ``# INV-EX4-ok`` (חריג
|
||||
מתועד — למשל חיזוק גופן-התבנית עצמו David כעקיפת באג-RTL של Word).
|
||||
|
||||
ספ: docs/spec/06-export.md §INV-EX4.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from legal_mcp.services import (
|
||||
analysis_docx_exporter,
|
||||
docx_exporter,
|
||||
docx_reviser,
|
||||
docx_retrofit,
|
||||
)
|
||||
|
||||
# Every module that builds/edits a decision-related Word document.
|
||||
_PRODUCER_MODULES = [
|
||||
docx_exporter,
|
||||
analysis_docx_exporter,
|
||||
docx_reviser,
|
||||
docx_retrofit,
|
||||
]
|
||||
|
||||
# Construction (not lookup) of a hand-set font/size element:
|
||||
# OxmlElement("w:rFonts") (python-docx producers)
|
||||
# etree.SubElement(rPr, _w("sz")) (raw-lxml producer: docx_reviser)
|
||||
_HANDSET_RE = re.compile(
|
||||
r'OxmlElement\(\s*["\']w:(?:rFonts|sz|szCs)["\']'
|
||||
r'|SubElement\([^)]*_w\(\s*["\'](?:rFonts|sz|szCs)["\']'
|
||||
)
|
||||
|
||||
# Producers that build a document FROM SCRATCH must load the single template.
|
||||
# (docx_reviser/docx_retrofit operate on an already-templated existing doc.)
|
||||
_FROM_SCRATCH_MODULES = [docx_exporter, analysis_docx_exporter]
|
||||
|
||||
|
||||
def _module_path(module) -> Path:
|
||||
return Path(module.__file__)
|
||||
|
||||
|
||||
def test_no_handset_font_or_size_in_producers() -> None:
|
||||
"""INV-EX4: no hand-set rFonts/sz/szCs in any producer (only via the
|
||||
template's named styles), unless explicitly marked ``# INV-EX4-ok``."""
|
||||
violations: list[str] = []
|
||||
for module in _PRODUCER_MODULES:
|
||||
path = _module_path(module)
|
||||
for lineno, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1):
|
||||
if _HANDSET_RE.search(line) and "INV-EX4-ok" not in line:
|
||||
violations.append(f"{path.name}:{lineno}: {line.strip()}")
|
||||
assert not violations, (
|
||||
"INV-EX4 violation — hand-set font/size outside the template styles "
|
||||
"(use a named template style, or mark with # INV-EX4-ok):\n "
|
||||
+ "\n ".join(violations)
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("module", _FROM_SCRATCH_MODULES)
|
||||
def test_from_scratch_producers_load_the_single_template(module) -> None:
|
||||
"""INV-EX4: from-scratch producers reference the one template file."""
|
||||
source = _module_path(module).read_text(encoding="utf-8")
|
||||
assert "decision_template.docx" in source, (
|
||||
f"{_module_path(module).name} must load the single template "
|
||||
"skills/docx/decision_template.docx (INV-EX4)."
|
||||
)
|
||||
212
mcp-server/tests/test_party_claims_summary.py
Normal file
212
mcp-server/tests/test_party_claims_summary.py
Normal file
@@ -0,0 +1,212 @@
|
||||
"""Tests for the party-claims executive summary (#202, WS3).
|
||||
|
||||
Cover the deterministic, offline parts:
|
||||
- ``_build_arguments_context`` source selection: legal_arguments preferred,
|
||||
raw claims fallback, "none" when empty (G2 — single source, no re-extract).
|
||||
- ``summarize_party_claims`` pins Opus 4.8 + effort=high and grounds the
|
||||
prompt strictly in the case's own claims (anti-hallucination / INV-AH).
|
||||
- ``_render_markdown_body`` maps markdown headings/bullets onto template styles.
|
||||
|
||||
Generation itself (claude -p) is local-only and not exercised here — the
|
||||
claude_session call is monkeypatched.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
from uuid import uuid4
|
||||
|
||||
from legal_mcp.services import party_claims_summary as pcs
|
||||
|
||||
|
||||
def _run(coro):
|
||||
return asyncio.run(coro)
|
||||
|
||||
|
||||
# ── source selection (G2: arguments preferred, claims fallback) ────
|
||||
|
||||
|
||||
def test_arguments_preferred_over_claims(monkeypatch):
|
||||
cid = uuid4()
|
||||
|
||||
async def _get_args(_case_id):
|
||||
return [
|
||||
{"party": "appellant", "argument_title": "חריגת בנייה",
|
||||
"argument_body": "הבנייה חורגת מקו הבניין", "legal_topic": "קווי בניין"},
|
||||
{"party": "respondent", "argument_title": "התיישנות",
|
||||
"argument_body": "", "legal_topic": ""},
|
||||
]
|
||||
|
||||
async def _get_claims(_case_id, *a, **k): # must NOT be consulted
|
||||
raise AssertionError("claims fallback used despite arguments existing")
|
||||
|
||||
monkeypatch.setattr(pcs.argument_aggregator, "get_legal_arguments", _get_args)
|
||||
monkeypatch.setattr(pcs.db, "get_claims", _get_claims)
|
||||
|
||||
ctx, n, kind = _run(pcs._build_arguments_context(cid))
|
||||
assert kind == "arguments"
|
||||
assert n == 2
|
||||
assert "העוררים" in ctx and "המשיבים" in ctx
|
||||
assert "חריגת בנייה" in ctx
|
||||
|
||||
|
||||
def test_falls_back_to_claims_when_no_arguments(monkeypatch):
|
||||
cid = uuid4()
|
||||
|
||||
async def _no_args(_case_id):
|
||||
return []
|
||||
|
||||
async def _claims(_case_id, *a, **k):
|
||||
return [
|
||||
{"party_role": "appellant", "claim_text": "טענה אחת", "source_document": "appeal"},
|
||||
{"party_role": "respondent", "claim_text": "טענה שתיים", "source_document": "response"},
|
||||
]
|
||||
|
||||
monkeypatch.setattr(pcs.argument_aggregator, "get_legal_arguments", _no_args)
|
||||
monkeypatch.setattr(pcs.db, "get_claims", _claims)
|
||||
|
||||
ctx, n, kind = _run(pcs._build_arguments_context(cid))
|
||||
assert kind == "claims"
|
||||
assert n == 2
|
||||
assert "טענה אחת" in ctx
|
||||
|
||||
|
||||
def test_block_zayin_claims_excluded(monkeypatch):
|
||||
"""Decision-summary (block-zayin) claims are not original pleadings."""
|
||||
cid = uuid4()
|
||||
|
||||
async def _no_args(_case_id):
|
||||
return []
|
||||
|
||||
async def _claims(_case_id, *a, **k):
|
||||
return [
|
||||
{"party_role": "appellant", "claim_text": "מקורית", "source_document": "appeal"},
|
||||
{"party_role": "appellant", "claim_text": "מסיכום", "source_document": "block-zayin"},
|
||||
]
|
||||
|
||||
monkeypatch.setattr(pcs.argument_aggregator, "get_legal_arguments", _no_args)
|
||||
monkeypatch.setattr(pcs.db, "get_claims", _claims)
|
||||
|
||||
ctx, n, kind = _run(pcs._build_arguments_context(cid))
|
||||
assert kind == "claims"
|
||||
assert n == 1
|
||||
assert "מקורית" in ctx and "מסיכום" not in ctx
|
||||
|
||||
|
||||
def test_none_when_no_source(monkeypatch):
|
||||
cid = uuid4()
|
||||
monkeypatch.setattr(pcs.argument_aggregator, "get_legal_arguments",
|
||||
lambda _c: _aw([]))
|
||||
monkeypatch.setattr(pcs.db, "get_claims", lambda _c, *a, **k: _aw([]))
|
||||
ctx, n, kind = _run(pcs._build_arguments_context(cid))
|
||||
assert kind == "none" and n == 0 and ctx == ""
|
||||
|
||||
|
||||
async def _aw(v):
|
||||
return v
|
||||
|
||||
|
||||
# ── generation pins Opus 4.8 + high effort, grounded in claims ─────
|
||||
|
||||
|
||||
def test_summarize_pins_opus_and_high_effort(monkeypatch, tmp_path):
|
||||
cid = uuid4()
|
||||
captured: dict = {}
|
||||
|
||||
async def _get_case(_case_id):
|
||||
return {"case_number": "8125-09-24", "title": "t", "appellants": ["א"],
|
||||
"respondents": ["ב"], "subject": "היטל השבחה", "property_address": "",
|
||||
"appeal_type": "betterment_levy", "practice_area": "betterment_levy"}
|
||||
|
||||
async def _get_decision(_case_id):
|
||||
return None
|
||||
|
||||
async def _args(_case_id):
|
||||
return [{"party": "appellant", "argument_title": "X",
|
||||
"argument_body": "Y", "legal_topic": ""}]
|
||||
|
||||
async def _fake_query(prompt, *, timeout=None, model=None, effort=None, tools=None):
|
||||
captured["model"] = model
|
||||
captured["effort"] = effort
|
||||
captured["tools"] = tools
|
||||
captured["prompt"] = prompt
|
||||
return "## טענות העוררים\nתמצית."
|
||||
|
||||
async def _style(_practice_area=""):
|
||||
return "(style)"
|
||||
|
||||
monkeypatch.setattr(pcs.db, "get_case", _get_case)
|
||||
monkeypatch.setattr(pcs.db, "get_decision_by_case", _get_decision)
|
||||
monkeypatch.setattr(pcs.argument_aggregator, "get_legal_arguments", _args)
|
||||
monkeypatch.setattr(pcs.block_writer, "_build_style_context", _style)
|
||||
monkeypatch.setattr(pcs.claude_session, "query", _fake_query)
|
||||
monkeypatch.setattr(pcs.config, "find_case_dir", lambda cn: tmp_path / cn)
|
||||
monkeypatch.setattr(pcs.config, "DATA_DIR", tmp_path)
|
||||
|
||||
async def _mirror(*a, **k):
|
||||
return None
|
||||
monkeypatch.setattr(pcs.storage, "mirror", _mirror)
|
||||
monkeypatch.setattr(pcs.git_sync, "commit_and_push", lambda *a, **k: True)
|
||||
|
||||
result = _run(pcs.summarize_party_claims(cid, "8125-09-24"))
|
||||
|
||||
# The whole point of #202's generation-path constraint:
|
||||
assert captured["model"] == "claude-opus-4-8"
|
||||
assert captured["effort"] == "high"
|
||||
assert captured["tools"] == "" # prose, no tool_use
|
||||
# Grounded strictly in the case's own arguments (anti-hallucination).
|
||||
assert "אנטי-הזיה" in captured["prompt"]
|
||||
assert "Y" in captured["prompt"] # the actual argument body is in-context
|
||||
|
||||
assert result["source_kind"] == "arguments"
|
||||
out = (tmp_path / "8125-09-24" / "documents" / "research" / "party-claims-summary.md")
|
||||
assert out.exists()
|
||||
assert "סיכום-מנהלים" in out.read_text(encoding="utf-8")
|
||||
|
||||
|
||||
def test_summarize_raises_when_no_claims(monkeypatch, tmp_path):
|
||||
cid = uuid4()
|
||||
monkeypatch.setattr(pcs.db, "get_case", lambda _c: _aw({"case_number": "9000-01-25"}))
|
||||
monkeypatch.setattr(pcs.db, "get_decision_by_case", lambda _c: _aw(None))
|
||||
monkeypatch.setattr(pcs.argument_aggregator, "get_legal_arguments", lambda _c: _aw([]))
|
||||
monkeypatch.setattr(pcs.db, "get_claims", lambda _c, *a, **k: _aw([]))
|
||||
|
||||
try:
|
||||
_run(pcs.summarize_party_claims(cid, "9000-01-25"))
|
||||
raise AssertionError("expected ValueError on empty source")
|
||||
except ValueError as e:
|
||||
assert "טענות" in str(e)
|
||||
|
||||
|
||||
# ── markdown → DOCX rendering uses template heading styles ─────────
|
||||
|
||||
|
||||
def test_render_markdown_body_maps_styles():
|
||||
from docx import Document
|
||||
from legal_mcp.services import analysis_docx_exporter as ax
|
||||
|
||||
doc = Document()
|
||||
md = (
|
||||
"# כותרת ראשית\n\n"
|
||||
"---\n"
|
||||
"## טענות העוררים\n"
|
||||
"- טענה אחת\n"
|
||||
"1. סעיף ממוספר\n"
|
||||
"טקסט רגיל.\n"
|
||||
)
|
||||
ax._render_markdown_body(doc, md)
|
||||
styles = [p.style.name for p in doc.paragraphs]
|
||||
texts = [p.text for p in doc.paragraphs]
|
||||
# HR is skipped; headings become Heading styles.
|
||||
assert "כותרת ראשית" in texts
|
||||
assert "Heading 1" in styles # # / ## → Heading 1
|
||||
assert any("טענה אחת" in t for t in texts)
|
||||
assert not any(t.strip() in {"---", "#"} for t in texts)
|
||||
|
||||
|
||||
def test_next_version_is_prefix_scoped(tmp_path):
|
||||
from legal_mcp.services import analysis_docx_exporter as ax
|
||||
(tmp_path / "ניתוח-משפטי-v3.docx").write_bytes(b"x")
|
||||
# An analysis file at v3 must NOT bump the summary's version.
|
||||
assert ax._next_version(tmp_path, "סיכום-מנהלים-טענות") == 1
|
||||
assert ax._next_version(tmp_path, "ניתוח-משפטי") == 4
|
||||
200
mcp-server/tests/test_protocol_analyzer.py
Normal file
200
mcp-server/tests/test_protocol_analyzer.py
Normal file
@@ -0,0 +1,200 @@
|
||||
"""Tests for the comparative protocol analyzer (WS4 / #203).
|
||||
|
||||
Covers the pure (non-LLM, non-DB) logic: the anti-hallucination normalization
|
||||
gate, protocol-document discovery, claim_type tagging for protocols, and the
|
||||
block-ז filter that keeps oral hearing arguments out of the original-pleadings
|
||||
summary (INV-WR4).
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
from legal_mcp.services import protocol_analyzer as pa
|
||||
from legal_mcp.services.claims_extractor import _infer_claim_type
|
||||
|
||||
|
||||
# ── claim_type tagging — protocol distinct from written pleadings ───────────
|
||||
|
||||
@pytest.mark.parametrize("doc_type,title,expected", [
|
||||
("protocol", "פרוטוקול דיון", "protocol"),
|
||||
("appeal", "פרוטוקול הדיון מיום 1.1", "protocol"), # title-based
|
||||
("appeal", "כתב ערר", "claim"),
|
||||
("response", "כתב תשובה", "response"),
|
||||
("response", "תגובת המשיבה", "reply"),
|
||||
])
|
||||
def test_infer_claim_type(doc_type, title, expected):
|
||||
assert _infer_claim_type(doc_type, title) == expected
|
||||
|
||||
|
||||
# ── _find_protocol ─────────────────────────────────────────────────────────
|
||||
|
||||
def test_find_protocol_by_doc_type():
|
||||
docs = [
|
||||
{"id": "1", "doc_type": "appeal", "title": "כתב ערר"},
|
||||
{"id": "2", "doc_type": "protocol", "title": "פרוטוקול"},
|
||||
]
|
||||
assert pa._find_protocol(docs)["id"] == "2"
|
||||
|
||||
|
||||
def test_find_protocol_by_title_fallback():
|
||||
docs = [
|
||||
{"id": "1", "doc_type": "reference", "title": "פרוטוקול הדיון"},
|
||||
{"id": "2", "doc_type": "appeal", "title": "כתב ערר"},
|
||||
]
|
||||
assert pa._find_protocol(docs)["id"] == "1"
|
||||
|
||||
|
||||
def test_find_protocol_none():
|
||||
docs = [{"id": "1", "doc_type": "appeal", "title": "כתב ערר"}]
|
||||
assert pa._find_protocol(docs) is None
|
||||
|
||||
|
||||
def test_find_protocol_skips_lower_scope():
|
||||
# A local/district-committee protocol (scope='lower') must NOT be picked for
|
||||
# the hearing-vs-pleadings comparison; the ועדת-ערר one wins (#223).
|
||||
docs = [
|
||||
{"id": "lower", "doc_type": "protocol", "title": "נספח 18 — פרוטוקולי ועדה מקומית",
|
||||
"metadata": {"protocol_scope": "lower"}, "created_at": "2026-01-01"},
|
||||
{"id": "appeal", "doc_type": "protocol", "title": "פרוטוקול דיון 23.6.26",
|
||||
"metadata": {}, "created_at": "2026-06-23"},
|
||||
]
|
||||
assert pa._find_protocol(docs)["id"] == "appeal"
|
||||
|
||||
|
||||
def test_find_protocol_all_lower_returns_none():
|
||||
# If every protocol is lower-scoped there is no ערר-hearing to compare.
|
||||
docs = [
|
||||
{"id": "1", "doc_type": "protocol", "title": "פרוטוקול מקומי",
|
||||
"metadata": {"protocol_scope": "lower"}},
|
||||
]
|
||||
assert pa._find_protocol(docs) is None
|
||||
|
||||
|
||||
def test_find_protocol_prefers_most_recent_appeal():
|
||||
docs = [
|
||||
{"id": "old", "doc_type": "protocol", "title": "פרוטוקול א",
|
||||
"metadata": {}, "created_at": "2026-03-01"},
|
||||
{"id": "new", "doc_type": "protocol", "title": "פרוטוקול ב",
|
||||
"metadata": {}, "created_at": "2026-06-23"},
|
||||
]
|
||||
assert pa._find_protocol(docs)["id"] == "new"
|
||||
|
||||
|
||||
def test_find_protocol_explicit_document_id_overrides():
|
||||
# Explicit target wins even over scope/recency heuristics — including the
|
||||
# ability to point at a lower-scoped doc if the caller insists.
|
||||
docs = [
|
||||
{"id": "aaaaaaaa-0000-0000-0000-000000000001", "doc_type": "protocol",
|
||||
"title": "פרוטוקול ערר", "metadata": {}, "created_at": "2026-06-23"},
|
||||
{"id": "aaaaaaaa-0000-0000-0000-000000000002", "doc_type": "protocol",
|
||||
"title": "פרוטוקול מקומי", "metadata": {"protocol_scope": "lower"},
|
||||
"created_at": "2026-01-01"},
|
||||
]
|
||||
from uuid import UUID
|
||||
picked = pa._find_protocol(
|
||||
docs, document_id=UUID("aaaaaaaa-0000-0000-0000-000000000002"),
|
||||
)
|
||||
assert picked["id"] == "aaaaaaaa-0000-0000-0000-000000000002"
|
||||
|
||||
|
||||
def test_find_protocol_unknown_document_id_returns_none():
|
||||
from uuid import UUID
|
||||
docs = [
|
||||
{"id": "aaaaaaaa-0000-0000-0000-000000000001", "doc_type": "protocol",
|
||||
"title": "פרוטוקול", "metadata": {}},
|
||||
]
|
||||
assert pa._find_protocol(
|
||||
docs, document_id=UUID("bbbbbbbb-0000-0000-0000-000000000009"),
|
||||
) is None
|
||||
|
||||
|
||||
# ── _normalize_change — anti-hallucination gate (INV-AH) ───────────────────
|
||||
|
||||
_AID = "11111111-1111-1111-1111-111111111111"
|
||||
|
||||
|
||||
def test_normalize_change_valid():
|
||||
row = pa._normalize_change(
|
||||
{
|
||||
"change_type": "dropped",
|
||||
"party_role": "appellant",
|
||||
"argument_id": _AID,
|
||||
"argument_title": "טענת השיהוי",
|
||||
"summary": "העורר ויתר על הטענה בדיון.",
|
||||
"sharpened_question": "האם נותרה טענת סף?",
|
||||
"evidence_quote": "ב\"כ העורר: איננו עומדים על טענת השיהוי.",
|
||||
"page_number": 3,
|
||||
},
|
||||
valid_argument_ids={_AID},
|
||||
)
|
||||
assert row is not None
|
||||
assert row["change_type"] == "dropped"
|
||||
assert str(row["argument_id"]) == _AID
|
||||
assert row["page_number"] == 3
|
||||
|
||||
|
||||
def test_normalize_change_drops_row_without_evidence_quote():
|
||||
# quote-or-retract: no verbatim support → row is rejected at source.
|
||||
row = pa._normalize_change(
|
||||
{"change_type": "strengthened", "summary": "חוזקה", "evidence_quote": ""},
|
||||
valid_argument_ids=set(),
|
||||
)
|
||||
assert row is None
|
||||
|
||||
|
||||
def test_normalize_change_drops_row_without_summary():
|
||||
row = pa._normalize_change(
|
||||
{"change_type": "dropped", "summary": "", "evidence_quote": "ציטוט"},
|
||||
valid_argument_ids=set(),
|
||||
)
|
||||
assert row is None
|
||||
|
||||
|
||||
def test_normalize_change_rejects_bad_change_type():
|
||||
row = pa._normalize_change(
|
||||
{"change_type": "modified", "summary": "x", "evidence_quote": "y"},
|
||||
valid_argument_ids=set(),
|
||||
)
|
||||
assert row is None
|
||||
|
||||
|
||||
def test_normalize_change_drops_hallucinated_argument_id():
|
||||
# An argument_id that isn't one of this case's arguments must be dropped
|
||||
# (FK safety) — but the row itself, being newly_raised-shaped, survives.
|
||||
row = pa._normalize_change(
|
||||
{
|
||||
"change_type": "newly_raised",
|
||||
"party_role": "respondent",
|
||||
"argument_id": "99999999-9999-9999-9999-999999999999",
|
||||
"summary": "סוגיה חדשה שעלתה בדיון.",
|
||||
"evidence_quote": "ב\"כ המשיבה העלה לראשונה את שאלת הסמכות.",
|
||||
},
|
||||
valid_argument_ids={_AID},
|
||||
)
|
||||
assert row is not None
|
||||
assert row["argument_id"] is None
|
||||
assert row["change_type"] == "newly_raised"
|
||||
|
||||
|
||||
def test_normalize_change_invalid_party_role_blanked():
|
||||
row = pa._normalize_change(
|
||||
{
|
||||
"change_type": "strengthened",
|
||||
"party_role": "judge", # not a valid party
|
||||
"summary": "חוזקה הטענה.",
|
||||
"evidence_quote": "ציטוט מבסס.",
|
||||
},
|
||||
valid_argument_ids=set(),
|
||||
)
|
||||
assert row is not None
|
||||
assert row["party_role"] == ""
|
||||
|
||||
|
||||
def test_normalize_change_truncates_quote():
|
||||
long_quote = "א" * 500
|
||||
row = pa._normalize_change(
|
||||
{"change_type": "dropped", "summary": "x", "evidence_quote": long_quote},
|
||||
valid_argument_ids=set(),
|
||||
)
|
||||
assert row is not None
|
||||
assert len(row["evidence_quote"]) == 200
|
||||
76
mcp-server/tests/test_reanalyze_impact_diff.py
Normal file
76
mcp-server/tests/test_reanalyze_impact_diff.py
Normal file
@@ -0,0 +1,76 @@
|
||||
"""Unit tests for the re-analysis impact diff — WS2 / task #201.
|
||||
|
||||
`_snapshot` + `_impact_diff` are pure functions (no DB) that produce the
|
||||
before↔after summary surfaced to the chair after a merging re-analysis. They
|
||||
must report per-party argument titles added/removed and the shift in the
|
||||
priority ("recommendation balance") mix, and set ``changed`` correctly.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from legal_mcp.tools.legal_arguments import _impact_diff, _snapshot
|
||||
|
||||
|
||||
def _arg(party, title, priority="substantive"):
|
||||
return {"party": party, "argument_title": title, "priority": priority}
|
||||
|
||||
|
||||
def test_no_change_is_flagged_false():
|
||||
args = [_arg("appellant", "זכות עמידה"), _arg("committee", "שיהוי")]
|
||||
snap = _snapshot(args)
|
||||
diff = _impact_diff(snap, snap)
|
||||
assert diff["changed"] is False
|
||||
assert diff["total_before"] == diff["total_after"] == 2
|
||||
# Every party entry reports changed=False.
|
||||
assert all(p["changed"] is False for p in diff["by_party"])
|
||||
|
||||
|
||||
def test_added_argument_detected():
|
||||
before = _snapshot([_arg("appellant", "זכות עמידה")])
|
||||
after = _snapshot([_arg("appellant", "זכות עמידה"), _arg("appellant", "תחולת תמא 38")])
|
||||
diff = _impact_diff(before, after)
|
||||
assert diff["changed"] is True
|
||||
assert diff["total_before"] == 1
|
||||
assert diff["total_after"] == 2
|
||||
appellant = next(p for p in diff["by_party"] if p["party"] == "appellant")
|
||||
assert appellant["added_arguments"] == ["תחולת תמא 38"]
|
||||
assert appellant["removed_arguments"] == []
|
||||
assert appellant["party_he"] == "עוררים"
|
||||
|
||||
|
||||
def test_removed_argument_detected():
|
||||
before = _snapshot([_arg("committee", "שיהוי"), _arg("committee", "סמכות")])
|
||||
after = _snapshot([_arg("committee", "שיהוי")])
|
||||
diff = _impact_diff(before, after)
|
||||
committee = next(p for p in diff["by_party"] if p["party"] == "committee")
|
||||
assert committee["removed_arguments"] == ["סמכות"]
|
||||
assert committee["count_before"] == 2
|
||||
assert committee["count_after"] == 1
|
||||
assert diff["changed"] is True
|
||||
|
||||
|
||||
def test_priority_mix_shift_is_a_change():
|
||||
# Same title, but priority moved threshold -> substantive: the recommendation
|
||||
# balance shifted, so the chair must see a change even with identical titles.
|
||||
before = _snapshot([_arg("appellant", "סמכות", priority="threshold")])
|
||||
after = _snapshot([_arg("appellant", "סמכות", priority="substantive")])
|
||||
diff = _impact_diff(before, after)
|
||||
appellant = next(p for p in diff["by_party"] if p["party"] == "appellant")
|
||||
assert appellant["added_arguments"] == []
|
||||
assert appellant["removed_arguments"] == []
|
||||
assert appellant["priority_before"] == {"threshold": 1}
|
||||
assert appellant["priority_after"] == {"substantive": 1}
|
||||
assert appellant["changed"] is True
|
||||
assert diff["changed"] is True
|
||||
|
||||
|
||||
def test_new_party_appears():
|
||||
before = _snapshot([_arg("appellant", "זכות עמידה")])
|
||||
after = _snapshot([_arg("appellant", "זכות עמידה"), _arg("respondent", "מענה")])
|
||||
diff = _impact_diff(before, after)
|
||||
parties = {p["party"] for p in diff["by_party"]}
|
||||
assert parties == {"appellant", "respondent"}
|
||||
respondent = next(p for p in diff["by_party"] if p["party"] == "respondent")
|
||||
assert respondent["count_before"] == 0
|
||||
assert respondent["count_after"] == 1
|
||||
assert respondent["added_arguments"] == ["מענה"]
|
||||
@@ -207,8 +207,9 @@ def test_multiple_revisions_all_tracked_independently(tmp_path: Path) -> None:
|
||||
|
||||
|
||||
def test_rtl_preserved_in_tracked_insertion(tmp_path: Path) -> None:
|
||||
"""Inserted paragraph must have bidi + rtl + David font so it renders
|
||||
correctly in Word alongside the user's content."""
|
||||
"""Inserted paragraph must have bidi + an <w:rtl/> run marker so Hebrew
|
||||
renders via the template's cs=David slot — but font/size come from the
|
||||
template's named paragraph style (INV-EX4), not hand-set rFonts/sz."""
|
||||
user_file = tmp_path / "user.docx"
|
||||
_make_user_edited_docx(user_file)
|
||||
docx_retrofit.retrofit_bookmarks(user_file, backup=False)
|
||||
@@ -229,9 +230,10 @@ def test_rtl_preserved_in_tracked_insertion(tmp_path: Path) -> None:
|
||||
if any("עברית RTL" in (t.text or "") for t in text_els):
|
||||
rPr = r.find(_w("rPr"))
|
||||
assert rPr is not None
|
||||
# RTL marker preserved…
|
||||
assert rPr.find(_w("rtl")) is not None
|
||||
rFonts = rPr.find(_w("rFonts"))
|
||||
assert rFonts is not None
|
||||
assert rFonts.get(_w("ascii")) == "David"
|
||||
# …but NO hand-set font/size on the run (INV-EX4).
|
||||
assert rPr.find(_w("rFonts")) is None
|
||||
assert rPr.find(_w("sz")) is None
|
||||
return
|
||||
pytest.fail("tracked insertion with 'עברית RTL' not found")
|
||||
|
||||
145
scripts/.archive/exec_summary_1043.py
Normal file
145
scripts/.archive/exec_summary_1043.py
Normal file
@@ -0,0 +1,145 @@
|
||||
"""Ad-hoc: executive summary (סיכום מנהלים) DOCX for case 1043-02-26.
|
||||
Reuses the dafna decision template styles (David font + RTL) via the
|
||||
analysis_docx_exporter helpers. One-off prep document for chaim's meeting
|
||||
with the chair — NOT a decision draft.
|
||||
"""
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "mcp-server" / "src"))
|
||||
|
||||
from docx import Document
|
||||
from legal_mcp.services.analysis_docx_exporter import (
|
||||
TEMPLATE_PATH,
|
||||
_clear_body,
|
||||
_add_paragraph,
|
||||
_add_runs_with_inline_bold,
|
||||
_mark_paragraph_rtl,
|
||||
_mark_run_rtl,
|
||||
)
|
||||
|
||||
CASE = "1043-02-26"
|
||||
OUT = Path(f"/home/chaim/legal-ai/data/cases/{CASE}/exports/סיכום-מנהלים-v1.docx")
|
||||
|
||||
|
||||
def H1(doc, t):
|
||||
_add_paragraph(doc, t, "Heading 1")
|
||||
|
||||
|
||||
def H2(doc, t):
|
||||
_add_paragraph(doc, t, "Heading 2")
|
||||
|
||||
|
||||
def P(doc, t):
|
||||
p = doc.add_paragraph(style="Normal")
|
||||
_add_runs_with_inline_bold(p, t)
|
||||
_mark_paragraph_rtl(p)
|
||||
return p
|
||||
|
||||
|
||||
def BULLET(doc, t):
|
||||
p = doc.add_paragraph(style="List Paragraph")
|
||||
_add_runs_with_inline_bold(p, t)
|
||||
_mark_paragraph_rtl(p)
|
||||
return p
|
||||
|
||||
|
||||
def LABEL(doc, label, value):
|
||||
p = doc.add_paragraph(style="Normal")
|
||||
r = p.add_run(label + ": ")
|
||||
r.bold = True
|
||||
_mark_run_rtl(r)
|
||||
r2 = p.add_run(value)
|
||||
_mark_run_rtl(r2)
|
||||
_mark_paragraph_rtl(p)
|
||||
return p
|
||||
|
||||
|
||||
def main():
|
||||
doc = Document(str(TEMPLATE_PATH))
|
||||
_clear_body(doc)
|
||||
|
||||
H1(doc, "סיכום מנהלים — הכנה לדיון")
|
||||
P(doc, "**ערר 1043-02-26 — הקמת מתקן למיון פסולת (אתר \"קומפוסט דלילה\", תכנית מי/1030)**")
|
||||
P(doc, "מסמך הכנה פנימי לקראת דיון עם יו\"ר הוועדה. אינו החלטה ואינו טיוטת החלטה.")
|
||||
|
||||
H2(doc, "פרטי התיק")
|
||||
LABEL(doc, "סוג הערר", "רישוי ובנייה (1xxx) — ערר על סירוב בקשה להיתר")
|
||||
LABEL(doc, "עוררים (מבקשי ההיתר)", "קיבוץ נחשון; חברת אלקטרה אקו גרין פארק")
|
||||
LABEL(doc, "משיבים", "הוועדה המקומית מטה יהודה; מושבי גפן/תירוש/כפר הריף; קיבוצי כפר מנחם/רבדים; מועצה אזורית יואב (מתנגדים)")
|
||||
LABEL(doc, "מושא הערר", "החלטת הוועדה המקומית מטה יהודה מיום 9.2.26 לסרב לבקשה (מס' 20240972)")
|
||||
LABEL(doc, "המקרקעין", "גוש 5093 ח\"ל 4 מגרש 1, אתר \"דלילה\" (~137 דונם), מצפון לכפר מנחם, ליד כביש 383")
|
||||
LABEL(doc, "תקן ביקורת", "ועדת הערר כמוסד תכנון בעל סמכות מקורית — שיקול דעת תכנוני עצמאי; ביקורת רחבה יותר בחלק המשפטי-פרשני")
|
||||
|
||||
H2(doc, "מהות המחלוקת")
|
||||
P(doc, "מבקשי ההיתר מבקשים להקים מתקן מיון פסולת/קומפוסטציה הכולל מבנה קומפוסטציה אחוד (~19,118 מ\"ר עיקרי), משטחי הבשלה פתוחים ובריכה תפעולית, בצירוף שתי הקלות: הגבהת גובה מ-8 ל-20 מ', והגדלת תכסית מ-3.5% ל-22%. הוועדה המקומית סירבה, בקובעה כי השינוי מהותי ומקומו בעדכון התכנית ולא בהליך רישוי. השאלה המרכזית: האם הבקשה תואמת את תכנית מי/1030, או חורגת ממנה באופן המחייב תיקון תכנית.")
|
||||
|
||||
H2(doc, "החלטת הוועדה המקומית (מושא הערר)")
|
||||
P(doc, "**דחתה** את טענת המתנגדים לפקיעת התכנית (בהסתמך על ע\"א 3213/97 נקר) ואת טענת השימושים האסורים.")
|
||||
P(doc, "**קיבלה** והפכה לבסיס הסירוב: (1) היקף הבינוי חורג משלב א' לפי הוראת השלביות; (2) הבינוי המונוליטי שונה דרמטית מנספח הבינוי; (3) משטחי ההבשלה הפתוחים מנוגדים לסעיף 6.9 (טיפול במבנים סגורים) — שהפרתו מוגדרת בתכנית כסטייה ניכרת.")
|
||||
|
||||
H2(doc, "טענות סף (לדיון תמציתי)")
|
||||
BULLET(doc, "**פקיעת תכנית** — סעיף הפקיעה (5 שנים) הושמט מהנוסח המאושר (ראו ממצאי ניתוח-העומק).")
|
||||
BULLET(doc, "**מיצוי התנגדות / \"מועד ב'\"** — האם טענות שהוכרעו בשלב התכנית מועלות מחדש בשלב הרישוי.")
|
||||
BULLET(doc, "**זכות עמידה** — מועד חתימת חוזה החכירה מול מועד פתיחת הבקשה (הוכרע: קיבוץ נחשון חוכר רשום).")
|
||||
BULLET(doc, "**פגמי פרסום / היעדר יידוע** (ס' 149(א)(2א)) — היעדר תשריט, אי-יידוע ועדה מקומית יואב.")
|
||||
BULLET(doc, "**איחור בהגשת ההתנגדויות** — מול אינטרס ההסתמכות (רכישת קרקע ב-35 מיליון ₪).")
|
||||
|
||||
H2(doc, "חמש הסוגיות המהותיות")
|
||||
|
||||
P(doc, "**סוגיה 1 (מכריעה) — שלביות הביצוע: בינוי מול היקף פעילות**")
|
||||
BULLET(doc, "השאלה: האם הוראת השלביות (ס' 7.1) חלה על הבינוי הפיזי או רק על היקף ההפעלה?")
|
||||
BULLET(doc, "עמדות: עוררים — נוגעת להיקף הפעילות; ועדה/משיבים — חלה על הבינוי (4 מבנים ≈ 8,000 מ\"ר מול ~19,118 מבוקשים).")
|
||||
BULLET(doc, "לאן נוטה: **לטובת הוועדה** — לשון \"הקמת 4 מבני קומפוסט\" מתייחסת לבינוי; נספחים 06, 11 מצביעים על מנגנון פיילוט מדורג מהותי.")
|
||||
BULLET(doc, "תקדים: עע\"מ 10089/07 אירוס הגלבוע (אין לעקוף תכנון נדרש דרך היתר).")
|
||||
|
||||
P(doc, "**סוגיה 2 (מכריעה) — משטחי ההבשלה וסעיף 6.9: \"טיפול\" מול \"אחסון\"**")
|
||||
BULLET(doc, "השאלה: האם ההבשלה הפתוחה היא \"טיפול\" החוסה תחת 6.9 (→ סטייה ניכרת החוסמת הקלה, ס' 151), או \"אחסון\"?")
|
||||
BULLET(doc, "עמדות: עוררים (ד\"ר ענבר, נספח 22) — אחסון מוצר סופי נטול ריח; ועדה — חלק בלתי נפרד מהטיפול.")
|
||||
BULLET(doc, "לאן נוטה: **נחלשה לוועדה** — נספח 07 §122-127: ועדת המשנה לעררים אישרה הבשלה פתוחה כ\"נכון וסביר\" (אך כינתה זאת \"שלב אחרון של טיפול\"). מתח פרשני אמיתי.")
|
||||
BULLET(doc, "תקדים: עע\"מ 402/03 עמותת העצמאים (ס' 151 — סטייה ניכרת).")
|
||||
|
||||
P(doc, "**סוגיה 3 — ההקלות בגובה ובתכסית + טענת \"טעות סופר\"**")
|
||||
BULLET(doc, "השאלה: האם ההקלות בגדרי הקלה או סטייה ניכרת? והאם התכסית 3.5% היא \"טעות סופר\"?")
|
||||
BULLET(doc, "לאן נוטה: טענת טעות הסופר **התחזקה מאוד** — נספח 12 (מופקד) מראה ש-3.5% נגזרה מתפיסה שהחממות \"אינן שטח לבניה\"; נספחים 06 §14 ו-07 §130 הורו לתקן; הסכם רמ\"י נוקב ב-30,280 מ\"ר.")
|
||||
BULLET(doc, "תקדים: עמ\"נ 25955-11-22 ברק-רחביה (פרשנות הרמונית); בג\"ץ 2667/17 מטה בנימין (\"פרשנות אפשרית\").")
|
||||
|
||||
P(doc, "**סוגיה 4 — תצורת הבינוי מול נספח בינוי מנחה ונספח נופי מחייב**")
|
||||
BULLET(doc, "השאלה: האם המבנה המונוליטי + הבריכה חורגים ממרחב הגמישות של נספח מנחה, לנוכח הנספח הנופי המחייב?")
|
||||
BULLET(doc, "תקדים: **ערר 1033-25 אבו גוש** (תקדים דפנה ישיר — נספח בינוי מנחה אינו המלצה בלבד); בג\"ץ 6525/15 עמק שווה.")
|
||||
|
||||
P(doc, "**סוגיה 5 — שיקולים זרים / NIMBY בהחלטת הסירוב**")
|
||||
BULLET(doc, "השאלה: האם הסירוב נגוע בשיקולים זרים? (עשוי להתייתר אם הבחינה העצמאית מכריעה).")
|
||||
BULLET(doc, "לאן נוטה: **נתמך בראיות** — תמליל (נספח 19, \"ועדה פוליטית\") + הצוות המקצועי המליץ לאשר (נספח 17). מנגד — בסיס מהותי לא-NIMBY (נספחים 25, 30).")
|
||||
|
||||
H2(doc, "ממצאי ניתוח-העומק — מה התחדש לאחר מיצוי 22 נספחי הרקע")
|
||||
BULLET(doc, "**6.9 (ליבת התיק) נחלש לוועדה** — ועדת המשנה לעררים כבר אישרה הבשלה פתוחה.")
|
||||
BULLET(doc, "**טעות הסופר בתכסית התחזקה** — שתי ערכאות הורו לתקן את חישוב השטח.")
|
||||
BULLET(doc, "**פקיעה — הוכרע עובדתית** — סעיף הפקיעה היה בנוסח המופקד (נספח 12) והושמט מהמאושר; נותרה מחלוקת משפטית בלבד (נקר/לויתן מול חמדת הגליל).")
|
||||
BULLET(doc, "**אופי המתקן מטה למשיבים** — תת\"ל 220 + ויתור על 8 מבני קומפוסט לטובת מתקן תרמי (נספחים 25, 30) → טיעון \"פריסת סלאמי\"/עקיפת תכנון.")
|
||||
BULLET(doc, "**תיקון עובדתי** — פסה\"ד שדחה את העתירה (נספח 10) ניתן נגד תכנית דרך הגישה, לא נגד מי/1030.")
|
||||
BULLET(doc, "**פער תחבורתי** — 80-92 משאיות/יום (מוסדות התכנון) מול 320-400 (ד\"ר לינק) — טעון יישוב.")
|
||||
|
||||
H2(doc, "פסיקה הדורשת אימות חיצוני (אינה בקורפוס הסמכותי)")
|
||||
BULLET(doc, "ע\"א 3213/97 **נקר** — \"הדין המתפרסם ברבים מחייב\" (עוגן הוועדה לדחיית הפקיעה).")
|
||||
BULLET(doc, "עע\"מ 4768/22 **חמדת הגליל** — פקיעת תכנית (עוגן המשיבים).")
|
||||
BULLET(doc, "ע\"א 482/99 בלפוריה; בג\"ץ 5636/13 מתיישבי תימורים; בג\"ץ 9098/01 גניס; דנ\"א 3993/07 איקאפוד.")
|
||||
|
||||
H2(doc, "שאלות פתוחות להכרעת היו\"ר + סדר דיון מומלץ")
|
||||
BULLET(doc, "(1) סיווג ההבשלה — טיפול (6.9) או אחסון (4.1.1)?")
|
||||
BULLET(doc, "(2) דין הפקיעה לאור ההשמטה המוכחת מהנוסח המאושר.")
|
||||
BULLET(doc, "(3) האם התכסית 3.5% היא טעות סופר הניתנת לתיקון פרשני?")
|
||||
BULLET(doc, "(4) האם תת\"ל 220 + הוויתור על מבני הקומפוסט הופכים את הבקשה ל\"עקיפת תכנון\" (אירוס הגלבוע)?")
|
||||
BULLET(doc, "(5) הסעד: סירוב מלא / אישור מותנה בהתאמה לשלב א' / החזרה לוועדה המקומית עם הנחיות.")
|
||||
P(doc, "**סדר דיון מומלץ:** טענות סף (פקיעה → מיצוי/השתק → עמידה/פרסום) ← סוגיה 1 (שלביות) ← סוגיה 2 (6.9) ← סוגיה 3 (הקלות/טעות סופר) ← סוגיה 4 (תצורת בינוי) ← סוגיה 5 (שיקולים זרים).")
|
||||
|
||||
H2(doc, "הערכת תרחישים")
|
||||
P(doc, "התמונה שקולה. לטובת הוועדה: סוגיה 1 (שלביות) וטיעון \"עקיפת תכנון/סלאמי\" נוכח תת\"ל 220 — חזקים. לטובת העוררים: סוגיה 2 (6.9) נחלשה, טעות הסופר התחזקה, ו-NIMBY נתמך בראיות. **התרחיש הסביר ביותר:** קבלה חלקית / החזרה מותנית או דחייה — תלוי בעיקר בשאלת היקף הבינוי בשלב א' ובשאלת \"עקיפת התכנון\". ההכרעה במובהק של יו\"ר הוועדה.")
|
||||
|
||||
OUT.parent.mkdir(parents=True, exist_ok=True)
|
||||
doc.save(str(OUT))
|
||||
print(f"saved: {OUT}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -15,6 +15,7 @@
|
||||
| `pc.sh` | bash | **wrapper לכל קריאות Paperclip API מסוכנים** — מוסיף Authorization, X-Paperclip-Run-Id (audit trail), Content-Type, base URL. תחביר: `pc.sh <METHOD> <PATH> [BODY_JSON]`. אסור `curl` ישיר ל-`$PAPERCLIP_API_URL`. ראה `HEARTBEAT.md §0`. counterpart ב-Python: `web/paperclip_api.py`. | נקרא ע"י סוכנים |
|
||||
| `sync_agents_across_companies.py` | python | **סנכרון סוכנים מ-CMP (1xxx, master) ל-CMPA (8xxx, mirror)** — Gap #25. משווה adapter_config (model/timeout/instructions/skills/etc), runtime_config (heartbeat), ושדות top-level (budget/metadata/icon/title/role). מסנן אוטומטית local skills שלא קיימים ב-mirror. לוגיקת subset (mirror יכול להחזיק יותר skills כי ה-API מוסיף required runtime skills). תומך `--verify`/`--dry-run`/`--apply [--only NAME]`. גיבוי אוטומטי. דורש `PAPERCLIP_BOARD_API_KEY`. **להריץ אחרי כל שינוי הגדרות ב-CMP.** **⚠ אם `adapter_type` שונה בין CMP ל-CMPA — `--apply` מדלג על הסוכן; `--verify` מדווח אותו רם כ-DRIFT.** בעת מעבר adapter (למשל ל-`deepseek_local`) חובה לעדכן ידנית בשתי החברות. **`--verify` יוצא exit≠0 על כל drift** (needs-sync / adapter-mismatch / missing-in-mirror) — שמיש כ-gate ל-cron/CI (GAP-21/FU-8a). | ידני אחרי כל שינוי |
|
||||
| `fix_paperclipai_skills_drift.py` | python | סקריפט חד-פעמי (בוצע 2026-05-04) שניקה drift על `paperclipai/*` skills בין CMP ל-CMPA. הסיר `paperclip-dev` מכל 14 הסוכנים, ודאג ש-`paperclip-converting-plans-to-tasks` קיים רק על CEO ו-analyst. תומך `--apply` (ברירת מחדל: dry-run). דורש `PAPERCLIP_BOARD_API_KEY`. נשמר לרפרנס למקרה שhdrift חוזר. | חד-פעמי (בוצע) |
|
||||
| `classify_citation_treatments.py` | python | **סיווג-טיפול לקצוות-ציטוט (X11 Phase 2, #154)** — לכל קצה ב-`precedent_internal_citations` (החלטת-ועדה מצטטת תקדים) מסווג את ה-`treatment` מתוך ה-`match_context` דרך `corroboration.classify_treatment` (Opus 4.8 @ xhigh, claude_session **מקומי** — לא בקונטיינר): followed/explained=חיובי, distinguished/criticized/questioned/overruled=שלילי. ממלא `precedent_internal_citations.treatment` כך ש-`refresh_verified_layer` לא יספור ציטוט שלילי כסמכות (INV-COR2) ו-`db.citation_authority` יציג פירוק לסוכנים. אידמפוטנטי (מדלג על מסווגים). `--apply`/`--limit N`/`--case-law-id UUID`. **אחרי `--apply` הרץ `build_verified_layer.py`.** דורש `HOME=/home/chaim`. | ידני / אחרי גלי-ציטוט חדשים |
|
||||
| `adapter_profiles.py` | python (module) | **רישום-פרופילי-אדפטר** — מקור-אמת יחיד ל-3 צירי-הכשל של מעבר-אדפטר: provider/default_model, instructions_mode (`file_path` בטוח-frontmatter מול `content_arg` ששובר `---`), ו-tool_config (`gemini_global` excludeTools / `frontmatter` / `hermes` / `codex_home`). כולל `codex_local` עם משפחת מודלי OpenAI/Codex (`gpt-*`, `o3*`, `o4*`, `codex-*`). מיובא ע"י `migrate_agent_adapter.py`. הוספת אדפטר עתידי = רשומה אחת. לא מורץ ישירות. | תשתית |
|
||||
| `migrate_agent_adapter.py` | python | **מעבר-אדפטר בטוח לכל סוכן ← כל אדפטר, בשתי החברות יחד (INV-MC1)**. מיישב model↔provider, גורס frontmatter לעותק `.generated/<name>.nofm.md` ל-content_arg adapters (אחרת קריסת `gemini --prompt`/`hermes -q` על `---`), ומשחרר excludeTools גלובלי של gemini (`--relax-tools`). `--check` (preflight בלבד, exit≠0 על שגיאה — שער FU-8a) / `--apply` / `--revert` (שחזור מדויק מ-sidecar `data/adapter-migration-state.json`) / `--verify` (מסמן מצב לא-תואם/א-סימטרי, exit≠0). `--agent "<שם>"\|all --to <adapter> [--model X] [--relax-tools]`. PATCH דרך `/api/agents/{id}` (לא DB). דורש `PAPERCLIP_BOARD_API_KEY`. הרץ עם `mcp-server/.venv/bin/python`. **fallback-חירום כשנגמרים טוקני-Claude; החזר ל-claude_local כשחוזרים.** | ידני לפי צורך |
|
||||
|
||||
@@ -65,12 +66,18 @@
|
||||
| `halacha_panel_calibrate.py` | python | **כיול + מדידת הפאנל** (Trust-or-Escalate, ICLR 2025). `--source live` (ברירת-מחדל): מריץ את שאלת-ה-KEEP על מדגם-הזהב ומודד מול `is_holding` precision+coverage+**split-rate** לכל מדיניות + false-keep/false-drop (מייבא שופטים מ-`halacha_panel_approve`, **חובה מקומי**). **#133/FU-5** — `--source captured`: **אפס-עלות** (בלי re-vote/LLM) — מצליב סבבים שמורים (FU-1) מול הכרעות-יו"ר (FU-2) דרך `db.panel_rounds_vs_chair` ומדווח split-rate+auto-precision **לכל סבב** (מגמת הלולאה: ככל שהרובריקה משתפרת precision נשמר ו-split יורד); משתף את `analyze_pairs` של FU-4 (מקור-יחיד). שתי המדידות מדווחות **anon-stability** (מבחן-אנונימיזציה #81.7) כמטריקת-בריאות נגד echo-chamber. `--batch`/`--limit`/`--concurrency`. | ידני — לפני חיווט `--apply` (live) / תקופתי — מעקב-לולאה (captured) |
|
||||
| `halacha_rubric_distill.py` | python | **#133/FU-4 — זיקוק-רובריקה PROPOSE-ONLY.** מצליב `halacha_panel_rounds` (FU-1, הצבעות+נימוקים) מול הכרעות-היו"ר (FU-2, seeds ב-`halacha_goldset` batch `chair-live`) דרך `db.panel_rounds_vs_chair` (read-only), מנתח דטרמיניסטית **כשלים שיטתיים** (false-keep/false-drop, פיצולים-שהוכרעו, שיעור-מחלוקת-עם-היו"ר לכל שופט), ומציע `KEEP_SYSTEM` v2 + exemplars מופשטים (claude_session מקומי, אפס עלות) כ**דוח-diff** ל-`data/learning/rubric-proposal-<ts>.md`. **לעולם לא auto-apply** — אימוץ v2 = עריכה אנושית של הקבוע דרך PR (INV-LRN1); exemplars מופשטים בלבד (INV-LRN5); הסיגנל היחיד = הכרעת-יו"ר, לא הצבעות-פאנל (anti-echo). מתחת ל-12 זוגות → "אין מספיק נתונים". `--no-llm` (סטטיסטיקה בלבד) / `--limit N`. **חובה מקומי**. | תקופתי — אחרי שהצטברו הכרעות-יו"ר על מחלוקות-פאנל |
|
||||
| `backfill_canonical_halachot.py` | python | **V41 — הקמת מודל ההלכות הקנוניות (חד-פעמי + idempotent).** (1) בונה רכיבים-קשורים (connected components) מ-`equivalent_halachot` (transitive closure — union-find). (2) לכל אשכול: בוחר נציג-קנוני (הכי הרבה corroboration → confidence → earliest), יוצר שורת `canonical_halachot`, ומעדכן `canonical_id` + `instance_type` לכל חברי האשכול. (3) לסינגלטונים (ללא קישורי-שוויון): 1:1 canonical. (4) מאכלס `halacha_citation_corroboration.canonical_id` מ-`halachot.canonical_id`. `--dry-run` (ברירת-מחדל, מחשב ומדווח בלבד) / `--apply` (כותב) / `--verbose`. לאחר הרצה: `canonical_statement` = ניסוח-נציג (pending_synthesis); עוקב: `backfill_canonical_synthesis.py` (Phase 4) יסנתז ניסוח-רחב דרך LLM. הרץ: `mcp-server/.venv/bin/python scripts/backfill_canonical_halachot.py --apply`. | **חד-פעמי** (לאחר deploy V41) / idempotent לפי צורך |
|
||||
| `build_verified_layer.py` | python | **#153 — בניית שכבת-המאומת מאזכורים.** "מאומת=אזכור, לא ביקורת" (chaim 2026-06-20): מריץ את ה-citator (`extract_internal_citations`) על **כל** החלטות-הוועדה (לא רק דפנה), ואז `db.refresh_verified_layer` שמחשב `halachot.verified`/`cite_count` מ-`precedent_internal_citations` (verified=פס"ד-המקור צוטט ע"י יו"ר; cite_count=# החלטות מצטטות). idempotent, גדל-אוטומטית עם החלטות חדשות. regex/embeddings בלבד, אפס-LLM. `--no-citator` (refresh בלבד). הרץ: `mcp-server/.venv/bin/python scripts/build_verified_layer.py`. | חוזר (אחרי קליטת החלטות-יו"ר) |
|
||||
| `backfill_practice_area.py` | python | **#153 step 4 — חוזה-קליטה.** 87% מהפסיקה-החיצונית בלי practice_area → אחזור-מסונן-תחום מחמיצן. מריץ סיווג קיים (`derive_domain_practice_area` דטרמיניסטי → `precedent_metadata_extractor.extract_and_apply` LLM) על הלא-מסווגים. מרוסן (extract_metadata=claude/sonnet). `--dry-run`/`--apply`/`--limit`/`--no-throttle`. **going-forward כבר מחווט** (ingest.py:233 מתזמן metadata); זה ל-backfill הקיימים (חלופה: להזין ל-`metadata_extraction_requested_at` ולתת ל-drain). | חד-פעמי (backfill) |
|
||||
| `compute_principle_gold.py` | python | **#153 (נטוש)** — גישת זיהוי-זהב ברמת-עיקרון דרך התאמת-`match_context`→הלכה. **הוחלף** ע"י "מאומת=אזכור" (`build_verified_layer.py`) אחרי שההתאמה נכשלה (match_context=רשימת-הפניות). נשמר לעיון. | deprecated |
|
||||
| `cull_principles.py` | python | **#152 Phase C — סינון רטרואקטיבי של קורפוס-העקרונות דרך פאנל-3 (הפיך).** מריץ על כל עיקרון 'original' קיים את אותו משטר שה-extractor משתמש בו להבא (`services/panel_extraction.panel_keep_score`, G2): 3 שופטים (Claude מקומי + DeepSeek + Gemini) מצביעים keep+score → כלל-האישור (3 קולות→שורד · 2 וציון≥0.85→שורד · 2 ו<0.85→יו"ר · ≤1→נדחה) → תקרת `HALACHA_PANEL_MAX_NEW`=5 לכל החלטה לפי ציון (`apply_cap`). נדחה → `halachot.review_status='rejected'` + ה-canonical שלו `rejected` (הפיך, גיבוי-CSV ב-`data/audit/` לפני כל כתיבה). מרוסן ב-`usage_limits` (עוצר-רך בתקרת-שימוש, resumable). `--dry-run` (ברירת-מחדל) / `--apply` / `--sample N` (החלטות אקראיות) / `--limit N` / `--no-throttle` / `--verbose`. **חובה מקומי** (3 שופטים). הרץ: `cd mcp-server && HOME=/home/chaim .venv/bin/python ../scripts/cull_principles.py --apply`. | **חד-פעמי** (סינון ראשוני) + ניתן-לחזרה |
|
||||
| `backfill_canonical_synthesis.py` | python | **V41 Phase 4 — סינתזת-LLM ל-`canonical_statement` (idempotent + resumable).** עובר על canonicals ב-`review_status='pending_synthesis'` (רב-instance ראשונים) ומזקק לכל אחד ניסוח אחד כללי ומעוגן בציטוטי-המופעים (INV-AH) דרך `services/canonical_synthesis.py` (מסלול-יחיד, G2). שערים: עיגון/הימנעות, **drift-floor** (cosine מול המקור, ברירת-מחדל 0.80 — סטייה גדולה→נשמר המקור), ואיסור ציטוטי-תיק חדשים. בכל מקרה הסטטוס מתקדם ל-`pending_review` לשער-היו"ר (G10/INV-LRN6). מודל Opus (`HALACHA_CANONICAL_SYNTH_MODEL`). מרוסן ע"י `usage_limits` (עוצר-רך בתקרת-שימוש, resumable). `--dry-run` (ברירת-מחדל) / `--apply` / `--sample N` (מדגם אקראי לבדיקה) / `--limit N` / `--no-throttle` / `--verbose`. CSV-audit ל-`data/audit/canonical-synthesis-*.csv`. **חובה מקומי** (claude_session). הרץ: `cd mcp-server && HOME=/home/chaim .venv/bin/python ../scripts/backfill_canonical_synthesis.py --apply`. שוטף: כלי-MCP `canonical_synthesize_pending`. | **חד-פעמי** (המסה הראשונית) + idempotent לחדשים |
|
||||
| `backfill_lesson_synthesis.py` | python | **#158 / INV-LRN8 — סינתזת-LLM של `decision_lessons` (idempotent + resumable).** עובר על shards של `practice_area`+`category` עם ≥2 לקחי-סגנון `approved`, מאשכל near-duplicates (cosine ≥ `LESSON_SYNTH_CLUSTER_THRESHOLD`), וממזג כל אשכול ל"לקח-על" אחד מעוגן-מקור (INV-AH) עם **drift-floor** (`LESSON_SYNTH_DRIFT_FLOOR` מול centroid) דרך `services/lesson_synthesis.py` (מסלול-יחיד, G2). הלקח-על נכתב `source='synthesis'` (`review_status='approved'`, שער-מדורג-הפיך), המקורות→`superseded`. כך הסט שזורם לכותב קטֵן ומשתבח (פותר את חיתוך limit=15, #157). מודל Opus (`LESSON_SYNTH_MODEL`), מרוסן `usage_limits`. `--dry-run` (ברירת-מחדל) / `--apply` / `--practice-area` / `--category` / `--no-throttle` / `--verbose`. CSV-audit ל-`data/audit/lesson-synthesis-*.csv`. **חובה מקומי** (claude_session). הרץ: `cd mcp-server && HOME=/home/chaim .venv/bin/python ../scripts/backfill_lesson_synthesis.py --apply`. שוטף: כלי-MCP `lesson_synthesize_pending`. | idempotent — הרצה לפי צורך/כשמצטברים לקחים |
|
||||
| `halacha_batch_reconcile.py` | python | **#82.7** — dedup חוצה-פסקים offline (שמרני, **dry-run בלבד**). dedup-on-insert משווה רק תוך-פסק; כאן סף מחמיר (cosine ≥0.95, `--cosine`) ולא-הרסני: מאתר זוגות הלכות near-duplicate בין פסקים שונים (pgvector `<=>` exact) עם איתות לקסיקלי (Jaccard/Levenshtein) ומדווח ל-CSV ב-`data/audit/` לסקירת היו"ר. לא מדלג/ממזג/מוחק. `--include-pending`. **`--link`** רושם את הזוגות שנמצאו כ-`equivalent_halachot` (parallel authority, #84.2 — **deprecated post-V41** — השתמש ב-`backfill_canonical_halachot.py --apply` במקום). רץ עם venv של mcp-server. | **deprecated** — הוחלף ב-`backfill_canonical_halachot.py` (V41). נשמר לצורכי audit |
|
||||
| `calibrate_halacha_dedup.py` | python | **#82.1** — כיול ספי ה-dedup הלקסיקלי (#82.3) מול gold-set הניקוי. קורא `halacha-cleanup-manifest-*.csv` (זוגות duplicate↔survivor מתויגי-אדם), טוען טקסט-survivor מה-DB, ו-sweep של (jaccard_min × levenshtein_min) עם P/R/F1, מסמן את נקודת-העבודה המוגדרת. אימת ש-(0.55, 0.70) → **precision 1.0** (אפס false-merge), recall 0.30 — מתאים לאיתות-משני שחוסם auto-approve. `--manifest <path>`. רץ עם venv של mcp-server | חד-פעמי — כיול (בוצע 2026-06-06) |
|
||||
| `ab_halacha_opus48.py` | python | **A/B לא-הרסני לחילוץ הלכות (Claude)** — מריץ מחדש חילוץ הלכות על פסק-דין בודד דרך מודל/effort נבחרים (`AB_MODEL`/`AB_EFFORT`, ברירת-מחדל `claude-opus-4-8`/`xhigh`) ומשווה לסטטיסטיקות ההלכות הקיימות ב-DB **בלי למחוק/לכתוב כלום**. משכפל את `halacha_extractor.extract()` (אותם פרומפטים, בחירת-צ'אנקים, אימות-ציטוט) ומחליף רק את קריאת ה-LLM ב-`claude -p --model --effort`. מפיק `data/ab_halacha_<case>_<effort>.json`. הרצה: `DOTENV_PATH=/home/chaim/.env DATA_DIR=.../data .venv/bin/python scripts/ab_halacha_opus48.py <case_law_id>`. **ממצא 2026-05-31 (שטיין 1128-08-20):** Opus 4.8@xhigh חילץ 51 מול 124 בייצור (100% quote-verified מול 96%) אך ביטחון מכויל-נמוך יותר (חציון 0.75 מול 0.82) — ולכן **לא** מקטין את תור-האישור-הידני תחת sweep אוטו-אישור conf≥0.78 (26 מול 24). שיפור איכות, לא צמצום-תור. | ידני (החלטת מודל-חילוץ) |
|
||||
| `ab_halacha_codex.py` | python | **A/B לא-הרסני לחילוץ הלכות (Codex/gpt-5.5)** — עמית ל-`ab_halacha_opus48` אך מחליף את `claude -p` ב-`codex exec --model gpt-5.5` (אימות ChatGPT, ללא OPENAI_API_KEY). אותם פרומפטים ואותו הסקת quote-verification. הפלט האחרון של הסוכן (`-o FILE`) נפענח כ-JSON. `AB_MODEL` (default `gpt-5.5`), `AB_REASONING` low/medium/high/xhigh (default `medium`), `AB_CONCURRENCY` (default 1), `CODEX_BIN`. מפיק `data/ab_halacha_codex_<case>_<model>_<reasoning>.json`. הרצה: `DOTENV_PATH=/home/chaim/.env DATA_DIR=.../data mcp-server/.venv/bin/python scripts/ab_halacha_codex.py <case_law_id>`. **ממצא 2026-06-17 (8181-21 האוניברסיטה העברית):** gpt-5.5@medium חילץ 27 מול 28 של Opus (quote-verified 100%/100%), ביטחון חציון 0.86 מול 0.78 — אך **0 פריטים מתחת ל-0.7** (לעומת 9/28 של Opus = 32%), דבר המצביע על over-confidence. holding↑ (12 מול 7), procedural↓ (4 מול 7). **מסקנה: ריאלי כ-fallback חירום; לא מוכן לייצור ללא כיול-ביטחון.** | ידני (בנצ'מרק מודל codex) |
|
||||
| `calibrate_effort.py` | python | **#208 (WS5/Q1, INV-G8 eval-harness) — כיול model×effort של הכותב מול הסופיים.** A/B per-(תיק,בלוק,effort) על `draft_final_pairs` בעלי `final_text`: מייצר מחדש כל בלוק דרך מסלול-הייצור (`block_writer.write_block(effort_override=…)` → `claude_session.query` → `claude -p`, Opus 4.8 נעוץ, **מקומי-בלבד**) ומודד מול ה**סקשן** המתאים בסופי דרך `services/style_distance.block_distance_to_final` (מקור-מדידה יחיד, G2): `change_percent` (compute_diff_stats) · `anti_pattern_total` (`lessons.ANTI_PATTERNS`, הסיגנל הנקי-לסגנון) · `golden_ratio_deviation_pp` · `distance` מרוכב. **ממליץ** per-בלוק (style-clean, #213) לפי `anti_pattern_total` **ראשי** (סיגנל-הסגנון הנקי) → סטיית-יחסי-זהב → `distance` (tiebreak קלוש); **`change_percent` מדווח-לא-מדורג** (מערבב סגנון עם שלמות-תוכן, 07-learning §0.7). ההמלצה נושאת דגל-`confidence` ("clear"/"weak" — הובלת-anti < epsilon=max(0.5, 0.20·spread) ⇒ ⚠️weak בתוך-הרעש, לא מוצג כוודאי) לצד ברירת-המחדל מ-#204. מפיק `data/eval/effort-calibration-<ts>.{json,md}` ב**כתיבה אינקרמנטלית** — הדוח נכתב מחדש אחרי כל בלוק שמסתיים, כך שקריסה באמצע הגריד לא מאבדת בלוקים שכבר יוצרו (INV-G8). כל תא-(תיק,בלוק,effort) שנכשל (rate-limit חולף, או חריגה) נרשם כ-warning ומדולג — לא מפיל את הריצה. **`block-yod` (דיון) הוצא מברירות-המחדל** (`CALIBRATABLE_BLOCKS`) — דורש כיוון-מאושר (brainstorm→approve_direction) שתיקי-הכיול חסרים ולכן `write_block` זורק; נשאר ב-`VALID_BLOCKS` לכפייה ידנית (`--blocks block-yod`) על-אחריות-המשתמש, כשהשער-per-תא שומר אותו לא-פטאלי. ⚠️ **גודל-מדגם מודפס בראש הדוח — עדות-כיוון, לא רגרסיה** (מעט סופיים-עלויים). `--self-test` (offline, אפס DB/CLI — מוכיח מדידה + דירוג-סגנון + confidence + rerank) · **`--rerank <report.json>`** (offline, אפס LLM/DB — מדרג-מחדש דוח-כיול שמור תחת המפתח החדש, מדפיס טבלה + כותב `*-reranked.md`) · `--dry-run` (תכנון-גריד) · `--efforts`/`--blocks`/`--case`/`--repeats`. **חובה מקומי** (claude CLI; לא בקונטיינר/worktree-ללא-CLI). הרצה: `POSTGRES_PASSWORD=… mcp-server/.venv/bin/python scripts/calibrate_effort.py`. | ידני — לכיול ברירות-effort של הכותב |
|
||||
| `calibrate_block_yod.py` | python | **#212 (WS5/Q1, INV-G8 eval-harness) — כיול effort ל-בלוק י' (דיון והכרעה) בלבד.** ה-harness ש-#208 לא יכל לכייל: `write_block(block-yod)` זורק "ללא כיוון מאושר" כי בלוק-הדיון דורש `decisions.direction_doc.approved` שתיקי-הכיול חסרים. **התוספת על #208 — שכבת אספקת-כיוון read-only:** לפני ייצור בלוק-הדיון, ה-harness מזרים `direction_doc` שמיש דרך **overlay על קריאת-ה-DB** (monkeypatch של `db.get_decision_by_case`/`db.get_decision` לתהליך-הזה-בלבד) — **אפס כתיבה ל-DB**, מצב-תיק-הייצור לא משתנה (השער reverted ב-finally). **אסטרטגיית-אספקה per-תיק:** (1) **stored** (מועדף, נאמן) — כיוון-מאושר שמור (`approved`+`selected_direction`, או סכמת-8126 עם `direction_id`/`structure`); (2) **reconstructed** (נסיגה, עדות-כיוון-בלבד) — `direction_doc` מינימלי שנגזר מ-`decision.outcome` + סקשן-הדיון של הסופי **באותו תיק** (INV-LRN5: outcome+מצביע-לסופי-עצמי, אפס מהות חוצת-תיקים, מתויג `reconstructed`); (3) **skip** אם אין דיון/כיוון. מודד דרך אותו `style_distance.block_distance_to_final` (מקור-מדידה יחיד, G2) ומשתמש-חוזר ב-`_score_cell`/`recommend_effort` מ-`calibrate_effort` (#208). **ממצא-קורפוס (2026-06-30):** מ-8 סופיים, 7 ניתנים-לכיול; רק 8126-03-25 הוא stored+scorable (8174-12-24 שמור-אך-חסר-סקשן-דיון) → `--allow-reconstructed false` נותן תא-יחיד; ברירת-המחדל (reconstructed פעיל) נותנת 7 → הנסיגה היא מה שמפעיל את ה-harness היום. כתיבה אינקרמנטלית per-תיק + שער-per-תא לא-פטאלי (INV-G8). ⚠️ **גודל-מדגם בראש הדוח — עדות-כיוון, לא רגרסיה.** `--self-test` (offline, אפס DB/CLI — מוכיח מדידה + לוגיקת-אספקת-כיוון + overlay) · `--dry-run` (תכנון-גריד + מצב-אספקה per-תיק, צריך DB) · `--efforts`/`--case`/`--repeats`/`--allow-reconstructed`. ברירת-מחדל נוכחית: `xhigh` (`block_writer.py:72`, 'by feel'). **חובה מקומי** (claude CLI; לא בקונטיינר/worktree-ללא-CLI). הרצת-כיול-חי (לבצע ע"י היו"ר): `POSTGRES_PASSWORD=… POSTGRES_HOST=127.0.0.1 POSTGRES_PORT=5433 mcp-server/.venv/bin/python scripts/calibrate_block_yod.py`. | ידני — לכיול ה-effort של בלוק-הדיון (היו"ר מריץ; long, צורך-מכסה) |
|
||||
| `monitor_halacha_quality.py` | python | מנטר איכות חילוץ הלכות. בודק drift של `avg(confidence)` בין baseline היסטורי לחלון אחרון. מחזיר JSON מטריקות + alert ב-stderr אם drift > threshold (ברירת מחדל 5%). 2 סדרות: trusted (approved+published) ו-all_extracted. תומך `--window N` / `--threshold X` / `--min-sample N` / `--silent` / `--exit-on-alert`. רץ ב-container או מקומית עם `mcp-server/.venv` (אין תלות ב-LLM, רק SQL). **תזמון מומלץ**: `0 8 * * 1` (יום ראשון 08:00, שבועי) | `0 8 * * 1` (לתזמן) |
|
||||
| `audit_training_corpus.py` | python | audit של `style_corpus` — לכל החלטה: שדות מטא-דאטה מאוכלסים (`summary`/`outcome`/`key_principles`/`appeal_subtype`/`subject_categories`), קישור ל-`documents` (FK + chunks + embeddings). מפיק `data/audit/corpus-YYYY-MM-DD.json` + summary בקונסול. דרוש `POSTGRES_URL` או POSTGRES_*. אין תלויות חיצוניות מלבד asyncpg. **רץ מהמכונה המקומית** (לא קונטיינר) — חיבור ישיר ל-Postgres :5433 | ידני / קדם-עבודה לפני enrichment של מטא-דאטה |
|
||||
| `backfill_style_exemplars.py` | python | **T1 (style-acquisition)** — מאכלס `style_exemplars` מקורפוס דפנה (`style_corpus` + `internal_committee` chair=דפנה): מפצל לסעיפים (`chunker._split_into_sections`) → פסקאות (25-450 מילים) → embed (Voyage) → שמירה עם `section`/`outcome`/`practice_area`. מאפשר לכותב לאחזר פסקאות-בלוק אמיתיות של דפנה (T2/T3). מקור-סגנון בלבד (INV-LRN5). אידמפוטנטי (מנקה per-decision). `--dry-run` (default) / `--apply`. דורש POSTGRES_URL + Voyage. **רץ מקומית** (venv). | ידני (`python scripts/backfill_style_exemplars.py --apply`) |
|
||||
@@ -93,9 +100,11 @@
|
||||
| `leak_guard.py` | python | **המאכף הקנוני של INV-G12 (שער-הפלטפורמה / docs/spec/X15 §4 / R4).** שני כללים קשיחים: (1) `mcp-server/src` ללא סמלי-Paperclip (allowlist מנומק לפי substring); (2) רק `web/agent_platform_port.py` (+ קבצי-המעטפת) מייבאים את לקוח-Paperclip. stdlib-בלבד (אין venv). `leak_guard.py` = סריקת-repo (exit 1 על הפרה); `leak_guard.py <file>...` = קבצים נתונים (ל-hook). משותף ל-spec-guard.sh (hook), ל-CI (`.gitea/workflows/leak-guard.yaml`) ול-`mcp-server/tests/test_platform_port_leak_guard.py`. | CI + hook + pytest |
|
||||
| `check_undefined_names.py` | python | **CI gate ל-undefined names (מחלקת ה-NameError).** מריץ pyflakes על `web`, `mcp-server/src`, `scripts` ומפיל build (exit 1) רק על "undefined name"/"may be undefined" — לא על imports-לא-בשימוש/f-strings (רעש). זו בדיוק מחלקת-הבאג של PR #249 (שינוי-שם תיק → 500): שם שמופנה אך לא מיובא/מוגדר, חבוי בתוך `background_tasks` עד זמן-ריצה. דורש pyflakes (ה-workflow מתקין ל-venv זמני). משותף ל-CI (`.gitea/workflows/lint.yaml`). | CI |
|
||||
| `auto-sync-cases.sh` | bash | סנכרון תיקי ערר ל-Gitea — רץ כל דקה | `* * * * *` (cron) |
|
||||
| `host_sync.sh` | bash | מסנכרן את עץ-המארח `~/legal-ai` ל-origin/main (ff-only) כדי שקוד-המארח (כותב/פאנלים/MCP שרצים מהעץ, לא בקונטיינר) יתעדכן אחרי merge; restart מדויק ל-chat/court-fetch/reaper רק כשקבציהם משתנים. בטוח: אף-פעם לא force; tasks.json הדירטי נשמר. סוגר את פער-פריסת-המארח (TaskMaster #160) | `* * * * *` (cron, flock) |
|
||||
| `notify.py` | python | שליחת מייל התראה מסוכנים via SMTP (Gmail) | נקרא ע"י סוכנים |
|
||||
| `bidi_table.py` | python | יצירת טבלאות box-drawing עם תמיכה ב-BiDi (עברית+אנגלית) | ספריית עזר |
|
||||
| `convert_decision_template.py` | python | המרת `data/training/טיוטת החלטה.dotx` → `skills/docx/decision_template.docx` לטעינה ב-python-docx | להריץ כשמתעדכנת התבנית |
|
||||
| `regenerate_voice_fingerprint.py` | python | מסנתז מהקורפוס (style_corpus + דוגמאות + יחסים) **הצעה** לעדכון פרופיל-הקול (Opus מקומי). שער-יו"ר קשיח (INV-LRN1): כותב ל-`data/curator-proposals/`, לעולם לא דורס את `docs/daphna-voice-fingerprint.md` — היו"ר סוקרת ומקבעת ידנית. החצי-הפרוזה של #161 (החצי-המבני=ratios ב-PR#345). רץ על המארח (claude CLI). STYLE/METHOD בלבד (INV-LRN5) | ידני / לתזמן תקופתית |
|
||||
| `deploy-track-changes.sh` | bash | סנכרון skills CMP↔CMPA + בדיקות + הנחיות deploy לארכיטקטורת Track Changes | ידני |
|
||||
|
||||
## חד פעמי
|
||||
@@ -149,6 +158,7 @@
|
||||
|
||||
| Script | Type | Purpose | Scheduled |
|
||||
|--------|------|---------|-----------|
|
||||
| `ocr_benchmark_mistral.py` | python | **בנצ'מרק OCR — Mistral מול Google Vision** (מחקר חד-פעמי, הוביל למעבר ל-Mistral). מוריד מסמכים מ-MinIO, קורא טקסט קיים מה-DB, שולח ל-Mistral OCR, מחשב מטריקות (כיסוי/ניקיון/עברית%), שומר דוח ל-`data/audit/ocr-benchmark-mistral.md` + טקסטים גולמיים ל-`data/audit/ocr-benchmark-raw/`. הרצה: `mcp-server/.venv/bin/python scripts/ocr_benchmark_mistral.py`. דורש `MISTRAL_API_KEY` ו-mcli alias `legalminio`. **ממצא:** Mistral מנצח ב-4/5 תיקים בדוגמה ומטפל נכון ב-OCR שבור (1044-03-26 שהחזיר "English garbage" ב-Vision). | חד-פעמי (בוצע 2026-06-27) |
|
||||
| `backfill_missing_precedents.py` | python | **הזנת `missing_precedents` פתוחים לתור-האחזור (X13)** — מסווג כל פער-פתוח; עליון-סדרתי→Tier-0(supremedecisions), נט-format→Tier-1; ועדת-ערר/לא-מזוהה→דילוג. יוצר `court_fetch_jobs` (idempotent). `--apply` (ברירת-מחדל dry-run). אחרי הרצה: drain-court-fetch קולט. | ידני (חד-פעמי/לפי-צורך) |
|
||||
| `derive_missing_from_cited_only.py` | python | **#143 — איחוד cited_only↔missing_precedents (G2)**: גוזר רשומת `missing_precedents` 'open' לכל stub `cited_only` (פסיקה מצוטטת ללא טקסט), כך ש-31 ה-stubs מופיעים בדף "פסיקה חסרה" (היו היו חפיפה≈0). (1) backfill `citation_norm` (מפתח-dedup designator-aware — `court_citation.citation_dedup_key`) ל-291 הקיימים; (2) לכל stub → `create_missing_precedent(discovery_source='cited_only', linked_case_law_id=stub, notes=מצטטים)` עם dedup. `linked_case_law_id`=זהות-קנונית-ידועה, `status='open'` עד העלאת-טקסט (→ promote-in-place דרך ON CONFLICT). אידמפוטנטי, dry-run / `--apply`. הרצה: `HOME=/home/chaim mcp-server/.venv/bin/python scripts/derive_missing_from_cited_only.py --apply`. | חד-פעמי / re-runnable |
|
||||
| `backfill_digest_missing_precedents.py` | python | **#136 — חיבור יומונים-לא-מקושרים ל"פסיקה חסרה"**: לכל digest עם `underlying_citation` ו-`linked_case_law_id IS NULL` (461) מריץ את `digest_library.try_autolink` הקנוני (G2) — מקשר אם אפשר, אחרת פותח gap: ערר/בל"מ/unknown → `missing_precedent` (discovery_source='digest', dedup designator-aware), פס"ד בתי-משפט → `court_fetch_job` (X13). dry-run מציג פילוח-tier (369 ערר + 21 unknown → MP; 71 fetchable → court_fetch). אידמפוטנטי. הרצה: `HOME=/home/chaim mcp-server/.venv/bin/python scripts/backfill_digest_missing_precedents.py --apply`. | חד-פעמי / re-runnable |
|
||||
@@ -165,6 +175,7 @@
|
||||
|
||||
| Script | Original Purpose | Superseded By |
|
||||
|--------|-----------------|---------------|
|
||||
| `exec_summary_1043.py` | חד-פעמי — רינדור DOCX של סיכום-מנהלים לתיק 1043-02-26 דרך עוזרי-התבנית של `analysis_docx_exporter` (פרוטוטיפ). | `analysis_docx_exporter.build_party_claims_summary_docx()` + endpoint `GET /api/cases/{n}/research/party-claims-summary/export-docx` (WS3 #202; תבניתי, INV-EX4) |
|
||||
| `backfill_pattern_frequency.py` | עדכון תדירות דפוסי סגנון ב-DB | `web/app.py::_extract_pattern_variants()` |
|
||||
| `batch_upload_training.py` | העלאת קורפוס אימון (16 קבצים) | Web UI: `/api/training/upload` |
|
||||
| `benchmark_embeddings.py` | השוואת מודלי embeddings (voyage-3 vs voyage-4) | הושלם — voyage-3-large נבחר |
|
||||
@@ -195,7 +206,7 @@
|
||||
| `drain_digests.py` | python | ריקון תור ההעשרה של יומונים (X12): מעבד כל digest בסטטוס `pending` דרך `digest_library.enrich_digest` (חילוץ-LLM Sonnet + embedding + autolink). מקבילי (CONCURRENCY=3, env-tunable), idempotent. מוסיף `~/.local/bin` ל-PATH כדי שה-claude CLI יימצא תחת cron. בודק דגל `drain_controls('legal-digest-drain')` ב-startup → no-op כשכבוי מ-/operations. | דרך `legal-digest-drain.config.cjs` (pm2 cron) + ידני אחרי backfill. חלופת-MCP: `digest_process_pending` |
|
||||
| `legal-digest-drain.config.cjs` | pm2/js | **תזמון כל שעתיים של `drain_digests.py`** (cron `12 */2 * * *`, `DIGEST_DRAIN_CRON` לעקיפה; דקת-הצתה `:12` כדי לא לחלוק דקה עם metadata-drain `:00` — מונע deadlock של DDL-המיגרציה) — הועבר מ-crontab של המערכת ל-pm2 כדי שיופיע ויהיה שליט בדף `/operations` (הרץ-עכשיו/הפעל/כבה). `autorestart:false` (one-shot per tick). דורש claude CLI + `VOYAGE_API_KEY`. התקנה: `pm2 start scripts/legal-digest-drain.config.cjs && pm2 save`. | pm2 cron (host-side) |
|
||||
|
||||
| `renumber_cases.py` | python | **מיגרציה חד-פעמית (בוצעה 2026-06-12)** — תיקון 11 מספרי-תיקים לפורמט קנוני `NNNN-MM-YY` (הוספת ספרות-חודש; 1046-26→1024-02-26 תיקון-סידורי). רץ על ה-host (לא בקונטיינר): DB pool של האפליקציה + `mcli` (MinIO) + Gitea API + Paperclip DB. אטומי per-case עם גיבוי ל-`data/audit/` ואימות-אחרי. FK-ים על `cases.id` (UUID) לא נגעו; משכתב כל עמודה עם `cases/{old}/` (file_path **וגם** image_thumbnail_path שהוא storage-key בלי `/data`), מנרמל זהות חוצת-קורפוס (case_law/style_corpus/style_exemplars/citations — לא תוכן/full_text), מעביר מפתחי-MinIO ב-3 buckets (legal-immutable=WORM copy-only), משנה-שם repo ב-Gitea, ומעדכן שם-פרויקט ב-Paperclip. dry-run כברירת-מחדל; `--apply --tier clean\|archive`. **מיצוי — לא להריץ שוב** (ה-MAPPING היסטורי). | חד-פעמי — בוצע |
|
||||
| `renumber_cases.py` | python | **מיגרציה חד-פעמית (בוצעה 2026-06-12)** — תיקון 11 מספרי-תיקים לפורמט קנוני `NNNN-MM-YY` (הוספת ספרות-חודש; 1046-26→1024-02-26 תיקון-סידורי). רץ על ה-host (לא בקונטיינר): DB pool של האפליקציה + `mcli` (MinIO) + Gitea API + Paperclip DB. אטומי per-case עם גיבוי ל-`data/audit/` ואימות-אחרי. FK-ים על `cases.id` (UUID) לא נגעו; משכתב כל עמודה עם `cases/{old}/` (file_path **וגם** image_thumbnail_path שהוא storage-key בלי `/data`), מנרמל זהות חוצת-קורפוס (case_law/style_corpus/style_exemplars/citations — לא תוכן/full_text), מעביר מפתחי-MinIO ב-3 buckets (legal-immutable=WORM copy-only), משנה-שם repo ב-Gitea, ומעדכן ב-Paperclip את **שם-הפרויקט + `plugin_state.legal-case-number` + כותרות-issues** (3 המשטחים ש-`get_case_issues` נשען עליהם — בלי (b)+(c) ה-issues נשארים על המספר הישן ו-run-learning/run-halacha מדלגים בשקט עם "no_issue"; תוקן 2026-06-28 אחרי שהפער התגלה ב-8137-11-24). dry-run כברירת-מחדל; `--apply --tier clean\|archive`. **מיצוי — לא להריץ שוב** (ה-MAPPING היסטורי); לתבנית-עתידית: ה-Paperclip-step המעודכן הוא הרפרנס. | חד-פעמי — בוצע |
|
||||
|
||||
## סקריפטים שנמחקו (git history בלבד)
|
||||
|
||||
|
||||
@@ -12,8 +12,6 @@ Mapping (removed → kept):
|
||||
|
||||
uploading → processing
|
||||
in_progress → outcome_set
|
||||
analyst_verified → documents_ready
|
||||
research_complete → documents_ready
|
||||
brainstorming → outcome_set
|
||||
analysis_enriched → direction_approved
|
||||
ready_for_writing → direction_approved
|
||||
@@ -50,12 +48,14 @@ from legal_mcp.services import db # noqa: E402
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
|
||||
log = logging.getLogger("status-trim")
|
||||
|
||||
# removed status → nearest preceding kept status
|
||||
# removed status → nearest preceding kept status.
|
||||
# NOTE (2026-06-30): analyst_verified + research_complete were RE-CANONICALISED
|
||||
# into the status model (legal_mcp/case_status_model.py, "thinking" phase) — they
|
||||
# are valid statuses again, so they were removed from this map. Do NOT downgrade
|
||||
# them; only genuinely-removed markers remain below.
|
||||
STATUS_MAP = {
|
||||
"uploading": "processing",
|
||||
"in_progress": "outcome_set",
|
||||
"analyst_verified": "documents_ready",
|
||||
"research_complete": "documents_ready",
|
||||
"brainstorming": "outcome_set",
|
||||
"analysis_enriched": "direction_approved",
|
||||
"ready_for_writing": "direction_approved",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user