Compare commits
411 Commits
0990db7a3c
...
worktree-c
| Author | SHA1 | Date | |
|---|---|---|---|
| b9fa74b875 | |||
| afe6894441 | |||
| 38c395d0de | |||
| c1f92db2a0 | |||
| 0f7549a137 | |||
| ee5e5b5613 | |||
| 7d8af836be | |||
| b8471277f8 | |||
| 1cf1f30dcd | |||
| 8d409edc9d | |||
| dd8064d94c | |||
| 5930bbcd3f | |||
| 34d0836531 | |||
| a06e15e1e1 | |||
| 29b1da534c | |||
| bfc034b44c | |||
| ffa02ca83c | |||
| 4ca907b97f | |||
| 6b2fd562ae | |||
| a4114cce5e | |||
| 338a8a947f | |||
| ca1f0e8c66 | |||
| 8c455d6ef6 | |||
| f9ef664ac9 | |||
| 532bef04a7 | |||
| 639779e6a9 | |||
| 676ae4532b | |||
| db93735ed6 | |||
| dd2e12f902 | |||
| 75f40cc778 | |||
| 1f9268356e | |||
| 7c39c685e5 | |||
| aba87737e3 | |||
| 0c20f2054b | |||
| 8d9841a9f3 | |||
| 9618dc895b | |||
| 93cd0f9553 | |||
| 42376db4c5 | |||
| fa7fe85177 | |||
| b8349da41d | |||
| caee5faece | |||
| 2b1fb18dfd | |||
| 6484e745d8 | |||
| 43621e8300 | |||
| 4994ae0cba | |||
| a55ffd59eb | |||
| 9f39d390a6 | |||
| 32db9621b6 | |||
| 20a51c572a | |||
| 0c726a19b8 | |||
| 471934cc2c | |||
| a78601b9d0 | |||
| 3c4454651a | |||
| 08a0eb7c01 | |||
| 4bc94d9e4d | |||
| d4ec675c67 | |||
| f3b5223f0f | |||
| 406e93b9bf | |||
| ba542f9c21 | |||
| 5370ada37c | |||
| fe4694672e | |||
| fb6f284297 | |||
| 2c328d6906 | |||
| 4280bf2a21 | |||
| 9d66ad4bf7 | |||
| e7124e94a3 | |||
| 221975fe23 | |||
| 26aff99ac7 | |||
| 896df0cb8c | |||
| c87d9e2ef5 | |||
| 9826995c12 | |||
| b2981d995b | |||
| 85493502f0 | |||
| b4cb0a69c3 | |||
| 251262ab67 | |||
| 9fc00d6e7f | |||
| 4c52a42587 | |||
| 2ccc55d35a | |||
| 37cd28eab6 | |||
| fcd7ffb186 | |||
| 37e881bf8c | |||
| a2b9bcc84c | |||
| a1245b6b41 | |||
| 2c3ba6e4d0 | |||
| 86d4aa8971 | |||
| 2570949b30 | |||
| 0c78e30e07 | |||
| 576a4b916b | |||
| 5a23c8bafc | |||
| fc02ccaeff | |||
| 9a7c1c4148 | |||
| 9fd506ff2b | |||
| ea8712ecff | |||
| 161e370a4c | |||
| bea2065640 | |||
| 49cbd8bb3a | |||
| 6cc100f9f8 | |||
| 9e45e5a46d | |||
| a02b929b5c | |||
| 07ecb6a366 | |||
| ce86821393 | |||
| 2343892220 | |||
| ea232da92d | |||
| c348903e4b | |||
| 7043de0ac2 | |||
| d6608ce849 | |||
| 33b07eebcf | |||
| 77817a46ad | |||
| e552d831bd | |||
| c27987ba72 | |||
| 1094ac9967 | |||
| 76a29756c5 | |||
| eb86e475c3 | |||
| b7ffc0387c | |||
| d7ef3e7f38 | |||
| 1340bff6f1 | |||
| 7f9f502f29 | |||
| a05df3eb1a | |||
| 1a4b4fcf63 | |||
| a40c4ee828 | |||
| 6bc9fa89a2 | |||
| 5d75d36e2a | |||
| 70ac888592 | |||
| 46bcaa8fa3 | |||
| 09ea1ee599 | |||
| 4be9cf8543 | |||
| 83293ca619 | |||
| 49efa94d60 | |||
| f8791ba4a1 | |||
| 0a3bc35623 | |||
| 1fbb1eede6 | |||
| e2c94144d0 | |||
| 6fc87de1c5 | |||
| 64612240d5 | |||
| b9e4c1fde4 | |||
| f7a8ad48ac | |||
| 4dce06c04a | |||
| eac4dd3ac9 | |||
| 01bc1b9743 | |||
| 693126484b | |||
| 17460044ac | |||
| 6f3c3963a4 | |||
| d093319ffd | |||
| 9e46db3c48 | |||
| 8d13e26cc8 | |||
| 013fe39ea7 | |||
| 96a1144f43 | |||
| a44827c3dd | |||
| 72f81734f1 | |||
| 49acde591e | |||
| 387cd37255 | |||
| 0249184a6b | |||
| 81aa2ac368 | |||
| 9154a1d817 | |||
| 6926d21b15 | |||
| 15e4af595a | |||
| b6dec104c8 | |||
| 75a1b23972 | |||
| d2154020c6 | |||
| c7c402e7ef | |||
| 551d38dd7c | |||
| 309064be7d | |||
| c474b58311 | |||
| 959cb093b4 | |||
| 82f1728d3c | |||
| 5913654ae2 | |||
| 51f9d9d309 | |||
| ab1e72f0cc | |||
| 584bc62488 | |||
| 2962538c09 | |||
| 99fe16a43d | |||
| b49cde7c24 | |||
| 5272ded4f7 | |||
| 4f7c3733e2 | |||
| 49827acd4f | |||
| f0a8af30dc | |||
| ca1a0ddaac | |||
| 242e6cfd11 | |||
| a0b3c17381 | |||
| d246fb85fc | |||
| 412bd091cf | |||
| 4cad17df3a | |||
| 305c084d0c | |||
| 6fba565fcb | |||
| b95b02486b | |||
| d98ef14f41 | |||
| 1470841e26 | |||
| 183156646c | |||
| d292c06ecd | |||
| 9c6896df90 | |||
| 208be9061b | |||
| e8bcb9c1ea | |||
| 9cd290e08e | |||
| b0411db80b | |||
| ebb9c211af | |||
| d4dc58fe5a | |||
| 56bc72760a | |||
| 614c06ab60 | |||
| 57a6a01a03 | |||
| 4ea6326766 | |||
| b79f1a2420 | |||
| 0a7869175e | |||
| b4e79aa8fa | |||
| f3b075d282 | |||
| c53ef9a7c4 | |||
| f528407503 | |||
| 1351c77dfd | |||
| 35f656f2b8 | |||
| 13b8a6ef05 | |||
| b0efa700da | |||
| b447ffb184 | |||
| b85aafa8f9 | |||
| 65d649cfcc | |||
| 9482eb5a1e | |||
| 3757910079 | |||
| 6e69c1dc38 | |||
| fc2de64700 | |||
| 36bae6c592 | |||
| f1ea4fc00a | |||
| 80455af62d | |||
| 383118bc5f | |||
| 0d8cc31a2b | |||
| e1e54d61c7 | |||
| 3ac022d0fb | |||
| e3dc7958b2 | |||
| 8651529327 | |||
| 24480950f1 | |||
| 4b01283e3b | |||
| 0a45fab4ee | |||
| 6359363f13 | |||
| af5875453d | |||
| e6778d26e5 | |||
| 2e0cfd8d94 | |||
| a13fc76c49 | |||
| 2e2234ec27 | |||
| 63784f1f91 | |||
| 6c0590e1e3 | |||
| 970e8dc748 | |||
| 671edf1128 | |||
| 94a4c3600e | |||
| e91c1c4afc | |||
| 7d8bdc8c72 | |||
| c18a5443fd | |||
| ec14e8310b | |||
| ff2d28b1a7 | |||
| a4b4ebbbb1 | |||
| a00e226a08 | |||
| 97271689ef | |||
| 276bb4ae93 | |||
| 4e06662208 | |||
| 7e1a0c879a | |||
| 621dcf749a | |||
| 6933d1d016 | |||
| 5f93c7492f | |||
| e6c6237ef6 | |||
| 5b001bbd9d | |||
| d837101edd | |||
| 3c169a76f2 | |||
| 369755c350 | |||
| 4fa62db192 | |||
| 07ca76cd87 | |||
| 2f094b8d84 | |||
| 130ddc3a7e | |||
| a4e006ab50 | |||
| 4d1d1eb3fa | |||
| 64db643e6d | |||
| 33663b9816 | |||
| d05c1e3fce | |||
| e2e42f850d | |||
| c504a61d49 | |||
| 1eece500d3 | |||
| bfea8d8895 | |||
| dd67318394 | |||
| b2912e1b83 | |||
| f5650196b7 | |||
| e7d8b24d7c | |||
| 61d235175f | |||
| d2b622f28e | |||
| 20781398ee | |||
| e5168fe79d | |||
| 8a2ae9921a | |||
| d4514e608d | |||
| b4f141df84 | |||
| 1c182edb29 | |||
| 8b69adc7bd | |||
| 2b6e95c484 | |||
| c903770fb3 | |||
| 26e0219219 | |||
| 81171983e4 | |||
| d156bcfaf1 | |||
| 33d8faf74a | |||
| cb822c4900 | |||
| f1d6f5dafc | |||
| 1a50aa7709 | |||
| 405167269f | |||
| 7f573c0db3 | |||
| aa0fde2724 | |||
| e57730f375 | |||
| 6299998267 | |||
| d4d2ab4d68 | |||
| c0af8c7cda | |||
| 2f43960353 | |||
| de777c2b13 | |||
| 98c5feff25 | |||
| 2c4287fd3d | |||
| 55362bf5a1 | |||
| 7ebd4187a9 | |||
| c8344342a8 | |||
| 02f411f4dc | |||
| 0f0656ecca | |||
| c028328175 | |||
| 471cd37fc8 | |||
| 9f358db353 | |||
| d23f854c25 | |||
| 9ae49f0f70 | |||
| f79c46a352 | |||
| ae30a4d19a | |||
| 638eef6803 | |||
| 6647aa92e6 | |||
| b2ea0c28dd | |||
| bc5dd9ac48 | |||
| 5745d36bb4 | |||
| 05e8373d22 | |||
| 85f94a4f3f | |||
| 1e41125baa | |||
| 1f42a39ce4 | |||
| 39f8cb7c15 | |||
| 1986fe3b14 | |||
| 81b3de6f4f | |||
| b4a28f072d | |||
| ade22ca871 | |||
| 54948eb8ab | |||
| 6ec67d1a11 | |||
| 34d80a39e5 | |||
| 5bd235bcff | |||
| a92f543e7f | |||
| 8de2401cb1 | |||
| 83d30365c9 | |||
| 64b9bd9d99 | |||
| 8d2f1ea0a2 | |||
| 36319a8d75 | |||
| 16470f6279 | |||
| 97d5b178d3 | |||
| a5a4f53660 | |||
| 6c6e4e021b | |||
| d895062b4c | |||
| a1db283ce1 | |||
| 97ede1a49d | |||
| 2972ef74a4 | |||
| 5676fd1157 | |||
| 83d1a8253c | |||
| 5eeff24889 | |||
| 5bf2ea0262 | |||
| 7fb5134580 | |||
| c3735d019a | |||
| d95a36f310 | |||
| de56d3b39d | |||
| ef21cb93e5 | |||
| cc9adc5c1f | |||
| da4ebeb724 | |||
| d8113adec6 | |||
| a3a02ca67a | |||
| b022cc7a97 | |||
| 5f1b96ccaf | |||
| 4b5c8a2772 | |||
| b5f7b60fb5 | |||
| 2c75666d26 | |||
| fc5d69902f | |||
| 8dc0a268fb | |||
| 9a126f7c36 | |||
| 3c030dd7f5 | |||
| dba2a131e0 | |||
| ecd9e46bb9 | |||
| 6cdf178ea4 | |||
| 2fbc0cd3c2 | |||
| 360f49d8b4 | |||
| 24d80e6a2a | |||
| 3ae183009f | |||
| 106ab53231 | |||
| 8258f09228 | |||
| aa32766a8c | |||
| 6882ccfcf1 | |||
| 618f476a22 | |||
| 69b34f1c3f | |||
| 796bfa890f | |||
| c1abf2ec0e | |||
| 6468e151d9 | |||
| fb40ec8565 | |||
| bcd5fd5f8d | |||
| f4f110f0d1 | |||
| 540d39b958 | |||
| d3b5c563ce | |||
| d9340f6c39 | |||
| 808c2e4c46 | |||
| 879bb6c074 | |||
| f3e99a14ca | |||
| b9fa38f3db | |||
| f56309da5a | |||
| 635dc98492 | |||
| e6dc410d7d | |||
| e82eeaad9f | |||
| e186183527 | |||
| 61b9d72bcf | |||
| 781f24c643 | |||
| 9315ba4dfe | |||
| c80e4ce8ff | |||
| f3740fef68 | |||
| 2e33cac043 | |||
| acb8e2c206 | |||
| 692eea76f0 | |||
| 06281996ca |
@@ -34,6 +34,17 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## שער anti-hallucination — קודם המקור, אז הציטוט (INV-AH) ⚠️
|
||||||
|
|
||||||
|
**חל על כל סוכן נוגע-מהות.** כמו שאינך פועל "מהזיכרון" לגבי התנהגות-המערכת (INV-AG1) — אינך מצטט **פסיקה / סעיף-חוק / הלכה / מספר-תיק / מקדם / נתון כמותי "מהזיכרון"**. כל אזכור כזה חייב לבוא ממקור מאומת (תוצאת כלי-אחזור או מסמך בתיק), עם ציטוט מדויק.
|
||||||
|
|
||||||
|
**קרא וקיים** את חמש הטכניקות ב-[`~/legal-ai/docs/anti-hallucination-gate.md`](../../docs/anti-hallucination-gate.md):
|
||||||
|
**AH-1** עיגון-מקור (אפס ציטוט מהזיכרון) · **AH-2** quote-or-retract · **AH-3** abstention ("לא נמצא — דורש אימות") · **AH-4** תיוג-ודאות `[מאומת]`/`[טעון-אימות]`/`[ספקולציה]` · **AH-5** Chain-of-Verification לפני סיום.
|
||||||
|
|
||||||
|
> מעוגן במקורות מקצועיים (Stanford RegLab/Magesh JELS 2025 — כלי-RAG משפטיים הוזים 17–33%; Anthropic; CoVe arXiv:2309.11495; RAGAS; NIST AI RMF). **"פער" מותר ("אזכרתי X, לא נמצא בקורפוס — לאמת"); "המצאה" אסורה ("הנה תקדים Y" ללא מקור).**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## §0. כל קריאה ל-Paperclip API — דרך `pc.sh` בלבד
|
## §0. כל קריאה ל-Paperclip API — דרך `pc.sh` בלבד
|
||||||
|
|
||||||
**ה-skill הרשמי משתמש ב-`curl` ישיר. אצלנו אסור.** משתמשים ב-helper שלנו:
|
**ה-skill הרשמי משתמש ב-`curl` ישיר. אצלנו אסור.** משתמשים ב-helper שלנו:
|
||||||
|
|||||||
@@ -1,172 +1,267 @@
|
|||||||
---
|
<!--
|
||||||
name: hermes-curator
|
hermes-curator.md — מקור-האמת היחיד לפרומפט של סוכן אוצֵר-הידע (Knowledge Curator).
|
||||||
description: Knowledge Curator (Hermes) — מנתח החלטות סופיות אחרי export, מציע עדכונים ל-skills/lessons. read-only על תוכן, write רק על comments.
|
זהות-הסוכן: "מנהל ידע" / אוצֵר-ידע. "Hermes" כאן הוא שם ה-runtime CLI בלבד (DeepSeek-via-Hermes),
|
||||||
adapter: deepseek_local
|
לא זהות-הסוכן ולא לולאת-self-learning (כבויה — ראה docs/research/hermes-runtime-and-self-learning-state.md, #126).
|
||||||
model: deepseek-v4-pro
|
|
||||||
profiles:
|
נטען בזמן-ריצה ע"י adapter `deepseek_local` דרך `adapter_config.instructionsFilePath`
|
||||||
CMP: curator-cmp # רישוי ובניה (תיקים 1xxx)
|
(parity עם claude_local / gemini_local — INV-G2, ביטול מסלול-פרומפט מקביל).
|
||||||
CMPA: curator-cmpa # היטל השבחה + פיצויים (תיקים 8xxx, 9xxx)
|
כל הקובץ עובר renderTemplate באדפטר → placeholders `{{...}}` פעילים בזמן-ריצה.
|
||||||
|
|
||||||
|
אין YAML frontmatter בכוונה: האדפטר שולח את הקובץ כפרומפט גולמי (כמו gemini-critique.md),
|
||||||
|
ו-frontmatter היה נכנס כרעש לתוך הפרומפט.
|
||||||
|
|
||||||
|
מטא (לא נטען כקוד — תיעוד בלבד):
|
||||||
|
name: hermes-curator
|
||||||
|
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).
|
||||||
|
|
||||||
|
placeholders זמינים: {{agentId}} {{agentName}} {{companyId}} {{companyName}} {{runId}}
|
||||||
|
{{taskId}} {{taskTitle}} {{taskBody}} {{commentId}} {{wakeReason}} {{projectName}} {{paperclipApiUrl}}
|
||||||
|
-->
|
||||||
|
|
||||||
|
### PIPELINE-WAKE BRANCH (auto)
|
||||||
|
לפני כל דבר אחר — בדוק אם זו יקיצת-pipeline אוטומטית. הרץ בדיוק את הבלוק הבא:
|
||||||
|
```bash
|
||||||
|
WAKE="{{wakeReason}}"
|
||||||
|
case "$WAKE" in
|
||||||
|
final_learning_*|final_halacha_*)
|
||||||
|
KIND=$(printf '%s' "$WAKE" | cut -d_ -f2)
|
||||||
|
CASE="${WAKE#final_${KIND}_}"
|
||||||
|
cd /home/chaim/legal-ai/mcp-server && \
|
||||||
|
HOME=/home/chaim DOTENV_PATH=/home/chaim/.env DATA_DIR=/home/chaim/legal-ai/data \
|
||||||
|
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"
|
||||||
|
;;
|
||||||
|
*) echo "NO_PIPELINE_WAKE" ;;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
אם הפלט הוא `PIPELINE_STARTED ...` — **זו כל המשימה**: כתוב comment קצר בעברית ("הופעל צינור <KIND> לתיק <CASE>; התוצאות יופיעו ב-/training (סגנון) או /approvals + /precedents (הלכות) תוך מספר דקות."), סגור את ה-issue (status=done), ו**סיים מיד — אל תמשיך לסעיפים שלמטה**.
|
||||||
|
אם הפלט הוא `NO_PIPELINE_WAKE` — המשך כרגיל לתבנית שלמטה.
|
||||||
|
|
||||||
|
> **הערה (INV-LRN4 / X16):** הצינור `final_learning_pipeline.py` הוא שמריץ את דיסטילציית
|
||||||
|
> טיוטה↔סופי (`ingest_final_version`), רישום ה-lessons וההרשמה ל-style_corpus — **durably**.
|
||||||
|
> לכן **אל תריץ ingest_final_version ידנית** בתוך §A; זו תהיה הרצה כפולה. תפקידך ב-§A/§B
|
||||||
|
> הוא ניתוח-דפוסים והגשת ממצאים/interaction בלבד.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
> **Why DeepSeek**: A/B test 2026-05-05 הראה ש-DeepSeek V4-Pro חזק יותר מ-Sonnet
|
אתה מנהל ידע (Knowledge Curator) של ועדת הערר. נעור על תיק שדפנה סימנה כסופי או על תגובה שלה ל-interaction.
|
||||||
> על דפוסי סגנון/לקסיקון, פי 2-3 מהיר, פי ~20 זול. הסוכן לא דורש דייקנות עובדתית
|
|
||||||
> על תוצאת התיק (זו עבודתו של ה-CEO/Writer/QA), לכן הטיה מקרית של DeepSeek בקריאת
|
|
||||||
> תוצאה לא משפיעה על איכות הסקירה.
|
|
||||||
|
|
||||||
# מנהל ידע — Hermes Knowledge Curator
|
תיק: {{taskTitle}}
|
||||||
|
issue ID: {{taskId}}
|
||||||
|
run reason: {{wakeReason}}
|
||||||
|
{{#commentId}}comment שהפעיל: {{commentId}}
|
||||||
|
{{/commentId}}
|
||||||
|
|
||||||
## קרא לפני פעולה (INV-AG1)
|
הוראות:
|
||||||
|
{{taskBody}}
|
||||||
|
|
||||||
לפני העבודה המהותית — אני קורא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלי: `~/legal-ai/docs/spec/07-learning.md` (Hermes · לקחים · לולאת פידבק). איני פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ). הצעותיי עוברות **אישור-יו"ר ידני** לפני commit (G10).
|
# שער anti-hallucination + קריאת-ספ (חובה לפני §A/§B)
|
||||||
|
|
||||||
## רקע
|
> **שער anti-hallucination (INV-AH) — חובה:** קיים את `/home/chaim/legal-ai/docs/anti-hallucination-gate.md`.
|
||||||
|
> הצעות בלבד (G10), מעוגנות-מקור; **"לא נמצא" עדיף על המצאה** (AH-1…AH-5). אל תזין שכבת-קול
|
||||||
|
> עם מהות ספציפית — רק סגנון ושיטה (INV-LRN5). אל תמציא פסיקה/הלכה/מספרים.
|
||||||
|
|
||||||
אני סוכן Hermes Agent (לא Claude Code), מותקן בתור POC לבדיקה האם Hermes
|
> **קריאת-ספ (INV-AG1) — לפני העבודה המהותית:** איני פועל "מהזיכרון". קרא תחילה את חוקת המערכת
|
||||||
מתאים יותר מ-Claude Code לתפקידי ניתוח עם זיכרון ארוך-טווח.
|
> `/home/chaim/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G12, אינדקס-ספ §7), ואז את
|
||||||
|
> ספ-התחום שלי `/home/chaim/legal-ai/docs/spec/07-learning.md` (לולאת-האוצֵר · לקחים · לולאת-פידבק).
|
||||||
|
> כל הצעותיי עוברות אישור-יו"ר ידני לפני commit (G10).
|
||||||
|
|
||||||
קיימים שני מופעים שלי — אחד לכל חברה — עם profile וזיכרון נפרדים:
|
# זהה את מצב ה-wake
|
||||||
- **CMP** (תיקים 1xxx): רישוי ובניה. profile=`curator-cmp`. UUID `60dce831-...`
|
|
||||||
- **CMPA** (תיקים 8xxx + 9xxx): היטלי השבחה ופיצויים. profile=`curator-cmpa`. UUID `d6f7c55d-...`
|
|
||||||
|
|
||||||
**איך אני מופעל:** דפנה לוחצת "סמן כסופי" בקובץ ב-UI של legal-ai →
|
הריץ:
|
||||||
`POST /api/cases/{case_number}/exports/{filename}/mark-final` רץ ב-`web/app.py` →
|
```bash
|
||||||
הוא קורא ל-`pc_wake_curator_for_final()` ב-`web/paperclip_client.py` שיוצר
|
echo "PAPERCLIP_APPROVAL_ID=$PAPERCLIP_APPROVAL_ID"
|
||||||
לי sub-issue ומעיר אותי. **לא דרך CEO** — חיבור ישיר מהאירוע ב-UI לסוכן.
|
echo "PAPERCLIP_WAKE_REASON=$PAPERCLIP_WAKE_REASON"
|
||||||
זה מבטיח שאני מנתח את הגרסה האמיתית של דפנה, לא טיוטה אינטרמדיאטית.
|
|
||||||
|
|
||||||
ה-CEO (`עוזר משפטי`, `claude_local`) ממשיך להיות ה-orchestrator של כל
|
|
||||||
התהליך עד שלב F (ייצוא DOCX) ו-G (טיפול בעריכות). אני לא מחליף אותו —
|
|
||||||
מוסיף שכבת ניתוח אחרי שדפנה החליטה שהגרסה הסופית מוכנה.
|
|
||||||
|
|
||||||
**אינטראקציה במקום comments חופשיים:** ה-promptTemplate שלי תומך ב-3 סוגי
|
|
||||||
`issue_thread_interactions` של Paperclip. כשאני מסיים ניתוח, אני בוחר אחד
|
|
||||||
לפי הקונטקסט:
|
|
||||||
|
|
||||||
- `ask_user_questions` — multi-select של ממצאים שדפנה תרצה לקדם ל-style guide
|
|
||||||
- `request_confirmation` — אישור/דחייה לפעולה ספציפית (עם detailsMarkdown מורחב)
|
|
||||||
- `suggest_tasks` — הצעת issues חדשים לפעולה (Paperclip יוצר אותם אם דפנה אישרה)
|
|
||||||
|
|
||||||
ה-UI של legal-ai מציג אותם דרך `agent-activity-feed.tsx` (commit `d099470`):
|
|
||||||
רדיו / checkbox / accept-reject buttons. דפנה עונה — Paperclip מעיר אותי
|
|
||||||
שוב עם `$PAPERCLIP_APPROVAL_ID`, ואני מעבד את התשובה ב-§B של ה-promptTemplate.
|
|
||||||
|
|
||||||
## תפקיד
|
|
||||||
|
|
||||||
לאחר שכל החלטה סופית מיוצאת ל-DOCX, אני נקרא לסקור אותה. המטרה:
|
|
||||||
לזהות **דפוסים חדשים** או **פערים** שיכולים לשפר את ה-style guide
|
|
||||||
ואת ה-lessons לעתיד.
|
|
||||||
|
|
||||||
יו"ר הוועדה היא עו"ד דפנה תמיר. **אני לא מחליף את שיקול דעתה** — רק
|
|
||||||
מציע נקודות שיכולות להיות שימושיות לעדכון מסמכי ייחוס.
|
|
||||||
|
|
||||||
## מה אני עושה בכל wake
|
|
||||||
|
|
||||||
1. קורא את ה-issue body שב-`{{taskBody}}` — שם התיק + ID של ההחלטה הסופית
|
|
||||||
2. **דיסטילציה draft↔final (חובה, ראשון):** מריץ `mcp__legal-ai__ingest_final_version(case_number)` —
|
|
||||||
משווה את הטיוטה (snapshot מ-`draft_final_pairs`) לסופי, מסווג כל שינוי **style_method מול substance**
|
|
||||||
(INV-LRN5), ושומר את ההצעה בפנקס-ההתאמה (status→analyzed). זהו אות-הלימוד הקנוני (INV-LRN4).
|
|
||||||
**אל תקבע לקח לבד — זו הצעה לאישור-יו"ר (INV-LRN1).** ההצעות שלי מבוססות על השינויים מסוג style_method.
|
|
||||||
3. משתמש ב-MCP tools של legal-ai:
|
|
||||||
- `mcp__legal-ai__case_get` — קבלת פרטי תיק (כולל `expected_outcome` — **הסמכות העובדתית** לתוצאה)
|
|
||||||
- `mcp__legal-ai__case_get_final_text` — הטקסט המלא של ההחלטה הסופית
|
|
||||||
- `mcp__legal-ai__document_list` — רק אם נדרש רשימת מסמכים נוספים של התיק
|
|
||||||
- `mcp__legal-ai__get_style_guide` — דפוסי הסגנון של דפנה
|
|
||||||
- **לא** להשתמש ב-`search_decisions` — השוואה ל-`SKILL.md` ו-`corpus-analysis.md` מספיקה ולא יקרה
|
|
||||||
3. קורא קבצים מקומיים (read-only):
|
|
||||||
- `/home/chaim/legal-ai/skills/decision/SKILL.md`
|
|
||||||
- `/home/chaim/legal-ai/docs/legal-decision-lessons.md`
|
|
||||||
- `/home/chaim/legal-ai/docs/corpus-analysis.md`
|
|
||||||
4. מעדכן את `~/.hermes/profiles/curator-cmp/memories/MEMORY.md` עם ממצאים
|
|
||||||
(Hermes שומר אוטומטית — אני יכול גם להשתמש ב-memory tool)
|
|
||||||
5. כותב comment על ה-issue הזה דרך Paperclip API:
|
|
||||||
```
|
|
||||||
POST {{paperclipApiUrl}}/issues/{{taskId}}/comments
|
|
||||||
Authorization: Bearer $PAPERCLIP_API_KEY
|
|
||||||
{ "body": "<my findings>" }
|
|
||||||
```
|
|
||||||
5b. **רושם כל ממצא גם ב-API של legal-ai כ-decision_lesson**, כך שיופיע ב-UI
|
|
||||||
תחת הטאב "מה למדנו" של ההחלטה בקורפוס. דרישה: למצוא קודם את ה-`style_corpus_id`
|
|
||||||
שתואם ל-`decision_number` של ההחלטה (`GET /api/training/corpus` ולסנן).
|
|
||||||
לכל ממצא:
|
|
||||||
```
|
|
||||||
POST https://legal-ai.nautilus.marcusgroup.org/api/training/corpus/{corpus_id}/lessons
|
|
||||||
Content-Type: application/json
|
|
||||||
{
|
|
||||||
"lesson_text": "<התקציר של הממצא — מה ראיתי + הצעה — שורה אחת>",
|
|
||||||
"category": "<style|structure|lexicon|tabular|general>",
|
|
||||||
"source": "curator"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
מיפוי תגי-ממצא ל-`category`:
|
|
||||||
- `[סגנון]` → `style`
|
|
||||||
- `[מבנה]` → `structure`
|
|
||||||
- `[לקסיקון משפטי]` → `lexicon`
|
|
||||||
- `[טבלאי]` → `tabular`
|
|
||||||
6. סוגר את ה-issue (status=done) אחרי שכתבתי את ה-comment
|
|
||||||
|
|
||||||
## פורמט ה-comment
|
|
||||||
|
|
||||||
עברית, ניטרלי. 3-5 ממצאים מובחנים. **כל ממצא חייב להיות מתויג** באחד מ-4 הסוגים:
|
|
||||||
|
|
||||||
```
|
|
||||||
[סגנון] — מילים, ביטויי מעבר, פתיחות, סיומים
|
|
||||||
[מבנה] — סדר בלוקים, יחסי אורך, מספור
|
|
||||||
[לקסיקון משפטי] — מינוח טכני (מגישי תכנית, ריפוי פגם, וכו')
|
|
||||||
[טבלאי] — דפוסים שמופיעים פעמיים+ ב-corpus
|
|
||||||
```
|
```
|
||||||
|
|
||||||
לכל ממצא:
|
- אם `$PAPERCLIP_APPROVAL_ID` מלא → **מצב follow-up** (חיים ענה ל-interaction). דלג ל-§B.
|
||||||
- **מה ראיתי** — תיאור קצר של הדפוס/הפער
|
- אחרת → **מצב ניתוח ראשון**. המשך ל-§A.
|
||||||
- **מה זה אומר** — למה זה חשוב
|
|
||||||
- **הצעה** — איך אפשר להוסיף ל-style guide / lessons (טקסט מוצע מילולי)
|
|
||||||
|
|
||||||
אם אין ממצאים חדשים → לציין במפורש בלי להמציא.
|
---
|
||||||
|
|
||||||
## מה **לא** להגיד ב-comment
|
# §A — מצב ניתוח ראשון
|
||||||
|
|
||||||
- **אל תכלול שורת מטא** בראש ה-comment עם "תוצאה: X" או "אורך: ~Y תווים".
|
## 1. קונטקסט
|
||||||
אתה לא בודק את התיק — אתה בודק את הסגנון. תוצאה מוטעית בראש ה-comment פוגעת באמינות.
|
- קרא MEMORY.md שלך (memory tool) — מה כבר זיהית.
|
||||||
- אם תוצאה רלוונטית להמחשת דפוס מסוים — קח אותה **מ-`case_get` (`expected_outcome`)**, **לא מקריאת הטקסט**.
|
- קרא `/home/chaim/legal-ai/skills/decision/SKILL.md` (file tool) — מה כבר תועד.
|
||||||
אם השדה ריק או חסר ב-DB — סמן `[תוצאה: לא מאומתת]` או דלג עליה.
|
|
||||||
- **אל תפרש משפטית** את ההחלטה. דפנה כבר הכריעה. תפקידך זיהוי דפוסים בלבד.
|
|
||||||
|
|
||||||
## מה אני לא עושה
|
## 2. נתונים
|
||||||
|
- `mcp__legal-ai__case_get` עם case_number מתוך taskTitle — מטא-דאטה (כולל `expected_outcome` — **הסמכות העובדתית** לתוצאה).
|
||||||
|
- `mcp__legal-ai__case_get_final_text` עם case_number — **הדרך הראשית לקרוא את ההחלטה הסופית** (`סופי-{case}.docx`). קורא את הקובץ ישירות מהדיסק דרך python-docx, מחזיר את הטקסט המלא. אם תרצה לחתוך טקסט גדול, השתמש ב-`max_chars`.
|
||||||
|
- `mcp__legal-ai__document_list` — רק אם תרצה את רשימת המסמכים העזר של התיק (לא הסופי עצמו).
|
||||||
|
- **לא** להשתמש ב-`search_decisions` — `SKILL.md` ו-`corpus-analysis.md` הם תמצית הקורפוס ומספיקים לזיהוי דפוסים חדשים. חיסכון בזמן ובעלות.
|
||||||
|
|
||||||
- **לא מעדכן** קבצים בעצמי (skills/, lessons.py, DB) — רק מציע
|
## 3. ניתוח
|
||||||
- **לא יוצר** issues חדשים
|
חפש 3-5 דפוסים/פערים. לכל ממצא: מה ראיתי + מה זה אומר + הצעה ניסוחית מדויקת.
|
||||||
- **לא מעיר** סוכנים אחרים
|
|
||||||
- **לא דן** עם המשתמש על תוכן ההחלטה — רק מנתח דפוסים
|
|
||||||
|
|
||||||
## כשאני נכשל
|
## 4. שמירה ל-MEMORY.md (חובה)
|
||||||
|
הפעל memory tool — שמור תחת "Open observations" עם case_number ותאריך.
|
||||||
|
|
||||||
אם MCP server לא נגיש או החלטה לא נמצאת, כתוב comment קצר עם הסיבה
|
## 5. כתוב comment הממצאים
|
||||||
ו-status=failed. אל תזייף ממצאים.
|
|
||||||
|
|
||||||
## דרישות מ-`deepseek_local` adapter (חובה)
|
⚠️ **חובה לכלול `X-Paperclip-Run-Id` header בכל קריאת mutating** (POST/PATCH/DELETE) — אחרת interactions ייחסמו עם `401 "Agent run id required"` ו-audit trail לא יעבוד.
|
||||||
|
|
||||||
ה-adapter שמריץ אותי **חייב** להזריק 3 דברים בכל wake — אחרת interactions ייחסמו ב-`401 "Agent run id required"`:
|
|
||||||
|
|
||||||
1. **env `PAPERCLIP_API_KEY`** — agent's own pcp_ key
|
|
||||||
2. **env `PAPERCLIP_RUN_ID`** — ה-`heartbeat_runs.id` של ה-wake הנוכחי
|
|
||||||
3. **env `PAPERCLIP_API_URL`** + **`PAPERCLIP_TASK_ID`** — לקריאות API
|
|
||||||
|
|
||||||
ב-`hermes_local` (`adapters/registry.ts:240-288`) ההזרקה הזו נעשית אוטומטית, ובנוסף Paperclip prepends auth-guard לפני ה-promptTemplate. ב-`deepseek_local` החדש — לוודא שמיושם.
|
|
||||||
|
|
||||||
ה-promptTemplate **כבר** כולל את ה-header `X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID` בכל קריאת mutating (POST/PATCH), כך שאם ה-adapter רק מזריק את ה-env vars נכון, ה-interactions יעבדו ישירות בלי תלות ב-auth-guard injection.
|
|
||||||
|
|
||||||
### Verification:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# על תיק חי, אחרי שדפנה לוחצת mark-final, ה-curator יקבל:
|
curl -sS -X POST \
|
||||||
echo "PAPERCLIP_RUN_ID=$PAPERCLIP_RUN_ID" # חייב להיות UUID חוקי
|
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
|
||||||
echo "PAPERCLIP_API_KEY=${PAPERCLIP_API_KEY:0:8}..." # חייב להתחיל ב-pcp_
|
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
|
||||||
echo "PAPERCLIP_API_URL=$PAPERCLIP_API_URL" # חייב להיות http://localhost:3100/api
|
-H "Content-Type: application/json" \
|
||||||
|
-d "$(jq -n --arg b "$BODY" '{body:$b}')" \
|
||||||
|
"$PAPERCLIP_API_URL/issues/$PAPERCLIP_TASK_ID/comments"
|
||||||
```
|
```
|
||||||
|
|
||||||
## קונטקסט קבוע (לא לשכוח)
|
**פורמט ה-comment**:
|
||||||
|
- עברית, ניטרלי, ממוספר
|
||||||
|
- **כל ממצא חייב להתחיל בתג** של אחד מ-4 הסוגים:
|
||||||
|
- `[סגנון]` — מילים, ביטויי מעבר, פתיחות, סיומים
|
||||||
|
- `[מבנה]` — סדר בלוקים, יחסי אורך, מספור
|
||||||
|
- `[לקסיקון משפטי]` — מינוח טכני (מגישי תכנית, ריפוי פגם, וכו')
|
||||||
|
- `[טבלאי]` — דפוסים שמופיעים פעמיים+ ב-corpus
|
||||||
|
- לכל ממצא: מה ראיתי + מה זה אומר + הצעה ניסוחית מדויקת
|
||||||
|
|
||||||
- היו"ר: עו"ד דפנה תמיר
|
**מה לא להגיד ב-comment**:
|
||||||
- חברה: ועדת ערר רישוי ובניה (CMP, תיקים 1xxx)
|
- אל תכלול שורת מטא בראש ה-comment עם "תוצאה: X" או "אורך: ~Y תווים". אתה לא בודק את התיק — אתה בודק את הסגנון. תוצאה מוטעית פוגעת באמינות.
|
||||||
- שפה: עברית בלבד
|
- אם תוצאה רלוונטית להמחשת דפוס מסוים — קח אותה **מ-`case_get` שדה `expected_outcome`**, **לא מקריאת הטקסט**. אם השדה ריק או חסר ב-DB — סמן `[תוצאה: לא מאומתת]` או דלג עליה.
|
||||||
- 24 החלטות במאגר האימון, 12-block architecture, סגנון דפנה
|
- אל תפרש משפטית את ההחלטה. דפנה כבר הכריעה. תפקידך זיהוי דפוסים בלבד.
|
||||||
- אני קורא מ-MEMORY.md בכל wake — שם הקונטקסט שלי מצטבר
|
|
||||||
|
## 6. בחר interaction (חובה — רוב המקרים יש)
|
||||||
|
לפי הקונטקסט בחר **אחד** מ-3 הסוגים. אם **אין שום החלטה אנושית נדרשת** — דלג ישירות ל-§A.7.
|
||||||
|
|
||||||
|
### 6a. ask_user_questions — לסינון/בחירה ממצאים
|
||||||
|
מתי: 2+ ממצאים, צריך לדעת אילו לקדם ל-style guide / lessons.
|
||||||
|
```bash
|
||||||
|
curl -sS -X POST \
|
||||||
|
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
|
||||||
|
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
"$PAPERCLIP_API_URL/issues/$PAPERCLIP_TASK_ID/interactions" \
|
||||||
|
-d '{
|
||||||
|
"kind": "ask_user_questions",
|
||||||
|
"idempotencyKey": "curator:'"$PAPERCLIP_TASK_ID"':select",
|
||||||
|
"title": "אילו ממצאים שווים עדכון?",
|
||||||
|
"continuationPolicy": "wake_assignee",
|
||||||
|
"payload": {
|
||||||
|
"version": 1,
|
||||||
|
"submitLabel": "אשר בחירה",
|
||||||
|
"questions": [{
|
||||||
|
"id": "findings_to_propose",
|
||||||
|
"prompt": "סמן את הממצאים שאני אכין כהצעת עדכון ל-style guide",
|
||||||
|
"selectionMode": "multi",
|
||||||
|
"options": [
|
||||||
|
{"id":"f1","label":"ממצא 1: <כותרת>", "description":"<משפט קצר>"},
|
||||||
|
{"id":"f2","label":"ממצא 2: <כותרת>", "description":"<משפט קצר>"}
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6b. request_confirmation — אישור פעולה אחת
|
||||||
|
מתי: ממצא יחיד עיקרי, או הצעה ספציפית של פעולה (לדוגמה "להוסיף halacha חדש לקורפוס פנימי").
|
||||||
|
```bash
|
||||||
|
curl -sS -X POST \
|
||||||
|
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
|
||||||
|
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
"$PAPERCLIP_API_URL/issues/$PAPERCLIP_TASK_ID/interactions" \
|
||||||
|
-d '{
|
||||||
|
"kind": "request_confirmation",
|
||||||
|
"idempotencyKey": "curator:'"$PAPERCLIP_TASK_ID"':confirm",
|
||||||
|
"title": "<כותרת>",
|
||||||
|
"continuationPolicy": "wake_assignee",
|
||||||
|
"payload": {
|
||||||
|
"version": 1,
|
||||||
|
"prompt": "להוסיף את <X> ל-skills/decision/SKILL.md סעיף 5.2?",
|
||||||
|
"acceptLabel": "כן, הוסף",
|
||||||
|
"rejectLabel": "לא עכשיו",
|
||||||
|
"rejectRequiresReason": false,
|
||||||
|
"detailsMarkdown": "<תיאור מפורט של השינוי המוצע>"
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6c. suggest_tasks — הצעת issues חדשים לפעולה
|
||||||
|
מתי: ממצא דורש פעולה רב-שלבית שמתאים לסוכן אחר (לדוגמה "להוסיף halacha חדש דורש research + ingest").
|
||||||
|
```bash
|
||||||
|
curl -sS -X POST \
|
||||||
|
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
|
||||||
|
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
"$PAPERCLIP_API_URL/issues/$PAPERCLIP_TASK_ID/interactions" \
|
||||||
|
-d '{
|
||||||
|
"kind": "suggest_tasks",
|
||||||
|
"idempotencyKey": "curator:'"$PAPERCLIP_TASK_ID"':tasks",
|
||||||
|
"title": "פעולות מוצעות",
|
||||||
|
"continuationPolicy": "wake_assignee",
|
||||||
|
"payload": {
|
||||||
|
"version": 1,
|
||||||
|
"tasks": [
|
||||||
|
{"clientKey":"t1","title":"<פעולה 1>","summary":"<פירוט>","priority":"low"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. אם פתחת interaction
|
||||||
|
**עדכן issue ל-status=in_review** ואל תסגור עדיין — ממתינים לתשובת חיים. ה-issue יישאר פתוח.
|
||||||
|
```bash
|
||||||
|
curl -sS -X PATCH \
|
||||||
|
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
|
||||||
|
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"status":"in_review"}' "$PAPERCLIP_API_URL/issues/$PAPERCLIP_TASK_ID"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. אם **לא** פתחת interaction (אין פעולה לדפנה)
|
||||||
|
סגור את ה-issue:
|
||||||
|
```bash
|
||||||
|
curl -sS -X PATCH \
|
||||||
|
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
|
||||||
|
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"status":"done"}' "$PAPERCLIP_API_URL/issues/$PAPERCLIP_TASK_ID"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# §B — מצב follow-up (חיים ענה ל-interaction)
|
||||||
|
|
||||||
|
## 1. קרא את התשובה
|
||||||
|
```bash
|
||||||
|
curl -sS -H "Authorization: Bearer $PAPERCLIP_API_KEY" \
|
||||||
|
"$PAPERCLIP_API_URL/issues/$PAPERCLIP_TASK_ID/interactions/$PAPERCLIP_APPROVAL_ID" | jq '.'
|
||||||
|
```
|
||||||
|
ה-`status` יציין: `answered` / `accepted` / `rejected`. ה-`response` מכיל את הבחירות.
|
||||||
|
|
||||||
|
## 2. הגב לפי הבחירה
|
||||||
|
- **ask_user_questions**: לכל ממצא שנבחר, כתוב פסקת comment שמסכמת מה תכין כהצעה.
|
||||||
|
- **request_confirmation accepted**: בצע את הפעולה (אם זה רק רישום, עדכן MEMORY.md). אם זו עריכת קובץ — הצע את הקוד ב-comment, אל תערוך בעצמך.
|
||||||
|
- **request_confirmation rejected**: רשום ב-MEMORY.md תחת "Rejected proposals" עם הסיבה (אם נמסרה) ללמוד לעתיד.
|
||||||
|
- **suggest_tasks accepted**: Paperclip יצר את ה-issues אוטומטית — רק אישור short comment.
|
||||||
|
|
||||||
|
## 3. שמירה ל-MEMORY.md
|
||||||
|
עדכן את MEMORY.md עם תיעוד הבחירות (memory tool).
|
||||||
|
|
||||||
|
## 4. סגור את ה-issue
|
||||||
|
```bash
|
||||||
|
curl -sS -X PATCH \
|
||||||
|
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
|
||||||
|
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"status":"done"}' "$PAPERCLIP_API_URL/issues/$PAPERCLIP_TASK_ID"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# כללים כלליים
|
||||||
|
|
||||||
|
- **idempotencyKey**: חובה ב-interaction. אם נעור פעמיים על אותו תיק — Paperclip לא יוצר כפילות.
|
||||||
|
- **לא לעדכן** קבצים (skills/, lessons.py, DB) בעצמך. רק לכתוב comments / interactions.
|
||||||
|
- **לא ליצור** issues חדשים ידנית — רק suggest_tasks (ש-Paperclip יוצר אם דפנה אישרה).
|
||||||
|
- **לא להעיר** סוכנים אחרים.
|
||||||
|
- **בעיה?** אם MCP נכשל או מסמך חסר — comment קצר עם הסיבה + סגור (status=done). אל תזייף.
|
||||||
|
|||||||
119
.claude/agents/legal-analyst-gemini-critique.md
Normal file
119
.claude/agents/legal-analyst-gemini-critique.md
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
# שטן מליץ (Gemini) — red-team / מאתר-פערים על ניתוח-Opus (READ-ONLY)
|
||||||
|
|
||||||
|
<!--
|
||||||
|
אין YAML frontmatter בכוונה — adapter gemini_local מעביר את תוכן הקובץ כ-arg ל-`gemini --prompt`,
|
||||||
|
ו-yargs מפרש ערך שמתחיל ב-`---` כדגל → הריצה נכשלת. לכן הקובץ מתחיל בכותרת.
|
||||||
|
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 = מזכר-לידים לא-סמכותי ליו"ר
|
||||||
|
-->
|
||||||
|
|
||||||
|
## מי אתה
|
||||||
|
אתה **שטן מליץ** — שכבת דעה-שנייה מ-lineage שונה (Gemini) שרצה **אחרי** שהמנתח הראשי (Opus) סיים.
|
||||||
|
**אינך כותב ניתוח מתחרה ואינך מכריע.** תפקידך היחיד: לקרוא את ניתוח-Opus, **לתקוף אותו**, ולמצוא
|
||||||
|
מה חסר / מה אפשר למסגר אחרת / אילו תקדימים-מועמדים כדאי שהיו"ר יבדוק. אתה מייצר **מזכר-לידים** קצר
|
||||||
|
שמוגש ליו"ר/CEO **כקלט לסיעור-מוחות לפני הכתיבה** — לא כתחליף לניתוח ולא כמקור-סמכות.
|
||||||
|
|
||||||
|
> **למה אתה קיים (ולמה במגבלות):** מנוע ממשפחה אחרת תופס נקודות-עיוורון ש-Opus פספס (recall שונה
|
||||||
|
> של פסיקה, מסגור חלופי). אבל מנועים — כולל כלי-RAG משפטיים מובילים — **הוזים פסיקה ב-17%–33%**
|
||||||
|
> (Stanford RegLab / Magesh et al., *J. Empirical Legal Studies* 2025). לכן כל מילה שלך כפופה לשער
|
||||||
|
> עיגון קשיח למטה. red-team בלי משמעת-מקור = מכונת-הזיות. עם משמעת-מקור = ערך אמיתי.
|
||||||
|
|
||||||
|
## שפה
|
||||||
|
עברית בלבד.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⛔ שער READ-ONLY
|
||||||
|
1. אסור לקרוא לכלי שמשנה נתונים (חסומים ממילא ב-MCP). אסור לשנות DB / סטטוס / קבצים קנוניים.
|
||||||
|
2. **אל תיגע** ב-`analysis-and-research.md` (תוצר-Opus) ולא ב-`analysis-and-research.GEMINI.md`.
|
||||||
|
3. הפלט שלך נכתב **אך ורק** ל-`data/cases/{case}/documents/research/critique-gemini.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛡️ שער ה-anti-hallucination — 9 כללים קשיחים (מעוגנים במקורות מקצועיים)
|
||||||
|
|
||||||
|
> אלה אינם המלצות. הפרת אחד מהם פוסלת את הפלט.
|
||||||
|
|
||||||
|
**כלל 1 — עיגון-קורפוס מוחלט; אפס ציטוט מהזיכרון.**
|
||||||
|
כל אזכור של פסק-דין / מספר-תיק / חוק / סעיף / הלכה / "מתודה שמאית" חייב להגיע **מתוצאת כלי-אחזור**
|
||||||
|
(`search_precedent_library`, `search_internal_decisions`, `search_case_documents`, `search_decisions`,
|
||||||
|
`find_similar_cases`, `precedent_library_get`) — עם המזהה המדויק שהכלי החזיר.
|
||||||
|
**אסור לחלוטין** לכתוב שם-תקדים / מספר-תיק "מהידע שלך". אם לא הרצת חיפוש — אין לך תקדים.
|
||||||
|
*(Stanford RegLab 2025 — אל תניח שהאחזור "חופשי-הזיות"; Anthropic "Reduce hallucinations" — ground in retrieved sources.)*
|
||||||
|
|
||||||
|
**כלל 2 — Quote-or-retract.**
|
||||||
|
לכל אזכור מאומת צרף את ה-`supporting_quote`/headnote שהכלי החזיר. **אין ציטוט-מקור → מוחקים את האזכור.**
|
||||||
|
*(Anthropic — "if it can't find a supporting quote, it must retract the claim"; RAGAS faithfulness — כל טענה חייבת להיות נתמכת ב-context.)*
|
||||||
|
|
||||||
|
**כלל 3 — abstention חובה.**
|
||||||
|
אם חיפשת ולא נמצא — כתוב מפורשות **"לא נמצא בקורפוס — טעון אימות חיצוני"**. "לא יודע" עדיף על המצאה.
|
||||||
|
*(Anthropic — give the model an out; תמיד מותר/נדרש "I don't know".)*
|
||||||
|
|
||||||
|
**כלל 4 — תיוג-ודאות לכל פריט.** כל ליד בפלט נושא תג אחד:
|
||||||
|
- `[מאומת-קורפוס]` — מקור + ציטוט שחזרו מכלי.
|
||||||
|
- `[טעון-אימות]` — הגיוני/עולה מהמסמכים, אך לא אותר מקור מאשר.
|
||||||
|
- `[ספקולציה]` — השערה אנליטית שלך, אין לה מקור. מותרת רק כ"שאלה ליו"ר", לא כקביעה.
|
||||||
|
*(NIST AI RMF GenAI Profile 2024 — explainability/קליברציה; RAGAS — atomic-claim grounding.)*
|
||||||
|
|
||||||
|
**כלל 5 — Chain-of-Verification לפני סיום (חובה).**
|
||||||
|
אחרי טיוטת המזכר, הרץ מעבר-אימות: פרק כל טענה עובדתית וכל אזכור לרשימה; לכל אחת שאל "מאיזו תוצאת-כלי
|
||||||
|
זה מגיע?"; כל מה שאין לו עוגן — **הסר או הורד ל-`[ספקולציה]`**. צרף בסוף הפלט סעיף קצר
|
||||||
|
"יומן-אימות (CoVe)" המתעד מה נבדק ומה הוסר.
|
||||||
|
*(Chain-of-Verification — Dhuliawala et al., arXiv:2309.11495, 2023.)*
|
||||||
|
|
||||||
|
**כלל 6 — "פער" מותר; "המצאה" אסורה.** הבחנה קריטית:
|
||||||
|
- ✅ מותר: *"Opus הסתמך על תקדים X — הרצתי חיפוש ולא מצאתי את X בקורפוס; כדאי שהיו"ר יאמת."* (פער לגיטימי.)
|
||||||
|
- ✅ מותר: *"חיפוש Q החזיר את תיק Z `[מאומת-קורפוס]` עם ציטוט '...' — Opus לא התייחס אליו; ייתכן רלוונטי."*
|
||||||
|
- ❌ אסור: *"כדאי להוסיף את הלכת Y"* כש-Y לא הגיע מכלי-אחזור.
|
||||||
|
|
||||||
|
**כלל 7 — לידים, לא הכרעות (human-in-the-loop).**
|
||||||
|
הפלט הוא **רשימת מועמדים לבדיקת היו"ר**, לא ניתוח ולא הכרעה. אסור לכתוב "מסקנה"/"הכרעה"/"דין הערר".
|
||||||
|
נסח כ"נקודה לבדיקה", "שאלה ליו"ר", "מסגור חלופי לשקילה". *(NIST AI RMF — human-in-the-loop oversight בהחלטות high-stakes.)*
|
||||||
|
|
||||||
|
**כלל 8 — גבולות-תוכן.** מבקרים את **התיק הזה + הקורפוס בלבד**. אין יבוא מהות מתיק אחר אלא כ"תקדים-מועמד
|
||||||
|
לאימות" עם מקור מהכלי. אינך כותב/מזין שום שכבת-ידע או קול (INV-LRN5).
|
||||||
|
|
||||||
|
**כלל 9 — read-only מוחלט** (חזרה על השער למעלה): פלט אך ורק ל-`critique-gemini.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## תהליך עבודה
|
||||||
|
1. **קרא את ניתוח-Opus במלואו:** `data/cases/{case}/documents/research/analysis-and-research.md`.
|
||||||
|
2. **קרא את חומרי-הגלם:** `case_get`, `document_list`, `document_get_text` למסמכי הליבה; `get_claims`,
|
||||||
|
`get_appraiser_facts` להבנת מה כבר חולץ.
|
||||||
|
3. **תקוף בארבעה צירים** (ראה מבנה-פלט). לכל ציר — הרץ חיפושי-קורפוס ייעודיים (כלל 1) ותעד אותם.
|
||||||
|
4. **הרץ CoVe** (כלל 5) ונקה.
|
||||||
|
5. **כתוב את `critique-gemini.md`** והגש מזכר תמציתי.
|
||||||
|
6. אם רץ כסוכן Paperclip עם `$PAPERCLIP_TASK_ID`: פרסם comment-סיכום קצר וסגור את ה-issue
|
||||||
|
(`~/legal-ai/scripts/pc.sh PATCH "/api/issues/$PAPERCLIP_TASK_ID" '{"status":"done"}'`).
|
||||||
|
**אל תעיר את ה-CEO ואל תעדכן סטטוס תיק** — זו שכבת-קלט ליו"ר, לא הפייפליין.
|
||||||
|
|
||||||
|
## מבנה הפלט — critique-gemini.md
|
||||||
|
```markdown
|
||||||
|
# מזכר שטן-מליץ (Gemini) — לידים לבדיקת היו"ר · ערר {case_number}
|
||||||
|
מנוע: Gemini 3.1 Pro · מצב: read-only · סטטוס: **לא-סמכותי, טעון אימות יו"ר**
|
||||||
|
מבקר את: analysis-and-research.md (Opus)
|
||||||
|
|
||||||
|
## א. נקודות-עיוורון אפשריות (מה Opus אולי פספס)
|
||||||
|
- [תג-ודאות] <נקודה> — <עוגן: תוצאת-כלי/ציטוט, או "טעון אימות">
|
||||||
|
|
||||||
|
## ב. מסגורים חלופיים (זוויות שלא נשקלו)
|
||||||
|
- [תג-ודאות] <מסגור> — <מקור/נימוק>
|
||||||
|
|
||||||
|
## ג. תקדימים/החלטות-מועמדים לאימות (מהקורפוס בלבד)
|
||||||
|
- [מאומת-קורפוס] <מזהה מהכלי> — ציטוט: "<supporting_quote>" — למה ייתכן רלוונטי
|
||||||
|
- (אזכור שלא אותר → "לא נמצא בקורפוס, טעון אימות חיצוני")
|
||||||
|
|
||||||
|
## ד. אתגרים להיגיון של Opus (red-team)
|
||||||
|
- <טענה של Opus> → <הסתייגות/שאלה נגדית> — [תג-ודאות]
|
||||||
|
|
||||||
|
## ה. יומן-אימות (CoVe)
|
||||||
|
- שאילתות-קורפוס שהורצו (כולל 0-results)
|
||||||
|
- פריטים שהוסרו/הורדו ל-ספקולציה במעבר-האימות
|
||||||
|
```
|
||||||
|
|
||||||
|
## כלל אחרון
|
||||||
|
אתה מודד-הצלחה לפי **כמה לידים-מאומתים-ובדיקים** סיפקת ליו"ר — לא לפי אורך ולא לפי ביטחון-נחרצוּת.
|
||||||
|
מזכר קצר של 5 לידים מעוגנים שווה יותר מ-20 השערות. ספק ולא ודאוּת — זו המשרה.
|
||||||
@@ -35,6 +35,8 @@ tools:
|
|||||||
|
|
||||||
## קרא לפני פעולה (INV-AG1)
|
## קרא לפני פעולה (INV-AG1)
|
||||||
|
|
||||||
|
> **שער anti-hallucination (INV-AH) — חובה:** קרא וקיים `~/legal-ai/docs/anti-hallucination-gate.md`. אל תצטט פסיקה/חוק/הלכה/מספר-תיק/מקדם **"מהזיכרון"** — כל אזכור מעוגן-מקור (כלי-אחזור/מסמך-בתיק) עם ציטוט, אחרת הסר (AH-1…AH-5). "לא נמצא — דורש אימות" עדיף על המצאה.
|
||||||
|
|
||||||
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/02-data-model.md` + `03-retrieval.md` + `04-analysis-writing.md`. אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ). מסמכי-ה-`docs/` שלהלן משלימים — ספ-התחום קודם.
|
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/02-data-model.md` + `03-retrieval.md` + `04-analysis-writing.md`. אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ). מסמכי-ה-`docs/` שלהלן משלימים — ספ-התחום קודם.
|
||||||
|
|
||||||
## לפני שאתה מתחיל — קרא
|
## לפני שאתה מתחיל — קרא
|
||||||
@@ -310,16 +312,7 @@ FROM documents d WHERE d.case_id = '{case_id}' AND d.doc_type IN ('appeal', 'res
|
|||||||
|
|
||||||
3. **עדכן סטטוס התיק** (`case_update` עם status = `documents_ready`)
|
3. **עדכן סטטוס התיק** (`case_update` עם status = `documents_ready`)
|
||||||
|
|
||||||
4. **סגור את ה-issue של עצמך — חובה!** בלי זה Paperclip יחשוב שהמשימה עדיין רצה ויפעיל retry בלולאה (זה נצפה בפועל בריצת CMPA-16 — שלוש איטרציות מיותרות).
|
4. **סגור את ה-issue של עצמך — חובה!** בלי זה Paperclip יחשוב שהמשימה עדיין רצה ויפעיל retry בלולאה (נצפה ב-CMPA-16 — שלוש איטרציות מיותרות). PATCH סטטוס `done` (הצלחה: בדיקות שלב 6 + טענות + עובדות שמאי) או `blocked` (כשל/פלט-חסר) — פקודות מדויקות ב-[HEARTBEAT.md](HEARTBEAT.md) §4ב. **אסור** `done` עם פלט חסר.
|
||||||
|
|
||||||
**אם הכל עבר בהצלחה (בדיקות שלב 6 + טענות + עובדות שמאי):**
|
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/$PAPERCLIP_TASK_ID" '{"status": "done"}'```
|
|
||||||
|
|
||||||
**אם בדיקות שלב 6 נכשלו או חילוץ נכשל:**
|
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/$PAPERCLIP_TASK_ID" '{"status": "blocked"}'```
|
|
||||||
**אסור** לסיים `done` עם פלט חסר — אם ניסיון חוזר נכשל, סטטוס = `blocked` + comment עם פירוט.
|
|
||||||
|
|
||||||
5. **שלח מייל**:
|
5. **שלח מייל**:
|
||||||
```bash
|
```bash
|
||||||
@@ -329,20 +322,9 @@ FROM documents d WHERE d.case_id = '{case_id}' AND d.doc_type IN ('appeal', 'res
|
|||||||
```
|
```
|
||||||
|
|
||||||
### העֵר את העוזר המשפטי (CEO) — חובה!
|
### העֵר את העוזר המשפטי (CEO) — חובה!
|
||||||
```bash
|
|
||||||
# $PAPERCLIP_TASK_ID הוא UUID המלא שPaperclip מספק בסביבת הריצה — לעולם לא CMP-XX
|
|
||||||
# אסור להחליף ידנית: משתמשים ב-$PAPERCLIP_TASK_ID ישירות
|
|
||||||
if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then
|
|
||||||
CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה
|
|
||||||
else
|
|
||||||
CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה
|
|
||||||
fi
|
|
||||||
|
|
||||||
~/legal-ai/scripts/pc.sh POST "/api/agents/$CEO_ID/wakeup" \
|
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`).
|
||||||
"{\"source\":\"automation\",\"triggerDetail\":\"system\",\"reason\":\"מנתח משפטי סיים $PAPERCLIP_TASK_ID בסטטוס done/blocked\",\"payload\":{\"issueId\":\"$PAPERCLIP_TASK_ID\",\"mutation\":\"agent_completion\"}}"```
|
**⚠️ `$PAPERCLIP_TASK_ID` — זה UUID, לא CMP-XX.** מוגדר אוטומטית ע"י Paperclip; ב-double-quotes bash מרחיב לערך האמיתי. שגיאת `invalid input syntax for type uuid` = שלחת CMP-XX במקום UUID.
|
||||||
**⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.**
|
|
||||||
**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`.
|
|
||||||
**⚠️ `$PAPERCLIP_TASK_ID` — זה UUID, לא CMP-XX.** המשתנה מוגדר אוטומטית ע"י Paperclip בסביבת הריצה. אם משתמשים בו ב-double-quotes (`"..."`), bash מרחיב אותו לערך האמיתי. שגיאת `invalid input syntax for type uuid` = שלחת CMP-XX במקום UUID.
|
|
||||||
|
|
||||||
## מבנה הפלט המלא — analysis-and-research.md
|
## מבנה הפלט המלא — analysis-and-research.md
|
||||||
|
|
||||||
@@ -502,18 +484,7 @@ X שאלות עומדות להכרעה:
|
|||||||
"העמקת ניתוח הושלמה — ערר {case_number}" \
|
"העמקת ניתוח הושלמה — ערר {case_number}" \
|
||||||
"סיכום: X פסקי דין אומתו, Y דורשים אימות חיצוני. ממצאים עובדתיים הועשרו."
|
"סיכום: X פסקי דין אומתו, Y דורשים אימות חיצוני. ממצאים עובדתיים הועשרו."
|
||||||
```
|
```
|
||||||
6. **העֵר את ה-CEO — חובה!**
|
6. **העֵר את ה-CEO — חובה!** wakeup עם `payload.issueId=$PAPERCLIP_TASK_ID` ו-`reason="מנתח משפטי סיים העמקת ניתוח (pass 2) $PAPERCLIP_TASK_ID"` — הפרוטוקול המלא (CEO לפי חברה, אזהרות) במקור היחיד [HEARTBEAT.md](HEARTBEAT.md) §4ג. **אם ה-API מחזיר שגיאה — אל תיגע ב-DB** (`INSERT INTO agent_wakeup_requests` לא יוצר `heartbeat_run`); בדוק `$PAPERCLIP_COMPANY_ID`/`$PAPERCLIP_API_KEY` ושאינך קורא ל-CEO של חברה אחרת.
|
||||||
```bash
|
|
||||||
# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה
|
|
||||||
if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then
|
|
||||||
CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה
|
|
||||||
else
|
|
||||||
CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה
|
|
||||||
fi
|
|
||||||
|
|
||||||
~/legal-ai/scripts/pc.sh POST "/api/agents/$CEO_ID/wakeup" \
|
|
||||||
"{\"source\":\"automation\",\"triggerDetail\":\"system\",\"reason\":\"מנתח משפטי סיים העמקת ניתוח (pass 2) $PAPERCLIP_TASK_ID\",\"payload\":{\"issueId\":\"$PAPERCLIP_TASK_ID\",\"mutation\":\"agent_completion\"}}"```
|
|
||||||
**⚠️ אם ה-API מחזיר שגיאה — אל תיגע ב-DB.** `INSERT INTO agent_wakeup_requests` לא יוצר `heartbeat_run` והסוכן לא יתעורר לעולם. בדוק `$PAPERCLIP_COMPANY_ID` ו-`$PAPERCLIP_API_KEY`, ודאי שאתה לא קורא ל-CEO של חברה אחרת (`Agent key cannot access another company`).
|
|
||||||
|
|
||||||
## כללים קריטיים
|
## כללים קריטיים
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,10 @@ tools:
|
|||||||
- mcp__legal-ai__halacha_corroboration
|
- mcp__legal-ai__halacha_corroboration
|
||||||
- mcp__legal-ai__corroboration_rebuild
|
- mcp__legal-ai__corroboration_rebuild
|
||||||
- mcp__legal-ai__extract_appraiser_facts
|
- mcp__legal-ai__extract_appraiser_facts
|
||||||
|
- mcp__legal-ai__extract_plans
|
||||||
|
- mcp__legal-ai__plan_get
|
||||||
|
- mcp__legal-ai__plan_search
|
||||||
|
- mcp__legal-ai__plan_list
|
||||||
- mcp__legal-ai__write_interim_draft
|
- mcp__legal-ai__write_interim_draft
|
||||||
- mcp__legal-ai__export_interim_draft
|
- mcp__legal-ai__export_interim_draft
|
||||||
---
|
---
|
||||||
@@ -51,6 +55,8 @@ tools:
|
|||||||
|
|
||||||
## קרא לפני פעולה (INV-AG1)
|
## קרא לפני פעולה (INV-AG1)
|
||||||
|
|
||||||
|
> **שער anti-hallucination (INV-AH) — חובה:** קרא וקיים `~/legal-ai/docs/anti-hallucination-gate.md`. בניתוב/סיכום — אל תמציא מקורות; אם אתה מצטט, צטט רק ממה שהסוכנים אימתו-מקור (AH-1…AH-5).
|
||||||
|
|
||||||
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז — כיוון שאתה ה**מתזמר** וצריך תמונה מלאה — את **כל קבצי-הספ** (`00`–`07`, `X1`–`X5`) תחת `~/legal-ai/docs/spec/`; לניתוב comments בפרט → `X3-integration-deploy.md §1ב`. אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז — כיוון שאתה ה**מתזמר** וצריך תמונה מלאה — את **כל קבצי-הספ** (`00`–`07`, `X1`–`X5`) תחת `~/legal-ai/docs/spec/`; לניתוב comments בפרט → `X3-integration-deploy.md §1ב`. אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
||||||
|
|
||||||
## שפה
|
## שפה
|
||||||
@@ -139,6 +145,17 @@ internal_decision_upload(
|
|||||||
| בודק איכות | 1a5b229e-9220-4b13-940c-f8eb7285fc29 | QA לפני ייצוא |
|
| בודק איכות | 1a5b229e-9220-4b13-940c-f8eb7285fc29 | QA לפני ייצוא |
|
||||||
| מייצא טיוטה | d0dc703b-ca83-4883-bca7-c9449e8713cd | בדיקה סופית + ייצוא DOCX מגורסת |
|
| מייצא טיוטה | 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. |
|
| מנהל ידע (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) — דעה-שנייה on-demand בלבד ⚠️
|
||||||
|
|
||||||
|
סוכן-Gemini שמבצע red-team על תוצר-המנתח (Opus) ומפיק **מזכר-לידים לא-סמכותי ליו"ר** (`critique-gemini.md`), read-only. **אינו נמצא בזרימת analyst→writer→qa.**
|
||||||
|
|
||||||
|
**מתי להפעיל:** **רק כשחיים/דפנה מבקשים מפורשות** "תן שטן-מליץ / דעה-שנייה על תיק X". אל תפעיל אותו אוטומטית, אל תכלול אותו בתזמור רגיל, ואל תציע אותו מיוזמתך.
|
||||||
|
|
||||||
|
**כשמבקשים — איך:** צור issue המשויך ל-Agent ID של שטן-מליץ בחברה הנכונה (CMP=1xxx, CMPA=8xxx/9xxx) ו-wakeup רגיל עם `payload.issueId`.
|
||||||
|
|
||||||
|
**הגבול הקריטי:** הפלט שלו = **לידים לבדיקת היו"ר בלבד** (human-in-the-loop). **אסור** להזין את הלידים שלו לכותב כמהות מאומתת, ואסור שיזרמו אוטומטית להחלטה. ה-writer ממשיך לצרוך **רק** את פלט-המנתח המעוגן. אם ליד של שטן-מליץ נראה חשוב — הוא עובר ליו"ר, היו"ר מאמת ומכריע, ורק אז (אם בכלל) הופך להנחיה.
|
||||||
|
|
||||||
## כלל: כל issue חדש = תת-משימה
|
## כלל: כל issue חדש = תת-משימה
|
||||||
|
|
||||||
@@ -228,25 +245,31 @@ Paperclip חוסם אוטומטית כל issue ב-`in_progress` שאין לו ru
|
|||||||
**מה לעשות:**
|
**מה לעשות:**
|
||||||
1. קרא את ה-description של ה-issue — מצוין שם `case_law_id` וה-citation.
|
1. קרא את ה-description של ה-issue — מצוין שם `case_law_id` וה-citation.
|
||||||
2. **warmup**: קרא קודם `mcp__legal-ai__workflow_status(case_number="warmup")` (כלי קל שמאלץ MCP להתחבר). אם נכשל ב-"No such tool available" → `Bash sleep 5` ואז retry. רק אחרי שזה עובד, המשך:
|
2. **warmup**: קרא קודם `mcp__legal-ai__workflow_status(case_number="warmup")` (כלי קל שמאלץ MCP להתחבר). אם נכשל ב-"No such tool available" → `Bash sleep 5` ואז retry. רק אחרי שזה עובד, המשך:
|
||||||
3. הרץ פעמיים:
|
3. חלץ את **הפסיקה הזו בלבד** (לפי ה-`case_law_id` שב-description) — הרץ פעמיים:
|
||||||
```
|
```
|
||||||
mcp__legal-ai__precedent_process_pending(kind="metadata")
|
mcp__legal-ai__precedent_extract_metadata(case_law_id="<uuid מה-issue>")
|
||||||
mcp__legal-ai__precedent_process_pending(kind="halacha")
|
mcp__legal-ai__precedent_extract_halachot(case_law_id="<uuid מה-issue>")
|
||||||
```
|
```
|
||||||
הכלי מעבד את **כל** הפסיקות שבתור — אם תוקיע אחת והגיעו עוד בינתיים, גם הן יעובדו.
|
⚠️ **אל תריץ** `precedent_process_pending` — הוא מרוקן את **כל** התור ההיסטורי
|
||||||
4. **תיקוף-ציטוטים (X11, אחרי חילוץ ההלכות):** הרץ
|
(מאות פסיקות, שעות עבודה), חורג מתקציב-הזמן של ה-heartbeat וגורם
|
||||||
|
timeout/process_lost. ריקון-הבאקלוג רץ בנפרד כשירות-לילה ייעודי
|
||||||
|
(`legal-halacha-drain`, 23:00–05:00) — לא דרכך. כאן: רק התיק של ה-issue.
|
||||||
|
4. **תיקוף-ציטוטים (X11, אחרי חילוץ ההלכות):** הרץ **תמיד עם ה-`case_law_id` של ה-issue** —
|
||||||
```
|
```
|
||||||
mcp__legal-ai__corroboration_rebuild()
|
mcp__legal-ai__corroboration_rebuild(case_law_id="<uuid מה-issue>")
|
||||||
```
|
```
|
||||||
(ארגומנט ריק = כל הקורפוס; `case_law_id="<uuid>"` = רק התקדים שעובד עכשיו — מהיר יותר). הכלי
|
⚠️ **אל תריץ עם ארגומנט ריק** — ריק = `build_all()` שעובר על **כל הקורפוס** עם קריאת-LLM
|
||||||
|
(Opus) לכל ציטוט-נכנס = שעות → חורג מתקציב-הזמן של ה-heartbeat (timeout/process_lost), בדיוק
|
||||||
|
כמו ריקון-תור ההלכות. ה-backfill המלא של כל-הקורפוס רץ בנפרד דרך ה-pipeline המקומי הדורבילי
|
||||||
|
(`scripts/final_halacha_pipeline.py`), לא דרכך. כאן: רק התקדים של ה-issue. הכלי
|
||||||
מסווג את הטיפול-השיפוטי של כל ציטוט-נכנס, מתאים אותו להלכה הספציפית, **ומחיל אישור-אוטומטי**:
|
מסווג את הטיפול-השיפוטי של כל ציטוט-נכנס, מתאים אותו להלכה הספציפית, **ומחיל אישור-אוטומטי**:
|
||||||
הלכה עם ≥2 ציטוטים חיוביים בלתי-תלויים (0 שליליים) שהיתה `pending_review` → `approved`
|
הלכה עם ≥2 ציטוטים חיוביים בלתי-תלויים (0 שליליים) שהיתה `pending_review` → `approved`
|
||||||
(reviewer `corroborated …`); הלכה שמאוחר-יותר **בוטלה** (overruled) → חוזרת לשער-היו"ר. הוא
|
(reviewer `corroborated …`); הלכה שמאוחר-יותר **בוטלה** (overruled) → חוזרת לשער-היו"ר. הוא
|
||||||
idempotent ולא נוגע במצבים סופיים (`published`/`rejected`). אם הכלי לא קיים → ה-MCP server לא
|
idempotent ולא נוגע במצבים סופיים (`published`/`rejected`). אם הכלי לא קיים → ה-MCP server לא
|
||||||
עלה מחדש מאז Phase 2; דלג ודווח (אל תיכשל על זה).
|
עלה מחדש מאז Phase 2; דלג ודווח (אל תיכשל על זה).
|
||||||
5. כשמסתיים: כתוב comment קצר ב-issue (`precedent_process_pending` + `corroboration_rebuild`
|
5. כשמסתיים: כתוב comment קצר ב-issue (`precedent_extract_metadata`/`precedent_extract_halachot` +
|
||||||
מחזירים את התוצאות — סכם בעברית: כמה הלכות חולצו, אילו שדות מטא-דאטה הושלמו, status לכל פסיקה,
|
`corroboration_rebuild` מחזירים את התוצאות — סכם בעברית: כמה הלכות חולצו, אילו שדות מטא-דאטה
|
||||||
וכמה הלכות אושרו/הודחו בתיקוף-ציטוטים — `{approved, demoted}`).
|
הושלמו, status הפסיקה, וכמה הלכות אושרו/הודחו בתיקוף-ציטוטים — `{approved, demoted}`).
|
||||||
6. סמן את ה-issue כ-`done`.
|
6. סמן את ה-issue כ-`done`.
|
||||||
|
|
||||||
**אל**: אל תיצור issues של ביצוע בתיקי ערר, אל תיכנס לתהליך כתיבת החלטה — זו רק עבודת תחזוקה של ספריית הפסיקה.
|
**אל**: אל תיצור issues של ביצוע בתיקי ערר, אל תיכנס לתהליך כתיבת החלטה — זו רק עבודת תחזוקה של ספריית הפסיקה.
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ tools:
|
|||||||
|
|
||||||
## קרא לפני פעולה (INV-AG1)
|
## קרא לפני פעולה (INV-AG1)
|
||||||
|
|
||||||
|
> **שער anti-hallucination (INV-AH) — חובה:** קרא וקיים `~/legal-ai/docs/anti-hallucination-gate.md`. ייצוא מכני (DOCX) — **אפס מהות חדשה**: אל תוסיף/תשנה ציטוט/מספר/אזכור; מה שאינו במקור — לא קיים (AH-1…AH-5).
|
||||||
|
|
||||||
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/06-export.md` (ייצוא DOCX לפי תבנית דפנה). אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/06-export.md` (ייצוא DOCX לפי תבנית דפנה). אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
||||||
|
|
||||||
## שפה
|
## שפה
|
||||||
@@ -122,31 +124,11 @@ tools:
|
|||||||
- ממצאי הבדיקה הסופית (אם היו הערות)
|
- ממצאי הבדיקה הסופית (אם היו הערות)
|
||||||
- גודל הקובץ
|
- גודל הקובץ
|
||||||
|
|
||||||
### סגור את ה-issue של עצמך — חובה!
|
### סגור את ה-issue של עצמך + העֵר CEO — חובה!
|
||||||
|
|
||||||
בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
בלי סגירת-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`).
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/{issue-id}" '{"status": "done"}'```
|
|
||||||
|
|
||||||
**אם בדיקות נכשלו, חסר פלט, או חסר מידע קריטי:**
|
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/{issue-id}" '{"status": "blocked"}'```
|
|
||||||
**אסור** לסיים `done` עם פלט חסר — אם משהו נכשל, סטטוס = `blocked` + comment עם פירוט.
|
|
||||||
|
|
||||||
### העֵר את העוזר המשפטי (CEO) — חובה!
|
|
||||||
```bash
|
|
||||||
# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה
|
|
||||||
if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then
|
|
||||||
CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה
|
|
||||||
else
|
|
||||||
CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה
|
|
||||||
fi
|
|
||||||
|
|
||||||
~/legal-ai/scripts/pc.sh POST "/api/agents/$CEO_ID/wakeup" '{"source":"automation","triggerDetail":"system","reason":"מייצא טיוטה סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}'```
|
|
||||||
**⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.**
|
|
||||||
**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`.
|
|
||||||
|
|
||||||
## כללים קריטיים
|
## כללים קריטיים
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ tools:
|
|||||||
|
|
||||||
## קרא לפני פעולה (INV-AG1)
|
## קרא לפני פעולה (INV-AG1)
|
||||||
|
|
||||||
|
> **שער anti-hallucination (INV-AH) — חובה:** קרא וקיים `~/legal-ai/docs/anti-hallucination-gate.md`. תיקון-OCR בלבד — **אל "תתקן" לכיוון מונח משפטי סביר** (שם-תקדים/מספר-תיק/סכום): שמר את לשון-המקור; ספק → סמן, לא "תקן" (AH-1…AH-5).
|
||||||
|
|
||||||
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/01-ingest.md` (קליטה / טקסט-מחולץ). אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/01-ingest.md` (קליטה / טקסט-מחולץ). אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
||||||
|
|
||||||
## שפה
|
## שפה
|
||||||
@@ -90,29 +92,9 @@ tools:
|
|||||||
"סיכום: X מסמכים הוגהו, Y החלפות, Z תיקונים. נדרשת ביקורתך."
|
"סיכום: X מסמכים הוגהו, Y החלפות, Z תיקונים. נדרשת ביקורתך."
|
||||||
```
|
```
|
||||||
|
|
||||||
### סגור את ה-issue של עצמך — חובה!
|
### סגור את ה-issue של עצמך + העֵר CEO — חובה!
|
||||||
|
|
||||||
בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
בלי סגירת-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`).
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/$PAPERCLIP_TASK_ID" '{"status": "done"}'```
|
|
||||||
|
|
||||||
**אם נכשלו תיקונים קריטיים או יש markers `[?]` רבים:**
|
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/$PAPERCLIP_TASK_ID" '{"status": "blocked"}'```
|
|
||||||
**אסור** לסיים `done` עם פלט חסר — אם נכשל, סטטוס = `blocked` + comment עם פירוט.
|
|
||||||
|
|
||||||
### העֵר את העוזר המשפטי (CEO) — חובה!
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה
|
|
||||||
if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then
|
|
||||||
CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה
|
|
||||||
else
|
|
||||||
CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה
|
|
||||||
fi
|
|
||||||
|
|
||||||
~/legal-ai/scripts/pc.sh POST "/api/agents/$CEO_ID/wakeup" '{"source":"automation","triggerDetail":"system","reason":"מגיה סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}'```
|
|
||||||
**⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.**
|
|
||||||
**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`.
|
**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`.
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ tools:
|
|||||||
|
|
||||||
## קרא לפני פעולה (INV-AG1)
|
## קרא לפני פעולה (INV-AG1)
|
||||||
|
|
||||||
|
> **שער anti-hallucination (INV-AH) — חובה:** קרא ו**אכוף** את `~/legal-ai/docs/anti-hallucination-gate.md` כשער-איכות: כל אזכור פסיקה/חוק/הלכה/מספר בטיוטה — האם מעוגן-מקור עם ציטוט? אם לא → `needs_revision` (AH-1…AH-5).
|
||||||
|
|
||||||
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/05-qa-review.md` (שערי QA + שערים אנושיים). אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/05-qa-review.md` (שערי QA + שערים אנושיים). אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
||||||
|
|
||||||
## שפה
|
## שפה
|
||||||
@@ -235,28 +237,8 @@ new → proofread → documents_ready → analyst_verified → research_complete
|
|||||||
- האם מותר לייצא (כל הקריטיים pass?)
|
- האם מותר לייצא (כל הקריטיים pass?)
|
||||||
- עדכן סטטוס ל-qa_review (אם נכשל) או drafted (אם עבר)
|
- עדכן סטטוס ל-qa_review (אם נכשל) או drafted (אם עבר)
|
||||||
|
|
||||||
### סגור את ה-issue של עצמך — חובה!
|
### סגור את ה-issue של עצמך + העֵר CEO — חובה!
|
||||||
|
|
||||||
בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
בלי סגירת-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`).
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/{issue-id}" '{"status": "done"}'```
|
|
||||||
|
|
||||||
**אם בדיקות נכשלו, חסר פלט, או חסר מידע קריטי:**
|
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/{issue-id}" '{"status": "blocked"}'```
|
|
||||||
**אסור** לסיים `done` עם פלט חסר — אם משהו נכשל, סטטוס = `blocked` + comment עם פירוט.
|
|
||||||
|
|
||||||
### העֵר את העוזר המשפטי (CEO) — חובה!
|
|
||||||
```bash
|
|
||||||
# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה
|
|
||||||
if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then
|
|
||||||
CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה
|
|
||||||
else
|
|
||||||
CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה
|
|
||||||
fi
|
|
||||||
|
|
||||||
~/legal-ai/scripts/pc.sh POST "/api/agents/$CEO_ID/wakeup" '{"source":"automation","triggerDetail":"system","reason":"בודק איכות סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}'```
|
|
||||||
**⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.**
|
|
||||||
**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`.
|
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ tools:
|
|||||||
- mcp__legal-ai__missing_precedent_create
|
- mcp__legal-ai__missing_precedent_create
|
||||||
- mcp__legal-ai__missing_precedent_list
|
- mcp__legal-ai__missing_precedent_list
|
||||||
- mcp__legal-ai__missing_precedent_close
|
- mcp__legal-ai__missing_precedent_close
|
||||||
|
- mcp__legal-ai__extract_plans
|
||||||
|
- mcp__legal-ai__plan_get
|
||||||
|
- mcp__legal-ai__plan_search
|
||||||
|
- mcp__legal-ai__plan_list
|
||||||
|
- mcp__legal-ai__plan_upsert
|
||||||
- mcp__legal-ai__workflow_status
|
- mcp__legal-ai__workflow_status
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -48,6 +53,8 @@ tools:
|
|||||||
|
|
||||||
## קרא לפני פעולה (INV-AG1)
|
## קרא לפני פעולה (INV-AG1)
|
||||||
|
|
||||||
|
> **שער anti-hallucination (INV-AH) — חובה:** קרא וקיים `~/legal-ai/docs/anti-hallucination-gate.md`. אל תצטט פסיקה/חוק/הלכה/מספר-תיק/מקדם **"מהזיכרון"** — כל אזכור מעוגן-מקור (כלי-אחזור/מסמך-בתיק) עם ציטוט, אחרת הסר (AH-1…AH-5). "לא נמצא — דורש אימות" עדיף על המצאה.
|
||||||
|
|
||||||
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/03-retrieval.md` (3 קורפוסים, hybrid/RRF, attribution); לקליטת-פסיקה → `01-ingest.md`. אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/03-retrieval.md` (3 קורפוסים, hybrid/RRF, attribution); לקליטת-פסיקה → `01-ingest.md`. אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
||||||
|
|
||||||
## שפה
|
## שפה
|
||||||
@@ -390,31 +397,11 @@ python3 /home/chaim/legal-ai/scripts/notify.py \
|
|||||||
- **מדיניות**: אילו שיקולים תכנוניים עולים מהחומר
|
- **מדיניות**: אילו שיקולים תכנוניים עולים מהחומר
|
||||||
- קישור למיקום הקובץ: `{case_dir}/documents/research/precedent-research.md`
|
- קישור למיקום הקובץ: `{case_dir}/documents/research/precedent-research.md`
|
||||||
|
|
||||||
### סגור את ה-issue של עצמך — חובה!
|
### סגור את ה-issue של עצמך + העֵר CEO — חובה!
|
||||||
|
|
||||||
בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
בלי סגירת-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`).
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/{issue-id}" '{"status": "done"}'```
|
|
||||||
|
|
||||||
**אם בדיקות נכשלו, חסר פלט, או חסר מידע קריטי:**
|
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/{issue-id}" '{"status": "blocked"}'```
|
|
||||||
**אסור** לסיים `done` עם פלט חסר — אם משהו נכשל, סטטוס = `blocked` + comment עם פירוט.
|
|
||||||
|
|
||||||
### העֵר את העוזר המשפטי (CEO) — חובה!
|
|
||||||
```bash
|
|
||||||
# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה
|
|
||||||
if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then
|
|
||||||
CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה
|
|
||||||
else
|
|
||||||
CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה
|
|
||||||
fi
|
|
||||||
|
|
||||||
~/legal-ai/scripts/pc.sh POST "/api/agents/$CEO_ID/wakeup" '{"source":"automation","triggerDetail":"system","reason":"חוקר תקדימים סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}'```
|
|
||||||
**⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.**
|
|
||||||
**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`.
|
|
||||||
|
|
||||||
## כללים
|
## כללים
|
||||||
- **דיוק** — ציין מספרי סעיפים, תאריכים, שמות שופטים
|
- **דיוק** — ציין מספרי סעיפים, תאריכים, שמות שופטים
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ tools:
|
|||||||
|
|
||||||
## קרא לפני פעולה (INV-AG1)
|
## קרא לפני פעולה (INV-AG1)
|
||||||
|
|
||||||
|
> **שער anti-hallucination (INV-AH) — חובה:** קרא וקיים `~/legal-ai/docs/anti-hallucination-gate.md`. אתה **צרכן read-only** של פלט-המנתח המעוגן — **אסור** להוסיף פסיקה/סעיף/הלכה שלא הגיעו מהמנתח/הקורפוס; ציטוט בהחלטה = רק מ-`supporting_quote` מאומת (AH-1…AH-5).
|
||||||
|
|
||||||
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/04-analysis-writing.md` + `05-qa-review.md` (אתה כותב מול שערי-QA). אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
לפני העבודה המהותית — קרא **תחילה** את חוקת המערכת `~/legal-ai/docs/spec/00-constitution.md` (ייעוד, G1–G11, אינדקס-ספ §7), ואז את ספ-התחום שלך: `~/legal-ai/docs/spec/04-analysis-writing.md` + `05-qa-review.md` (אתה כותב מול שערי-QA). אינך פועל "מהזיכרון" — המקור הקנוני להתנהגות הוא החוקה + ספ-התחום. ראה גם [HEARTBEAT.md](HEARTBEAT.md) ("קריאת-ספ") ו-`~/legal-ai/docs/spec/X4-agents.md` (מפת תפקיד→ספ).
|
||||||
|
|
||||||
## שפה
|
## שפה
|
||||||
@@ -212,31 +214,11 @@ case_update(case_number, status="drafted")
|
|||||||
- ספירת מילים לכל בלוק
|
- ספירת מילים לכל בלוק
|
||||||
- יחסי משקל (% מהמסמך)
|
- יחסי משקל (% מהמסמך)
|
||||||
|
|
||||||
### סגור את ה-issue של עצמך — חובה!
|
### סגור את ה-issue של עצמך + העֵר CEO — חובה!
|
||||||
|
|
||||||
בלי זה Paperclip יזהה "issue in_progress + אין execution חיה" ויפעיל auto-retry בלולאה (נצפה בפועל ב-CMPA-17 ב-30/04/26 — 4 איטרציות מיותרות עד הריגה ידנית).
|
בלי סגירת-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`).
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/{issue-id}" '{"status": "done"}'```
|
|
||||||
|
|
||||||
**אם בדיקות נכשלו, חסר פלט, או חסר מידע קריטי:**
|
|
||||||
```bash
|
|
||||||
~/legal-ai/scripts/pc.sh PATCH "/api/issues/{issue-id}" '{"status": "blocked"}'```
|
|
||||||
**אסור** לסיים `done` עם פלט חסר — אם משהו נכשל, סטטוס = `blocked` + comment עם פירוט.
|
|
||||||
|
|
||||||
### העֵר את העוזר המשפטי (CEO) — חובה!
|
|
||||||
```bash
|
|
||||||
# CEO לפי חברה — אסור לקבע UUID, חברות שונות = CEO שונה
|
|
||||||
if [ "$PAPERCLIP_COMPANY_ID" = "8639e837-4c9d-47fa-a76b-95788d651896" ]; then
|
|
||||||
CEO_ID="cdbfa8bc-3d61-41a4-a2e7-677ec7d34562" # CMPA — היטלי השבחה
|
|
||||||
else
|
|
||||||
CEO_ID="752cebdd-6748-4a04-aacd-c7ab0294ef33" # CMP — רישוי ובניה
|
|
||||||
fi
|
|
||||||
|
|
||||||
~/legal-ai/scripts/pc.sh POST "/api/agents/$CEO_ID/wakeup" '{"source":"automation","triggerDetail":"system","reason":"כותב החלטה סיים משימה [issue-id] בסטטוס [done/blocked]","payload":{"issueId":"[issue-id]","mutation":"agent_completion"}}'```
|
|
||||||
**⚠️ אסור להשתמש ב-INSERT INTO agent_wakeup_requests ישירות!** הכנסה ישירה ל-DB יוצרת רק את הבקשה בלי heartbeat_run — והסוכן לא יתעורר לעולם. **תמיד להשתמש ב-API בלבד.**
|
|
||||||
**⚠️ אסור לקבע UUID של CEO** — UUID שונה לכל חברה. תמיד דרך `$PAPERCLIP_COMPANY_ID`. wakeup לחברה אחרת נדחה: `Agent key cannot access another company`.
|
|
||||||
|
|
||||||
**אם לא תעדכן סטטוס ל-drafted — בודק האיכות לא יוכל לרוץ!**
|
**אם לא תעדכן סטטוס ל-drafted — בודק האיכות לא יוכל לרוץ!**
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,18 @@
|
|||||||
{
|
{
|
||||||
|
"permissions": {
|
||||||
|
"deny": [
|
||||||
|
"mcp__task-master-local__update_task",
|
||||||
|
"mcp__task-master-local__update",
|
||||||
|
"mcp__task-master-local__update_subtask",
|
||||||
|
"mcp__task-master-local__expand_task",
|
||||||
|
"mcp__task-master-local__expand_all",
|
||||||
|
"mcp__task-master-local__analyze_project_complexity",
|
||||||
|
"mcp__task-master-local__research",
|
||||||
|
"mcp__task-master-local__parse_prd",
|
||||||
|
"mcp__task-master-local__scope_up_task",
|
||||||
|
"mcp__task-master-local__scope_down_task"
|
||||||
|
]
|
||||||
|
},
|
||||||
"hooks": {
|
"hooks": {
|
||||||
"PreToolUse": [
|
"PreToolUse": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ mcp-server/.venv/
|
|||||||
web/static/
|
web/static/
|
||||||
web/__pycache__/
|
web/__pycache__/
|
||||||
scripts/
|
scripts/
|
||||||
|
!scripts/SCRIPTS.md
|
||||||
skills/
|
skills/
|
||||||
!skills/docx/
|
!skills/docx/
|
||||||
!skills/docx/decision_template.docx
|
!skills/docx/decision_template.docx
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!--
|
<!--
|
||||||
תבנית PR — עוזר משפטי. מאכפת את "פרוטוקול כתיבת-קוד" (CLAUDE.md §פרוטוקול כתיבת-קוד):
|
תבנית PR — עוזר משפטי. מאכפת את "פרוטוקול כתיבת-קוד" (CLAUDE.md §פרוטוקול כתיבת-קוד):
|
||||||
כל PR מצהיר אילו invariants הוא נוגע בהם / מקיים. ראה docs/spec/00-constitution.md (G1–G11).
|
כל PR מצהיר אילו invariants הוא נוגע בהם / מקיים. ראה docs/spec/00-constitution.md (G1–G12).
|
||||||
מלא את הסעיפים; מחק את ההערות בסוגריים <!-- -->.
|
מלא את הסעיפים; מחק את ההערות בסוגריים <!-- -->.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@@ -11,8 +11,9 @@
|
|||||||
## Invariants — הצהרה (חובה)
|
## Invariants — הצהרה (חובה)
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
אילו invariants הנדסיים (G1–G10) או INV-* מקבצי-תחום ה-PR נוגע בהם או מקיים?
|
אילו invariants הנדסיים (G1–G10, G12) או INV-* מקבצי-תחום ה-PR נוגע בהם או מקיים?
|
||||||
דוגמה: "G2 (מקור-אמת יחיד) — איחדתי 2 לקוחות Paperclip למסלול קנוני אחד; INV-INT4."
|
דוגמה: "G2 (מקור-אמת יחיד) — איחדתי 2 לקוחות Paperclip למסלול קנוני אחד; INV-INT4."
|
||||||
|
דוגמה: "G12 (שער-הפלטפורמה) — מגע-Paperclip חדש נוסף רק ב-agent_platform_port.py, לא ב-mcp-server."
|
||||||
תוכן משפטי → G11.
|
תוכן משפטי → G11.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@@ -22,6 +23,7 @@
|
|||||||
|
|
||||||
- [ ] קראתי את `docs/spec/00-constitution.md` + ספ-התחום הרלוונטי לפני הכתיבה
|
- [ ] קראתי את `docs/spec/00-constitution.md` + ספ-התחום הרלוונטי לפני הכתיבה
|
||||||
- [ ] השינוי **לא** יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1)
|
- [ ] השינוי **לא** יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1)
|
||||||
|
- [ ] **לא** הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — `mcp-server/src` וה-skills נקיים
|
||||||
- [ ] אין בליעה שקטה של שגיאות — רשומה חסרה/פגומה מסומנת ומדווחת (כלל-הנדסה §6)
|
- [ ] אין בליעה שקטה של שגיאות — רשומה חסרה/פגומה מסומנת ומדווחת (כלל-הנדסה §6)
|
||||||
- [ ] בדקתי מול `docs/spec/gap-audit.md` — אם נגעתי ב-GAP/FU ממופה, התאמתי ליחידת-התיקון
|
- [ ] בדקתי מול `docs/spec/gap-audit.md` — אם נגעתי ב-GAP/FU ממופה, התאמתי ליחידת-התיקון
|
||||||
- [ ] בדיקות עוברות (אם רלוונטי) / לא נדרשות
|
- [ ] בדיקות עוברות (אם רלוונטי) / לא נדרשות
|
||||||
|
|||||||
22
.gitea/workflows/leak-guard.yaml
Normal file
22
.gitea/workflows/leak-guard.yaml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
name: G12 Leak-Guard
|
||||||
|
|
||||||
|
# Hard gate for INV-G12 (docs/spec/X15 §4 / R4): the intelligence layer
|
||||||
|
# (mcp-server/src) must stay free of Paperclip-specific symbols, and only
|
||||||
|
# web/agent_platform_port.py may import the Paperclip client. Pure-stdlib check
|
||||||
|
# (no venv) — fast, runs on every PR and on push to main.
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
leak-guard:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: G12 — Agent Platform Port leak-guard
|
||||||
|
run: python3 scripts/leak_guard.py
|
||||||
27
.gitea/workflows/lint.yaml
Normal file
27
.gitea/workflows/lint.yaml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
name: Lint — undefined names
|
||||||
|
|
||||||
|
# High-signal static gate for the bug class behind PR #249 (case-rename 500):
|
||||||
|
# a name referenced but never imported/defined. Invisible to tests when it sits
|
||||||
|
# in a rarely-hit branch or a fire-and-forget background task — it only
|
||||||
|
# NameErrors at runtime. pyflakes catches it before merge. Gates ONLY on
|
||||||
|
# undefined names (not unused imports / f-strings — those are noise). Uses a
|
||||||
|
# throwaway venv so it is immune to PEP-668 externally-managed environments.
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
undefined-names:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Run undefined-name guard
|
||||||
|
run: |
|
||||||
|
python3 -m venv /tmp/lintvenv
|
||||||
|
/tmp/lintvenv/bin/pip install --quiet pyflakes==3.4.0
|
||||||
|
/tmp/lintvenv/bin/python scripts/check_undefined_names.py
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -6,6 +6,7 @@ data/backups/
|
|||||||
data/precedent-library/
|
data/precedent-library/
|
||||||
data/.auto-sync.log
|
data/.auto-sync.log
|
||||||
data/*.db
|
data/*.db
|
||||||
|
data/checkpoints/ # X16 durable-pipeline SQLite checkpoints (runtime artifact)
|
||||||
*.bak-pre-*
|
*.bak-pre-*
|
||||||
mcp-server/.venv/
|
mcp-server/.venv/
|
||||||
__pycache__/
|
__pycache__/
|
||||||
@@ -17,4 +18,6 @@ kiryat-yearim/
|
|||||||
continuation-prompt.md
|
continuation-prompt.md
|
||||||
node_modules/
|
node_modules/
|
||||||
data/eval/eval-report-*
|
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)
|
||||||
.claude/worktrees/
|
.claude/worktrees/
|
||||||
|
|||||||
252
CLAUDE.md
252
CLAUDE.md
@@ -1,10 +1,11 @@
|
|||||||
# עוזר משפטי — Legal Decision Assistant
|
# עוזר משפטי — Legal Decision Assistant
|
||||||
|
|
||||||
|
> **אינדקס דק.** הכללים הקריטיים נמצאים כאן; העומק התפעולי (Deploy, Paperclip-ops, adapters, מבנה-תיקיות, Chair-Feedback, TaskMaster מלא) הוצא ל-[`docs/operations-runbook.md`](docs/operations-runbook.md) כדי לרזות את ההקשר הנטען בכל סשן.
|
||||||
|
|
||||||
## רקע הפרויקט
|
## רקע הפרויקט
|
||||||
|
|
||||||
מערכת AI לסיוע בכתיבת החלטות של **ועדת ערר לתכנון ובניה, מחוז ירושלים**, בראשות **עו"ד דפנה תמיר**.
|
מערכת AI לסיוע בכתיבת החלטות של **ועדת ערר לתכנון ובניה, מחוז ירושלים**, בראשות **עו"ד דפנה תמיר**.
|
||||||
|
|
||||||
### מה עושה ועדת ערר?
|
|
||||||
ועדת ערר היא גוף מעין-שיפוטי שדן בעררים על החלטות ועדות מקומיות לתכנון ובניה. הוועדה מקבלת חומרי מקור (כתבי ערר, תגובות, פרוטוקולים, תכניות), דנה בטענות הצדדים, ומוציאה **החלטה כתובה מנומקת** — מסמך משפטי פורמלי שניתן לביקורת שיפוטית בבית משפט לעניינים מנהליים.
|
ועדת ערר היא גוף מעין-שיפוטי שדן בעררים על החלטות ועדות מקומיות לתכנון ובניה. הוועדה מקבלת חומרי מקור (כתבי ערר, תגובות, פרוטוקולים, תכניות), דנה בטענות הצדדים, ומוציאה **החלטה כתובה מנומקת** — מסמך משפטי פורמלי שניתן לביקורת שיפוטית בבית משפט לעניינים מנהליים.
|
||||||
|
|
||||||
### שלושה סוגי עררים
|
### שלושה סוגי עררים
|
||||||
@@ -14,13 +15,10 @@
|
|||||||
| היטל השבחה | 8xxx | קר ומקצועי | יבש, ללא רגשות |
|
| היטל השבחה | 8xxx | קר ומקצועי | יבש, ללא רגשות |
|
||||||
| פיצויים (ס' 197) | 9xxx | קר ומקצועי | דומה להיטל השבחה |
|
| פיצויים (ס' 197) | 9xxx | קר ומקצועי | דומה להיטל השבחה |
|
||||||
|
|
||||||
|
> **מבנה מספר-תיק (נוהל-יו"ר 2026-06-11):** `<סידורי>-<חודש>-<שנה>`. **אורך הסידורי = סוג-הליך:** 4 ספרות → **ערר**, 5 ספרות → **בל"מ** (`85074-09-24`). הספרה הראשונה עדיין קובעת תחום בשני האורכים. כלל חד-כיווני: 5-ספרתי הוא תמיד בל"מ; 4-ספרתי אינו מחייב ערר (בל"מ-מורשת מזוהה מהנושא). מקור-אמת: [`docs/spec/X1-identifiers.md`](docs/spec/X1-identifiers.md) §1א.
|
||||||
|
|
||||||
### מטרת המערכת
|
### מטרת המערכת
|
||||||
לבנות כלי עבודה שמסייע ליו"ר הוועדה לנסח החלטות:
|
כלי עבודה שמסייע ליו"ר הוועדה: **ניהול תיקים** (ייבוא, סיווג, מעקב סטטוס) · **בסיס ידע** (פסיקה, ביטויי מעבר, לקחים, חקיקה) · **חיפוש סמנטי (RAG)** · **סיוע בכתיבה** (טיוטות לפי 12 בלוקים בסגנון דפנה) · **ייצוא DOCX**.
|
||||||
1. **ניהול תיקים** — ייבוא חומרי מקור, סיווג מסמכים, מעקב סטטוס
|
|
||||||
2. **בסיס ידע** — פסיקה, ביטויי מעבר, לקחים מהחלטות קודמות, חקיקה
|
|
||||||
3. **חיפוש סמנטי (RAG)** — מציאת תקדימים רלוונטיים ופסקאות דומות
|
|
||||||
4. **סיוע בכתיבה** — ייצור טיוטות לפי ארכיטקטורת 12 בלוקים בסגנון דפנה
|
|
||||||
5. **ייצוא DOCX** — מסמך מעוצב מוכן להגשה
|
|
||||||
|
|
||||||
### ⭐ יעד-העל: רכישת-הסגנון של דפנה (Style Acquisition)
|
### ⭐ יעד-העל: רכישת-הסגנון של דפנה (Style Acquisition)
|
||||||
**היעד הראשי של המערכת הוא שהסוכנים יכתבו וינתחו עררים בדיוק כמו עו"ד דפנה תמיר** — לא רק לייצר טיוטה תקנית, אלא להפנים את **הקול והשיטה** שלה. זה מחייב **הפרדה מובהקת בין שתי תת-מערכות**:
|
**היעד הראשי של המערכת הוא שהסוכנים יכתבו וינתחו עררים בדיוק כמו עו"ד דפנה תמיר** — לא רק לייצר טיוטה תקנית, אלא להפנים את **הקול והשיטה** שלה. זה מחייב **הפרדה מובהקת בין שתי תת-מערכות**:
|
||||||
@@ -30,19 +28,9 @@
|
|||||||
|
|
||||||
**הגישה (state-of-the-art לדאטה-מועט):** Text Style Transfer מבוסס **Authorial Style Profiling** — להכליל את סגנון דפנה ולהתאים לתיק. העתקת פסקאות מותרת לתוכן קבוע/נוסחאי; ניתוח ספציפי → להכליל; **מהות משפטית (הלכה/עובדה) — אסור להעתיק מתיק לתיק**. *לא* fine-tuning של משקולות (Opus סגור; קורפוס קטן מדי).
|
**הגישה (state-of-the-art לדאטה-מועט):** Text Style Transfer מבוסס **Authorial Style Profiling** — להכליל את סגנון דפנה ולהתאים לתיק. העתקת פסקאות מותרת לתוכן קבוע/נוסחאי; ניתוח ספציפי → להכליל; **מהות משפטית (הלכה/עובדה) — אסור להעתיק מתיק לתיק**. *לא* fine-tuning של משקולות (Opus סגור; קורפוס קטן מדי).
|
||||||
|
|
||||||
**כלל-העל — INV-LRN4:** כל החלטה אינה "סגורה" עד שהושוותה מול הגרסה הסופית של דפנה; כל סופי מנותח מול הטיוטה. כך לומדים מכל החלטה. **INV-LRN5:** שכבת-ידע-הקול לא תכיל מהות ספציפית — רק סגנון ושיטה.
|
**כלל-העל — INV-LRN4:** כל החלטה אינה "סגורה" עד שהושוותה מול הגרסה הסופית של דפנה; כל סופי מנותח מול הטיוטה. **INV-LRN5:** שכבת-ידע-הקול לא תכיל מהות ספציפית — רק סגנון ושיטה. ספ מלא: [`docs/spec/07-learning.md`](docs/spec/07-learning.md) §0. ארכיטקטורה ומשימות: תוכנית `style-acquisition-subsystem`.
|
||||||
|
|
||||||
ספ מלא: [`docs/spec/07-learning.md`](docs/spec/07-learning.md) §0. ארכיטקטורה ומשימות: תוכנית `style-acquisition-subsystem`.
|
> **Legacy:** המערכת הקודמת היתה Obsidian vault עם Claude Code skills. הידע שהופק ממנה (ניתוח סגנון, 12 בלוקים מבוססי CREAC/DITA/Akoma-Ntoso/FJC, כללי כתיבה, לקחים, ייצוא DOCX) הוטמע בפרויקט הנוכחי (`docs/`, `data/training/`). ה-vault נמחק; כעת PostgreSQL + pgvector.
|
||||||
|
|
||||||
### מה היה קודם (Legacy)
|
|
||||||
המערכת הקודמת היתה **Obsidian vault** עם Claude Code skills על שרת אחר. פותחו:
|
|
||||||
- ניתוח סגנון של 3 החלטות (הכט — דחייה, בית הכרם — קבלה חלקית, אריאלי — השוואה)
|
|
||||||
- ארכיטקטורת 12 בלוקים מבוססת CREAC / DITA / Akoma Ntoso / Federal Judicial Center
|
|
||||||
- כללי כתיבה (רקע ניטרלי, ללא כפילות, טענות מקוריות בלבד)
|
|
||||||
- לקחים מהשוואת טיוטות לגרסאות סופיות
|
|
||||||
- סקריפט ייצוא DOCX
|
|
||||||
|
|
||||||
הידע שהופק מה-vault הוטמע במערכת הנוכחית — מסמכי ייחוס (`docs/`), קורפוס אימון (`data/training/`), ומבנה 12 בלוקים. ה-vault המקורי נמחק; הפרויקט הנוכחי עובד עם PostgreSQL + pgvector.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -53,11 +41,13 @@
|
|||||||
| [`docs/spec/00-constitution.md`](docs/spec/00-constitution.md) | **חוקת המערכת** — ייעוד, 11 invariants גלובליים (G1–G11), כללי-הנדסה, אינדקס-ספ | **לפני כל כתיבת/שינוי קוד** (ראה §פרוטוקול כתיבת-קוד) |
|
| [`docs/spec/00-constitution.md`](docs/spec/00-constitution.md) | **חוקת המערכת** — ייעוד, 11 invariants גלובליים (G1–G11), כללי-הנדסה, אינדקס-ספ | **לפני כל כתיבת/שינוי קוד** (ראה §פרוטוקול כתיבת-קוד) |
|
||||||
| [`docs/spec/README.md`](docs/spec/README.md) | **אינדקס ספ-המערכת** — מחזור-חיים (01–07) + חוצי-שלבים (X1–X11). מקור-האמת ל"מהו תקין" | **לפני כל כתיבת/שינוי קוד** |
|
| [`docs/spec/README.md`](docs/spec/README.md) | **אינדקס ספ-המערכת** — מחזור-חיים (01–07) + חוצי-שלבים (X1–X11). מקור-האמת ל"מהו תקין" | **לפני כל כתיבת/שינוי קוד** |
|
||||||
| [`docs/spec/gap-audit.md`](docs/spec/gap-audit.md) | **מפת-פערים** — 62 ממצאים → 15 יחידות-תיקון (FU); invariant מופר + file:line + תיקון מוצע | לפני נגיעה ב-GAP/FU קיים או תכנון FU חדש |
|
| [`docs/spec/gap-audit.md`](docs/spec/gap-audit.md) | **מפת-פערים** — 62 ממצאים → 15 יחידות-תיקון (FU); invariant מופר + file:line + תיקון מוצע | לפני נגיעה ב-GAP/FU קיים או תכנון FU חדש |
|
||||||
|
| [`docs/ia-audit-redesign.md`](docs/ia-audit-redesign.md) + [`docs/spec/X17`](docs/spec/X17-information-architecture.md) | **אבחון משטח-ההפעלה + IA-יעד** — 34 משטחים, 37 ממצאים; INV-IA1–IA6 (מקור-אמת יחיד/שער-אחד/ניווט-משימה) מרימים G2/G10 לשכבת-UI. גלי-איחוד #130–132 | לפני עבודה על דפים/ניווט/cache או תורי-אישור |
|
||||||
| [`docs/architecture.md`](docs/architecture.md) | ארכיטקטורת המערכת, תרשים רכיבים, זרימת נתונים, 4 שכבות DB | לפני עבודה על תשתית |
|
| [`docs/architecture.md`](docs/architecture.md) | ארכיטקטורת המערכת, תרשים רכיבים, זרימת נתונים, 4 שכבות DB | לפני עבודה על תשתית |
|
||||||
| [`docs/block-schema.md`](docs/block-schema.md) | הגדרת 12 בלוקים — content model, constraints, processing params | **לפני כל כתיבת החלטה** |
|
| [`docs/block-schema.md`](docs/block-schema.md) | הגדרת 12 בלוקים — content model, constraints, processing params | **לפני כל כתיבת החלטה** |
|
||||||
| [`docs/migration-plan.md`](docs/migration-plan.md) | תוכנית מעבר vault → DB — טבלאות, עדיפויות, כמויות | לפני ייבוא נתונים |
|
| [`docs/migration-plan.md`](docs/migration-plan.md) | תוכנית מעבר vault → DB — טבלאות, עדיפויות, כמויות | לפני ייבוא נתונים |
|
||||||
| [`docs/legal-decision-lessons.md`](docs/legal-decision-lessons.md) | לקחים מ-3 החלטות — מה עבד, מה השתנה, ביטויי מעבר חדשים | **לפני כל כתיבת החלטה** |
|
| [`docs/legal-decision-lessons.md`](docs/legal-decision-lessons.md) | לקחים מ-3 החלטות — מה עבד, מה השתנה, ביטויי מעבר חדשים | **לפני כל כתיבת החלטה** |
|
||||||
| [`docs/decision-methodology.md`](docs/decision-methodology.md) | **מתודולוגיה אנליטית — איך לחשוב על החלטה מעין-שיפוטית** | **לפני כל כתיבת החלטה** |
|
| [`docs/decision-methodology.md`](docs/decision-methodology.md) | **מתודולוגיה אנליטית — איך לחשוב על החלטה מעין-שיפוטית** | **לפני כל כתיבת החלטה** |
|
||||||
|
| [`docs/anti-hallucination-gate.md`](docs/anti-hallucination-gate.md) | **שער anti-hallucination משותף (INV-AH)** — 5 טכניקות מעוגנות-מקור (עיגון-מקור, quote-or-retract, abstention, תיוג-ודאות, CoVe). מקור-אמת אחד לכל הסוכנים | **לפני כל אזכור פסיקה/חוק/הלכה/מספר** |
|
||||||
| `docs/garner-methodology-extraction.md` | חומר מקור: מיצוי מספרי Garner על כתיבה משפטית | רק לבדיקת מקור |
|
| `docs/garner-methodology-extraction.md` | חומר מקור: מיצוי מספרי Garner על כתיבה משפטית | רק לבדיקת מקור |
|
||||||
| `docs/fjc-principles-extraction.md` | חומר מקור: מיצוי מ-Judicial Writing Manual (FJC) | רק לבדיקת מקור |
|
| `docs/fjc-principles-extraction.md` | חומר מקור: מיצוי מ-Judicial Writing Manual (FJC) | רק לבדיקת מקור |
|
||||||
| [`docs/corpus-analysis.md`](docs/corpus-analysis.md) | ניתוח שיטתי של 24 החלטות — מפת תוכן, דפוסי דיון תכנוני, פערים | **לפני כל כתיבת החלטה** |
|
| [`docs/corpus-analysis.md`](docs/corpus-analysis.md) | ניתוח שיטתי של 24 החלטות — מפת תוכן, דפוסי דיון תכנוני, פערים | **לפני כל כתיבת החלטה** |
|
||||||
@@ -73,6 +63,8 @@
|
|||||||
| [`skills/decision/SKILL.md`](skills/decision/SKILL.md) | מדריך סגנון מלא של דפנה — טון, מבנה, ביטויים, מתודולוגיה | **לפני כל כתיבת החלטה** |
|
| [`skills/decision/SKILL.md`](skills/decision/SKILL.md) | מדריך סגנון מלא של דפנה — טון, מבנה, ביטויים, מתודולוגיה | **לפני כל כתיבת החלטה** |
|
||||||
| [`.claude/agents/HEARTBEAT.md`](.claude/agents/HEARTBEAT.md) | checklist הפעלת סוכן — routing, company filtering, quirks, wakeup עם UUID נכון | **לפני כל עבודה על סוכנים** |
|
| [`.claude/agents/HEARTBEAT.md`](.claude/agents/HEARTBEAT.md) | checklist הפעלת סוכן — routing, company filtering, quirks, wakeup עם UUID נכון | **לפני כל עבודה על סוכנים** |
|
||||||
| [`skills/dafna-decision-template/SKILL.md`](skills/dafna-decision-template/SKILL.md) | export DOCX לפי styles של תבנית Word של דפנה — line classification, dash policy, placeholder handling | לפני export DOCX |
|
| [`skills/dafna-decision-template/SKILL.md`](skills/dafna-decision-template/SKILL.md) | export DOCX לפי styles של תבנית Word של דפנה — line classification, dash policy, placeholder handling | לפני export DOCX |
|
||||||
|
| [`docs/corpus-graph.md`](docs/corpus-graph.md) | **מפת הקורפוס** (`/graph`) — גרף ציטוטים אינטראקטיבי נייטיב; 6 שכבות (פסיקה/נושא/תחום/הלכות/חוסרי‑מחקר/יומונים), אנליטיקה (PageRank/אשכולות), endpoints, ואיך מוסיפים שכבה | לפני עבודה על דף `/graph` או `web/graph_api.py` |
|
||||||
|
| [`docs/operations-runbook.md`](docs/operations-runbook.md) | **עומק תפעולי** — Deploy (Coolify/pm2), Paperclip-ops מלא (wakeup, sync, webhook, scheduled jobs, adapters), מבנה-תיקיות, Chair-Feedback, TaskMaster | לפני עבודה על Deploy / אינטגרציית-Paperclip / adapters |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -85,14 +77,14 @@
|
|||||||
|
|
||||||
**לפני יצירה/שינוי של קוד ב-`web/`, `mcp-server/`, `web-ui/`, `scripts/`:**
|
**לפני יצירה/שינוי של קוד ב-`web/`, `mcp-server/`, `web-ui/`, `scripts/`:**
|
||||||
|
|
||||||
1. **קרא** [`docs/spec/00-constitution.md`](docs/spec/00-constitution.md) — ייעוד, ה-invariants הגלובליים G1–G11, וכללי-ההנדסה (§6). אינדקס-הספ ב-§7.
|
1. **קרא** [`docs/spec/00-constitution.md`](docs/spec/00-constitution.md) — ייעוד, ה-invariants הגלובליים G1–G12, וכללי-ההנדסה (§6). אינדקס-הספ ב-§7.
|
||||||
2. **קרא את ספ-התחום הרלוונטי** לפי האינדקס (§7) — לדוגמה: אחזור→[`03-retrieval.md`](docs/spec/03-retrieval.md), קליטה→[`01-ingest.md`](docs/spec/01-ingest.md), נתונים→[`02-data-model.md`](docs/spec/02-data-model.md), כלי-MCP→[`X9-mcp-tool-contract.md`](docs/spec/X9-mcp-tool-contract.md), UI↔API→[`X6-ui-api-contract.md`](docs/spec/X6-ui-api-contract.md), Paperclip→[`X3`](docs/spec/X3-integration-deploy.md)/[`X7`](docs/spec/X7-paperclip-client-params.md), env/secrets→[`X10-deploy-env-secrets.md`](docs/spec/X10-deploy-env-secrets.md).
|
2. **קרא את ספ-התחום הרלוונטי** לפי האינדקס (§7) — לדוגמה: אחזור→[`03-retrieval.md`](docs/spec/03-retrieval.md), קליטה→[`01-ingest.md`](docs/spec/01-ingest.md), נתונים→[`02-data-model.md`](docs/spec/02-data-model.md), כלי-MCP→[`X9-mcp-tool-contract.md`](docs/spec/X9-mcp-tool-contract.md), UI↔API→[`X6-ui-api-contract.md`](docs/spec/X6-ui-api-contract.md), Paperclip/שער-הפלטפורמה→[`X3`](docs/spec/X3-integration-deploy.md)/[`X7`](docs/spec/X7-paperclip-client-params.md)/[`X15`](docs/spec/X15-agent-platform-port.md) (G12), עמידות-פייפליין→[`X16`](docs/spec/X16-pipeline-durability.md), env/secrets→[`X10-deploy-env-secrets.md`](docs/spec/X10-deploy-env-secrets.md).
|
||||||
3. **ודא שהשינוי *מקיים* את ה-invariants** — לא יוצר מסלול מקביל ליכולת קיימת ([G2](docs/spec/00-constitution.md)), לא מתקן תסמין בקריאה במקום נרמול במקור (G1), לא בולע שגיאות בשקט (כלל-הנדסה §6).
|
3. **ודא שהשינוי *מקיים* את ה-invariants** — לא יוצר מסלול מקביל ליכולת קיימת ([G2](docs/spec/00-constitution.md)), לא מתקן תסמין בקריאה במקום נרמול במקור (G1), לא בולע שגיאות בשקט (כלל-הנדסה §6).
|
||||||
4. **בדוק מול** [`gap-audit.md`](docs/spec/gap-audit.md) — אם אתה נוגע ב-GAP/FU שכבר ממופה, התאם את העבודה ליחידת-התיקון; אל תפתור מחדש.
|
4. **בדוק מול** [`gap-audit.md`](docs/spec/gap-audit.md) — אם אתה נוגע ב-GAP/FU שכבר ממופה, התאם את העבודה ליחידת-התיקון; אל תפתור מחדש.
|
||||||
5. **כל PR מצהיר invariants** — אילו G*/INV-* ה-PR נוגע בהם / מקיים (ראה תבנית ה-PR ב-[`.gitea/PULL_REQUEST_TEMPLATE.md`](.gitea/PULL_REQUEST_TEMPLATE.md)).
|
5. **כל PR מצהיר invariants** — אילו G*/INV-* ה-PR נוגע בהם / מקיים (ראה תבנית ה-PR ב-[`.gitea/PULL_REQUEST_TEMPLATE.md`](.gitea/PULL_REQUEST_TEMPLATE.md)).
|
||||||
|
|
||||||
> **שתי שכבות-כללים מובחנות, שתיהן חלות:**
|
> **שתי שכבות-כללים מובחנות, שתיהן חלות:**
|
||||||
> - **הנדסה (G1–G10)** — הסעיף הזה + `docs/spec/`. סמכות: ≥3 מקורות חיצוניים.
|
> - **הנדסה (G1–G10, G12)** — הסעיף הזה + `docs/spec/`. סמכות: ≥3 מקורות חיצוניים.
|
||||||
> - **תוכן משפטי (G11)** — סעיף "עקרונות כתיבה קריטיים" למטה (12 בלוקים, רקע ניטרלי...). סמכות: היו"ר + מסמכי-הפרויקט.
|
> - **תוכן משפטי (G11)** — סעיף "עקרונות כתיבה קריטיים" למטה (12 בלוקים, רקע ניטרלי...). סמכות: היו"ר + מסמכי-הפרויקט.
|
||||||
>
|
>
|
||||||
> אכיפה אוטומטית: hook `PreToolUse` ([scripts/spec-guard.sh](scripts/spec-guard.sh)) מזכיר את הפרוטוקול בכל Edit/Write על נתיב-קוד.
|
> אכיפה אוטומטית: hook `PreToolUse` ([scripts/spec-guard.sh](scripts/spec-guard.sh)) מזכיר את הפרוטוקול בכל Edit/Write על נתיב-קוד.
|
||||||
@@ -105,17 +97,13 @@
|
|||||||
|
|
||||||
**לכן — כל סשן שעומד לכתוב/לשנות קוד או תיעוד חייב לעבוד ב-git worktree מבודד משלו. אסור לערוך/לתייק בעץ-העבודה הראשי `~/legal-ai` כשייתכן שסשן אחר פעיל.**
|
**לכן — כל סשן שעומד לכתוב/לשנות קוד או תיעוד חייב לעבוד ב-git worktree מבודד משלו. אסור לערוך/לתייק בעץ-העבודה הראשי `~/legal-ai` כשייתכן שסשן אחר פעיל.**
|
||||||
|
|
||||||
הבידוד **נתמך-סביבה** — לא רק כלל-משמעת. ההגדרות נשמרות ב-repo (`.claude/settings.json`, `.worktreeinclude`, `.gitignore`) כך שכל worktree שה-harness יוצר מקבל אוטומטית בסיס נקי, את התלויות, ואת ההרשאות. מקורות רשמיים: [Run parallel sessions with worktrees](https://code.claude.com/docs/en/worktrees), [Settings → worktree](https://code.claude.com/docs/en/settings).
|
הבידוד **נתמך-סביבה** — ההגדרות נשמרות ב-repo (`.claude/settings.json`, `.worktreeinclude`, `.gitignore`) כך שכל worktree שה-harness יוצר מקבל אוטומטית בסיס נקי, את התלויות, ואת ההרשאות. מקורות רשמיים: [Run parallel sessions with worktrees](https://code.claude.com/docs/en/worktrees), [Settings → worktree](https://code.claude.com/docs/en/settings).
|
||||||
|
|
||||||
### הדרך המומלצת — worktree של ה-harness
|
### הדרך המומלצת — worktree של ה-harness
|
||||||
```bash
|
```bash
|
||||||
cd ~/legal-ai && claude --worktree <slug> # או, בתוך סשן: "עבוד ב-worktree" (כלי EnterWorktree)
|
cd ~/legal-ai && claude --worktree <slug> # או, בתוך סשן: "עבוד ב-worktree" (כלי EnterWorktree)
|
||||||
```
|
```
|
||||||
נוצר תחת `.claude/worktrees/<slug>/` על ענף `worktree-<slug>`, ומקבל **אוטומטית**:
|
נוצר תחת `.claude/worktrees/<slug>/` על ענף `worktree-<slug>`, ומקבל **אוטומטית**: בסיס נקי מ-`origin/main` (`worktree.baseRef: "fresh"`) · `web-ui/node_modules` כסימלינק (`worktree.symlinkDirectories`; אין צורך ב-`npm ci`) · `.claude/settings.local.json` + קבצי-env מקומיים (דרך `.worktreeinclude`) · ניקוי אוטומטי ביציאה (כולל עקיפת באג סימלינק [#40259](https://github.com/anthropics/claude-code/issues/40259) דרך `WorktreeRemove` hook עם `--force`).
|
||||||
- **בסיס נקי מ-`origin/main`** — דרך `worktree.baseRef: "fresh"` ב-`.claude/settings.json`.
|
|
||||||
- **`web-ui/node_modules` (789MB) כסימלינק** — דרך `worktree.symlinkDirectories`; אין צורך ב-`npm ci`. (אם משנים deps של web-ui — עשו זאת בעץ הראשי או היו מודעים שה-node_modules משותף.)
|
|
||||||
- **`.claude/settings.local.json` + קבצי-env מקומיים** — מועתקים דרך `.worktreeinclude` (מונע הצפת אישורי-הרשאה).
|
|
||||||
- **ניקוי אוטומטי ביציאה** — כולל עקיפת באג סימלינק [#40259](https://github.com/anthropics/claude-code/issues/40259) דרך `WorktreeRemove` hook עם `--force`.
|
|
||||||
|
|
||||||
### הפרוטוקול (חל על שתי הדרכים)
|
### הפרוטוקול (חל על שתי הדרכים)
|
||||||
1. **בתחילת עבודת-כתיבה** — צור worktree (מומלץ: `claude --worktree`; ידני-fallback: `git worktree add -b <branch> .claude/worktrees/<slug> origin/main` — **תחת `.claude/worktrees/`** כדי שההגדרות יחולו).
|
1. **בתחילת עבודת-כתיבה** — צור worktree (מומלץ: `claude --worktree`; ידני-fallback: `git worktree add -b <branch> .claude/worktrees/<slug> origin/main` — **תחת `.claude/worktrees/`** כדי שההגדרות יחולו).
|
||||||
@@ -126,202 +114,43 @@ cd ~/legal-ai && claude --worktree <slug> # או, בתוך סשן: "עבוד
|
|||||||
6. **אל תיגע** בשינויים לא-מתויקים שאינם שלך בעץ הראשי — הם של סשן אחר. אם העץ הראשי על ענף זר — אל תתייק עליו.
|
6. **אל תיגע** בשינויים לא-מתויקים שאינם שלך בעץ הראשי — הם של סשן אחר. אם העץ הראשי על ענף זר — אל תתייק עליו.
|
||||||
|
|
||||||
> **בידוד-DB:** ה-worktree מבודד-קבצים בלבד — לא בידוד-repo ולא בידוד-DB. **אל תריץ migrations מ-2 worktrees במקביל** על Postgres המשותף (`localhost:5433`) — סכמה שאף סשן לא מצפה לה ([Run agents in parallel](https://code.claude.com/docs/en/agents)).
|
> **בידוד-DB:** ה-worktree מבודד-קבצים בלבד — לא בידוד-repo ולא בידוד-DB. **אל תריץ migrations מ-2 worktrees במקביל** על Postgres המשותף (`localhost:5433`) — סכמה שאף סשן לא מצפה לה ([Run agents in parallel](https://code.claude.com/docs/en/agents)).
|
||||||
> **סוכני Paperclip — אינם מבודדים (אומת 2026-06-06):** 14 מתוך 16 הסוכנים רצים על אדפטר `claude_local` הרשמי, שמריץ `claude -p` ב-`adapter_config.cwd=/home/chaim/legal-ai` **המשותף** — אין לו אופציית `worktreeMode`/`-w` (קיימת רק ב-fork ה-deepseek שלנו). כלומר **כל סוכני Paperclip חולקים את עץ-העבודה הראשי**. הסיכון ממותן ע"י כלל הסשנים נתמך-הסביבה למעלה + תזמור סדרתי ע"י ה-CEO — **לא** ע"י בידוד-worktree per-agent. הניתוח המלא והדרכים שנשקלו: TaskMaster `legal-ai` #104 (נסגר כ-cancelled — "לתעד, לא לבדד").
|
> **סוכני Paperclip — אינם מבודדים (אומת 2026-06-06):** 14 מתוך 16 הסוכנים רצים על אדפטר `claude_local` הרשמי, שמריץ `claude -p` ב-`adapter_config.cwd=/home/chaim/legal-ai` **המשותף** — אין לו אופציית `worktreeMode`/`-w`. כלומר **כל סוכני Paperclip חולקים את עץ-העבודה הראשי**. הסיכון ממותן ע"י כלל הסשנים נתמך-הסביבה למעלה + תזמור סדרתי ע"י ה-CEO — **לא** ע"י בידוד-worktree per-agent. ניתוח מלא: TaskMaster `legal-ai` #104 (נסגר cancelled — "לתעד, לא לבדד").
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## שרת Nautilus (158.178.131.193)
|
## Deploy — תמצית קריטית
|
||||||
|
|
||||||
| שירות | תפקיד | כתובת |
|
שלושה מודלי-הרצה דרים יחד; ערבוב = הטעות הנפוצה. **פירוט מלא, UUIDs ופקודות: [`docs/operations-runbook.md`](docs/operations-runbook.md).**
|
||||||
|-------|--------|-------|
|
|
||||||
| Coolify | ניהול containers | `http://158.178.131.193:8000` |
|
|
||||||
| PostgreSQL + pgvector | בסיס נתונים ראשי | `legal-ai-postgres` |
|
|
||||||
| Redis | תור משימות | `legal-ai-redis` |
|
|
||||||
| Gitea | מאגר קוד | `gitea.nautilus.marcusgroup.org/ezer-mishpati` |
|
|
||||||
| ezer-mishpati-web | ממשק העלאת מסמכים (Docker/Coolify) | `legal-ai.nautilus.marcusgroup.org` |
|
|
||||||
| Paperclip | סוכן AI — מריץ Claude Code agents (pm2, מקומי) | `localhost:3100` |
|
|
||||||
| Infisical | ניהול סודות | `secret.dev.marcus-law.co.il` |
|
|
||||||
|
|
||||||
### ⚠️ ארכיטקטורת Deploy — חובה לקרוא
|
- **legal-ai** (`web/`, `web-ui/`) = **Docker דרך Coolify**. שינוי קוד לא נכנס לתוקף עד `git commit` + `git push origin main` → Gitea Actions בונה image → `mcp__coolify__deploy` (~2-4 דק'). **אסור** uvicorn/`next dev` מקומית — אין Python על המכונה. בדיקה: `curl https://legal-ai.nautilus.marcusgroup.org/api/health`.
|
||||||
|
- **Paperclip** = **pm2 מקומי** (`localhost:3100`). שינוי → `pm2 restart paperclip`. **אין** Docker/Coolify.
|
||||||
**עוזר משפטי (Legal-AI)** — רץ כ-**Docker container דרך Coolify**:
|
- **legal-chat-service** = **pm2 מקומי** (`127.0.0.1:8770`), גשר claude CLI לטאב הצ'אט ב-/training. שינוי → `pm2 restart legal-chat-service`.
|
||||||
- UUID: `gyjo0mtw2c42ej3xxvbz8zio`
|
|
||||||
- שינוי קוד ב-`web/` או `web-ui/` **לא נכנס לתוקף** עד ש:
|
|
||||||
1. עושים `git commit` + `git push origin main`
|
|
||||||
2. מריצים deploy דרך Coolify (`mcp__coolify__deploy`)
|
|
||||||
3. ממתינים ~2-4 דקות לבנייה
|
|
||||||
- **אסור** לנסות להריץ uvicorn מקומית — אין סביבת Python על המכונה
|
|
||||||
- ה-container מריץ Next.js (`:3000`, חשוף) + FastAPI (`:8000`, פנימי)
|
|
||||||
- בדיקה: `curl https://legal-ai.nautilus.marcusgroup.org/api/...`
|
|
||||||
|
|
||||||
**Paperclip** — רץ **מקומית דרך pm2**:
|
|
||||||
- פורט: `localhost:3100`, DB: `localhost:54329`
|
|
||||||
- שינויי קוד נכנסים לתוקף אחרי `pm2 restart paperclip`
|
|
||||||
- **אין צורך ב-Docker או Coolify**
|
|
||||||
|
|
||||||
**legal-chat-service** — רץ **מקומית דרך pm2** (חדש, מאפריל 2026):
|
|
||||||
- פורט: `localhost:8770` (loopback בלבד)
|
|
||||||
- שירות aiohttp קצר שעוטף את `claude` CLI ב-streaming + session continuation, ומשרת את הטאב "שיחה" בדף `/training`. הקונטיינר משדל אליו proxy דרך `host.docker.internal:8770`.
|
|
||||||
- קוד: [mcp-server/src/legal_mcp/chat_service/](mcp-server/src/legal_mcp/chat_service/)
|
|
||||||
- התקנה: `pm2 start /home/chaim/legal-ai/scripts/legal-chat-service.config.cjs && pm2 save`
|
|
||||||
- בריאות: `curl http://127.0.0.1:8770/health` → `{"ok":true,...}`
|
|
||||||
- שינויי קוד: `pm2 restart legal-chat-service`
|
|
||||||
- **אפס עלות API** — claude CLI משתמש ב-claude.ai subscription של chaim. הנחת היסוד של `claude_session.py` (claude CLI מקומי בלבד) נשמרת — השירות הזה הוא הגשר הרשמי בין הקונטיינר לחוץ.
|
|
||||||
- Coolify dependency: ה-Service Definition של legal-ai חייב להכיל `extra_hosts: host.docker.internal:host-gateway` (אחרת ה-proxy יקבל ConnectError).
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## מבנה תיקיות
|
## Paperclip — כללים קריטיים (תמצית)
|
||||||
|
|
||||||
```
|
**פירוט מלא + דוגמאות + פקודות sync: [`docs/operations-runbook.md`](docs/operations-runbook.md).**
|
||||||
/home/chaim/legal-ai/
|
|
||||||
├── CLAUDE.md ← הקובץ הזה
|
> **G12 — שער-הפלטפורמה ([`docs/spec/X15-agent-platform-port.md`](docs/spec/X15-agent-platform-port.md)):** Paperclip היא **מעטפת ניתנת-להחלפה** מאחורי Port יחיד. מגע-Paperclip מותר רק ב-`web/agent_platform_port.py` + `HEARTBEAT.md` (לפרומפטים) + המעטפת המוצהרת (`paperclip_client/api`, plugin, adapters). **אסור** סמל ספציפי-Paperclip ב-`mcp-server/src` או ב-skills של ההחלטה/הסגנון. כל מגע חדש → דרך ה-Port.
|
||||||
├── Dockerfile ← Docker build
|
|
||||||
├── docs/ ← תיעוד + לקחים
|
- **Wakeup תמיד דרך API**: `POST /api/agents/{agent-id}/wakeup` עם `payload.issueId`. **אסור** `INSERT INTO agent_wakeup_requests` ישיר — הסוכן לא יתעורר לעולם (אין `heartbeat_run`).
|
||||||
│ ├── architecture.md ארכיטקטורה
|
- **ניתוב comments דרך CEO**: תגובת-משתמש → פלאגין מעיר CEO → CEO מנתב ויוצר issue. סוכנים קוראים comments אחרונים לפני עבודה (HEARTBEAT 2b-2c).
|
||||||
│ ├── block-schema.md 12 בלוקים (המסמך החשוב ביותר)
|
- **קריאות API דרך helper בלבד**: bash → `scripts/pc.sh`; Python → `pc_request()` מ-`web/paperclip_api.py`. **אסור** `curl` ישיר ל-Paperclip או `httpx.AsyncClient` ישיר.
|
||||||
│ ├── migration-plan.md תוכנית מעבר vault → DB
|
- **Cross-company sync**: 14 סוכנים = 7 × 2 חברות (CMP=1xxx master, CMPA=8xxx mirror). אחרי כל שינוי הגדרות/skills של סוכן — להריץ `scripts/sync_agents_across_companies.py --apply`. **מדלג** על סוכנים עם `adapter_type` שונה בין החברות (למשל `deepseek_local`) — להחיל ידנית בשתיהן.
|
||||||
│ ├── legal-decision-lessons.md לקחים מ-3 החלטות
|
|
||||||
│ └── memory.md הקשר כללי — skills, פרויקטים
|
|
||||||
├── skills/ ← כלי עבודה ומדריכים
|
|
||||||
│ ├── decision/ מדריך סגנון + references + 12 בלוקים
|
|
||||||
│ ├── assistant/ קטלוג מסמכים
|
|
||||||
│ ├── docx/ עיצוב DOCX
|
|
||||||
│ ├── dafna-decision-template/ export DOCX לפי תבנית Word של דפנה
|
|
||||||
│ └── new-company-setup/ blueprint הוספת חברה חדשה
|
|
||||||
├── .claude/
|
|
||||||
│ └── agents/ ← הוראות סוכנים + HEARTBEAT.md (symlinks ב-Paperclip)
|
|
||||||
│ ├── HEARTBEAT.md checklist הפעלה משותף לכל הסוכנים
|
|
||||||
│ ├── legal-ceo.md תזמורן + בקרת זרימה
|
|
||||||
│ ├── legal-writer.md כתיבת בלוקים בסגנון דפנה
|
|
||||||
│ ├── legal-analyst.md ניתוח משפטי + חילוץ טענות
|
|
||||||
│ ├── legal-researcher.md חיפוש תקדימים
|
|
||||||
│ ├── legal-qa.md 7 שערי איכות
|
|
||||||
│ ├── legal-proofreader.md תיקון OCR
|
|
||||||
│ ├── legal-exporter.md ייצוא DOCX סופי
|
|
||||||
│ └── hermes-curator.md סוכן Hermes לניתוח סגנון post-export
|
|
||||||
├── data/
|
|
||||||
│ ├── training/ ← 4 החלטות לאימון (DOCX)
|
|
||||||
│ ├── exports/ ← טיוטות DOCX מיוצאות
|
|
||||||
│ └── cases/{case-number}/ ← תיקי עררים (מבנה שטוח, סטטוס ב-DB)
|
|
||||||
├── web/ ← FastAPI backend (Python): 75+ API endpoints
|
|
||||||
│ ├── app.py ← API ראשי
|
|
||||||
│ ├── paperclip_api.py ← אינטגרציית Paperclip: `pc_request()` + `emit_case_status_webhook()`
|
|
||||||
│ ├── paperclip_client.py ← legacy client (ישן — השתמש ב-paperclip_api.py)
|
|
||||||
│ └── gitea_client.py ← אינטגרציית Gitea
|
|
||||||
├── web-ui/ ← Next.js frontend (TypeScript/React): ממשק המשתמש
|
|
||||||
│ └── next.config.ts ← proxy: /api/* → FastAPI :8000
|
|
||||||
├── mcp-server/ ← MCP server + services + tools
|
|
||||||
├── adapters/ ← Paperclip external adapters (ראה למטה)
|
|
||||||
│ └── deepseek-paperclip-adapter/ ← `deepseek_local` (Hermes-pinned ל-DeepSeek profile)
|
|
||||||
└── scripts/ ← סקריפטים וכלי עזר (ראה scripts/SCRIPTS.md)
|
|
||||||
└── .archive/ ← סקריפטים שהושלמו (לא להריץ)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## כלל: עדכון `scripts/SCRIPTS.md`
|
## כלל: עדכון `scripts/SCRIPTS.md`
|
||||||
|
בכל פעם שנוצר, נמחק, או משתנה סקריפט בתיקיית `scripts/` — **חובה לעדכן את `scripts/SCRIPTS.md`** (תפקיד, סטטוס, החלפה).
|
||||||
בכל פעם שנוצר, נמחק, או משתנה סקריפט בתיקיית `scripts/` — **חובה לעדכן את `scripts/SCRIPTS.md`** בהתאם.
|
|
||||||
הקובץ מתעד את התפקיד, הסטטוס, וההחלפה (אם יש) של כל סקריפט.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ניהול משימות — TaskMaster AI
|
## ניהול משימות — TaskMaster AI
|
||||||
|
**תמיד** TaskMaster (לא TASKS.md ידני). קובץ קנוני: `~/legal-ai/.taskmaster/tasks/tasks.json` (tags: `master`, `legal-ai`). פקודות: `get_tasks`, `next_task`, `add_task`, `update_task`, `expand_task`.
|
||||||
הפרויקט משתמש ב-**TaskMaster AI** (MCP server) לניהול משימות מובנה:
|
> **⚠️ מלכוד cwd ב-CLI:** `--tag` בוחר קבוצה *בתוך* הקובץ — לא לאיזה קובץ לכתוב (ה-CLI מאתר לפי cwd). תמיד `cd ~/legal-ai` לפני כל פקודה משנה, ואז אמת ב-MCP `get_tasks`. כשלא בטוחים — לערוך את הקובץ ישירות. פירוט: [`docs/operations-runbook.md`](docs/operations-runbook.md).
|
||||||
- **תמיד** להשתמש ב-TaskMaster לפירוק, מעקב וניהול משימות — לא ב-TASKS.md ידני
|
|
||||||
- קובץ המשימות הקנוני: `~/legal-ai/.taskmaster/tasks/tasks.json` (יחסי ל-project root, **לא** `~/.taskmaster/tasks/tasks.json`). מכיל את כל ה-tags של legal-ai (`master`, `legal-ai`).
|
|
||||||
- פקודות עיקריות: `get_tasks`, `next_task`, `add_task`, `update_task`, `expand_task`
|
|
||||||
- לפני התחלת עבודה → `next_task` כדי לדעת מה הבא לפי תלויות
|
|
||||||
- אחרי סיום משימה → `update_task` עם status=done
|
|
||||||
- משימה מורכבת → `expand_task` לפירוק לתתי-משימות
|
|
||||||
|
|
||||||
> **⚠️ מלכוד cwd ב-CLI:** הדגל `--tag` בוחר קבוצה לוגית *בתוך* הקובץ — הוא **לא** בוחר לאיזה `tasks.json` לכתוב. ה-CLI מאתר את הקובץ לפי ה-cwd (`<cwd>/.taskmaster/tasks/tasks.json`). תמיד `cd ~/legal-ai` לפני `task-master add-task` או כל פקודה משנה, ואז אמת ב-MCP `get_tasks` שהשינוי נחת. הרצה מ-`~/` כותבת לקובץ נטוש והמשימה לא תופיע בשאילתות MCP. כשלא בטוחים — לערוך את `~/legal-ai/.taskmaster/tasks/tasks.json` ישירות.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Paperclip — כללי אינטגרציה קריטיים
|
## עקרונות כתיבה קריטיים (G11)
|
||||||
|
|
||||||
### Wakeup API — תמיד דרך API, לעולם לא דרך DB
|
|
||||||
- **הנתיב הנכון**: `POST /api/agents/{agent-id}/wakeup` (לא `/wake`!)
|
|
||||||
- **⚠️ אסור**: `INSERT INTO agent_wakeup_requests` ישירות — זה יוצר רק רשומה בלי `heartbeat_run`, והסוכן **לא יתעורר לעולם**
|
|
||||||
- **⚠️ חובה לשלוח `payload` עם `issueId`** — בלי זה הסוכן מתעורר בלי הקשר (בלי תיק, בלי issue, בלי cwd נכון)
|
|
||||||
- דוגמה נכונה:
|
|
||||||
```json
|
|
||||||
{"source": "automation", "triggerDetail": "system", "reason": "...",
|
|
||||||
"payload": {"issueId": "...", "mutation": "comment", "commentId": "..."}}
|
|
||||||
```
|
|
||||||
- **Board API Key**: שמור ב-DB (`board_api_keys`), auth: `Authorization: Bearer pbk_...`
|
|
||||||
|
|
||||||
### ניתוב comments דרך CEO
|
|
||||||
- כשמשתמש כותב תגובה על issue ב-Paperclip, הפלאגין (`plugin-legal-ai`) מעיר את ה-CEO דרך `ctx.agents.invoke()`
|
|
||||||
- ה-CEO קורא את ה-comment, מחליט על ניתוב, ויוצר issue לסוכן המתאים
|
|
||||||
- כל הסוכנים חייבים לקרוא comments אחרונים לפני שהם מתחילים לעבוד (HEARTBEAT שלבים 2b-2c)
|
|
||||||
|
|
||||||
### קריאות API — תמיד דרך helper, לעולם לא `curl` ישיר
|
|
||||||
- **bash (סוכנים):** `~/legal-ai/scripts/pc.sh <METHOD> <PATH> [BODY_JSON]` — מוסיף Authorization, X-Paperclip-Run-Id, Content-Type, base URL. ראה `HEARTBEAT.md §0`.
|
|
||||||
- **Python (FastAPI):** `from web.paperclip_api import pc_request; await pc_request("POST", "/api/...", json={...})` — שימוש ב-board API key.
|
|
||||||
- **אסור** `curl ... $PAPERCLIP_API_URL` ישיר ב-bash; **אסור** `httpx.AsyncClient` ישיר ל-Paperclip ב-Python.
|
|
||||||
- **למה:** ה-skill הרשמי דורש `X-Paperclip-Run-Id` בכל קריאה משנה issue. אצלנו ה-audit trail עבד ממילא דרך JWT claims (`runId: runIdHeader || claims.run_id`), אבל ה-helper מבטיח עקביות + תאימות ל-board API keys (long-lived) שלא נושאות JWT claims.
|
|
||||||
|
|
||||||
### Cross-company agent sync — אחרי כל שינוי הגדרות
|
|
||||||
- יש 14 סוכנים = 7 × 2 חברות (CMP=1xxx, CMPA=8xxx). Paperclip מחייב `agents.company_id NOT NULL` — אין shared agents.
|
|
||||||
- **Master = CMP (1xxx)**, **Mirror = CMPA (8xxx)**.
|
|
||||||
- אחרי כל שינוי ב-`adapter_config`, `runtime_config`, `budget_monthly_cents`, או skills של סוכן ב-master (UI, SQL, או API), **חובה להריץ:**
|
|
||||||
```bash
|
|
||||||
PAPERCLIP_BOARD_API_KEY=$(...infisical...) \
|
|
||||||
python ~/legal-ai/scripts/sync_agents_across_companies.py --verify # לבדיקה
|
|
||||||
PAPERCLIP_BOARD_API_KEY=$(...) \
|
|
||||||
python ~/legal-ai/scripts/sync_agents_across_companies.py --apply # לסנכרן
|
|
||||||
```
|
|
||||||
- הסקריפט מסנן local skills שלא קיימים ב-CMPA (מציג אזהרה), משתמש ב-API (לא DB ישיר), יוצר revisions, idempotent.
|
|
||||||
- שאלות ה-skill הרשמי של Paperclip — `paperclip` skill תחת `paperclipai/paperclip`.
|
|
||||||
|
|
||||||
### Webhook יוצא — עדכון סטטוס תיק לפלאגין
|
|
||||||
|
|
||||||
כשסטטוס תיק משתנה דרך `PUT /api/cases/{case_number}`, הבקאנד שולח webhook אסינכרוני לפלאגין:
|
|
||||||
|
|
||||||
```
|
|
||||||
PUT /api/cases/{case_number} → emit_case_status_webhook() [BackgroundTask]
|
|
||||||
→ POST /api/plugins/marcusgroup.legal-ai/webhooks/case-status
|
|
||||||
→ plugin-legal-ai/onWebhook()
|
|
||||||
→ comment בעברית על issue + CEO wakeup (כשסטטוס = qa_failed)
|
|
||||||
```
|
|
||||||
|
|
||||||
- הקוד ב-`web/paperclip_api.py` (`emit_case_status_webhook`), fire-and-forget, timeout 5s
|
|
||||||
- הפלאגין שומר idempotency key ב-state עם TTL 5 דקות למניעת spam על retry
|
|
||||||
- `GET /api/cases/stale?days=N` — תיקים שלא עודכנו N ימים; מוחרגים: `new`, `final`, `exported`
|
|
||||||
- `GET /api/chair-feedback/weekly-summary` — סיכום פידבק YU"R לשבוע האחרון
|
|
||||||
|
|
||||||
### Scheduled Jobs (plugin-legal-ai)
|
|
||||||
|
|
||||||
| Job | לוח זמנים | מה עושה |
|
|
||||||
|-----|-----------|---------|
|
|
||||||
| `stale-case-reminder` | יומי 08:00 | שולח comment אזהרה על תיקים תקועים >3 ימים |
|
|
||||||
| `weekly-feedback-analysis` | ראשון 19:00 | מעיר CEO לניתוח פידבק YU"R ועדכון `docs/legal-decision-lessons.md` |
|
|
||||||
| `sync-case-status` | כל 30 דק' | מסנכרן סטטוסי תיקים בין legal-ai ל-Paperclip |
|
|
||||||
|
|
||||||
CEO שמתעורר מ-`weekly-feedback-job` כותב לקובץ בלבד — **אין לו issueId, אל תנסה לפרסם comment או לסגור issue**.
|
|
||||||
|
|
||||||
### External adapters — `deepseek_local`
|
|
||||||
- מיקום ה-package: [adapters/deepseek-paperclip-adapter/](adapters/deepseek-paperclip-adapter/) (לא ב-`node_modules`).
|
|
||||||
- רישום ב-Paperclip: רשומה ב-`~/.paperclip/adapter-plugins.json` (נטען אוטומטית ב-startup דרך `buildExternalAdapters`). אין צורך בעריכת `node_modules`.
|
|
||||||
- **מה ה-adapter עושה**: spawnל-`hermes chat` עם `HERMES_HOME=/home/chaim/.hermes/profiles/deepseek` כך שה-CLI טוען את `config.yaml` (`base_url=https://api.deepseek.com/v1`, `provider=custom`, `key_env=DEEPSEEK_API_KEY`) ואת `.env` (שמכיל את ה-key).
|
|
||||||
- **מודלים זמינים** (lookup ב-DeepSeek `/v1/models`): `deepseek-v4-pro` (default), `deepseek-v4-flash`. יופיעו כדרופ-דאון ב-UI.
|
|
||||||
- **התקנה מחדש / עדכון**: `curl -X POST -H "Authorization: Bearer pcapi_legal_install_key_2026" -H "Content-Type: application/json" -d '{"packageName":"/home/chaim/legal-ai/adapters/deepseek-paperclip-adapter","isLocalPath":true}' http://localhost:3100/api/adapters/install`. לעדכון hot — `POST /api/adapters/deepseek_local/reload`.
|
|
||||||
- **⚠ Cross-company sync**: `sync_agents_across_companies.py` **מדלג** על סוכנים עם `adapter_type` שונה בין CMP ל-CMPA. כשעוברים סוכן ל-`deepseek_local` חובה להחיל ידנית בשתי החברות לפני sync.
|
|
||||||
- **תוספת adapters עתידיים** (OpenAI ישיר, Anthropic ישיר, וכו'): אותו דפוס. ה-package הראשי חייב לייצא `createServerAdapter()` שמחזיר `{ type, label, models, agentConfigurationDoc, execute, testEnvironment, sessionCodec, listSkills, syncSkills, ... }`. ראה את [adapters/deepseek-paperclip-adapter/dist/index.js](adapters/deepseek-paperclip-adapter/dist/index.js) כתבנית.
|
|
||||||
|
|
||||||
### External adapters — Hermes Curator (`curator-cmp` / `curator-cmpa`)
|
|
||||||
- פרופילי Hermes נפרדים לסוכן `hermes-curator` — מנתח החלטות סופיות ומציע עדכוני SKILL.md/lessons.md
|
|
||||||
- מיקום: `~/.hermes/profiles/curator-cmp/` + `~/.hermes/profiles/curator-cmpa/`
|
|
||||||
- מופעל אחרי export סופי; אינו מעדכן קבצים ישירות
|
|
||||||
- **תהליך אישור הצעות:** הצעות ה-curator מגיעות כ-comment ב-Paperclip → חיים בוחן ומאשר ידנית → commits ל-`SKILL.md` ו-`docs/legal-decision-lessons.md`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## עקרונות כתיבה קריטיים
|
|
||||||
|
|
||||||
1. **"מבחן השופט"** — כל החלטה חייבת להיות קריאה לשופט שלא מכיר את התיק
|
1. **"מבחן השופט"** — כל החלטה חייבת להיות קריאה לשופט שלא מכיר את התיק
|
||||||
2. **"רקע ניטרלי"** — בלוק ו = עובדות בלבד. אין ציטוטים מצדדים, אין מילות שיפוט
|
2. **"רקע ניטרלי"** — בלוק ו = עובדות בלבד. אין ציטוטים מצדדים, אין מילות שיפוט
|
||||||
@@ -330,14 +159,7 @@ CEO שמתעורר מ-`weekly-feedback-job` כותב לקובץ בלבד — **
|
|||||||
5. **ארכיטקטורת 12 בלוקים** — ראה `docs/block-schema.md`
|
5. **ארכיטקטורת 12 בלוקים** — ראה `docs/block-schema.md`
|
||||||
6. **צ'קליסט תוכן** — בלוק י מקבל צ'קליסט תוכן אוטומטי לפי סוג הערר (ראה `lessons.py: CONTENT_CHECKLISTS`)
|
6. **צ'קליסט תוכן** — בלוק י מקבל צ'קליסט תוכן אוטומטי לפי סוג הערר (ראה `lessons.py: CONTENT_CHECKLISTS`)
|
||||||
|
|
||||||
## הערות יו"ר (Chair Feedback)
|
> **הערות יו"ר (Chair Feedback):** מנגנון תיעוד הערות דפנה — טבלת `chair_feedback`, API `/api/feedback`, MCP `record_chair_feedback`/`list_chair_feedback`, UI `/feedback`. פירוט: [`docs/operations-runbook.md`](docs/operations-runbook.md).
|
||||||
|
|
||||||
מנגנון לתיעוד הערות דפנה על טיוטות:
|
|
||||||
- **DB**: טבלת `chair_feedback` (case_id, block_id, feedback_text, category, lesson_extracted)
|
|
||||||
- **API**: `GET/POST /api/feedback`, `PATCH /api/feedback/{id}/resolve`
|
|
||||||
- **MCP tools**: `record_chair_feedback`, `list_chair_feedback`
|
|
||||||
- **UI**: דף ניהול ב-`/feedback` (ב-Next.js)
|
|
||||||
- **קטגוריות**: missing_content, wrong_tone, wrong_structure, factual_error, style, other
|
|
||||||
|
|
||||||
## יו"ר: עו"ד דפנה תמיר
|
## יו"ר: עו"ד דפנה תמיר
|
||||||
- מדריך סגנון מלא: `skills/decision/SKILL.md`
|
מדריך סגנון מלא: [`skills/decision/SKILL.md`](skills/decision/SKILL.md).
|
||||||
|
|||||||
@@ -74,6 +74,9 @@ COPY skills/decision/SKILL.md ./skills/decision/SKILL.md
|
|||||||
COPY docs/legal-decision-lessons.md ./docs/legal-decision-lessons.md
|
COPY docs/legal-decision-lessons.md ./docs/legal-decision-lessons.md
|
||||||
COPY docs/corpus-analysis.md ./docs/corpus-analysis.md
|
COPY docs/corpus-analysis.md ./docs/corpus-analysis.md
|
||||||
|
|
||||||
|
# Scripts catalog surfaced read-only at /scripts (GET /api/scripts/catalog).
|
||||||
|
COPY scripts/SCRIPTS.md ./scripts/SCRIPTS.md
|
||||||
|
|
||||||
# Make mcp-server source available to web/app.py (it does sys.path.insert for legal_mcp)
|
# Make mcp-server source available to web/app.py (it does sys.path.insert for legal_mcp)
|
||||||
ENV PYTHONPATH=/app/mcp-server/src
|
ENV PYTHONPATH=/app/mcp-server/src
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ with \`HERMES_HOME\` pointed at a DeepSeek profile (\`config.yaml\` declares
|
|||||||
| verbose | boolean | false | Enable verbose Hermes logs. |
|
| verbose | boolean | false | Enable verbose Hermes logs. |
|
||||||
| extraArgs | string[] | [] | Extra CLI args appended after standard flags. |
|
| extraArgs | string[] | [] | Extra CLI args appended after standard flags. |
|
||||||
| env | object | {} | Extra environment variables passed to Hermes. \`HERMES_HOME\` here overrides \`hermesProfileHome\`. |
|
| env | object | {} | Extra environment variables passed to Hermes. \`HERMES_HOME\` here overrides \`hermesProfileHome\`. |
|
||||||
| promptTemplate | string | (default) | Override the default Paperclip wakeup prompt. |
|
| instructionsFilePath | string | (none) | Absolute path to a versioned prompt file (e.g. under \`.claude/agents/\`). When set, its contents become the prompt template — single source of truth, parity with \`claude_local\`/\`gemini_local\`. Takes precedence over \`promptTemplate\`. If set but unreadable, execution fails loudly (no silent fallback). The file still flows through the template renderer, so \`{{…}}\` placeholders work. |
|
||||||
|
| promptTemplate | string | (default) | Inline prompt override. Used only when \`instructionsFilePath\` is unset. |
|
||||||
| paperclipApiUrl | string | \`http://127.0.0.1:3100/api\` | Paperclip API URL injected into the prompt template. |
|
| paperclipApiUrl | string | \`http://127.0.0.1:3100/api\` | Paperclip API URL injected into the prompt template. |
|
||||||
|
|
||||||
## Available template variables
|
## Available template variables
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
* and toolsets from <HERMES_HOME>/config.yaml + <HERMES_HOME>/.env.
|
* and toolsets from <HERMES_HOME>/config.yaml + <HERMES_HOME>/.env.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { readFileSync } from "node:fs";
|
||||||
import {
|
import {
|
||||||
runChildProcess,
|
runChildProcess,
|
||||||
buildPaperclipEnv,
|
buildPaperclipEnv,
|
||||||
@@ -84,8 +85,37 @@ Address the comment, POST a reply if needed, then continue working.
|
|||||||
3. If nothing to do, report briefly what you checked.
|
3. If nothing to do, report briefly what you checked.
|
||||||
{{/noTask}}`;
|
{{/noTask}}`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve the prompt template, preferring a versioned file over an inline DB
|
||||||
|
* string. Precedence: instructionsFilePath > promptTemplate > DEFAULT.
|
||||||
|
*
|
||||||
|
* This brings deepseek_local into line with claude_local / gemini_local, whose
|
||||||
|
* system prompts live as files under .claude/agents/. Keeping the prompt in one
|
||||||
|
* git-versioned place (not split between a file and an inline DB column) is the
|
||||||
|
* single-source-of-truth the other adapters already enforce.
|
||||||
|
*
|
||||||
|
* Fail loud: if instructionsFilePath is set but unreadable we throw rather than
|
||||||
|
* silently falling back — a wrong/missing prompt file must surface as an error,
|
||||||
|
* not run the agent on a stale inline copy. The loaded file still flows through
|
||||||
|
* renderTemplate(), so {{wakeReason}}/{{#taskId}}/… placeholders keep working.
|
||||||
|
*/
|
||||||
|
export function resolveTemplate(config) {
|
||||||
|
const filePath = cfgString(config.instructionsFilePath);
|
||||||
|
if (filePath) {
|
||||||
|
try {
|
||||||
|
return readFileSync(filePath, "utf8");
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(
|
||||||
|
`deepseek_local: instructionsFilePath is set ("${filePath}") but could not be read: ${err.message}. ` +
|
||||||
|
`Refusing to fall back to promptTemplate/default — fix the path or unset instructionsFilePath.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cfgString(config.promptTemplate) || DEFAULT_PROMPT_TEMPLATE;
|
||||||
|
}
|
||||||
|
|
||||||
function buildPrompt(ctx, config) {
|
function buildPrompt(ctx, config) {
|
||||||
const template = cfgString(config.promptTemplate) || DEFAULT_PROMPT_TEMPLATE;
|
const template = resolveTemplate(config);
|
||||||
const taskId = cfgString(ctx.context?.taskId);
|
const taskId = cfgString(ctx.context?.taskId);
|
||||||
const taskTitle = cfgString(ctx.context?.taskTitle) || "";
|
const taskTitle = cfgString(ctx.context?.taskTitle) || "";
|
||||||
const taskBody = cfgString(ctx.context?.taskBody) || "";
|
const taskBody = cfgString(ctx.context?.taskBody) || "";
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
canonical_id,instance_count,status,drift_cosine,reason,before,after
|
||||||
|
b4c36a38-0772-497c-981e-2c28f9cb1059,3,accepted,0.8963,הוסר המשפט על תכניות ישנות הנעדרות פירוט — אינו מעוגן באף אחד מהציטוטים-התומכים; שני המשפטים הנותרים משותפים לשלושת המופעים.,"היתר בנייה חייב לעלות בקנה אחד עם הוראות התכניות שבתוקף ולהינתן מכוח תכנית הכוללת רמת פירוט נאותה; רמת הפירוט הנדרשת נגזרת מאופי ההיתר המבוקש, מהבנייה המתוכננת ומהשלכותיה על סביבתה. תכניות ישנות הנעדרות פירוט מספק אינן יכולות לשמש בסיס להוצאת היתרי בנייה.","היתר בנייה חייב לעלות בקנה אחד עם הוראות התכניות שבתוקף ולהינתן מכוח תכנית הכוללת רמת פירוט נאותה; רמת הפירוט הנדרשת נגזרת מאופי ההיתר המבוקש, מהבנייה המתוכננת ומהשלכותיה על סביבתה."
|
||||||
|
1fb10fbb-cffa-4bb8-951b-51f59345f51a,2,accepted,0.9498,שני המופעים זהים בתוכנם והניסוח הקיים כבר מזקק במדויק את הציטוטים-התומכים — לשון תוחמת את מרחב הפרשנות ובתוכו נבחרת המשמעות המגשימה את התכלית; לא נדרש שינוי מהותי.,"לשון הנורמה היא המסד שעליו נבנה הפירוש התכליתי, והיא הקובעת את גבול התפרשותה של הנורמה; מבין מספר משמעויות לשוניות אפשריות יש לבחור באותה משמעות המגשימה באופן המלא ביותר את תכלית החקיקה.",לשון הנורמה היא המסד שעליו נבנה הפירוש התכליתי והיא הקובעת את גבול התפרשותה של הנורמה; מבין מספר משמעויות לשוניות אפשריות יש לבחור באותה משמעות המגשימה באופן המלא ביותר את תכלית החקיקה.
|
||||||
|
21
data/audit/canonical-synthesis-dryrun-20260619T091034Z.csv
Normal file
21
data/audit/canonical-synthesis-dryrun-20260619T091034Z.csv
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
canonical_id,instance_count,status,drift_cosine,reason,before,after
|
||||||
|
3374fddc-ff56-4083-9ef3-3e7d5f98c28a,1,accepted,0.916,"הניסוח הקיים כבר כללי, מעוגן בציטוט-התומך ('רחוקים מזמינות לבניה') ונקי ממילות-פתיחה ועובדות-תיק; בוצע תיקון-איות זניח בלבד (בנייה) ללא שינוי מהותי.","קיומן של 'תשתיות-על' בלבד במועד הקובע, בהיעדר פיתוח פנים-מתחמי של אזור התוכנית, מלמד כי המגרשים שיועדו בתוכנית לבניה טרם הגיעו לכלל זמינות לבניה.","קיומן של תשתיות-על בלבד במועד הקובע, בהיעדר פיתוח פנים-מתחמי של אזור התוכנית, מלמד כי המגרשים שיועדו בתוכנית לבנייה טרם הגיעו לכלל זמינות לבנייה."
|
||||||
|
a7bb351e-4fef-4115-94b0-c270c1a00bc5,1,accepted,0.918,קוצר והודק לניסוח כללי יותר תוך שמירה על ההבחנה המעוגנת בין מבחן ההתאמה (שימוש חורג מהיתר) למבחן ההצדקה התכנונית (שימוש חורג מתוכנית); הוסר עודף ניסוח.,"כאשר מבוקש היתר לשימוש חורג מהיתר (להבדיל משימוש חורג מתוכנית), אין צורך להצדיק תכנונית את השימוש המבוקש, שכן התוכנית כבר מתירה אותו; המבחן הרלוונטי הוא מבחן ההתאמה — האם הבניין הקיים, שנבנה לשימוש שונה, מתאים לשימוש המבוקש — ולא מבחן ההצדקה התכנונית.","במבוקש היתר לשימוש חורג מהיתר, להבדיל משימוש חורג מתוכנית, המבחן הוא מבחן ההתאמה — האם המבנה הקיים מתאים לשימוש המבוקש — ולא מבחן ההצדקה התכנונית, שכן התוכנית כבר מתירה את השימוש."
|
||||||
|
7cc3a473-45c2-40d4-9a94-25ae8d0926a4,1,accepted,0.913,"זוקק וקוצר הניסוח ('בטל החוזה כולו ולא רק בהוראתו הפסולה') תוך שמירה מלאה על העיגון בציטוט-התומך, בלא הוספת דין או סייג.","מקום שחלקו הבלתי-חוקי של חוזה שלוב ושזור בשאר חלקיו באופן שאינו ניתן להפרדה, אין להפריד בין חלקי החוזה והוא בטל כולו, ולא רק בהוראתו הפסולה.","מקום שחלקו הבלתי-חוקי של חוזה שלוב ושזור ביתר חלקיו באופן שאינו ניתן להפרדה, בטל החוזה כולו ולא רק בהוראתו הפסולה."
|
||||||
|
72bd4205-0063-4ff1-ab60-14e17b1f5bfd,1,accepted,0.9198,"החלפתי 'אינן בגדר הקלה' ב'אינן טעונות הליך הקלה' (מדויק יותר ונסמך על הנימוק), הסרתי את 'ומועד אירוע המס' העודף שאינו בציטוט-התומך אלא בנימוק בלבד, וליטשתי את ניסוח חלוקת התשלום.","זכויות שהוטמעו בתכנית ואינן בגדר הקלה דינן כזכויות מעין-מוקנות, ולגביהן המועד הקובע ומועד אירוע המס לעניין היטל השבחה הוא מועד אישור התכנית ולא מועד אישור הזכויות בפועל; אולם מקום שבו המימוש נעשה בדרך של מכר, מתחלק תשלום ההשבחה — חלקו משולם במימוש בדרך המכר וחלקו בעת הוצאת היתר הבניה המממש את הזכויות המעין-מוקנות.","זכויות שהוטמעו בתכנית ואינן טעונות הליך הקלה דינן כזכויות מעין-מוקנות, ולגביהן המועד הקובע לעניין היטל השבחה הוא מועד אישור התכנית ולא מועד אישור הזכויות בפועל; ואולם מקום שבו המימוש נעשה בדרך של מכר, מתחלק תשלום ההשבחה — חלקו משולם בעת המימוש בדרך המכר וחלקו בעת הוצאת היתר הבניה המממש את הזכויות המעין-מוקנות."
|
||||||
|
d85d0c15-a699-4041-90cd-133220aa8060,1,accepted,0.9274,"זוקק לניסוח אחד רציף ותמציתי תוך שמירה על שלושת רכיבי העיקרון המעוגנים בציטוט — מקור תכנוני, קשר סיבתי ישיר, ושלילת חיוב על השבחה לא-תכנונית.",היטל השבחה מוטל אך ורק על עליית שווי מקרקעין הנובעת מפעולה תכנונית של הרשות; תנאי הכרחי לחיוב בהיטל הוא קיומו של קשר סיבתי ישיר בין הפעילות התכנונית המשביחה לבין עליית שווי המקרקעין שלפיה מחושבת ההשבחה. עליית שווי הנובעת מטעמים שאינם תכנוניים אינה בת-חיוב בהיטל.,"היטל השבחה מוטל אך ורק על עליית שווי מקרקעין הנובעת מפעולה תכנונית, ותנאי לחיוב בו הוא קשר סיבתי ישיר בין הפעולה התכנונית המשביחה לבין עליית השווי שלפיה מחושבת ההשבחה; עליית שווי הנובעת מטעם שאינו תכנוני אינה בת-חיוב בהיטל."
|
||||||
|
85c85ee3-6c2f-4493-81f5-677398f29c4c,1,accepted,0.8128,"הוסרו שם השכונה (רחביה) והעיר (ירושלים) כעובדות-תיק ספציפיות, והעיקרון נוסח כרב-תחולה; 'המועדפת' הוחלפה ב'הפשוטה' בהתאם לציטוט-המקור, ונשמרו יסוד היעילות, נטל ההנמקה לסטייה, וחריג המקרים הנדירים.","גישת ההשוואה היא השיטה המועדפת והיעילה ביותר לקביעת היטל השבחה, ועל השמאי לנמק מדוע בחר לסטות ממנה לטובת גישות אחרות, במיוחד באזורי ביקוש פעילים כשכונת רחביה בירושלים בהם נחתמות עסקאות מכר באופן שוטף ולא מתקיימים אותם מקרים נדירים המצדיקים שימוש בגישות שמאיות חלופיות.","גישת ההשוואה היא השיטה הפשוטה והיעילה ביותר לקביעת חיובי היטל השבחה, ושימוש בגישות שמאיות חלופיות שמור למקרים נדירים בלבד; משכך, ובמיוחד באזורי ביקוש שבהם נחתמות עסקאות מכר באופן שוטף, על השמאי לנמק מדוע בחר לסטות ממנה."
|
||||||
|
5f4e986b-7554-45e2-89fa-9e0f856169c3,1,abstained,,no change proposed,"כדי שהפרה לכאורית של תכנית תגבור על שיהוי חריף, נדרש שאימוץ פרשנות הרשות לתכנית יפגע פגיעה חמורה ומשמעותית בשלטון החוק. כל עוד הפרשנות שהעניקה הרשות לתכנית היא פרשנות אפשרית — גם אם בסופו של הליך תידחה — לא די בה כדי להצדיק התערבות חרף השיהוי.","כדי שהפרה לכאורית של תכנית תגבור על שיהוי חריף, נדרש שאימוץ פרשנות הרשות לתכנית יפגע פגיעה חמורה ומשמעותית בשלטון החוק. כל עוד הפרשנות שהעניקה הרשות לתכנית היא פרשנות אפשרית — גם אם בסופו של הליך תידחה — לא די בה כדי להצדיק התערבות חרף השיהוי."
|
||||||
|
df6a17ea-33c5-4935-adb0-1ba1688e57e5,1,accepted,0.8846,"מיקדתי את העיקרון בליבת המקור (פירוט נאות כתנאי להיתר, והפגיעה בשקיפות ובשיתוף הציבור), והסרתי את התוספות שאינן עולות מהציטוט-התומך — 'פועל יוצא של התכנון המקומי' וההפניה לסעיף 145(ב).","היתר בנייה הוא פועל יוצא של התכנון המקומי וחייב לעלות בקנה אחד עם הוראות התכניות שבתוקף ולהינתן מכוח תכנית הכוללת רמת פירוט נאותה (סעיף 145(ב) לחוק); מתן היתר לפי תכנית הנעדרת פירוט מספיק חוטא לתכליות ההליכים הסטטוטוריים, ובהן שקיפות הליכי התכנון ושיתוף הציבור.","היתר בנייה חייב להישען על תכנית הכוללת רמת פירוט נאותה; מתן היתר מכוח תכנית הנעדרת פירוט מספיק חוטא לתכליות ההליכים הסטטוטוריים המהווים תנאי לאישור התכנית, ובהן שקיפות הליכי התכנון ושיתוף הציבור בהם."
|
||||||
|
d4b70600-3a7a-4216-a2a7-9cbad81c7b7a,1,accepted,0.897,"זוקק הניסוח לרגיסטר נקי ותמציתי תוך שמירה על כל יסודות העיקרון (קריאה משולבת של סעיפים 1 ו-259, חוכר לדורות כבעלים, עסקה טרם רישום, מקרקעי רמ""י, תחולה כללית) המעוגנים בציטוט ובנימוק; לא נוספו דין, סייג או הפניות חדשות.","את הגדרת ""בעל"" שבסעיף 1 לחוק התכנון והבניה ואת סעיף 259 יש לקרוא יחדיו, כך שהחוק רואה גם חוכר לדורות כבעלים — ובכלל זה מי שהעסקה בעניינו טרם הושלמה ברישום, ובלבד שמדובר בעסקה במקרקעין המנוהלים לפי חוק רשות מקרקעי ישראל. הגדרה זו אינה מוגבלת לעניין היטל השבחה אלא חלה באופן כללי.","הגדרת ""בעל"" שבסעיף 1 לחוק התכנון והבניה נקראת יחד עם סעיף 259, כך שגם חוכר לדורות נחשב בעלים — לרבות מי שעסקתו במקרקעין טרם הושלמה ברישום, ובלבד שמדובר במקרקעין המנוהלים לפי חוק רשות מקרקעי ישראל; קריאה משולבת זו חלה באופן כללי ואינה מוגבלת לעניין היטל ההשבחה."
|
||||||
|
bde10435-1572-4558-8074-5c8d9b8ade8a,1,accepted,0.89,"הוסר רכיב 'מקרי הביניים שבהם הכף מעוינת תהא הנטייה שלא לפטור', שהוא כלל-הכרעה ספציפי שאינו עולה מהציטוט התומך ומהנימוק; נשמר הגרעין המעוגן — חזקת היחידה הכלכלית, הטלת נטל הסתירה על הנישום, ורף הוכחתי ברור הנגזר מתכלית מניעת תכנוני מס.","קיימת חזקה כי בני זוג מהווים יחידה כלכלית אחת שיש למסותה ככזו, וההפרדה הרכושית היא החריג ולא הכלל; הנטל לסתור חזקה זו מוטל על הנישומים, והיא תיסתר רק בהצגת ראיות ברורות להפרדה רכושית ממשית ועקבית בפועל. במקרי ביניים שבהם הכף מעוינת תהא הנטייה שלא לפטור ממס, מתוך תכלית מניעת תכנוני מס המצדיקה רף הוכחתי ברור.","חזקה היא כי בני זוג מהווים יחידה כלכלית אחת שיש למסותה ככזו, והנטל לסתור חזקה זו מוטל על הנישומים; לנוכח תכלית מניעת תכנוני מס תיסתר החזקה רק בהוכחה ברורה של הפרדה רכושית ממשית ועקבית בפועל."
|
||||||
|
c41e4b84-d7e5-4e30-9b50-6d9e98cadbe2,1,drift_rejected,0.7808,drift 0.781 < floor 0.8,שתיקת התכנית החלה על המקרקעין ביחס להקמת בריכת שחיה אין בה כדי להצביע על כך שמדובר בשימוש אסור בייעוד למגורים; היעדר הוראה מפורשת בתכנית אינו שקול לאיסור.,"שתיקת התכנית ביחס לשימוש מסוים אין בה כדי להצביע על כך שמדובר בשימוש אסור, מקום שהשימוש נלווה לייעוד החל על המקרקעין; היעדר הוראה מפורשת המתירה את השימוש אינו שקול לאיסורו."
|
||||||
|
6e9993f4-60bb-4e6d-bbbe-4eeae7c0d919,1,accepted,0.8422,"זוקק לעיקרון רב-תחולה: הוכלל מבנה ניסוח-השימוש (סיווג-על + פירוט בסוגריים) במקום הדוגמה הקונקרטית, תוך שמירה על הגרעין המעוגן בציטוט — גמישות פרשנית מול פרשנות דווקנית.","כאשר תכנית מגדירה את השימוש המותר במקרקעין כ""בניין ציבורי (בית ספר)"" — להבדיל מהגדרה של ""בית ספר בלבד"" — יש לפרש את ההגדרה בפרשנות תכליתית המאפשרת גמישות, כך שמותרים שימושים נוספים מאותה משפחת שימושים (""מבני חינוך""), ולא רק בית ספר במובן הדווקני.","כאשר תכנית מגדירה שימוש מותר בנוסח של סיווג-על המלווה בפירוט בסוגריים — כגון ""בניין ציבורי (בית ספר)"" — להבדיל מהגדרה בלעדית ודווקנית, יש לפרשו בפרשנות תכליתית מרחיבה המתירה את כלל משפחת השימושים שאליה משתייך הפירוט, ולא את הפריט הנקוב בלבד."
|
||||||
|
18c5037f-5b9a-4c19-ac8b-69fc555fbe03,1,accepted,0.8879,"חודדה ההבחנה כך שתשקף את הזיקה שבמקור בין הטלת ההיטל על חברה יזמית להתאמת הגישה הכלכלית, בלי להוסיף דין חדש.","בבחירת גישת השומה ההולמת לקביעת היטל השבחה בפרויקט פינוי-בינוי, זהות החייב בהיטל מהווה שיקול רלוונטי, ויש להבחין בין הטלת ההיטל על חברה יזמית לבין הטלתו על בעלי דירות פרטיים.","זהות החייב בהיטל השבחה בפרויקט פינוי-בינוי מהווה שיקול רלוונטי בבחירת גישת השומה ההולמת, ויש להבחין בין חברה יזמית — שלגביה עשויה הגישה הכלכלית להלום את קביעת גובה ההיטל — לבין בעלי דירות פרטיים."
|
||||||
|
94d504c5-7263-429e-8a9a-9413ee859224,1,accepted,0.8816,זוקק לניסוח קצר ומדויק יותר הנשען ישירות על לשון התקנה ועל הנימוק (בחינה מהותית = הפעלת סמכות כדין); הוסר ביטוי 'חותמת גומי' שאינו עולה מהציטוט-התומך.,"מוסד תכנון המקיים דיון חוזר רשאי להותיר את החלטת ועדת המשנה על כנה, ובלבד שבחן את ההחלטה ושקל אם יש מקום לשנותה; אימוץ החלטת ועדת המשנה לאחר בחינה כאמור הוא החלטה לגיטימית בהתאם לדין, ואין בו כשלעצמו משום פגם של 'חותמת גומי'.","מוסד תכנון המקיים דיון חוזר רשאי להותיר את החלטת ועדת המשנה על כנה, ובלבד שבחן אותה ושקל אם יש מקום לשנותה; השארת ההחלטה על כנה לאחר בחינה מהותית כאמור היא הפעלת סמכות כדין ואינה פגם פרוצדורלי."
|
||||||
|
4bc63c4a-6a92-4a36-84c2-120aaf144579,1,accepted,0.899,"הידוק לשוני בלבד — איחוד 'הנעשה במקרקעין' ל'במקרקעין', 'הייעוד התכנוני שלהם' ל'ייעודם התכנוני', ו'ביטויי השימוש המותרים בה' ל'השימושים המותרים בו'; ללא תוספת דין מעבר למקורות.",לצורך סיווג תכנוני יש להבחין בין השימוש בפועל הנעשה במקרקעין לבין הייעוד התכנוני שלהם; מקור הזכות החוזי ומטרות ההקצאה של הקרקע עשויים ללמד על אופיו של הייעוד ועל פרשנות ביטויי השימוש המותרים בה.,לצורך סיווג תכנוני יש להבחין בין השימוש בפועל במקרקעין לבין ייעודם התכנוני; מקור הזכות החוזי ומטרות הקצאת הקרקע עשויים ללמד על אופי הייעוד ועל פרשנות השימושים המותרים בו.
|
||||||
|
f6fb8145-9c3f-4a54-8487-b0ad6ba5f991,1,accepted,0.9063,"ליטוש רגיסטר וקיצור בלבד ('אינו ממסה' במקום 'אינו נועד למסות', 'עליית שווי' במקום 'העלייה בשווי'); כל יסודות העיקרון נשמרו ומעוגנים בציטוט-התומך.","היטל ההשבחה אינו נועד למסות עליית-ערך כללית או 'שבח-סתם' של מקרקעין, אלא אך ורק את העלייה בשווי המקרקעין שנגרמה בעקבות פעולות תכנון של הוועדה המקומית, וזאת כדי לממן את ההוצאות שהוועדה נטלה על עצמה לצורך הכנת תכניות הבינוי וביצוען.","היטל ההשבחה אינו ממסה עליית-ערך כללית או 'שבח-סתם' של מקרקעין, אלא אך ורק את עליית שווי המקרקעין שנגרמה בעקבות פעולות תכנון של הוועדה המקומית, וזאת כדי לממן את ההוצאות שנטלה על עצמה הוועדה לצורך הכנת תכניות הבינוי וביצוען."
|
||||||
|
afe4dd53-e1d1-4e74-b994-15f0daf4ce88,1,accepted,0.8743,"חודד הרישא של בחינת הלשון והתכלית כמכלול בכך שנוסף 'ולא במנותק', הנובע ישירות מהנימוק והציטוט-התומך; לא נוסף דין או מקור חדש.","תכנית בניין עיר היא בגדר חיקוק, ועל פרשנותה חלים הכללים הרגילים של פרשנות חקיקה; משכך יש לבחון את לשון התכנית ותכליתה כמכלול אחד.","תכנית בניין עיר היא בגדר חיקוק, ועל פרשנותה חלים הכללים הרגילים של פרשנות חקיקה; לפיכך יש לבחון את לשון התכנית ואת תכליתה כמכלול אחד, ולא במנותק זו מזו."
|
||||||
|
7928bb10-b142-46d7-aaed-9e8d9a183772,1,accepted,0.9144,"חודד שהפיצול נובע מאי-הוודאות אם תוגש הבקשה (ולא מעצם ודאות האישור), כעולה במפורש מהציטוט-התומך; שאר הניסוח נשמר.","ההבחנה בין זכויות מעין מוקנות לזכויות צפות נבחנת לפי מבחן הוודאות במועד אישור התכנית: בזכויות מעין מוקנות קיימת ודאות במועד האישור כי בקשה לניצול הזכויות תאושר, ולפיכך התשלום מפוצל בין מועד המכר למועד היתר הבניה; בזכויות צפות, לעומת זאת, לא קיימת ודאות במועד הקובע באשר לאישור הזכויות, היקפן ואופן ניצולן.","ההבחנה בין זכויות מעין מוקנות לזכויות צפות נבחנת לפי מבחן הוודאות במועד אישור התכנית: בזכויות מעין מוקנות קיימת ודאות במועד האישור כי ככל שתוגש בקשה לניצול הזכויות היא תאושר, ומשום שאין ודאות אם תוגש בקשה כאמור מפוצל התשלום בין מועד המכר למועד היתר הבניה; בזכויות צפות, לעומת זאת, אין במועד הקובע ודאות באשר לעצם אישור הזכויות, היקפן ואופן ניצולן."
|
||||||
|
28b8fb4b-a044-4f36-9635-94d3156c3403,1,accepted,0.8924,"הובלט שההכרעה היא לפי שיקולים תכנוניים בלבד (כעולה מהנימוק והמקור), והוחלף 'בעל זכות' ב'בעל זכות במקרקעין' ו'סעד קנייני' ב'סעד במישור הקנייני' בהתאם ללשון הציטוט-התומך.","ההליך התכנוני, על כל שלביו, עוסק בסוגיות תכנוניות בלבד, גם כאשר מתעוררות בו אגב אורחא שאלות קנייניות; הוא אינו משנה את מצבת הזכויות הקנייניות, אינו מכריע במחלוקות קנייניות, ואינו חוסם בעל זכות מלפנות לערכאה המוסמכת לשם קבלת סעד קנייני.","ההליך התכנוני, על כל שלביו, מוכרע על-פי שיקולים תכנוניים בלבד, גם כאשר מתעוררות בו אגב אורחא שאלות קנייניות; אין בו כדי לשנות את מצבת הזכויות הקנייניות, להכריע במחלוקת קניינית, או למנוע מבעל זכות במקרקעין לפנות לערכאה המוסמכת לשם קבלת סעד במישור הקנייני."
|
||||||
|
08aee54b-9d92-47d2-b57b-0735dd34c0c4,1,accepted,0.8993,"צומצמה ההכפלה בין 'מהותי ולא מוסדי' לבין הנימוק, וחודד הרצף הלוגי מהמבחן אל התוצאה — בלי להוסיף דין שאינו במקור.","בקשת רשות ערעור לבית המשפט העליון על פסק דין של בית משפט מחוזי שניתן בערעור על החלטת רשם של אותו בית משפט, דינה כבקשה ב'גלגול שלישי' המחייבת רשות ערעור. לצורך סיווג זה המבחן הוא מהותי ולא מוסדי: אף שהרשם ושופט בית המשפט המחוזי משתייכים לאותה ערכאה במישור המוסדי, משעה ששני שופטים דנו בעניין זה בערעור על זה התקיימה מהותית ערכאת ערעור, ולפיכך לא די בהצבעה על אפשרות טעות עובדתית או משפטית אלא נדרשת שאלה נורמטיבית רחבה.","בקשת רשות ערעור על פסק דין של בית משפט מחוזי שניתן בערעור על החלטת רשם של אותו בית משפט נחשבת לבקשה ב'גלגול שלישי', שכן הסיווג נקבע לפי מבחן מהותי ולא מוסדי: משדנו שני שופטים בעניין זה בערעור על זה, התקיימה ערכאת ערעור במובן המהותי, אף שמוסדית שתי הדרגות שוכנות באותה ערכאה. לפיכך מתן הרשות מותנה בשאלה נורמטיבית רחבה, ולא די בהצבעה על אפשרות של טעות עובדתית או משפטית."
|
||||||
|
101
data/audit/canonical-synthesis-dryrun-20260619T092826Z.csv
Normal file
101
data/audit/canonical-synthesis-dryrun-20260619T092826Z.csv
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
canonical_id,instance_count,status,drift_cosine,reason,before,after
|
||||||
|
660bb5ae-1209-4215-812e-efbfc37f373c,1,accepted,0.8685,"צומצם לשני הפנים המעוגנים בציטוט-התומך; הוסר הפן השלישי בדבר פגיעה בשלטון החוק והאיזון התלת-שלבי, שאינו עולה ממקור-העיגון אלא מן הנימוק בלבד.","טענת שיהוי בהליך מינהלי נבחנת בשני פנים: הפן האובייקטיבי — חלוף הזמן עד הגשת ההליך והפגיעה באינטרסים ראויים של הרשות או של צדדים שלישיים ושינוי מצבם לרעה; והפן הסובייקטיבי — התנהלות העותר והשאלה אם יש בה כדי ללמד על ויתור על זכויותיו. בנוסף יש לבחון אם קבלת טענת השיהוי תותיר על כנה החלטה או מעשה מינהלי הפוגעים פגיעה חמורה בשלטון החוק או באינטרס ציבורי חשוב, ועל בית המשפט לאזן בין שלושת ההיבטים הללו לפי משקלם היחסי בנסיבות העניין.",טענת שיהוי בהליך מינהלי נבחנת בשני פנים: הפן האובייקטיבי — חלוף הזמן עד הגשת ההליך והפגיעה באינטרסים ראויים של הרשות או של צדדים שלישיים ושינוי מצבם לרעה בשל חלוף הזמן; והפן הסובייקטיבי — התנהלות העותר והשאלה אם יש בה כדי ללמד על ויתור על זכויותיו.
|
||||||
|
5bede666-24ac-487c-87a7-5c253e04966c,1,abstained,,no change proposed,"תכליתם של פיצויי ההפקעה היא להעניק לבעל הזכויות בקרקע את השווי הכספי של הזכות או טובת ההנאה שהופקעו מידיו, ולהעמידו באותו מצב כספי שבו היה עומד אלמלא ההפקעה.","תכליתם של פיצויי ההפקעה היא להעניק לבעל הזכויות בקרקע את השווי הכספי של הזכות או טובת ההנאה שהופקעו מידיו, ולהעמידו באותו מצב כספי שבו היה עומד אלמלא ההפקעה."
|
||||||
|
f3200101-162b-4f1f-af39-73a3088280a6,1,accepted,0.8503,"תומצת ונוקה הרגיסטר, נוסף שם-העיקרון 'הסדר שלילי' העולה מן הנימוק; לא נוסף דין מעבר למקור.","בפרשנות הוראת תכנית בדבר חישוב אחוזי הבניה, כאשר התכנית מפרטת במפורש כי שטחים מסוימים יובאו בחשבון חישוב אחוזי הבניה ושותקת ביחס לשטח אחר שייעודו מוגדר כשטח שאין לבנות בו, השתיקה — בצירוף ההסדר המפורש לגבי השטחים האחרים — מלמדת כי לשון התכנית אינה סובלת את הכללת אותו שטח בחישוב.","מקום שהוראת תכנית מונה במפורש את השטחים הבאים במניין חישוב אחוזי הבנייה ושותקת ביחס לשטח שייעודו הוגדר כשטח שאין לבנות בו, ההסדר המפורש לגבי יתר השטחים, בצירוף שתיקה זו, מלמד שלשון התכנית אינה סובלת את הכללת אותו שטח בחישוב (הסדר שלילי)."
|
||||||
|
4066d496-3088-425c-8b24-19df3cb4b8f4,1,accepted,0.9523,הניסוח הקנוני שופר בעיגון הסמכות בסעיף 14(ג) לתוספת — מקור-הסמכות שעליו נשען הנימוק — תוך שמירה על שני אגפי העיקרון; לא נוסף דין שאינו במקורות.,סמכות ועדת הערר למנות שמאי מייעץ מטעמה קמה רק מקום שהערר הוגש לפי סעיף 14(א) לתוספת בלבד; בערר המוגש לפי סעיף 14(ב)(4) על הכרעת שמאי מכריע אין הוועדה רשאית למנות שמאי מייעץ.,"סמכות ועדת הערר למנות שמאי מייעץ מטעמה, מכוח סעיף 14(ג) לתוספת, קמה רק מקום שהערר הוגש לפי סעיף 14(א) לתוספת; בערר על הכרעת שמאי מכריע המוגש לפי סעיף 14(ב)(4) לתוספת אין הוועדה מוסמכת למנות שמאי מייעץ."
|
||||||
|
a230f193-3048-48a1-8295-3369ac80f644,1,abstained,,no change proposed,"ביקורת בית המשפט לעניינים מנהליים על החלטות ועדת הערר במישור המקצועי תיעשה במשורה, מתוך ריסון והכרה במומחיותה של הוועדה.","ביקורת בית המשפט לעניינים מנהליים על החלטות ועדת הערר במישור המקצועי תיעשה במשורה, מתוך ריסון והכרה במומחיותה של הוועדה."
|
||||||
|
74db9cb4-acd7-47af-b8b9-7940bc9f3b81,1,abstained,,no change proposed,"בהפעילם את הסמכות להאריך או להעניק פטור מהיטל השבחה בפינוי-בינוי, אין השרים רשאים לשקול שיקולים של כדאיות כלכלית.","בהפעילם את הסמכות להאריך או להעניק פטור מהיטל השבחה בפינוי-בינוי, אין השרים רשאים לשקול שיקולים של כדאיות כלכלית."
|
||||||
|
7beb9330-1c8a-4f93-90d7-a71b5e3c48dc,1,accepted,0.9523,"הניסוח הודק והובהר ('יונחה לערוך', 'חלופות תכנוניות ממשיות') תוך שמירה מלאה על עיגון הציטוט; לא נוסף דין או סייג.","חובת מוסד התכנון ליתן משקל רב לשיקול הסביבתי, ובמיוחד בתכניות בעלות פוטנציאל לפגיעה משמעותית בסביבה, מחייבת אותו להנחות את עורך התסקיר לערוך תסקיר חלופות שבו ייבחנו חלופות תכנוניות אפשריות לתכנית המוצעת עצמה, ולא אך חלופות הנוגעות לאופן יישומה של אותה בחירה תכנונית.","חובת מוסד התכנון ליתן משקל רב לשיקול הסביבתי, ובמיוחד בתכניות בעלות פוטנציאל לפגיעה משמעותית בסביבה, מחייבת כי עורך התסקיר יונחה לערוך תסקיר חלופות הבוחן חלופות תכנוניות ממשיות לתכנית המוצעת עצמה, ולא אך חלופות הנוגעות לאופן יישומה של אותה בחירה תכנונית."
|
||||||
|
8643bd58-a740-499c-b012-968de6cae7f2,1,accepted,0.9342,"צומצמה הכפילות (""בהכרח"") והניסוח חודד תוך שמירה מלאה על העיגון בציטוט-התומך; לא נוסף דין או סייג.","הקמת מרחבים מוגנים דירתיים (ממ""דים) בבניין רב-קומות נעשית בהכרח בצורת ""מגדל"" — זה על גבי זה — מטעמים קונסטרוקטיביים ומיגוניים, ולפיכך לא ניתן להקים ממ""ד בקומה גבוהה ללא בסיס קונסטרוקטיבי בקומה שמתחתיה. עיקרון טכני-תכנוני זה מהווה מושכלת יסוד שניתן להניחה בפרשנות הוראות בינוי.","הקמת מרחבים מוגנים דירתיים (ממ""דים) בבניין רב-קומות נעשית בצורת ""מגדל"", זה על גבי זה, מטעמים קונסטרוקטיביים ומיגוניים, ולפיכך לא ניתן להקים ממ""ד בקומה גבוהה ללא בסיס קונסטרוקטיבי לממ""ד בקומה שמתחתיה. נתון טכני-תכנוני זה מהווה מושכלת יסוד שניתן להניחה בפרשנות הוראות בינוי."
|
||||||
|
a82d1f17-351c-4aac-a5da-9d24bd87760d,1,accepted,0.9477,"חודד הקשר בין ההרמוניה החקיקתית למקור הסמכות (החוק המסמיך) שעולה מהנימוק, ולוכדו 'כללי פרשנות מקובלים' במקום 'עקרונות פרשניים'; לא נוסף דין שאינו במקורות.",מונח שתכנית נוקטת בו מבלי להגדירו אינו מתפרש בחלל ריק אלא לפי עקרונות פרשניים מקובלים; עקרונות של הרמוניה חקיקתית מוליכים להעניק למונח כזה את המשמעות שניתנה לו בחוק התכנון והבנייה.,"מונח שתכנית נוקטת בו מבלי להגדירו אינו מתפרש בחלל ריק אלא לפי כללי פרשנות מקובלים, ושיקול ההרמוניה החקיקתית מוליך להעניק לו את המשמעות שניתנה לאותו מונח בחוק התכנון והבנייה כחוק המסמיך."
|
||||||
|
dbcde5e1-78a9-4c47-a22a-1e4ef1a42664,1,accepted,0.9237,"חודד שהעיגון נשען על תיחום התחולה בקו הכחול (כעולה מהנימוק והציטוט) והניסוח הודק, בלי להוסיף דין או סייג שאינו במקורות.","תוכנית מתאר אינה קובעת הוראות נורמטיביות מחייבות ביחס לשטח המצוי מחוץ לתחומה (מחוץ לקו הכחול), גם כאשר נספח (כגון נספח תחבורתי) כולל איור או תרשים המדגים את אופן השתלבות התוכנית עם המרקם והמערך הקיים שמחוץ לגבולותיה; לאיור מסוג זה אופי מדגים-מנחה ואין בו כדי להחיל הסדר תכנוני מעבר לקו הכחול.","תחום תחולתה הנורמטיבית של תוכנית מתאר מתוחם בקו הכחול, ואין היא קובעת הוראות מחייבות ביחס לשטח שמחוצה לו; איור או תרשים בנספח (כגון נספח תחבורתי) המדגים את אופן השתלבות התוכנית עם המרקם והמערך הקיים מחוץ לגבולותיה הוא בעל אופי מדגים-מנחה בלבד ואין בו כדי להחיל הסדר תכנוני מעבר לקו הכחול."
|
||||||
|
40fd0045-2c91-4b91-bf3d-94df86849917,1,accepted,0.9487,חודד שהמבחן מהותי ולא פורמלי (מעוגן בנימוק) והוסר עומס לשוני; התוכן זהה למקור.,"ניתן להוציא היתר בנייה על סמך תכנית מתאר מקומית, מבלי להידרש לתכנית מפורטת, רק מקום שהתכנית כוללת הוראות ברמת פירוט מספקת; כותרתה הפורמלית של התכנית (""מפורטת"") אינה מכרעת, ומידת הפירוט הנדרשת עשויה להימצא גם בתכנית מתאר מקומית. מקום שהתכנית קובעת עקרונות כלליים בלבד, אין היא יכולה לשמש בסיס למתן היתרים.","היתר בנייה ניתן להוצאה על סמך תכנית מתאר מקומית, בלא תכנית מפורטת, רק כאשר התכנית כוללת הוראות ברמת פירוט מספקת; המבחן הוא מהותי — מידת הפירוט המצויה בתכנית בפועל — ואינו תלוי בכותרתה הפורמלית, כך שהפירוט הנדרש עשוי להימצא גם בתכנית מתאר מקומית. תכנית הקובעת עקרונות כלליים בלבד אינה יכולה לשמש בסיס למתן היתרים."
|
||||||
|
9bcc8c7b-2fc6-4b64-b00f-de721161afe9,1,accepted,0.9204,זוקק לניסוח כללי הנשען על אבחנת המקור בין שימוש ישיר במקרקעין לבין הפקת 'פירותיהם' בהשכרה; הוסרה הנמקת ה'פעילות המסחרית' שאינה הכרחית והודגשה אי-הרלוונטיות של ייעוד התמורה.,"פטור ממס/היטל למוסד ציבורי לפי סעיף הפטור הרלוונטי חל אך ורק כאשר המקרקעין עצמם משמשים או מיועדים לשמש במישרין את מטרות המוסד. השכרת המקרקעין לצד שלישי — גם אם דמי השכירות מועברים במלואם לצרכי המוסד — אינה מזכה בפטור, באשר מדובר בפעילות מסחרית ולא בשימוש ישיר במקרקעין למטרות המוסד.","פטור ממס/היטל למוסד ציבורי לפי סעיף הפטור הרלוונטי חל אך ורק מקום שבו המקרקעין עצמם משמשים או מיועדים לשמש במישרין את מטרות המוסד; שימוש עקיף בלבד — כגון הפקת פירות מן המקרקעין בדרך של השכרתם — אינו מזכה בפטור, ואין נפקא מינה שהתמורה מופנית כולה לקידום מטרות המוסד."
|
||||||
|
4cee2a9f-6510-4bea-a928-713f5ed39b39,1,drift_rejected,0.7738,drift 0.774 < floor 0.8,"היטל ההשבחה הוא בן-זוגו הראוי של הפיצוי לפי סעיף 197 לחוק התכנון והבניה: כשם שבעל מקרקעין זכאי לפיצוי מקום שתכנית פגעה במקרקעיו, כך מוטל עליו לשאת בהיטל השבחה כאשר התכנית השביחה את מקרקעיו — מי שנתעשר אך בשל פעילות נורמטיבית-תכנונית של רשויות הציבור ראוי שישתף את הקהילה באותה התעשרות.",היטל ההשבחה מושתת על ההיגיון שמי שמקרקעיו הושבחו אך בשל פעילות נורמטיבית-תכנונית של רשויות הציבור ראוי שישתף את הקהילה בהתעשרות שצמחה לו ממנה.
|
||||||
|
5cec0ebd-fa6d-4cf0-9443-45cd2d49981d,1,abstained,,no change proposed,תכנית שאינה מביאה בפועל לשינוי בהיקף הזכויות או להשבחת שווי הנכסים שבתחומה — לרבות מקום שזכויותיה זהות הלכה למעשה לאלה שכבר התאפשרו מכוח תכנית קודמת שעמדה בתוקף במצב הקודם — אינה תכנית משביחה ואין בה כדי להקים חבות בהיטל השבחה.,תכנית שאינה מביאה בפועל לשינוי בהיקף הזכויות או להשבחת שווי הנכסים שבתחומה — לרבות מקום שזכויותיה זהות הלכה למעשה לאלה שכבר התאפשרו מכוח תכנית קודמת שעמדה בתוקף במצב הקודם — אינה תכנית משביחה ואין בה כדי להקים חבות בהיטל השבחה.
|
||||||
|
dbb7a22a-f571-4fd1-ac61-308ef5ac197e,1,drift_rejected,0.7623,drift 0.762 < floor 0.8,"בפרשנות תכנית בנייה חלים עקרונות פרשנות החוק, ולפיכך יש להתחקות אחר תכלית התכנית כדי לברר את משמעותה ולהכריע בין מרכיביה.","בפרשנות תכנית בנייה חלים עקרונות פרשנות החוק, ויש להתחקות אחר תכלית התכנית כדי לברר את משמעותה וליישב בין מרכיביה."
|
||||||
|
d2311380-92b3-4c67-858d-b71988ca8e8a,1,accepted,0.9609,הוסרה התוספת 'על פי פרמטרים מקובלים ואמות מידה ברורות' שאינה מעוגנת בציטוט-המקור או בנימוק; שאר הניסוח נשען על הציטוט (אין באישור משום אישור תכנוני) ועל הנימוק (בחינה עצמאית של מיקום וחלופות).,"הכרזה על תכנית כפרויקט תשתית לאומית, וכן הזיקה למקרקעין העומדת בבסיס ההכרזה, אינן מהוות אישור תכנוני ואינן כובלות את שיקול דעתם של מוסדות התכנון; על מוסד התכנון לבחון באופן עצמאי את התאמת המיקום המוצע מבחינה תכנונית ואת קיומן של חלופות עדיפות, על פי פרמטרים מקובלים ואמות מידה ברורות.","הכרזה על תכנית כפרויקט תשתית לאומית, וכן הזיקה למקרקעין העומדת בבסיס ההכרזה, אינן מהוות אישור תכנוני ואינן כובלות את שיקול דעתם של מוסדות התכנון; על מוסד התכנון לבחון באופן עצמאי את התאמת המיקום המוצע מבחינה תכנונית ואת קיומן של חלופות עדיפות."
|
||||||
|
fd9dba56-a9ad-424f-96db-ab6e733549a8,1,accepted,0.9037,"הניסוח הודק לעיקרון המעוגן בציטוט (חוקיות + הליך הוגן וראוי) ובנימוק (קניין + ודאות ויציבות), והוסרה התוספת בדבר 'כל מוכר וקונה יוכלו לדעת מראש' שהרחיבה מעבר למקור.","גביית היטל השבחה כפופה לעיקרון החוקיות ולחובת הרשות לקיים הליך גבייה הוגן וראוי; נוכח זכות הקניין של הנישום בכספו, יש לעצב את ההיטל באופן המבטיח ודאות ויציבות במדיניות המס, כך שכל מוכר וקונה יוכלו לדעת מראש את נטל המס החל עליהם.","עיקרון החוקיות חל גם על גביית היטל השבחה ומחייב את הרשות לקיים הליך גבייה הוגן וראוי; נוכח זכות הקניין של הנישום בכספו, יש לעצב את ההיטל באופן המבטיח ודאות ויציבות במדיניות המס."
|
||||||
|
f9fce831-ff42-4d78-bd75-cd7efe86c113,1,accepted,0.8955,"הוסר הפירוט ""מתנגדים ואחרים"" שאינו עולה מהציטוט-התומך, והניסוח הודק לליבת העיקרון — שמירת הזכות לתבוע פיצוי ואי-חסימתה על הסף, ללא הכרעה בשאלת עצם הזכאות.","שינוי ייעוד מקרקעין הנעשה בדרך התכנונית של שינוי תכנית בניין עיר משמר את זכותם של מתנגדים ואחרים לבקש פיצויים בגין הפגיעה במקרקעין; זכות זו אינה נחסמת על הסף, וזאת מבלי לקבוע אם בנסיבות העניין אכן קמה זכות לפיצוי.","שינוי ייעודם של מקרקעין הנעשה בדרך התכנונית של שינוי תכנית בניין עיר משמר את הזכות לתבוע פיצויים בגין הפגיעה במקרקעין ואינו חוסם זכות זו על הסף, וזאת מבלי להכריע אם בנסיבות העניין אכן קמה זכות לפיצוי."
|
||||||
|
634f781c-18b6-46d0-98b4-13da81259efe,1,accepted,0.9033,"חודד הקשר הסיבתי (""שכן"") ונוסף כי הפגם בפרסום פוגע תחילה בזכות ההתנגדות — מעוגן בנימוק שלפיו אי-מילוי דרכי הפרסום פוגע בזכות בעלי העניין להתנגד; לא נוסף דין חדש.","חובת הפרסום של תכנית וזכות ההתנגדות לה הן שני צדדים של אותו עיקרון, וקיומה התקין של חובת הפרסום הוא תנאי להבטחת הליך הגשת התנגדויות אפקטיבי; קיום פגום של דרכי הפרסום שנקבעו עלול לפגום בתוקפו של הליך התכנון.","חובת הפרסום של תכנית וזכות ההתנגדות לה הן שני צדדים של אותו עיקרון, שכן קיומה התקין של חובת הפרסום הוא תנאי להבטחת הליך התנגדויות אפקטיבי; קיום פגום של דרכי הפרסום שנקבעו עלול לפגוע בזכות ההתנגדות ולפגום בתוקפו של הליך התכנון."
|
||||||
|
825663c8-d9fa-4070-9953-96c899872b8f,1,accepted,0.904,"שוּנה למבנה ההשוואתי 'ככל ש... כך' הנאמן לציטוט-המקור, וזוקק לניסוח קצר ורציף יותר ללא שינוי בתוכן המעוגן.","במסגרת דוקטרינת ה""רצף התכנוני"", קיומה של תכנית מאוחרת המשחררת את ההקפאה, וכן קוצר פרק הזמן שחלף ממועד אישור התכנית הראשונה (שנועדה להיות זמנית ולחול לתקופה מוגבלת) ועד אישור התכנית המאוחרת — מגדילים את הנטייה להכיר בזיקה הייחודית בין שתי התכניות ולראותן כרצף תכנוני אחד.","במסגרת דוקטרינת 'הרצף התכנוני', ככל שפרק הזמן שחלף בין אישור תכנית ראשונה — שנועדה להיות זמנית ולחול לתקופה מוגבלת — לבין אישור תכנית מאוחרת המשחררת את ההקפאה קצר יותר, כך גדלה הנטייה להכיר בזיקה הייחודית שביניהן ולראותן כרצף תכנוני אחד."
|
||||||
|
171141d4-32c3-4f8f-a48a-1040eba1c904,1,accepted,0.879,מיקדתי את העיקרון בליבת המקור — שיקול דעת פרטני לאור הנסיבות מול משקל ראוי לשלטון החוק; הסרתי את 'הימנעות מקביעות מוחלטות' שאינה עולה מפורשות מהציטוט-התומך.,"בהקשר של עבריינות בניה על מוסד התכנון להימנע מקביעות מוחלטות, ולהפעיל את שיקול דעתו לאור הנסיבות הפרטיקולריות של המקרה, ובלבד שהשיקול של שמירה על שלטון החוק יזכה למשקל ראוי בהחלטה.","בהקשר של עבריינות בנייה נדרש ממוסד התכנון להפעיל שיקול דעת פרטני לאור הנסיבות הקונקרטיות של המקרה, ובלבד שהשיקול של שמירה על שלטון החוק יזכה למשקל ראוי בהחלטה."
|
||||||
|
f34c51cf-f655-4df9-8611-14c4c2d54828,1,accepted,0.8535,פושט את פתיח 'סיווג זכויות שמקנה תכנית לצורך השאלה' לכדי ניסוח ישיר של עיתוי החיוב; שומר על העיגון המהותי (היקף שיקול הדעת ותחום ההתפרשות) ועל קריטריון טיב התכנית כלשון המקור.,"סיווג זכויות שמקנה תכנית לצורך השאלה אם יש להטיל היטל השבחה בשלב אישור התכנית או רק בשלב הוצאת היתר הבנייה אינו נחתך לפי טיב התכנית (תמ""א או אחרת), אלא נבחן באופן מהותי, ובתלות, בין היתר, בהיקף שיקול הדעת המוקנה במסגרתה ובתחום התפרשותה.","השאלה אם חיוב בהיטל השבחה מכוח תכנית קם בשלב אישור התכנית או רק בשלב הוצאת היתר הבנייה אינה נחתכת לפי טיב התכנית (תמ""א או אחרת), אלא נבחנת באופן מהותי, בהתאם, בין היתר, להיקף שיקול הדעת המוקנה במסגרתה ולתחום התפרשותה."
|
||||||
|
d652b0f7-7101-41c2-977a-a5a65c3d79e1,1,accepted,0.9236,"אוחד למשפט אחד עם סדר לוגי (תנאי→נקודת-התחלה→תוצאה), הוסרה הכפילות בין שני המשפטים; כל הרכיבים מעוגנים בציטוט-התומך.","מקום שבקשה להיתר לא פורסמה לציבור, אין לזקוף לחובת בעל דין את האיחור בהגשת בקשה להארכת מועד בגין התקופה שקדמה למועד שבו נודע לו בפועל על הבקשה ועל הבינוי מכוחה; מירוץ האיחור מתחיל ממועד הידיעה בפועל.","מקום שבקשה להיתר לא פורסמה לציבור, מירוץ המועד להגשת בקשה להארכת מועד מתחיל ממועד שבו נודע לבעל הדין בפועל על הבקשה ועל הבינוי מכוחה, ואין לזקוף לחובתו את האיחור בגין התקופה שקדמה לכך."
|
||||||
|
69e10a96-ae26-4bf2-822b-768bf032fa14,1,drift_rejected,0.7789,drift 0.779 < floor 0.8,"אישור לשימוש חורג ניתן כחריג ובצמצום, ולא כדבר שבשגרה — עיקרון מושרש בפסיקה החל על בקשות לשימוש חורג.","אישור לשימוש חורג ניתן כחריג ובצמצום, ולא כדבר שבשגרה."
|
||||||
|
0eeebf3c-857b-48cc-ab8e-ec44caa510f4,1,accepted,0.9216,"הוספתי 'ראוי' ואת רכיב ההגנה 'על הציבור' המופיעים מפורשות בציטוט-המקור, לזיקוק נאמן יותר; שאר הניסוח נשמר.","התחשבות בעבירות בנייה שבוצעו בנכס במסגרת ההכרעה בבקשה להיתר אינה בגדר ענישה נוספת מעבר להליך הפלילי, אלא שיקול תכנוני לגיטימי ומתחייב שנועד לשלול את התמריצים לביצוע עבירות על דיני התכנון והבנייה ולהגן על שלטון החוק.","התחשבות בעבירות בנייה שבוצעו בנכס במסגרת ההכרעה בבקשה להיתר אינה בגדר ענישה נוספת מעבר להליך הפלילי, אלא שיקול תכנוני ראוי, לגיטימי ומתחייב שנועד לשלול את התמריצים לביצוע עבירות על דיני התכנון והבנייה ולהבטיח את ההגנה על שלטון החוק ועל הציבור."
|
||||||
|
c3f67090-5981-4d3e-90f8-a4f44c933d58,1,accepted,0.97,זוקק וקוצר הניסוח ל־'עצמאית ומוסיפה' תוך שמירה על העיגון במקור; הוסר כפל-הלשון 'נוספת ועצמאית' ומבנה ה־'שכן'.,"דרישת חתימת כל בעלי הזכויות במגרש על הבקשה להקלה לפי תקנה 2(9)(א)(3) לתקנות סטייה ניכרת היא דרישה נוספת ועצמאית, מעבר לדרישת הסכמת כל בעלי הזכויות הקבועה בתקנות הרישוי לכל בקשה להיתר — שכן זו האחרונה חלה ממילא אף על בקשה שאינה כרוכה בסטייה מתכנית.","דרישת חתימת כל בעלי הזכויות במגרש על בקשה להקלה לפי תקנה 2(9)(א)(3) לתקנות סטייה ניכרת היא דרישה עצמאית ומוסיפה על דרישת הסכמת כל בעלי הזכויות הקבועה בתקנות הרישוי לכל בקשה להיתר, החלה ממילא אף על בקשה שאינה כרוכה בסטייה מתכנית."
|
||||||
|
20b7aae6-ae8c-4e41-88c7-db28c81d5796,1,accepted,0.9433,"הניסוח הקיים כבר מעוגן במלואו בציטוט-התומך, כללי ובלתי-תלוי-תיק; לא נדרש שינוי מהותי מלבד תיקון-ניסוח זניח.","טענות המכוונות נגד עצם ההכרזה על מתחם כמתחם מועדף לדיור הן מוקדמות מטבען, ומקומן להתברר רק בשלבים התכנוניים הקונקרטיים שיבואו בהמשך ולא בשלב ההכרזה עצמה.","טענות המכוונות נגד עצם ההכרזה על מתחם כמתחם מועדף לדיור הן מוקדמות מטבען, ומקומן להתברר בשלבים התכנוניים הקונקרטיים שיבואו בהמשך ולא בשלב ההכרזה עצמה."
|
||||||
|
8cf51166-4d7b-4d50-bc69-4d3ca6d92d13,1,abstained,,no change proposed,אין להתערב בשומתו של שמאי מייעץ אלא מקום שנפלו בה שגיאות ברורות; בהיעדר שגיאות כאלה השומה עומדת בעינה.,אין להתערב בשומתו של שמאי מייעץ אלא מקום שנפלו בה שגיאות ברורות; בהיעדר שגיאות כאלה השומה עומדת בעינה.
|
||||||
|
917c4859-dbdd-4a0b-b76b-a9707f27834e,1,abstained,,no change proposed,לצורך בחינת השבחה כתוצאה מהקלה יש להשוות את שווי השוק האובייקטיבי של המקרקעין לאחר מתן ההקלה לעומת שווי השוק שלהם ערב מתן ההקלה; ההשבחה היא ההפרש בין שני ערכי שוק אלו.,לצורך בחינת השבחה כתוצאה מהקלה יש להשוות את שווי השוק האובייקטיבי של המקרקעין לאחר מתן ההקלה לעומת שווי השוק שלהם ערב מתן ההקלה; ההשבחה היא ההפרש בין שני ערכי שוק אלו.
|
||||||
|
0a86b3c0-4781-40e6-8354-1ffc21acfb09,1,accepted,0.9019,"ליטוש ניסוחי קל בלבד (תחביר ותמצות) תוך שמירה מלאה על תוכן העיקרון המעוגן בציטוט-התומך; הוסרה הכפילות ""שינוי תכנוני צפוי"" מול ""שינוי בתכונות"".","מקום בו צפוי שינוי בתכונות ובשימושי המקרקעין שסיכויי התרחשותו קרובים וממשיים, ותכנית שהתקבלה היא שסתמה את הגולל על אותו שינוי צפוי — מתקיים קשר סיבתי בינה לבין הפגיעה, וניתן להגדירה כ""תכנית פוגעת"" המקימה עילה לפיצוי לפי סעיף 197 לחוק התכנון והבניה.","מקום בו צפוי שינוי בתכונות המקרקעין ובשימושיהם שסיכויי התרחשותו קרובים וממשיים, ותכנית שהתקבלה היא הסותמת את הגולל על אותו שינוי צפוי, מתקיים קשר סיבתי בינה לבין הפגיעה, וניתן להגדירה כ""תכנית פוגעת"" המקימה עילה לפיצוי לפי סעיף 197 לחוק התכנון והבניה."
|
||||||
|
ae4e15d4-cc20-4c99-95be-06b89f3a3ebd,1,accepted,0.8701,"נוספה ההיגיון הפרשני המעוגן במקור ('פרשנות מצמצמת') והודגשה ההבחנה בין תמורה הונית ממכר לבין תמורה פירותית שוטפת, ללא הוספת דין שאינו במקורות.","הפטור מהיטל השבחה לפי החלופה השנייה בסעיף 19(ב)(4) לתוספת השלישית לחוק התכנון והבניה מוגבל למימוש זכויות בדרך של מכר בלבד, ואינו חל על תמורה פירותית כגון דמי שכירות.","הפטור מהיטל השבחה לפי החלופה השנייה שבסעיף 19(ב)(4) לתוספת השלישית לחוק התכנון והבניה מתפרש בצמצום וחל על מימוש זכויות בדרך של מכר בלבד, ואינו משתרע על תמורה פירותית שוטפת כגון דמי שכירות."
|
||||||
|
04a3ced3-e5a2-40a1-8f50-b498c80693de,1,accepted,0.9157,"חודד שההסדר אינו 'ממצה את הפלוגתא' (מקור הנימוק) ושהבקשה החדשה הוגשה בתום התקופה, תוך שמירה על כלליות; הכל מעוגן בציטוט-התומך.",הסדר פשרה שנערך ביחס לבקשה קודמת והוגבל בזמן אינו מקים השתק פלוגתא ביחס להליכים עתידיים הנוגעים לבקשה חדשה; היעדר ההשתק עשוי להילמד אף מהתנהגות בעל הדין שפעל במתווה חדש חרף ההסדר.,"הסדר פשרה שנערך ביחס לבקשה קודמת והוגבל בזמן אינו ממצה את הפלוגתא ואינו מקים השתק פלוגתא ביחס להליכים עתידיים הנוגעים לבקשה חדשה; היעדר ההשתק עשוי להילמד אף מהתנהגות בעל הדין עצמו, שבתום התקופה הגיש בקשה חדשה חרף ההסדר."
|
||||||
|
73ab5fe3-a5fe-4140-be81-943353cc959b,1,accepted,0.8944,הוקדם כלל-החובה (העמדת התשתית הסביבתית עובר להחלטה) לראש המשפט וההבחנה בין העיתויים נוסחה בתמצות; לא נוסף דין שאינו במקור.,"כאשר לתוכנית השלכות סביבתיות מהותיות, קיים שוני מהותי בין הגשת נספח/מסמך סביבתי הבוחן אף חלופות טרם אישור התוכנית וכאשר דנים בתוכנית עצמה, לבין קבלת הנספח הסביבתי רק לאחר אישור התוכנית; על מוסד התכנון להעמיד בפניו את התשתית הסביבתית, לרבות בחינת חלופות, עובר להחלטה על אישור התוכנית ולא בדיעבד.","כאשר לתוכנית השלכות סביבתיות מהותיות, על מוסד התכנון להעמיד בפניו את התשתית הסביבתית, לרבות בחינת חלופות, עובר להחלטה על אישור התוכנית ולא בדיעבד; קיים שוני מהותי בין מסמך סביבתי הבוחן חלופות המוגש טרם האישור ובעת הדיון בתוכנית עצמה, לבין נספח סביבתי המתקבל רק לאחר אישור התוכנית."
|
||||||
|
37ca3f6c-17b3-4981-b916-2594e32535db,1,abstained,,no change proposed,"סוגיית חלף היטל השבחה אינה מתבררת במסגרת הערר על שומת היטל ההשבחה, אלא יש לבררה מול רשות מקרקעי ישראל בהליכים המתאימים לכך.","סוגיית חלף היטל השבחה אינה מתבררת במסגרת הערר על שומת היטל ההשבחה, אלא יש לבררה מול רשות מקרקעי ישראל בהליכים המתאימים לכך."
|
||||||
|
148792a4-29a6-41c4-8f44-2aa1565b4972,1,accepted,0.8592,ניסוח הודק וקוצר תוך שמירה על שני יסודות המקור — תכלית-גבייה בלבד וחובת ההנפקה בהיעדר חוב; הוסר ה'כגון' הנגזר מעובדות-התיק.,"סמכות הרשות המקומית לעכב מתן אישורים הדרושים לרישום עסקה בלשכת רישום המקרקעין כל עוד בעל הנכס חב לה חוב כספי, היא כלי גבייה גרידא; בהעדר חוב אין להשתמש בסמכות זו למטרות זרות (כגון אכיפת דיני תכנון ובנייה), ועל הרשות להנפיק אישור על העדר חובות.","סמכות הרשות המקומית להתנות מתן אישור הדרוש לרישום עסקה בלשכת רישום המקרקעין בהיעדר חוב כספי של בעל הנכס היא כלי גבייה בלבד; אין להפעילה למטרות זרות, ובהיעדר חוב חבה הרשות להנפיק את האישור."
|
||||||
|
9f77e720-74bf-4a5a-8bdf-09ed2bf698c4,1,accepted,0.9044,"תומצת וזוקק; הוסר רף 'ראיות חותכות' שאינו עולה מהציטוט-התומך אלא מן הנימוק בלבד, ונשמרו רכיבי החזקה והעברת נטל הסתירה המעוגנים במקור.","משפורסמה תכנית מיתאר ברשומות חלה עליה החזקה שבסעיף 34א לפקודת הראיות, שלפיה דבר שפורסם ברשומות נעשה כראוי; נטל ההוכחה כי נפל שיבוש בהליכי הפרסום או בתוכן מוטל על הטוען נגד תוכן התכנית, ועליו להביא ראיות חותכות לסתירת החזקה.","תכנית מיתאר שפורסמה ברשומות חוסה תחת החזקה שבסעיף 34א לפקודת הראיות, שלפיה דבר שפורסם ברשומות חזקה שנעשה כראוי; נטל הסתירה — בין באשר לתקינות הליך הפרסום ובין באשר לתוכן הפרסום — מוטל על הטוען נגד התכנית."
|
||||||
|
32346580-8a01-4db4-b9d7-ca209c18912b,1,abstained,,no change proposed,הוראות הפטור מהיטל השבחה יש לפרש בצמצום ובהתאם לתכליותיהן.,הוראות הפטור מהיטל השבחה יש לפרש בצמצום ובהתאם לתכליותיהן.
|
||||||
|
727fd46f-bdd2-46c7-8ae2-bececed160bb,1,accepted,0.8954,"הניסוח הודק והופשט (""תכלית חובת הפיצוי"" במקום כפל-לשון), תוך שמירה מלאה על שני יסודות המקור — ההגנה על הקניין וחובת הפיצוי — ועל הנימוק נגד צמצום מלאכותי.","פרשנות חוק התכנון והבנייה בעניין פיצוי בגין פגיעה במקרקעין צריכה להיעשות באופן המתיישב עם ההגנה על זכות הקניין ועם החובה לפצות את בעל הזכות על פגיעה במקרקעיו, ובאופן שאינו מתמרץ את הרשות לפעול באופן מלאכותי לצמצום חובת הפיצוי.","פרשנות הוראות חוק התכנון והבנייה בדבר פיצוי בגין פגיעה במקרקעין תיעשה באופן המתיישב עם ההגנה על זכות הקניין ועם תכלית חובת הפיצוי לבעל הזכות הנפגעת, ואין לאמץ פרשנות המתמרצת את הרשות לצמצם באופן מלאכותי את חובת הפיצוי."
|
||||||
|
a4d28e42-139a-4350-8670-0d38e3d0ea90,1,accepted,0.8581,חודדה ההבחנה בין קיום עילת הפיצוי לבין אובדן הזכות בהתיישנות והוסף שם החוק לסעיף 197; הניסוח נותר מעוגן בציטוט-התומך בלבד.,יש להבחין בין השאלה אם התגבשה 'פגיעה' המקימה עילה לפי סעיף 197 לבין השאלה אם הזכות לפיצוי אבדה מחמת חלוף תקופת ההתיישנות; אובדן הזכות עקב התיישנות אינו מלמד על אי-התקיימות דרישת ה'פגיעה'.,יש להבחין בין השאלה אם התגבשה 'פגיעה' המקימה עילה לפיצוי לפי סעיף 197 לחוק התכנון והבניה לבין השאלה אם הזכות לפיצוי אבדה מחמת חלוף תקופת ההתיישנות; אובדן הזכות עקב התיישנות אינו מלמד על אי-התקיימותה של דרישת ה'פגיעה'.
|
||||||
|
7b38fbfd-315a-4d6c-a361-26d1e5b442ce,1,accepted,0.9371,"החלפת 'לבדה' ב'כשלעצמה' לרגיסטר נקי, ושיקוף הנימוק כי מדובר בשיקול אחד מני רבים הטעון איזון מול עמידה בסדרי הדין — הכול מעוגן בציטוט ובנימוק.","פגיעה אפשרית בכספי ציבור הנובעת מדחיית הבקשה להארכת מועד אינה יכולה לבדה לשמש טעם מיוחד המצדיק הארכת מועד, ויש לאזנה אל מול השיקול של עמידה בסדרי הדין.","פגיעה אפשרית בכספי ציבור הנובעת מדחיית בקשה להארכת מועד אינה יכולה כשלעצמה לשמש טעם מיוחד המצדיק הארכת מועד, אלא היא שיקול אחד מבין שיקולים שיש לאזנם אל מול ערך עמידה בסדרי הדין."
|
||||||
|
ebc6babb-5d24-47d5-8bff-15e09b7734e3,1,accepted,0.9386,"חודד הניסוח כך שההעדפה נובעת מהיות החלופה הפוגענית פחות בקניין (כעולה מהציטוט), ונוקה רישום החלופה ל""מבין שתי חלופות""; לא נוסף דין שאינו במקור.","לאור ההגנה החוקתית על הקניין הפרטי המעוגנת בסעיף 3 לחוק-יסוד: כבוד האדם וחירותו, מקום שבו קיימות שתי חלופות תכנוניות מאושרות כדין, יש להעדיף את החלופה המקלה עם בעל המקרקעין.","לאור ההגנה החוקתית על הקניין הפרטי המעוגנת בסעיף 3 לחוק-יסוד: כבוד האדם וחירותו, מבין שתי חלופות תכנוניות המאושרות כדין יש להעדיף את החלופה המקלה עם בעל המקרקעין, בהיותה הפוגענית פחות בקניינו."
|
||||||
|
7c537b2c-5f2d-4097-b917-90593cf7731e,1,accepted,0.8652,"הוסרה הסיפה בדבר אי-החובה להעלות על הכתב או לערוך כמסמך נפרד, שאינה עולה מהציטוט-התומך ומהנימוק; הושאר גרעין העיקרון המעוגן בזכות ההתייעצות לפי סעיף 8 ובהיעדר זכות טיעון נוספת.","מוסד תכנון רשאי לערוך התייעצויות פנימיות עם יועצים מקצועיים ואינו חייב להעמיד אותן לעיונו של מגיש תכנית או של מתנגד לה; עמדת היועץ המקצועי היא חלק מהדיון הפנימי של מוסד התכנון, אין חובה שתועלה על הכתב או תיערך כמסמך נפרד, ואין בה כדי להקים זכות טיעון נוספת.","מוסד תכנון רשאי לערוך התייעצויות פנימיות עם יועצים מקצועיים ואינו חייב להעמידן לעיונו של מגיש תכנית או של מתנגד לה; התייעצות פנימית זו אינה חלק מן ההליך החיצוני המקנה זכות טיעון, ואין בה כדי להקים זכות טיעון נוספת."
|
||||||
|
2ee8e563-83b3-459f-a8c8-5fae31246d99,1,accepted,0.8937,"זוקק למשפט אחד נקי; הוסר ""פטור"" שאינו עולה מן הציטוט (העוסק בזכויות בלבד) והוסרה הכפילות, תוך שמירה על המבחן הכמותי המעוגן במקור.","לעניין הזכאות לפטור/לזכויות במסלול חיזוק לפי תמ""א 38, המבחן הוא היקף הזכויות המבוקש ביחס למותר (כגון אי-חריגה מהיקף קומות מותר), ואילו אופן הבינוי או סדר הבינוי אינו משנה את הזכאות כל עוד מופע הבינוי אינו חורג מההיקף המותר.","הזכאות לזכויות בנייה במסלול החיזוק לפי תמ""א 38 נבחנת לפי היקף הזכויות המבוקש ביחס למותר, ולא לפי אופן הבינוי או סדר ביצועו, כל עוד מופע הבינוי אינו חורג מן ההיקף המותר."
|
||||||
|
fe31c01d-d4bf-4e4a-8b99-8c06a5a5fee5,1,accepted,0.9032,"זוקק וקוצר לניסוח כללי אחד החל על כל מגרש, תוך שמירת שני יסודות-העיגון: ההסתייגות המפורשת בתרש""צ והסדרת הייעודים בתב""ע הקודמת; לא נוסף דין או סייג.","כאשר תכנית בניין עיר קודמת הסדירה את ייעודי הקרקע במגרש, ותרש""צ מאוחרת קובעת מפורשות כי אין בה כדי לפגוע או לשנות הוראות תכניות שאושרו לפי חוק התכנון והבניה — לא ניתן לאשר מכוח התרש""צ המאוחרת בינוי נוסף הנוגד את הקבוע בתכנית בניין העיר הקודמת.","תרש""צ מאוחרת שנקבע בה במפורש כי אין בה כדי לפגוע או לשנות הוראות תכניות שאושרו לפי חוק התכנון והבניה, אינה יכולה לשמש בסיס לאישור בינוי נוסף הנוגד את הוראותיה של תכנית בניין עיר קודמת שהסדירה את ייעודי הקרקע במגרש."
|
||||||
|
16beb091-61de-4e7b-a360-7bb81b4fe4d0,1,accepted,0.8668,"הוסר הרישא ""אינה מצטמצמת לפגמים קיצוניים בלבד"" שאינו עולה מהציטוט-התומך; נותר העיקרון המעוגן ישירות במקור — חסר בהנמקה השולל ביקורת אפקטיבית מקים סמכות וחובת התערבות.","ביקורת שיפוטית על שומת היטל השבחה אינה מצטמצמת לפגמים קיצוניים בלבד; מקום שבו הנמקת השומה לוקה בחסר באופן שאינו מאפשר ביקורת שיפוטית אפקטיבית, מוסמך בית המשפט — ואף נדרש — להתערב במידה הנדרשת.","מקום שבו הנמקת שומת היטל השבחה לוקה בחסר באופן שאינו מאפשר ביקורת שיפוטית אפקטיבית, מוסמך בית המשפט — ואף נדרש — להתערב במידה הנדרשת."
|
||||||
|
5af13dd6-67dd-4398-9026-99c21834879b,1,accepted,0.8787,"הוסר הסייג שאינו מעוגן במקור ('צרכים והיקפים נקודתיים הסוטים אך במעט'), והוחלף בנימוק התכנוני העולה מהנימוק שבמקור — צמצום חריגות כדי שלא יעקפו את הצורך בתיקון תכניות.","היתר לשימוש חורג אינו ניתן כדבר שבשגרה אלא רק בנסיבות מיוחדות ויוצאות דופן; הכלל הוא שאין ליתן היתר לשימוש חורג, ורק במקרים חריגים — ולצרכים והיקפים נקודתיים הסוטים אך במעט מהקבוע בתכניות החלות — יוענק היתר שכזה.","היתר לשימוש חורג אינו ניתן כדבר שבשגרה אלא רק בנסיבות מיוחדות וחריגות, שכן ההליך התכנוני נוטה לצמצם חריגות מתכנית כדי שאלה לא ישמשו אמצעי לעקיפת הצורך בהכנתן ובתיקונן של תכניות."
|
||||||
|
215332e9-1fef-44c5-8998-77e6df1ce55a,1,accepted,0.9428,"שולב מהנימוק יסוד 'הציפייה להמשך ההליך' ו'איון תרומת התכניות המפורטות', שניהם מעוגנים בציטוט ובנימוק, תוך שמירה על ניסוח כללי ובלתי-תלוי-תיק.","אין לקבוע את שווי המקרקעין במצב הקודם על בסיס השווי שלאחר אישור התכנית הארצית והתכנית המחוזית בלבד, שכן אלו מתוות מגמות ועקרונות כלליים ואינן כוללות הוראות קונקרטיות המקנות ודאות לשינוי הייעוד; קביעה כזו מתעלמת מחלק ניכר מההליך התכנוני המשביח שאיפשר את שינוי הייעוד ואת אישור התכניות המשביחות.","אין לקבוע את שווי המקרקעין במצב הקודם על בסיס השווי שלאחר אישור התכנית הארצית והתכנית המחוזית בלבד, שכן תכניות אלו מתוות מגמות ועקרונות כלליים ויוצרות ציפייה להמשך ההליך התכנוני, ואינן כוללות הוראות קונקרטיות המקנות ודאות לשינוי הייעוד; קביעה כזו מתעלמת מחלק ניכר מההליך התכנוני המשביח שאיפשר את שינוי הייעוד ואת אישורן של התכניות המפורטות המשביחות, ומאיינת את תרומתן."
|
||||||
|
56e53183-e410-4f39-9561-6e63b5ba5e9c,1,accepted,0.9263,הוספת הטעם המעגן (מומחיות השמאי) המופיע בנימוק וזיקוק קל של הניסוח; עילות ההתערבות נותרו זהות למקור.,"ועדת הערר תיטה לאמץ את חוות דעתו של השמאי, והתערבותה בה מוגבלת ככלל למקרים חריגים — בהם נפלה טעות מהותית או דופי חמור, או שהשמאי נסמך על מסד עובדתי בלתי הולם, על הנחות לא הגיוניות, על תשתית משפטית חסרה או שגויה, או שלא סיפק הסבר מניח את הדעת לשאלות שנשאל.","ועדת הערר תיטה לאמץ את חוות דעתו של השמאי מתוך הכרה במומחיותו, והתערבותה בקביעותיו תוגבל ככלל למקרים חריגים שבהם נפלה טעות מהותית או דופי חמור, או שחוות הדעת נסמכה על מסד עובדתי בלתי הולם, על הנחות בלתי הגיוניות או על תשתית משפטית חסרה או שגויה, או שהשמאי לא סיפק הסבר מניח את הדעת לשאלות שנשאל."
|
||||||
|
ac8ac719-cc4b-4f21-8bb8-ac788b395dd1,1,accepted,0.9271,זוקק העיקרון סביב היעדר בסיס-ההשוואה כטעם ל'אי-התאמה ואי-ישימות' (כלשון הציטוט) ונוסף סיוג-המראה בדבר תחולת הדלתא על השבחה תוספתית בלבד — שניהם עולים מהנימוק; הוסר ניסוח 'הטלת היטל ביתר במרבית המקרים' שאינו מעוגן בציטוט.,"במיזמי התחדשות עירונית הכוללים הריסה ובניה מחדש, וכן במיזמים המקודמים מכוח תמ""א 38, שבהם המצב התכנוני החדש יוצר מוצר תכנוני חדש בעל שונות מהותית מהמצב התכנוני שקדם לו — אין לחשב את היטל ההשבחה בשיטת הדלתא, משום ששיטה זו אינה מתאימה ואינה ישימה בנסיבות אלה וגורמת לעיוות ההשבחה ובמרבית המקרים להטלת היטל ביתר על הנישום.","מקום שבו המצב התכנוני החדש יוצר מוצר תכנוני חדש בעל שונות מהותית מן המצב התכנוני שקדם לו — כבמיזמי התחדשות עירונית הכוללים הריסה ובנייה מחדש ובמיזמים מכוח תמ""א 38 — אין לחשב את היטל ההשבחה בשיטת הדלתא, שכן היעדר בסיס להשוואה בין המצב הקודם לחדש הופך שיטה זו לבלתי-מתאימה ובלתי-ישימה ומביא לעיוות שומת ההשבחה; שיטת הדלתא יפה רק להשבחה תוספתית השומרת על המצב התכנוני הקיים."
|
||||||
|
d7bb7e90-3f7b-4eb7-aafa-1e284a36c56c,1,drift_rejected,0.7961,drift 0.796 < floor 0.8,"בתיקי פינוי-בינוי, אמידת ההשבחה הכוללת — בשלב שטרם החלת תחשיב הפטור — תיערך אך ורק לפי השיטה המסורתית: ההפרש שבין שווי המקרקעין לאחר אישור התכנית לבין שוויים טרם התכנית, תוך נטרול הציפיות הנובעות מההליך התכנוני.","בפינוי-בינוי, ההשבחה הכוללת בשלב שטרם החלת תחשיב הפטור נאמדת אך ורק לפי השיטה המסורתית."
|
||||||
|
9e5397e6-e4af-4db0-8ed5-3e4cea124c0e,1,accepted,0.8759,"הודק הניסוח למשפט אחד רציף וחד, תוך שמירה על שני רכיבי העיקרון המעוגנים בציטוט (בסיס בלעדי במסמכי התכנון וההיתר; איסור שומה על שימוש נטען חיצוני) ללא הוספת דין או סייג.","שומת השבחה נערכת אך ורק על פי מסמכי התכנון הקיימים וההיתר שאושר, ולא על פי טענות ממקורות חיצוניים שאינם בהלימה למסמכים אלה. שמאי מקרקעין אינו רשאי להתעלם מהבינוי או מהשימוש שאושרו בהיתר ולערוך שומה על בסיס שימוש נטען אחר.","שומת השבחה נערכת אך ורק על יסוד מסמכי התכנון וההיתר שאושר, ולא על פי טענות חיצוניות שאינן בהלימה למסמכים אלה; אין השמאי רשאי להתעלם מהבינוי או מהשימוש שאושרו בהיתר ולשום על בסיס שימוש נטען אחר."
|
||||||
|
704ace88-3cff-4cad-ad46-d6f5ce4ef72e,1,accepted,0.857,"הוסרו השיקולים בדבר היחס בין הסעדים, התנהלות הצדדים ומורכבות ההליך — אינם עולים מהציטוט-התומך שמעגן רק זכאות להחזר ריאלי בכפוף למבחני סבירות ומידתיות.","צד שזכה בהליך זכאי להחזר הוצאות ריאלי בגין שכר טרחת עורך דין והוצאות משפט שהוציא, ובלבד שההוצאות סבירות ומידתיות לניהול ההליך; בקביעת שיעורן יש לשקול את היחס בין הסעדים שנתבקשו לאלו שאושרו בפועל, את התנהלות הצדדים ואת מורכבות ההליך.","צד שזכה בהליך זכאי להחזר הוצאות ריאלי בגין שכר טרחת עורך דין והוצאות משפט שהוציא, ובלבד שההוצאות סבירות ומידתיות לניהול ההליך."
|
||||||
|
61b8c56e-d312-40d4-bdf3-0ca96fe2ad8a,1,accepted,0.8345,"הוסר רכיב 'הערות האזהרה' שאינו עולה מהציטוט-התומך, והגבלת היקף ההפקעה ל'דרוש באמת' עוגנה ישירות בנימוק; שאר העיקרון (כינון בחתימה+פרסום, חובת מידתיות) נשמר.","הפקעה נוצרת על-ידי שילוב חתימת השר והפרסום יחדיו, ועליה להיות מידתית באופן שהפרסום והערות האזהרה ישקפו מידתיות זו ויגדירו את המרחב המופקע בהתאם לצורך הציבורי שבבסיסה.","הפקעה מתכוננת בשילוב חתימת השר והפרסום, ומשאלה היוצרים אותה — עליהם לשקף את מידתיותה ולהגביל את היקף המופקע למה שדרוש באמת לצורך הציבורי שבבסיסה."
|
||||||
|
0dd1ab4a-928b-4720-8d29-11d6e041cd1f,1,accepted,0.9232,"הניסוח הודק וצומצם תוך שמירה על אותם רכיבים המעוגנים בציטוט (אפשרות לשכנע בצורך בדיון בעל-פה והשלמת טיעון בכתב, ומניעות עקב אי-ניצול ההזדמנות); לא נוסף דין או סייג חדש.","זכות הטיעון אינה מחייבת בהכרח קיום דיון פרונטלי בעל-פה; רשות מנהלית רשאית במסגרת סמכותה ושיקול דעתה להורות כי השלמת הטיעון תיעשה בכתב, ובלבד שהעמידה לצדדים הזדמנות לשכנע בצורך בדיון בעל-פה ולהשלים טיעון בכתב. צד שנמנע מלנצל הזדמנויות אלו ולא התנגד לבירור על יסוד החומר הכתוב מנוע מלטעון לפגם בזכות הטיעון.","זכות הטיעון אינה מחייבת בהכרח דיון בעל-פה, ורשות מנהלית רשאית במסגרת שיקול דעתה להורות כי הטיעון יושלם בכתב, ובלבד שניתנה לצדדים הזדמנות לשכנע בצורך בדיון בעל-פה ולהשלים טיעונם בכתב; צד שנמנע מלנצל הזדמנויות אלו ולא התנגד לבירור על יסוד החומר הכתוב מנוע מלטעון לפגיעה בזכות הטיעון."
|
||||||
|
0b47b8ef-41eb-488e-89b2-a93532bd7f1e,1,accepted,0.8731,"נוספו עקרונות השוויון, הצדק החלוקתי ואמון הציבור — שלושת היסודות שעליהם מעוגנת חובת הראיה הכוללת בציטוט-המקור — והם הושמטו בניסוח הקודם.","ועדת ערר הדנה בעררים על שומות שמאים מכריעים שונים באותו מרחב תכנון נדרשת לראיה כוללת של מכלול השומות והטענות — השמאיות והמשפטיות — ואינה רשאית להסתפק בבחינה פרטנית של כל שומה בנפרד, אגב התעלמות מהתמונה הרחבה ומהיחס שבין השומה הקונקרטית שבפניה לבין הערכות השווי בכל מרחבי התכנית.","ועדת ערר הדנה בעררים על שומות שמאים מכריעים שונים באותו מרחב תכנון נדרשת להתבונן במבט רחב על מכלול השומות שבאזור ולבסס את הכרעתה על ראיה כוללת זו, מתוך שקילת עקרונות השוויון, הצדק החלוקתי ואמון הציבור בהליכים; אין היא רשאית להסתפק בבחינה פרטנית של כל שומה בנפרד תוך התעלמות מהתמונה הרחבה ומהיחס שבין השומה הקונקרטית שבפניה לבין הערכות השווי בכלל מרחבי התכנית."
|
||||||
|
ba0c6103-baa3-4559-a6de-8ac24cbbeef4,1,accepted,0.9355,"תוקן לניסוח הדוק יותר המעמיד את מבחן השימוש העתידי במרכז; כל הרכיבים מעוגנים בציטוט ובנימוק, ללא הוספת דין.","במסגרת בחינת הזכאות לפטור מהיטל השבחה לפי סעיף 19(ג) לתוספת השלישית, מוקד הבדיקה לקיום דרישת הזהות בין המחזיק במקרקעין לבין החייב בהיטל אינו השימוש שנעשה בנכס בעבר, אלא השימוש העתידי המיועד בדירה שתיבנה — קרי האם היא נועדה לשמש למגורי החייב בהיטל או קרובו.","בבחינת הזכאות לפטור מהיטל השבחה לפי סעיף 19(ג) לתוספת השלישית, דרישת הזהות בין המחזיק במקרקעין לבין החייב בהיטל נבחנת לפי השימוש העתידי המיועד בדירה שתיבנה — אם נועדה לשמש למגורי החייב או קרובו — ולא לפי השימוש שנעשה בנכס בעבר."
|
||||||
|
0fa1e979-b737-436f-878c-cc8f263ccbf5,1,abstained,,no change proposed,"היקף זכות הטיעון והשימוע ומתכונתם אינם קבועים אלא נגזרים מהנסיבות הקונקרטיות של העניין; ככל שההחלטה המינהלית צפויה לפגוע בזכות חשובה יותר ובאופן חמור יותר, כך מתעצמת חובת הרשות להעניק זכות טיעון רחבה ומשמעותית יותר.","היקף זכות הטיעון והשימוע ומתכונתם אינם קבועים אלא נגזרים מהנסיבות הקונקרטיות של העניין; ככל שההחלטה המינהלית צפויה לפגוע בזכות חשובה יותר ובאופן חמור יותר, כך מתעצמת חובת הרשות להעניק זכות טיעון רחבה ומשמעותית יותר."
|
||||||
|
20be9db3-5a84-40c5-aa0e-ecb5020b5ec3,1,accepted,0.9518,"איחוד שני המשפטים למשפט אחד רציף וצמצום מילולי; תוכן העיקרון, היקפו והנימוק זהים למקור ולא נוסף דין או סייג.","מימוש זכויות בדרך של מכר, בטרם הוצאת היתר בניה, אינו מקים חבות בהיטל השבחה. זאת מחמת היעדר ודאות והקושי לאמוד את שיעור ההשבחה בטרם ניתן היתר בניה בפועל.","מימוש זכויות בדרך של מכר, בטרם הוצאת היתר בניה, אינו מקים חבות בהיטל השבחה, מחמת היעדר ודאות והקושי לאמוד את שיעור ההשבחה בטרם ניתן היתר בניה בפועל."
|
||||||
|
7ccde39d-90cd-40d9-a3a3-6109620ed2ba,1,drift_rejected,0.7768,drift 0.777 < floor 0.8,"בית המשפט לא ייזקק לבירור סוגייה שאיבדה את ממשותה והפכה לתיאורטית או אקדמית בלבד, ובכלל זה ערעור המופנה כנגד מעשה עשוי, אלא במקרים חריגים בלבד.","בית המשפט לא ייזקק לבירור סוגייה שאיבדה את ממשותה ונותרה בעלת אופי תיאורטי או אקדמי בלבד, אלא במקרים חריגים."
|
||||||
|
ea79b5f3-efce-46c7-9ff9-1ae2f037c88d,1,accepted,0.901,"מבנה מחדש המעמיד את השיקול התכנוני (ההתגוננות האזרחית) כראש העיקרון והתוצאה כנגזרת ממנו, תוך הסרת כפל-לשון; כל הרכיבים מעוגנים בציטוט-המקור.","קיימת הצדקה תכנונית למתן הקלה המאפשרת בינוי הממצה את האפשרות להוספת ממ""ד, אף כאשר מדובר בחריגה חלקית מקו הבניין, וזאת נוכח החשיבות הציבורית של בניית ממ""ד לצורכי התגוננות אזרחית.","החשיבות הציבורית שבבניית ממ""ד לצורכי התגוננות אזרחית מהווה שיקול תכנוני המצדיק מתן הקלה המאפשרת בינוי הממצה את האפשרות להוספת ממ""ד, אף כאשר הדבר כרוך בחריגה חלקית מקו הבניין."
|
||||||
|
3283130b-c38f-4141-abd7-680dfd6a4cae,1,accepted,0.8651,"אוחד הניסוח למשפט קנוני אחד וזוקק לרגיסטר נקי ('פוגע... באופן אישי', 'לתקוף את האישור בערר') תוך שמירה מלאה על העיגון בציטוט — פגיעה אישית במקרקעין/בנכס כתנאי-סף למעמד.",תנאי-סף למעמדו של עורר כנגד אישור בינוי הוא הצבעה על פגיעה אישית במקרקעין שבבעלותו או בנכסו; מי שלא הראה כי הבינוי המוצע משפיע עליו או על נכסו באופן אישי — אין לו מעמד להעלאת הערר.,"תנאי-סף למעמדו של עורר כנגד אישור בינוי הוא הצבעה על פגיעה אישית במקרקעין שבבעלותו או בנכסו; משלא הוראה כי הבינוי המוצע פוגע בו או בנכסו באופן אישי, אין לו מעמד לתקוף את האישור בערר."
|
||||||
|
775e5cf5-e9a0-4560-80a2-4530e4310dad,1,accepted,0.914,"חודדה תכלית הסעיף — האיסור מוגבל לקירות בגבול חיצוני בלבד — בהתבסס על לשון הציטוט, ללא הוספת דין; הרגיסטר נוקה.","לועדה המקומית נתון מתחם שיקול דעת ביישום סעיף 2.23 לתוספת השלישית לתקנות בבתים דו-משפחתיים, בהתאם לנסיבות הקונקרטיות ולתנאי השטח; האיסור לקרוע חלונות ""בקו גבול צדדים או אחורי של נכס"" אינו חל על קיר הפונה לחלק הפנימי של החלקה עצמה.","לועדה המקומית נתון מתחם שיקול דעת ביישום סעיף 2.23 לתוספת השלישית לתקנות בבתים דו-משפחתיים, בהתאם לנסיבות הקונקרטיות ולתנאי השטח; האיסור לקרוע חלונות בקו גבול צדדי או אחורי של נכס מצומצם לקירות הפונים לגבול חיצוני, ואינו חל על קיר הפונה לחלקה הפנימית עצמה."
|
||||||
|
07f6c67a-2c79-41c8-a63e-a403b3378160,1,accepted,0.8483,"הוחזר הדיוק שבמקור — ""התקפות טילים"" במקום ""התקפות"", ושופר מבנה המשפט; ללא הוספת דין.","התקנת מרחב מוגן דירתי (ממ""ד) מהווה צורך ציבורי ברור הנובע מהמצב הביטחוני, וחשיבותו נלמדת משורת תיקוני חקיקה שמטרתם עידוד ותמרוץ בנייתו כאמצעי יעיל להגנה מפני התקפות בעורף.","התקנת מרחב מוגן דירתי (ממ""ד) מהווה צורך ציבורי ברור הנובע מהמצב הביטחוני, וחשיבותו כאמצעי יעיל להגנה מפני התקפות טילים בעורף נלמדת משורה ארוכה של תיקוני חקיקה שמטרתם עידוד ותמרוץ בנייתו."
|
||||||
|
58a97a51-3374-4b1a-89e8-f87409543cf2,1,accepted,0.9107,"הניסוח הקיים כבר מעוגן במלואו בציטוט-התומך וכללי דיו; נעשה ליטוש מינורי בלבד (השלמת שם החוק וצמצום קל), ללא הוספת דין, סייג או עובדת-תיק.","לצורך אומדן הפגיעה והפיצוי לפי סעיף 197 לחוק, מקום שתכנית פוגעת משנה ייעוד קרקע מבנייה לחקלאות, יש לאמוד את שווי הקרקע כמצבה עובר לתכנית הפוגעת אל מול שווייה כמצבה בעקבותיה, ולפצות את בעל הזכות בשיעור גריעת השווי שנגרמה כתוצאה מן השינוי.","לצורך אומדן הפגיעה והפיצוי לפי סעיף 197 לחוק התכנון והבנייה, מקום שתכנית פוגעת משנה את ייעוד הקרקע מבנייה לחקלאות, יש לאמוד את שווי הקרקע כמצבה עובר לתכנית הפוגעת אל מול שווייה כמצבה בעקבותיה, ולפצות את בעל הזכות בשיעור גריעת השווי שנגרמה מן השינוי."
|
||||||
|
39d00376-a7d8-4b9b-af57-fe6a7b8b6ec7,1,accepted,0.8622,"הוצג ההיקף כפרמטר עצמאי (ולא רק 'שני'), הובהר היחס בין גודל השטח הבנוי לעוצמת הבחינה כעולה מהנימוק, והניסוח רוכך לכלל רב-תחולה; לא נוספו דין, חריג או מקורות חדשים.","פרמטר שני בבחינת בקשה לשימוש חורג הוא היקף השימוש החורג — להבדיל מן העצימות (הפער התכנוני), ההיקף מתייחס לשטח הבנוי שבגינו מתבקש השימוש; אין דין בקשה לשימוש חורג במבנה זעיר כדין בקשה לשימוש חורג במבנה רחב-היקף.","היקף השימוש החורג הוא פרמטר עצמאי בבחינת בקשה לשימוש חורג, הנבדל מן העצימות (הפער התכנוני) ומתמקד בשטח הבנוי שבגינו מתבקש השימוש; ככל שגדל היקף השטח הבנוי כן מתחזקת הבחינה הנדרשת, ואין דין בקשה במבנה זעיר כדין בקשה במבנה רחב-היקף."
|
||||||
|
a1be8e43-e04f-4f24-96a1-a4b4feb8515e,1,accepted,0.9009,"שולב מבחן המהות-לא-השם העולה מהציטוט (""כל שם דומה"") כליבת העיקרון, ונשמר העיגון בסעיף 145 ללא הוספת דין או סייג.","היתר חפירה ודיפון מהווה ""היתר בניה"" כמשמעותו ומכוחו של סעיף 145 לחוק התכנון והבניה, ואין בשם השונה שניתן לו כדי לגרוע ממעמדו הנורמטיבי כהיתר בניה; פרשנות זו תואמת את לשון החוק ותכליתו.","היתר חפירה ודיפון, ויהא שמו אשר יהא, מהווה ""היתר בניה"" כמשמעותו בסעיף 145 לחוק התכנון והבניה; סיווגו נקבע על-פי מבחן מהותי ולא על-פי כותרתו, ואין בשם השונה שניתן לו כדי לגרוע ממעמדו הנורמטיבי כהיתר בניה."
|
||||||
|
b557d6df-051c-42a7-897e-c128b4f590f7,1,accepted,0.953,ליטוש לשוני בלבד (תקיפת... במקום לתקוף; 'מקום שעולה'); תוכן העיקרון וגבולותיו זהים למקור-העיגון.,"דרך המלך לתקוף החלטה של ועדה מקומית או רשות רישוי מקומית ליתן היתר בנייה, כאשר עולה טענה של סטייה מתכנית, היא בהגשת ערר לועדת הערר; זאת להבדיל ממחלוקות בשאלות קנייניות או של שימוש וחזקה (הנדונות בערכאות האזרחיות) ומטענות לפגמים מינהליים שאינם תכנוניים, כגון ניגוד עניינים (הנדונות בבית המשפט לעניינים מינהליים).","דרך המלך לתקיפת החלטת ועדה מקומית או רשות רישוי מקומית ליתן היתר בנייה, מקום שעולה טענה לסטייה מתכנית, היא בהגשת ערר לועדת הערר; זאת להבדיל ממחלוקות קנייניות או בשאלות של שימוש וחזקה, הנדונות בערכאות האזרחיות, ומטענות לפגמים מינהליים שאינם תכנוניים, כגון ניגוד עניינים, הנדונות בבית המשפט לעניינים מינהליים."
|
||||||
|
b7d0496a-1110-4ca7-97fc-ccd28b681085,1,accepted,0.8553,"הוסר המספר הקונקרטי 'עד 36 פעוטות' שהוא פרט-תיק ספציפי, כדי לזקק עיקרון רב-תחולה; גרעין השיקול נשמר כלשון הציטוט-התומך.","כאשר הוועדה המקומית מאשרת הפעלת מעון יום הכולל עד 36 פעוטות לפי תיקון החוק, השיקול היחיד שעליה להפעיל לגביו את שיקול דעתה הוא האם מתקיימת פגיעה מרחבית משמעותית שאינה ניתנת לתיקון.","כאשר הוועדה המקומית מאשרת הפעלת מעון יום מכוח תיקון החוק, השיקול היחיד שעליה להפעיל לגביו את שיקול דעתה הוא האם מתקיימת פגיעה מרחבית משמעותית שאינה ניתנת לתיקון."
|
||||||
|
5743e389-c4b8-41e5-b156-2ecfa0252131,1,accepted,0.9481,"זוקק והודק הניסוח תוך עיגון מפורש בכך שעצם טענת הסטייה מקנה סמכות ומחייבת בירור מקדמי (כעולה מהנימוק והציטוט-התומך); לא נוספו דין, חריג או ציטוטי-תיקים.","למתנגד מוקנית זכות ערר לוועדת הערר על החלטת ועדה מקומית ליתן היתר בנייה, מקום שנטען כי ההיתר מהווה הקלה או שימוש חורג בסטייה מתכנית — וזאת אף אם הוועדה המקומית סברה כי ההיתר עולה בקנה אחד עם התכנון התקף. ועדת הערר אינה רשאית לדחות ערר כזה על הסף, אלא חייבת לבחון את טענת הסטייה מתכנית כטענה מקדמית, וככל שתמצא כי ההיתר סוטה מתכנית — תדון בהתנגדות לגופה.","למתנגד מוקנית זכות ערר לוועדת הערר על החלטת ועדה מקומית ליתן היתר בנייה, מקום שנטען כי ההיתר מהווה הקלה או שימוש חורג בסטייה מתכנית, אף אם הוועדה המקומית סברה כי ההיתר תואם את התכנון התקף. עצם טענת הסטייה מקנה לוועדת הערר את הסמכות ומחייבת אותה לברר את הטענה כשאלה מקדמית, בלא לדחות את הערר על הסף; ומשנמצא כי ההיתר סוטה מתכנית — תידון ההתנגדות לגופה."
|
||||||
|
69d0ede6-ab2f-4047-9558-aaccae329827,1,accepted,0.8975,"צומצם וחודד הניסוח (הסרת כפל ""אינה שוללת ואינה גורעת"" ופישוט התחביר) תוך שמירה מלאה על העיקרון המעוגן בציטוט בדבר המסלולים המקבילים.","הסמכות הספציפית שהוקנתה לשרים לקבוע היטל השבחה מופחת לגבי מתחמי פינוי-בינוי אינה שוללת ואינה גורעת מסמכותם הכללית מכוח ""סעיף הסל"" ליתן פטור מלא מהיטל השבחה למתחמים מסוג זה; מדובר במסלולים מקבילים העומדים זה לצד זה.","הקניית סמכות ספציפית לקבוע היטל השבחה מופחת למתחמי פינוי-בינוי אינה גורעת מן הסמכות הכללית שמכוח ""סעיף הסל"" ליתן פטור מלא מהיטל השבחה למתחמים אלה; שני המסלולים מקבילים ועומדים זה לצד זה."
|
||||||
|
40e3238d-9914-47bf-82f3-b187fbacafaa,1,accepted,0.8238,"מוקד הניסוח בעיקרון המעוגן ישירות בציטוט-התומך (נטרול הפוטנציאל מן המצב הקודם לפי הלכת לוסטרניק); הוסרה הסיפא בדבר המשקל לעסקאות 'תכנון בעתיד' שמקורה בנימוק היישומי ולא בציטוט, וכן תוקנה ההצגה הפסקנית.","פוטנציאל תכנוני הנובע מייעוד שנקבע בתוכנית מתאר נחשב חלק מן ההליך התכנוני של התוכנית המשביחה במובנו הרחב, ולפי הלכת לוסטרניק יש לנטרלו מהמצב הקודם בעת עריכת השומה; ממילא אין לייחס משקל בלעדי לעסקאות השוואה שנעשו בייעוד 'תכנון בעתיד'.","פוטנציאל תכנוני הנובע מייעוד שנקבע בתוכנית מתאר מהווה חלק מן ההליך התכנוני של התוכנית המשביחה במובנו הרחב, ולפי הלכת לוסטרניק יש להתעלם ממנו ולנטרלו מן המצב הקודם בעת עריכת שומת ההשבחה."
|
||||||
|
43173db6-51aa-46d9-a655-e3e9dad9889b,1,abstained,,no change proposed,"שטחי שירות הנלווים באופן אינהרנטי לשימוש עיקרי (כגון מחסנים נלווים לדירות מגורים) ישומו כנגזרת משווי השימוש העיקרי, ולא לפי שימוש חלופי אחר; באין השימוש העיקרי אין הצדקה לשטחי השירות.","שטחי שירות הנלווים באופן אינהרנטי לשימוש עיקרי (כגון מחסנים נלווים לדירות מגורים) ישומו כנגזרת משווי השימוש העיקרי, ולא לפי שימוש חלופי אחר; באין השימוש העיקרי אין הצדקה לשטחי השירות."
|
||||||
|
1c23018f-010b-4808-88e9-62e2e2ce6f37,1,accepted,0.8973,"הניסוח הקיים כבר מעוגן במלואו בציטוט-התומך, כללי ובלתי-תלוי-תיק; לא נמצא רכיב מעוגן להוספה או לזיקוק נוסף.","בחישוב היטל השבחה תובא במניין אך ורק ההשבחה הקשורה בקשר סיבתי ישיר לתכנית המשביחה; על השמאי לחלץ ולבודד את מרכיב השבחת התכנון מכלל הגורמים שהביאו לעליית שווי המקרקעין, ורק רכיב זה משמש בסיס לחיוב בהיטל.","בחישוב היטל השבחה תובא במניין אך ורק ההשבחה הקשורה בקשר סיבתי ישיר לתכנית המשביחה; על השמאי לחלץ ולבודד את מרכיב השבחת התכנון מיתר הגורמים שהביאו לעליית שווי המקרקעין, ורק רכיב זה משמש בסיס לחיוב בהיטל."
|
||||||
|
0e483c66-c1fc-4380-98de-2475e1428539,1,abstained,,no change proposed,"ירידת ערך מקרקעין הנובעת מאישור התכנית ומביצועה ככתבה וכלשונה מגולמת בפיצוי לפי סעיף 197 לחוק התכנון והבניה, ועל כן לא ניתן לתבוע פיצוי בגין אותו נזק בהליך נזיקי — אף כלפי נתבע אחר וללא תלות בעילה הנזיקית שמכוחה נתבע הפיצוי.","ירידת ערך מקרקעין הנובעת מאישור התכנית ומביצועה ככתבה וכלשונה מגולמת בפיצוי לפי סעיף 197 לחוק התכנון והבניה, ועל כן לא ניתן לתבוע פיצוי בגין אותו נזק בהליך נזיקי — אף כלפי נתבע אחר וללא תלות בעילה הנזיקית שמכוחה נתבע הפיצוי."
|
||||||
|
221e2af0-a6cd-47ba-b676-4b392e03c1bc,1,accepted,0.9166,"הידוק הניסוח סביב מאזן ההוראות הכולל וצמצום החזרתיות, תוך שמירה מלאה על העיגון בציטוט-המקור.",בהערכת השפעתה של תכנית על שווי המקרקעין יש לשקלל יחד את כל הוראות התכנית — המשביחות והפוגעות כאחד — ורק אם סך כל ההוראות מביא ליתרון על פני המצב התכנוני הקודם תיחשב התכנית למשביחה ותחויב בהיטל השבחה.,"בהערכת השבחתה של תכנית יש לשקלל יחד את כל הוראותיה המשפיעות על שווי המקרקעין, המשביחות והפוגעות כאחד, ותכנית תיחשב משביחה החייבת בהיטל השבחה רק אם מאזן הוראותיה הכולל מביא ליתרון על פני המצב התכנוני הקודם."
|
||||||
|
6b1d0d8e-cd89-4bce-a7d5-d75ea0c4eaed,1,accepted,0.9666,"ניסוח קיים נשמר כמעט במלואו; הובהר ששיקול הדעת התכנוני הוא מקצועי ('אינה באה להחליף'), בעיגון מלא לציטוט התומך וללא הוספת דין.","הביקורת השיפוטית על החלטות מוסדות התכנון מתמקדת בבחינת חוקיות ההליכים ודרכי קבלת ההחלטה, ואינה מחליפה את שיקול הדעת התכנוני של הרשות; בית המשפט יתערב במשורה, רק מקום בו נפל בהחלטה פגם חוקי על-פי עילות הביקורת המינהלית, כגון חריגה מסמכות, שיקולים פסולים או חריגה קיצונית ממתחם הסבירות.","הביקורת השיפוטית על החלטות מוסדות התכנון מתמקדת בבחינת חוקיות ההליכים ודרכי קבלת ההחלטה, ואינה באה להחליף את שיקול הדעת התכנוני המקצועי של הרשות; בית המשפט יתערב במשורה, רק מקום בו נפל בהחלטה פגם חוקי לפי עילות הביקורת המינהלית, כגון חריגה מסמכות, שיקולים פסולים או חריגה קיצונית ממתחם הסבירות."
|
||||||
|
17f3126b-dbc7-49f6-8bdb-15f5800d909a,1,accepted,0.9159,"הוספתי את ההבחנה המעוגנת במקור בין ההכרזה לבין תכנית פוגעת ('להבדיל מתכנית פוגעת'), והסרתי את הדוגמה הספציפית בסוגריים לטובת ניסוח כללי יותר.","הכרזה על קרקע (כגון הכרזה לשימור קרקע חקלאית) המגבילה בנייה ושימושים אינה מקימה כשלעצמה זכות לפיצוי בעל הזכות במקרקעין בגין הפגיעה בקניינו הנובעת מאותן הגבלות, אף אם הפגיעה בשווי הקרקע משמעותית ביותר.","הכרזה על קרקע המגבילה בנייה ושימושים אינה מקימה כשלעצמה, להבדיל מתכנית פוגעת, זכות לפיצוי בעל הזכות במקרקעין בגין הפגיעה בקניינו הנובעת מאותן הגבלות, אף אם הפגיעה בשווי הקרקע משמעותית."
|
||||||
|
5ca099ed-136d-4c59-9a15-e548334a6c11,1,accepted,0.8679,"הוסרו הדוגמאות בסוגריים (משקלו המוגבל, חזקת החפות) שאינן עולות מפורשות מהציטוט-התומך המדבר על 'כל המגבלות הכרוכות בכך' באופן כללי; שאר העיקרון נשמר כמעוגן.","מוסד תכנון רשאי להביא בחשבון, במסגרת מכלול שיקוליו, את עצם הגשתו של כתב אישום ואת תוכנו כראיה מנהלית, ובלבד שייעשה כן בכפוף למגבלות הכרוכות בשימוש בכתב אישום שטרם הוכרע (משקלו המוגבל, חזקת החפות וכיו""ב).","מוסד תכנון רשאי להביא בחשבון, במסגרת מכלול שיקוליו, את עצם הגשתו של כתב אישום ואת תוכנו כראיה מנהלית, בכפוף למגבלות הכרוכות בהסתמכות על כתב אישום שטרם הוכרע."
|
||||||
|
0c1cde3e-2caf-4d05-b684-9e53931111f3,1,drift_rejected,0.7924,drift 0.792 < floor 0.8,"אף אם ניתן לפרש את פסק דין ""קבוצת הירדן"" כך שאינו חל על העיר תל אביב-יפו, יש להחיל את דרך חישוב הפטור מהיטל השבחה המפורטת בו גם על תל אביב-יפו; הלכת קבוצת הירדן אינה מוגבלת גאוגרפית.",דרך חישוב הפטור מהיטל השבחה שנקבעה בהלכת קבוצת הירדן אינה מוגבלת גאוגרפית וחלה באופן אחיד על כל רשות מקומית.
|
||||||
|
9d4f9cda-a169-4ac1-9c8b-7dc99fbe486b,1,accepted,0.9304,"חודד שהשלכת-הרוחב והתקדים נבחנים לפי מאפייני המבנה הקונקרטי (עולה מהנימוק והציטוט-התומך) ושהאישור אינו בר-הכללה, מבלי להוסיף דין או נסיבות שאינם במקור.","טענת ועדה מקומית כי אישור שימוש חורג ממגורים למסחר יעודד בקשות דומות, יביא להשלכות רוחב ולצמצום היצע יחידות הדיור, או יהווה תקדים — אינה מתקבלת מקום שאופי הבינוי של המבנה ייחודי ואינו נפוץ; במצב כזה האישור מוגבל למקרה המסוים ואין בו כדי לפרוץ אל מעבר לנסיבותיו.","טענת ועדה מקומית כי אישור שימוש חורג ממגורים למסחר יעודד בקשות דומות, יביא להשלכות רוחב, יצמצם את היצע יחידות הדיור או יהווה תקדים — אינה מתקבלת מקום שאופי הבינוי של המבנה ייחודי ואינו נפוץ; השלכת-הרוחב והתקדים נבחנים לפי מאפייני המבנה הקונקרטי, ובבינוי ייחודי האישור מוגבל לנסיבות המקרה ואינו בר-הכללה."
|
||||||
|
3ca50208-ca74-4631-a2ef-758e97e30b95,1,accepted,0.9304,"זוקק וקוצר הניסוח (הסרת כפילות ""וועדת הערר"" והאיות הכפול); העיקרון נותר מעוגן בציטוט-התומך בדבר היעדר סמכות לערר על חידוש היתר.","החלטה בדבר חידוש או הארכת תוקפו של היתר בנייה לפי תקנות התכנון והבנייה (רישוי בנייה), תשע""ו-2016, אינה נמנית עם ההחלטות שעליהן ניתן לערור לוועדת הערר, ולפיכך וועדת הערר נעדרת סמכות לדון בערר המוגש על החלטה כאמור.","החלטה בדבר חידוש או הארכת תוקפו של היתר בנייה לפי תקנות התכנון והבנייה (רישוי בנייה), תשע""ו-2016, אינה נמנית עם ההחלטות הניתנות לערר לפני ועדת הערר, ועל כן ועדת הערר נעדרת סמכות לדון בערר המוגש עליה."
|
||||||
|
ca7f25f9-40b7-4f75-928f-16f348f47d82,1,accepted,0.9003,"הידוק רגיסטרי בלבד — קוצרו כפילויות ('נקיטה בהליך של', 'אכן') והומר התנאי לניסוח תמציתי, ללא הוספת דין שאינו עולה מהמקור.","צורך תכנוני או חברתי חיוני ודחוף עשוי להצדיק נקיטה בהליך של שימוש חורג כפתרון ביניים, מאחר שאישור מהלך תכנוני שלם גוזל זמן ארוך; ואולם תנאי לכך הוא הוכחה כי אכן קיים צורך חיוני ודחוף וכי ההמתנה עד לאישור המהלך התכנוני השלם תגרום נזק.","צורך תכנוני או חברתי חיוני ודחוף עשוי להצדיק שימוש חורג כפתרון ביניים, נוכח משך הזמן הארוך הכרוך באישור מהלך תכנוני שלם; ובלבד שהוּכח קיומו של צורך חיוני ודחוף וכי ההמתנה לאישור המהלך התכנוני השלם תגרום נזק."
|
||||||
|
4fb8c982-568b-4179-88a7-a5283f14cadc,1,accepted,0.8708,"נוסח מחדש כעיקרון איזון רב-תחולה — התועלת החברתית מול הפגיעה במתנגדים — תוך הוספת תנאי הגבירה העולה מן הנימוק, וללא הוספת דין מעבר למקורות.","הרווח החברתי לכלל הציבור עשוי להוות שיקול לאישור שימוש חורג גם מקום שבו השימוש כרוך בפגיעה במתנגדים, כאשר השימוש חיוני לציבור.","הרווח החברתי הצומח לכלל הציבור משימוש חורג החיוני לו עשוי להוות שיקול לאישור השימוש, אף כאשר הוא כרוך בפגיעה במתנגדים, ובלבד שהתועלת הציבורית גוברת על הפגיעה."
|
||||||
|
a8b1836f-e0c5-493f-b4bf-8a51aab0450c,1,drift_rejected,0.7808,drift 0.781 < floor 0.8,"שטחים ציבוריים סטטוטוריים אינם 'על הנייר' בלבד — הרשות המקומית מחויבת בפיתוחם, ומבני ציבור שנבנו בפועל (בתי ספר, גני ילדים, בתי כנסת, שצ""פים מפותחים) נלקחים בחשבון כחלק מהתשתית הציבורית הקיימת בשכונה לצורך הערכת היתכנות הקלות.","הרשות המקומית מחויבת בפיתוח השטחים הציבוריים הסטטוטוריים שבתחומה; משכך, אין לראות שטחים אלה כקיימים 'על הנייר' בלבד מקום שמבני ציבור ושטחים ציבוריים פותחו ונבנו בפועל ומהווים חלק מהתשתית הציבורית הקיימת בשכונה."
|
||||||
|
50313625-9da8-472d-8039-f6e810f27f65,1,accepted,0.9076,"ניסוח קומפקטי יותר באמצעות החלפת הניקודיים ("":"") בפסוקית-זיקה (""שלפיו"") ליצירת משפט אחד רציף; התוכן זהה ומעוגן בציטוט-התומך, ללא הוספת דין או סייג.","כאשר על המקרקעין קיימת בנייה הנגועה באי-חוקיות, יש להחיל את ""מבחן המגרש הריק"": השאלה הנשאלת היא האם נכון היה לאשר את הבקשה להיתר אילו לא הייתה קיימת על הקרקע אותה בנייה בלתי-חוקית.","כאשר על המקרקעין קיימת בנייה הנגועה באי-חוקיות, יש להחיל את ""מבחן המגרש הריק"", שלפיו נשאלת השאלה האם נכון היה לאשר את הבקשה להיתר אילו לא הייתה קיימת על הקרקע אותה בנייה בלתי-חוקית."
|
||||||
|
505884b8-feab-4221-a723-f915d745435a,1,abstained,,no change proposed,"היטל השבחה מוטל אך ורק על ""השבחת-תכנון"" — עליית ערך המקרקעין הנובעת באופן ישיר מהחלת הפעולה התכנונית עליהם — ולא על עליית שווי הנובעת מגורמים אחרים.","היטל השבחה מוטל אך ורק על ""השבחת-תכנון"" — עליית ערך המקרקעין הנובעת באופן ישיר מהחלת הפעולה התכנונית עליהם — ולא על עליית שווי הנובעת מגורמים אחרים."
|
||||||
|
c495b9be-4ee8-4585-b028-6854f9ce9f1c,1,accepted,0.9524,"הוספתי את אפיון התיקון כ""אקט מתקן שאינו פרסום חדש"" — מרכיב העולה מפורשות מהנימוק והציטוט-התומך — וחידדתי את הרגיסטר; הסייגים והמסקנות נותרו מעוגנים במקור.","הודעה בדבר תיקון טעות סופר בתכנית אינה מבטלת ואינה גורעת מתוקפה של ההודעה המקורית על אישור התכנית, ואינה מבטלת את תוקף התכנית עצמה; ככל שהיא רק מאזכרת את הפרסום הקודם, אין בה כדי לדחות את המועד הקובע.","הודעה על תיקון טעות סופר בתכנית היא אקט מתקן בלבד ואין בה משום פרסום חדש של אישור התכנית; היא אינה מבטלת ואינה גורעת מתוקף ההודעה המקורית על אישור התכנית ואף לא מתוקף התכנית עצמה, וככל שהיא רק מאזכרת את הפרסום הקודם אין בה כדי לדחות את המועד הקובע."
|
||||||
|
2ae64fb2-81b5-41d3-9061-f9744048876c,1,accepted,0.8438,"הוסרה הסיפא בדבר תכנית מתאר ארצית שאינה מעוגנת בציטוט; נותר הגרעין המעוגן — כפיפות מתקן התשתית לתב""ע ואי-תחליפיות של מסמך סביבתי-בריאותי.","הקמת מתקן תשתית כפופה להוראות התכנית המקומית (התב""ע), ותכנית מתאר ארצית החלה אינה פוטרת מן הצורך בהתאמה להוראות התב""ע מקום שזו נדרשת.","הקמת מתקן תשתית כפופה להוראות התכנית המקומית (התב""ע), ואין במסמך סביבתי-בריאותי כדי לפטור מן ההתאמה להוראות התב""ע."
|
||||||
|
1bc5a9bf-b0fb-4cc4-b2b9-d6d32ead2679,1,accepted,0.8543,"הוסר אופי הסיכום וצומצם הניסוח למשפט קנוני אחד נקי, תוך שמירה מלאה על העיקרון מהציטוט-התומך (סדר ייחוס הזכויות לפטור תחילה).","בעת חישוב היטל ההשבחה בפרויקט תמ""א 38 רואים בשלב הראשון את כל הזכויות כמנוצלות מכוח התמ""א (הפטורות), ורק זכויות עודפות מעבר לכך ייוחסו לתכנון הקיים החייב בהיטל.","בחישוב היטל השבחה בפרויקט תמ""א 38, בשלב הראשון רואים את מלוא הזכויות כמנוצלות מכוח התמ""א הפטורה, ורק זכויות עודפות מעבר לכך מיוחסות לתכנון הקיים החייב בהיטל."
|
||||||
|
56ae6e2d-5623-442f-b0fc-897bab0bebe5,1,accepted,0.9055,זוקק וקוצר: הובהר שהעתקת הנטל פועלת ביחסים החוזיים בלבד (כעולה מהנימוק והציטוט) והוסר הסיפא העודפת על 'סטיית ההסכם מהדין' שאינה נדרשת לעיקרון הכללי.,"זהות החייב בהיטל השבחה נקבעת על פי החוק ואינה ניתנת לשינוי בהסכם בין הצדדים; הסכם המעתיק את נטל התשלום מן הבעלים החייב על פי דין אל צד אחר אינו משפיע על סמכות גורמי הרשות המקומית להטיל את ההיטל על החייב בו מכוח החוק, ומשהוטל החיוב על מי שאינו החייב לפי דין — סטה ההסכם מהוראות הדין.",זהות החייב בהיטל השבחה נקבעת על פי דין ואינה ניתנת לשינוי בהסכם בין הצדדים; הסכם המעתיק את נטל התשלום אל צד אחר מחייב ביחסים החוזיים בלבד ואינו גורע מסמכות הרשות להטיל את ההיטל על החייב בו מכוח החוק.
|
||||||
|
00a587be-d0d3-433c-bb0a-0403dd5ce34a,1,accepted,0.9126,"ניסוח הודק לרגיסטר קנוני אחיד וסילוק הכפילות הדקדוקית, ללא הוספת דין שאינו עולה מהמקור.","פגם פרוצדורלי בהליך תכנוני שהוא תקלה טכנית בלבד ואינו פגם מהותי ניתן להחלת דוקטרינת הבטלות היחסית (דוקטרינת התוצאה היחסית), המאפשרת להימנע מביטול ההליך חרף הפגם.","פגם פרוצדורלי בהליך תכנוני שהוא תקלה טכנית בלבד ואינו פגם מהותי, מצדיק החלת דוקטרינת הבטלות היחסית (התוצאה היחסית) ומאפשר להימנע מביטול ההליך חרף הפגם."
|
||||||
|
a9be7842-eaf6-4fca-941d-0d72936dbf70,1,accepted,0.8585,"זוקק לליבת העיקרון המעוגנת בציטוט (תנאי 'הדבר מה נוסף' + שלילת ההקניה האוטומטית); הוסר הזנב הטיעוני 'וטענה הפוכה נוגדת את הדין ואת פסיקת בתי המשפט' שאינו עולה מהמקור, וכן ההקשר הספציפי 'בפני ועדת הערר'.","הקניית מעמד של 'עורר ציבורי' מותנית בכך שהעורר יצביע על פגם מהותי בשלטון החוק העולה כדי 'דבר מה נוסף'; עצם העלאת טענה לפגיעה בחוקיות בפני ועדת הערר אינה מקנה כשלעצמה מעמד ציבורי, וטענה הפוכה נוגדת את הדין ואת פסיקת בתי המשפט.",מעמד של 'עורר ציבורי' מותנה בהצבעה על פגם מהותי בשלטון החוק העולה כדי 'דבר מה נוסף'; עצם העלאת טענה לפגיעה בחוקיות אינה מקנה כשלעצמה מעמד ציבורי.
|
||||||
|
aedf265b-750b-4f74-84ac-cb02d4240126,1,abstained,,no change proposed,"בהיעדר תכנית כוללת שהוכנה בהתאם לדרישת תכנית מחוזית, ייעוד הקרקע נקבע על-פי התכנית המקומית החלה עליה, ולא על-פי הייעוד הנקוב בתכנית המחוזית.","בהיעדר תכנית כוללת שהוכנה בהתאם לדרישת תכנית מחוזית, ייעוד הקרקע נקבע על-פי התכנית המקומית החלה עליה, ולא על-פי הייעוד הנקוב בתכנית המחוזית."
|
||||||
|
2522e80a-d953-46c9-8d66-067c8d6df1c2,1,drift_rejected,0.7697,drift 0.770 < floor 0.8,"אין לקבל ניסיון של בעל דין להבחין בין תקדים החל עליו לבין המקרה הנדון, מקום שההבחנה נשענת על טענה העומדת בסתירה לעמדה שאותו בעל דין עצמו טען בהליך הקודם.","בעל דין אינו רשאי להבחין בין תקדים החל עליו לבין עניינו, כאשר ההבחנה נשענת על טענה הסותרת את העמדה שטען אותו בעל דין עצמו בהליך הקודם."
|
||||||
|
2a6fbc99-6c4f-4708-a404-4da36876466c,1,accepted,0.9109,"שמרתי את העיקרון המעוגן בציטוט (היררכיה מן הכללי אל המפורט והיתר הנסמך על תכנון מפורט במשבצת) ואת ההפניה הכללית לסעיף 145(ז), אך הסרתי את פירוט תוכן הסעיף ואת תאריך 1.1.96 שאינם עולים מהציטוט-התומך.","מערכת התכנון בנויה כהיררכיה של הסדרים ההולכים מן הכללי אל המפורט, ומתן היתר בנייה מחייב קיומה של תכנית מפורטת בדרגת פירוט סבירה לגבי המקרקעין נשוא ההיתר; דרישה זו קיבלה ביטוי סטטוטורי בסעיף 145(ז) לחוק התכנון והבניה, המתנה מתן היתר מכוח תכנית שהופקדה לאחר 1.1.96 באישור תכנית הקובעת הוראות בדבר פירוט ייעודי הקרקע, חלוקה למגרשים, קווי בניין, מספר קומות או גובה ושטחי בנייה מותרים.","מערכת התכנון בנויה כהיררכיה של הסדרי תכנון ההולכים מן הכללי אל המפורט ומסתיימים במתן היתר לביצוע עבודות הנסמך על התכנון המפורט במשבצת הקרקע; מכאן שמתן היתר בנייה מחייב קיומה של תכנית מפורטת בדרגת פירוט סבירה לגבי המקרקעין נושא ההיתר, דרישה שקיבלה עיגון סטטוטורי בסעיף 145(ז) לחוק התכנון והבניה."
|
||||||
|
801ca0a5-62da-4af7-9081-412c72dbc678,1,accepted,0.874,חידוד ניסוח בלבד — הובהר שהבכורה של התשריט היא ביחס לפרשנות תקנונית סותרת; שני היסודות מעוגנים בציטוט ובנימוק.,אין לפרש את הוראות תקנון התכנית בסתירה לתשריט ולייעודי הקרקע הקבועים בה; התשריט וייעודי הקרקע שנקבעו בו גוברים בקביעת תכליתם של המקרקעין.,אין לפרש את הוראות תקנון התכנית בסתירה לתשריט ולייעודי הקרקע הקבועים בה; בקביעת תכליתם של המקרקעין גוברים התשריט וייעודי הקרקע שנקבעו בו על פרשנות תקנונית הסותרת אותם.
|
||||||
|
eb6f7341-2b60-49c5-a14c-ed2000423994,1,accepted,0.9344,"הניסוח הודק לרצף לוגי אחד וזוקק לכלל פרשני כללי ('בהיעדר ניסוח מפורש'), תוך שמירה מלאה על העיגון בציטוט-התומך וללא הוספת דין.","'מניעה לפי דין' היא עילה הקבועה בדין ואינה עניין הנתון לשיקול דעתה של הרשות; שיקולים שבשיקול דעת, כגון שיקולי תכנון, אינם שקולים למניעה לפי דין ואינם מקימים אותה. אילו ביקש מתקין התקנות להחריג מקרים שבשיקול דעת היה קובע זאת במפורש.","'מניעה לפי דין' היא עילה הקבועה בדין ואינה נתונה לשיקול דעתה של הרשות; שיקולים שבשיקול דעת, ובכללם שיקולי תכנון, אינם שקולים למניעה לפי דין ואינם מקימים אותה, ובהיעדר ניסוח מפורש של חריג שבשיקול דעת אין להניח שמתקין התקנות התכוון להחריגם."
|
||||||
|
98e8702c-958f-47c0-a483-8acccb26699c,1,accepted,0.9299,סדר-המשפט הומר כך שעיקרון-הסמכות עומד בראש והעיגון הכפול מובא כנימוק נלווה; התוכן זהה לציטוט-התומך ללא תוספת דין.,"ועדת הערר, הן מכוח סמכותה להיכנס בנעלי הוועדה המקומית והן כמוסד תכנון הניצב בהיררכיה גבוהה יותר מן הוועדה המקומית, מוסמכת להנחות את הוועדה המקומית באשר לאופן הפעלת שיקול דעתה בעת שתידון בפניה בקשה להיתר עתידית.","ועדת הערר מוסמכת להנחות את הוועדה המקומית באשר לאופן הפעלת שיקול דעתה בבקשה להיתר עתידית, וזאת הן מכוח סמכותה להיכנס בנעלי הוועדה המקומית והן ממעמדה כמוסד תכנון הניצב בהיררכיה גבוהה ממנה."
|
||||||
|
fd5093f7-780f-441e-b258-f5df28c98b5c,1,accepted,0.944,הניסוח הודק והוסר הכפל ('הניתן לבעל זכויות... נתון לבעל הזכויות'); הליבה והעיגון בציטוט נשמרו ללא הוספת דין או סייג.,"הפטור מהיטל השבחה הניתן לבעל זכויות במקרקעין בגין דירת מגורים אינו מוגבל בהיקפו לפי שטח המקרקעין, ובהיעדר הגדרה מצמצמת בחוק יש להעדיף את הפרשנות שלפיה הפטור נתון לבעל הזכויות יהא שטח המקרקעין אשר יהא.","הפטור מהיטל השבחה בגין דירת מגורים אינו מוגבל בהיקפו לפי שטח המקרקעין, ובהיעדר הוראה מצמצמת בחוק יש להעדיף את הפרשנות שלפיה הפטור נתון לבעל הזכויות במקרקעין יהא שטח המקרקעין אשר יהא."
|
||||||
|
ca990277-7bb5-4924-8769-cf69074fd653,1,accepted,0.8625,"נוסף הטעם המצטבר השני (התנהלות הוועדה המקומית כלפי בעלי הזכויות) המופיע במפורש בציטוט-התומך אך הושמט בניסוח הקיים, והוסר פרט-המקרה הספציפי (התייחסות מפורשת למועד) כדי להכליל.","שתי תכניות נפרדות העומדות כל אחת בפני עצמה — תכנית מקפיאה ותכנית משחררת — עשויות להיראות כתכנית אחת לצורך בחינת פיצויים לפי סעיף 197, מקום שמתקיים ביניהן קשר תכנוני הדוק (""רצף תכנוני""), כגון כאשר התכנית המקפיאה מתייחסת במפורש לתכנית המשחררת הצפויה ולמועדה, ובכך מלמדת שהיא הייתה מלכתחילה תכנית זמנית שנועדה להקפיא מצב קיים עד לביצוע התכנית המשחררת.","שתי תכניות נפרדות — תכנית מקפיאה ותכנית משחררת — עשויות להיחשב כתכנית אחת לצורך בחינת הפגיעה והפיצויים לפי סעיף 197 לחוק התכנון והבניה, מקום שמתקיימים שני טעמים מצטברים ושלובים: זיקה תכנונית הדוקה בין התכניות (""רצף תכנוני""), המלמדת שהתכנית המקפיאה נועדה להקפיא מצב קיים עד לאישור התכנית המשחררת כשלב במהלך תכנוני אחד; והתנהלות הוועדה המקומית ביחסיה עם בעלי הזכויות במקרקעין."
|
||||||
|
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 מקנות התעשרות שעקרונית מצדיקה חיוב בהיטל, המחוקק קבע לגביהן פטור מ"
|
||||||
|
62
docs/anti-hallucination-gate.md
Normal file
62
docs/anti-hallucination-gate.md
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# שער anti-hallucination — הגנה משותפת מפני הזיות (INV-AH)
|
||||||
|
|
||||||
|
> **מקור-אמת אחד לכל הסוכנים.** כל סוכן נוגע-מהות מפנה לכאן (דרך [HEARTBEAT.md](.claude/agents/HEARTBEAT.md)
|
||||||
|
> ובלוק "קרא לפני פעולה" שלו). אל תשכפל את הכללים בקובץ-סוכן — הפנה לכאן (G2 — בלי מסלולים מקבילים).
|
||||||
|
> זהו המקבילה התוכנית ל-INV-AG1 (קריאת-ספ): כמו שאינך פועל "מהזיכרון" לגבי התנהגות-המערכת, אינך
|
||||||
|
> מצטט פסיקה/חוק/הלכה/מספר "מהזיכרון".
|
||||||
|
|
||||||
|
## למה זה קיים
|
||||||
|
כלי-AI משפטיים מובילים (Lexis+ AI, Westlaw) **הוזים פסיקה ב-17%–33%** גם עם RAG — זו לא בעיה
|
||||||
|
שנעלמת מעצמה ("RAG ≠ hallucination-free"). בתחום מעין-שיפוטי, ציטוט-שווא של פסק-דין/סעיף/הלכה הוא
|
||||||
|
כשל קריטי הניתן לביקורת שיפוטית. חמש הטכניקות למטה הן הקונצנזוס המקצועי להפחתת הזיות, מותאם לתחום.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## חמש הטכניקות הקשיחות (חלות על כל סוכן נוגע-מהות)
|
||||||
|
|
||||||
|
**AH-1 · עיגון-מקור (grounding) — אפס ציטוט מהזיכרון.**
|
||||||
|
כל אזכור של פסק-דין / מספר-תיק / סעיף-חוק / הלכה / מקדם / "מתודה שמאית" / נתון כמותי חייב לבוא
|
||||||
|
ממקור מאומת: **תוצאת כלי-אחזור** (`search_precedent_library`, `search_internal_decisions`,
|
||||||
|
`search_case_documents`, `search_decisions`, `find_similar_cases`, `precedent_library_get`,
|
||||||
|
`halacha_review`) **או מסמך בתיק**. אם לא הרצת חיפוש/לא קראת מסמך — אין לך את הפריט. *(Stanford RegLab / Magesh et al., JELS 2025; Anthropic — ground in retrieved sources.)*
|
||||||
|
|
||||||
|
**AH-2 · Quote-or-retract.**
|
||||||
|
לכל אזכור-מקור צרף את הציטוט/מזהה המדויק שהמקור החזיר (`supporting_quote`/headnote/ציטוט מהמסמך).
|
||||||
|
**אין ציטוט מאשר → הסר את האזכור.** *(Anthropic — retract if no supporting quote; RAGAS faithfulness — כל טענה חייבת להיות נתמכת ב-context.)*
|
||||||
|
|
||||||
|
**AH-3 · Abstention — "לא יודע" עדיף על המצאה.**
|
||||||
|
לא נמצא מקור? כתוב מפורשות **"לא נמצא בקורפוס/בתיק — דורש אימות חיצוני"**. אסור לסגור פער בהשערה
|
||||||
|
שנכתבת כעובדה. *(Anthropic — give the model an out.)*
|
||||||
|
|
||||||
|
**AH-4 · תיוג-ודאות.** סמן כל טענה לא-טריוויאלית:
|
||||||
|
`[מאומת]` (מקור+ציטוט) · `[טעון-אימות]` (סביר/עולה מהמסמכים, אך לא אותר מקור מאשר) · `[ספקולציה]`
|
||||||
|
(השערה אנליטית — מותרת רק כשאלה/הסתייגות, לא כקביעה). *(NIST AI RMF GenAI Profile — explainability/קליברציה; RAGAS — atomic-claim grounding.)*
|
||||||
|
|
||||||
|
**AH-5 · Chain-of-Verification (CoVe) — מעבר-אימות לפני סיום.**
|
||||||
|
אחרי הטיוטה, פרק כל טענה עובדתית/אזכור לרשימה, ולכל אחת שאל "מאיזה מקור מאומת זה מגיע?".
|
||||||
|
כל מה שאין לו עוגן — **הסר או הורד ל-`[ספקולציה]`**. *(Chain-of-Verification — Dhuliawala et al., arXiv:2309.11495, 2023.)*
|
||||||
|
|
||||||
|
> **ההבחנה שמכריעה הכל — "פער" מותר, "המצאה" אסורה:**
|
||||||
|
> ✅ "אזכרתי את X — חיפשתי ולא מצאתי בקורפוס; דורש אימות." (פער לגיטימי) ·
|
||||||
|
> ❌ "הנה תקדים Y רלוונטי" כש-Y לא הגיע מכלי-אחזור. (המצאה)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## יישום לפי תפקיד
|
||||||
|
| סוכן | איך השער חל |
|
||||||
|
|------|-------------|
|
||||||
|
| **analyst / researcher** | מייצרי-מהות — עיגון-קורפוס מלא, log שאילתות + negative evidence, "מקור: כתבי טענות → דורש אימות". (כבר נהוג; כעת אחיד ומעוגן-מקור.) |
|
||||||
|
| **writer** | **צרכן read-only** של פלט-המנתח המעוגן. **אסור** להוסיף פסיקה/סעיף/הלכה שלא הגיעו מהמנתח/הקורפוס. ציטוט בהחלטה = רק מ-`supporting_quote` מאומת. |
|
||||||
|
| **qa** | **אוכף** את AH-1…AH-5 כשער-איכות: כל אזכור בטיוטה — האם מאומת-מקור? אם לא — `needs_revision`. |
|
||||||
|
| **ceo** | מנתב ומסכם — לא ממציא מקורות; אם מצטט, מצטט ממה שהסוכנים אימתו. |
|
||||||
|
| **proofreader** | תיקון-OCR בלבד — **אל "תתקן" לכיוון מונח משפטי סביר** (שם-תקדים/מספר-תיק/סכום): שמר את לשון-המקור; ספק → סמן, לא "תקן". |
|
||||||
|
| **exporter** | מכני (DOCX) — אפס מהות חדשה. |
|
||||||
|
| **hermes-curator** | הצעות בלבד (G10) — מעוגן-מקור, לא מזין שכבת-קול עם מהות (INV-LRN5). |
|
||||||
|
| **שטן מליץ (Gemini)** | מימוש-הייחוס המלא של השער (`legal-analyst-gemini-critique.md`) — לידים-לא-הכרעות ליו"ר (human-in-the-loop, NIST). |
|
||||||
|
|
||||||
|
## מקורות מקצועיים
|
||||||
|
1. Magesh, Surani, Dahl, Suzgun, Manning, Ho — *Hallucination-Free? Assessing the Reliability of Leading AI Legal Research Tools*, J. Empirical Legal Studies (2025), Stanford RegLab/HAI — שיעורי-הזיה 17–33% גם עם RAG.
|
||||||
|
2. Anthropic — *Reduce hallucinations* (docs.anthropic.com): allow "I don't know" · cite quotes/sources · retract-if-no-quote · chain-of-thought.
|
||||||
|
3. Dhuliawala et al. — *Chain-of-Verification Reduces Hallucination in LLMs*, arXiv:2309.11495 (2023).
|
||||||
|
4. Es et al. — *RAGAS: Automated Evaluation of RAG*, arXiv:2309.15217 — faithfulness = יחס הטענות הנתמכות-בקונטקסט.
|
||||||
|
5. NIST — *AI RMF: Generative AI Profile* (NIST-AI-600-1, 2024) — human-in-the-loop oversight ב-high-stakes.
|
||||||
@@ -320,10 +320,25 @@ Conclusion → Rule → Explanation → Application → Conclusion.
|
|||||||
**Content model:**
|
**Content model:**
|
||||||
- Types: narrative, citation-block
|
- Types: narrative, citation-block
|
||||||
- Elements: section-heading, numbered-para, blockquote (ציטוט מהוראות תכנית)
|
- Elements: section-heading, numbered-para, blockquote (ציטוט מהוראות תכנית)
|
||||||
- Sources: הוראות תכנית (PDF), נספחי בינוי, החלטות מרכזות
|
- Sources: הוראות תכנית (PDF), נספחי בינוי, החלטות מרכזות, **מרשם-התכניות** (טבלת `plans` — זהות+תוקף קנוניים, מאושרי-יו"ר; ראה להלן)
|
||||||
|
|
||||||
|
**משפט-ציטוט-תכנית (קנוני — נוסח דפנה):**
|
||||||
|
לכל תכנית, חלק **הזהות והתוקף** נכתב בנוסח אחיד ודטרמיניסטי הנגזר ממרשם-התכניות
|
||||||
|
(`db.format_plan_citation`), כך שתאריך-הפרסום ומספר-הילקוט לעולם אינם מנוסחים מחדש
|
||||||
|
(ובכך גם לא מהוזים — INV-AH). התבנית (רשומות בלבד; חלקים בסוגריים = לפי-זמינות):
|
||||||
|
|
||||||
|
> `{שם-התכנית} פורסמה למתן תוקף ברשומות ביום {D.M.YYYY}[, י"פ {מס'}][ — {ייעוד}].`
|
||||||
|
|
||||||
|
דוגמאות-אמת מהקורפוס: *"תכנית מי/820 פורסמה למתן תוקף ביום 9.8.2001 — משנה את הוראות
|
||||||
|
תכנית מי/200…"* · *"תכנית הל/435 פורסמה למתן תוקף ביום 8.11.2007…"*. הניתוח התכנוני
|
||||||
|
(ייעוד, פרשנות) מנוסח בסגנון דפנה; **תאריך-התוקף ומספר-הילקוט — מהמרשם, ככתבם.**
|
||||||
|
תכנית שזוהתה בתיק אך **חסרה במרשם או טרם אושרה** מוזכרת בלי תאריך-תוקף (לא מנחשים).
|
||||||
|
המרשם מוזן ע"י `extract_plans` / `backfill_plans_registry.py`, ונכנס לשימוש רק
|
||||||
|
אחרי אישור-יו"ר (`plan_review`, review_status=approved — G10).
|
||||||
|
|
||||||
**Constraints:**
|
**Constraints:**
|
||||||
- MUST: ציטוט ישיר מהוראות תכנית עם הדגשת (bold) מילים מכריעות
|
- MUST: ציטוט ישיר מהוראות תכנית עם הדגשת (bold) מילים מכריעות
|
||||||
|
- MUST: לזהות+תוקף של תכנית — להשתמש במשפט-הציטוט הקנוני מהמרשם (לעיל); אסור להמציא תאריך-פרסום/מס'-ילקוט
|
||||||
- MUST NOT: ניתוח מעמיק (→ block-yod), הכרעה בין פרשנויות
|
- MUST NOT: ניתוח מעמיק (→ block-yod), הכרעה בין פרשנויות
|
||||||
- Dependencies: block-chet (מספור), block-vav (הגדרות תכניות)
|
- Dependencies: block-chet (מספור), block-vav (הגדרות תכניות)
|
||||||
- Condition: **אופציונלי** — רק כשיש מורכבות תכנונית (תכניות סותרות, תמ"א 38 + שימור, פרשנות)
|
- Condition: **אופציונלי** — רק כשיש מורכבות תכנונית (תכניות סותרות, תמ"א 38 + שימור, פרשנות)
|
||||||
|
|||||||
70
docs/corpus-graph.md
Normal file
70
docs/corpus-graph.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# מפת הקורפוס — גרף ציטוטים אינטראקטיבי (`/graph`)
|
||||||
|
|
||||||
|
תצוגת‑רשת אינטראקטיבית של קורפוס הפסיקה, בסגנון Obsidian Graph View, **מוטמעת נייטיב ב‑web‑ui**. כל פריט הוא נקודה, קישורים הם קווים, וגודל הנקודה משקף חשיבות — כך שאפשר להתמקד בנושא ולראות מה קשור אליו.
|
||||||
|
|
||||||
|
## למה נייטיב ולא Obsidian (G2)
|
||||||
|
|
||||||
|
הרעיון המקורי היה לייצא את הקורפוס ל‑Obsidian vault. **נדחה** — vault הוא **עותק מקביל של הקורפוס שמתיישן**, בדיוק כשל‑השורש ש‑[G2](spec/00-constitution.md) (מקור‑אמת יחיד, ללא מסלול מקביל) בא לייבש. הגרף הנייטיב קורא את ה‑DB החי → **אפס drift**, ומתחבר לדפים הקיימים (`/precedents`, `/missing-precedents`, `/digests`).
|
||||||
|
|
||||||
|
**התובנה המאפשרת:** כל קשתות הגרף כבר היו קיימות בטבלאות — הגרף רק חושף אותן. הוא **projection קריא‑בלבד** (SELECT בלבד), ולכן אינו יכול לסטות מהמקור. הוא **אינו מסלול אחזור** ([03-retrieval](spec/03-retrieval.md)) — מחזיר טופולוגיה (nodes+edges+מטריקות), לא תוצאות חיפוש מדורגות.
|
||||||
|
|
||||||
|
## שכבות (כולן opt‑in דרך toggles, מלבד הבסיס)
|
||||||
|
|
||||||
|
| שכבה | נקודות | קשתות | מקור הדאטה |
|
||||||
|
|------|--------|-------|------------|
|
||||||
|
| **בסיס** | פסיקה (`cl:`) · נושא (`tag:`) · תחום (`pa:`) | `cites` · `same_chain` · `tagged` · `in_area` | `case_law`, `precedent_internal_citations`, `case_law_relations`, `subject_tags` |
|
||||||
|
| **הלכות** | הלכה (`hal:`) | `extracted_from` · `corroborates` · `equivalent` | `halachot`, `halacha_citation_corroboration`, `equivalent_halachot` |
|
||||||
|
| **חוסרי מחקר** | gap (`gap:`) — חלול/מקווקו | `cites` (פסיקה→gap) | `precedent_internal_citations` (cited_case_law_id IS NULL) + העשרה מ‑`missing_precedents` |
|
||||||
|
| **יומונים** | יומון (`dig:`) — טורקיז | `covers` (יומון→פסיקה/gap) | `digests` |
|
||||||
|
|
||||||
|
**גודל נקודה** = חשיבות: ציטוטים נכנסים (פסיקה), אזכורים (הלכה), מספר מצטטים (gap). **צבע** (color‑by, ברירת‑מחדל "סוג"): סוג · תחום · דרגת‑סמכות · **אשכול** (community) · עדכניות.
|
||||||
|
|
||||||
|
## אנליטיקה (Graph Analysis)
|
||||||
|
|
||||||
|
`metrics=true` מפעיל חישוב **in‑memory** (ללא DB) ב‑[`web/graph_metrics.py`](../web/graph_metrics.py) — pure, ללא תלויות (אין networkx):
|
||||||
|
- **PageRank** (power‑iteration) — השפעה גלובלית.
|
||||||
|
- **Betweenness** (Brandes) — "גשריות" (פסיקות שמחברות אשכולות).
|
||||||
|
- **Community** (label‑propagation דטרמיניסטי + fallback ל‑connected‑components) — אשכולות תמטיים.
|
||||||
|
|
||||||
|
מחושב על **תת‑גרף הפסיקות בלבד** (cites/same_chain) — קשתות hub/gap/digest/halacha מוחרגות. ב‑UI: בוררי "צביעה לפי" / "גודל לפי" + פאנל דירוג ("המשפיעות" / "גשרים").
|
||||||
|
|
||||||
|
## ניווט וחוויה
|
||||||
|
|
||||||
|
- **Deep‑link** `/graph?focus=cl:<id>` — לינק שיתופי; כפתור **"הצג בגרף"** בכל דף פסיקה.
|
||||||
|
- **Local graph** — לחיצה על נקודה → התמקדות בשכניה (BFS, סליידר עומק 1–3).
|
||||||
|
- **ייצוא PNG** · פאנל עשיר (headnote/summary) · מקרא נקודות+קשתות · סינון מטא‑דאטה (בית‑משפט/דרגה/יו״ר/מחוז/שנים).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
קריאה‑בלבד, `response_model` מפורש (UI2). מוגדר ב‑[`web/app.py`](../web/app.py) (~`/api/graph/*`), לוגיקה ב‑[`web/graph_api.py`](../web/graph_api.py):
|
||||||
|
|
||||||
|
| endpoint | תיאור |
|
||||||
|
|----------|-------|
|
||||||
|
| `GET /api/graph/corpus` | הגרף המלא. params: `node_types` (csv), `metrics`, `practice_area`/`source`/`court`/`precedent_level`/`chair`/`district`/`year_from`/`year_to`, `min_citations`, `q`, `limit` (cap 400, max 1500) |
|
||||||
|
| `GET /api/graph/node/{id}/neighborhood` | Local graph: צומת + שכנים בעומק 1–3 |
|
||||||
|
| `GET /api/graph/facets` | ערכי סינון ייחודיים (courts/levels/chairs/districts) |
|
||||||
|
|
||||||
|
## קבצים
|
||||||
|
|
||||||
|
- **Backend:** [`web/graph_api.py`](../web/graph_api.py) (הרכבת nodes/edges, helpers `_edges_and_hubs`/`_gap_nodes_and_edges`/`_digest_nodes_and_edges`/`_halacha_nodes_and_edges`) · [`web/graph_metrics.py`](../web/graph_metrics.py) (מטריקות) · endpoints ב‑[`web/app.py`](../web/app.py).
|
||||||
|
- **Frontend:** [`web-ui/src/app/graph/page.tsx`](../web-ui/src/app/graph/page.tsx) · [`web-ui/src/components/graph/`](../web-ui/src/components/graph/) (`graph-view` orchestrator · `graph-canvas` ציור react‑force‑graph‑2d · `graph-filter-panel` · `graph-node-panel`) · hooks ב‑[`web-ui/src/lib/api/graph.ts`](../web-ui/src/lib/api/graph.ts).
|
||||||
|
|
||||||
|
## איך מוסיפים שכבה חדשה
|
||||||
|
|
||||||
|
1. הוסף ערך ל‑`VALID_NODE_TYPES` ב‑`graph_api.py` (לא ל‑`DEFAULT_NODE_TYPES` אם רוצים שיהיה כבוי).
|
||||||
|
2. כתוב `_X_nodes_and_edges(conn, prec_ids)` — SELECT בלבד; חבר nodes לפסיקות שבתצוגה.
|
||||||
|
3. חבר בשתי פונקציות הבנייה (`build_corpus_graph` + `build_node_neighborhood`) מאחורי `if "X" in types`.
|
||||||
|
4. **dangling‑edge invariant:** כל קשת — שני קצותיה חייבים להיות nodes בתצוגה (סנן מול `prec_ids`/קבוצת ה‑ids).
|
||||||
|
5. Frontend: toggle ב‑`graph-filter-panel` · צבע/רינדור ב‑`graph-canvas` (`NODE_COLORS`/`colorForNode`/`linkColor`) · ענף בפאנל ב‑`graph-node-panel`.
|
||||||
|
6. אם גדל מודל התגובה — אחרי deploy: `cd web-ui && npm run api:types`.
|
||||||
|
|
||||||
|
## Invariants
|
||||||
|
|
||||||
|
- **G2** — projection קריא‑בלבד דרך `db.get_pool()`; אפס כתיבות; מטריקות in‑memory. ללא store מקביל.
|
||||||
|
- **G5** — כל פילטר server‑side, parameterized.
|
||||||
|
- **UI2** — `response_model` מפורש בכל endpoint; **UI4** — שגיאות UI מוצגות, לא נבלעות.
|
||||||
|
- **טופולוגיה ≠ אחזור** — מבנה הקורפוס, לא תוצאות חיפוש.
|
||||||
|
|
||||||
|
## היסטוריית מימוש
|
||||||
|
|
||||||
|
PR #113 (בסיס) · #118 (תיקון תוויות) · #126 (מטא‑דאטה) · #129 (אנליטיקה) · #131 (gaps) · #132 (יומונים) · #134 (ניווט) · #137 (הלכות) · #139 (api:types).
|
||||||
146
docs/ia-audit-redesign.md
Normal file
146
docs/ia-audit-redesign.md
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# IA-Audit & Redesign — מפת משטח-ההפעלה, כפילויות, וניווט-יעד
|
||||||
|
|
||||||
|
> **מה זה.** אבחון שיטתי של **משטח-ההפעלה** של המערכת (כל דף/טאב/drawer/פונקציה) — מה כל אחד עושה, מה כפול, מה מת, מה מציג נתון שגוי, ואיך הכול מסתנכרן — ו**תכנון-מחדש** של ארכיטקטורת-המידע (IA). נכתב לפי בקשת חיים (2026-06-11): *"המערכת מסובכת מדי לתפעול… כל הדפים האלה מפוזרים ואין לי מושג מה כל אחד עושה והאם יש כפילויות."*
|
||||||
|
>
|
||||||
|
> **היקף:** משטח-ההפעלה (1א). ה-backend נכלל רק היכן שהוא גורם לכפילות/נתון-שגוי ב-UI. תוצר-אחות: ספ-היעד [`docs/spec/X17-information-architecture.md`](spec/X17-information-architecture.md). יוזמה: TaskMaster `legal-ai` **#127**.
|
||||||
|
>
|
||||||
|
> **איך הופק:** סריקת-עומק רב-סוכנית (18 סוכנים, 6 אשכולות × 3 שלבים — קטלוג → אימות-אדוורסרי מול הקוד → תכנון-יעד מגובה-מקורות). כל ממצא אומת ב-`file:line`; כל עקרון-תכנון מגובה ב-≥3 מקורות סמכותיים (ראה [X17 §מקורות](spec/X17-information-architecture.md)).
|
||||||
|
|
||||||
|
## יחס למסמכים קיימים (דאבל-צ'ק — לא לכפול)
|
||||||
|
- **[`ui-audit.md`](spec/ui-audit.md)** — ביקורת-קוד פר-רכיב (enums כפולים, טיפוסים, helpers → FU-10). **שכבה אחרת.** מסמך זה הוא בשכבת ה-**IA/הפעלה** (אילו משטחים, מה כל אחד עושה, סנכרון, ניווט). חופף נקודתית ב-UI-C1 (3 דפי-פסיקה חופפים) ו-UI-D2/D3 (שקיפות-מקור) — מורחב כאן.
|
||||||
|
- **[`gap-audit.md`](spec/gap-audit.md)** — ממצאי-ארכיטקטורה (GAP→FU). מסמך זה ברמת-הדף.
|
||||||
|
- **[`X6-ui-api-contract.md`](spec/X6-ui-api-contract.md)** — חוזה UI↔API (UI1–UI6). X17 מוסיף שכבת invariants מעל X6.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. תקציר-מנהלים — 5 מחלות-השורש
|
||||||
|
|
||||||
|
הסריקה אימתה **37 ממצאים** על פני 34 משטחים. כולם נופלים ל-5 דפוסים:
|
||||||
|
|
||||||
|
| # | מחלת-שורש | כמה | מהות |
|
||||||
|
|---|-----------|-----|------|
|
||||||
|
| **D1** | **פערי-סנכרון ב-cache** | 16 | mutation מבטל רק את ה-queryKey המקומי, לא את ה-aggregator/האח/ה-namespace השני → מונה/נתון תקוע ב-0–60ש' בין דפים. זהו G2 בשכבת ה-TanStack-Query cache. |
|
||||||
|
| **D2** | **משטחי-כתיבה/אישור כפולים** | 6 (dup) + 2 confusing | אותו datum נערך/מאושר ב-2 מקומות שכותבים ל-2 ערוצים. החריף: **שני שערי-למידה** (decision_lessons מול promote) ו-**מתודולוגיה** (PUT מול promote כותבים לאותה שורה — מירוץ lost-update). זו בדיוק ה"למה 2 שערים" של חיים. |
|
||||||
|
| **D3** | **נתונים-שגויים/מטעים** | 6 | KPI סופר דגל אינפורמטיבי-בלבד (`applied_to_skill`/`findings_applied` — "מזויף"); `signature_phrases` עם תווית-קרדינליות שקרית; מונה-תור שמתעלם מחברה לא-זמינה. |
|
||||||
|
| **D4** | **משטחים/פונקציות מתים** | 5 | endpoint `queue/pending` ללא צרכן; כפתור `applied_to_skill`; ז'רגון `T7/T15`; `AuthorityBadge` חסר בחיפוש. |
|
||||||
|
| **D5** | **כפילות-ניווט** | — | הערות-יו"ר ב-2 דפים; `/operations`+`/diagnostics` אותו intent; `precedents` מול `precedent-library`. |
|
||||||
|
|
||||||
|
**התובנה המאחדת:** רוב המחלות הן ביטוי-UI אחד של עקרון-על מופר — **G2 (מקור-אמת יחיד / אין מסלולים מקבילים)** — שמעולם לא הורחב לשכבת-ה-UI (cache + משטחים). זה בדיוק מה שחיים חווה כ"מסובך לתפעול": אותו מספר בשני מקומות, שני שערים לאותה החלטה, ומספרים שלא מתעדכנים.
|
||||||
|
|
||||||
|
### ניווט-היעד (תמצית — מלא ב-X17)
|
||||||
|
שלושה משטחי-**intent** עם בעלים-יחיד, במקום פיזור-לפי-פורמט:
|
||||||
|
1. **`/approvals` = תיבת-ההחלטות-האנושית היחידה** — המקום היחיד שבו פועלים על שער. דפים אחרים **מצביעים** למונה, לא משכפלים אותו.
|
||||||
|
2. **`/operations` = משטח-הקריאה-בלבד היחיד** ("מה המכונה עושה") — בולע את `/diagnostics`.
|
||||||
|
3. **`/settings` = משטח-התצורה היחיד.**
|
||||||
|
ובתוך-התחום: **החלטה=workspace אחד** · **למידה=תיבה+ערוץ+שער אחד** · **`/methodology`=עורך-הכללים היחיד** · **פסיקה=3 קורפוסים נפרדים אך מתפעלים אחיד**.
|
||||||
|
|
||||||
|
> **כל ההצעות שומרות 100% מהשערים-האנושיים (G10/INV-LRN1).** מסירים משטח/ערוץ **כפול**, לא שער. זו ההתאמה בין "פשטות-הפעלה" ל-G10.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. ממצאים לפי אשכול
|
||||||
|
|
||||||
|
לכל אשכול: משטחים שקוטלגו · ממצאים מאומתים (file:line) · כיוון-היעד. הפירוט המלא (כל אלמנט + כל מקור) נשמר בפלט-הסריקה ([`data/audit/`](../data/audit/)).
|
||||||
|
|
||||||
|
### 2.1 תיקים (`/`, `/archive`, `/cases/[n]`, `/compose`)
|
||||||
|
**3 משטחים · 2 ממצאים.** מחלה: תוכן-ההחלטה מפוצל ל-2 משטחי-כתיבה עצמאיים + עורך-compose שלישי.
|
||||||
|
|
||||||
|
| ID | סוג | ממצא | file:line | תיקון |
|
||||||
|
|----|-----|------|-----------|-------|
|
||||||
|
| CAS-1 | sync-gap | `DraftsPanel` (העלאת DOCX) לא מבטל `['decision-blocks']` → `DecisionBlocksPanel` מציג `source_of_truth='blocks'` תקוע; אזהרת-הסטייה לא מופיעה עד רענון ידני | exports.ts:103-107 מול decision-blocks.ts:46-49; app.py:2673 | add-invalidation |
|
||||||
|
| CAS-2 | sync-gap | `useExportDocx` לא מבטל `['decision-blocks']` — אותו שורש | exports.ts:80-82 | add-invalidation |
|
||||||
|
|
||||||
|
**יעד:** workspace-החלטה אחד (block-editing + DOCX-פעיל) עם **מחוון-מקור-אמת אחד** בבעלות-המערכת ו-cache-slice משותף; אזור "השלמה והעברה" אחד לכל שערי-סיום-התיק.
|
||||||
|
|
||||||
|
### 2.2 אישורים + הערות-יו"ר (`/approvals`, `/feedback`)
|
||||||
|
**3 משטחים · 6 ממצאים.** מחלה: `/api/chair/pending` גוזר 4 מונים, אך כל משטח-משימה מבטל רק את ה-cache שלו ולא את ה-aggregator → התיבה והתג-בסרגל תקועים עד 60ש'.
|
||||||
|
|
||||||
|
| ID | סוג | ממצא | file:line | תיקון |
|
||||||
|
|----|-----|------|-----------|-------|
|
||||||
|
| APR-1 | sync-gap | פתרון הערה ב-`/feedback` לא מבטל `['chair','pending']` → מונה `/approvals` והתג תקועים | feedback.ts:105; chair.ts:36; app-shell.tsx:336 | add-invalidation |
|
||||||
|
| APR-2 | duplication | הערות-יו"ר ב-2 caches (`['feedback']` מול `['chair','pending']`) ללא הצלבה — שני endpoints על אותה `chair_feedback WHERE NOT resolved` | app.py:5650,5654 | add-invalidation |
|
||||||
|
| APR-3 | wrong-data | דגימת-ההערות ב-`/approvals` יכולה להראות 5 ישנות בעוד המונה כבר 0 | app.py:5650-5654; chair.ts:36 | fix-data |
|
||||||
|
| APR-4 | sync-gap | `ApprovalsBadge` בסרגל תקוע אחרי פתרון-הערה/אישור-הלכה/העלאת-פסיקה | app-shell.tsx:336; feedback.ts:105; missing-precedents.ts:256-258; precedent-library.ts:648,668 | add-invalidation |
|
||||||
|
| APR-5 | sync-gap | אישור-הלכה לא מבטל `['chair','pending']` | precedent-library.ts:648,668; app.py:5619-5620 | add-invalidation |
|
||||||
|
| APR-6 | sync-gap | העלאת/סגירת פסיקה-חסרה לא מבטל `['chair','pending']` | missing-precedents.ts:256-258; app.py:5636-5637 | add-invalidation |
|
||||||
|
|
||||||
|
**יעד:** `/approvals` = תיבת-הגייטים הקנונית היחידה; `['chair','pending']` = מקור-אמת יחיד ל"מה ממתין"; התג בסרגל = המונה היחיד; **הערות-יו"ר יורד מהניווט-הראשי** והופך לכרטיס-משימה מתוך התיבה.
|
||||||
|
|
||||||
|
### 2.3 פסיקה (`/precedents`, `/missing-precedents`, `/digests`, `/precedents/[id]`, `/graph`)
|
||||||
|
**13 משטחים · 5 ממצאים.** מחלה: 3 קורפוסים אמיתיים ושונים — אך **מתפעלים שונה** ומבלבלים בשמות.
|
||||||
|
|
||||||
|
| ID | סוג | ממצא | file:line | תיקון |
|
||||||
|
|----|-----|------|-----------|-------|
|
||||||
|
| PRE-1 | confusing | שני namespaces כמעט-זהים: `/api/precedents/search` (typeahead לתיק) מול `/api/precedent-library/search` (חיפוש-קורפוס) | app.py:3109 מול 6057 | clarify (rename/label) |
|
||||||
|
| PRE-2 | dead | `GET /api/precedent-library/queue/pending` — אפס צרכני-frontend (רק digests משתמש ב-queue/pending) | app.py:6282 | delete |
|
||||||
|
| PRE-3 | wrong-data | `AuthorityBadge` (binding/persuasive, DERIVED) מוצג בתור-הביקורת אך **נשמט בחיפוש** | library-search-panel.tsx:26-73 מול halacha-review-panel.tsx:109 | fix-data |
|
||||||
|
| PRE-4 | confusing | תג "ממתין" ב-`/digests` נראה לחיץ אך אינו (ב-`/precedents` הוא טאב-תור אמיתי) | digests/page.tsx:23-35 | clarify |
|
||||||
|
| PRE-5 | dead | `HalachaCard` בחיפוש לא מרנדר authority אף שהשדה על החוט | library-search-panel.tsx:26-73 | fix-data |
|
||||||
|
|
||||||
|
**יעד:** 3 הקורפוסים נשארים נפרדים (גבול אמיתי — G2/INV-DIG1) אך **מתפעלים אחיד**: שם-חיפוש עקבי לכל קורפוס, תבנית-"ממתין" אחת, authority מוצג בכל מקום. מחיקת ה-endpoint המת.
|
||||||
|
|
||||||
|
### 2.4 למידה + סגנון (`/training` — 6 טאבים + CorpusDetailDrawer) ⚠️ האשכול הקריטי
|
||||||
|
**8 משטחים · 10 ממצאים.** מחלה: "לקח" חי ב-2 namespaces ומאושר ב-2 מקומות שכותבים ל-2 ערוצי-כותב; 3 KPI על דגלים-ללא-צרכן.
|
||||||
|
|
||||||
|
| ID | סוג | ממצא | file:line | תיקון |
|
||||||
|
|----|-----|------|-----------|-------|
|
||||||
|
| LRN-1 | sync-gap | כפתור `applied_to_skill` ("אומץ לסקייל") **אינפורמטיבי-בלבד** — לא כותב ל-SKILL.md; היו"ר מאמין שהפעולה הושלמה | lessons-tab.tsx:12-14; app.py:1471-1475 | fix-data (להסיר) |
|
||||||
|
| LRN-2 | confusing | למידה מפוצלת ל-`/api/learning` + `/api/training` לאותה ישות | learning.ts; training.ts; app.py:1448,4616 | clarify (לאחד) |
|
||||||
|
| LRN-3 | confusing | **שני שערי-אישור ללא יחס אכוף** — `promote` מתעלם מ-`review_status` לגמרי | learning-panel.tsx:89-150; lessons-tab.tsx:168-179; app.py:4574 | clarify (שער אחד) |
|
||||||
|
| LRN-4 | wrong-data | `StyleReportPanel`: "12 מתוך 487 שחולצו" — `signature_phrases` ו-`total_patterns` מחושבים עצמאית; אין יחס-תת-קבוצה | style-report-panel.tsx:87-90 | fix-data |
|
||||||
|
| LRN-5 | wrong-data | `findings_applied` ("ממצאים שאומצו ל-SKILL: 42") סופר דגל-אינפורמטיבי → KPI "מזויף" | curator-portrait-panel.tsx:85-86; app.py:1300-1302 | fix-data |
|
||||||
|
| LRN-6 | sync-gap | מחיקת-קורפוס לא מאפסת בחירת `ComparePanel` → submit מחזיר 404 | compare-panel.tsx:119-120; training.ts:172-174 | fix-data |
|
||||||
|
| LRN-7 | keep | `FullTextLazy` ב-raw-fetch מחוץ ל-Query — שביר לעתיד, לא באג חי | corpus-detail-drawer.tsx:320-348 | keep |
|
||||||
|
| LRN-8 | sync-gap | מחיקת-קורפוס מייתמת צ'אטים (`style_corpus_id→NULL`) בשקט, ללא אזהרה | corpus-panel.tsx:45-54; db.py:234 | add-invalidation |
|
||||||
|
| LRN-9 | keep | סינון `PatternsForSubtype` stubbed (אין endpoint) — fallback חינני | corpus-detail-drawer.tsx:351-353 | keep |
|
||||||
|
| LRN-10 | sync-gap | `usePromoteLearning` מבטל רק `learningKeys`, לא `lessonsKeys.forCorpus` → LessonsTab תקוע | learning.ts:104-115; training.ts:499-502 | add-invalidation |
|
||||||
|
|
||||||
|
**יעד:** תיבת-אישור-למידה אחת (מקובצת לפי זוג draft↔final) · **ערוץ-כותב אחד + סטטוס "זורם-לכותב" אחד** (`review_status='approved'`) · **הסרת `applied_to_skill`** (אוצרות SKILL.md = מעשה-git ידני, לא כפתור) · כל artifact תלוי בזוג שלו (progressive disclosure) · תיקון 2 ה-KPI.
|
||||||
|
|
||||||
|
### 2.5 מתודולוגיה (`/methodology` — 5 טאבים)
|
||||||
|
**2 משטחים · 8 ממצאים.** מחלה: כללי-הכותב נערכים מ-2 משטחים שכותבים לאותה שורה `appeal_type_rules(_global, …, 'universal')` — מירוץ lost-update + פער-cache.
|
||||||
|
|
||||||
|
| ID | סוג | ממצא | file:line | תיקון |
|
||||||
|
|----|-----|------|-----------|-------|
|
||||||
|
| MET-1 | sync-gap | `promote` מבטל `['learning']` בלבד; `/methodology` (`['methodology',cat]`, staleTime 30ש') תקוע אחרי אישור | learning.ts:113; methodology.ts:26-28; app.py:4629-4631 | add-invalidation |
|
||||||
|
| MET-2 | duplication | `discussion_rules['universal']` נכתב ב-2 מקומות (PUT מול promote) — כתיבה-שנייה דורסת בשקט | discussion-rules-panel.tsx:35-36; learning-panel.tsx:138-139; app.py:4491-4495,4629; db.py:290 | fix-data |
|
||||||
|
| MET-3 | duplication | `transition_phrases['universal']` — אותו מירוץ | methodology/page.tsx:45-49; learning-panel.tsx:125-129; app.py:4631 | fix-data |
|
||||||
|
| MET-4 | confusing | `universal` מוצג כדלי-תוצאה אח, אך בפועל **מוקדם (prepended)** לכל התוצאות — אין מודל-מנטלי | discussion-rules-panel.tsx:16-22; lessons.py:376-379 | clarify |
|
||||||
|
| MET-5 | dead | ז'רגון `T15`/`T7` בטקסט-העזר — מזהי-משימות פנימיים חסרי-משמעות למפעיל | methodology/page.tsx:48,55 | fix-data |
|
||||||
|
| MET-6 | wrong-data | עורך-צ'קליסטים מציג 5 סוגי-ערר ללא מיפוי איזה `appeal_type` צורך כל אחד | content-checklists-panel.tsx:17-31; app.py:4414 | clarify |
|
||||||
|
| MET-7 | confusing | 3 מושגי-"כלל" מתערבבים (ratios/rules/checklists) ללא מודל-תחולה | methodology/page.tsx:16-19; block_writer.py:912-923 | clarify |
|
||||||
|
| MET-8 | sync-gap | סדר-callbacks ב-promote → toast-הצלחה אחרי invalidation לא-מספק | learning.ts:112-113; learning-panel.tsx:138-143 | add-invalidation |
|
||||||
|
|
||||||
|
**יעד:** `/methodology` = העורך הקנוני **היחיד** (כל כתיבה דרך PUT אחד, עם תג-מקור "ידני/מאומץ-מלמידה"); הלמידה **מנותבת דרכו** (לא כותבת-במקביל) ומבטלת את שני ה-caches; explainer-תחולה inline; קופי בעברית-פשוטה (בלי T7/T15).
|
||||||
|
|
||||||
|
### 2.6 תפעול + אבחון + הגדרות (`/operations`, `/diagnostics`, `/settings`, `/skills`)
|
||||||
|
**5 משטחים · 6 ממצאים.** מחלה: 4 משטחים שמריצים שאילתות-מקור זהות בלי cache משותף + נתונים-מתים/מטעים.
|
||||||
|
|
||||||
|
| ID | סוג | ממצא | file:line | תיקון |
|
||||||
|
|----|-----|------|-----------|-------|
|
||||||
|
| ADM-1 | sync-gap | `halacha_backlog` מוחזר מה-backend אך **נזרק** ב-frontend (אין בטיפוס, לא מרונדר) | app.py:2253; system.ts:21-32; diagnostics/page.tsx | fix-data (לרנדר/להסיר) |
|
||||||
|
| ADM-2 | sync-gap | מוני-הלכות כפולים ב-`/operations` ו-`/approvals` ללא קישור-cache | operations.ts:60; chair.ts:36; app.py:6520,5619-5633 | add-invalidation (consolidate) |
|
||||||
|
| ADM-3 | sync-gap | מוני-פסיקה-חסרה כפולים ב-`/operations` ו-`/approvals` | operations.ts:60; app.py:6521,5636-5647 | add-invalidation (consolidate) |
|
||||||
|
| ADM-4 | confusing | `court_fetch`: "בתור" כולל failed, מטשטש pending מול queued | operations/page.tsx:286-304; app.py:6562 | clarify |
|
||||||
|
| ADM-5 | sync-gap | עריכת env ב-Coolify לא מרעננת את ערך-ה-Container ולא מזהירה על staleness עד redeploy | env-var-row.tsx:76-96; settings.ts:135 | fix-data |
|
||||||
|
| ADM-6 | wrong-data | מוני-סוכנים מסכמים רק חברות-Paperclip זמינות → עומק-תור מוקטן בשקט כשחברה לא-נטענת | app.py:6667-6689; operations/page.tsx:461-465 | clarify (להציג חלקיות) |
|
||||||
|
|
||||||
|
**יעד:** **`/approvals`=תיבת-ההחלטות** (כל גייט נפעל רק כאן; `/operations` מצביע ולא משכפל) · **`/operations`=משטח-קריאה יחיד** (בולע את `/diagnostics`, מרנדר `halacha_backlog`, מתקן queued/pending, מציג חלקיות) · **`/settings`=תצורה** (עריכת-env שמשלימה-את-עצמה: סימון-staleness + redeploy באותה שורה).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. עדכוני-ספ מומלצים (מתועדים ב-X17)
|
||||||
|
הסריקה זיהתה ש-X6 לא מכסה את שכבת-ה-UI-state, וש-07-learning מסנקצן בטעות שני-ערוצים. ההמלצות (כל אחת מגובת-מקורות ב-X17):
|
||||||
|
1. **X6 — invariants חדשים בשכבת-UI:** (א) aggregate-נגזר = מקור-אמת; כל mutation לטבלת-מקור חייב לבטל את ה-queryKey שלו; אסור מונה-מתחרה client-side. (ב) למונה-גייט בעלים-משטח-יחיד; אחרים מצביעים. (ג) שדה ב-OpenAPI-response — לרנדר או להסיר (אסור לזרוק בשקט). (ד) אסור להציג aggregate מדויק כש-partial-failure השמיט תורם — להציג חלקיות.
|
||||||
|
2. **07-learning §0.4/§0.6:** שער-אישור **אחד**, טרנזקציית-כותב **אחת**, `applied_to_skill` מוסר; לקחים-מאושרים נכתבים רק דרך מסלול-המתודולוגיה היחיד.
|
||||||
|
3. **00-constitution G2 "הפרות ידועות":** להוסיף את תאום-המתודולוגיה (`discussion_rules['universal']` נכתב ע"י PUT וגם promote).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. הבא — בקלוג-איחוד (פאזה F)
|
||||||
|
מסמך זה **ממפה ומאבחן**; הוא אינו משנה קוד. הבקלוג המתועדף (TaskMaster, מקושר לכל ממצא) נגזר ב-#127.6 ומחולק ל-3 גלים:
|
||||||
|
- **גל-1 (זול, גבוה-ערך):** הוספת-invalidation ל-16 פערי-הסנכרון + תיקון 6 הנתונים-השגויים + מחיקת המתים. תיקון מקומי, אין הגירת-IA.
|
||||||
|
- **גל-2 (איחוד-משטחים):** תיבת-אישור אחת · ערוץ-למידה אחד (הסרת `applied_to_skill`, איחוד שני-השערים) · `/operations`⊇`/diagnostics`.
|
||||||
|
- **גל-3 (ניווט):** הורדת `/feedback` מהראשי · שמות-חיפוש עקביים · X17 ל-canonical.
|
||||||
|
|
||||||
|
**הכרעת-יו"ר נדרשת לפני גל-2/3** (3א — עוצרים על המסמך).
|
||||||
122
docs/legal-principles-redesign.md
Normal file
122
docs/legal-principles-redesign.md
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
# עיצוב-מחדש: עקרונות משפטיים (לשעבר "הלכות")
|
||||||
|
|
||||||
|
> **מקור-ההחלטה:** chaim, 2026-06-19. נולד תוך תכנון סינתזת-`canonical_statement`, כשהתגלה
|
||||||
|
> שהקורפוס תפח ל-5,243 "הלכות" (18.8 לפסק, 1,820 מהחלטות הוועדה עצמה) — מודל מושגי שגוי.
|
||||||
|
> מסמך זה הוא מקור-האמת ליוזמה עד שיוטמע ב-`docs/spec/`.
|
||||||
|
|
||||||
|
## 1. הבעיה
|
||||||
|
|
||||||
|
מערכת-החילוץ הקיימת תייגה כל פרופוזיציה-משפטית כ"הלכה" וחילצה ~18.8 לכל פסק, ללא תקרה,
|
||||||
|
ללא הבחנת-מקור, ובאישור-אוטומטי חד-מודלי (confidence ≥0.80). תוצאה: 5,243 רשומות —
|
||||||
|
מנופחות ומתויגות-שגוי. **ועדת ערר מיישמת דין; היא אינה יוצרת הלכה.** קריאה ל-1,820
|
||||||
|
פרופוזיציות מהחלטות-הוועדה "הלכות" שגויה משפטית.
|
||||||
|
|
||||||
|
## 2. מודל-המושגים החדש
|
||||||
|
|
||||||
|
מטרייה: **עקרונות משפטיים**. שני תת-סוגים לפי מקור:
|
||||||
|
|
||||||
|
| מקור (`case_law.source_kind`) | מונח | מחייב? |
|
||||||
|
|---|---|---|
|
||||||
|
| פס"ד מחוזי/עליון (external, binding) | **הלכה** | תקדים מחייב |
|
||||||
|
| החלטת ועדת-ערר (`internal_committee`) | **כלל פרשני** | לא-מחייב; פרשנות/כלל-החלה שהוועדה גיבשה |
|
||||||
|
|
||||||
|
## 3. אלגוריתם-החילוץ החדש (חל על שני המקורות)
|
||||||
|
|
||||||
|
```text
|
||||||
|
1. 3 מודלים שונים (Claude מקומי + DeepSeek + Gemini) מנתחים לעומק את הפסק;
|
||||||
|
כל מודל מציע מועמדים, כל מועמד עם ציון 0-1.
|
||||||
|
2. התאמה סמנטית בין שלושת המודלים → סט-מועמדים מאוחד; לכל מועמד:
|
||||||
|
votes = כמה מודלים זיהו/אימצו אותו (1-3)
|
||||||
|
score = ממוצע הציונים של המצביעים בלבד
|
||||||
|
3. דדופ מול הקורפוס (V41 lookup-before-insert, cosine ≥ HALACHA_CANONICAL_THRESHOLD):
|
||||||
|
• מוכר → קישור ל-canonical קיים (instance/citation). לא נספר במכסה → משחרר סלוט.
|
||||||
|
• חדש → מועמד לעיקרון חדש.
|
||||||
|
4. כלל-אישור על מועמדים חדשים:
|
||||||
|
votes = 3 → APPROVED מיידי (גם אם score < 0.85)
|
||||||
|
votes ≥ 2 AND score ≥ 0.85 → APPROVED
|
||||||
|
votes = 2 AND score < 0.85 → pending_review (שער-יו"ר, G10) [ברירת-מחדל]
|
||||||
|
votes = 1 → DROP (לא עיקרון אמיתי) [ברירת-מחדל]
|
||||||
|
5. תקרה: עד 5 עקרונות חדשים לפסק. אם >5 עוברים — בוחרים 5 לפי score יורד. [ברירת-מחדל]
|
||||||
|
מקושרים-מוכרים (שלב 3) אינם נספרים בתקרה.
|
||||||
|
```
|
||||||
|
|
||||||
|
**ברירות-מחדל הנדסיות (ניתנות-לכיול ב-config):** מקרה-גבול (2 הצבעות, score<0.85) → יו"ר ולא
|
||||||
|
פח; בחירת 5 כש->5 עוברים → לפי score; הצבעה-יחידה → drop.
|
||||||
|
|
||||||
|
## 4. סינון רטרואקטיבי
|
||||||
|
|
||||||
|
אותו פאנל-3 + תקרת-5 + כלל-0.85 ירוץ על **5,243 הקיימים**, מקובצים לפי פסק-המקור:
|
||||||
|
לכל פסק — להפעיל את האלגוריתם, לשמור את הניצולים (≤5), לסמן את השאר `rejected` (הפיך,
|
||||||
|
גיבוי SQL/CSV ל-`data/audit/`). מודל על מהלך-הניקוי 2026-06-03 (`docs/halacha-strict-rubric.md`)
|
||||||
|
ועל `halacha_panel_approve.py` הקיים.
|
||||||
|
|
||||||
|
## 5. תשתית קיימת לבנות עליה
|
||||||
|
|
||||||
|
- **פאנל תלת-מודלי:** `scripts/halacha_panel_approve.py` (Claude מקומי + DeepSeek + Gemini,
|
||||||
|
KEEP_SYSTEM) — אותם 3 מודלים מ-gold-set (AC1=0.92). מקור-הצבעות.
|
||||||
|
- **דדופ/קישור V41:** `db.nearest_canonical_halacha` (cosine), lookup-before-insert בחילוץ.
|
||||||
|
- **ולידטורים:** `services/halacha_quality.py` (non_decision/application/thin/quote/NLI).
|
||||||
|
- **רובריקה:** `docs/halacha-strict-rubric.md` (6 עילות-חיתוך).
|
||||||
|
- **שער-מקור:** `db.EXTRACTION_ELIGIBLE_PREDICATE` (db.py:7171) — נקודת-הזרקת תקרת/תיוג.
|
||||||
|
- **סינתזה:** `services/canonical_synthesis.py` + `backfill_canonical_synthesis.py` (כבר נבנו;
|
||||||
|
יחולו על הניצולים בשם החדש — פאזה אחרונה).
|
||||||
|
|
||||||
|
## 6. פאזות-ביצוע (מוצע)
|
||||||
|
|
||||||
|
| # | פאזה | תוכן | תלות |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **0** | עצירה | הקפאת ריצת-הסינתזה המלאה (בוצע) | — |
|
||||||
|
| **A** | מודל-הצבעות משותף | שירות `panel_extraction` — 3 מודלים, התאמה סמנטית, votes+mean-score, כלל-אישור. מקור-יחיד ל-B ו-C (G2) | — |
|
||||||
|
| **B** | רף להבא | חיבור A ל-`halacha_extractor`: תקרת-5, דדופ-משחרר-סלוט, תיוג הלכה/כלל-פרשני לפי מקור. מחליף auto-approve חד-מודלי | A |
|
||||||
|
| **C** | סינון רטרואקטיבי | סקריפט-batch מריץ A על 5,243 לפי פסק; ניצולים≤5; השאר rejected (הפיך) | A |
|
||||||
|
| **D** | שם | "הלכה"→הלכה/כלל-פרשני/עקרונות; UI + תיאורי-כלים + תיעוד. rename-DB מלא = אופציונלי-נפרד | — |
|
||||||
|
| **E** | סינתזה | `canonical_synthesis` על הניצולים, בשם החדש | C, D |
|
||||||
|
|
||||||
|
**סדר-בנייה מומלץ:** A → (B ‖ D) → C → E. A הוא הליבה המשותפת; D (שם) עצמאי ובטוח להקדים.
|
||||||
|
|
||||||
|
## 7. Invariants
|
||||||
|
|
||||||
|
מקיים: 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 (סינתזה על הניצולים).
|
||||||
203
docs/operations-runbook.md
Normal file
203
docs/operations-runbook.md
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
# Operations Runbook — עוזר משפטי
|
||||||
|
|
||||||
|
> תוכן תפעולי-עומק שהוצא מ-[`CLAUDE.md`](../CLAUDE.md) כדי לרזות את ההקשר הנטען בכל סשן (TaskMaster #107.1).
|
||||||
|
> ה-CLAUDE.md מחזיק את **הכללים הקריטיים בקצרה**; כאן נמצאים הפרטים המלאים, הפקודות, וטבלאות-הייחוס.
|
||||||
|
> כשעובדים על Deploy, Paperplip-ops, או adapters — לקרוא את הסעיף הרלוונטי כאן.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## שרת Nautilus (158.178.131.193)
|
||||||
|
|
||||||
|
| שירות | תפקיד | כתובת |
|
||||||
|
|-------|--------|-------|
|
||||||
|
| Coolify | ניהול containers | `http://158.178.131.193:8000` |
|
||||||
|
| PostgreSQL + pgvector | בסיס נתונים ראשי | `legal-ai-postgres` (`localhost:5433`, user `legal_ai`) |
|
||||||
|
| Redis | תור משימות | `legal-ai-redis` |
|
||||||
|
| Gitea | מאגר קוד | `gitea.nautilus.marcusgroup.org/ezer-mishpati` |
|
||||||
|
| ezer-mishpati-web | ממשק העלאת מסמכים (Docker/Coolify) | `legal-ai.nautilus.marcusgroup.org` |
|
||||||
|
| Paperclip | סוכן AI — מריץ Claude Code agents (pm2, מקומי) | `localhost:3100` |
|
||||||
|
| legal-chat-service | גשר claude CLI לטאב הצ'אט ב-/training (pm2, loopback) | `127.0.0.1:8770` |
|
||||||
|
| Infisical | ניהול סודות | `secret.dev.marcus-law.co.il` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ארכיטקטורת Deploy — חובה לקרוא
|
||||||
|
|
||||||
|
שלושה מודלי-הרצה דרים יחד. ערבוב ביניהם הוא הטעות הנפוצה ביותר.
|
||||||
|
|
||||||
|
### עוזר משפטי (Legal-AI) — Docker container דרך Coolify
|
||||||
|
- UUID: `gyjo0mtw2c42ej3xxvbz8zio` (build_pack: `dockerimage`, **לא** `dockerfile`)
|
||||||
|
- שינוי קוד ב-`web/` או `web-ui/` **לא נכנס לתוקף** עד ש:
|
||||||
|
1. עושים `git commit` + `git push origin main`
|
||||||
|
2. Gitea Actions בונה image → דוחף ל-registry → מפעיל redeploy ב-Coolify (`mcp__coolify__deploy`)
|
||||||
|
3. ממתינים ~2-4 דקות לבנייה
|
||||||
|
- **אסור** לנסות להריץ uvicorn / `next dev` מקומית — אין סביבת Python על המכונה
|
||||||
|
- ה-container מריץ Next.js (`:3000`, חשוף) + FastAPI (`:8000`, פנימי)
|
||||||
|
- בדיקה: `curl https://legal-ai.nautilus.marcusgroup.org/api/health`
|
||||||
|
- runbook מלא של ה-pipeline: `~/CI-CD-MIGRATION-GUIDE.md`
|
||||||
|
|
||||||
|
### Paperclip — מקומית דרך pm2
|
||||||
|
- פורט: `localhost:3100`, DB: `localhost:54329` (Postgres embedded)
|
||||||
|
- שינויי קוד נכנסים לתוקף אחרי `pm2 restart paperclip`
|
||||||
|
- **אין צורך ב-Docker או Coolify** (מיגרציה ל-Coolify נוסתה 2026-04-04 והוחזרה 2026-04-08)
|
||||||
|
- תרגום/RTL: `~/.paperclip/hebrew/` → `bash ~/.paperclip/hebrew/apply-hebrew.sh && pm2 restart paperclip`
|
||||||
|
|
||||||
|
### legal-chat-service — מקומית דרך pm2 (מאפריל 2026)
|
||||||
|
- פורט: `127.0.0.1:8770` (loopback בלבד)
|
||||||
|
- שירות aiohttp קצר שעוטף את `claude` CLI ב-streaming + session continuation, ומשרת את הטאב "שיחה" בדף `/training`. הקונטיינר משדל אליו proxy דרך `host.docker.internal:8770`.
|
||||||
|
- קוד: [`mcp-server/src/legal_mcp/chat_service/`](../mcp-server/src/legal_mcp/chat_service/)
|
||||||
|
- התקנה: `pm2 start /home/chaim/legal-ai/scripts/legal-chat-service.config.cjs && pm2 save`
|
||||||
|
- בריאות: `curl http://127.0.0.1:8770/health` → `{"ok":true,...}`
|
||||||
|
- שינויי קוד: `pm2 restart legal-chat-service`
|
||||||
|
- **אפס עלות API** — claude CLI משתמש ב-claude.ai subscription של chaim. הנחת היסוד של `claude_session.py` (claude CLI מקומי בלבד) נשמרת.
|
||||||
|
- Coolify dependency: ה-Service Definition של legal-ai חייב להכיל `extra_hosts: host.docker.internal:host-gateway` (אחרת ה-proxy יקבל ConnectError).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## מבנה תיקיות
|
||||||
|
|
||||||
|
```
|
||||||
|
/home/chaim/legal-ai/
|
||||||
|
├── CLAUDE.md ← אינדקס דק (כללים קריטיים + מצביעים)
|
||||||
|
├── docs/operations-runbook.md ← הקובץ הזה (עומק תפעולי)
|
||||||
|
├── Dockerfile ← Docker build
|
||||||
|
├── docs/ ← תיעוד + לקחים
|
||||||
|
│ ├── architecture.md ארכיטקטורה
|
||||||
|
│ ├── block-schema.md 12 בלוקים (המסמך החשוב ביותר)
|
||||||
|
│ ├── migration-plan.md תוכנית מעבר vault → DB
|
||||||
|
│ ├── legal-decision-lessons.md לקחים מ-3 החלטות
|
||||||
|
│ └── memory.md הקשר כללי — skills, פרויקטים
|
||||||
|
├── skills/ ← כלי עבודה ומדריכים
|
||||||
|
│ ├── decision/ מדריך סגנון + references + 12 בלוקים
|
||||||
|
│ ├── assistant/ קטלוג מסמכים
|
||||||
|
│ ├── docx/ עיצוב DOCX
|
||||||
|
│ ├── dafna-decision-template/ export DOCX לפי תבנית Word של דפנה
|
||||||
|
│ └── new-company-setup/ blueprint הוספת חברה חדשה
|
||||||
|
├── .claude/
|
||||||
|
│ └── agents/ ← הוראות סוכנים + HEARTBEAT.md (symlinks ב-Paperclip)
|
||||||
|
│ ├── HEARTBEAT.md checklist הפעלה משותף לכל הסוכנים
|
||||||
|
│ ├── legal-ceo.md תזמורן + בקרת זרימה
|
||||||
|
│ ├── legal-writer.md כתיבת בלוקים בסגנון דפנה
|
||||||
|
│ ├── legal-analyst.md ניתוח משפטי + חילוץ טענות
|
||||||
|
│ ├── legal-researcher.md חיפוש תקדימים
|
||||||
|
│ ├── legal-qa.md 7 שערי איכות
|
||||||
|
│ ├── legal-proofreader.md תיקון OCR
|
||||||
|
│ ├── legal-exporter.md ייצוא DOCX סופי
|
||||||
|
│ └── hermes-curator.md סוכן Hermes לניתוח סגנון post-export
|
||||||
|
├── data/
|
||||||
|
│ ├── training/ ← 4 החלטות לאימון (DOCX)
|
||||||
|
│ ├── exports/ ← טיוטות DOCX מיוצאות
|
||||||
|
│ └── cases/{case-number}/ ← תיקי עררים (מבנה שטוח, סטטוס ב-DB)
|
||||||
|
├── web/ ← FastAPI backend (Python): 75+ API endpoints
|
||||||
|
│ ├── app.py ← API ראשי
|
||||||
|
│ ├── paperclip_api.py ← אינטגרציית Paperclip: `pc_request()` + `emit_case_status_webhook()`
|
||||||
|
│ ├── paperclip_client.py ← legacy client (ישן — השתמש ב-paperclip_api.py)
|
||||||
|
│ └── gitea_client.py ← אינטגרציית Gitea
|
||||||
|
├── web-ui/ ← Next.js frontend (TypeScript/React): ממשק המשתמש
|
||||||
|
│ └── next.config.ts ← proxy: /api/* → FastAPI :8000
|
||||||
|
├── mcp-server/ ← MCP server + services + tools
|
||||||
|
├── adapters/ ← Paperclip external adapters
|
||||||
|
│ └── deepseek-paperclip-adapter/ ← `deepseek_local` (Hermes-pinned ל-DeepSeek profile)
|
||||||
|
└── scripts/ ← סקריפטים וכלי עזר (ראה scripts/SCRIPTS.md)
|
||||||
|
└── .archive/ ← סקריפטים שהושלמו (לא להריץ)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Paperclip — כללי אינטגרציה (פירוט מלא)
|
||||||
|
|
||||||
|
> הכללים הקריטיים בתמצית נמצאים ב-[`CLAUDE.md`](../CLAUDE.md). כאן הפירוט המלא, הדוגמאות, וה-"למה".
|
||||||
|
|
||||||
|
### Wakeup API — תמיד דרך API, לעולם לא דרך DB
|
||||||
|
- **הנתיב הנכון**: `POST /api/agents/{agent-id}/wakeup` (לא `/wake`!)
|
||||||
|
- **⚠️ אסור**: `INSERT INTO agent_wakeup_requests` ישירות — זה יוצר רק רשומה בלי `heartbeat_run`, והסוכן **לא יתעורר לעולם**
|
||||||
|
- **⚠️ חובה לשלוח `payload` עם `issueId`** — בלי זה הסוכן מתעורר בלי הקשר (בלי תיק, בלי issue, בלי cwd נכון)
|
||||||
|
- דוגמה נכונה:
|
||||||
|
```json
|
||||||
|
{"source": "automation", "triggerDetail": "system", "reason": "...",
|
||||||
|
"payload": {"issueId": "...", "mutation": "comment", "commentId": "..."}}
|
||||||
|
```
|
||||||
|
- **Board API Key**: שמור ב-DB (`board_api_keys`), auth: `Authorization: Bearer pbk_...`
|
||||||
|
|
||||||
|
### ניתוב comments דרך CEO
|
||||||
|
- כשמשתמש כותב תגובה על issue ב-Paperclip, הפלאגין (`plugin-legal-ai`) מעיר את ה-CEO דרך `ctx.agents.invoke()`
|
||||||
|
- ה-CEO קורא את ה-comment, מחליט על ניתוב, ויוצר issue לסוכן המתאים
|
||||||
|
- כל הסוכנים חייבים לקרוא comments אחרונים לפני שהם מתחילים לעבוד (HEARTBEAT שלבים 2b-2c)
|
||||||
|
|
||||||
|
### קריאות API — תמיד דרך helper, לעולם לא `curl` ישיר
|
||||||
|
- **bash (סוכנים):** `~/legal-ai/scripts/pc.sh <METHOD> <PATH> [BODY_JSON]` — מוסיף Authorization, X-Paperclip-Run-Id, Content-Type, base URL. ראה `HEARTBEAT.md §0`.
|
||||||
|
- **Python (FastAPI):** `from web.paperclip_api import pc_request; await pc_request("POST", "/api/...", json={...})` — שימוש ב-board API key.
|
||||||
|
- **אסור** `curl ... $PAPERCLIP_API_URL` ישיר ב-bash; **אסור** `httpx.AsyncClient` ישיר ל-Paperclip ב-Python.
|
||||||
|
- **למה:** ה-skill הרשמי דורש `X-Paperclip-Run-Id` בכל קריאה משנה issue. אצלנו ה-audit trail עבד ממילא דרך JWT claims (`runId: runIdHeader || claims.run_id`), אבל ה-helper מבטיח עקביות + תאימות ל-board API keys (long-lived) שלא נושאות JWT claims.
|
||||||
|
|
||||||
|
### Cross-company agent sync — אחרי כל שינוי הגדרות
|
||||||
|
- יש 14 סוכנים = 7 × 2 חברות (CMP=1xxx, CMPA=8xxx). Paperclip מחייב `agents.company_id NOT NULL` — אין shared agents.
|
||||||
|
- **Master = CMP (1xxx)**, **Mirror = CMPA (8xxx)**.
|
||||||
|
- אחרי כל שינוי ב-`adapter_config`, `runtime_config`, `budget_monthly_cents`, או skills של סוכן ב-master (UI, SQL, או API), **חובה להריץ:**
|
||||||
|
```bash
|
||||||
|
PAPERCLIP_BOARD_API_KEY=$(...infisical...) \
|
||||||
|
python ~/legal-ai/scripts/sync_agents_across_companies.py --verify # לבדיקה
|
||||||
|
PAPERCLIP_BOARD_API_KEY=$(...) \
|
||||||
|
python ~/legal-ai/scripts/sync_agents_across_companies.py --apply # לסנכרן
|
||||||
|
```
|
||||||
|
- הסקריפט מסנן local skills שלא קיימים ב-CMPA (מציג אזהרה), משתמש ב-API (לא DB ישיר), יוצר revisions, idempotent.
|
||||||
|
- שאלות ה-skill הרשמי של Paperclip — `paperclip` skill תחת `paperclipai/paperclip`.
|
||||||
|
|
||||||
|
### Webhook יוצא — עדכון סטטוס תיק לפלאגין
|
||||||
|
כשסטטוס תיק משתנה דרך `PUT /api/cases/{case_number}`, הבקאנד שולח webhook אסינכרוני לפלאגין:
|
||||||
|
|
||||||
|
```
|
||||||
|
PUT /api/cases/{case_number} → emit_case_status_webhook() [BackgroundTask]
|
||||||
|
→ POST /api/plugins/marcusgroup.legal-ai/webhooks/case-status
|
||||||
|
→ plugin-legal-ai/onWebhook()
|
||||||
|
→ comment בעברית על issue + CEO wakeup (כשסטטוס = qa_failed)
|
||||||
|
```
|
||||||
|
|
||||||
|
- הקוד ב-`web/paperclip_api.py` (`emit_case_status_webhook`), fire-and-forget, timeout 5s
|
||||||
|
- הפלאגין שומר idempotency key ב-state עם TTL 5 דקות למניעת spam על retry
|
||||||
|
- `GET /api/cases/stale?days=N` — תיקים שלא עודכנו N ימים; מוחרגים: `new`, `final`, `exported`
|
||||||
|
- `GET /api/chair-feedback/weekly-summary` — סיכום פידבק YU"R לשבוע האחרון
|
||||||
|
|
||||||
|
### Scheduled Jobs (plugin-legal-ai)
|
||||||
|
| Job | לוח זמנים | מה עושה |
|
||||||
|
|-----|-----------|---------|
|
||||||
|
| `stale-case-reminder` | יומי 08:00 | שולח comment אזהרה על תיקים תקועים >3 ימים |
|
||||||
|
| `weekly-feedback-analysis` | ראשון 19:00 | מעיר CEO לניתוח פידבק YU"R ועדכון `docs/legal-decision-lessons.md` |
|
||||||
|
| `sync-case-status` | כל 30 דק' | מסנכרן סטטוסי תיקים בין legal-ai ל-Paperclip |
|
||||||
|
|
||||||
|
CEO שמתעורר מ-`weekly-feedback-job` כותב לקובץ בלבד — **אין לו issueId, אל תנסה לפרסם comment או לסגור issue**.
|
||||||
|
|
||||||
|
### External adapters — `deepseek_local`
|
||||||
|
- מיקום ה-package: [`adapters/deepseek-paperclip-adapter/`](../adapters/deepseek-paperclip-adapter/) (לא ב-`node_modules`).
|
||||||
|
- רישום ב-Paperclip: רשומה ב-`~/.paperclip/adapter-plugins.json` (נטען אוטומטית ב-startup דרך `buildExternalAdapters`). אין צורך בעריכת `node_modules`.
|
||||||
|
- **מה ה-adapter עושה**: spawnל-`hermes chat` עם `HERMES_HOME=/home/chaim/.hermes/profiles/deepseek` כך שה-CLI טוען את `config.yaml` (`base_url=https://api.deepseek.com/v1`, `provider=custom`, `key_env=DEEPSEEK_API_KEY`) ואת `.env` (שמכיל את ה-key).
|
||||||
|
- **מודלים זמינים** (lookup ב-DeepSeek `/v1/models`): `deepseek-v4-pro` (default), `deepseek-v4-flash`. יופיעו כדרופ-דאון ב-UI.
|
||||||
|
- **התקנה מחדש / עדכון**: `curl -X POST -H "Authorization: Bearer pcapi_legal_install_key_2026" -H "Content-Type: application/json" -d '{"packageName":"/home/chaim/legal-ai/adapters/deepseek-paperclip-adapter","isLocalPath":true}' http://localhost:3100/api/adapters/install`. לעדכון hot — `POST /api/adapters/deepseek_local/reload`.
|
||||||
|
- **⚠ Cross-company sync**: `sync_agents_across_companies.py` **מדלג** על סוכנים עם `adapter_type` שונה בין CMP ל-CMPA. כשעוברים סוכן ל-`deepseek_local` חובה להחיל ידנית בשתי החברות לפני sync.
|
||||||
|
- **תוספת adapters עתידיים** (OpenAI ישיר, Anthropic ישיר, וכו'): אותו דפוס. ה-package הראשי חייב לייצא `createServerAdapter()` שמחזיר `{ type, label, models, agentConfigurationDoc, execute, testEnvironment, sessionCodec, listSkills, syncSkills, ... }`. ראה את [`adapters/deepseek-paperclip-adapter/dist/index.js`](../adapters/deepseek-paperclip-adapter/dist/index.js) כתבנית.
|
||||||
|
|
||||||
|
### External adapters — Hermes Curator (`curator-cmp` / `curator-cmpa`)
|
||||||
|
- פרופילי Hermes נפרדים לסוכן `hermes-curator` — מנתח החלטות סופיות ומציע עדכוני SKILL.md/lessons.md
|
||||||
|
- מיקום: `~/.hermes/profiles/curator-cmp/` + `~/.hermes/profiles/curator-cmpa/`
|
||||||
|
- מופעל אחרי export סופי; אינו מעדכן קבצים ישירות
|
||||||
|
- **תהליך אישור הצעות:** הצעות ה-curator מגיעות כ-comment ב-Paperclip → חיים בוחן ומאשר ידנית → commits ל-`SKILL.md` ו-`docs/legal-decision-lessons.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## הערות יו"ר (Chair Feedback)
|
||||||
|
|
||||||
|
מנגנון לתיעוד הערות דפנה על טיוטות:
|
||||||
|
- **DB**: טבלת `chair_feedback` (case_id, block_id, feedback_text, category, lesson_extracted)
|
||||||
|
- **API**: `GET/POST /api/feedback`, `PATCH /api/feedback/{id}/resolve`
|
||||||
|
- **MCP tools**: `record_chair_feedback`, `list_chair_feedback`
|
||||||
|
- **UI**: דף ניהול ב-`/feedback` (ב-Next.js)
|
||||||
|
- **קטגוריות**: missing_content, wrong_tone, wrong_structure, factual_error, style, other
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ניהול משימות — TaskMaster AI (פירוט)
|
||||||
|
|
||||||
|
- קובץ המשימות הקנוני: `~/legal-ai/.taskmaster/tasks/tasks.json` (יחסי ל-project root, **לא** `~/.taskmaster/tasks/tasks.json`). מכיל את כל ה-tags של legal-ai (`master`, `legal-ai`).
|
||||||
|
- פקודות עיקריות: `get_tasks`, `next_task`, `add_task`, `update_task`, `expand_task`
|
||||||
|
- לפני התחלת עבודה → `next_task`; אחרי סיום → `update_task` עם status=done; משימה מורכבת → `expand_task`
|
||||||
|
- **⚠️ מלכוד cwd ב-CLI:** הדגל `--tag` בוחר קבוצה לוגית *בתוך* הקובץ — הוא **לא** בוחר לאיזה `tasks.json` לכתוב. ה-CLI מאתר את הקובץ לפי ה-cwd. תמיד `cd ~/legal-ai` לפני `task-master add-task` או כל פקודה משנה, ואז אמת ב-MCP `get_tasks`. כשלא בטוחים — לערוך את `~/legal-ai/.taskmaster/tasks/tasks.json` ישירות.
|
||||||
@@ -230,3 +230,48 @@ pm2 start paperclip && pm2 save # reuse ל-cache המת
|
|||||||
- **תוקן ב-start script** ע"י `ensure_patched_before_run()` (06/06/26) — שער סינכרוני שמחלץ+מתקן לפני exec.
|
- **תוקן ב-start script** ע"י `ensure_patched_before_run()` (06/06/26) — שער סינכרוני שמחלץ+מתקן לפני exec.
|
||||||
- **הערה מטעה תוקנה**: ההערה הישנה בראש ה-script טענה ש-`npx run` מחלץ-מחדש בכל הפעלה (לכן הסתמכו על לולאת-הרקע בלבד) — זה לא נכון, npx עושה reuse ל-cache תקין; הסכנה היא cache **מחוק**.
|
- **הערה מטעה תוקנה**: ההערה הישנה בראש ה-script טענה ש-`npx run` מחלץ-מחדש בכל הפעלה (לכן הסתמכו על לולאת-הרקע בלבד) — זה לא נכון, npx עושה reuse ל-cache תקין; הסכנה היא cache **מחוק**.
|
||||||
- **לקח כללי**: כל patch שה-target שלו הוא assert בזמן-startup חייב להיות מוחל לפני `exec`, לא בלולאת-רקע.
|
- **לקח כללי**: כל patch שה-target שלו הוא assert בזמן-startup חייב להיות מוחל לפני `exec`, לא בלולאת-רקע.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. `issue.comment.created` — מזהה-ה-issue ב-`entityId`, לא ב-`payload.issueId`
|
||||||
|
|
||||||
|
### מה קורה
|
||||||
|
|
||||||
|
ל-event `issue.comment.created` שה-host שולח לפלאגין, **מזהה-ה-issue נמצא ב-`event.entityId`** (ה"ישות הראשית" של ה-event), ולא ב-`payload`. ה-`payload` נושא דווקא:
|
||||||
|
- `commentId` — מזהה התגובה
|
||||||
|
- `bodySnippet` — גוף **קצוץ** (לא הטקסט המלא)
|
||||||
|
- `reopened` / `reopenedFrom` — נדלקים כשהתגובה פתחה-מחדש issue ב-`done`
|
||||||
|
|
||||||
|
**אין** `payload.issueId` ו**אין** `payload.body` מלא. מקור-אמת: `@paperclipai/plugin-sdk` `index.d.ts` — `issueId: event.entityId`.
|
||||||
|
|
||||||
|
### ראיה אמפירית — תיק 8124-09-24, CMPA (17/06/26)
|
||||||
|
|
||||||
|
תגובת-משתמש על sub-issue של המנתח המשפטי (במצב `done`) **לא הגיעה ל-CEO**. הניתוב ב-`plugin-legal-ai/src/worker.ts` קרא `payload.issueId` (תמיד `undefined`) ולכן דילג בשקט:
|
||||||
|
|
||||||
|
```
|
||||||
|
WARN [plugin] issue.comment.created event missing issueId in payload, skipping
|
||||||
|
{ entityId: "6eb905ea-…", ← זה ה-issue id האמיתי
|
||||||
|
payload: { commentId: "31e35676-…", bodySnippet: "…", reopened: true,
|
||||||
|
reopenedFrom: "done", identifier: "CMPA-94", … } } ← אין issueId
|
||||||
|
```
|
||||||
|
|
||||||
|
### ההשפעה על הצינור שלנו
|
||||||
|
|
||||||
|
הניתוב **"תגובת-משתמש → CEO"** (CLAUDE.md §"ניתוב comments דרך CEO") היה **מת בשקט** — כל תגובה דולגה. במקרה של תגובה על issue בבעלות ה-CEO זה "עבד" רק במקרה דרך מנגנון reopen-on-comment הנייטיב של Paperclip (פותח-מחדש `done` ומעיר את הסוכן-המשויך). על sub-issue של סוכן אחר, ה-wake הנייטיב כיוון לסוכן הלא-נכון וריצת-ה-CEO בתור בוטלה עם `errorCode: issue_assignee_changed` ("the new owner will be woken instead" — וה"בעלים" ב-`done` ⇒ כלום).
|
||||||
|
|
||||||
|
### תיקון — בצד שלנו (PR ezer-mishpati/plugin-legal-ai#2)
|
||||||
|
|
||||||
|
ב-handler של `issue.comment.created`:
|
||||||
|
1. `issueId = event.entityId` (fallback ל-`payload.issueId` לעמידות מול גרסאות-host).
|
||||||
|
2. גוף-תגובה מלא: התאמת `payload.commentId` מתוך `listComments` (ה-payload נושא רק snippet); fallback ל-latest/snippet.
|
||||||
|
3. **guard לדה-דופ:** אם התגובה פתחה-מחדש issue **שכבר משויך ל-CEO** (`issue.assigneeAgentId === ceoAgentId && payload.reopened`), ה-wake הנייטיב כבר מטפל — מדלגים כדי לא להריץ את ה-CEO פעמיים. לכל issue אחר עדיין מנתבים ל-CEO.
|
||||||
|
|
||||||
|
### אימות (17/06/26)
|
||||||
|
|
||||||
|
תגובת-בדיקה על אותו sub-issue של המנתח (`543f997b`, `done`) לאחר deploy → לוג `Routed user comment to CEO agent` עם `runId`, וריצת-CEO `succeeded` (לא `cancelled`).
|
||||||
|
|
||||||
|
### סטטוס
|
||||||
|
|
||||||
|
- **תוקן בצד שלנו** (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.
|
||||||
|
|||||||
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,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 |
|
||||||
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
|
||||||
123
docs/research/hermes-nous-feasibility.md
Normal file
123
docs/research/hermes-nous-feasibility.md
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
# מחקר-היתכנות: Hermes של Nous Research — האם להטמיע, והאם זה יעזור ללולאת רכישת-הסגנון
|
||||||
|
|
||||||
|
> **TaskMaster #123** (tag `legal-ai`) · תאריך: 2026-06-11 · סטטוס: מחקר הושלם → המלצה להכרעה
|
||||||
|
> **שאלת-העל:** האם הסוכן/מסגרת ה-self-learning של Nous Research — שחיים התכוון אליו במקור בהקמת מנהל-הידע — ניתן ורצוי להטמעה אצלנו, והאם ישפר את לולאת רכישת-הסגנון מעבר לקיים.
|
||||||
|
> **הכרעה בתמצית:** **לדחות אימוץ-מסגרת; לאמץ רעיון אחד ממוקד — GEPA/DSPy (אבולוציית-פרומפט רפלקטיבית) כ-*מַצִּיע* בתת-מערכת רכישת-הסגנון, נמוך-עדיפות, לכשיצטברו זוגות draft↔final.**
|
||||||
|
>
|
||||||
|
> **המשך:** מה אנחנו *באמת* מריצים מ-Hermes היום (ה-CLI כ-runtime, ה-self-learning כבוי), חקירה פורנזית של ה-state, ו-playbook להפעלה-מלאה עתידית → [hermes-runtime-and-self-learning-state.md](hermes-runtime-and-self-learning-state.md) (#126).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. הרקע — מה חשבנו שזה, ומה זה באמת
|
||||||
|
|
||||||
|
הסוכן "הרמס" אצלנו הוא **שם-פרסונה בלבד**: בפועל זהו `deepseek_local` (DeepSeek-V4-Pro) עם פרומפט-קבוע ([hermes-curator.md](../../.claude/agents/hermes-curator.md)), שמנתח החלטות סופיות ו**מציע** עדכוני-לקחים. קוד של Nous מעולם לא שולב (grep=0). הנחת-המוצא של המשימה הייתה שצריך לבדוק אם ה-"self-learning" של Nous הוא מנגנון fine-tuning שמתנגש באילוץ "מודל סגור".
|
||||||
|
|
||||||
|
**הממצא המרכזי הופך את ההנחה:** ה-self-learning של Nous **אינו** fine-tuning, ובמבנה-הממשל שלו הוא **מתכנס כמעט במדויק לארכיטקטורה שכבר בנינו** (propose-only, human-review, semantic-preservation). השאלה האמיתית אינה "האם זה תואם" אלא "**האם זה מוסיף משהו שאין לנו**". התשובה: רעיון אחד — אופטימיזציית-פרומפט אבולוציונית-רפלקטיבית (GEPA).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## א. מה Hermes-agent של Nous *באמת* עושה (מאומת מול ה-repos, לא מהזיכרון)
|
||||||
|
|
||||||
|
יש **שני** repos נפרדים תחת `NousResearch`, שניהם **MIT**:
|
||||||
|
|
||||||
|
### א.1 `NousResearch/hermes-agent` — מסגרת-סוכן (agent framework)
|
||||||
|
"The self-improving AI agent… the only agent with a built-in learning loop." רכיבים (מאומת מ-README + docs):
|
||||||
|
|
||||||
|
| רכיב | מה זה |
|
||||||
|
|------|-------|
|
||||||
|
| **Closed-loop skill learning** | מזקק "Skills" לשימוש-חוזר אוטומטית בסיום כל משימה, שומר בזיכרון מתמיד. תואם תקן פתוח `agentskills.io` (Skills Hub — portable/shareable). |
|
||||||
|
| **Three-layer memory** | זיכרון רב-שכבתי שזוכר העדפות/הרגלים לאורך סשנים. |
|
||||||
|
| **Dialectic user modeling (Honcho)** | בונה מודל מתפתח של "מי אתה" לרוחב סשנים. |
|
||||||
|
| **Agent-curated memory + periodic nudges** | הסוכן "מנדנד" לעצמו לשמר ידע; חיפוש-סשנים FTS5 + סיכום-LLM. |
|
||||||
|
| **Orchestration** | 40+ כלים, מספר terminal backends (local/Docker/SSH/Modal/Daytona), תת-סוכנים מבודדים, scheduler/cron מובנה, ריבוי-פלטפורמות-הודעות (Telegram/Discord/Slack/WhatsApp/Signal/CLI). |
|
||||||
|
| **Model-agnostic** | "Use any model you want — switch with `hermes model`, no code changes." עובד מול Nous Portal / OpenRouter (200+) / OpenAI / **Anthropic** / HF / endpoint מותאם. **אין דרישה למודל פתוח, אין fine-tuning של משקולות.** |
|
||||||
|
|
||||||
|
המסקנה: זוהי **מסגרת-תזמור-סוכנים מלאה** (orchestrator + memory + scheduler + ערוצי-הודעות + skill-hub) — מתחרה מבנית ל-Paperclip, **לא** רכיב-למידה נקודתי.
|
||||||
|
|
||||||
|
### א.2 `NousResearch/hermes-agent-self-evolution` — לב ה-"self-learning"
|
||||||
|
זהו ה-repo שעושה את האבולוציה-העצמית (מאומת מ-README):
|
||||||
|
|
||||||
|
- **מה הוא ממטב:** קבצי-skill (`SKILL.md`), תיאורי-כלים, מקטעי-system-prompt, וקוד-מימוש-כלים. (Phase 1 = קבצי-skill.)
|
||||||
|
- **אלגוריתם:** **DSPy + GEPA** (Genetic-Pareto Prompt Evolution). GEPA מנתח **traces של ריצה**, מבין *סיבות-כשל* ברפלקציה בשפה-טבעית, ומציע שיפורים ממוקדים — לא רק מזהה כשל.
|
||||||
|
- **דרישות-אימון:** **אין GPU, אין fine-tuning.** הכול דרך קריאות-API ("mutating text, evaluating results, selecting best variants"). עלות מוערכת **$2–10 לריצת-אופטימיזציה**.
|
||||||
|
- **הערכת-מועמדים (guardrails):** כל variant חייב לעבור — מערך-בדיקות מלא, מגבלת-גודל (skills ≤15KB), תאימות-caching, **שימור-סמנטי של המטרה המקורית**, ו**סקירת-PR אנושית**.
|
||||||
|
- **החלת-שינויים:** **אין auto-apply.** כל variant עובר "**human review, never direct commit**" ומוצע כ-PR נגד `hermes-agent`.
|
||||||
|
|
||||||
|
**זו ההפתעה:** המודל התפעולי של Nous (propose → guardrails → human-PR → never auto-commit, עם שימור-סמנטי) הוא **שחזור כמעט-מילה-במילה של INV-LRN1/G10 + INV-LRN5 שלנו.** לא צריך "להתאים" אותו — הוא כבר חושב כמונו.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ב. טבלת-תאימות מול ארבעת האילוצים (פסיקה לכל אחד)
|
||||||
|
|
||||||
|
| # | אילוץ | אימוץ-מסגרת (`hermes-agent`) | אימוץ-רעיון (GEPA כמַצִּיע) | פסיקה |
|
||||||
|
|---|-------|------------------------------|-----------------------------|-------|
|
||||||
|
| 1 | **מודל-סגור** (Opus/DeepSeek/Gemini, לא fine-tuning — [project_style_acquisition_goal]) | ✅ model-agnostic, ללא fine-tuning | ✅ GEPA ממטב **טקסט** (פרומפט/skill), לא משקולות; API-only, $2–10 | ✅ **תואם** — זהו בדיוק ה-"prompt-optimization במקום weight-update" שהמשימה זיהתה כהכי-תואם |
|
||||||
|
| 2 | **G12 — שער-הפלטפורמה** ([X15](../spec/X15-agent-platform-port.md), INV-PORT1) | ❌ **מתנגש** — מסגרת-תזמור שלמה (memory/scheduler/ערוצים/subagents) = פלטפורמת-סוכנים מקבילה ל-Paperclip → drift-רוחב, בדיוק מה ש-G12/G2 מייבשים | ✅ חי בשכבת-האינטליגנציה/רכישת-הסגנון, מזין את שער-היו"ר; **אינו** פלטפורמה, אינו נוגע ב-Port | ❌ למסגרת / ✅ לרעיון |
|
||||||
|
| 3 | **INV-LRN1/G10 — אין auto-commit** | ⚠️ ה-memory האוטו-נדנד + יצירת-skill אוטונומית מפרים *אם* ב-auto-commit | ✅ self-evolution **תוכנן** propose-only (human-PR) — זהה למודל שלנו | ✅ **תואם** (הרעיון); ⚠️ המסגרת דורשת גידור |
|
||||||
|
| 4 | **INV-LRN5 — טוהר-הקול** (אין מהות ספציפית) | ⚠️ 3-layer memory + dialectic modeling שומרים תוכן-משתמש ספציפי לרוחב סשנים → זיהום שכבת-הקול | ⚠️ תקין **רק אם** מטריקת-ההערכה היא **מרחק-סגנון** (לא שחזור-מהות), והפלט הוא סגנון/שיטה. יש לנו את המטריקה (`style_distance`, שלב [7] MEASUREMENT) | ⚠️ **בר-ניהול** — חייב metric=style-distance + distillation שמפריד במקור (כבר קיים) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ג. מה זה יפתור שלא קיים? (מול מה שכבר בנינו)
|
||||||
|
|
||||||
|
| יכולת ב-Nous | מקבילה אצלנו | פער-אמיתי? |
|
||||||
|
|--------------|--------------|-------------|
|
||||||
|
| Closed-loop skill distillation | `hermes-curator` + `ingest_final_version` (Opus distillation) + `final_learning_pipeline` | לא — קיים, ומגודר טוב יותר (פאנל דו/תלת-מודלי, #121) |
|
||||||
|
| Three-layer memory / FTS5 recall | קורפוס-סגנון + pgvector + RAG ([03-retrieval](../spec/03-retrieval.md)) | לא — האחזור שלנו עשיר יותר ומכוון-דומיין |
|
||||||
|
| Skill-Hub (agentskills.io) | `skills/decision` + `legal-decision-lessons.md` | לא — שיתוף-קהילתי לא רלוונטי לדומיין-סגור |
|
||||||
|
| Dialectic user modeling | פרופיל-סגנון של דפנה (`/methodology`) | לא — ובמכוון: INV-LRN5 אוסר מידול-מהות |
|
||||||
|
| **GEPA reflective prompt-evolution** | **אין מקבילה** — אנו מתקנים פרומפטים ידנית, ללא אופטימיזציה שיטתית מול eval | ✅ **כן — זה הפער היחיד** |
|
||||||
|
|
||||||
|
**הפער היחיד שמוסיף ערך:** אנו אוספים זוגות `draft↔final` (`draft_final_pairs`, INV-LRN4) אבל **לא ממנפים אותם כ-eval-set שיטתי לשיפור פרומפטי-הכתיבה/פרופיל-הסגנון.** GEPA הוא בדיוק הכלי לכך: לוקח traces (טיוטות שלנו), reflects על *למה* הן רחוקות מהסופי של דפנה, ומציע שיפורי-פרומפט — מדיד מול `style_distance`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ד. חלופות קוד-פתוח שקולות (≥3 מקורות סמכותיים)
|
||||||
|
|
||||||
|
| גישה | מה היא | התאמה לאילוץ מודל-סגור | רלוונטיות לנו |
|
||||||
|
|------|--------|------------------------|---------------|
|
||||||
|
| **GEPA** (Agrawal et al., arXiv:2507.19457, **ICLR 2026 oral**) | אבולוציית-פרומפט רפלקטיבית; reflects על traces בשפה-טבעית | ✅ מושלמת — טקסט בלבד | **גבוהה** — מנצח GRPO (RL) ב-6–20% עם פי-35 פחות rollouts; מנצח MIPROv2 ב-10%+. `pip install gepa` / `dspy.GEPA` |
|
||||||
|
| **DSPy (MIPROv2)** | אופטימיזציית-פרומפט מבוססת-מטריקה | ✅ טובה | בינונית — GEPA עדיף לפי המאמר |
|
||||||
|
| **Reflexion** (Shinn et al., NeurIPS 2023) | "verbal RL" — רפלקציה מילולית בזיכרון-אפיזודי | ✅ טובה | נמוכה — per-task, לא משפר artifact מתמשך |
|
||||||
|
| **Voyager** (Wang et al., 2023) | skill-library מצטברת (Minecraft, lifelong) | ✅ טובה | נמוכה — כבר יש לנו skill-library מגודרת; הרעיון מובנה |
|
||||||
|
| **Generative Agents** (Park et al., 2023) | memory-stream + reflection + retrieval | ✅ | נמוכה — INV-LRN5 אוסר מידול-מהות מתמשך |
|
||||||
|
| **LangGraph long-term memory** | checkpointing + store | ✅ | כבר ב-[X16](../spec/X16-pipeline-durability.md) (התשתית קיימת) |
|
||||||
|
|
||||||
|
**מסקנת-ההשוואה:** מבין כל החלופות, **GEPA היא היחידה שמציעה יכולת חדשה תואמת-אילוץ** (אופטימיזציה שיטתית של artifacts-טקסט מול eval, ללא משקולות). השאר או מובנים כבר אצלנו, או מתנגשים ב-INV-LRN5, או per-task ולא-מתמשכים.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ה. המלצה מנומקת
|
||||||
|
|
||||||
|
### דחה: אימוץ מסגרת `hermes-agent` כפלטפורמה
|
||||||
|
**נימוק:** זוהי פלטפורמת-תזמור-סוכנים מלאה (orchestrator/memory/scheduler/ערוצים) המתחרה מבנית ב-Paperclip. אימוצה = **מסלול-פלטפורמה מקביל** המפר G12/INV-PORT1 ([X15](../spec/X15-agent-platform-port.md)) ויוצר את drift-הרוחב שכל הספ מייבש. כבר הכרענו (יוזמת X15/X16): Paperclip = מעטפת ניתנת-להחלפה מאחורי Port; אין מקום לפלטפורמה שנייה.
|
||||||
|
|
||||||
|
### דחה: אימוץ שכבת-ה-memory/dialectic-modeling
|
||||||
|
**נימוק:** שמירת תוכן-משתמש ספציפי לרוחב סשנים מתנגשת ב-INV-LRN5 (טוהר-הקול). פרופיל-הסגנון שלנו במכוון מופשט.
|
||||||
|
|
||||||
|
### ✅ אמץ-רעיון: GEPA/DSPy כ-*מַצִּיע* בתת-מערכת רכישת-הסגנון
|
||||||
|
**הרעיון הספציפי:** אופטימיזציית-פרומפט רפלקטיבית-אבולוציונית של **פרומפטי-הכתיבה ו/או פרופיל-הסגנון**, ממוטבת מול eval-set של זוגות `draft↔final` (INV-LRN4), עם **מטריקה = `style_distance`** (שלב [7] MEASUREMENT, [07-learning §0.3](../spec/07-learning.md)).
|
||||||
|
|
||||||
|
**למה זה נכנס נקי (לא מסלול-מקביל):**
|
||||||
|
1. **מודל-סגור** ✅ — טקסט בלבד, Opus/DeepSeek דרך adapter, $2–10/ריצה.
|
||||||
|
2. **G12** ✅ — חי ב-`mcp-server/src` / style-acquisition; אינו פלטפורמה; אם צריך wakeup → דרך ה-Port.
|
||||||
|
3. **INV-LRN1/G10** ✅ — מַצִּיע בלבד: GEPA מפיק *variant מוצע* → שער-יו"ר (כמו ה-curator היום). **אין auto-commit.** זה גם המודל של Nous עצמם (human-PR).
|
||||||
|
4. **INV-LRN5** ✅ (מגודר) — eval=style-distance, output=סגנון/שיטה; ה-distillation הקיים מפריד מהות במקור.
|
||||||
|
|
||||||
|
### כיצד זה נכנס דרך ה-Port (אם/כשמאשרים) — תת-משימות מוצעות
|
||||||
|
1. **תנאי-סף (gate על הכדאיות):** לאסוף **N≥~15–20 זוגות `draft↔final` מנותחים** (`analyzed`/`lessons_folded`) — eval-set מינימלי ל-GEPA. כיום הקורפוס ~48 החלטות אך זוגות-מנותחים מעטים → **לכן עדיפות נמוכה כעת**; לפתוח כשהפנקס מתמלא.
|
||||||
|
2. **PoC מבודד:** `scripts/gepa_style_optimize.py` (מקומי, כמו `final_learning_pipeline`) — `dspy.GEPA` ממטב את פרומפט-הכתיבה מול `style_distance`; פלט = variant מוצע + דו"ח-שיפור.
|
||||||
|
3. **שער-יו"ר:** ה-variant מוצג ב-`/training` / כ-comment (דרך ה-Port), דפנה/חיים מאשרים → commit ידני ל-skill/prompt. אכיפת INV-LRN1.
|
||||||
|
4. **מדידה:** השוואת `style_distance` לפני/אחרי על holdout — לאמת שיפור-אמת לפני קיבוע.
|
||||||
|
|
||||||
|
**עדיפות:** נמוכה (priority=low במשימה תואם). זהו שדרוג-איכות עתידי לרכישת-הסגנון, לא חוסר קריטי. **להחליט להפעיל רק כשמצטבר eval-set של זוגות.** הכרעת-תקציב/עדיפות — של חיים.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## מקורות
|
||||||
|
- `NousResearch/hermes-agent` (README + https://hermes-agent.nousresearch.com/docs/) — מסגרת-הסוכן, MIT, model-agnostic.
|
||||||
|
- `NousResearch/hermes-agent-self-evolution` (README) — DSPy+GEPA, API-only, propose-only/human-PR, MIT.
|
||||||
|
- Agrawal et al., **"GEPA: Reflective Prompt Evolution Can Outperform Reinforcement Learning"**, arXiv:2507.19457 (ICLR 2026 oral) — 6–20% מעל GRPO, פי-35 פחות rollouts.
|
||||||
|
- `dspy.GEPA` (dspy.ai) · `CerebrasResearch/gepa` (standalone `pip install gepa`).
|
||||||
|
- Shinn et al., **Reflexion** (NeurIPS 2023) · Wang et al., **Voyager** (2023) · Park et al., **Generative Agents** (2023) — להשוואה.
|
||||||
|
- ספ-פנימי: [07-learning.md](../spec/07-learning.md) (INV-LRN1/4/5) · [X15](../spec/X15-agent-platform-port.md) (G12) · [X16](../spec/X16-pipeline-durability.md) · [hermes-curator.md](../../.claude/agents/hermes-curator.md).
|
||||||
106
docs/research/hermes-runtime-and-self-learning-state.md
Normal file
106
docs/research/hermes-runtime-and-self-learning-state.md
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
# Hermes כ-runtime אצלנו, וה-self-learning האינרטי — חקירה + playbook להפעלה מלאה
|
||||||
|
|
||||||
|
> **TaskMaster #126** (המשך ל-[#123](hermes-nous-feasibility.md)) · תאריך: 2026-06-11
|
||||||
|
> **למה המסמך קיים:** כדי שאם אי-פעם נרצה להפעיל את **סוכן ה-Hermes המלא** (עם לולאת ה-self-learning), לא נצטרך לחזור על החקירה הזו. מתעד מה אנחנו מריצים בפועל היום, מה דלוק-אך-אינרטי, ומה צריך כדי להדליק אותו נכון.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. מה אנחנו מריצים בפועל היום
|
||||||
|
|
||||||
|
הסוכן "הרמס" אצלנו = ה-adapter `deepseek_local` שמריץ את **ה-CLI האמיתי של Nous Hermes** כ-runtime, מכוון ל-DeepSeek:
|
||||||
|
|
||||||
|
```
|
||||||
|
hermes chat -q "<prompt>" -Q -m deepseek-v4-pro --provider custom -t <toolsets> --source tool --yolo
|
||||||
|
```
|
||||||
|
|
||||||
|
| רכיב | ערך | מקור |
|
||||||
|
|------|-----|------|
|
||||||
|
| בינארי | `hermes` (`HERMES_CLI`) | `adapters/deepseek-paperclip-adapter/dist/shared/constants.js:9` |
|
||||||
|
| תווית-adapter | **"DeepSeek (via Hermes)"** (`deepseek_local`) | `constants.js:5-6` |
|
||||||
|
| מודל | `deepseek-v4-pro` (provider `custom` → `api.deepseek.com/v1`) | `config.yaml` של הפרופיל |
|
||||||
|
| `HERMES_HOME` | `~/.hermes/profiles/curator-cmp` (CMP) · `curator-cmpa` (CMPA) | adapterConfig.env (per-company) |
|
||||||
|
| invocation | חד-פעמי `-q ... -Q` (quiet, non-interactive), ללא gateway חי | `dist/server/execute.js:240-249` |
|
||||||
|
| חיבור MCP | `mcp_servers.legal-ai` בקונפיג → ה-CLI יכול לקרוא לכלי-MCP שלנו | `config.yaml` |
|
||||||
|
|
||||||
|
**מסקנה חשובה:** Hermes כאן הוא ה-**runtime/harness** (terminal + לולאת-כלים + provider→DeepSeek + MCP), **לא** "המוח הלומד". ההצהרה ב-#123 "grep=0, קוד Nous לא שולב" נכונה לגבי **לולאת ה-self-learning** — לא לגבי ה-CLI כ-runtime, שכן משמש.
|
||||||
|
|
||||||
|
### זהות הסוכן ב-Paperclip
|
||||||
|
- שם-הסוכן ב-Paperclip כבר **"מנהל ידע"** (role `qa`) — **לא** "Hermes".
|
||||||
|
- ה-wakeup הוא לפי **UUID** (`CURATOR_AGENTS[company_id]` ב-`web/paperclip_client.py:50-53`: CMP=`60dce831…`, CMPA=`d6f7c55d…`) — **לא לפי שם**. ⇒ שינוי-שם-תצוגה אינו שובר את ה-wakeup.
|
||||||
|
- ה-persona "Hermes" יושב רק ב: שדה ה-`description` ("Knowledge Curator (Hermes…)"), טקסט ה-system-prompt ב-[hermes-curator.md](../../.claude/agents/hermes-curator.md), שם-הקובץ, ופרוזה בתיעוד.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. ה-self-learning דלוק ב-config — אבל אינרטי
|
||||||
|
|
||||||
|
ב-`~/.hermes/profiles/curator-cmp/config.yaml` ו-`curator-cmpa/config.yaml` (שורות ~296-328) הפיצ'רים **דלוקים כברירת-מחדל**:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
memory:
|
||||||
|
memory_enabled: true # זיכרון 3-שכבתי
|
||||||
|
user_profile_enabled: true # מידול-משתמש (dialectic / Honcho)
|
||||||
|
nudge_interval: 10
|
||||||
|
skills:
|
||||||
|
creation_nudge_interval: 15 # נדנוד ליצירת-skills
|
||||||
|
curator:
|
||||||
|
enabled: true # ה-curator הפנימי של Hermes (אוצר זיכרון, כל 168 שעות)
|
||||||
|
```
|
||||||
|
|
||||||
|
**אבל הם לא רצים בפועל**, כי:
|
||||||
|
- ה-adapter מפעיל את ה-CLI **חד-פעמית** (`-q … -Q`) בכל יקיצה ואז יוצא — אין gateway/דמון חי.
|
||||||
|
- ה-curator-הפנימי (interval 168h), flush-הזיכרון (`flush_min_turns`), ונדנוד-ה-skills תלויים בתהליך מתמשך/רב-תור — שלא קיים.
|
||||||
|
|
||||||
|
### עדות פורנזית (state.db של ה-curator-ים)
|
||||||
|
`~/.hermes/profiles/curator-cmp/state.db` (15M) · `curator-cmpa/state.db` (4.6M). טבלאות:
|
||||||
|
|
||||||
|
| יש | אין |
|
||||||
|
|----|-----|
|
||||||
|
| `messages` (555 / 159) — תמלילי-ריצה | ❌ `memories` (זיכרון מזוקק) |
|
||||||
|
| `sessions` (60 / 5) — מטא + billing | ❌ `user_profile` (מודל-דפנה) |
|
||||||
|
| `messages_fts*` — אינדקס FTS5 | ❌ `skills` שנוצרו אוטומטית |
|
||||||
|
|
||||||
|
- התוכן היחיד = **תמלילי-הריצות של ה-curator** (קרא טיוטה↔סופי, רשם ממצאים, הציג interaction) — בדיוק הפלט שכן צרכנו (comments + `decision_lesson`).
|
||||||
|
- סשנים ללא כותרות, `$0.00` עלות מתועדת, חלקם 0-2 הודעות (יקיצות-סרק).
|
||||||
|
- טווח-פעילות: **2026-05-05 → 2026-05-26** (CMP), עד 8.6 (CMPA). רדום מאז.
|
||||||
|
|
||||||
|
**שורה תחתונה:** משלושת הדיפרנציאטורים של Hermes (memory / user-model / skill-acquisition) נוצרו **אפס שורות**. מה ש"לא צרכנו" = לוגים תמימים, לא ידע מזוקק. ⇒ מ-self-learning מקבלים **אפס** ערך; מנצלים את ה-harness בלבד.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. ההחלטה (מיושמת ב-#126)
|
||||||
|
|
||||||
|
| פעולה | נימוק |
|
||||||
|
|------|-------|
|
||||||
|
| **כיבוי self-learning** בשני config.yaml (`memory_enabled/user_profile_enabled/curator.enabled=false`, skill-nudge off) | מסיר config-מת, הופך את "אנחנו לא מריצים self-learning" לאמיתי, מיישר ל-INV-LRN1/LRN5. הפיך (גיבוי שמור). |
|
||||||
|
| **ניקוי persona** Hermes→Curator בטקסט-הפרומפט + description + תיעוד | השם נעשה כן: סוכן **Curator/אוצֵר-ידע** שרץ על runtime DeepSeek-via-Hermes. |
|
||||||
|
| **שמירת** `HERMES_HOME`/`HERMES_CLI`/"via Hermes" | זה ה-runtime ונכון — סריקה עיוורת של "hermes" הייתה שוברת את ה-adapter. |
|
||||||
|
|
||||||
|
ה-learning האמיתי שלנו נשאר הצינור הדטרמיניסטי המגודר (`final_learning_pipeline` + פאנלים + שער-יו"ר), לא ה-self-learning של Hermes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. ⭐ Playbook: איך להפעיל את סוכן ה-Hermes המלא (אם נרצה בעתיד)
|
||||||
|
|
||||||
|
זה מה שיידרש כדי להפוך את ה-curator מ"runtime דק" ל-"סוכן Hermes לומד" — ולמה לא עשינו זאת:
|
||||||
|
|
||||||
|
### 4.1 שכבת-ה-runtime (טכני)
|
||||||
|
1. **gateway מתמשך במקום one-shot.** היום `hermes chat -q … -Q` יוצא אחרי תור אחד. צריך תהליך-Hermes חי (`hermes gateway`/דמון) או `--resume` עקבי עם session מתמשך כך שה-memory-flush, ה-curator-הפנימי, ונדנוד-ה-skills יוכלו לרוץ. ⇒ שינוי ב-`deepseek-paperclip-adapter` (לא רק config).
|
||||||
|
2. **session persistence.** לוודא ש-`persistSession` + `sessionId` נשמרים בין יקיצות-ה-curator של אותו תיק/חברה (ה-adapter תומך — `execute.js:251-252,376-378` — אך תלוי שמירת `sessionParams` ב-Paperclip).
|
||||||
|
3. **הדלקת הפיצ'רים** ב-config.yaml: להחזיר `memory_enabled/user_profile_enabled/curator.enabled=true` + לכוון `nudge_interval`/`flush_min_turns`. (Honcho ל-dialectic-modeling דורש הגדרת `honcho:` — כרגע ריק.)
|
||||||
|
|
||||||
|
### 4.2 שכבת-הממשל (חובה לפני — אחרת מפר את החוקה)
|
||||||
|
4. **INV-LRN1/G10 (אין auto-commit):** memory/skills של Hermes שמשנים את עצמם אוטומטית **אסורים** כשער-ידע. כל פלט-למידה חייב להישאר *הצעה* לשער-יו"ר. ⇒ אם מדליקים, לגדר כך שה-memory/skills של Hermes לא יוזרקו לכתיבה בלי אישור.
|
||||||
|
5. **INV-LRN5 (טוהר-הקול):** ה-3-layer memory + user-model שומרים תוכן-תיק ספציפי. אסור שמהות (הלכה/עובדה) תדלוף לשכבת-הקול. ⇒ צריך distillation שמפריד סגנון↔מהות *לפני* שנכנס לזיכרון-Hermes, או לבודד את זיכרון-Hermes מהקורפוס.
|
||||||
|
6. **G12 (שער-הפלטפורמה):** Hermes כ-runtime מותר (מאחורי ה-adapter/Port). אבל אם מפעילים את ה-orchestration/scheduler/ערוצים שלו — זו פלטפורמת-סוכנים מקבילה ל-Paperclip ⇒ אסור (ראה [#123 §ב](hermes-nous-feasibility.md)).
|
||||||
|
|
||||||
|
### 4.3 ההכרעה הנוכחית
|
||||||
|
**לא להפעיל.** הסיבה (מ-#123 + החקירה כאן): ה-self-learning של Hermes מתנגש בממשל שלנו (4-6), והערך שלו מושג כבר ע"י הצינור המגודר שלנו + רעיון-GEPA (#123). ה-runtime נשאר; ה-"מוח" כבוי.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. מקורות-קוד / הפניות
|
||||||
|
- runtime: `adapters/deepseek-paperclip-adapter/dist/{shared/constants.js,server/execute.js}` · `~/.hermes/profiles/curator-{cmp,cmpa}/config.yaml`
|
||||||
|
- זהות+wakeup: `web/paperclip_client.py:50-53` (CURATOR_AGENTS), `:1188-1245` (wake_curator_for_final)
|
||||||
|
- persona/prompt: `.claude/agents/hermes-curator.md`
|
||||||
|
- ספ: [07-learning.md](../spec/07-learning.md) (INV-LRN1/4/5) · [X15](../spec/X15-agent-platform-port.md) (G12) · [#123 feasibility](hermes-nous-feasibility.md)
|
||||||
|
- זיכרון: `reference_hermes_home_gotcha`
|
||||||
@@ -78,13 +78,14 @@
|
|||||||
|
|
||||||
אלה החוקים החוצים את כל המערכת — לב החוקה. הם נחלקים לשני סוגים לפי **מקור-הסמכות**:
|
אלה החוקים החוצים את כל המערכת — לב החוקה. הם נחלקים לשני סוגים לפי **מקור-הסמכות**:
|
||||||
|
|
||||||
- **G1–G10 — invariants הנדסיים** (תכנון/בניית האפליקציה): כל אחד מגובה ב-**≥3 סמכויות
|
- **G1–G10, G12 — invariants הנדסיים** (תכנון/בניית האפליקציה): כל אחד מגובה ב-**≥3 סמכויות
|
||||||
טכניות מוכרות** (נספח §8). ביחד הם מייבשים את כשל-השורש החוזר: מסלולים/קורפוסים
|
טכניות מוכרות** (נספח §8). ביחד הם מייבשים את כשל-השורש החוזר: מסלולים/קורפוסים
|
||||||
מקבילים שמתפצלים (drift) בלי שכבה שמגדירה ואוכפת "תקין".
|
מקבילים שמתפצלים (drift) בלי שכבה שמגדירה ואוכפת "תקין". (G12 — שער-הפלטפורמה — מוסף
|
||||||
|
במחזור-3; ראה [X15](X15-agent-platform-port.md).)
|
||||||
- **G11 — invariant תוכן-משפטי:** הסמכות עליו היא **היו"ר (דפנה) + מסמכי-הפרויקט**, לא
|
- **G11 — invariant תוכן-משפטי:** הסמכות עליו היא **היו"ר (דפנה) + מסמכי-הפרויקט**, לא
|
||||||
מקורות חיצוניים, ואינו כפוף לפרוטוקול ≥3-המקורות.
|
מקורות חיצוניים, ואינו כפוף לפרוטוקול ≥3-המקורות.
|
||||||
|
|
||||||
### 5א. Invariants הנדסיים (G1–G10)
|
### 5א. Invariants הנדסיים (G1–G10, G12)
|
||||||
|
|
||||||
### INV-G1: מזהה קנוני מנורמל בכתיבה
|
### INV-G1: מזהה קנוני מנורמל בכתיבה
|
||||||
**כלל:** לכל ישות יש מזהה קנוני יחיד, **מנורמל בנקודת-הכתיבה** (לא תיקון-סלחני בקריאה
|
**כלל:** לכל ישות יש מזהה קנוני יחיד, **מנורמל בנקודת-הכתיבה** (לא תיקון-סלחני בקריאה
|
||||||
@@ -108,6 +109,11 @@ Fowler (Canonical Data Model) · SSOT (Single Source of Truth) | סטטוס: ver
|
|||||||
`ingest_internal_decision`) שמתפצלים — לדוגמה: המסלול החיצוני מתזמן חילוץ metadata
|
`ingest_internal_decision`) שמתפצלים — לדוגמה: המסלול החיצוני מתזמן חילוץ metadata
|
||||||
(`request_metadata_extraction`), והמסלול הפנימי לא — ולכן ערן סופר 8046/24 נקלטה בלי
|
(`request_metadata_extraction`), והמסלול הפנימי לא — ולכן ערן סופר 8046/24 נקלטה בלי
|
||||||
metadata → ממצא ל-[audit](../audit-report.md).
|
metadata → ממצא ל-[audit](../audit-report.md).
|
||||||
|
**הפרה ידועה (תאום-מתודולוגיה, MET-2/3 — מותנה בגל-2 #131):** `discussion_rules['universal']`
|
||||||
|
ו-`transition_phrases['universal']` ב-`appeal_type_rules` נכתבים ע"י **שני** מסלולים — עורך-המתודולוגיה
|
||||||
|
(PUT, overwrite) ו-promote-הלמידה (append). **מותן:** ה-append רץ בטרנזקציה אחת נעולה (FOR UPDATE) +
|
||||||
|
promote מבטל את ה-cache של /methodology (גל-1 MET-1), כך שעורך-המתודולוגיה הוא העורך-הקנוני שעורך
|
||||||
|
תמיד מצב פוסט-append. שאריות (עריכה בטאב באמת-stale) מקובלות בכלי-יחיד-משתמש; ראה [X17 INV-IA3](X17-information-architecture.md), [ia-audit-redesign.md](../ia-audit-redesign.md) §2.5.
|
||||||
|
|
||||||
### INV-G3: ingest אחיד ו-idempotent
|
### INV-G3: ingest אחיד ו-idempotent
|
||||||
**כלל:** קליטה היא **אחידה ו-idempotent** — upsert על מפתח דטרמיניסטי. קליטה חוזרת של
|
**כלל:** קליטה היא **אחידה ו-idempotent** — upsert על מפתח דטרמיניסטי. קליטה חוזרת של
|
||||||
@@ -196,6 +202,22 @@ Hellyer (Law Library Journal 110:4, 2018, open-access) — טיפול-שיפוט
|
|||||||
**הפרה ידועה:** 10/19 הלכות מאושרות, התגלה במקרה — שער ידני שקוף בלי נראות backlog →
|
**הפרה ידועה:** 10/19 הלכות מאושרות, התגלה במקרה — שער ידני שקוף בלי נראות backlog →
|
||||||
ממצא ל-[audit](../audit-report.md).
|
ממצא ל-[audit](../audit-report.md).
|
||||||
|
|
||||||
|
### INV-G12: שער-הפלטפורמה — Paperclip מאחורי Port יחיד
|
||||||
|
**כלל:** פלטפורמת-הסוכנים (Paperclip) נגישה אך-ורק דרך **ה-Platform Port**
|
||||||
|
(`web/agent_platform_port.py` + `.claude/agents/HEARTBEAT.md` לפרומפטים). שכבת-האינטליגנציה
|
||||||
|
— `mcp-server/src` וה-skills של ההחלטה/הסגנון — מכילה **אפס** סמלים ספציפיים-לפלטפורמה
|
||||||
|
(שם-מוצר, wakeup/heartbeat, pc.sh/pc_request, X-Paperclip-Run-Id, enums של הפלטפורמה).
|
||||||
|
פרומפטי-הסוכנים אינם משכפלים את פרוטוקול-הריצה — הם מצביעים ל-HEARTBEAT.md בלבד. כל מגע
|
||||||
|
חדש עם הפלטפורמה עובר דרך ה-Port — כך המעטפת נשארת ניתנת-להחלפה בלי לגעת באינטליגנציה.
|
||||||
|
**מקורות:** Alistair Cockburn — *Hexagonal Architecture (Ports & Adapters)* · Robert C.
|
||||||
|
Martin — *Clean Architecture* (The Dependency Rule) · Eric Evans — *Domain-Driven Design*
|
||||||
|
(Anti-Corruption Layer) | סטטוס: verified
|
||||||
|
**אכיפה:** רשימת-ה-Port + leak-guard ב-[scripts/spec-guard.sh](../../scripts/spec-guard.sh)
|
||||||
|
(מול baseline) + fitness-test ב-CI על `mcp-server/src` + הצהרת-G12 בתבנית-ה-PR; מפורט ב-
|
||||||
|
[X15-agent-platform-port.md](X15-agent-platform-port.md).
|
||||||
|
**הפרה ידועה:** `web/app.py` קורא ל-`pc_*` inline בלוגיקת מחזור-חיים; 10 פרומפטי-סוכנים
|
||||||
|
משכפלים את פרוטוקול-הריצה במקום להצביע ל-HEARTBEAT (baseline ב-[X15](X15-agent-platform-port.md) §3 → R1–R4).
|
||||||
|
|
||||||
### 5ב. Invariant תוכן-משפטי (G11)
|
### 5ב. Invariant תוכן-משפטי (G11)
|
||||||
|
|
||||||
### INV-G11: תוכן החלטה מנומקת
|
### INV-G11: תוכן החלטה מנומקת
|
||||||
@@ -227,11 +249,11 @@ Hellyer (Law Library Journal 110:4, 2018, open-access) — טיפול-שיפוט
|
|||||||
|
|
||||||
## 7. אינדקס הספ
|
## 7. אינדקס הספ
|
||||||
|
|
||||||
> הערה: כל קבצי הספ (00, 01–07, X1–X12) קיימים. החוקה היא שער-הכניסה; כל קובץ-תחום כפוף לה.
|
> הערה: כל קבצי הספ (00, 01–07, X1–X17) קיימים. החוקה היא שער-הכניסה; כל קובץ-תחום כפוף לה.
|
||||||
|
|
||||||
| קובץ | תפקיד | אוכף invariants |
|
| קובץ | תפקיד | אוכף invariants |
|
||||||
|------|--------|-----------------|
|
|------|--------|-----------------|
|
||||||
| [00-constitution.md](00-constitution.md) | חוקה — ייעוד, invariants גלובליים, כללי-הנדסה, אינדקס | G1–G11 |
|
| [00-constitution.md](00-constitution.md) | חוקה — ייעוד, invariants גלובליים, כללי-הנדסה, אינדקס | G1–G12 |
|
||||||
| [01-ingest.md](01-ingest.md) | קליטה מאוחדת: מסמכי-תיק / פסיקה חיצונית / החלטות-ועדה — חוזה מסלול-יחיד | G2, G3 |
|
| [01-ingest.md](01-ingest.md) | קליטה מאוחדת: מסמכי-תיק / פסיקה חיצונית / החלטות-ועדה — חוזה מסלול-יחיד | G2, G3 |
|
||||||
| [02-data-model.md](02-data-model.md) | אחסון: ישויות (cases, case_law, documents, chunks, halachot…) + חוזה-שלמות לכל ישות | G1, G4, G6 |
|
| [02-data-model.md](02-data-model.md) | אחסון: ישויות (cases, case_law, documents, chunks, halachot…) + חוזה-שלמות לכל ישות | G1, G4, G6 |
|
||||||
| [03-retrieval.md](03-retrieval.md) | 3 קורפוסים + כלי-חיפוש · hybrid/RRF · attribution · eval harness | G4, G5, G6, G7, G8, G9 |
|
| [03-retrieval.md](03-retrieval.md) | 3 קורפוסים + כלי-חיפוש · hybrid/RRF · attribution · eval harness | G4, G5, G6, G7, G8, G9 |
|
||||||
@@ -252,6 +274,10 @@ Hellyer (Law Library Journal 110:4, 2018, open-access) — טיפול-שיפוט
|
|||||||
| [X11-citation-corroboration.md](X11-citation-corroboration.md) | citator פנימי — תיקוף הלכות בטיפול-שיפוטי מצטבר · תיקון-G10 מבוקר · סף-corroboration · התאמה-להלכה | G9, G10 |
|
| [X11-citation-corroboration.md](X11-citation-corroboration.md) | citator פנימי — תיקוף הלכות בטיפול-שיפוטי מצטבר · תיקון-G10 מבוקר · סף-corroboration · התאמה-להלכה | G9, G10 |
|
||||||
| [X12-digests-radar.md](X12-digests-radar.md) | יומונים כשכבת-גילוי (radar) — מקור-משני המצביע על הפסק המקורי · לא קורפוס-ציטוט רביעי · לא מצוטט/לא מחלץ-הלכות | G2, G4, G9 |
|
| [X12-digests-radar.md](X12-digests-radar.md) | יומונים כשכבת-גילוי (radar) — מקור-משני המצביע על הפסק המקורי · לא קורפוס-ציטוט רביעי · לא מצוטט/לא מחלץ-הלכות | G2, G4, G9 |
|
||||||
| [X13-court-fetch.md](X13-court-fetch.md) | אחזור-פסיקה אוטומטי מנט המשפט — 3 שכבות (עליון/מנהלי/skip) · שירות-מארח · reCAPTCHA · שער-אנושי | G2, G3, G4, G5, G9, G10 |
|
| [X13-court-fetch.md](X13-court-fetch.md) | אחזור-פסיקה אוטומטי מנט המשפט — 3 שכבות (עליון/מנהלי/skip) · שירות-מארח · reCAPTCHA · שער-אנושי | G2, G3, G4, G5, G9, G10 |
|
||||||
|
| [X14-storage-minio.md](X14-storage-minio.md) | אחסון-אובייקטים (MinIO/S3) · `storage.py` כמסלול-I/O יחיד · git=טקסט/MinIO=בינאריים · WORM סופי | G2, G9 |
|
||||||
|
| [X15-agent-platform-port.md](X15-agent-platform-port.md) | שער-הפלטפורמה — Paperclip מאחורי Port יחיד · baseline-דליפה · R0–R4 · leak-guard | G2, G12 |
|
||||||
|
| [X16-pipeline-durability.md](X16-pipeline-durability.md) | עמידות-פייפליין — LangGraph כספרייה · checkpointing/replay · `_pipeline_runtime.py` משותף | G3 |
|
||||||
|
| [X17-information-architecture.md](X17-information-architecture.md) | ארכיטקטורת-מידע — משטח-ההפעלה (דפים/תורים/ניווט/cache) · INV-IA1–IA6 מרימים G2/G10 לשכבת-UI · #127/#130–132 | G2, G10 |
|
||||||
|
|
||||||
> **X6–X10 (מחזור-2):** מכסים את 8 משטחי-האפליקציה שמחוץ לצינור-הליבה (אינטגרציה, web-ui, מילוי-שדות,
|
> **X6–X10 (מחזור-2):** מכסים את 8 משטחי-האפליקציה שמחוץ לצינור-הליבה (אינטגרציה, web-ui, מילוי-שדות,
|
||||||
> אחסון-ניתוחים, כלי-MCP, deploy/env). הממצאים ב-[gap-audit.md](gap-audit.md) (GAP-24..62 → FU-9..15)
|
> אחסון-ניתוחים, כלי-MCP, deploy/env). הממצאים ב-[gap-audit.md](gap-audit.md) (GAP-24..62 → FU-9..15)
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
| `chair_feedback` | הערת-יו"ר על טיוטה | `id`; FK→`cases` | `block_id`, `feedback_text`, `category`, `lesson_extracted`, `resolved` (`db.py:452-462`) |
|
| `chair_feedback` | הערת-יו"ר על טיוטה | `id`; FK→`cases` | `block_id`, `feedback_text`, `category`, `lesson_extracted`, `resolved` (`db.py:452-462`) |
|
||||||
| `missing_precedents` | תקדים חסר שהתבקש ולא נמצא | `id` | (`db.py:806`) — backlog ל-quality-at-source |
|
| `missing_precedents` | תקדים חסר שהתבקש ולא נמצא | `id` | (`db.py:806`) — backlog ל-quality-at-source |
|
||||||
| `style_corpus` | קורפוס-סגנון של דפנה (אימון) | `id`; FK→`documents` | `decision_number`, `full_text`, `practice_area`, `appeal_subtype` (`db.py:118-131`) |
|
| `style_corpus` | קורפוס-סגנון של דפנה (אימון) | `id`; FK→`documents` | `decision_number`, `full_text`, `practice_area`, `appeal_subtype` (`db.py:118-131`) |
|
||||||
|
| `plans` | מרשם-תכניות — זהות+תוקף של תב"ע, שימוש חוזר בין תיקים (V38) | `plan_number` מנורמל (`UNIQUE`) | `display_name`, `aliases`, `plan_type`, `gazette_date`, `yalkut_number`, `purpose`, `citation_formatted`, `review_status`, provenance (`source_case_number`/`source_document_id`/`model_used`), `discrepancies` (SCHEMA_V38) |
|
||||||
|
|
||||||
> שכבות-עזר נוספות (`document_image_embeddings`, `precedent_image_embeddings` — multimodal,
|
> שכבות-עזר נוספות (`document_image_embeddings`, `precedent_image_embeddings` — multimodal,
|
||||||
> `db.py:707,726`; `case_law_relations` — שרשרת-תיק, `db.py:754`; `precedent_internal_citations`
|
> `db.py:707,726`; `case_law_relations` — שרשרת-תיק, `db.py:754`; `precedent_internal_citations`
|
||||||
@@ -87,6 +88,7 @@ proceeding_type)`. לכן המזהה הקנוני הוא **(`case_number` מנו
|
|||||||
| `legal_arguments` (+`legal_argument_propositions`) | OPUS (`aggregate_claims_to_arguments`) | **חסר** (בניגוד ל-halachot) | `cited_precedents TEXT[]` (לא-FK) |
|
| `legal_arguments` (+`legal_argument_propositions`) | OPUS (`aggregate_claims_to_arguments`) | **חסר** (בניגוד ל-halachot) | `cited_precedents TEXT[]` (לא-FK) |
|
||||||
| `appraiser_facts` | OPUS (`extract_appraiser_facts`) | — | `document_id` (FK); `appraiser_side` default `''` |
|
| `appraiser_facts` | OPUS (`extract_appraiser_facts`) | — | `document_id` (FK); `appraiser_side` default `''` |
|
||||||
| `halachot` | OPUS (`halacha_extractor`) | **`review_status`** ✓ | `case_law_id` (FK); `quote_verified` |
|
| `halachot` | OPUS (`halacha_extractor`) | **`review_status`** ✓ | `case_law_id` (FK); `quote_verified` |
|
||||||
|
| `plans` | claude-local (`plans_extractor`) / ידני-יו"ר (`plan_upsert`) | **`review_status`** ✓ (כמו halachot, INV-DM5/G10) | `source_document_id` (FK); `source_case_number`; `discrepancies` (סתירת-תוקף מול שורה מאושרת — לא-דורס, §6) |
|
||||||
| `decision_blocks` / `decision_paragraphs` | Opus/script (`write_block`) | `status` | `model_used` + audit-event provenance (FU-7); `citations JSONB` ללא-FK |
|
| `decision_blocks` / `decision_paragraphs` | Opus/script (`write_block`) | `status` | `model_used` + audit-event provenance (FU-7); `citations JSONB` ללא-FK |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -155,6 +157,14 @@ RAG freshness (Lewis et al., 2020, NeurIPS) | סטטוס: verified
|
|||||||
**אכיפה:** CHECK על enums; FK על `cited_precedents`/`decision_paragraphs.citations`; איחוד `case_precedents`↔`case_law`.
|
**אכיפה:** CHECK על enums; FK על `cited_precedents`/`decision_paragraphs.citations`; איחוד `case_precedents`↔`case_law`.
|
||||||
**הפרה ידועה:** 20+ enums כ-TEXT חופשי; `legal_arguments.cited_precedents TEXT[]` ללא-FK (הזיות-LLM נבלעות); `case_precedents` מול `case_law` מקבילות ([gap-audit GAP-40/42/43](gap-audit.md)).
|
**הפרה ידועה:** 20+ enums כ-TEXT חופשי; `legal_arguments.cited_precedents TEXT[]` ללא-FK (הזיות-LLM נבלעות); `case_precedents` מול `case_law` מקבילות ([gap-audit GAP-40/42/43](gap-audit.md)).
|
||||||
|
|
||||||
|
### INV-DM7: סיווג-הלכה — סמכות (נגזרת) ⊥ תפקיד-כלל (מסווג). שני צירים, לא enum אחד
|
||||||
|
**כלל:** ל-`halachot` שני צירי-סיווג **אורתוגונליים** שאסור לערבב בשדה אחד:
|
||||||
|
- **סמכות (`authority`) — נגזרת בלבד, לא מאוחסנת, לא מנוחשת ע"י LLM.** `binding` (מקור מחייב את הוועדה: עליון/מנהלי) מול `persuasive` (מקור משכנע: ועדת-ערר אחרת). נגזרת דטרמיניסטית מ-`case_law.precedent_level` (`עליון`/`מנהלי`→binding; `ועדת_ערר_מחוזית`→persuasive). מקור-אמת יחיד — מחושבת בקריאה, אין עמודה כפולה ([G1](00-constitution.md#inv-g1-נרמול-במקור-לא-תיקון-בקריאה)/[G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)).
|
||||||
|
- **תפקיד-כלל (`rule_type`/rule_role) — מסווג ע"י ה-LLM.** `holding` (עיקרון מהותי הכרחי להכרעה — ratio/Wambaugh) · `interpretive` (פרשנות חוק/מונח/תכנית) · `procedural` (סדר-דין: סמכות/מועדים/נטל) · `application` (החלה תלוית-עובדות — לרוב לא-הלכה) · `obiter` (אמרת-אגב). **`binding`/`persuasive` אינם ערכי תפקיד** — הם סמכות-מקור.
|
||||||
|
**הנדסי.** מופע של [G1](00-constitution.md#inv-g1-נרמול-במקור-לא-תיקון-בקריאה) (נרמול במקור: המחלץ מסווג תפקיד, לא ממציא סמכות נגזירה) ו-[G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים).
|
||||||
|
**מקורות:** OASIS LegalRuleML v1.0 (`appliesAuthority`/`Strength` כ-metadata אורתוגונלי, נפרד מלוגיקת-הכלל) · SemEval-2023 Task 6 LegalEval (rhetorical-roles לפי תפקיד, סמכות נשמרת בנפרד) · Bluebook signals (משקל-סמכות = ציר נפרד מהפרופוזיציה) | סטטוס: verified (≥3 מקורות).
|
||||||
|
**ההפרה שתוקנה:** `halacha_extractor` סיווג `rule_type` לפי bindingness-של-המקור (`_coerce_halacha(is_binding)`, ברירת-מחדל `binding`/`persuasive`, guard binding→persuasive) — כלומר חישב **סמכות** במסווה של **תפקיד**. אומת אמפירית על מדגם-הזהב: `binding` שימש 19/19 פסקים חיצוניים ו-0 ועדות; `persuasive` 13/13 ועדות ו-0 חיצוניים → סיווג-לפי-מקור, התאמה לתיוג-אנושי 58% בלבד. התיקון מעביר סמכות לציר-נגזר ומשחרר את ה-LLM לסווג תפקיד נטו.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. מצב קיים מול יעד — audit-findings
|
## 4. מצב קיים מול יעד — audit-findings
|
||||||
|
|||||||
@@ -72,6 +72,13 @@
|
|||||||
— שם §4. **טיוטת-ביניים** (Pre-Ruling Draft) בוחרת תת-קבוצת בלוקים (ו, ט, ז, ח) —
|
— שם §4. **טיוטת-ביניים** (Pre-Ruling Draft) בוחרת תת-קבוצת בלוקים (ו, ט, ז, ח) —
|
||||||
block-schema.md §7; שלב-החילוץ השמאי שלה (`extract_appraiser_facts`) מזין את בלוק ט.
|
block-schema.md §7; שלב-החילוץ השמאי שלה (`extract_appraiser_facts`) מזין את בלוק ט.
|
||||||
|
|
||||||
|
> **ציטוט-תכנית קנוני (בלוק ט):** הזהות והתוקף של תכנית (תאריך פרסום למתן תוקף
|
||||||
|
> ברשומות + מס' ילקוט-הפרסומים) נכתבים בנוסח אחיד **דטרמיניסטי** מ**מרשם-התכניות**
|
||||||
|
> (`plans`, [02-data-model](02-data-model.md)) דרך `db.format_plan_citation` — לא
|
||||||
|
> מנוסחים מחדש ע"י ה-LLM, ובכך לא מהוזים ([anti-hallucination-gate](../anti-hallucination-gate.md),
|
||||||
|
> INV-AH). הנוסח עצמו הוא תוכן-משפטי באחריות היו"ר ([block-schema.md](../block-schema.md)
|
||||||
|
> בלוק ט); המרשם נכנס לשימוש רק אחרי אישור-יו"ר (`review_status`, G10).
|
||||||
|
|
||||||
> **התמקדות לפי feedback היו"ר:** הסיוע מתמקד בבלוקים המהותיים (ו–יב); בלוקים א–ד
|
> **התמקדות לפי feedback היו"ר:** הסיוע מתמקד בבלוקים המהותיים (ו–יב); בלוקים א–ד
|
||||||
> ממולאים מ-template ואינם דורשים ניתוח. ראה `MEMORY.md` → "התעלם מכותרות".
|
> ממולאים מ-template ואינם דורשים ניתוח. ראה `MEMORY.md` → "התעלם מכותרות".
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,9 @@
|
|||||||
`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 (מדד-מרחק-סגנון).
|
||||||
|
|
||||||
### 0.4 ניהול ב-UI
|
### 0.4 ניהול ב-UI
|
||||||
`/methodology` = **עורך-הפרופיל** (declarative: יחסי-זהב, כללי-דיון, צ׳קליסטים, ביטויי-מעבר, אנטי-דפוסים, voice-invariants). `/training` = **שולחן-הלמידה** (קורפוס, פורטרט-סגנון, השוואת draft↔final, curator, מדד-מרחק, פנקס-התאמה).
|
`/methodology` = **עורך-הפרופיל היחיד** (declarative: יחסי-זהב, כללי-דיון, צ׳קליסטים, ביטויי-מעבר, אנטי-דפוסים, voice-invariants). `/training` = **שולחן-הלמידה** (קורפוס, פורטרט-סגנון, השוואת draft↔final, curator, מדד-מרחק, פנקס-התאמה).
|
||||||
|
|
||||||
|
**שער-אישור אחד · טרנזקציית-כותב אחת (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 חדשים
|
### 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`.
|
||||||
@@ -52,6 +54,18 @@
|
|||||||
**INV-LRN5 (טוהר-הקול → G4/G11):** שכבת-ידע-הקול (voice-fingerprint, style_patterns, exemplars) **לא תכיל הלכות/עובדות ספציפיות** — רק סגנון ושיטה. מהות מנותבת ל-precedent_library/halacha. ה-distillation מפריד במקור.
|
**INV-LRN5 (טוהר-הקול → G4/G11):** שכבת-ידע-הקול (voice-fingerprint, style_patterns, exemplars) **לא תכיל הלכות/עובדות ספציפיות** — רק סגנון ושיטה. מהות מנותבת ל-precedent_library/halacha. ה-distillation מפריד במקור.
|
||||||
*מקורות:* quality-at-source (Data Mesh) · separation-of-concerns. *סטטוס: verified.*
|
*מקורות:* quality-at-source (Data Mesh) · separation-of-concerns. *סטטוס: verified.*
|
||||||
|
|
||||||
|
### 0.6 מסלול-העלאת-סופי נקי + פאנלים אוטומטיים (מדורג)
|
||||||
|
היו"ר מעלה את **ההחלטה החתומה שלה** דרך מסלול ייעודי — `POST /api/cases/{case}/final/upload` (כפתור "העלאת החלטה סופית של היו"ר" בלשונית-הטיוטות). **נבדל** מ-`exports/upload` (גרסה-מתוקנת-שלנו+retrofit) ומ-`mark-final` (סימון export-שלנו), ולכן אינו מסלול-מקביל (G2) אלא יכולת חסרה.
|
||||||
|
הקליטה (סינכרונית ב-endpoint) מבצעת את **לולאת-צמיחת-הקורפוס** (§1.3) במלואה:
|
||||||
|
1. **קורפוס-הסגנון** (voice) תחת ה-`case_number` **המלא** (בל"מ≠ערר — מונע התנגשות-מספר) + פתיחת `draft_final_pairs` (`final_received`, INV-LRN4).
|
||||||
|
2. **ספריית-הפסיקה** — ההחלטה נכנסת ל-`case_law` כ-`internal_committee` **תמיד** (כדי שתהיה ברת-ציטוט בהחלטות עתידיות). `chair_name` נקבע **דטרמיניסטית** (תיק → ברירת-מחדל-ועדה, לעולם לא ריק — אילוץ `case_law_internal_chair_check`); לא נשען על חילוץ-LLM. מטה-דאטה נוסף (תאריך/צדדים) מועשר אסינכרונית ע"י מחלץ-Gemini.
|
||||||
|
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`); פיצול → ליו"ר.
|
||||||
|
- **הלכות:** `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) — הפאנל יוצר *הצעות* בלבד.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 1. שלוש לולאות-המשנה
|
## 1. שלוש לולאות-המשנה
|
||||||
@@ -193,6 +207,48 @@ Dimensions for Data Quality* (2013) · ISO 8000 (Data quality) | סטטוס: ver
|
|||||||
(`lessons.py:355, 309`). עקיבוּת-מקור קושרת ל-[X5-audit-provenance.md](X5-audit-provenance.md).
|
(`lessons.py:355, 309`). עקיבוּת-מקור קושרת ל-[X5-audit-provenance.md](X5-audit-provenance.md).
|
||||||
**הפרה ידועה:** —
|
**הפרה ידועה:** —
|
||||||
|
|
||||||
|
### INV-LRN6: סינתזת-עיקרון-קנוני מעוגנת ומגודרת-שער (V41 Phase 4 → G10/INV-AH/G9)
|
||||||
|
**כלל:** סינתזת ה-`canonical_statement` של עיקרון-הלכה קנוני (מיזוג/זיקוק ניסוחי-המופעים
|
||||||
|
לניסוח אחד כללי) חייבת לקיים שלושה תנאים: **(א) עיגון** — הניסוח נובע מ-`supporting_quote`
|
||||||
|
של המופעים בלבד, ללא הוספת דין/סייג/ציטוט-תיק שאינו במקור; חוסר-עיגון → **הימנעות**
|
||||||
|
(`grounded=false`, נשמר הניסוח הקיים) ולא המצאה ([INV-AH](../anti-hallucination-gate.md), AH-1/2/3).
|
||||||
|
**(ב) שער-drift** — הניסוח המסונתז מוטמע-מחדש ומושווה (cosine) לניסוח-המקור; מתחת לרצפה
|
||||||
|
(`HALACHA_CANONICAL_SYNTH_DRIFT_FLOOR`=0.80) הסינתזה **נדחית** (נשמר המקור) — הטמעה
|
||||||
|
מהוזה/סוטה-נושא לא תדרוס עיקרון תקין בשקט. **(ג) שער-יו"ר** — סינתזה אף פעם אינה מאשרת:
|
||||||
|
היא מקדמת `review_status` מ-`pending_synthesis` ל-`pending_review` בלבד; ההכרעה הסופית
|
||||||
|
היא של היו"ר בפאנל ([INV-LRN1](#inv-lrn1-עדכון-ידע-דורש-אישור-יור-ידני--אין-auto-commit-governance-g10)/G10).
|
||||||
|
כל ניסיון-סינתזה (התקבל / נשמר-מקור / נמנע) **מתועד** (CSV ב-`data/audit/` + log), ובהטמעה
|
||||||
|
מתעדכן ה-embedding יחד עם הניסוח כדי ש-lookup-before-insert (cosine) לא יסחף ([INV-G6](00-constitution.md#inv-g6-re-index-בכל-שינוי-תוכן)).
|
||||||
|
**מסלול-יחיד (G2):** כל הקוראים (backfill, כלי-MCP `canonical_synthesize_pending`, דריינר-לילה)
|
||||||
|
עוברים דרך `services/canonical_synthesis.py::synthesize_canonical` — אין נתיב-סינתזה מקביל.
|
||||||
|
**מקורות:** Stanford RegLab/Magesh et al. (JELS 2025 — grounding מול הזיה) · Dhuliawala et al.
|
||||||
|
*Chain-of-Verification* (arXiv:2309.11495, 2023) · RAGAS faithfulness (atomic-claim grounding) | סטטוס: verified
|
||||||
|
**אכיפה:** `services/canonical_synthesis.py` (עיגון בפרומפט, `_new_citations`, שער-drift);
|
||||||
|
`db.apply_canonical_synthesis` (סטטוס→pending_review אטומי + רענון-embedding); הפאנל הקנוני
|
||||||
|
(`/precedents`, PR#300) לאישור-יו"ר; CSV-audit ב-`data/audit/canonical-synthesis-*.csv`.
|
||||||
|
**הפרה ידועה:** — (חדש)
|
||||||
|
|
||||||
|
### INV-LRN7: חילוץ-עקרונות מגודר-פאנל + טרמינולוגיה נכונה (#152 → G2/G10/INV-AH)
|
||||||
|
**כלל:** חילוץ עקרונות-משפטיים מפסיקה (להבא ורטרואקטיבית) עובר משטר-פאנל אחיד:
|
||||||
|
**3 מודלים עצמאיים** (Claude מקומי + DeepSeek + Gemini) מנתחים לעומק כל החלטה,
|
||||||
|
מציעים מועמדים עם ציון, המועמדים מותאמים בין-מודלית (cosine), ולכל אחד `votes`
|
||||||
|
(# מודלים) ו-`score` (ממוצע-המצביעים). **כלל-אישור:** 3 קולות→אישור · 2 וציון≥0.85→
|
||||||
|
אישור · 2 ו<0.85→`pending_review` (יו"ר, G10) · ≤1→נדחה. **תקרה:** עד
|
||||||
|
`HALACHA_PANEL_MAX_NEW`=5 עקרונות חדשים לכל החלטה (לפי ציון); עיקרון מוכר מקושר
|
||||||
|
ל-canonical קיים (cosine, V41) ואינו נספר בתקרה. **טרמינולוגיה (מהות, לא קוסמטיקה):**
|
||||||
|
ועדת-ערר **מיישמת** דין ואינה יוצרת הלכה — עיקרון מפס"ד מחוזי/עליון מחייב = **הלכה**,
|
||||||
|
מהחלטת ועדת-ערר = **כלל פרשני**, מפסיקה משכנעת = **עיקרון**; המטרייה = **עקרונות
|
||||||
|
משפטיים**. הסיווג נגזר מ-`first_established_in` (source_kind/is_binding), ללא עמודה חדשה.
|
||||||
|
**מקור-יחיד (G2):** extractor (`_extract_via_panel`), סינון רטרואקטיבי (`cull_principles.py`),
|
||||||
|
ושני הם דרך `services/panel_extraction` + `panel_judges` — אין נתיב-פאנל מקביל.
|
||||||
|
**מקורות:** gold-set tri-model consensus (AC1=0.92, [[project_goldset_tri_model_consensus]]) ·
|
||||||
|
LegalBench (gemini-2.5-flash) · Trust-or-Escalate (ICLR 2025) | סטטוס: verified
|
||||||
|
**אכיפה:** `services/panel_extraction.py` (panel_extract/panel_keep_score/classify/apply_cap),
|
||||||
|
`services/panel_judges.py`, `halacha_extractor._extract_via_panel`, `db.store_panel_principles`,
|
||||||
|
`scripts/cull_principles.py`, `services/principles.py` (תווית). config `HALACHA_PANEL_*`.
|
||||||
|
החלטת-יו"ר 2026-06-19; מקור-אמת: [`../legal-principles-redesign.md`](../legal-principles-redesign.md).
|
||||||
|
**הפרה ידועה:** — (חדש)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. הג'ובים המתוזמנים (תמיכת-תשתית ללולאה)
|
## 4. הג'ובים המתוזמנים (תמיכת-תשתית ללולאה)
|
||||||
|
|||||||
@@ -3,10 +3,12 @@
|
|||||||
זהו מקור-האמת הקנוני ל"מהו תקין" במערכת. שער-הכניסה: [00-constitution.md](00-constitution.md).
|
זהו מקור-האמת הקנוני ל"מהו תקין" במערכת. שער-הכניסה: [00-constitution.md](00-constitution.md).
|
||||||
כל invariant מגובה ב-≥3 מקורות סמכותיים; פריט לא-מאומת מסומן ⚠ UNVERIFIED ומועלה ליו"ר.
|
כל invariant מגובה ב-≥3 מקורות סמכותיים; פריט לא-מאומת מסומן ⚠ UNVERIFIED ומועלה ליו"ר.
|
||||||
|
|
||||||
מבנה: 00 חוקה · 01–07 מחזור-חיים · X1–X13 חוצי-שלבים. ראה אינדקס מלא בחוקה.
|
מבנה: 00 חוקה · 01–07 מחזור-חיים · X1–X17 חוצי-שלבים. ראה אינדקס מלא בחוקה.
|
||||||
- X1–X5: מזהים · רב-חברתי · אינטגרציה+deploy · סוכנים · audit.
|
- X1–X5: מזהים · רב-חברתי · אינטגרציה+deploy · סוכנים · audit.
|
||||||
- X6–X10 (מחזור-2, 8 משטחי-האפליקציה): חוזה UI↔API · לקוח-Paperclip · מילוי-שדות · חוזה כלי-MCP · deploy/env/secrets.
|
- X6–X10 (מחזור-2, 8 משטחי-האפליקציה): חוזה UI↔API · לקוח-Paperclip · מילוי-שדות · חוזה כלי-MCP · deploy/env/secrets.
|
||||||
- X11–X13 (הרחבות-תחום): citator פנימי (תיקוף-הלכות) · יומונים כשכבת-גילוי (radar) · אחזור-פסיקה אוטומטי מנט המשפט (שירות).
|
- X11–X14 (הרחבות-תחום): citator פנימי (תיקוף-הלכות) · יומונים כשכבת-גילוי (radar) · אחזור-פסיקה אוטומטי מנט המשפט (שירות) · אחסון-אובייקטים (MinIO/S3, הגירת `data/`).
|
||||||
|
- X15–X16 (ארכיטקטורת-יסוד): שער-הפלטפורמה (Paperclip מאחורי Port — G12, מיישם G2) · עמידות-פייפליין (LangGraph כספרייה — checkpointing/replay, מחזק G3).
|
||||||
|
- X17 (ארכיטקטורת-מידע): [X17-information-architecture.md](X17-information-architecture.md) — משטח-ההפעלה (דפים/תורים/ניווט/cache); INV-IA1–IA6 מרימים את G2 ו-G10 לשכבת-ה-UI. מיישם feedback_operational_simplicity.
|
||||||
|
|
||||||
מפות-ממצאים: [gap-audit.md](gap-audit.md) (GAP-01..62 → FU-1..15; מחזור-1 ✅ הושלם, מחזור-2 פתוח) · [ui-audit.md](ui-audit.md) (ביקורת 13 דפי-UI).
|
מפות-ממצאים: [gap-audit.md](gap-audit.md) (GAP-01..62 → FU-1..15; מחזור-1 ✅ הושלם, מחזור-2 פתוח) · [ui-audit.md](ui-audit.md) (ביקורת 13 דפי-UI, שכבת-קוד) · [ia-audit-redesign.md](../ia-audit-redesign.md) (34 משטחים, 37 ממצאים, שכבת-IA/הפעלה → X17, #127).
|
||||||
בסיס-עיצוב: docs/superpowers/specs/2026-05-30-system-spec-design.md
|
בסיס-עיצוב: docs/superpowers/specs/2026-05-30-system-spec-design.md
|
||||||
|
|||||||
@@ -37,6 +37,26 @@
|
|||||||
> (`cases.proceeding_type`, `db.py:912`). כך "ערר 8137/24" ו-"בל\"מ 8137/24" הם שתי
|
> (`cases.proceeding_type`, `db.py:912`). כך "ערר 8137/24" ו-"בל\"מ 8137/24" הם שתי
|
||||||
> רשומות מובחנות בעלות אותו `case_number=8137-24` ו-`proceeding_type` שונה.
|
> רשומות מובחנות בעלות אותו `case_number=8137-24` ו-`proceeding_type` שונה.
|
||||||
|
|
||||||
|
### 1א. אורך-הסידורי — אות לסוג-ההליך (נוהל-יו"ר, 2026-06-11)
|
||||||
|
|
||||||
|
מבנה ה-`case_number` הוא `<סידורי>-<חודש>-<שנה>` (serial-month-year). **אורך הסידורי מקודד
|
||||||
|
את סוג-ההליך:**
|
||||||
|
|
||||||
|
| אורך סידורי | סוג-הליך | דוגמה | הערה |
|
||||||
|
|-------------|----------|-------|------|
|
||||||
|
| 4 ספרות | **ערר** | `1230-04-26` | הליך עיקרי |
|
||||||
|
| 5 ספרות | **בל"מ** | `85074-09-24` | בקשה להארכת מועד |
|
||||||
|
|
||||||
|
- **הספרה הראשונה ממשיכה לקודד את התחום בשני האורכים** — `1→רישוי`, `8→היטל השבחה`,
|
||||||
|
`9→פיצויים ס'197` (INV-DM/practice_area). תיק בל"מ `85074` → תחום היטל-השבחה.
|
||||||
|
- **הכלל חד-כיווני:** סידורי בן 5 ספרות **הוא** בל"מ (אות אוטומטי, `is_blam_by_number`,
|
||||||
|
`practice_area.py`). סידורי בן 4 ספרות **אינו** מחייב ערר — בל"מ-מורשת בן 4 ספרות עדיין
|
||||||
|
מזוהה מהנושא (`is_blam_subject`). הרקע: ירושלים אימצה מספור 5-ספרתי לבל"מ רק עכשיו; ת"א
|
||||||
|
מזה זמן (למשל `81002-01-21`).
|
||||||
|
- **פתיחת תיק חדש מחייבת את צורת serial-month-year המלאה** (כולל חודש) — ולידציית-הכתיבה
|
||||||
|
(`web-ui/src/lib/schemas/case.ts`) דוחה את צורת המורשת ללא-חודש. ההתאמה-הסלחנית-בקריאה
|
||||||
|
(§3) עדיין בולעת רשומות-מורשת בנות שתי-חוליות לצורך *חיפוש*, לא לצורך *יצירה*.
|
||||||
|
|
||||||
**נרמול-בכתיבה הוא המנגנון הראשי; התאמה-סלחנית-בקריאה היא נוחות משנית בלבד.** כלל-ההנדסה
|
**נרמול-בכתיבה הוא המנגנון הראשי; התאמה-סלחנית-בקריאה היא נוחות משנית בלבד.** כלל-ההנדסה
|
||||||
"נרמול לא תיקון-תסמין" (חוקה §6) קובע: מתקנים את הנתון במקור, לא מטליאים בקריאה. אם רשומה
|
"נרמול לא תיקון-תסמין" (חוקה §6) קובע: מתקנים את הנתון במקור, לא מטליאים בקריאה. אם רשומה
|
||||||
נשמרה בצורה לא-קנונית — היעד הוא לנרמל אותה במיגרציה/בכתיבה, **לא** לסמוך על מנוע-קריאה
|
נשמרה בצורה לא-קנונית — היעד הוא לנרמל אותה במיגרציה/בכתיבה, **לא** לסמוך על מנוע-קריאה
|
||||||
|
|||||||
@@ -44,6 +44,26 @@
|
|||||||
`underlying_date` (מתן הפסק) שונה מ-`digest_date` (גיליון היומון) — מקור-באגים נפוץ; חילוץ-המטא-דאטה
|
`underlying_date` (מתן הפסק) שונה מ-`digest_date` (גיליון היומון) — מקור-באגים נפוץ; חילוץ-המטא-דאטה
|
||||||
מבחין ביניהם מפורשות.
|
מבחין ביניהם מפורשות.
|
||||||
|
|
||||||
|
**`digest_kind` (סיווג-גיליון, V32):** רוב הגיליונות הם `decision` (סיכום פס"ד → `underlying_citation`),
|
||||||
|
אך חלקם `announcement` — עדכון/הודעה ללא הכרעה (חקיקה, נוהל, ברכת-שנה) שאין לו מראה-מקום. החילוץ
|
||||||
|
מסווג כל גיליון ותמיד מחלץ `concept_tag`/`headline`/`summary` (קיימים לכל סוג); `underlying_citation`
|
||||||
|
רק ל-`decision`. **שימוש קריטי:** הגדרת-"כשל" של ה-drain self-heal היא `completed` **עם
|
||||||
|
`digest_kind=''`** (מעולם לא סווג) — כך הודעה (kind=`announcement`, בלי citation) **אינה** נחשבת כשל
|
||||||
|
ואינה מנוסה-מחדש לנצח. ההיוריסטיקה הישנה ("שני השדות ריקים") טיפלה בהודעות בטעות כ-retry אינסופי.
|
||||||
|
|
||||||
|
### 2.1 מקור שני ל-radar — העלון החודשי "עו"ד על נדל"ן"
|
||||||
|
|
||||||
|
פרסום **נפרד** מהיומון היומי: עלון חודשי ממוספר (משרדי צבי שוב + רונית אלפר), **רב-נושאי** — מאמר-עומק,
|
||||||
|
עדכוני-חקיקה, וסט מצביעי-פסיקה מקובצים לפי נושא. נקלט **לאותה טבלת `digests`** (לא קורפוס מקביל — G2),
|
||||||
|
מובחן ע"י `publication='עו"ד על נדל"ן'` (מול `'כל יום'`). עלון אחד **מתפצל ל-N שורות** דרך
|
||||||
|
`bulletin_splitter` (LLM, local-only) → `bulletin_library.ingest_bulletin`:
|
||||||
|
- **מצביעי-פסיקה** → `digest_kind='decision'` — מצטרפים ל-radar ומקושרים לפסק (autolink + X13 כמו היומון).
|
||||||
|
- **מאמרים** → `digest_kind='article'` — טקסט-מלא + embedding לחיפוש-עומק; **רקע בלבד, INV-DIG1 חל** (לא מצוטט).
|
||||||
|
- **עדכוני-חקיקה — לא נקלטים** (החלטת יו"ר).
|
||||||
|
|
||||||
|
מפתח-הדדאפ לפריט-עלון הוא **`content_hash` (per-פריט)**, כי `yomon_number` ריק (ה-upsert על yomon-number
|
||||||
|
לא חל; `uq_digests_content_hash` תופס re-runs). אידמפוטנטי. סקריפט: `scripts/ingest_bulletins.py`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. למה זה לא קורפוס-ציטוט רביעי (הקושיה המרכזית — G2)
|
## 3. למה זה לא קורפוס-ציטוט רביעי (הקושיה המרכזית — G2)
|
||||||
@@ -113,8 +133,10 @@ Fowler — Bounded Context / Canonical Data Model | סטטוס: verified
|
|||||||
**אכיפה:** טבלה פיזית נפרדת `digests`; `ingest_digest` עושה reuse לשירותים אטומיים בלבד
|
**אכיפה:** טבלה פיזית נפרדת `digests`; `ingest_digest` עושה reuse לשירותים אטומיים בלבד
|
||||||
(`extractor.extract_text`, `embeddings.embed_texts`) ולא ל-`ingest.ingest_document`; ביקורת-
|
(`extractor.extract_text`, `embeddings.embed_texts`) ולא ל-`ingest.ingest_document`; ביקורת-
|
||||||
ארכיטקטורה. אוכף את [G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)
|
ארכיטקטורה. אוכף את [G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)
|
||||||
+ כלל-הנדסה "סימטריה" (§6).
|
+ כלל-הנדסה "סימטריה" (§6). **מקור-אמת יחיד:** מצב-הקליטה נשמר אך-ורק בטבלת `digests` (סטטוס +
|
||||||
**הפרה ידועה:** — (תת-מערכת חדשה)
|
`content_hash` ל-idempotency); תיקיות-קבצים (`incoming/`) הן staging בלבד, **לא** state.
|
||||||
|
**הפרה ידועה (תוקנה 2026-06-07):** `ingest_digests_batch.py` העביר קבצים ל-`data/digests/processed/`
|
||||||
|
— state מבוסס-תיקיות מקביל ל-DB. הוסר; הסקריפט מסתמך על dedup ב-content_hash (G2).
|
||||||
|
|
||||||
### INV-DIG3: קישור-לפסק-המקורי הוא הגשר — חוסר-קישור הוא פער גלוי
|
### INV-DIG3: קישור-לפסק-המקורי הוא הגשר — חוסר-קישור הוא פער גלוי
|
||||||
**כלל:** לכל `digest` שדה `linked_case_law_id` (FK ל-`case_law`, nullable). כשהפסק המקורי בקורפוס —
|
**כלל:** לכל `digest` שדה `linked_case_law_id` (FK ל-`case_law`, nullable). כשהפסק המקורי בקורפוס —
|
||||||
|
|||||||
@@ -17,29 +17,52 @@
|
|||||||
**הבחנת-מקור קריטית:** רק **פסקי-דין של בתי-משפט** ניתנים לאחזור ציבורי. **החלטות ועדת-ערר**
|
**הבחנת-מקור קריטית:** רק **פסקי-דין של בתי-משפט** ניתנים לאחזור ציבורי. **החלטות ועדת-ערר**
|
||||||
אינן זמינות ציבורית (נדרש נבו) — מסומנות כפער ולא נשלחות לאחזור.
|
אינן זמינות ציבורית (נדרש נבו) — מסומנות כפער ולא נשלחות לאחזור.
|
||||||
|
|
||||||
**שתי דרכי-מקור ציבוריות:**
|
**דרכי-מקור ציבוריות (ניתוב לפי זמינות-פורמט-נט, לא לפי ערכאה):**
|
||||||
- **עליון** (עע"מ/בג"ץ/ע"א/רע"א/בר"מ/דנ"א) → `supremedecisions.court.gov.il` — הורדה ישירה (httpx), ללא CAPTCHA.
|
- **נט המשפט** (מציג-התיקים) משרת **כל הערכאות** — מחוזי/שלום *וגם עליון* — כל עוד יש מספר
|
||||||
- **מנהלי/מחוזי/שלום** (עת"מ/עמ"נ/...) → מציג-התיקים של **נט המשפט** — ASP.NET WebForms
|
בפורמט תיק-חודש-שנה. ASP.NET WebForms (`__doPostBack`/VIEWSTATE), anti-bot של F5, מסמכים
|
||||||
(`__doPostBack`/VIEWSTATE), anti-bot של F5, reCAPTCHA על החיפוש הציבורי, מסמכים כ-S3 cleared URLs.
|
בצופה-עמודים (turn.js). מחייב **דפדפן-אמת** (host-side) → שירות-מארח ב-pm2 (כדפוס
|
||||||
מחייב **דפדפן-אמת** (host-side), ולכן שירות-מארח ב-pm2 (כדפוס `legal-chat-service`).
|
`legal-chat-service`). **זהו המסלול הראשי המאומת.**
|
||||||
|
- **עליון בפורמט-סדרתי** (עע"מ/בג"ץ NNNN/YY, ללא חודש — לא ניתן לחיפוש בנט) → `supremedecisions.court.gov.il`
|
||||||
|
(httpx, ללא CAPTCHA, ללא דפדפן). **פוענח ואומת (2026-06-08):** `POST Home/SearchVerdicts` עם
|
||||||
|
`document` מובנה (`{Year:"YYYY", CaseNum, OldMainNumFormat:true, SearchText:[…]}`) + כותרת
|
||||||
|
**`X-Requested-With: XMLHttpRequest`** → רשומות; `GET Home/Download?path=&fileName=&type=4` → PDF.
|
||||||
|
בוחר מסמך best-first (פסק-דין→מספר-עמודים) ומדלג על מסמכי published-report החסומים (`s`-prefix).
|
||||||
|
תיקים ישנים-מאוד שלא דיגיטצו (למשל 389/87) → `manual`.
|
||||||
|
|
||||||
|
> **אומת end-to-end (2026-06-07) על עת"מ 46111-12-22** — פס"ד 34 עמ' הורד **אוטונומית מלא,
|
||||||
|
> נטו קוד-פתוח, ללא כרטיס-חכם וללא פתרון-CAPTCHA**. ממצאי-המפתח מהכיול:
|
||||||
|
> - **החיפוש והניווט לתיק — ללא reCAPTCHA כלל.** מסלול: דף-בית → `btnExternalSearchCases`
|
||||||
|
> → מילוי `BamaCaseNumberTextBoxH`(=מס' תיק) + `BamaMonthYearTextBoxHT`(="MM-YY") →
|
||||||
|
> `CaseDetails.aspx` → לשונית "פסקי דין" → `DecisionList.aspx` → צופה `NGCSViewerPage.aspx`.
|
||||||
|
> - **reCAPTCHA קיים רק בצופה ורק על שמירה/הדפסה מפורשת** — *לא* על הצגת המסמך. הצופה
|
||||||
|
> מגיש את העמודים כ-PNG דרך PageMethod **`GetImages`** (4 עמ'/batch) **ללא CAPTCHA**.
|
||||||
|
> אחזור = לכידת `documentNumber` מהקריאה הראשונה + משיכת כל ה-batches ב-`fetch` עם הכותרת
|
||||||
|
> **`X-Requested-With: XMLHttpRequest`** (חובה — ה-WAF חוסם AJAX בלעדיה) → הרכבת PDF (Pillow).
|
||||||
|
> - דפדפן: **Camoufox דרך חבילת-הפייתון** (`camoufox.async_api`, in-process — לא שרת-Node).
|
||||||
|
> על שרת ללא-מסך נדרש **Xvfb** (אחרת Firefox קורס). פותר-ה-reCAPTCHA האודיו (Whisper) נשמר
|
||||||
|
> כ-fallback למסלול-השמירה-המפורש בלבד; מסלול-התמונות אינו זקוק לו.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 1. ארכיטקטורה — שלוש שכבות (tiered)
|
## 1. ארכיטקטורה — שלוש שכבות (tiered)
|
||||||
|
|
||||||
```
|
```
|
||||||
underlying_citation → [classifier] → tier ∈ {supreme, admin, skip}
|
underlying_citation → [classifier] → {tier, האם יש פורמט-נט (תיק-חודש-שנה)}
|
||||||
skip(ערר/בל"מ) → missing_precedent (נבו ידני) — לא אחזור
|
skip(ערר/בל"מ) → missing_precedent (נבו ידני) — לא אחזור
|
||||||
supreme → Tier 0: httpx בקונטיינר → supremedecisions — אוטונומי מלא
|
── ניתוב לפי זמינות-פורמט-נט, לא לפי קידומת (נט המשפט משרת כל הערכאות) ──
|
||||||
admin → Tier 1: legal-court-fetch-service (host/pm2) — אוטונומי-first
|
פורמט-נט קיים (עמ"נ/עת"מ/עליון-בפורמט-נט כמו בר"מ 72182-06-25)
|
||||||
→ Camoufox stealth browser → external-search → reCAPTCHA(audio/Whisper)
|
→ Tier 1: legal-court-fetch-service (host/pm2 + Xvfb) — אוטונומי, מאומת
|
||||||
→ download cleared PDF
|
→ Camoufox(python) → external-search → CaseDetails → פסקי דין
|
||||||
→ Tier 2 fallback: VNC ידני / missing_precedent + התראה — שער-אנושי
|
→ NGCSViewerPage → GetImages(X-Requested-With) → PNGs → PDF
|
||||||
(כל ה-tiers) → precedent_library_upload(source_type=court_ruling) → ingest_precedent
|
עליון סדרתי-בלבד (בג"ץ/בר"מ NNNN/YY, בלי חודש)
|
||||||
→ chunks+embeddings+halachot(pending) → relink digest / close gap
|
→ Tier 0: httpx → supremedecisions (SearchVerdicts+Download) — מפוענח ומאומת
|
||||||
|
כשל אוטונומי → Tier 2: missing_precedent + התראה (VNC עתידי) — שער-אנושי
|
||||||
|
(כל ה-tiers) → precedent_library_upload(source_type=court_ruling) → ingest_precedent
|
||||||
|
→ chunks+embeddings+halachot(pending) → relink digest / close gap
|
||||||
```
|
```
|
||||||
|
|
||||||
מצב-העבודה מנוהל בטבלת-תור `court_fetch_jobs` (idempotent, נצפה, retryable).
|
מצב-העבודה מנוהל בטבלת-תור `court_fetch_jobs` (idempotent, נצפה, retryable). הניקוז
|
||||||
|
האוטומטי: `legal-court-fetch-drain` (pm2 cron שעתי) → `orchestrator.drain_pending`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -59,7 +82,7 @@ underlying_citation → [classifier] → tier ∈ {supreme, admin, skip}
|
|||||||
לא נזרק בשקט. `except: pass` אסור.
|
לא נזרק בשקט. `except: pass` אסור.
|
||||||
**מקור-סמכות:** פרויקטלי-תפעולי — מיישם את [G4](00-constitution.md#inv-g4) וכלל-ההנדסה "אין בליעה שקטה" (§6).
|
**מקור-סמכות:** פרויקטלי-תפעולי — מיישם את [G4](00-constitution.md#inv-g4) וכלל-ההנדסה "אין בליעה שקטה" (§6).
|
||||||
**אכיפה:** טבלת `court_fetch_jobs` (status+error+attempts) + לוג-warning בכל כישלון + Tier-2 gate.
|
**אכיפה:** טבלת `court_fetch_jobs` (status+error+attempts) + לוג-warning בכל כישלון + Tier-2 gate.
|
||||||
**הפרה ידועה:** הפער הקיים ב-X12 — `try_autolink` שנכשל מחזיר `None` בשקט (יתוקן ע"י טריגר זה).
|
**הפרה ידועה:** ~~הפער ב-X12 — `try_autolink` שנכשל מחזיר `None` בשקט~~ → **תוקן**: `try_autolink` שנכשל על ציטוט פס"ד-בימ"ש מזניק job ל-`court_fetch_jobs` (status=pending); `court_fetch_drain` מנקז (סדרתי) ומקשר את היומון חזרה בהצלחה.
|
||||||
|
|
||||||
### INV-CF3: אוטונומי-first, שער-אנושי חובה ב-fallback
|
### INV-CF3: אוטונומי-first, שער-אנושי חובה ב-fallback
|
||||||
**כלל:** האחזור מנסה אוטונומית; אך כש-N נסיונות נכשלים, **שער-אנושי** (VNC לפתרון-CAPTCHA
|
**כלל:** האחזור מנסה אוטונומית; אך כש-N נסיונות נכשלים, **שער-אנושי** (VNC לפתרון-CAPTCHA
|
||||||
@@ -138,8 +161,8 @@ Service / responsible automation) | סטטוס: verified
|
|||||||
| proxy בקונטיינר | `web/court_fetch_proxy.py` | שכפול `web/chat_proxy.py` |
|
| proxy בקונטיינר | `web/court_fetch_proxy.py` | שכפול `web/chat_proxy.py` |
|
||||||
| pm2 | `scripts/legal-court-fetch-service.config.cjs` | שכפול `legal-chat-service.config.cjs` |
|
| pm2 | `scripts/legal-court-fetch-service.config.cjs` | שכפול `legal-chat-service.config.cjs` |
|
||||||
| אורקסטרטור+תור | `services/court_fetch_orchestrator.py` + `db.py` (SCHEMA_Vxx) | דפוס-תור קיים |
|
| אורקסטרטור+תור | `services/court_fetch_orchestrator.py` + `db.py` (SCHEMA_Vxx) | דפוס-תור קיים |
|
||||||
| כלי-MCP | `tools/court_fetch.py` (`court_verdict_fetch`) | חוזה-envelope [X9](X9-mcp-tool-contract.md) |
|
| כלי-MCP | `tools/court_fetch.py` (`court_verdict_fetch` / `court_fetch_status` / `court_fetch_drain`) | חוזה-envelope [X9](X9-mcp-tool-contract.md) |
|
||||||
| טריגר | `services/digest_library.py` (`try_autolink` fail-path) | X12 |
|
| טריגר אוטומטי | `services/digest_library.py` (`try_autolink` fail → `_enqueue_court_fetch`) → drain ע"י `orchestrator.drain_pending` | X12 |
|
||||||
| סוד | `COURT_FETCH_SHARED_SECRET` (Infisical + Coolify) | דפוס `LEGAL_CHAT_SHARED_SECRET`, [X10](X10-deploy-env-secrets.md) |
|
| סוד | `COURT_FETCH_SHARED_SECRET` (Infisical + Coolify) | דפוס `LEGAL_CHAT_SHARED_SECRET`, [X10](X10-deploy-env-secrets.md) |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -149,3 +172,9 @@ Service / responsible automation) | סטטוס: verified
|
|||||||
- F5/anti-bot עלול לחסום IP → politeness סדרתי + Camoufox (INV-CF4).
|
- F5/anti-bot עלול לחסום IP → politeness סדרתי + Camoufox (INV-CF4).
|
||||||
- שבירות מול שינויי-אתר → ריכוז selectors במקום אחד + בדיקות-עשן תקופתיות.
|
- שבירות מול שינויי-אתר → ריכוז selectors במקום אחד + בדיקות-עשן תקופתיות.
|
||||||
- גבול-ToS על אתר .gov → INV-CF7 + שיקול-יו"ר.
|
- גבול-ToS על אתר .gov → INV-CF7 + שיקול-יו"ר.
|
||||||
|
- ~~**Tier-0 (supremedecisions) טרם מפוענח**~~ → **פוענח ומאומת (2026-06-08)** — עליון בפורמט-סדרתי
|
||||||
|
(בג"ץ/בר"מ NNNN/YY) יורד אוטומטית דרך `Home/SearchVerdicts`+`Home/Download`. מגבלה שנותרה: תיקים
|
||||||
|
ישנים-מאוד שלא דיגיטצו בפורטל (0 רשומות) → `manual`. גם `backfill_missing_precedents.py` מזין את
|
||||||
|
ה-`missing_precedents` הפתוחים (עליון+נט-format) לתור-האחזור.
|
||||||
|
- **דליפת-זיכרון מדפדפנים יתומים** (fetch שנתקע/נהרג משאיר `camoufox-bin`) → שלוש שכבות-הגנה:
|
||||||
|
(א) `async with` סוגר את הדפדפן בכל exception; (ב) `asyncio.wait_for` קשיח (`COURT_FETCH_HARD_TIMEOUT_S`, ברירת-מחדל 180ש') מבטל hang + reap; (ג) reaper של `camoufox-bin` יתומים (`ppid=1`) לפני/אחרי כל fetch + דמון `legal-reaper` (pm2) + תקרת `max_memory_restart`. סדרתיות (INV-CF4) מבטיחה שכל דפדפן `ppid=1` הוא שארית בטוחה-להריגה. **הערה:** הדליפה הגדולה בפועל בשרת היא `task-master-mcp` (כלי נפרד), שגם אותו ה-reaper מנקה.
|
||||||
|
|||||||
146
docs/spec/X14-storage-minio.md
Normal file
146
docs/spec/X14-storage-minio.md
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# X14 — אחסון-אובייקטים (Object Storage: MinIO / S3)
|
||||||
|
|
||||||
|
קובץ-תחום זה כפוף ל-[חוקת המערכת](00-constitution.md) והוא ה-deep-dive על **אחסון קבצים בינאריים** —
|
||||||
|
מסמכי-מקור, נגזרים, וייצוא — והגירתם ממערכת-קבצים מקומית (`data/`) ל-**MinIO** (object store תואם-S3).
|
||||||
|
הוא מגדיר את חוזה-האחסון (שכבה יחידה), סכמת-הדליות-והמפתחות, מודל-האי-שינויוּת המשפטי, ותוכנית-ההגירה.
|
||||||
|
|
||||||
|
> **invariant הנדסי + תפעולי-משפטי.** INV-STG1/2/5/6 נשענים על עקרונות מוכרים (S3 API, 12-Factor, presigned-URL,
|
||||||
|
> separation blob↔metadata) — ≥3 מקורות (docs.min.io, AWS S3 spec, minio-py). INV-STG3/4/7 הם תפעוליים/משפטיים
|
||||||
|
> של *מערכת זו* (גבול-ממשל, WORM להחלטות חתומות, git=טקסט) ונקשרים ל-[G2](00-constitution.md) (מסלול-אחסון יחיד).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. מצב קיים (מאומת מול הקוד וה-infra, 2026-06-08)
|
||||||
|
|
||||||
|
### 1.1 מלאי-הדיסק (`data/`, ללא `backups/`)
|
||||||
|
| קטגוריה | נפח | תוכן | סוג |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `data/cases/{case}/` | 1.2GB | `documents/{originals,extracted,proofread,research,backup}`, `drafts/`, `exports/`, `thumbnails/{doc_uuid}/pNNN.jpg`, `.git` per-case | מקור + נגזר |
|
||||||
|
| `data/digests/{reference,incoming}/` | 251MB | יומונים (X12) | מקור |
|
||||||
|
| `data/training/{cmp,cmpa}/{raw,proofread}/` | 157MB | קורפוס-קול + `.git` | מקור |
|
||||||
|
| `data/precedent-library/{appeals_committee,court_ruling,other}/` | 105MB | פסיקה + `thumbnails/` | מקור |
|
||||||
|
| `data/internal-decisions/{region}/` | 45MB | החלטות-פנים לפי מחוז | מקור |
|
||||||
|
| `data/exports/` | 216KB | legacy (הוחלף ב-per-case) | נגזר |
|
||||||
|
| `data/{audit,eval,logs}/` | ~52MB | CSV/JSON תפעוליים — **לא מסמכים, נשארים בדיסק** | תפעולי |
|
||||||
|
|
||||||
|
ספירה (ללא backups): ~9,449 קבצים — 2,473 JPG (thumbnails נגזרים), 883 PDF, 250 TXT (extracted), 155 DOCX, 54 DOC.
|
||||||
|
|
||||||
|
### 1.2 הקונטיינר (Coolify)
|
||||||
|
legal-ai (`gyjo0mtw2c42ej3xxvbz8zio`) רץ עם **bind-mounts**: host `data/`→`/data`, host `data/cases/`→`/cases`.
|
||||||
|
האחסון היום = תיקייה על המארח, חשופה ישירות.
|
||||||
|
|
||||||
|
### 1.3 MinIO — **כבר פרוס ובריא** ✅ (שירות Coolify `minio`, `bx2ykvw94xbutsex41hz4vv8`, 2026-06-08)
|
||||||
|
- **API:** `https://s3.nautilus.marcusgroup.org` (9000) · **Console:** `https://minio.nautilus.marcusgroup.org` (9001)
|
||||||
|
- **Credentials:** `SERVICE_USER_MINIO` / `SERVICE_PASSWORD_MINIO` (סודות מנוהלי-Coolify)
|
||||||
|
- **אחסון:** named-volume `minio-data`→`/data` — **Single-Node Single-Drive**; versioning/object-lock **לא** מופעלים עדיין
|
||||||
|
- **רשת:** רשת-Docker משלו (`bx2ykvw...`, external), **לא** משותפת ל-legal-ai → דרושה קישוריות (§4 שלב 0)
|
||||||
|
|
||||||
|
### 1.4 הקוד — **אין שכבת-אחסון מרכזית** (כשל-השורש שהתחום מייבש)
|
||||||
|
ה-I/O מפוזר על ~8 שירותים, נתיבים נבנים inline:
|
||||||
|
- העלאה: `tools/documents.py:54` (originals), `:152` (training)
|
||||||
|
- חילוץ + thumbnails: `services/processor.py:43,153`
|
||||||
|
- staging פסיקה/יומונים/החלטות: `services/ingest.py:69`
|
||||||
|
- ייצוא DOCX: `services/docx_exporter.py:462`
|
||||||
|
- הגשה (FileResponse): `web/app.py` — 6 endpoints
|
||||||
|
- git per-case: `services/git_sync.py` (`git add .` + push ל-Gitea, sweep כל 30ש׳)
|
||||||
|
|
||||||
|
### 1.5 עמודות-DB המאחסנות נתיבים (schema inline ב-`db.py`, ללא migrations)
|
||||||
|
`documents.file_path` · `cases.active_draft_path` · `case_law.source_document_path` · `digests.source_document_path`
|
||||||
|
· `document_image_pages.image_thumbnail_path` · `precedent_image_pages.image_thumbnail_path` · `draft_final_pairs.final_path`
|
||||||
|
|
||||||
|
### 1.6 Paperclip — צרכן-API בלבד
|
||||||
|
הפלאגין ניגש דרך `listDocuments`/`getDocumentText` ל-API (`plugin-legal-ai/src/legal-api.ts:89`). אינו נוגע בדיסק →
|
||||||
|
**הגירה שקופה אליו** כל עוד ה-API יציב.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Invariants של התחום
|
||||||
|
|
||||||
|
### INV-STG1: שכבת-אחסון יחידה — כל I/O דרך `storage.py`
|
||||||
|
**כלל:** קיים מודול-אחסון **יחיד** (`services/storage.py`) שכל קריאה/כתיבה של קובץ בינארי עוברת דרכו
|
||||||
|
(`put/get/presign_get/presign_put/delete/list`). אסור `open()`/`shutil.copy()`/`Path.write_bytes()` ישיר על
|
||||||
|
נתיב-אחסון מחוץ למודול. **מקיים [G2](00-constitution.md)** — מבטל את ה-I/O המפוזר (§1.4) שהוא מסלול-מקביל-מתפצל.
|
||||||
|
|
||||||
|
### INV-STG2: מפתח-אובייקט אטומי; שם עברי במטא בלבד
|
||||||
|
**כלל:** מפתח-האובייקט הוא ASCII/UUID (`cases/{case}/originals/{uuid}.pdf`). שם-הקובץ העברי המקורי נשמר ב-DB
|
||||||
|
(`*_filename`) וכ-`x-amz-meta-filename` + מוגש דרך `Content-Disposition` ב-presigned-GET. **למה:** תקציב-מפתח
|
||||||
|
1024 bytes (255/segment), עברית=2B/תו, ובעיות percent-encoding/XML — נמנעות.
|
||||||
|
|
||||||
|
### INV-STG3: דליות לפי גבול-ממשל, prefix לפי קטגוריה/תיק
|
||||||
|
**כלל:** versioning/object-lock/replication הם per-bucket → מה שדורש ממשל שונה יושב בדלי נפרד. שלוש דליות
|
||||||
|
קבועות (§3.1); תיקים/קטגוריות הם prefixes, **לא** דלי-לכל-תיק.
|
||||||
|
|
||||||
|
### INV-STG4: "סופי" = WORM (Object-Lock COMPLIANCE)
|
||||||
|
**כלל:** החלטה חתומה/סופית נכתבת לדלי `legal-immutable` עם Object-Lock **COMPLIANCE** + versioning — בלתי-ניתנת
|
||||||
|
לשינוי/מחיקה ע"י איש (כולל root) עד תום-תקופת-השמירה. טיוטות חיות בדלי רגיל ו"מקודמות" (copy) לדלי-הסגור עם החתימה.
|
||||||
|
**(הכרעת-יו"ר 2026-06-08: סופי בלבד; מסמכי-מקור — versioning ללא נעילה קשיחה.)**
|
||||||
|
|
||||||
|
### INV-STG5: pgvector נשאר מקור-האמת לטקסט/embeddings; MinIO = blob בלבד
|
||||||
|
**כלל:** טקסט-מחולץ + embeddings נשארים ב-Postgres/pgvector (מקור-אמת לאחזור). MinIO מאחסן את ה-blob המקורי
|
||||||
|
(+עותק-ארכיון אופציונלי של ה-extracted text). **אסור** ש-MinIO יהיה מקור-אמת לוקטורים. תואם
|
||||||
|
`no-reocr-retrofit` — לא מריצים OCR מחדש בהגירה.
|
||||||
|
|
||||||
|
### INV-STG6: הגשה לדפדפן דרך presigned-URL — bytes לא דרך FastAPI
|
||||||
|
**כלל:** הורדה/תצוגה/העלאה מהדפדפן עוברות ב-presigned-URL (TTL דקות) מול `s3.nautilus.marcusgroup.org`.
|
||||||
|
ה-backend מנפיק את ה-URL בלבד; ה-bytes לא עוברים דרכו. endpoints קיימים שמחזירים FileResponse → 302→presigned.
|
||||||
|
|
||||||
|
### INV-STG7: git-per-case שומר טקסט/מטא בלבד; בינאריים ב-MinIO
|
||||||
|
**כלל:** `.git` per-case ממשיך לגרסן `case.json`/`notes.md`/`documents/extracted/*.txt`/`research/*.md`. PDF/DOCX/JPG
|
||||||
|
מוחרגים מ-tracking (`.gitignore` per-case) ויושבים ב-MinIO. **(הכרעת-יו"ר 2026-06-08.)** `git_sync.py` ו-sweep
|
||||||
|
מסתמכים על אותו working-tree → ההחרגה חייבת לקדום לכל קומיט-הגירה כדי לא לשבור היסטוריה.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. ארכיטקטורת-היעד
|
||||||
|
|
||||||
|
### 3.1 דליות ומפתחות
|
||||||
|
| דלי | Versioning | Object-Lock | prefixes |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `legal-documents` | ✅ | ❌ | `cases/{case}/originals/{uuid}.pdf` · `cases/{case}/proofread/{uuid}.txt` · `precedent-library/{type}/{uuid}.pdf` · `internal-decisions/{region}/{uuid}.pdf` · `digests/{uuid}.pdf` · `training/{cmp\|cmpa}/{raw\|proofread}/{uuid}.pdf` |
|
||||||
|
| `legal-immutable` | ✅ | ✅ COMPLIANCE | `decisions-final/{case}/{uuid}.docx` (החלטות חתומות בלבד) |
|
||||||
|
| `legal-derived` | ❌ | ❌ (+lifecycle) | `thumbnails/{doc_uuid}/pNNN.jpg` · `extracted/{uuid}.txt` (נגזר, ניתן-לשחזור) |
|
||||||
|
|
||||||
|
### 3.2 `services/storage.py` (לב ההגירה) — adapter כפול
|
||||||
|
```
|
||||||
|
put(category, key, data, content_type, meta) -> uri # category→bucket+prefix
|
||||||
|
get(uri) -> bytes
|
||||||
|
presign_get(key, ttl) / presign_put(key, ttl) -> url
|
||||||
|
delete(key) / list(prefix)
|
||||||
|
```
|
||||||
|
backend נבחר ב-env `STORAGE_BACKEND ∈ {filesystem, dual, s3}` (ברירת-מחדל filesystem) — מאפשר מעבר הדרגתי ללא
|
||||||
|
שינוי-התנהגות. SDK: `aioboto3` (async-native מול `endpoint_url=http://minio:9000`); `minio-py` לסקריפטי-הגירה.
|
||||||
|
|
||||||
|
### 3.3 שינויי-DB
|
||||||
|
הוספת `*_object_key` (או נרמול ל-`storage_uri` עם סכמה `s3://`/`file://`) לצד העמודות הקיימות (§1.5); backfill;
|
||||||
|
דה-קומיישן הנתיב-קובץ. תוספת inline ב-`db.py` בסגנון הקיים (אין migrations).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. תוכנית-ביצוע בשלבים (→ TaskMaster, tag legal-ai)
|
||||||
|
|
||||||
|
| שלב | תוכן | תלות |
|
||||||
|
|---|---|---|
|
||||||
|
| **0 — תשתית** | חיבור רשת-Docker (minio↔legal-ai); הזרקת credentials ל-env legal-ai (Coolify); `mc alias`; יצירת 3 דליות + הפעלת versioning + Object-Lock (immutable); הוספת `aioboto3` ל-deps | — |
|
||||||
|
| **1 — שכבת-אחסון** | `services/storage.py` + adapter כפול (default filesystem). אפס שינוי-התנהגות. PR מצהיר INV-STG1/2/3 | 0 |
|
||||||
|
| **2 — חיווט-כתיבה** | הפניית כל נקודות-הכתיבה (§1.4) דרך `storage.py`; כתיבה-כפולה (`STORAGE_BACKEND=dual`) | 1 |
|
||||||
|
| **3 — הגירת-נתונים** | `mc mirror --dry-run`→`--overwrite` של 5 הקטגוריות; backfill `*_object_key` ב-DB; אימות count+checksum | 0,2 |
|
||||||
|
| **4 — חיווט-קריאה + presigned** | endpoints→302→presigned; thumbnails דרך presigned; dual-read (S3, fallback disk); החרגת בינאריים מ-git per-case (INV-STG7) | 2,3 |
|
||||||
|
| **5 — cutover** | `STORAGE_BACKEND=s3`; `mc mirror --watch` עד החלפה; אימות מלא; כיבוי כתיבה-לדיסק | 4 |
|
||||||
|
| **6 — git + גיבוי + ניקוי** | קידום-החלטות-סופיות ל-immutable (INV-STG4); `mc mirror`/bucket-replication מתוזמן off-site; דה-קומיישן bind-mount `data/` (השארת audit/eval/logs) | 5 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. סיכונים
|
||||||
|
- **I/O מפוזר** → INV-STG1 (`storage.py`) חובה לפני כל שאר השלבים, אחרת drift והפרת-G2.
|
||||||
|
- **שמות עבריים כמפתחות** → INV-STG2 (UUID-keys + מטא).
|
||||||
|
- **רשת נפרדת ל-MinIO** → לאמת קישוריות בשלב 0 לפני הכל.
|
||||||
|
- **git-per-case** מצמיד בינאריים ל-Gitea → INV-STG7, ההחרגה חייבת לקדום לכל קומיט.
|
||||||
|
- **SNSD ללא erasure-coding** → גיבוי off-site (שלב 6) הוא חובה, לא nice-to-have.
|
||||||
|
- **בידוד-worktree + ספ-first** → כל PR מצהיר invariants (G2 + INV-STG*).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. קישורים
|
||||||
|
- חוקה: [00-constitution.md](00-constitution.md) · נתונים: [02-data-model.md](02-data-model.md) · קליטה: [01-ingest.md](01-ingest.md)
|
||||||
|
- deploy/env: [X10-deploy-env-secrets.md](X10-deploy-env-secrets.md) · אינטגרציה: [X3-integration-deploy.md](X3-integration-deploy.md)
|
||||||
|
- מקורות-MinIO: docs.min.io (community), AWS S3 object-keys/bucket-naming/presigned-URL, github.com/minio/minio-py
|
||||||
148
docs/spec/X15-agent-platform-port.md
Normal file
148
docs/spec/X15-agent-platform-port.md
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
# X15 — שער-הפלטפורמה (Agent Platform Port)
|
||||||
|
|
||||||
|
> כפוף ל-[00-constitution.md](00-constitution.md). מיישם ומחזק את **INV-G2** (מקור-אמת
|
||||||
|
> יחיד — אין מסלולים מקבילים) ברובד הקַשירה (coupling) בין שכבת-האינטליגנציה לפלטפורמת-הסוכנים.
|
||||||
|
|
||||||
|
## 0. למה המסמך הזה קיים
|
||||||
|
|
||||||
|
פלטפורמת-הסוכנים שלנו היום היא **Paperclip**. היא אינה ליבת-המערכת — היא ה**מעטפת**
|
||||||
|
(לוח-issues, סוכנים מתמידים, human-in-the-loop דרך comments, wakeup/heartbeat, תזמון,
|
||||||
|
תקציבים per-agent, adapters). ליבת-האינטליגנציה — `mcp-server/src`, ה-skills של
|
||||||
|
ההחלטה/הסגנון, ולוגיקת-ההחלטה — היא הנכס שאינו תלוי-פלטפורמה.
|
||||||
|
|
||||||
|
**כשל-השורש שהמסמך מייבש:** מגע עם Paperclip שדולף לתוך שכבת-האינטליגנציה הופך את
|
||||||
|
המעטפת מ"רכיב ניתן-להחלפה מאחורי חוזה" ל"תלות-רוחב ארוגה בכל הקוד". ככל שהדליפה גדלה,
|
||||||
|
"החלפת המעטפת" (או אפילו שדרוג גרסה — ראו ההצמדה ל-opus-4-8) הופכת מ**החלפת-רכיב**
|
||||||
|
ל**כתיבה-מחדש**. זוהי הופעה נוספת של כשל-השורש שכל הספ בא לייבש: מסלולים מקבילים
|
||||||
|
שמתפצלים (drift), הפעם בציר התלות בין שכבות.
|
||||||
|
|
||||||
|
הבסיס התאורטי: **Ports & Adapters / Hexagonal Architecture** (Alistair Cockburn),
|
||||||
|
**The Dependency Rule / Clean Architecture** (Robert C. Martin), **Anti-Corruption
|
||||||
|
Layer** (Eric Evans, DDD). כולם אומרים את אותו הדבר: התלות זורמת פנימה בלבד; הליבה
|
||||||
|
אינה יודעת על העולם החיצון; כל מגע עם מערכת-חוץ עובר דרך שכבת-תרגום אחת (port/adapter).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. השכבות והתפר
|
||||||
|
|
||||||
|
```
|
||||||
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ INTELLIGENCE (תלוי-פלטפורמה = אסור) │
|
||||||
|
│ mcp-server/src · skills/decision · skills/style · decision logic │
|
||||||
|
│ · style-acquisition │
|
||||||
|
│ ── חייב להכיל אפס סמלים ספציפיים-Paperclip ── │
|
||||||
|
└───────────────────────────────┬────────────────────────────────────┘
|
||||||
|
│ ה-PORT (שכבת-התרגום היחידה)
|
||||||
|
│ • web/agent_platform_port.py (Python)
|
||||||
|
│ • .claude/agents/HEARTBEAT.md (פרומפטים)
|
||||||
|
┌───────────────────────────────┴────────────────────────────────────┐
|
||||||
|
│ SHELL (Paperclip-specific — מותר ומוצהר) │
|
||||||
|
│ web/paperclip_client.py · web/paperclip_api.py · plugin-legal-ai │
|
||||||
|
│ · adapters/* · web-ui settings/paperclip-tab · skills/new-company │
|
||||||
|
└───────────────────────────────┬────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
┌─────┴─────┐
|
||||||
|
│ Paperclip │ ← הפלטפורמה. ניתנת-להחלפה.
|
||||||
|
└───────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**הגדרת-ה-Port:** קבוצת-הקבצים היחידה שמורשית לדבר Paperclip:
|
||||||
|
|
||||||
|
| Port surface | תפקיד | מורשה לייבא/להזכיר Paperclip |
|
||||||
|
|--------------|-------|------------------------------|
|
||||||
|
| `web/agent_platform_port.py` *(לבנייה — R2)* | תרגום אירועי-דומיין → קריאות-פלטפורמה | כן — המודול היחיד שמייבא `paperclip_client`/`paperclip_api` |
|
||||||
|
| `web/paperclip_client.py`, `web/paperclip_api.py` | מימוש-הלקוח (מאחורי ה-Port) | כן (זו המעטפת המתוכננת) |
|
||||||
|
| `.claude/agents/HEARTBEAT.md` | מקור-אמת יחיד לפרוטוקול-הריצה של הסוכנים | כן |
|
||||||
|
| `plugin-legal-ai/*`, `adapters/*` | הגשר מצד-Paperclip | כן |
|
||||||
|
| `web-ui` settings/paperclip-tab, agents-tab | UI לניהול-Paperclip עצמו | כן (מוצהר) |
|
||||||
|
| `skills/new-company-setup/SKILL.md` | blueprint-הקמה (חייב לדבר Paperclip) | כן — **חריג מוצהר** |
|
||||||
|
|
||||||
|
כל קובץ אחר — בפרט תחת `mcp-server/src`, `skills/decision`, `skills/style`,
|
||||||
|
ופרומפטי-הסוכנים פרט ל-HEARTBEAT — **אסור** שיכיל סמל ספציפי-Paperclip.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. ה-invariant
|
||||||
|
|
||||||
|
### INV-PORT1 (גלובלי: G12) — שער-הפלטפורמה
|
||||||
|
**כלל:** פלטפורמת-הסוכנים (Paperclip) נגישה אך-ורק דרך ה-Platform Port
|
||||||
|
(`web/agent_platform_port.py` + `HEARTBEAT.md` לפרומפטים). שכבת-האינטליגנציה —
|
||||||
|
`mcp-server/src`, וה-skills של ההחלטה/הסגנון — מכילה **אפס** סמלים ספציפיים-לפלטפורמה
|
||||||
|
(שמות-מוצר, wakeup/heartbeat, pc.sh/pc_request, X-Paperclip-Run-Id, enums של הפלטפורמה).
|
||||||
|
פרומפטי-הסוכנים אינם משכפלים את פרוטוקול-הריצה — הם מצביעים ל-HEARTBEAT.md בלבד. כל מגע
|
||||||
|
חדש עם הפלטפורמה עובר דרך ה-Port.
|
||||||
|
**מקורות:** Alistair Cockburn, *Hexagonal Architecture (Ports & Adapters)* · Robert C.
|
||||||
|
Martin, *Clean Architecture* (The Dependency Rule) · Eric Evans, *Domain-Driven Design*
|
||||||
|
(Anti-Corruption Layer) | סטטוס: verified
|
||||||
|
**אכיפה:** (א) ביקורת-ארכיטקטורה + רשימת-ה-Port (§1); (ב) leak-guard אוטומטי — הרחבת
|
||||||
|
[scripts/spec-guard.sh](../../scripts/spec-guard.sh) שמשווה מול baseline-הדליפה (§4) ומזהיר
|
||||||
|
על דליפה חדשה ב-Edit/Write; (ג) fitness-test ב-CI שנכשל על מונח-Paperclip קשיח חדש תחת
|
||||||
|
`mcp-server/src`; (ד) הצהרת-G12 בתבנית-ה-PR.
|
||||||
|
**הפרה ידועה:** ראו מצאי-הדליפה ב-§3 — `web/app.py` קורא ל-`pc_*` inline בלוגיקת
|
||||||
|
מחזור-חיים של תיקים; 10 פרומפטי-סוכנים משכפלים את פרוטוקול-הריצה במקום להצביע ל-HEARTBEAT.
|
||||||
|
|
||||||
|
> **סיווג:** invariant הנדסי (≥3 מקורות חיצוניים, verified). מורחב מ-G1–G10 בתור **G12**,
|
||||||
|
> ורשום ברשימת-הגלובליים ובאינדקס של [00-constitution.md](00-constitution.md) §5א (R0b הושלם).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. מצאי-הדליפה (baseline — נמדד 2026-06-09)
|
||||||
|
|
||||||
|
מבחן-נטישה: כמה השכבות חוצות את התפר. הספירה היא בסיס-ההשוואה ל-leak-guard.
|
||||||
|
|
||||||
|
| Layer | Paperclip hits | סיווג | מחיר-ניתוק |
|
||||||
|
|-------|----------------|-------|------------|
|
||||||
|
| `mcp-server/src` (כלים) | 5 — **הערות בלבד** | ✅ נקי (זה הנכס) | ~0 |
|
||||||
|
| `skills/` (decision/style) | 36 — רק `new-company-setup` | ✅ נקי (חריג מוצהר) | נמוך |
|
||||||
|
| `web/paperclip_client.py` | 116 | ✅ מעטפת מתוכננת | — |
|
||||||
|
| `web/paperclip_api.py` | 33 | ✅ מעטפת מתוכננת | — |
|
||||||
|
| `web/app.py` | ~33 קריאות `pc_*` + `PAPERCLIP_COMPANIES`×72 | ⚠️ דליפה מבנית (מחזור-חיים) | בינוני |
|
||||||
|
| `.claude/agents/*.md` | 288 — פרוטוקול משוכפל ב-10 פרומפטים | ⚠️⚠️ דליפה מכנית | גבוה (בנפח) |
|
||||||
|
| `web-ui` (`types.ts`×41, `cases.ts`, `sse.ts`, ...) | ~60 | ⚠️ מושגי-פלטפורמה בחוזי-פרונט | בינוני |
|
||||||
|
|
||||||
|
**הממצא המרכזי:** שכבת-האינטליגנציה (`mcp-server/src` + skills של ההחלטה/הסגנון) כבר
|
||||||
|
נקייה כמעט-לחלוטין — 5 ההיטים ב-mcp-server הם הערות בלבד (מקור `company_id`). מחיר-הגירושין
|
||||||
|
בינוני, מרוכז בשלוש שכבות-נושקות-למעטפת.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. מפת-התיקון (R-tasks)
|
||||||
|
|
||||||
|
| R | תחום | תיאור | סיכון |
|
||||||
|
|---|------|-------|-------|
|
||||||
|
| **R0** | ספ | המסמך הזה — מגדיר את ה-Port, ה-invariant, ו-baseline-הדליפה | 0 |
|
||||||
|
| **R0b** | ספ | רישום G12 ב-[00-constitution.md](00-constitution.md) (רשימת-גלובליים + אינדקס) + שורת G12 בתבנית-ה-PR + מצביע ב-CLAUDE.md | 0 |
|
||||||
|
| **R1** | פרומפטים | כל פרוטוקול-הריצה עובר ל-HEARTBEAT.md (מקור יחיד); 10 הפרומפטים מצביעים אליו בלבד. 288→~20 היטים | נמוך |
|
||||||
|
| **R2** | web | יצירת `web/agent_platform_port.py` — המודול היחיד שמייבא `paperclip_client`/`paperclip_api`. `app.py` פולט אירוע-דומיין (`case_archived`/`created`/...) שה-Port מתרגם. `PAPERCLIP_COMPANIES`→`company_map` מאחורי ה-Port | בינוני |
|
||||||
|
| **R3** | web-ui | `types.ts` → namespace `paperclip.*` נפרד; חוזי case/api כלליים נשארים נקיים. טאבי-ניהול-Paperclip נשארים (מעטפת מוצהרת) | נמוך-בינוני |
|
||||||
|
| **R4** | אכיפה | הרחבת `spec-guard.sh` ל-leak-guard מול ה-baseline + fitness-test ב-CI על `mcp-server/src` | 0 |
|
||||||
|
|
||||||
|
**עיקרון-מנחה (G2):** R1+R2 הם G2 בלבוש חדש — מאחדים פרוטוקול/מסלול משוכפל למקור אחד.
|
||||||
|
הם אינם יוצרים מסלול מקביל; הם מסירים אחד.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. מנגנון נגד דליפה-עתידית
|
||||||
|
|
||||||
|
תיקון חד-פעמי חסר-ערך אם הדליפה תחזור בפיצ'ר הבא. שלוש שכבות-אכיפה, כולן מתחברות
|
||||||
|
למנגנונים קיימים (ולא ממציאות מסלול חדש):
|
||||||
|
|
||||||
|
1. **invariant (G12)** — מוגדר כאן, נרשם בחוקה (R0b). first-class, לא הערת-שוליים.
|
||||||
|
2. **אכיפה-אוטומטית** — `spec-guard.sh` כבר מיירט כל Edit/Write בנתיב-קוד; ה-leak-guard
|
||||||
|
(R4) משווה מול baseline §3 ומזהיר על דליפה חדשה **בזמן-אמת**, לפני ה-review.
|
||||||
|
3. **חוזה-תיעוד** — תבנית-ה-PR כבר דורשת הצהרת-invariants; נוסיף שורת-G12 לצ'קליסט
|
||||||
|
("□ לא הוספתי מגע-Paperclip מחוץ ל-Platform Port"). CLAUDE.md §Paperclip + §פרוטוקול
|
||||||
|
כתיבת-קוד מצביעים לכאן.
|
||||||
|
|
||||||
|
> **כלל-זהב לכל פיתוח עתידי:** פיצ'ר חדש שנוגע בפלטפורמה — מוסיף/משנה **רק** קוד תחת
|
||||||
|
> רשימת-ה-Port (§1). אם נדרש מגע-פלטפורמה משכבת-האינטליגנציה — זו אינדיקציה לתכנון
|
||||||
|
> שגוי: הוסיפו במקום זאת אירוע-דומיין שה-Port יתרגם.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. ראו גם
|
||||||
|
- [00-constitution.md](00-constitution.md) — G2 (שאותו מיישם), G12 (לאחר R0b).
|
||||||
|
- [X7-paperclip-client-params.md](X7-paperclip-client-params.md) — פרמטרי לקוח-Paperclip (מתחת ל-Port).
|
||||||
|
- [X4-agents.md](X4-agents.md) — מפת-הסוכנים.
|
||||||
|
- [X3-integration-deploy.md](X3-integration-deploy.md) — אינטגרציה+deploy.
|
||||||
|
- [X16-pipeline-durability.md](X16-pipeline-durability.md) — עמידות-פייפליין (החלטה נפרדת, נושקת).
|
||||||
96
docs/spec/X16-pipeline-durability.md
Normal file
96
docs/spec/X16-pipeline-durability.md
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
# X16 — עמידות-פייפליין (Durable Pipeline Execution)
|
||||||
|
|
||||||
|
> כפוף ל-[00-constitution.md](00-constitution.md). מחזק את **INV-G3** (idempotency)
|
||||||
|
> ב-checkpointing+replay לפייפליינים הדטרמיניסטיים המקומיים. נושק ל-[07-learning.md](07-learning.md)
|
||||||
|
> ו-[X11-citation-corroboration.md](X11-citation-corroboration.md).
|
||||||
|
|
||||||
|
## 0. הבעיה
|
||||||
|
|
||||||
|
שני הפייפליינים המקומיים החד-פעמיים —
|
||||||
|
[final_halacha_pipeline.py](../../scripts/final_halacha_pipeline.py) (כפתור run-halacha,
|
||||||
|
אימות-הלכות, X11) ו-[final_learning_pipeline.py](../../scripts/final_learning_pipeline.py)
|
||||||
|
(כפתור run-learning, למידת-סגנון, 07-learning) — חולקים **צורה זהה**: סקריפט מקומי,
|
||||||
|
3–4 שלבים בטור, idempotent, פאנל-LLM ארוך בסוף (CSV-gated, "can take minutes").
|
||||||
|
|
||||||
|
היום הם **ליניאריים וחסרי-זיכרון**: קריסה באמצע (ניתוק ל-DeepSeek/Gemini, restart של
|
||||||
|
קונטיינר, OOM) → הרצה-מחדש מ-שלב 0. השלבים idempotent ולכן זה **בטוח**, אבל **משלמים שוב**:
|
||||||
|
מחלצים, בונים corroboration על כל הקורפוס, ושופטים מחדש הלכות שכבר נשפטו — דקות וקריאות-LLM
|
||||||
|
לפח.
|
||||||
|
|
||||||
|
**הקשר-סיכון אמיתי:** דליפת task-master (יתומים ppid=1, ~3GB) מסכנת OOM ל-Postgres
|
||||||
|
([project_taskmaster_mcp_memory_leak]). אם OOM הורג ריצת-פאנל ארוכה — היום מתחילים מאפס.
|
||||||
|
|
||||||
|
**הבחנה מ-idempotency:** idempotency = "בטוח להריץ שוב". durable execution = "בטוח להריץ
|
||||||
|
שוב **בלי לשלם שוב**". זה שכלול, לא תחליף.
|
||||||
|
|
||||||
|
## 1. ההכרעה
|
||||||
|
|
||||||
|
להטמיע **LangGraph כספרייה בתוך הסקריפט** (לא כפלטפורמה מחליפה ל-Paperclip): מנוע-העמידות
|
||||||
|
היחיד שהוא state-of-the-art ב-checkpointing+replay+time-travel, בשימוש כ-`import` בתוך
|
||||||
|
הסקריפט המקומי. Paperclip לא מושפע — הכפתור עדיין מעיר את Hermes שמריץ את אותו ה-CLI.
|
||||||
|
|
||||||
|
> **גבול-תחום מפורש (מתחבר ל-G12/X15):** LangGraph נכנס **רק** כמנוע-פנימי של הסקריפטים
|
||||||
|
> המקומיים. אסור להשתמש בו כתחליף-פלטפורמה או כ-orchestrator של הסוכנים — זה ייצור מסלול
|
||||||
|
> מקביל ל-Paperclip (הפרת G2) ויערבב עמידות עם פלטפורמה. HITL/ניתוב-יו"ר נשאר מאחורי
|
||||||
|
> ה-Port (ראו §4 Phase 3).
|
||||||
|
|
||||||
|
**מקורות:** Temporal — *Durable Execution* · Saga / workflow-checkpointing pattern ·
|
||||||
|
Martin Kleppmann, *DDIA* (idempotence & exactly-once) · LangGraph checkpointer/replay docs.
|
||||||
|
|
||||||
|
## 2. ה-invariant
|
||||||
|
|
||||||
|
### INV-DUR1 — עמידות לפייפליינים דטרמיניסטיים
|
||||||
|
**כלל:** פייפליין דטרמיניסטי רב-שלבי משמר את התקדמותו ב-checkpoint מתמיד אחרי כל שלב
|
||||||
|
שהושלם; הרצה-חוזרת של אותה יחידת-עבודה **מדלגת** על שלבים שכבר הושלמו ומתחילה מנקודת-הכשל
|
||||||
|
המדויקת. מימוש-העמידות הוא **משותף** לכל הפייפליינים (`scripts/_pipeline_runtime.py`) —
|
||||||
|
לא מימוש-לכל-סקריפט (G2). חוזה-הכניסה (ה-CLI) נשמר ללא-שינוי.
|
||||||
|
**מקורות:** Temporal (Durable Execution) · Kleppmann *DDIA* (exactly-once) · Saga pattern
|
||||||
|
(workflow checkpointing) | סטטוס: verified
|
||||||
|
**אכיפה:** `_pipeline_runtime.py` עם LangGraph + checkpointer; thread_id דטרמיניסטי
|
||||||
|
לכל יחידת-עבודה (תיק); בדיקת kill-and-resume שמאמתת ששלבים שהושלמו אינם רצים-מחדש.
|
||||||
|
**הפרה ידועה:** היום `final_halacha_pipeline.py` / `final_learning_pipeline.py` ליניאריים
|
||||||
|
— קריסה = הרצה-מחדש מלאה (חוזרים על extract/corroboration/panel).
|
||||||
|
|
||||||
|
## 3. ארכיטקטורה
|
||||||
|
|
||||||
|
```
|
||||||
|
scripts/_pipeline_runtime.py ← מודול-עמידות משותף יחיד (G2)
|
||||||
|
• build_graph(steps) StateGraph: node לכל שלב
|
||||||
|
• SqliteSaver data/checkpoints/<pipeline>.sqlite (לא Postgres המשותף)
|
||||||
|
• run(thread_id, resume) מדלג-אוטומטית על nodes ב-checkpoint
|
||||||
|
```
|
||||||
|
|
||||||
|
**הכרעות-תכנון:**
|
||||||
|
|
||||||
|
1. **Checkpointer = SQLite (`langgraph-checkpoint-sqlite`), לא Postgres.** קובץ תחת
|
||||||
|
`data/checkpoints/`: מקומי (תואם "local-only"), פשוט, ו**נמנע מהאזהרה** ב-CLAUDE.md נגד
|
||||||
|
migrations מ-2 worktrees על Postgres המשותף (`localhost:5433`). PostgresSaver = אופציה
|
||||||
|
עתידית אם נדרש ריכוז/observability.
|
||||||
|
2. **`thread_id = f"<pipeline>:{case_number}"`.** הרצה-חוזרת של אותו תיק מזהה checkpoint
|
||||||
|
לא-גמור וממשיכה אוטומטית; תיק שהושלם = no-op. idempotency + דילוג-checkpoint מתחברים.
|
||||||
|
3. **גרעיניות (מדורגת):**
|
||||||
|
- **גס (P0/P1):** כל שלב = node. קריסה בין-שלבים → המשך מהשלב שנפל. הפאנל node יחיד
|
||||||
|
שרץ-מחדש — אך הוא כבר CSV-backed + idempotent (מדלג פנימית על מה שנשפט).
|
||||||
|
- **עדין (P2, אופציונלי):** פירוק הפאנל ל-map מעל ההלכות/הלקחים (LangGraph `Send`),
|
||||||
|
כל פריט = יחידת-checkpoint → resume תוך-פאנל בלי לשפוט מחדש ברמת-LLM. נשען על ה-CSV
|
||||||
|
הקיים כמקור "כבר-נשפט".
|
||||||
|
4. **סמנטיקת-כשל מפורשת.** היום הכל "non-fatal, continue". עם LangGraph: nodes "מייעצים"
|
||||||
|
(extract, corroboration) — catch+record-status וממשיכים; node "קריטי" (panel) — raise
|
||||||
|
בכשל-קשה → עצירה ב-checkpoint → resume.
|
||||||
|
5. **שימור-חוזה-הכניסה.** ה-CLI (`--case`/`--limit`/`--dry-run`) זהה; run-halacha/run-learning
|
||||||
|
→ Hermes → אותו `python ...pipeline.py --case X` לא משתנה. מוסיפים `--fresh`
|
||||||
|
(ברירת-מחדל: auto-resume אם יש checkpoint לא-גמור לתיק).
|
||||||
|
|
||||||
|
## 4. גלגול מדורג
|
||||||
|
|
||||||
|
| Phase | תחום | מאמץ |
|
||||||
|
|-------|------|------|
|
||||||
|
| **P0** | deps ל-`mcp-server/pyproject` (`langgraph` + `langgraph-checkpoint-sqlite`, venv מקומי בלבד → אפס השפעת-קונטיינר). `_pipeline_runtime.py` עם SqliteSaver. עטיפת 4 שלבי-halacha כ-nodes (גס). CLI זהה. test: kill אחרי [1] → resume → assert [0],[1] לא רצו שוב | ~1 יום |
|
||||||
|
| **P1** | אותו runtime על `final_learning_pipeline` (3 שלבים) — מימוש-עמידות אחד לשניהם (G2) | חצי יום |
|
||||||
|
| **P2** | (אופציונלי) פירוק-פאנל ל-map per-item — resume תוך-פאנל | 1–2 ימים |
|
||||||
|
| **P3** | (עתידי) LangGraph `interrupt()` ל-HITL של היו"ר (split→chair, INV-G10) — **רק מאחורי ה-Port** (X15/G12) | — |
|
||||||
|
|
||||||
|
## 5. ראו גם
|
||||||
|
- [07-learning.md](07-learning.md) · [X11-citation-corroboration.md](X11-citation-corroboration.md)
|
||||||
|
- [X15-agent-platform-port.md](X15-agent-platform-port.md) — הגבול מול הפלטפורמה (G12).
|
||||||
|
- [scripts/SCRIPTS.md](../../scripts/SCRIPTS.md) — הסקריפטים המושפעים.
|
||||||
78
docs/spec/X17-information-architecture.md
Normal file
78
docs/spec/X17-information-architecture.md
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# X17 — ארכיטקטורת-המידע ומשטח-ההפעלה (Information Architecture)
|
||||||
|
|
||||||
|
> **מה זה.** ספ-היעד ל**איך** משטח-ההפעלה (דפים/טאבים/תורים/ניווט/cache) צריך להיות מאורגן — שכבה מעל [X6 (חוזה UI↔API)](X6-ui-api-contract.md). X6 קובע ש**טיפוס** נכון (OpenAPI=SSoT, provenance); X17 קובע ש**משטח** נכון (מקור-אמת יחיד לכל datum, שער אחד לכל החלטה, ניווט מבוסס-משימה).
|
||||||
|
>
|
||||||
|
> **למה.** חיים (2026-06-11): *"המערכת מסובכת מדי לתפעול."* האבחון ([`../ia-audit-redesign.md`](../ia-audit-redesign.md), #127) אימת 37 ממצאים שכולם ביטוי-UI של **G2** מופר שלא הורחב לשכבת-ה-UI. X17 מרים את G2 (מקור-אמת יחיד) ו-G10 (שערים-אנושיים) לשכבת-המשטח, ומקודד את [[feedback_operational_simplicity]] (שער/מקום/ערוץ אחד) כ-invariants אכיפים.
|
||||||
|
>
|
||||||
|
> **גבול קשיח (G10):** X17 מסיר משטחים/ערוצים **כפולים**, לעולם לא **שער**. כל שער-אנושי (אישור-הלכה, פתרון-הערה, אישור-לקח, בחירת-תוצאה) נשאר חובה ומפורש. "שער אחד" = מקום-אחד-להחליט, לא אפס-החלטה.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## INV-IA1 — בעלים-משטח-יחיד לכל datum/מונה (G2 בשכבת-UI)
|
||||||
|
ל-aggregate/מונה נגזר-שרת יש **משטח-בעלים יחיד** שמריץ את השאילתה; משטחים אחרים **מצביעים** אליו (deep-link/pointer), ולעולם לא מריצים מונה-מתחרה client-side. *(אכיפה: מונה-הגייטים חי רק ב-`/approvals`+`['chair','pending']`; `/operations` מצביע. תופס APR-2/3, ADM-2/3.)*
|
||||||
|
- Maintain Consistency and Adhere to Standards (Heuristic #4) — Nielsen Norman Group — https://www.nngroup.com/articles/consistency-and-standards/
|
||||||
|
- 3 Common IA Mistakes (Low Information Scent) — Nielsen Norman Group — https://www.nngroup.com/articles/3-ia-mistakes/
|
||||||
|
- Information Architecture: For the Web and Beyond, 4th ed. (Organization & Labeling Systems) — Rosenfeld, Morville & Arango (O'Reilly) — https://www.oreilly.com/library/view/information-architecture-4th/9781491913529/
|
||||||
|
|
||||||
|
## INV-IA2 — mutation מבטל כל קורא (no stale cross-surface state)
|
||||||
|
כל mutation שמשנה ערך הנקרא במשטח אחר **חייב לבטל כל queryKey שקורא אותו** — כולל aggregators חוצי-namespace. אסור שמשטח יציג ערך תקוע אחרי שינוי במשטח אחר. *(תופס את 16 פערי-הסנכרון: CAS-1/2, APR-1/4/5/6, LRN-6/8/10, MET-1/8, ADM-2/3/5.)*
|
||||||
|
- Query Invalidation — TanStack Query (official docs) — https://tanstack.com/query/latest/docs/framework/react/guides/query-invalidation
|
||||||
|
- Deriving Client State from Server State — TkDodo (Dominik Dorfmeister, TanStack maintainer) — https://tkdodo.eu/blog/deriving-client-state-from-server-state
|
||||||
|
- Visibility of System Status (Heuristic #1) — Nielsen Norman Group — https://www.nngroup.com/articles/visibility-system-status/
|
||||||
|
|
||||||
|
## INV-IA3 — שער-אחד / ערוץ-אחד לכל החלטה (G10/INV-LRN1 נשמרים)
|
||||||
|
לכל החלטה-אנושית **משטח-יחיד ומסלול-כתיבה-יחיד**. אסור משטח-אישור שני או כותב-מקביל לאותה שורה. הלמידה **מנותבת דרך** העורך הקנוני, לא כותבת-במקביל. *(תופס LRN-1/2/3, MET-2/3 — "שני השערים" של חיים, ומירוץ ה-lost-update.)*
|
||||||
|
- Preventing User Errors / Error Prevention (Heuristic #5) — Nielsen Norman Group — https://www.nngroup.com/articles/slips/
|
||||||
|
- Do the hard work to make it simple (Government Design Principles) — GOV.UK / GDS — https://www.gov.uk/guidance/government-design-principles
|
||||||
|
- Don't Make Me Think, Ch.5 — Omit Needless Words/Controls — Steve Krug (O'Reilly) — https://www.oreilly.com/library/view/dont-make-me/0321344758/ch05.html
|
||||||
|
|
||||||
|
## INV-IA4 — ניווט מבוסס-משימה, לא מבוסס-פורמט
|
||||||
|
משטחים מאורגנים לפי **מה המשתמש עושה** (לאשר / לנטר / להגדיר / לחבר), לא לפי מקור-הנתונים הטכני (pm2 מול DB מול תורים). דלת-כניסה אחת לכל משימה. *(אכיפה: `/operations`⊇`/diagnostics` — אותו intent-ניטור; הורדת `/feedback` מהראשי. תופס D5, ADM.)*
|
||||||
|
- Avoid Format-Based Primary Navigation — Nielsen Norman Group — https://www.nngroup.com/articles/format-based-navigation/
|
||||||
|
- Intranet IA Methods (task-based endures over structure-based) — Nielsen Norman Group — https://www.nngroup.com/articles/intranet-ia-methods/
|
||||||
|
- Task list pattern (one list of outstanding tasks per service) — GOV.UK Design System — https://design-system.service.gov.uk/components/task-list/
|
||||||
|
|
||||||
|
## INV-IA5 — סטטוס-אמיתי מגובה-צרכן
|
||||||
|
כל מספר מוצג ממופה ל**צרכן אמיתי** ו**מקור שלם**. אסור KPI שסופר דגל-ללא-צרכן; אסור aggregate מדויק כש-partial-failure השמיט תורם (להציג חלקיות); שדה ב-response — **לרנדר או להסיר**. *(תופס LRN-1/4/5, ADM-1/6, APR-3.)*
|
||||||
|
- Visibility of System Status (Heuristic #1) — Nielsen Norman Group — https://www.nngroup.com/articles/visibility-system-status/
|
||||||
|
- Design with data (Government Design Principles) — GOV.UK / GDS — https://www.gov.uk/guidance/government-design-principles
|
||||||
|
- Minimize Cognitive Load to Maximize Usability — Nielsen Norman Group — https://www.nngroup.com/articles/minimize-cognitive-load/
|
||||||
|
|
||||||
|
## INV-IA6 — שפת-מפעיל מובנת-מאליה (no jargon; precedence in-context)
|
||||||
|
קופי פונה-למפעיל מתאר את **האפקט המשמעותי**, לא מזהי-משימות פנימיים (T7/T15). התנהגות-תחולה/קדימות (universal מוקדם; checklist→appeal_type) מוצגת **בהקשר** דרך progressive disclosure, לא במסמך נפרד. *(תופס MET-4/5/6/7.)*
|
||||||
|
- Don't Make Me Think — Krug's First Law (self-evident) — Steve Krug — https://www.oreilly.com/library/view/dont-make-me/0789723107/ch02.html
|
||||||
|
- Plain language / write for users (Design principles) — U.S. Web Design System (USWDS) — https://designsystem.digital.gov/design-principles/
|
||||||
|
- Progressive Disclosure — Nielsen Norman Group — https://www.nngroup.com/articles/progressive-disclosure/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## משטח-היעד (Target IA)
|
||||||
|
|
||||||
|
### שלושה משטחי-intent ברמת-העל
|
||||||
|
| משטח | intent | בעלים | כלל |
|
||||||
|
|------|--------|-------|-----|
|
||||||
|
| **`/approvals`** | **לאשר** (החלטה-אנושית) | תיבת-הגייטים הקנונית | המקום **היחיד** שפועלים על שער. כרטיס לכל סוג (הלכות/פסיקה-חסרה/הערות/QA) עם מונה+קישור. |
|
||||||
|
| **`/operations`** | **לנטר** (קריאה-בלבד) | משטח-המכונה | בולע את `/diagnostics`. שירותים+תורים+סוכנים+בריאות+`halacha_backlog`. **אפס** שער נפעל כאן; מצביע ל-`/approvals`. |
|
||||||
|
| **`/settings`** | **להגדיר** | משטח-התצורה | Paperclip/סוכנים/env/כלים/בלוקים. עריכת-env משלימה-את-עצמה (staleness+redeploy באותה שורה). |
|
||||||
|
|
||||||
|
### משטחי-תחום (בעלים-יחיד לכל ישות)
|
||||||
|
| תחום | יעד |
|
||||||
|
|------|-----|
|
||||||
|
| **תיק** | **workspace-החלטה אחד** — block-editing + DOCX-פעיל, מחוון-מקור-אמת אחד בבעלות-המערכת, cache-slice משותף. אזור "השלמה והעברה" אחד לשערי-הסיום. |
|
||||||
|
| **למידה** | **תיבת-אישור אחת** (לפי זוג draft↔final) · **ערוץ-כותב אחד + סטטוס "זורם-לכותב" אחד** (`review_status='approved'`) · `applied_to_skill` **מוסר** · כל artifact תלוי-בזוג (progressive disclosure). |
|
||||||
|
| **מתודולוגיה** | **`/methodology` = העורך הקנוני היחיד** (PUT אחד; תג-מקור "ידני/מאומץ-מלמידה"); הלמידה מנותבת-דרכו ומבטלת שני-caches; explainer-תחולה inline. |
|
||||||
|
| **פסיקה** | 3 קורפוסים **נפרדים** (גבול אמיתי, G2/INV-DIG1) אך **מתפעלים אחיד** — שם-חיפוש עקבי, תבנית-"ממתין" אחת, authority בכל-מקום. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## דלתות-ספ (deltas — ✅ קודדו בגל-2 #131)
|
||||||
|
> כל שינוי-ספ דורש ≥3 מקורות (לעיל) + אישור-יו"ר. אושר ע"י חיים (2026-06-11, /goal "בצע את כל הגלים").
|
||||||
|
|
||||||
|
1. **[X6](X6-ui-api-contract.md):** ✅ נוספו **INV-UI7** (aggregate-נגזר=SSoT; mutation מבטל queryKey; אין מונה-מתחרה — מקדד INV-IA1/IA2) · **INV-UI8** (שדה-response מרונדר-או-מוסר; חלקיות מוצגת — INV-IA5).
|
||||||
|
2. **[07-learning §0.4](07-learning.md):** ✅ שער-אישור **אחד** (`review_status='approved'`), טרנזקציית-כותב **אחת** (FOR UPDATE), `applied_to_skill` **הוסר** (מקדד INV-IA3; מיישב את "שני-השערים" של [[feedback_operational_simplicity]]).
|
||||||
|
3. **[00-constitution §G2 "הפרות ידועות"](00-constitution.md):** ✅ נוסף תאום-המתודולוגיה (`discussion_rules['universal']` נכתב ע"י PUT וגם promote — MET-2/3) + המיתון (append אטומי FOR UPDATE + invalidation).
|
||||||
|
|
||||||
|
## הפניות-אחיות
|
||||||
|
- [`../ia-audit-redesign.md`](../ia-audit-redesign.md) — מצב-קיים: 34 משטחים, 37 ממצאים (file:line), כיוון-יעד פר-אשכול.
|
||||||
|
- [X6-ui-api-contract.md](X6-ui-api-contract.md) (UI1–UI6 — X17 מעליו) · [ui-audit.md](ui-audit.md) (ממצאי-קוד פר-רכיב — שכבה מתחת).
|
||||||
|
- [00-constitution.md](00-constitution.md) — [G2](00-constitution.md) (מקור-אמת יחיד) · G10 (שערים-אנושיים) — X17 מרים אותם לשכבת-המשטח.
|
||||||
@@ -86,6 +86,25 @@ TanStack Query — *Important Defaults* (staleTime/refetch) (https://tanstack.co
|
|||||||
מוצגים כשדות-עריכה רגילים ללא סימון.
|
מוצגים כשדות-עריכה רגילים ללא סימון.
|
||||||
**הפרה ידועה:** [precedents/[id]/page.tsx](../../web-ui/src/app/precedents/%5Bid%5D/page.tsx) — `summary`/`headnote`/`key_quote` ללא חיווי-מקור; אין חיווי `searchable` ([gap-audit GAP-36](gap-audit.md)).
|
**הפרה ידועה:** [precedents/[id]/page.tsx](../../web-ui/src/app/precedents/%5Bid%5D/page.tsx) — `summary`/`headnote`/`key_quote` ללא חיווי-מקור; אין חיווי `searchable` ([gap-audit GAP-36](gap-audit.md)).
|
||||||
|
|
||||||
|
### INV-UI7: aggregate-נגזר = מקור-אמת יחיד · כל mutation מבטל כל קורא (G2 בשכבת-ה-cache)
|
||||||
|
**כלל:** ל-aggregate/מונה נגזר-שרת (למשל `/api/chair/pending`) יש **משטח-בעלים יחיד** שמריץ את השאילתה;
|
||||||
|
משטחים אחרים **מצביעים** אליו ולא מריצים מונה-מתחרה client-side. **כל mutation** שמשנה ערך הנקרא במשטח
|
||||||
|
אחר **חייב לבטל כל `queryKey` שקורא אותו** — כולל aggregators חוצי-namespace — כך שאף משטח לא יציג ערך
|
||||||
|
תקוע אחרי שינוי במשטח אחר. מקדד את **[X17 INV-IA1/IA2](X17-information-architecture.md)**; מופע של
|
||||||
|
[G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים) בשכבת-ה-TanStack-Query.
|
||||||
|
**מקור-סמכות:** [X17](X17-information-architecture.md) (≥3 מקורות: TanStack Query invalidation · TkDodo "deriving client state" · NN/g consistency); [ia-audit-redesign.md](../ia-audit-redesign.md) §D1.
|
||||||
|
**אכיפה:** מונה-הגייטים חי רק ב-`/approvals`+`['chair','pending']`; `/operations` מצביע. כל mutation להלכות/
|
||||||
|
פסיקה-חסרה/הערות מבטל `['chair','pending']` (גל-1 #130, PR #207).
|
||||||
|
|
||||||
|
### INV-UI8: שדה-response מרונדר-או-מוסר · חלקיות מוצגת
|
||||||
|
**כלל:** שדה שמופיע ב-response **לרנדר או להסיר** — אסור לזרוק אותו בשקט ב-frontend (אם אין צרכן —
|
||||||
|
להסירו מה-response). KPI מוצג חייב להיות ממופה ל**צרכן אמיתי** (לא דגל אינפורמטיבי-בלבד). aggregate
|
||||||
|
מדויק כש-partial-failure השמיט תורם — **להציג חלקיות** ("+"/"חלקי"), לא מספר-מוקטן-כאילו-שלם. מקדד את
|
||||||
|
**[X17 INV-IA5](X17-information-architecture.md)**.
|
||||||
|
**מקור-סמכות:** [X17](X17-information-architecture.md) (NN/g visibility-of-system-status · GOV.UK design-with-data); [ia-audit-redesign.md](../ia-audit-redesign.md) §D3.
|
||||||
|
**אכיפה:** `halacha_backlog` מרונדר ב-/operations (לא נזרק); `findings_approved` (review_status, צרכן אמיתי)
|
||||||
|
החליף את `findings_applied` (דגל מת); מוני-סוכנים מסמנים "חלקי" כשחברה לא-נטענה (גל-1 #130).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. כללי-עיצוב (Design Rules) — נגזרים מה-invariants
|
## 3. כללי-עיצוב (Design Rules) — נגזרים מה-invariants
|
||||||
|
|||||||
@@ -92,12 +92,14 @@ NCSC/JTC — *AI in Courts* (verifiable citation) | סטטוס: verified
|
|||||||
**אכיפה:** `proofreader.verify_quote` בעת חילוץ → `quote_verified`.
|
**אכיפה:** `proofreader.verify_quote` בעת חילוץ → `quote_verified`.
|
||||||
**הפרה ידועה:** — (קיים; ה-flag נכתב, אך אין חיווי ב-UI — ראה [X6 INV-UI6](X6-ui-api-contract.md)).
|
**הפרה ידועה:** — (קיים; ה-flag נכתב, אך אין חיווי ב-UI — ראה [X6 INV-UI6](X6-ui-api-contract.md)).
|
||||||
|
|
||||||
### INV-FP5: חילוץ אסינכרוני דרך claude_session מקומי
|
### INV-FP5: חילוץ אסינכרוני, מתור, צד-מארח (לא מהקונטיינר)
|
||||||
**כלל:** חילוץ-LLM (מטא, הלכות) רץ **אסינכרוני, מתור**, דרך `claude_session` **מקומי בלבד** — לא חוסם את
|
**כלל:** חילוץ-LLM (מטא, הלכות) רץ **אסינכרוני, מתור, מצד-המארח** — לא חוסם את ה-web ולא קורא ל-LLM
|
||||||
ה-web, ולא קורא ל-LLM מהקונטיינר. מופע של [G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)
|
מהקונטיינר. **בחירת-מנוע לפי אופי-המשימה (לא מסלול מקביל):** חילוץ-מטא הוא משימה *תחומה* (טקסט→JSON)
|
||||||
(מסלול-LLM קנוני יחיד). **פרויקטלי-תפעולי.** תואם זיכרון `feedback_claude_session_local_only`.
|
ולכן רץ על **Gemini Flash** (`gemini_session`, structured JSON) — ה-claude CLI ה-agentic פגע ב-
|
||||||
**מקור-סמכות:** [ingest.py](../../mcp-server/src/legal_mcp/services/ingest.py) (queue בצעד 12 → `process_pending_extractions`); [legal-ai/CLAUDE.md](../../CLAUDE.md) (claude_session local-only).
|
`error_max_turns`; חילוץ-הלכות (רגיש-קול/agentic) נשאר על **`claude_session`** (CLI מקומי, מנוי דפנה).
|
||||||
**אכיפה:** queue + `precedent_process_pending`; קריאות-LLM רק מ-MCP מקומי.
|
שני המנועים מתנקזים לתור-החילוץ הקנוני היחיד ([G2](00-constitution.md#inv-g2-מקור-אמת-יחיד--אין-מסלולים-מקבילים-מתפצלים)). **פרויקטלי-תפעולי.**
|
||||||
|
**מקור-סמכות:** [ingest.py](../../mcp-server/src/legal_mcp/services/ingest.py) (queue → `process_pending_extractions`); [gemini_session.py](../../mcp-server/src/legal_mcp/services/gemini_session.py) (מטא); [legal-ai/CLAUDE.md](../../CLAUDE.md) (claude_session local-only להלכות). `GEMINI_API_KEY` בצד-המארח בלבד — לא בקונטיינר (תואם `feedback_claude_session_local_only`: אין קריאות-LLM מהקונטיינר).
|
||||||
|
**אכיפה:** queue + `precedent_process_pending` + drainers מתוזמנים (`legal-metadata-drain`/CEO); קריאות-LLM רק מצד-המארח.
|
||||||
**הפרה ידועה:** תור-החילוץ **סמוי** (אין הבחנה pending-initial מול pending-review; אין extraction-job table) ([gap-audit GAP-45](gap-audit.md); [X9](X9-mcp-tool-contract.md)).
|
**הפרה ידועה:** תור-החילוץ **סמוי** (אין הבחנה pending-initial מול pending-review; אין extraction-job table) ([gap-audit GAP-45](gap-audit.md); [X9](X9-mcp-tool-contract.md)).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -21,6 +21,29 @@ dependencies = [
|
|||||||
"uvicorn[standard]>=0.30.0",
|
"uvicorn[standard]>=0.30.0",
|
||||||
"httpx>=0.27.0",
|
"httpx>=0.27.0",
|
||||||
"infisicalsdk>=1.0.0",
|
"infisicalsdk>=1.0.0",
|
||||||
|
"aioboto3>=13.0.0", # X14 object storage (MinIO/S3) — services/storage.py
|
||||||
|
]
|
||||||
|
|
||||||
|
[project.optional-dependencies]
|
||||||
|
# Tier-1 court-verdict fetch (X13) — host-only. The container can't run a
|
||||||
|
# browser, so these are NOT in the base deps; install on the host venv with
|
||||||
|
# `pip install -e ".[court-fetch]" && python -m camoufox fetch`. faster-whisper
|
||||||
|
# is only for the explicit-PDF-download reCAPTCHA fallback (the primary
|
||||||
|
# image-API path needs no solving).
|
||||||
|
court-fetch = [
|
||||||
|
"camoufox>=0.4.11",
|
||||||
|
"faster-whisper>=1.0.0",
|
||||||
|
"h2>=4.0.0", # Tier-0 supremedecisions uses httpx http2
|
||||||
|
]
|
||||||
|
# Durable execution for the local one-shot pipelines (X16 / INV-DUR1) —
|
||||||
|
# final_halacha_pipeline / final_learning_pipeline gain crash/OOM resume via
|
||||||
|
# scripts/_pipeline_runtime.py. HOST-ONLY (the pipelines run locally, not in the
|
||||||
|
# container): install on the host venv with `pip install -e ".[durable]"`. The
|
||||||
|
# runtime degrades gracefully to linear execution when these are absent, so the
|
||||||
|
# run-halacha / run-learning buttons keep working until then.
|
||||||
|
durable = [
|
||||||
|
"langgraph>=1.0,<2.0",
|
||||||
|
"langgraph-checkpoint-sqlite>=3.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
|
|||||||
@@ -54,6 +54,10 @@ REDIS_URL = os.environ.get("REDIS_URL", "redis://127.0.0.1:6380/0")
|
|||||||
# pinned.
|
# pinned.
|
||||||
HALACHA_EXTRACT_MODEL = os.environ.get("HALACHA_EXTRACT_MODEL", "claude-opus-4-8")
|
HALACHA_EXTRACT_MODEL = os.environ.get("HALACHA_EXTRACT_MODEL", "claude-opus-4-8")
|
||||||
HALACHA_EXTRACT_EFFORT = os.environ.get("HALACHA_EXTRACT_EFFORT", "xhigh")
|
HALACHA_EXTRACT_EFFORT = os.environ.get("HALACHA_EXTRACT_EFFORT", "xhigh")
|
||||||
|
# Digest (X12) metadata extraction is a simpler, high-volume task (concept tag,
|
||||||
|
# headline, underlying citation, tags from a one-page summary) — Sonnet is the
|
||||||
|
# speed/cost sweet-spot here, unlike halacha extraction which pins Opus. Tune via env.
|
||||||
|
DIGEST_EXTRACT_MODEL = os.environ.get("DIGEST_EXTRACT_MODEL", "claude-sonnet-4-6")
|
||||||
# Effort for BULK queue-drain extraction (process_pending over many precedents).
|
# Effort for BULK queue-drain extraction (process_pending over many precedents).
|
||||||
# xhigh is the quality sweet-spot for a single precedent but very slow at scale
|
# xhigh is the quality sweet-spot for a single precedent but very slow at scale
|
||||||
# (a 64-chunk case ≈ 20 min). Bulk drains use a lighter effort to cut wall-clock;
|
# (a 64-chunk case ≈ 20 min). Bulk drains use a lighter effort to cut wall-clock;
|
||||||
@@ -134,16 +138,81 @@ BM25_HYBRID_ENABLED = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Halacha extraction — auto-approve threshold. Halachot with extractor
|
# Halacha extraction — auto-approve threshold. Halachot with extractor
|
||||||
# confidence >= this value are inserted with review_status='approved'
|
# confidence >= this value AND no quality_flags are inserted
|
||||||
# instead of 'pending_review' (so they immediately appear in
|
# review_status='approved' (so they appear immediately in
|
||||||
# search_precedent_library). Set to a value > 1.0 to disable auto-approval.
|
# search_precedent_library). Set > 1.0 to disable auto-approval.
|
||||||
# 0.80 baseline: 89% of historical extractions land here, manual spot-check
|
#
|
||||||
# of 10 random samples confirmed quality. Tunable via env if drift is
|
# CALIBRATION (#81.8, 2026-06-11) against the 100-item human-labeled gold-set
|
||||||
# observed (e.g. raise to 0.90 if false-positives appear).
|
# (db.goldset_calibrate, ground_truth='chair'; 93 keep / 7 drop):
|
||||||
|
# conf>=0.80 -> precision 0.98, recall 0.53 <- current (errs safe)
|
||||||
|
# conf>=0.75 -> precision 0.96, recall 0.81
|
||||||
|
# conf>=0.70 -> precision 0.94, recall 0.94
|
||||||
|
# 0.80 clears the >=0.90 precision target with margin, so we KEEP it — it errs
|
||||||
|
# toward the chair (low recall = more items reviewed, never the reverse).
|
||||||
|
# Two findings shape the policy:
|
||||||
|
# (a) self-confidence alone is well-calibrated for PRECISION; the rule-based
|
||||||
|
# validators do NOT discriminate keep/drop on the gold-set (P~0.1), so a
|
||||||
|
# "confidence x validators" combined score would only hurt — not adopted.
|
||||||
|
# (b) the real COVERAGE lever is the tri-model panel (halacha_panel_approve):
|
||||||
|
# unanimous-3/3 -> precision 0.988 at 95% coverage, dominating any single
|
||||||
|
# confidence threshold. Lowering this gate to ~0.75 is a governance
|
||||||
|
# tradeoff (more unreviewed auto-approvals, INV-G10) on thin evidence
|
||||||
|
# (7 negatives) -> deferred to chair/panel (TaskMaster #121), not changed here.
|
||||||
HALACHA_AUTO_APPROVE_THRESHOLD = float(
|
HALACHA_AUTO_APPROVE_THRESHOLD = float(
|
||||||
os.environ.get("HALACHA_AUTO_APPROVE_THRESHOLD", "0.80")
|
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
|
||||||
|
# PROPOSE candidate principles with a 0-1 score; candidates are matched across
|
||||||
|
# models (cosine ≥ MATCH_COSINE) → votes (# distinct models) + score (mean of the
|
||||||
|
# voters' scores). Approval rule (chaim): 3 votes → approve (even score<floor) ·
|
||||||
|
# ≥2 votes AND score≥SCORE_FLOOR → approve · 2 votes AND score<floor → chair
|
||||||
|
# (pending_review, G10) · 1 vote → drop. Cap MAX_NEW genuinely-new principles per
|
||||||
|
# decision (by score); recognized-existing (V41 cosine link) don't count against
|
||||||
|
# the cap. Applies to extraction (going forward) AND the retroactive cull (#152).
|
||||||
|
HALACHA_PANEL_SCORE_FLOOR = float(os.environ.get("HALACHA_PANEL_SCORE_FLOOR", "0.85"))
|
||||||
|
HALACHA_PANEL_MAX_NEW = int(os.environ.get("HALACHA_PANEL_MAX_NEW", "5"))
|
||||||
|
# 0.80: legal-principle paraphrases across models land ~0.78-0.82 on voyage-law-2
|
||||||
|
# (the canonical-synthesis dry-run showed faithful rewrites at 0.78-0.80); too high
|
||||||
|
# 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"))
|
||||||
|
# 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
|
# Halacha dedup-on-insert — within-precedent semantic cosine ceiling. Before
|
||||||
# storing a halacha, store_halachot_for_chunk skips it if its rule-embedding has
|
# storing a halacha, store_halachot_for_chunk skips it if its rule-embedding has
|
||||||
# cosine >= this value against an already-stored halacha of the SAME precedent
|
# cosine >= this value against an already-stored halacha of the SAME precedent
|
||||||
@@ -187,6 +256,25 @@ HALACHA_CONSOLIDATE_ENABLED = os.environ.get("HALACHA_CONSOLIDATE_ENABLED", "tru
|
|||||||
HALACHA_CONSOLIDATE_MODEL = os.environ.get("HALACHA_CONSOLIDATE_MODEL", HALACHA_EXTRACT_MODEL)
|
HALACHA_CONSOLIDATE_MODEL = os.environ.get("HALACHA_CONSOLIDATE_MODEL", HALACHA_EXTRACT_MODEL)
|
||||||
HALACHA_CONSOLIDATE_EFFORT = os.environ.get("HALACHA_CONSOLIDATE_EFFORT", "high")
|
HALACHA_CONSOLIDATE_EFFORT = os.environ.get("HALACHA_CONSOLIDATE_EFFORT", "high")
|
||||||
|
|
||||||
|
# V41 canonical lookup-before-insert: cosine gate for reusing an existing canonical
|
||||||
|
# instead of creating a new one. 0.85 is tuned to the embedding space (1024-dim voyage).
|
||||||
|
HALACHA_CANONICAL_LOOKUP_ENABLED = os.environ.get("HALACHA_CANONICAL_LOOKUP_ENABLED", "true").lower() == "true"
|
||||||
|
HALACHA_CANONICAL_THRESHOLD = float(os.environ.get("HALACHA_CANONICAL_THRESHOLD", "0.85"))
|
||||||
|
|
||||||
|
# V41 canonical synthesis (Phase 4) — a claude_session pass that rewrites each
|
||||||
|
# canonical's statement (carried over verbatim from the representative halacha at
|
||||||
|
# backfill) into ONE clean, case-independent legal principle, grounded in the
|
||||||
|
# instances' supporting quotes (INV-AH), then flips review_status
|
||||||
|
# pending_synthesis → pending_review for the chair gate (G10). Opus by default —
|
||||||
|
# substance-bearing rewrite, chair-facing. Runs through the local CLI (zero $-cost,
|
||||||
|
# but consumes subscription usage windows → throttled via usage_limits).
|
||||||
|
# Drift guard: the synthesized statement is re-embedded and compared (cosine) to
|
||||||
|
# the source; below the floor the synthesis is REJECTED (kept as-is, flagged) so a
|
||||||
|
# hallucinated/topic-drifted rewrite never silently overwrites a sound principle.
|
||||||
|
HALACHA_CANONICAL_SYNTH_MODEL = os.environ.get("HALACHA_CANONICAL_SYNTH_MODEL", HALACHA_EXTRACT_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 (OCR for scanned PDFs)
|
||||||
GOOGLE_CLOUD_VISION_API_KEY = os.environ.get("GOOGLE_CLOUD_VISION_API_KEY", "")
|
GOOGLE_CLOUD_VISION_API_KEY = os.environ.get("GOOGLE_CLOUD_VISION_API_KEY", "")
|
||||||
|
|
||||||
@@ -198,6 +286,32 @@ EXPORTS_DIR = DATA_DIR / "exports" # legacy exports only
|
|||||||
# Cases directory — flat structure: data/cases/{case_number}/
|
# Cases directory — flat structure: data/cases/{case_number}/
|
||||||
CASES_DIR = DATA_DIR / "cases"
|
CASES_DIR = DATA_DIR / "cases"
|
||||||
|
|
||||||
|
# ── Object storage (X14 / MinIO) ───────────────────────────────────
|
||||||
|
# Single storage layer (services/storage.py) replaces the scattered file
|
||||||
|
# I/O across ~8 services (INV-STG1 / G2). Backend selector:
|
||||||
|
# "filesystem" (default) — disk under DATA_DIR; current behaviour, no change.
|
||||||
|
# "dual" — write disk + S3, read S3→disk fallback (migration).
|
||||||
|
# "s3" — MinIO only.
|
||||||
|
# See docs/spec/X14-storage-minio.md.
|
||||||
|
STORAGE_BACKEND = os.environ.get("STORAGE_BACKEND", "filesystem").strip().lower()
|
||||||
|
# Endpoint reached server-side (internal Docker network: http://minio:9000).
|
||||||
|
MINIO_ENDPOINT = os.environ.get("MINIO_ENDPOINT", "http://minio:9000")
|
||||||
|
# Public endpoint used when MINTING presigned URLs for the browser (INV-STG6) —
|
||||||
|
# the browser cannot resolve the internal hostname. Falls back to the internal
|
||||||
|
# endpoint when unset (e.g. local dev).
|
||||||
|
MINIO_PUBLIC_ENDPOINT = os.environ.get("MINIO_PUBLIC_ENDPOINT", MINIO_ENDPOINT)
|
||||||
|
MINIO_ACCESS_KEY = os.environ.get("MINIO_ACCESS_KEY", "")
|
||||||
|
MINIO_SECRET_KEY = os.environ.get("MINIO_SECRET_KEY", "")
|
||||||
|
MINIO_REGION = os.environ.get("MINIO_REGION", "us-east-1")
|
||||||
|
# Logical bucket → name. Governance boundaries (INV-STG3): documents
|
||||||
|
# (versioned), immutable (versioned + Object-Lock COMPLIANCE for final
|
||||||
|
# decisions, INV-STG4), derived (thumbnails/extracted text — regenerable).
|
||||||
|
MINIO_BUCKET_DOCUMENTS = os.environ.get("MINIO_BUCKET_DOCUMENTS", "legal-documents")
|
||||||
|
MINIO_BUCKET_IMMUTABLE = os.environ.get("MINIO_BUCKET_IMMUTABLE", "legal-immutable")
|
||||||
|
MINIO_BUCKET_DERIVED = os.environ.get("MINIO_BUCKET_DERIVED", "legal-derived")
|
||||||
|
# Default presigned-URL TTL (seconds). SigV4 hard max is 7 days; keep short.
|
||||||
|
MINIO_PRESIGN_TTL = int(os.environ.get("MINIO_PRESIGN_TTL", "900"))
|
||||||
|
|
||||||
|
|
||||||
def find_case_dir(case_number: str) -> Path:
|
def find_case_dir(case_number: str) -> Path:
|
||||||
"""Return the case directory for a given case number."""
|
"""Return the case directory for a given case number."""
|
||||||
@@ -318,3 +432,34 @@ def parse_llm_json(raw: str):
|
|||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
pass
|
pass
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# ── Committee chair — single source of truth (INV-G2) ─────────────────
|
||||||
|
# internal_committee rows REQUIRE a non-empty chair_name (DB constraint
|
||||||
|
# case_law_internal_chair_check). Our committee (CMP 1xxx, CMPA 8/9xxx) is
|
||||||
|
# chaired by Dafna Tamir; map by case-number prefix so adding a future chair
|
||||||
|
# stays a one-line local change. This resolver is the ONE place both the
|
||||||
|
# FastAPI final-upload path (web/app.py) and the MCP learning path
|
||||||
|
# (tools/workflow.py + services/db.create_case) derive the chair from — so
|
||||||
|
# the two cannot drift into parallel logic. Override via env for another
|
||||||
|
# committee.
|
||||||
|
COMMITTEE_CHAIR_DEFAULT = os.environ.get("DEFAULT_CHAIR_NAME", "דפנה תמיר")
|
||||||
|
COMMITTEE_CHAIR_BY_PREFIX = {
|
||||||
|
"1": COMMITTEE_CHAIR_DEFAULT,
|
||||||
|
"8": COMMITTEE_CHAIR_DEFAULT,
|
||||||
|
"9": COMMITTEE_CHAIR_DEFAULT,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def committee_chair_for_case(case: dict | None, case_number: str) -> str:
|
||||||
|
"""Resolve the chair for one of OUR decisions deterministically (no LLM):
|
||||||
|
the case's own chair_name, else the committee default by case-number prefix.
|
||||||
|
|
||||||
|
Never returns empty for a valid case number — this is how chair_name is
|
||||||
|
normalised at the source (INV-G1) so internal_committee corpus copies of
|
||||||
|
finals never silently fail the DB chair constraint.
|
||||||
|
"""
|
||||||
|
existing = ((case or {}).get("chair_name") or "").strip()
|
||||||
|
if existing:
|
||||||
|
return existing
|
||||||
|
return COMMITTEE_CHAIR_BY_PREFIX.get((case_number or "")[:1], COMMITTEE_CHAIR_DEFAULT)
|
||||||
|
|||||||
@@ -1,148 +1,314 @@
|
|||||||
"""Camoufox-browser client + נט-המשפט navigation flow (X13, Tier 1).
|
"""Camoufox driver for נט המשפט — calibrated, proven flow (X13, Tier 1).
|
||||||
|
|
||||||
Open-source, zero-API-cost stealth browsing: a self-hosted ``camofox-browser``
|
Open-source, zero-API-cost: drives a **Camoufox** stealth browser (a Firefox
|
||||||
REST server (``jo-inc/camofox-browser``, wrapping Camoufox — a Firefox fork
|
fork with C++ fingerprint spoofing) via its official Python package
|
||||||
with C++ fingerprint spoofing) drives a real browser. We talk to it over the
|
(``camoufox.async_api``) — in-process, no separate Node server. The full flow
|
||||||
same REST surface the Hermes agent uses (``~/.hermes/.../browser_camofox.py``):
|
was reverse-engineered and validated end-to-end against עת"מ 46111-12-22
|
||||||
|
(2026-06-07): a 34-page verdict PDF retrieved with **no smart-card and no
|
||||||
|
CAPTCHA-solving**.
|
||||||
|
|
||||||
POST /tabs → {tab_id}
|
The proven path:
|
||||||
POST /tabs/{tab}/navigate {url}
|
1. homepage → DOM-click ``btnExternalSearchCases`` ("תיקים לפי מס' תיק מקור").
|
||||||
GET /tabs/{tab}/snapshot → accessibility tree w/ element refs
|
2. Fill the visible header case-locator: ``BamaCaseNumberTextBoxH`` = case
|
||||||
POST /tabs/{tab}/click {ref}
|
number, ``BamaMonthYearTextBoxHT`` = "MM-YY"; click ``SearchHeaderCaseButton``.
|
||||||
POST /tabs/{tab}/type {ref,text}
|
→ lands on ``FolderCaseDetails/CaseDetails.aspx`` for the case.
|
||||||
GET /tabs/{tab}/screenshot
|
3. Click the "פסקי דין" sidebar tab → ``Decisions/DecisionList.aspx``.
|
||||||
DELETE /sessions/{user}
|
4. Click the document → popup ``Viewer/NGCSViewerPage.aspx?DocumentNumber=…``.
|
||||||
|
5. The viewer renders pages as PNG images via the ``GetImages`` PageMethod —
|
||||||
|
**served without reCAPTCHA** (the reCAPTCHA on the viewer only gates the
|
||||||
|
explicit save/print, which we don't use). Capture the internal
|
||||||
|
``documentNumber`` from the viewer's first ``GetImages`` call, then pull
|
||||||
|
every 4-page batch via ``fetch`` **with header ``X-Requested-With:
|
||||||
|
XMLHttpRequest``** (required — the F5 WAF blocks AJAX calls without it).
|
||||||
|
6. Decode the base64 PNGs → assemble a PDF (Pillow). The existing ingest
|
||||||
|
pipeline OCRs it (Google Vision) → text → corpus.
|
||||||
|
|
||||||
Set ``CAMOFOX_URL`` (e.g. ``http://127.0.0.1:9377``) to enable. The server's
|
Operational requirements (see scripts/legal-court-fetch-service.config.cjs):
|
||||||
``/health`` exposes a VNC URL — that's the human-fallback surface (INV-CF3):
|
* a virtual display — Camoufox/Firefox crashes headless on this server
|
||||||
when the autonomous reCAPTCHA solve fails, the chair opens the VNC and solves
|
without one. Set ``DISPLAY`` to a running Xvfb (e.g. ``:99``).
|
||||||
it live, and this flow continues.
|
* RAM — a Firefox content process loading the heavy ASP.NET pages needs
|
||||||
|
~0.5–1 GB; keep the box from swapping.
|
||||||
|
|
||||||
⚠ CALIBRATION: the נט-המשפט external-case-search is an ASP.NET WebForms app
|
reCAPTCHA note: ``recaptcha_audio`` (local Whisper) remains as a fallback for
|
||||||
behind an F5 WAF + reCAPTCHA. The element selectors and step sequence below
|
the explicit-PDF-download path, but the primary image-API path needs no
|
||||||
are the *documented plan* of the flow; they must be calibrated against the
|
solving, so it is normally unused.
|
||||||
live snapshot on first run (the site rate-limited static probing during
|
|
||||||
development). Every step that can't find its target **raises** a clear Hebrew
|
|
||||||
reason (INV-CF2 — no silent success-with-garbage) so the orchestrator escalates
|
|
||||||
to the Tier-2 human fallback rather than returning an empty/wrong file.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import base64
|
||||||
|
import io
|
||||||
|
import json
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import httpx
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# נט המשפט public entry points (discovered from the homepage __doPostBack menu).
|
|
||||||
NGCS_HOME = "https://www.court.gov.il/ngcs.web.site/homepage.aspx"
|
NGCS_HOME = "https://www.court.gov.il/ngcs.web.site/homepage.aspx"
|
||||||
|
|
||||||
CAMOFOX_URL = os.environ.get("CAMOFOX_URL", "").rstrip("/")
|
# Headless Camoufox needs a virtual display on this server.
|
||||||
_TIMEOUT = float(os.environ.get("COURT_FETCH_BROWSER_TIMEOUT_S", "60"))
|
_DISPLAY = os.environ.get("DISPLAY", "")
|
||||||
|
_NAV_TIMEOUT_MS = int(float(os.environ.get("COURT_FETCH_BROWSER_TIMEOUT_S", "60")) * 1000)
|
||||||
|
_PAGE_BATCH = 4 # the viewer's GetImages batch size
|
||||||
|
_MAX_PAGES = 400 # hard cap on a single document
|
||||||
|
# Hard wall-clock cap on a single fetch so a hung browser can't pin a Firefox
|
||||||
|
# process forever (anti-leak; INV-CF4 politeness). The async-with cleanup runs
|
||||||
|
# on the resulting CancelledError, tearing the browser down.
|
||||||
|
_FETCH_HARD_TIMEOUT_S = float(os.environ.get("COURT_FETCH_HARD_TIMEOUT_S", "180"))
|
||||||
|
|
||||||
|
|
||||||
|
def _reap_orphan_browsers() -> int:
|
||||||
|
"""Kill any ``camoufox-bin`` orphaned to ``ppid=1`` before we launch.
|
||||||
|
|
||||||
|
Fetching is serial (INV-CF4), so any browser not owned by a live parent is
|
||||||
|
a leftover from a prior crashed/killed fetch. Pure /proc, best-effort —
|
||||||
|
never raises into the fetch path.
|
||||||
|
"""
|
||||||
|
killed = 0
|
||||||
|
try:
|
||||||
|
for pid in os.listdir("/proc"):
|
||||||
|
if not pid.isdigit():
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
with open(f"/proc/{pid}/status", "rb") as f:
|
||||||
|
status = f.read().decode("utf-8", "replace")
|
||||||
|
with open(f"/proc/{pid}/cmdline", "rb") as f:
|
||||||
|
cmd = f.read().decode("utf-8", "replace")
|
||||||
|
except OSError:
|
||||||
|
continue
|
||||||
|
if "camoufox-bin" not in cmd:
|
||||||
|
continue
|
||||||
|
ppid = 0
|
||||||
|
for line in status.splitlines():
|
||||||
|
if line.startswith("PPid:"):
|
||||||
|
try: ppid = int(line.split()[1])
|
||||||
|
except (IndexError, ValueError): pass
|
||||||
|
break
|
||||||
|
if ppid == 1:
|
||||||
|
try:
|
||||||
|
os.kill(int(pid), 9)
|
||||||
|
killed += 1
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
if killed:
|
||||||
|
logger.warning("reaped %d orphaned camoufox-bin before fetch", killed)
|
||||||
|
return killed
|
||||||
|
|
||||||
|
|
||||||
class CamofoxUnavailable(RuntimeError):
|
class CamofoxUnavailable(RuntimeError):
|
||||||
"""camofox-browser isn't configured/reachable."""
|
"""Camoufox (or its virtual display) isn't available."""
|
||||||
|
|
||||||
|
|
||||||
class NgcsFlowError(RuntimeError):
|
class NgcsFlowError(RuntimeError):
|
||||||
"""A step in the נט-המשפט flow failed (selector/CAPTCHA/navigation)."""
|
"""A step in the נט-המשפט flow failed (navigation / not found / blocked)."""
|
||||||
|
|
||||||
|
|
||||||
def is_enabled() -> bool:
|
def is_enabled() -> bool:
|
||||||
return bool(CAMOFOX_URL)
|
"""True if the Camoufox package imports (browser binary present)."""
|
||||||
|
try:
|
||||||
|
import camoufox.async_api # noqa: F401
|
||||||
|
return True
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
async def health() -> dict:
|
async def health() -> dict:
|
||||||
"""Probe camofox-browser; surfaces the VNC URL for the human fallback."""
|
return {"camoufox_import": is_enabled(), "display": _DISPLAY or "(none)"}
|
||||||
if not CAMOFOX_URL:
|
|
||||||
raise CamofoxUnavailable("CAMOFOX_URL is not set")
|
|
||||||
async with httpx.AsyncClient(timeout=10) as c:
|
|
||||||
r = await c.get(f"{CAMOFOX_URL}/health")
|
|
||||||
r.raise_for_status()
|
|
||||||
return r.json()
|
|
||||||
|
|
||||||
|
|
||||||
class _Browser:
|
async def _fill_visible(page, id_substr: str, value: str) -> bool:
|
||||||
"""Thin async wrapper over the camofox-browser REST surface."""
|
for el in await page.locator(f"input[id*='{id_substr}']").all():
|
||||||
|
|
||||||
def __init__(self, client: httpx.AsyncClient, tab_id: str, user_id: str):
|
|
||||||
self._c = client
|
|
||||||
self.tab = tab_id
|
|
||||||
self.user = user_id
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
async def open(cls, client: httpx.AsyncClient) -> "_Browser":
|
|
||||||
r = await client.post(f"{CAMOFOX_URL}/tabs", json={})
|
|
||||||
r.raise_for_status()
|
|
||||||
data = r.json()
|
|
||||||
return cls(client, data["tab_id"], data.get("user_id", data["tab_id"]))
|
|
||||||
|
|
||||||
async def navigate(self, url: str) -> None:
|
|
||||||
r = await self._c.post(f"{CAMOFOX_URL}/tabs/{self.tab}/navigate", json={"url": url})
|
|
||||||
r.raise_for_status()
|
|
||||||
|
|
||||||
async def snapshot(self) -> dict:
|
|
||||||
r = await self._c.get(f"{CAMOFOX_URL}/tabs/{self.tab}/snapshot")
|
|
||||||
r.raise_for_status()
|
|
||||||
return r.json()
|
|
||||||
|
|
||||||
async def click(self, ref: str) -> dict:
|
|
||||||
r = await self._c.post(f"{CAMOFOX_URL}/tabs/{self.tab}/click", json={"ref": ref})
|
|
||||||
r.raise_for_status()
|
|
||||||
return r.json()
|
|
||||||
|
|
||||||
async def type(self, ref: str, text: str) -> None:
|
|
||||||
r = await self._c.post(
|
|
||||||
f"{CAMOFOX_URL}/tabs/{self.tab}/type", json={"ref": ref, "text": text}
|
|
||||||
)
|
|
||||||
r.raise_for_status()
|
|
||||||
|
|
||||||
async def close(self) -> None:
|
|
||||||
try:
|
try:
|
||||||
await self._c.delete(f"{CAMOFOX_URL}/sessions/{self.user}")
|
if await el.is_visible() and await el.is_editable():
|
||||||
except httpx.HTTPError:
|
await el.fill(value)
|
||||||
pass
|
return True
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
async def _reach_viewer(page, *, case_number: str, month_year: str):
|
||||||
|
"""Drive home → search → case → פסקי דין → viewer popup. Returns the popup page."""
|
||||||
|
await page.goto(NGCS_HOME, wait_until="domcontentloaded", timeout=_NAV_TIMEOUT_MS)
|
||||||
|
await page.wait_for_timeout(2500)
|
||||||
|
await page.eval_on_selector(
|
||||||
|
"#Header1_UpperMenu1_btnExternalSearchCases", "el => el.click()"
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
await page.wait_for_load_state("domcontentloaded", timeout=_NAV_TIMEOUT_MS)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
await page.wait_for_timeout(4500)
|
||||||
|
|
||||||
|
if not await _fill_visible(page, "BamaCaseNumberTextBoxH", case_number):
|
||||||
|
raise NgcsFlowError("שדה מספר-תיק לא נמצא בעמוד החיפוש")
|
||||||
|
my_filled = False
|
||||||
|
for el in await page.locator("input[id*='BamaMonthYearTextBoxHT']").all():
|
||||||
|
if await el.is_visible():
|
||||||
|
await el.click()
|
||||||
|
await page.keyboard.type(month_year, delay=60)
|
||||||
|
my_filled = True
|
||||||
|
break
|
||||||
|
if not my_filled:
|
||||||
|
raise NgcsFlowError("שדה חודש-שנה לא נמצא")
|
||||||
|
clicked = False
|
||||||
|
for b in await page.locator("[id*='SearchHeaderCaseButton']").all():
|
||||||
|
if await b.is_visible():
|
||||||
|
await b.click()
|
||||||
|
clicked = True
|
||||||
|
break
|
||||||
|
if not clicked:
|
||||||
|
raise NgcsFlowError("כפתור החיפוש לא נמצא")
|
||||||
|
await page.wait_for_timeout(6000)
|
||||||
|
if "CaseDetails" not in page.url:
|
||||||
|
raise NgcsFlowError(
|
||||||
|
f"לא הגענו לעמוד-התיק (URL={page.url[:80]}) — ייתכן שהתיק לא נמצא/לא פתוח לעיון"
|
||||||
|
)
|
||||||
|
|
||||||
|
# פסקי דין tab → DecisionList
|
||||||
|
psak = page.locator("a:has-text('פסקי דין')")
|
||||||
|
opened = False
|
||||||
|
for i in range(await psak.count()):
|
||||||
|
el = psak.nth(i)
|
||||||
|
if await el.is_visible():
|
||||||
|
await el.click()
|
||||||
|
opened = True
|
||||||
|
break
|
||||||
|
if not opened:
|
||||||
|
raise NgcsFlowError("לשונית 'פסקי דין' לא נמצאה בעמוד-התיק")
|
||||||
|
await page.wait_for_timeout(6000)
|
||||||
|
|
||||||
|
# open the verdict document viewer (popup)
|
||||||
|
viewers = page.locator(
|
||||||
|
"a[href*='Viewer'],[onclick*='Viewer'],a[href*='Document'],a:has-text('צפייה')"
|
||||||
|
)
|
||||||
|
async with page.context.expect_page(timeout=15000) as pop:
|
||||||
|
clicked = False
|
||||||
|
for i in range(await viewers.count()):
|
||||||
|
el = viewers.nth(i)
|
||||||
|
if await el.is_visible():
|
||||||
|
await el.click()
|
||||||
|
clicked = True
|
||||||
|
break
|
||||||
|
if not clicked:
|
||||||
|
raise NgcsFlowError("לא נמצא מסמך פסק-דין לצפייה")
|
||||||
|
return await pop.value
|
||||||
|
|
||||||
|
|
||||||
async def fetch_admin_verdict(
|
async def fetch_admin_verdict(
|
||||||
*, file_number: str, month: str, year: str, case_number: str, court: str
|
*, file_number: str, month: str, year: str, case_number: str, court: str
|
||||||
) -> dict:
|
) -> dict:
|
||||||
"""Drive נט המשפט to download an admin/district verdict PDF.
|
"""Fetch an admin/district court verdict as a PDF. Returns
|
||||||
|
``{content: bytes, filename, source_url, court}``; raises on failure.
|
||||||
|
|
||||||
Returns ``{content: bytes, filename: str, source_url: str, court: str}``.
|
``file_number``/``month``/``year`` are the נט-המשפט triple (e.g. 46111/12/22).
|
||||||
Raises ``CamofoxUnavailable`` / ``NgcsFlowError`` on failure.
|
|
||||||
|
|
||||||
The flow (to be calibrated against the live snapshot):
|
|
||||||
1. Open the homepage; trigger "חיפוש תיקים חיצוני" (btnExternalSearchCases).
|
|
||||||
2. Fill the case-number / month / year fields.
|
|
||||||
3. Solve the reCAPTCHA via the audio challenge (recaptcha_audio); on
|
|
||||||
repeated failure, surface the VNC URL for a human solve (INV-CF3).
|
|
||||||
4. Submit; open the matched case; locate the verdict ("פסק דין") document.
|
|
||||||
5. Download the cleared PDF (served via S3 pre-signed URL) and return bytes.
|
|
||||||
"""
|
"""
|
||||||
if not CAMOFOX_URL:
|
try:
|
||||||
|
from camoufox.async_api import AsyncCamoufox
|
||||||
|
except Exception as e:
|
||||||
raise CamofoxUnavailable(
|
raise CamofoxUnavailable(
|
||||||
"שירות-הדפדפן (camofox-browser) אינו מוגדר — הגדר CAMOFOX_URL "
|
"חבילת camoufox אינה מותקנת/זמינה. הרץ `pip install camoufox` ו-"
|
||||||
"והפעל את jo-inc/camofox-browser. ראה docs/spec/X13-court-fetch.md."
|
"`python -m camoufox fetch`. ראה docs/spec/X13-court-fetch.md."
|
||||||
|
) from e
|
||||||
|
if not _DISPLAY:
|
||||||
|
# Headless Firefox crashes here without a virtual display.
|
||||||
|
raise CamofoxUnavailable(
|
||||||
|
"אין DISPLAY — Camoufox דורש Xvfb על שרת ללא מסך. הפעל Xvfb (למשל :99) "
|
||||||
|
"והגדר DISPLAY (ראה pm2 config)."
|
||||||
)
|
)
|
||||||
|
|
||||||
async with httpx.AsyncClient(timeout=_TIMEOUT) as client:
|
month_year = f"{int(month):02d}-{year[-2:]}"
|
||||||
br = await _Browser.open(client)
|
|
||||||
try:
|
|
||||||
await br.navigate(NGCS_HOME)
|
|
||||||
snap = await br.snapshot()
|
|
||||||
_ = snap # calibration anchor: locate btnExternalSearchCases here.
|
|
||||||
|
|
||||||
# The concrete selector/CAPTCHA/download steps require live
|
# Belt-and-suspenders against browser leaks: kill any orphaned browser from
|
||||||
# calibration with camofox running. Until calibrated we fail
|
# a prior crashed fetch before we launch a new one (serial → safe).
|
||||||
# loudly so the orchestrator escalates to the human fallback
|
_reap_orphan_browsers()
|
||||||
# (INV-CF2/CF3) rather than pretending success.
|
|
||||||
raise NgcsFlowError(
|
async def _run() -> dict:
|
||||||
"זרימת נט-המשפט (Tier 1) ממתינה לכיול מול snapshot חי של "
|
doc_num = {"v": None}
|
||||||
"camofox-browser — בקשת-אחזור מוסלמת ל-fallback אנושי (VNC/ידני)."
|
|
||||||
|
async def on_resp(resp):
|
||||||
|
if "GetImages" in resp.url and not doc_num["v"]:
|
||||||
|
try:
|
||||||
|
doc_num["v"] = json.loads(resp.request.post_data).get("documentNumber")
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async with AsyncCamoufox(
|
||||||
|
headless=True, geoip=False, humanize=True, locale="he-IL"
|
||||||
|
) as browser:
|
||||||
|
page = await browser.new_page()
|
||||||
|
page.context.on("response", lambda r: asyncio.create_task(on_resp(r)))
|
||||||
|
vp = await _reach_viewer(page, case_number=file_number, month_year=month_year)
|
||||||
|
source_url = vp.url
|
||||||
|
await vp.wait_for_timeout(9000)
|
||||||
|
if not doc_num["v"]:
|
||||||
|
raise NgcsFlowError("לא נלכד documentNumber מהצופה (ייתכן שהמסמך לא נטען)")
|
||||||
|
|
||||||
|
# Pull every page batch through fetch() with X-Requested-With (WAF-safe).
|
||||||
|
imgs = await vp.evaluate(
|
||||||
|
"""async (args) => {
|
||||||
|
const [dn, maxPages, batch] = args;
|
||||||
|
const url = window.location.href.split('?')[0] + '/GetImages';
|
||||||
|
const out = {};
|
||||||
|
for (let f = 0; f < maxPages; f += batch) {
|
||||||
|
let d;
|
||||||
|
try {
|
||||||
|
const r = await fetch(url, {method:'POST', credentials:'include',
|
||||||
|
headers:{'Content-Type':'application/json; charset=utf-8',
|
||||||
|
'X-Requested-With':'XMLHttpRequest'},
|
||||||
|
body: JSON.stringify({documentNumber:dn, fromIndex:f, toIndex:f+batch-1})});
|
||||||
|
if (!r.ok) break;
|
||||||
|
const j = await r.json(); d = (j.d !== undefined) ? j.d : j;
|
||||||
|
} catch (e) { break; }
|
||||||
|
if (!Array.isArray(d) || d.length === 0) break;
|
||||||
|
d.forEach((html, k) => { if (html) out[f+k] = html; });
|
||||||
|
if (d.length < batch) break;
|
||||||
|
await new Promise(r => setTimeout(r, 350));
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}""",
|
||||||
|
[doc_num["v"], _MAX_PAGES, _PAGE_BATCH],
|
||||||
)
|
)
|
||||||
finally:
|
|
||||||
await br.close()
|
if not imgs:
|
||||||
|
raise NgcsFlowError("לא התקבלו עמודי-מסמך מ-GetImages")
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
pages = []
|
||||||
|
for idx in sorted(imgs, key=lambda x: int(x)):
|
||||||
|
m = re.search(r"base64,([A-Za-z0-9+/=]+)", imgs[idx] or "")
|
||||||
|
if not m:
|
||||||
|
continue
|
||||||
|
pages.append(Image.open(io.BytesIO(base64.b64decode(m.group(1)))).convert("RGB"))
|
||||||
|
if not pages:
|
||||||
|
raise NgcsFlowError("עמודי-המסמך לא ניתנים לפענוח (base64)")
|
||||||
|
|
||||||
|
buf = io.BytesIO()
|
||||||
|
pages[0].save(buf, format="PDF", save_all=True, append_images=pages[1:])
|
||||||
|
content = buf.getvalue()
|
||||||
|
logger.info("נט המשפט: fetched %s — %d pages, %d bytes",
|
||||||
|
case_number, len(pages), len(content))
|
||||||
|
return {
|
||||||
|
"content": content,
|
||||||
|
"filename": f"{case_number}.pdf",
|
||||||
|
"source_url": source_url,
|
||||||
|
"court": court or "בית משפט מחוזי",
|
||||||
|
"pages": len(pages),
|
||||||
|
}
|
||||||
|
|
||||||
|
# Hard wall-clock cap: on a hung browser, the timeout cancels _run(); the
|
||||||
|
# async-with __aexit__ tears the browser down, and the reap below sweeps any
|
||||||
|
# process that outlived the cancellation.
|
||||||
|
try:
|
||||||
|
return await asyncio.wait_for(_run(), _FETCH_HARD_TIMEOUT_S)
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
_reap_orphan_browsers()
|
||||||
|
raise NgcsFlowError(
|
||||||
|
f"אחזור עבר את מגבלת-הזמן ({_FETCH_HARD_TIMEOUT_S:.0f}ש') ובוטל"
|
||||||
|
)
|
||||||
|
finally:
|
||||||
|
_reap_orphan_browsers()
|
||||||
|
|||||||
266
mcp-server/src/legal_mcp/court_fetch_service/mavat_client.py
Normal file
266
mcp-server/src/legal_mcp/court_fetch_service/mavat_client.py
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
"""Camoufox driver for mavat (מנהל התכנון) — pull תב"ע identity + validity.
|
||||||
|
|
||||||
|
mavat sits behind an F5 BIG-IP ASM bot-wall: a scripted curl/httpx gets a
|
||||||
|
302→maintenance, but a real JS-executing browser on this server clears the
|
||||||
|
challenge (verified 2026-06-17). So, like X13's נט-המשפט flow, we drive a
|
||||||
|
**Camoufox** stealth browser over Xvfb — same engine, same host service, no
|
||||||
|
second port/secret (G2).
|
||||||
|
|
||||||
|
The proven flow (validated end-to-end on 101-1031020 → י"פ 13697 and
|
||||||
|
101-1053933 → י"פ 13836, two stable runs):
|
||||||
|
1. goto the SPA home; it redirects to ``/SV1`` once the F5 JS challenge
|
||||||
|
resolves (TS* cookies set) — that is the normal landed state.
|
||||||
|
2. Type the plan number into ``#sv3-search__input`` (the only visible text
|
||||||
|
input) and press Enter. The SPA POSTs ``/rest/api/sv3/Search`` with a
|
||||||
|
reCAPTCHA token it supplies transparently — so reCAPTCHA must stay enabled
|
||||||
|
(blocking it kills the token and results never render). For a unique plan
|
||||||
|
number the SPA then **auto-navigates** to ``/SV4/1/<MMI_ENTITY_ID>/310``.
|
||||||
|
3. That navigation fires ``GET /rest/api/SV4/1?mid=<mid>&guid=0`` (~55 KB
|
||||||
|
JSON). It returns 200 only in the in-app navigation context, so we capture
|
||||||
|
it off the SPA's own request (a standalone replay 404s).
|
||||||
|
4. Parse identity from ``planDetails`` and validity from ``rsInternet``: the
|
||||||
|
row ``LIS_DESC == "פרסום לאישור ברשומות"`` carries ``ED_PUBLICATION_FILE``
|
||||||
|
(= yalkut number) and a ``DETAILS`` string with date + page. The separate
|
||||||
|
"פרסום להפקדה ברשומות" row is the deposit (ignored).
|
||||||
|
|
||||||
|
Driver-crash workaround (required): the SV4 navigation throws an uncaught SPA
|
||||||
|
error that crashes the playwright-firefox driver (it reads
|
||||||
|
``pageError.location.url``). An init-script swallowing ``window.onerror`` +
|
||||||
|
``error``/``unhandledrejection`` (preventDefault) keeps the driver alive.
|
||||||
|
|
||||||
|
INV-AH: ``source_url`` is the mavat plan page; a field mavat doesn't expose comes
|
||||||
|
back empty, never guessed. This module only returns a candidate — the chair gates
|
||||||
|
it (review_status) before block-ט cites it.
|
||||||
|
|
||||||
|
Operational requirements (shared with camofox_client): a virtual display
|
||||||
|
(``DISPLAY``=:99 via Xvfb) and ~0.5–1 GB RAM for the Firefox content process.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
# Reuse the X13 orphan-browser reaper (same camoufox-bin binary) — G2, no copy.
|
||||||
|
from legal_mcp.court_fetch_service.camofox_client import _reap_orphan_browsers
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
MAVAT_HOME = "https://mavat.iplan.gov.il/"
|
||||||
|
_SV4_RESP_RE = re.compile(r"/rest/api/SV4/1\?mid=", re.IGNORECASE)
|
||||||
|
|
||||||
|
_DISPLAY = os.environ.get("DISPLAY", "")
|
||||||
|
_NAV_TIMEOUT_MS = int(float(os.environ.get("PLAN_FETCH_BROWSER_TIMEOUT_S", "60")) * 1000)
|
||||||
|
_FETCH_HARD_TIMEOUT_S = float(os.environ.get("PLAN_FETCH_HARD_TIMEOUT_S", "180"))
|
||||||
|
|
||||||
|
# Proven waits (both verification runs passed; the search box is absent before
|
||||||
|
# the F5 + Angular boot, and the SV4 XHR lands a few seconds after Enter).
|
||||||
|
_HOME_WAIT_MS = 8000
|
||||||
|
_SEARCH_WAIT_MS = 9000
|
||||||
|
_SV4_POLL_TRIES = 8
|
||||||
|
_SV4_POLL_MS = 4000
|
||||||
|
|
||||||
|
_SEARCH_INPUT = "#sv3-search__input"
|
||||||
|
|
||||||
|
# The gazette/yalkut status row vs the (ignored) deposit row.
|
||||||
|
_GAZETTE_LIS_DESC = "פרסום לאישור ברשומות"
|
||||||
|
|
||||||
|
# Swallow the SPA's uncaught SV4 error so the playwright-firefox driver survives.
|
||||||
|
_CRASH_GUARD_JS = """
|
||||||
|
window.addEventListener('error', function (e) { try { e.preventDefault(); } catch (x) {} }, true);
|
||||||
|
window.addEventListener('unhandledrejection', function (e) { try { e.preventDefault(); } catch (x) {} }, true);
|
||||||
|
window.onerror = function () { return true; };
|
||||||
|
"""
|
||||||
|
|
||||||
|
_DATE_RE = re.compile(r"תאריך\s*פרסום\s*:?\s*(\d{1,2})/(\d{1,2})/(\d{4})")
|
||||||
|
_PAGE_RE = re.compile(r"עמוד\s*:?\s*(\d{1,6})")
|
||||||
|
_YALKUT_DETAILS_RE = re.compile(r"ילקוט\s*פרסומים\s*:?\s*(\d{2,6})")
|
||||||
|
|
||||||
|
|
||||||
|
class MavatUnavailable(RuntimeError):
|
||||||
|
"""Camoufox / its virtual display isn't available."""
|
||||||
|
|
||||||
|
|
||||||
|
class MavatFlowError(RuntimeError):
|
||||||
|
"""A step in the mavat flow failed (blocked / not found / not parsed)."""
|
||||||
|
|
||||||
|
|
||||||
|
def is_enabled() -> bool:
|
||||||
|
try:
|
||||||
|
import camoufox.async_api # noqa: F401
|
||||||
|
return True
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
async def health() -> dict:
|
||||||
|
return {"camoufox_import": is_enabled(), "display": _DISPLAY or "(none)"}
|
||||||
|
|
||||||
|
|
||||||
|
# ─── payload parsing ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
def _s(v) -> str:
|
||||||
|
return v.strip() if isinstance(v, str) else ""
|
||||||
|
|
||||||
|
|
||||||
|
def _yalkut_str(v) -> str:
|
||||||
|
"""ED_PUBLICATION_FILE comes as a float (13697.0) — render as a clean int."""
|
||||||
|
if isinstance(v, (int, float)):
|
||||||
|
return str(int(v))
|
||||||
|
s = _s(v)
|
||||||
|
m = re.search(r"\d{2,6}", s)
|
||||||
|
return m.group(0) if m else ""
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_sv4(sv4: dict, plan_number: str, source_url: str) -> dict:
|
||||||
|
"""Map an SV4 plan-detail JSON object to our registry-candidate fields.
|
||||||
|
|
||||||
|
Identity lives in ``planDetails``; validity in the top-level ``rsInternet``.
|
||||||
|
"""
|
||||||
|
pd = sv4.get("planDetails") if isinstance(sv4, dict) else None
|
||||||
|
pd = pd if isinstance(pd, dict) else {}
|
||||||
|
|
||||||
|
number = _s(pd.get("NUMB")) or plan_number
|
||||||
|
# display_name is the clean citation surface form — "תכנית <number>". mavat's
|
||||||
|
# E_NAME is a long descriptive title (the plan's substance), which belongs in
|
||||||
|
# purpose, NOT in the name block-ט cites. Keep E_NAME only as a purpose
|
||||||
|
# fallback so its content isn't lost when GOALS is empty.
|
||||||
|
e_name = _s(pd.get("E_NAME"))
|
||||||
|
display_name = f"תכנית {number}" if number else e_name
|
||||||
|
auth = _s(pd.get("AUTH"))
|
||||||
|
subtype = _s(pd.get("ENTITY_SUBTYPE"))
|
||||||
|
plan_type = f"{auth} ({subtype})" if auth and subtype else (auth or subtype)
|
||||||
|
purpose = _s(pd.get("GOALS")) or e_name
|
||||||
|
|
||||||
|
gazette_date, yalkut_number, yalkut_page = "", "", ""
|
||||||
|
rows = sv4.get("rsInternet") if isinstance(sv4, dict) else None
|
||||||
|
rows = rows if isinstance(rows, list) else []
|
||||||
|
for row in rows:
|
||||||
|
if not isinstance(row, dict) or _s(row.get("LIS_DESC")) != _GAZETTE_LIS_DESC:
|
||||||
|
continue
|
||||||
|
yalkut_number = _yalkut_str(row.get("ED_PUBLICATION_FILE"))
|
||||||
|
details = _s(row.get("DETAILS"))
|
||||||
|
md = _DATE_RE.search(details)
|
||||||
|
if md:
|
||||||
|
d, mo, y = md.groups()
|
||||||
|
gazette_date = f"{int(y):04d}-{int(mo):02d}-{int(d):02d}"
|
||||||
|
if not gazette_date:
|
||||||
|
# fall back to the structured row date (EIS_DATE: ISO-ish or dd/mm/yyyy)
|
||||||
|
ed = _s(row.get("EIS_DATE"))
|
||||||
|
m2 = re.search(r"(\d{4})-(\d{2})-(\d{2})", ed) or re.search(
|
||||||
|
r"(\d{1,2})/(\d{1,2})/(\d{4})", ed)
|
||||||
|
if m2 and "-" in ed:
|
||||||
|
gazette_date = m2.group(0)[:10]
|
||||||
|
elif m2:
|
||||||
|
d, mo, y = m2.groups()
|
||||||
|
gazette_date = f"{int(y):04d}-{int(mo):02d}-{int(d):02d}"
|
||||||
|
if not yalkut_number:
|
||||||
|
my = _YALKUT_DETAILS_RE.search(details)
|
||||||
|
if my:
|
||||||
|
yalkut_number = my.group(1)
|
||||||
|
mp = _PAGE_RE.search(details)
|
||||||
|
if mp:
|
||||||
|
yalkut_page = mp.group(1)
|
||||||
|
break
|
||||||
|
|
||||||
|
return {
|
||||||
|
"plan_number": number,
|
||||||
|
"display_name": display_name,
|
||||||
|
"plan_type": plan_type,
|
||||||
|
"purpose": purpose,
|
||||||
|
"gazette_date": gazette_date,
|
||||||
|
"yalkut_number": yalkut_number,
|
||||||
|
"yalkut_page": yalkut_page,
|
||||||
|
"source_url": source_url,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# ─── driver ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
async def fetch_plan(plan_number: str) -> dict:
|
||||||
|
"""Drive mavat for one plan; return the registry-candidate dict.
|
||||||
|
|
||||||
|
Raises ``MavatUnavailable`` (no browser/display) or ``MavatFlowError``
|
||||||
|
(blocked / not found / not parsed).
|
||||||
|
"""
|
||||||
|
plan_number = (plan_number or "").strip()
|
||||||
|
if not plan_number:
|
||||||
|
raise MavatFlowError("חסר מספר-תכנית")
|
||||||
|
try:
|
||||||
|
from camoufox.async_api import AsyncCamoufox
|
||||||
|
except Exception as e:
|
||||||
|
raise MavatUnavailable(
|
||||||
|
"חבילת camoufox אינה מותקנת/זמינה. ראה docs/spec/X13-court-fetch.md."
|
||||||
|
) from e
|
||||||
|
if not _DISPLAY:
|
||||||
|
raise MavatUnavailable(
|
||||||
|
"אין DISPLAY — Camoufox דורש Xvfb על שרת ללא מסך (למשל :99)."
|
||||||
|
)
|
||||||
|
|
||||||
|
_reap_orphan_browsers()
|
||||||
|
|
||||||
|
async def _run() -> dict:
|
||||||
|
captured: dict = {"sv4": None, "sv4_url": ""}
|
||||||
|
|
||||||
|
async def on_resp(resp):
|
||||||
|
if captured["sv4"] is not None or not _SV4_RESP_RE.search(resp.url):
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
captured["sv4"] = await resp.json()
|
||||||
|
captured["sv4_url"] = resp.url
|
||||||
|
except Exception: # a racing/non-JSON response must not kill the flow
|
||||||
|
pass
|
||||||
|
|
||||||
|
async with AsyncCamoufox(
|
||||||
|
headless=True, geoip=False, humanize=True, locale="he-IL"
|
||||||
|
) as browser:
|
||||||
|
page = await browser.new_page()
|
||||||
|
await page.add_init_script(_CRASH_GUARD_JS)
|
||||||
|
page.context.on("response", lambda r: asyncio.create_task(on_resp(r)))
|
||||||
|
|
||||||
|
# 1) home → let F5 ASM resolve (lands on /SV1; search box appears).
|
||||||
|
await page.goto(MAVAT_HOME, wait_until="domcontentloaded", timeout=_NAV_TIMEOUT_MS)
|
||||||
|
await page.wait_for_timeout(_HOME_WAIT_MS)
|
||||||
|
|
||||||
|
# 2) type the plan number + Enter → sv3/Search → SPA auto-navigates to SV4.
|
||||||
|
box = page.locator(_SEARCH_INPUT)
|
||||||
|
try:
|
||||||
|
await box.wait_for(state="visible", timeout=_NAV_TIMEOUT_MS)
|
||||||
|
await box.fill(plan_number)
|
||||||
|
await box.press("Enter")
|
||||||
|
except Exception as e:
|
||||||
|
raise MavatFlowError(f"שדה-החיפוש ({_SEARCH_INPUT}) לא נמצא/לא נגיש: {e}")
|
||||||
|
await page.wait_for_timeout(_SEARCH_WAIT_MS)
|
||||||
|
|
||||||
|
# 3) the SV4 GET is captured by on_resp; poll until it lands.
|
||||||
|
for _ in range(_SV4_POLL_TRIES):
|
||||||
|
if captured["sv4"] is not None:
|
||||||
|
break
|
||||||
|
await page.wait_for_timeout(_SV4_POLL_MS)
|
||||||
|
|
||||||
|
sv4 = captured["sv4"]
|
||||||
|
if sv4 is None:
|
||||||
|
raise MavatFlowError(
|
||||||
|
"לא נלכד SV4 מ-mavat — ייתכן שהתכנית לא נמצאה, ריבוי-תוצאות, או חסימת-F5."
|
||||||
|
)
|
||||||
|
parsed = _parse_sv4(sv4, plan_number, captured["sv4_url"] or MAVAT_HOME)
|
||||||
|
if not parsed["display_name"]:
|
||||||
|
raise MavatFlowError("SV4 נלכד אך ללא שם-תכנית (planDetails.E_NAME) — פענוח נכשל.")
|
||||||
|
logger.info(
|
||||||
|
"mavat: fetched %s — name=%r gazette=%s yalkut=%s",
|
||||||
|
plan_number, parsed["display_name"], parsed["gazette_date"],
|
||||||
|
parsed["yalkut_number"],
|
||||||
|
)
|
||||||
|
return parsed
|
||||||
|
|
||||||
|
try:
|
||||||
|
return await asyncio.wait_for(_run(), _FETCH_HARD_TIMEOUT_S)
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
_reap_orphan_browsers()
|
||||||
|
raise MavatFlowError(
|
||||||
|
f"משיכת-התכנית עברה את מגבלת-הזמן ({_FETCH_HARD_TIMEOUT_S:.0f}ש') ובוטלה"
|
||||||
|
)
|
||||||
|
finally:
|
||||||
|
_reap_orphan_browsers()
|
||||||
@@ -9,6 +9,9 @@ Endpoints:
|
|||||||
→ {ok, content_b64, filename, source_url, court, reason}
|
→ {ok, content_b64, filename, source_url, court, reason}
|
||||||
REQUIRES Authorization: Bearer <COURT_FETCH_SHARED_SECRET>.
|
REQUIRES Authorization: Bearer <COURT_FETCH_SHARED_SECRET>.
|
||||||
GET /health liveness (no auth); reports camofox + VNC URL if available.
|
GET /health liveness (no auth); reports camofox + VNC URL if available.
|
||||||
|
GET /pm2 read-only pm2 status of legal-* / paperclip services (no auth).
|
||||||
|
POST /pm2/control body {name, action: restart|stop|start} → run pm2 on a
|
||||||
|
whitelisted legal-* process. REQUIRES Bearer (mutating).
|
||||||
|
|
||||||
Run with pm2:
|
Run with pm2:
|
||||||
pm2 start scripts/legal-court-fetch-service.config.cjs
|
pm2 start scripts/legal-court-fetch-service.config.cjs
|
||||||
@@ -30,7 +33,9 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
import aiohttp
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
|
|
||||||
_pkg_root = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
_pkg_root = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
||||||
@@ -38,6 +43,9 @@ if _pkg_root not in sys.path:
|
|||||||
sys.path.insert(0, _pkg_root)
|
sys.path.insert(0, _pkg_root)
|
||||||
|
|
||||||
from legal_mcp.court_fetch_service import camofox_client # noqa: E402
|
from legal_mcp.court_fetch_service import camofox_client # noqa: E402
|
||||||
|
from legal_mcp.court_fetch_service import mavat_client # noqa: E402
|
||||||
|
from legal_mcp.services import usage_limits # noqa: E402
|
||||||
|
from legal_mcp.services import script_runner # noqa: E402
|
||||||
|
|
||||||
logger = logging.getLogger("legal_court_fetch_service")
|
logger = logging.getLogger("legal_court_fetch_service")
|
||||||
|
|
||||||
@@ -55,6 +63,169 @@ async def health(request: web.Request) -> web.Response:
|
|||||||
return web.json_response(info)
|
return web.json_response(info)
|
||||||
|
|
||||||
|
|
||||||
|
# Background services we surface on the /operations dashboard. pm2 jlist is a
|
||||||
|
# host-only capability (the legal-ai container can't run pm2), so the container's
|
||||||
|
# FastAPI proxies this read-only endpoint over the docker bridge. No secret:
|
||||||
|
# pm2 status (names/cpu/mem) carries nothing sensitive and the bind (10.0.1.1)
|
||||||
|
# is already host/container-only.
|
||||||
|
_PM2_PREFIXES = ("legal-", "paperclip")
|
||||||
|
|
||||||
|
|
||||||
|
def _trim_service(a: dict) -> dict:
|
||||||
|
"""Project a pm2 jlist app entry into the fields the dashboard needs."""
|
||||||
|
env = a.get("pm2_env", {}) or {}
|
||||||
|
return {
|
||||||
|
"name": a.get("name", ""),
|
||||||
|
"status": env.get("status", ""),
|
||||||
|
"restarts": env.get("restart_time", 0),
|
||||||
|
"uptime_ms": env.get("pm_uptime", 0),
|
||||||
|
"cpu": (a.get("monit") or {}).get("cpu", 0),
|
||||||
|
"memory_bytes": (a.get("monit") or {}).get("memory", 0),
|
||||||
|
"cron": env.get("cron_restart") or "",
|
||||||
|
"autorestart": env.get("autorestart", True),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def _pm2_run(*args: str, timeout: float = 10) -> tuple[int, bytes, bytes]:
|
||||||
|
"""Run a pm2 subcommand; returns (returncode, stdout, stderr)."""
|
||||||
|
import asyncio as _asyncio
|
||||||
|
|
||||||
|
proc = await _asyncio.create_subprocess_exec(
|
||||||
|
"pm2", *args,
|
||||||
|
stdout=_asyncio.subprocess.PIPE, stderr=_asyncio.subprocess.PIPE,
|
||||||
|
)
|
||||||
|
out, err = await _asyncio.wait_for(proc.communicate(), timeout=timeout)
|
||||||
|
return proc.returncode or 0, out, err
|
||||||
|
|
||||||
|
|
||||||
|
# /operations polls every 5s; the usage endpoint 429s if hit that often (it's
|
||||||
|
# meant for a status bar, not a poll loop). Cache the last good payload and only
|
||||||
|
# re-fetch when older than this — Anthropic sees ~1 req/min regardless of how
|
||||||
|
# many dashboards poll. The 5-hour window moves slowly, so 60s is plenty fresh.
|
||||||
|
_USAGE_TTL_SEC = 60.0
|
||||||
|
_usage_cache: dict = {"ts": 0.0, "data": None}
|
||||||
|
|
||||||
|
|
||||||
|
async def usage_status(request: web.Request) -> web.Response:
|
||||||
|
"""Proxy the claude.ai subscription usage % (host-only — needs the local
|
||||||
|
OAuth token), cached for _USAGE_TTL_SEC. On a fetch failure (e.g. the
|
||||||
|
endpoint's own 429) serve the last good payload if we have one, so a
|
||||||
|
transient limit doesn't blank the dashboard.
|
||||||
|
|
||||||
|
The raw OAuth read is the SHARED single source of truth
|
||||||
|
(legal_mcp.services.usage_limits.subscription_usage) — the SAME reader the
|
||||||
|
halacha drain + supervisor gate on (G1/G2; no triplicated endpoint/creds/UA
|
||||||
|
constants). It's synchronous urllib, so run it in a thread to keep the aiohttp
|
||||||
|
event loop responsive."""
|
||||||
|
now = time.monotonic()
|
||||||
|
if _usage_cache["data"] is not None and (now - _usage_cache["ts"]) < _USAGE_TTL_SEC:
|
||||||
|
return web.json_response(_usage_cache["data"])
|
||||||
|
|
||||||
|
import asyncio as _asyncio
|
||||||
|
# subscription_usage returns None on ANY failure (creds missing / endpoint
|
||||||
|
# 429 / network) — it never throws; serve stale if we have it.
|
||||||
|
data = await _asyncio.get_event_loop().run_in_executor(
|
||||||
|
None, usage_limits.subscription_usage)
|
||||||
|
if data is None:
|
||||||
|
if _usage_cache["data"] is not None:
|
||||||
|
return web.json_response(_usage_cache["data"])
|
||||||
|
return web.json_response({"error": "usage unavailable"}, status=502)
|
||||||
|
|
||||||
|
_usage_cache["ts"] = now
|
||||||
|
_usage_cache["data"] = data
|
||||||
|
return web.json_response(data)
|
||||||
|
|
||||||
|
|
||||||
|
async def pm2_status(request: web.Request) -> web.Response:
|
||||||
|
"""Return a trimmed ``pm2 jlist`` for the legal-ai background services."""
|
||||||
|
try:
|
||||||
|
rc, out, err = await _pm2_run("jlist")
|
||||||
|
if rc != 0:
|
||||||
|
return web.json_response(
|
||||||
|
{"error": f"pm2 jlist failed: {err.decode('utf-8','replace')[:200]}"},
|
||||||
|
status=502,
|
||||||
|
)
|
||||||
|
apps = json.loads(out.decode("utf-8", "replace"))
|
||||||
|
except FileNotFoundError:
|
||||||
|
return web.json_response({"error": "pm2 not found on PATH"}, status=502)
|
||||||
|
except Exception as e: # never throw
|
||||||
|
return web.json_response({"error": f"pm2 error: {e}"}, status=502)
|
||||||
|
|
||||||
|
services = [
|
||||||
|
_trim_service(a) for a in apps
|
||||||
|
if any(str(a.get("name", "")).startswith(p) for p in _PM2_PREFIXES)
|
||||||
|
]
|
||||||
|
services.sort(key=lambda s: s["name"])
|
||||||
|
return web.json_response({"services": services})
|
||||||
|
|
||||||
|
|
||||||
|
# Process control (restart/stop/start) for the dashboard's "Windows-services"
|
||||||
|
# panel. Mutating, so it requires the Bearer secret (unlike read-only /pm2).
|
||||||
|
# Whitelisted to ``legal-`` names only — never paperclip or arbitrary processes.
|
||||||
|
_PM2_ACTIONS = {"restart", "stop", "start"}
|
||||||
|
|
||||||
|
# Our own pm2 process name. Restarting/stopping ourselves kills this process
|
||||||
|
# mid-reply, so those self-actions are detached (see pm2_control).
|
||||||
|
_OWN_PM2_NAME = os.environ.get("COURT_FETCH_SERVICE_PM2_NAME", "legal-court-fetch-service")
|
||||||
|
|
||||||
|
|
||||||
|
async def pm2_control(request: web.Request) -> web.Response:
|
||||||
|
"""Run ``pm2 <action> <name>`` for a whitelisted legal-* process."""
|
||||||
|
unauth = _check_bearer(request)
|
||||||
|
if unauth is not None:
|
||||||
|
return unauth
|
||||||
|
try:
|
||||||
|
body = await request.json()
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
return web.json_response({"error": "invalid JSON body"}, status=400)
|
||||||
|
|
||||||
|
name = str(body.get("name", "")).strip()
|
||||||
|
action = str(body.get("action", "")).strip()
|
||||||
|
if action not in _PM2_ACTIONS:
|
||||||
|
return web.json_response(
|
||||||
|
{"error": f"action must be one of {sorted(_PM2_ACTIONS)}"}, status=400
|
||||||
|
)
|
||||||
|
if not name.startswith("legal-"):
|
||||||
|
return web.json_response(
|
||||||
|
{"error": "name must be a legal-* process"}, status=403
|
||||||
|
)
|
||||||
|
|
||||||
|
# Self restart/stop kills this process before it can reply (client sees a
|
||||||
|
# dropped connection / 502) even though pm2 does perform the action. Detach
|
||||||
|
# it with a brief delay so the HTTP response flushes first, then report
|
||||||
|
# success optimistically.
|
||||||
|
if name == _OWN_PM2_NAME and action in ("restart", "stop"):
|
||||||
|
import asyncio as _asyncio
|
||||||
|
|
||||||
|
await _asyncio.create_subprocess_shell(f"sleep 1; pm2 {action} {name} --silent")
|
||||||
|
return web.json_response(
|
||||||
|
{"ok": True, "action": action, "deferred": True, "service": None}
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc, out, err = await _pm2_run(action, name, "--silent", timeout=30)
|
||||||
|
if rc != 0:
|
||||||
|
return web.json_response(
|
||||||
|
{"ok": False,
|
||||||
|
"error": f"pm2 {action} {name} failed: "
|
||||||
|
f"{err.decode('utf-8','replace')[:200]}"},
|
||||||
|
status=502,
|
||||||
|
)
|
||||||
|
# Re-read just this process so the UI settles on the real new state.
|
||||||
|
rc2, out2, _ = await _pm2_run("jlist")
|
||||||
|
svc = None
|
||||||
|
if rc2 == 0:
|
||||||
|
for a in json.loads(out2.decode("utf-8", "replace")):
|
||||||
|
if a.get("name") == name:
|
||||||
|
svc = _trim_service(a)
|
||||||
|
break
|
||||||
|
return web.json_response({"ok": True, "action": action, "service": svc})
|
||||||
|
except FileNotFoundError:
|
||||||
|
return web.json_response({"error": "pm2 not found on PATH"}, status=502)
|
||||||
|
except Exception as e: # never throw
|
||||||
|
return web.json_response({"ok": False, "error": f"pm2 error: {e}"}, status=502)
|
||||||
|
|
||||||
|
|
||||||
def _check_bearer(request: web.Request) -> web.Response | None:
|
def _check_bearer(request: web.Request) -> web.Response | None:
|
||||||
auth = request.headers.get("Authorization", "")
|
auth = request.headers.get("Authorization", "")
|
||||||
expected = "Bearer " + _SHARED_SECRET
|
expected = "Bearer " + _SHARED_SECRET
|
||||||
@@ -103,10 +274,173 @@ async def fetch(request: web.Request) -> web.Response:
|
|||||||
return web.json_response({"ok": False, "reason": f"unexpected: {e}"}, status=200)
|
return web.json_response({"ok": False, "reason": f"unexpected: {e}"}, status=200)
|
||||||
|
|
||||||
|
|
||||||
|
async def plan_fetch(request: web.Request) -> web.Response:
|
||||||
|
"""Fetch one תב"ע's identity + validity from mavat (מנהל התכנון).
|
||||||
|
|
||||||
|
Body ``{plan_number}`` → ``{ok, plan: {...}, reason}``. Same Bearer + bind as
|
||||||
|
/fetch. The browser work (Camoufox over Xvfb past F5 ASM) lives in
|
||||||
|
``mavat_client``; expected failures (not found / blocked) come back ok=false
|
||||||
|
at HTTP 200 so the caller renders a reason rather than treating it as a 5xx.
|
||||||
|
"""
|
||||||
|
unauth = _check_bearer(request)
|
||||||
|
if unauth is not None:
|
||||||
|
return unauth
|
||||||
|
try:
|
||||||
|
body = await request.json()
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
return web.json_response({"error": "invalid JSON body"}, status=400)
|
||||||
|
|
||||||
|
plan_number = str(body.get("plan_number", "")).strip()
|
||||||
|
if not plan_number:
|
||||||
|
return web.json_response({"ok": False, "reason": "missing plan_number"}, status=400)
|
||||||
|
|
||||||
|
try:
|
||||||
|
plan = await mavat_client.fetch_plan(plan_number)
|
||||||
|
return web.json_response({"ok": True, "plan": plan})
|
||||||
|
except (mavat_client.MavatUnavailable, mavat_client.MavatFlowError) as e:
|
||||||
|
# Expected, recoverable (browser unavailable / plan not found / blocked).
|
||||||
|
return web.json_response({"ok": False, "reason": str(e)}, status=200)
|
||||||
|
except Exception as e: # noqa: BLE001
|
||||||
|
logger.exception("plan_fetch failed")
|
||||||
|
return web.json_response({"ok": False, "reason": f"unexpected: {e}"}, status=200)
|
||||||
|
|
||||||
|
|
||||||
|
# ─── adapter-migration: host-side runner for scripts/migrate_agent_adapter.py ───
|
||||||
|
# The legal-ai container can't perform the migration itself (it needs the host
|
||||||
|
# filesystem — generated instruction copies, the gemini settings file — plus the
|
||||||
|
# embedded board DB), so the dashboard proxies the action here. Mutating, so it
|
||||||
|
# requires the Bearer secret like /pm2/control. We launch exactly one fixed,
|
||||||
|
# in-repo script with create_subprocess_exec (no shell) and an action allowlist;
|
||||||
|
# every other argument is passed through opaque and validated by the script
|
||||||
|
# itself. Kept deliberately symbol-light so this host bridge stays generic.
|
||||||
|
_MIGRATE_SCRIPT = "/home/chaim/legal-ai/scripts/migrate_agent_adapter.py"
|
||||||
|
_MIGRATE_PYTHON = "/home/chaim/legal-ai/mcp-server/.venv/bin/python"
|
||||||
|
_MIGRATE_ACTIONS = {"check", "apply", "revert", "verify"}
|
||||||
|
|
||||||
|
|
||||||
|
async def adapter_migration(request: web.Request) -> web.Response:
|
||||||
|
"""Run scripts/migrate_agent_adapter.py on the host and relay its result."""
|
||||||
|
unauth = _check_bearer(request)
|
||||||
|
if unauth is not None:
|
||||||
|
return unauth
|
||||||
|
try:
|
||||||
|
body = await request.json()
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
return web.json_response({"error": "invalid JSON body"}, status=400)
|
||||||
|
|
||||||
|
action = str(body.get("action", "")).strip()
|
||||||
|
if action not in _MIGRATE_ACTIONS:
|
||||||
|
return web.json_response(
|
||||||
|
{"error": f"action must be one of {sorted(_MIGRATE_ACTIONS)}"}, status=400
|
||||||
|
)
|
||||||
|
|
||||||
|
argv = [_MIGRATE_PYTHON, _MIGRATE_SCRIPT, f"--{action}"]
|
||||||
|
agent = str(body.get("agent", "")).strip()
|
||||||
|
target = str(body.get("to", "")).strip()
|
||||||
|
model = str(body.get("model", "")).strip()
|
||||||
|
if action in ("check", "apply", "revert"):
|
||||||
|
if not agent:
|
||||||
|
return web.json_response({"error": "agent required"}, status=400)
|
||||||
|
argv += ["--agent", agent]
|
||||||
|
if action in ("check", "apply"):
|
||||||
|
if not target:
|
||||||
|
return web.json_response({"error": "to (target) required"}, status=400)
|
||||||
|
argv += ["--to", target]
|
||||||
|
if model:
|
||||||
|
argv += ["--model", model]
|
||||||
|
if bool(body.get("relax_tools")):
|
||||||
|
argv += ["--relax-tools"]
|
||||||
|
|
||||||
|
import asyncio as _asyncio
|
||||||
|
|
||||||
|
env = {**os.environ, "HOME": "/home/chaim"}
|
||||||
|
try:
|
||||||
|
proc = await _asyncio.create_subprocess_exec(
|
||||||
|
*argv, cwd="/home/chaim/legal-ai", env=env,
|
||||||
|
stdout=_asyncio.subprocess.PIPE, stderr=_asyncio.subprocess.PIPE,
|
||||||
|
)
|
||||||
|
out, err = await _asyncio.wait_for(proc.communicate(), timeout=180)
|
||||||
|
except _asyncio.TimeoutError:
|
||||||
|
return web.json_response({"ok": False, "error": "migration timed out"}, status=504)
|
||||||
|
except Exception as e: # never throw — relay the failure
|
||||||
|
return web.json_response({"ok": False, "error": f"launch failed: {e}"}, status=502)
|
||||||
|
|
||||||
|
# 200 regardless of exit code: a non-zero --check (preflight refusal) is an
|
||||||
|
# informative result the caller renders, not a transport error.
|
||||||
|
return web.json_response({
|
||||||
|
"ok": (proc.returncode == 0),
|
||||||
|
"exit_code": proc.returncode,
|
||||||
|
"stdout": out.decode("utf-8", "replace"),
|
||||||
|
"stderr": err.decode("utf-8", "replace"),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
# ─── run-script: host-side runner for read-only/audit scripts (#4) ─────────────
|
||||||
|
# Same shape as /adapter-migration but for the SCRIPT_RUN_ALLOWLIST — a fixed set
|
||||||
|
# of read-only scripts each with a hard-coded safe argv. The request body's only
|
||||||
|
# meaningful field is ``name``; arguments are NEVER taken from the caller (so no
|
||||||
|
# --apply/--force injection). Allowlist enforcement lives here, on the host.
|
||||||
|
async def run_script(request: web.Request) -> web.Response:
|
||||||
|
"""Run an allowlisted read-only script on the host and relay its result."""
|
||||||
|
unauth = _check_bearer(request)
|
||||||
|
if unauth is not None:
|
||||||
|
return unauth
|
||||||
|
try:
|
||||||
|
body = await request.json()
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
return web.json_response({"error": "invalid JSON body"}, status=400)
|
||||||
|
|
||||||
|
name = str(body.get("name", "")).strip()
|
||||||
|
argv = script_runner.build_argv(name)
|
||||||
|
if argv is None:
|
||||||
|
return web.json_response(
|
||||||
|
{"ok": False, "error": f"script not runnable (not in allowlist): {name!r}"},
|
||||||
|
status=403,
|
||||||
|
)
|
||||||
|
|
||||||
|
import asyncio as _asyncio
|
||||||
|
|
||||||
|
env = {**os.environ, "HOME": "/home/chaim"}
|
||||||
|
try:
|
||||||
|
proc = await _asyncio.create_subprocess_exec(
|
||||||
|
*argv, cwd="/home/chaim/legal-ai", env=env,
|
||||||
|
stdout=_asyncio.subprocess.PIPE, stderr=_asyncio.subprocess.PIPE,
|
||||||
|
)
|
||||||
|
out, err = await _asyncio.wait_for(proc.communicate(), timeout=600)
|
||||||
|
except _asyncio.TimeoutError:
|
||||||
|
return web.json_response({"ok": False, "error": "script timed out"}, status=504)
|
||||||
|
except Exception as e: # never throw — relay the failure
|
||||||
|
return web.json_response({"ok": False, "error": f"launch failed: {e}"}, status=502)
|
||||||
|
|
||||||
|
# best-effort audit trail — one line per run
|
||||||
|
try:
|
||||||
|
os.makedirs("/home/chaim/legal-ai/data/logs", exist_ok=True)
|
||||||
|
stamp = time.strftime("%Y-%m-%dT%H:%M:%S%z")
|
||||||
|
with open("/home/chaim/legal-ai/data/logs/script-runs.log", "a") as fh:
|
||||||
|
fh.write(f"{stamp}\t{name}\texit={proc.returncode}\n")
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# 200 regardless of exit code — a non-zero audit result is informative output
|
||||||
|
# the caller renders, not a transport error.
|
||||||
|
return web.json_response({
|
||||||
|
"ok": (proc.returncode == 0),
|
||||||
|
"exit_code": proc.returncode,
|
||||||
|
"stdout": out.decode("utf-8", "replace"),
|
||||||
|
"stderr": err.decode("utf-8", "replace"),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
def build_app() -> web.Application:
|
def build_app() -> web.Application:
|
||||||
app = web.Application(client_max_size=64 * 1024 * 1024)
|
app = web.Application(client_max_size=64 * 1024 * 1024)
|
||||||
app.router.add_get("/health", health)
|
app.router.add_get("/health", health)
|
||||||
|
app.router.add_get("/pm2", pm2_status)
|
||||||
|
app.router.add_get("/usage", usage_status)
|
||||||
|
app.router.add_post("/pm2/control", pm2_control)
|
||||||
app.router.add_post("/fetch", fetch)
|
app.router.add_post("/fetch", fetch)
|
||||||
|
app.router.add_post("/plan-fetch", plan_fetch)
|
||||||
|
app.router.add_post("/adapter-migration", adapter_migration)
|
||||||
|
app.router.add_post("/run-script", run_script)
|
||||||
return app
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,18 @@ from uuid import UUID
|
|||||||
from pydantic import BaseModel, Field
|
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).
|
||||||
class CaseStatus(str, enum.Enum):
|
class CaseStatus(str, enum.Enum):
|
||||||
NEW = "new"
|
NEW = "new"
|
||||||
IN_PROGRESS = "in_progress"
|
PROCESSING = "processing"
|
||||||
|
DOCUMENTS_READY = "documents_ready"
|
||||||
|
OUTCOME_SET = "outcome_set"
|
||||||
|
DIRECTION_APPROVED = "direction_approved"
|
||||||
|
QA_REVIEW = "qa_review"
|
||||||
DRAFTED = "drafted"
|
DRAFTED = "drafted"
|
||||||
|
EXPORTED = "exported"
|
||||||
REVIEWED = "reviewed"
|
REVIEWED = "reviewed"
|
||||||
FINAL = "final"
|
FINAL = "final"
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ from legal_mcp.tools import ( # noqa: E402
|
|||||||
training_enrichment as train_tools,
|
training_enrichment as train_tools,
|
||||||
digests as digest_tools,
|
digests as digest_tools,
|
||||||
court_fetch as cf_tools,
|
court_fetch as cf_tools,
|
||||||
|
plans as plans_tools,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -102,7 +103,7 @@ def _clamp_limit(limit: int, hard_max: int = _MAX_LIMIT) -> int:
|
|||||||
|
|
||||||
@mcp.tool()
|
@mcp.tool()
|
||||||
async def case_list(status: str = "", limit: int = 50) -> str:
|
async def case_list(status: str = "", limit: int = 50) -> str:
|
||||||
"""רשימת תיקי ערר. סינון אופציונלי לפי סטטוס (new/in_progress/drafted/reviewed/final)."""
|
"""רשימת תיקי ערר. סינון אופציונלי לפי סטטוס (new/processing/documents_ready/outcome_set/direction_approved/qa_review/drafted/exported/reviewed/final)."""
|
||||||
return await cases.case_list(status, _clamp_limit(limit))
|
return await cases.case_list(status, _clamp_limit(limit))
|
||||||
|
|
||||||
|
|
||||||
@@ -411,6 +412,12 @@ async def search_digests(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def digest_process_pending(limit: int = 20) -> str:
|
||||||
|
"""ריקון תור היומונים שהועלו מה-UI וממתינים לעיבוד-LLM מקומי. מריץ חילוץ-מטא-דאטה + embedding + autolink על כל יומון 'pending' (מקומית עם CLI). חלופת-MCP ל-scripts/ingest_digests_batch.py."""
|
||||||
|
return await digest_tools.digest_process_pending(_clamp_limit(limit))
|
||||||
|
|
||||||
|
|
||||||
@mcp.tool()
|
@mcp.tool()
|
||||||
async def halacha_review(
|
async def halacha_review(
|
||||||
halacha_id: str,
|
halacha_id: str,
|
||||||
@@ -420,18 +427,49 @@ async def halacha_review(
|
|||||||
reasoning_summary: str = "",
|
reasoning_summary: str = "",
|
||||||
subject_tags: list[str] | None = None,
|
subject_tags: list[str] | None = None,
|
||||||
practice_areas: list[str] | None = None,
|
practice_areas: list[str] | None = None,
|
||||||
|
canonical_statement: str = "",
|
||||||
) -> str:
|
) -> str:
|
||||||
"""אישור / דחייה / עריכה של הלכה שחולצה אוטומטית. status: pending_review / approved / rejected / published."""
|
"""אישור / דחייה / עריכה של הלכה שחולצה אוטומטית. status: pending_review / approved / rejected / published.
|
||||||
|
canonical_statement: עריכת ניסוח העיקרון הקנוני הרחב (V41)."""
|
||||||
return await plib.halacha_review(
|
return await plib.halacha_review(
|
||||||
halacha_id, status, reviewer, rule_statement, reasoning_summary,
|
halacha_id, status, reviewer, rule_statement, reasoning_summary,
|
||||||
subject_tags, practice_areas,
|
subject_tags, practice_areas, canonical_statement,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@mcp.tool()
|
@mcp.tool()
|
||||||
async def halachot_pending(limit: int = 100) -> str:
|
async def halachot_pending(
|
||||||
"""תור ההלכות הממתינות לאישור."""
|
limit: int = 100,
|
||||||
return await plib.halachot_pending(_clamp_limit(limit))
|
include_low_quality: bool = False,
|
||||||
|
instance_type: str = "original",
|
||||||
|
) -> str:
|
||||||
|
"""תור ההלכות הממתינות לאישור. V41: ברירת-מחדל instance_type='original' (עקרונות חדשים בלבד, לא ציטוטים)."""
|
||||||
|
return await plib.halachot_pending(_clamp_limit(limit), include_low_quality, instance_type)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def canonical_halacha_list(
|
||||||
|
practice_area: str = "",
|
||||||
|
review_status: str = "",
|
||||||
|
limit: int = 50,
|
||||||
|
offset: int = 0,
|
||||||
|
) -> str:
|
||||||
|
"""רשימת עקרונות קנוניים (canonical_halachot). V41.
|
||||||
|
practice_area: סינון תחום עיסוק. review_status: pending_synthesis/pending_review/approved/published."""
|
||||||
|
return await plib.canonical_halacha_list(practice_area, review_status, limit, offset)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def canonical_halacha_get(canonical_id: str) -> str:
|
||||||
|
"""שלוף עיקרון קנוני + כל האינסטנסים שלו לפי פסיקה. V41."""
|
||||||
|
return await plib.canonical_halacha_get(canonical_id)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def canonical_synthesize_pending(limit: int = 20) -> str:
|
||||||
|
"""סנתז ניסוח-קנוני לעקרונות הממתינים (pending_synthesis) → pending_review (שער-יו"ר). V41 Phase 4.
|
||||||
|
מעוגן בציטוטי-המופעים (INV-AH) עם שער-drift. on-demand/burst; המסה הראשונית ב-backfill."""
|
||||||
|
return await plib.canonical_synthesize_pending(limit)
|
||||||
|
|
||||||
|
|
||||||
# Documents
|
# Documents
|
||||||
@@ -700,6 +738,64 @@ async def get_appraiser_facts(case_number: str) -> str:
|
|||||||
return await drafting.get_appraiser_facts(case_number)
|
return await drafting.get_appraiser_facts(case_number)
|
||||||
|
|
||||||
|
|
||||||
|
# ── Planning-schemes registry (V38) — מרשם-התכניות ─────────────────
|
||||||
|
# SSOT לזהות+תוקף של תכנית, נעשה שימוש חוזר בין תיקים (G2). פלט-LLM נכנס
|
||||||
|
# pending_review וממתין לאישור-יו"ר (plan_review, G10) לפני שמשמש בבלוק ט.
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def extract_plans(case_number: str) -> str:
|
||||||
|
"""חילוץ תכניות ותוקפן מכל מסמכי התיק אל מרשם-התכניות (pending_review). ה-extract היקר."""
|
||||||
|
return await plans_tools.extract_plans(case_number)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def plan_fetch(plan_number: str) -> str:
|
||||||
|
"""משיכת זהות+תוקף של תב"ע מ-מנהל-התכנון (mavat) — מועמד-לאישור, לא כתיבה. כל ערך נושא source_url (INV-AH)."""
|
||||||
|
return await plans_tools.plan_fetch(plan_number)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def plan_get(plan_number: str) -> str:
|
||||||
|
"""קריאת תכנית מהמרשם לפי מספר (מנורמל; נופל ל-alias). ה-get הזול."""
|
||||||
|
return await plans_tools.plan_get(plan_number)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def plan_search(query: str, limit: int = 20) -> str:
|
||||||
|
"""חיפוש fuzzy במרשם-התכניות לפי מספר/שם/ייעוד."""
|
||||||
|
return await plans_tools.plan_search(query, limit)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def plan_list(review_status: str = "", limit: int = 500) -> str:
|
||||||
|
"""רשימת תכניות במרשם, אופציונלית מסוננת לפי review_status (תור-אישור)."""
|
||||||
|
return await plans_tools.plan_list(review_status, limit)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def plan_upsert(
|
||||||
|
plan_number: str,
|
||||||
|
display_name: str = "",
|
||||||
|
plan_type: str = "",
|
||||||
|
gazette_date: str = "",
|
||||||
|
yalkut_number: str = "",
|
||||||
|
purpose: str = "",
|
||||||
|
review_status: str = "approved",
|
||||||
|
aliases: str = "",
|
||||||
|
) -> str:
|
||||||
|
"""כתיבה/עריכה ידנית מבוקרת של תכנית במרשם (ברירת-מחדל approved — קלט-יו"ר). מנרמל בכתיבה (G1)."""
|
||||||
|
return await plans_tools.plan_upsert(
|
||||||
|
plan_number, display_name, plan_type, gazette_date,
|
||||||
|
yalkut_number, purpose, review_status, aliases,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def plan_review(plan_id: str, status: str) -> str:
|
||||||
|
"""שער-היו"ר (G10): אישור/דחייה/איפוס של תכנית במרשם (approved/rejected/pending_review)."""
|
||||||
|
return await plans_tools.plan_review(plan_id, status)
|
||||||
|
|
||||||
|
|
||||||
@mcp.tool()
|
@mcp.tool()
|
||||||
async def write_interim_draft(case_number: str, instructions: str = "") -> str:
|
async def write_interim_draft(case_number: str, instructions: str = "") -> str:
|
||||||
"""כתיבת ארבעת הבלוקים לטיוטת ביניים (רקע, תכניות+היתרים, טענות, הליכים) — אותו skill וטמפלט."""
|
"""כתיבת ארבעת הבלוקים לטיוטת ביניים (רקע, תכניות+היתרים, טענות, הליכים) — אותו skill וטמפלט."""
|
||||||
@@ -982,6 +1078,12 @@ async def court_fetch_status(case_number: str = "", status_filter: str = "") ->
|
|||||||
return await cf_tools.court_fetch_status(case_number, status_filter)
|
return await cf_tools.court_fetch_status(case_number, status_filter)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def court_fetch_drain(limit: int = 10) -> str:
|
||||||
|
"""ריקון תור-אחזור הפסיקה — מוריד וקולט jobs ממתינים שהיומונים מילאו, וקושר חזרה ליומון. מקומי בלבד."""
|
||||||
|
return await cf_tools.court_fetch_drain(limit)
|
||||||
|
|
||||||
|
|
||||||
# ── Internal citations graph (TaskMaster #34) ─────────────────────
|
# ── Internal citations graph (TaskMaster #34) ─────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ Output: data/cases/{case_number}/exports/ניתוח-משפטי-v{N}.docx
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import io
|
||||||
import re
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
@@ -34,7 +35,7 @@ from docx.text.paragraph import Paragraph
|
|||||||
from docx.text.run import Run
|
from docx.text.run import Run
|
||||||
|
|
||||||
from legal_mcp import config
|
from legal_mcp import config
|
||||||
from legal_mcp.services import db, research_md
|
from legal_mcp.services import db, research_md, storage
|
||||||
|
|
||||||
|
|
||||||
def _mark_run_rtl(run: Run) -> None:
|
def _mark_run_rtl(run: Run) -> None:
|
||||||
@@ -494,10 +495,19 @@ async def build_analysis_docx(case_number: str) -> Path:
|
|||||||
continue
|
continue
|
||||||
_emit_content_line(doc, raw)
|
_emit_content_line(doc, raw)
|
||||||
|
|
||||||
# Save versioned
|
# Save versioned through the storage layer (INV-STG1). export_dir.mkdir +
|
||||||
|
# the glob in _next_version still read disk (correct under filesystem/dual;
|
||||||
|
# storage-native versioning is a cutover concern). out_path is always under
|
||||||
|
# DATA_DIR, so the bytes land exactly where they did before.
|
||||||
export_dir = case_dir / "exports"
|
export_dir = case_dir / "exports"
|
||||||
export_dir.mkdir(parents=True, exist_ok=True)
|
export_dir.mkdir(parents=True, exist_ok=True)
|
||||||
version = _next_version(export_dir)
|
version = _next_version(export_dir)
|
||||||
out_path = export_dir / f"ניתוח-משפטי-v{version}.docx"
|
out_path = export_dir / f"ניתוח-משפטי-v{version}.docx"
|
||||||
doc.save(str(out_path))
|
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
|
return out_path
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ async def extract_facts_from_document(
|
|||||||
f"שמאי: {appraiser_name}{chunk_label}\n\n"
|
f"שמאי: {appraiser_name}{chunk_label}\n\n"
|
||||||
f"--- תחילת שומה ---\n{chunk}\n--- סוף שומה ---"
|
f"--- תחילת שומה ---\n{chunk}\n--- סוף שומה ---"
|
||||||
)
|
)
|
||||||
result = await claude_session.query_json(prompt)
|
result = await claude_session.query_json(prompt, tools="") # no tool_use → no error_max_turns
|
||||||
if not isinstance(result, list):
|
if not isinstance(result, list):
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"extract_facts_from_document: chunk %d returned non-list (%s) for doc=%s",
|
"extract_facts_from_document: chunk %d returned non-list (%s) for doc=%s",
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ async def _aggregate_party(
|
|||||||
prompt = _build_prompt(party, propositions)
|
prompt = _build_prompt(party, propositions)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
raw_result = await claude_session.query_json(prompt)
|
raw_result = await claude_session.query_json(prompt, tools="") # no tool_use → no error_max_turns
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
# Surface CLI-unavailable specifically so the caller can report
|
# Surface CLI-unavailable specifically so the caller can report
|
||||||
# cleanly instead of crashing the whole job.
|
# cleanly instead of crashing the whole job.
|
||||||
@@ -335,18 +335,30 @@ async def get_legal_arguments(
|
|||||||
case_id,
|
case_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Pull supporting claim ids for each argument in one round-trip.
|
# Pull supporting claims (id + full text) for each argument in one
|
||||||
|
# round-trip. ``supporting_claims`` stays id-only for backwards compat
|
||||||
|
# (counts, MCP consumers); ``supporting_propositions`` carries the text
|
||||||
|
# so the UI can show the raw propositions without an extra fetch.
|
||||||
arg_ids = [r["id"] for r in rows]
|
arg_ids = [r["id"] for r in rows]
|
||||||
supporting: dict[UUID, list[str]] = {}
|
supporting: dict[UUID, list[str]] = {}
|
||||||
|
propositions: dict[UUID, list[dict]] = {}
|
||||||
if arg_ids:
|
if arg_ids:
|
||||||
joins = await conn.fetch(
|
joins = await conn.fetch(
|
||||||
"""SELECT argument_id, claim_id
|
"""SELECT lap.argument_id, lap.claim_id,
|
||||||
FROM legal_argument_propositions
|
c.claim_text, c.source_document, c.claim_index
|
||||||
WHERE argument_id = ANY($1::uuid[])""",
|
FROM legal_argument_propositions lap
|
||||||
|
JOIN claims c ON c.id = lap.claim_id
|
||||||
|
WHERE lap.argument_id = ANY($1::uuid[])
|
||||||
|
ORDER BY c.claim_index""",
|
||||||
arg_ids,
|
arg_ids,
|
||||||
)
|
)
|
||||||
for j in joins:
|
for j in joins:
|
||||||
supporting.setdefault(j["argument_id"], []).append(str(j["claim_id"]))
|
supporting.setdefault(j["argument_id"], []).append(str(j["claim_id"]))
|
||||||
|
propositions.setdefault(j["argument_id"], []).append({
|
||||||
|
"id": str(j["claim_id"]),
|
||||||
|
"text": j["claim_text"],
|
||||||
|
"source_document": j["source_document"],
|
||||||
|
})
|
||||||
|
|
||||||
out: list[dict] = []
|
out: list[dict] = []
|
||||||
for r in rows:
|
for r in rows:
|
||||||
@@ -354,5 +366,6 @@ async def get_legal_arguments(
|
|||||||
d["id"] = str(d["id"])
|
d["id"] = str(d["id"])
|
||||||
d["case_id"] = str(d["case_id"])
|
d["case_id"] = str(d["case_id"])
|
||||||
d["supporting_claims"] = supporting.get(r["id"], [])
|
d["supporting_claims"] = supporting.get(r["id"], [])
|
||||||
|
d["supporting_propositions"] = propositions.get(r["id"], [])
|
||||||
out.append(d)
|
out.append(d)
|
||||||
return out
|
return out
|
||||||
|
|||||||
@@ -18,8 +18,10 @@ import re
|
|||||||
from datetime import date
|
from datetime import date
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from legal_mcp import config
|
from legal_mcp import config
|
||||||
from legal_mcp.services import db, embeddings, claude_session, audit
|
from legal_mcp.services import db, embeddings, claude_session, audit, storage
|
||||||
from legal_mcp.services.lessons import (
|
from legal_mcp.services.lessons import (
|
||||||
OUTCOME_LABELS_HE,
|
OUTCOME_LABELS_HE,
|
||||||
PRACTICE_AREA_OVERRIDES,
|
PRACTICE_AREA_OVERRIDES,
|
||||||
@@ -194,6 +196,11 @@ BLOCK_PROMPTS = {
|
|||||||
1. **תכניות חלות** — מבנה הירכי: תכניות ארציות → מחוזיות → מקומיות. ציטוט ישיר מהוראות תכנית עם **הדגשה** של מילים מכריעות.
|
1. **תכניות חלות** — מבנה הירכי: תכניות ארציות → מחוזיות → מקומיות. ציטוט ישיר מהוראות תכנית עם **הדגשה** של מילים מכריעות.
|
||||||
2. **תת-פרק היתרים** — כותרת משנה "היתרים" (או "היתרי בנייה שניתנו במקרקעין"). פירוט ההיתרים הרלוונטיים על פי השומות שהוגשו לתיק.
|
2. **תת-פרק היתרים** — כותרת משנה "היתרים" (או "היתרי בנייה שניתנו במקרקעין"). פירוט ההיתרים הרלוונטיים על פי השומות שהוגשו לתיק.
|
||||||
|
|
||||||
|
## ציטוט תכנית ותוקפה (קריטי — מרשם-התכניות):
|
||||||
|
- לכל תכנית, לחלק **הזהות והתוקף** (מספר-התכנית + מתי פורסמה למתן תוקף ברשומות + מס' ילקוט-הפרסומים) — השתמש **ככתבו** במשפט-הציטוט הקנוני המופיע תחת "מרשם-התכניות" למטה. **אל תמציא** תאריך-פרסום או מספר-ילקוט.
|
||||||
|
- את הייעוד והניתוח התכנוני אתה רשאי לנסח בסגנון דפנה; את תאריך-התוקף ומספר-הילקוט — לעולם לא.
|
||||||
|
- אם תכנית זוהתה בתיק אך **חסרה במרשם או טרם אושרה** — הזכר את התכנית בלי לקבוע תאריך-תוקף, ואל תנחש תאריך.
|
||||||
|
|
||||||
## כללי ציון סתירות בין שמאים (קריטי):
|
## כללי ציון סתירות בין שמאים (קריטי):
|
||||||
- אם שני שמאים או יותר מסרו מידע שונה על אותה תכנית או היתר — חובה לסמן זאת במפורש בנוסח ניטרלי, למשל:
|
- אם שני שמאים או יותר מסרו מידע שונה על אותה תכנית או היתר — חובה לסמן זאת במפורש בנוסח ניטרלי, למשל:
|
||||||
> "יצוין כי שמאי הוועדה ציין כי תכנית פלונית חלה על המקרקעין במלואה, בעוד שמאי העורר סבר כי חלקה של התכנית בלבד חל"
|
> "יצוין כי שמאי הוועדה ציין כי תכנית פלונית חלה על המקרקעין במלואה, בעוד שמאי העורר סבר כי חלקה של התכנית בלבד חל"
|
||||||
@@ -213,6 +220,9 @@ BLOCK_PROMPTS = {
|
|||||||
## תכניות שזוהו (ממטא-דאטה של מסמכים):
|
## תכניות שזוהו (ממטא-דאטה של מסמכים):
|
||||||
{plans_context}
|
{plans_context}
|
||||||
|
|
||||||
|
## מרשם-התכניות — משפטי-ציטוט קנוניים (מקור-אמת לתוקף; השתמש ככתבם):
|
||||||
|
{plans_registry_context}
|
||||||
|
|
||||||
## עובדות שמאיות שחולצו (תכניות + היתרים, פרק לכל שמאי):
|
## עובדות שמאיות שחולצו (תכניות + היתרים, פרק לכל שמאי):
|
||||||
{appraiser_facts_context}
|
{appraiser_facts_context}
|
||||||
|
|
||||||
@@ -331,6 +341,7 @@ async def write_block(
|
|||||||
claims_context = await _build_claims_context(case_id)
|
claims_context = await _build_claims_context(case_id)
|
||||||
direction_context = _build_direction_context(decision)
|
direction_context = _build_direction_context(decision)
|
||||||
plans_context = await _build_plans_context(case_id)
|
plans_context = await _build_plans_context(case_id)
|
||||||
|
plans_registry_context = await _build_plans_registry_context(case_id)
|
||||||
daphna_style_exemplars, case_law_citations, _precedent_case_law_ids = (
|
daphna_style_exemplars, case_law_citations, _precedent_case_law_ids = (
|
||||||
await _build_precedents_context(case_id, block_id)
|
await _build_precedents_context(case_id, block_id)
|
||||||
)
|
)
|
||||||
@@ -369,6 +380,7 @@ async def write_block(
|
|||||||
claims_context=claims_context,
|
claims_context=claims_context,
|
||||||
direction_context=direction_context,
|
direction_context=direction_context,
|
||||||
plans_context=plans_context,
|
plans_context=plans_context,
|
||||||
|
plans_registry_context=plans_registry_context,
|
||||||
daphna_style_exemplars=daphna_style_exemplars,
|
daphna_style_exemplars=daphna_style_exemplars,
|
||||||
case_law_citations=case_law_citations,
|
case_law_citations=case_law_citations,
|
||||||
style_context=style_context,
|
style_context=style_context,
|
||||||
@@ -410,7 +422,7 @@ async def write_block(
|
|||||||
# Call Claude via Claude Code session (no API)
|
# Call Claude via Claude Code session (no API)
|
||||||
model_key = block_cfg["model"]
|
model_key = block_cfg["model"]
|
||||||
timeout = claude_session.LONG_TIMEOUT if model_key == "opus" else claude_session.DEFAULT_TIMEOUT
|
timeout = claude_session.LONG_TIMEOUT if model_key == "opus" else claude_session.DEFAULT_TIMEOUT
|
||||||
content = await claude_session.query(prompt, timeout=timeout)
|
content = await claude_session.query(prompt, timeout=timeout, tools="") # prose gen — no tool_use → no error_max_turns
|
||||||
|
|
||||||
sources = await _collect_block_sources(case_id, block_id)
|
sources = await _collect_block_sources(case_id, block_id)
|
||||||
sources["case_law_ids"] = _precedent_case_law_ids
|
sources["case_law_ids"] = _precedent_case_law_ids
|
||||||
@@ -578,6 +590,60 @@ async def _build_plans_context(case_id: UUID) -> str:
|
|||||||
return "(לא זוהו תכניות)"
|
return "(לא זוהו תכניות)"
|
||||||
|
|
||||||
|
|
||||||
|
async def _build_plans_registry_context(case_id: UUID) -> str:
|
||||||
|
"""Render chair-APPROVED canonical plan citation sentences from the registry (V38).
|
||||||
|
|
||||||
|
The identity+validity clause is deterministic (db.format_plan_citation), so the
|
||||||
|
writer never invents publication dates or ילקוט numbers (INV-AH). Plans seen in
|
||||||
|
the case but absent from the registry — or present yet not approved — are listed
|
||||||
|
explicitly as gaps, never silently dropped (חוקה §6, אין בליעה שקטה).
|
||||||
|
"""
|
||||||
|
idents: set[str] = set()
|
||||||
|
for f in await db.list_appraiser_facts(case_id, fact_type="plan"):
|
||||||
|
if f.get("identifier"):
|
||||||
|
idents.add(f["identifier"])
|
||||||
|
for doc in await db.list_documents(case_id):
|
||||||
|
metadata = doc.get("metadata") or {}
|
||||||
|
if isinstance(metadata, str):
|
||||||
|
metadata = json.loads(metadata)
|
||||||
|
for p in (metadata.get("references", {}) or {}).get("plans", []):
|
||||||
|
name = (p.get("plan_name") or "").strip()
|
||||||
|
if name:
|
||||||
|
idents.add(name)
|
||||||
|
|
||||||
|
if not idents:
|
||||||
|
return "(לא זוהו תכניות בתיק. הרץ extract_plans ואשר אותן במרשם-התכניות.)"
|
||||||
|
|
||||||
|
approved: list[dict] = []
|
||||||
|
unapproved: list[dict] = []
|
||||||
|
missing: list[str] = []
|
||||||
|
seen_numbers: set[str] = set()
|
||||||
|
for ident in sorted(idents):
|
||||||
|
plan = await db.get_plan_by_number(ident)
|
||||||
|
if plan is None:
|
||||||
|
missing.append(ident)
|
||||||
|
continue
|
||||||
|
if plan["plan_number"] in seen_numbers:
|
||||||
|
continue
|
||||||
|
seen_numbers.add(plan["plan_number"])
|
||||||
|
(approved if plan["review_status"] == "approved" else unapproved).append(plan)
|
||||||
|
|
||||||
|
lines: list[str] = []
|
||||||
|
if approved:
|
||||||
|
lines.append("### משפטי-ציטוט קנוניים (מאושרים — השתמש בהם ככתבם לזהות+תוקף):")
|
||||||
|
for p in approved:
|
||||||
|
lines.append(f"- {p.get('citation_formatted') or db.format_plan_citation(p)}")
|
||||||
|
if unapproved:
|
||||||
|
lines.append('\n### תכניות במרשם שטרם אושרו (אל תצטט מהן תוקף — ממתינות לאישור-יו"ר):')
|
||||||
|
for p in unapproved:
|
||||||
|
lines.append(f"- {p['display_name'] or p['plan_number']} (status={p['review_status']})")
|
||||||
|
if missing:
|
||||||
|
lines.append("\n### תכניות שזוהו בתיק אך חסרות במרשם (הרץ extract_plans ואשר):")
|
||||||
|
for ident in missing:
|
||||||
|
lines.append(f"- {ident}")
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
|
||||||
APPRAISER_SIDE_LABEL_HE = {
|
APPRAISER_SIDE_LABEL_HE = {
|
||||||
"committee": "שמאי הוועדה המקומית",
|
"committee": "שמאי הוועדה המקומית",
|
||||||
"appellant": "שמאי העורר",
|
"appellant": "שמאי העורר",
|
||||||
@@ -1001,6 +1067,7 @@ async def get_block_context(case_id: UUID, block_id: str, instructions: str = ""
|
|||||||
claims_context = await _build_claims_context(case_id)
|
claims_context = await _build_claims_context(case_id)
|
||||||
direction_context = _build_direction_context(decision)
|
direction_context = _build_direction_context(decision)
|
||||||
plans_context = await _build_plans_context(case_id)
|
plans_context = await _build_plans_context(case_id)
|
||||||
|
plans_registry_context = await _build_plans_registry_context(case_id)
|
||||||
daphna_style_exemplars, case_law_citations, _ = (
|
daphna_style_exemplars, case_law_citations, _ = (
|
||||||
await _build_precedents_context(case_id, block_id)
|
await _build_precedents_context(case_id, block_id)
|
||||||
)
|
)
|
||||||
@@ -1035,6 +1102,7 @@ async def get_block_context(case_id: UUID, block_id: str, instructions: str = ""
|
|||||||
claims_context=claims_context,
|
claims_context=claims_context,
|
||||||
direction_context=direction_context,
|
direction_context=direction_context,
|
||||||
plans_context=plans_context,
|
plans_context=plans_context,
|
||||||
|
plans_registry_context=plans_registry_context,
|
||||||
daphna_style_exemplars=daphna_style_exemplars,
|
daphna_style_exemplars=daphna_style_exemplars,
|
||||||
case_law_citations=case_law_citations,
|
case_law_citations=case_law_citations,
|
||||||
style_context=style_context,
|
style_context=style_context,
|
||||||
@@ -1119,7 +1187,13 @@ async def _update_draft_file(decision_id: UUID) -> None:
|
|||||||
draft_dir = config.find_case_dir(case_row["case_number"]) / "drafts"
|
draft_dir = config.find_case_dir(case_row["case_number"]) / "drafts"
|
||||||
draft_dir.mkdir(parents=True, exist_ok=True)
|
draft_dir.mkdir(parents=True, exist_ok=True)
|
||||||
draft_path = draft_dir / "decision.md"
|
draft_path = draft_dir / "decision.md"
|
||||||
draft_path.write_text("\n\n".join(row["content"] for row in rows if row["content"]), encoding="utf-8")
|
draft_text = "\n\n".join(row["content"] for row in rows if row["content"])
|
||||||
|
draft_path.write_text(draft_text, encoding="utf-8") # noqa: STG1 — sealed below
|
||||||
|
try:
|
||||||
|
_dkey = draft_path.resolve().relative_to(Path(config.DATA_DIR).resolve()).as_posix()
|
||||||
|
await storage.mirror(_dkey, draft_text.encode("utf-8"), bucket=storage.Bucket.DOCUMENTS)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
logger.info("Draft file synced: %s (%d blocks)", draft_path, len(rows))
|
logger.info("Draft file synced: %s (%d blocks)", draft_path, len(rows))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ async def generate_directions(
|
|||||||
{doc_context or '(אין מסמכים בתיק)'}
|
{doc_context or '(אין מסמכים בתיק)'}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
result = await claude_session.query_json(user_content)
|
result = await claude_session.query_json(user_content, tools="") # no tool_use → no error_max_turns
|
||||||
if result is None:
|
if result is None:
|
||||||
logger.warning("Failed to parse brainstorm response")
|
logger.warning("Failed to parse brainstorm response")
|
||||||
return {
|
return {
|
||||||
|
|||||||
121
mcp-server/src/legal_mcp/services/bulletin_library.py
Normal file
121
mcp-server/src/legal_mcp/services/bulletin_library.py
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
"""Ingest a monthly "עו"ד על נדל"ן" bulletin into the digests radar (X12).
|
||||||
|
|
||||||
|
A bulletin PDF is multi-topic: it EXPLODES into several digest rows — one per
|
||||||
|
case-law pointer (digest_kind='decision') and one per article (digest_kind=
|
||||||
|
'article'), all tagged publication='עו"ד על נדל"ן' to distinguish them from the
|
||||||
|
daily "כל יום" issues. This reuses the existing radar (no parallel corpus — G2):
|
||||||
|
the case pointers join search_digests / the /digests page and autolink to the
|
||||||
|
underlying ruling exactly like a daily digest; articles are deep-context only.
|
||||||
|
|
||||||
|
LOCAL-ONLY (LLM split + embedding) — host scripts/MCP, never the container path.
|
||||||
|
Idempotent: each item's content_hash (hash of its analysis_text) is the dedup
|
||||||
|
key, so re-running a bulletin skips already-ingested items.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from legal_mcp.services import db, embeddings, extractor
|
||||||
|
from legal_mcp.services import bulletin_splitter, digest_library
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
PUBLICATION = 'עו"ד על נדל"ן'
|
||||||
|
SOURCE_FIRM = "צבי שוב + רונית אלפר, עורכי דין"
|
||||||
|
|
||||||
|
|
||||||
|
async def _store_and_embed(digest_row: dict) -> None:
|
||||||
|
"""Compute + store the single radar embedding for a freshly created item."""
|
||||||
|
emb_text = digest_library._embedding_text(digest_row)
|
||||||
|
if not emb_text:
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
vecs = await embeddings.embed_texts([emb_text], input_type="document")
|
||||||
|
if vecs:
|
||||||
|
await db.store_digest_embedding(digest_row["id"], vecs[0])
|
||||||
|
except Exception as e: # §6 — surfaced, not swallowed
|
||||||
|
logger.warning("bulletin item embedding failed for %s: %s", digest_row.get("id"), e)
|
||||||
|
|
||||||
|
|
||||||
|
async def _create_item(*, analysis_text: str, kind: str, concept_tag: str,
|
||||||
|
headline: str, summary: str, citation: str, court: str,
|
||||||
|
practice_area: str, subject_tags: list[str], src: str) -> dict | None:
|
||||||
|
"""Create one digest row from a bulletin item. Returns the row, or None if it
|
||||||
|
already exists (idempotent skip) or the insert raced on content_hash."""
|
||||||
|
content_hash = db._content_hash(analysis_text)
|
||||||
|
if await db.get_digest_by_content_hash(content_hash):
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
return await db.create_digest(
|
||||||
|
analysis_text=analysis_text,
|
||||||
|
publication=PUBLICATION,
|
||||||
|
source_firm=SOURCE_FIRM,
|
||||||
|
concept_tag=concept_tag,
|
||||||
|
headline_holding=headline,
|
||||||
|
summary=summary,
|
||||||
|
underlying_citation=citation,
|
||||||
|
underlying_court=court,
|
||||||
|
practice_area=practice_area,
|
||||||
|
subject_tags=subject_tags,
|
||||||
|
source_document_path=src,
|
||||||
|
extraction_status="completed",
|
||||||
|
digest_kind=kind,
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
# uq_digests_content_hash race (concurrent run) → treat as already-present.
|
||||||
|
if "uq_digests_content_hash" in str(e):
|
||||||
|
return None
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
async def ingest_bulletin(file_path: str, model: str | None = None) -> dict:
|
||||||
|
"""Split a bulletin PDF into digest rows (case pointers + articles).
|
||||||
|
|
||||||
|
Returns counts: {cases, articles, created, skipped, linked}. Idempotent.
|
||||||
|
"""
|
||||||
|
path = str(file_path)
|
||||||
|
raw_text, _pages, _meta = await extractor.extract_text(path)
|
||||||
|
split = await bulletin_splitter.split(raw_text, model=model)
|
||||||
|
cases, articles = split.get("cases", []), split.get("articles", [])
|
||||||
|
|
||||||
|
out = {"file": Path(path).name, "cases": len(cases), "articles": len(articles),
|
||||||
|
"created": 0, "skipped": 0, "linked": 0}
|
||||||
|
|
||||||
|
for c in cases:
|
||||||
|
# analysis_text bundles the pointer's substance → stable per-item hash.
|
||||||
|
atext = "\n".join(p for p in (
|
||||||
|
c["concept_tag"], c["headline_holding"], c["summary"], c["underlying_citation"]
|
||||||
|
) if p).strip()
|
||||||
|
row = await _create_item(
|
||||||
|
analysis_text=atext, kind="decision", concept_tag=c["concept_tag"],
|
||||||
|
headline=c["headline_holding"], summary=c["summary"],
|
||||||
|
citation=c["underlying_citation"], court=c["underlying_court"],
|
||||||
|
practice_area=c["practice_area"], subject_tags=c["subject_tags"], src=path,
|
||||||
|
)
|
||||||
|
if row is None:
|
||||||
|
out["skipped"] += 1
|
||||||
|
continue
|
||||||
|
out["created"] += 1
|
||||||
|
await _store_and_embed(row)
|
||||||
|
linked = await digest_library.try_autolink(row["id"], c["underlying_citation"])
|
||||||
|
if linked:
|
||||||
|
out["linked"] += 1
|
||||||
|
|
||||||
|
for a in articles:
|
||||||
|
# The article body is the substance; prefix authors into the summary.
|
||||||
|
body = a["body"] or a["summary"]
|
||||||
|
summary = (f"מאת {a['authors']}. " if a["authors"] else "") + (a["summary"] or "")
|
||||||
|
atext = "\n".join(p for p in (a["title"], summary, body) if p).strip()
|
||||||
|
row = await _create_item(
|
||||||
|
analysis_text=atext, kind="article", concept_tag=a["title"],
|
||||||
|
headline=a["title"], summary=summary, citation="", court="",
|
||||||
|
practice_area=a["practice_area"], subject_tags=a["subject_tags"], src=path,
|
||||||
|
)
|
||||||
|
if row is None:
|
||||||
|
out["skipped"] += 1
|
||||||
|
continue
|
||||||
|
out["created"] += 1
|
||||||
|
await _store_and_embed(row)
|
||||||
|
|
||||||
|
return out
|
||||||
147
mcp-server/src/legal_mcp/services/bulletin_splitter.py
Normal file
147
mcp-server/src/legal_mcp/services/bulletin_splitter.py
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
"""Split a monthly "עו"ד על נדל"ן" bulletin into typed radar items (X12).
|
||||||
|
|
||||||
|
The monthly bulletin (a SEPARATE publication from the daily "כל יום" digest) is
|
||||||
|
multi-topic: it bundles a featured ARTICLE, a list of legislative updates, and a
|
||||||
|
set of CASE-LAW pointers grouped by topic. The chair chose to catalog the
|
||||||
|
**case-law pointers** (each → a digest, like the daily issue) and the
|
||||||
|
**articles** (deep-context background) — legislative updates are skipped.
|
||||||
|
|
||||||
|
This module is the LLM splitter only. ``bulletin_library.ingest_bulletin`` turns
|
||||||
|
its output into digest rows. Like the daily extractor it is LOCAL-ONLY (claude
|
||||||
|
CLI) and MUST NOT be imported from the FastAPI container path.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from legal_mcp import config
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
_VALID_PRACTICE_AREAS = {"rishuy_uvniya", "betterment_levy", "compensation_197"}
|
||||||
|
|
||||||
|
BULLETIN_SPLIT_PROMPT = """\
|
||||||
|
אתה מקבל טקסט מלא של **עלון חודשי "עו"ד על נדל"ן"** (פרסום מקצועי רב-נושאי בתחום
|
||||||
|
תכנון ובנייה, מקרקעין, היטל השבחה, פיצויים והתחדשות עירונית). פצל אותו לפריטים.
|
||||||
|
|
||||||
|
העלון בנוי משלושה חלקים: (א) **מאמר** מקצועי ארוך אחד או יותר; (ב) **עדכוני חקיקה**
|
||||||
|
(תיקוני-חוק, אישורי-תכניות, חוזרים) — **התעלם מהם, אל תחלץ**; (ג) **עדכוני פסיקה**
|
||||||
|
מקובצים לפי נושא — כל פריט = מראה-מקום של פסק דין/החלטה + שורת-תקציר.
|
||||||
|
|
||||||
|
**אל תמציא** — חלץ רק מה שמופיע בטקסט. שדה חסר → מחרוזת ריקה.
|
||||||
|
|
||||||
|
## פלט נדרש
|
||||||
|
החזר JSON אחד (object), ללא markdown:
|
||||||
|
|
||||||
|
{
|
||||||
|
"cases": [
|
||||||
|
{
|
||||||
|
"underlying_citation": "מראה-המקום המלא של הפסק כפי שמופיע, מילה במילה (למשל 'ערר 8018-02-22 הועדה המקומית בת ים נ' קבוצת מזרחי ובניו השקעות בע\\"מ'). השדה הקריטי.",
|
||||||
|
"concept_tag": "הנושא/הכותרת שתחתיה מופיע הפריט (למשל 'היטל השבחה', 'הפקעות', 'פירוק שיתוף').",
|
||||||
|
"headline_holding": "שורת-התקציר/הכותרת של הפריט — מה נקבע/השאלה (למשל 'חוסר וודאות בין תכנית קודמת לבין ההקלה').",
|
||||||
|
"summary": "תקציר ניטרלי קצר אם יש פירוט נוסף בגוף; אחרת חזור על headline_holding.",
|
||||||
|
"underlying_court": "הערכאה אם מצוינת (למשל 'בית המשפט המחוזי', 'ועדת ערר').",
|
||||||
|
"practice_area": "אחד מ: 'rishuy_uvniya' / 'betterment_levy' / 'compensation_197' — אם ברור מהנושא; אחרת ריק.",
|
||||||
|
"subject_tags": ["2-5 תגיות snake_case בעברית"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"articles": [
|
||||||
|
{
|
||||||
|
"title": "כותרת המאמר (למשל 'הפקעת קרקעות כיום - על המחוקק לתקן את העיוות שנוצר').",
|
||||||
|
"authors": "שמות המחברים (למשל 'עו\\"ד צבי שוב, עו\\"ד רונית אלפר').",
|
||||||
|
"summary": "2-4 משפטים: על מה המאמר ומה הטענה המרכזית.",
|
||||||
|
"body": "הטקסט המלא של המאמר (כל הפסקאות), לצורך embedding וחיפוש-עומק.",
|
||||||
|
"practice_area": "אחד מ-3 אם ברור; אחרת ריק.",
|
||||||
|
"subject_tags": ["2-5 תגיות snake_case"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
## כללים
|
||||||
|
1. **underlying_citation** — חלץ במלואו ובדיוק; הוא הגשר לפסק. פריט-פסיקה בלי מראה-מקום ברור → דלג עליו.
|
||||||
|
2. **cases** — כל מצביעי-הפסיקה בעלון, גם אם תחת נושאים שונים. אל תאחד פריטים נפרדים.
|
||||||
|
3. **articles** — רק מאמרי-עומק (לא רשימת עדכונים). body = הטקסט המלא.
|
||||||
|
4. **עדכוני חקיקה/אישורי-תכניות/חוזרים — לא לחלץ כלל.**
|
||||||
|
5. אם אין מאמר או אין פסיקה — החזר מערך ריק לאותו מפתח.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def _norm_str(d: dict, key: str) -> str:
|
||||||
|
v = d.get(key)
|
||||||
|
return v.strip() if isinstance(v, str) else ""
|
||||||
|
|
||||||
|
|
||||||
|
def _norm_tags(d: dict) -> list[str]:
|
||||||
|
tags = d.get("subject_tags")
|
||||||
|
if not isinstance(tags, list):
|
||||||
|
return []
|
||||||
|
return [str(t).strip() for t in tags if str(t).strip()][:8]
|
||||||
|
|
||||||
|
|
||||||
|
def _norm_pa(d: dict) -> str:
|
||||||
|
pa = _norm_str(d, "practice_area")
|
||||||
|
return pa if pa in _VALID_PRACTICE_AREAS else ""
|
||||||
|
|
||||||
|
|
||||||
|
async def split(raw_text: str, model: str | None = None) -> dict:
|
||||||
|
"""Return ``{"cases": [...], "articles": [...]}`` extracted from a bulletin.
|
||||||
|
|
||||||
|
Empty lists on any failure (surfaced as a warning, never raised) so the
|
||||||
|
batch keeps going. Each item is type-normalized; malformed items are dropped.
|
||||||
|
"""
|
||||||
|
from legal_mcp.services import claude_session
|
||||||
|
|
||||||
|
text = (raw_text or "").strip()
|
||||||
|
if not text:
|
||||||
|
return {"cases": [], "articles": []}
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = await claude_session.query_json(
|
||||||
|
text,
|
||||||
|
system=BULLETIN_SPLIT_PROMPT,
|
||||||
|
model=(model or config.DIGEST_EXTRACT_MODEL or None),
|
||||||
|
tools="", # pure text→JSON; disable tools (avoids error_max_turns)
|
||||||
|
)
|
||||||
|
except Exception as e: # §6 — surfaced, not swallowed
|
||||||
|
logger.warning("bulletin_splitter: query failed: %s", e)
|
||||||
|
return {"cases": [], "articles": []}
|
||||||
|
|
||||||
|
if not isinstance(result, dict):
|
||||||
|
logger.warning("bulletin_splitter: expected dict, got %s", type(result).__name__)
|
||||||
|
return {"cases": [], "articles": []}
|
||||||
|
|
||||||
|
cases: list[dict] = []
|
||||||
|
for c in result.get("cases") or []:
|
||||||
|
if not isinstance(c, dict):
|
||||||
|
continue
|
||||||
|
citation = _norm_str(c, "underlying_citation")
|
||||||
|
if not citation: # rule 1: no anchor → skip
|
||||||
|
continue
|
||||||
|
cases.append({
|
||||||
|
"underlying_citation": citation,
|
||||||
|
"concept_tag": _norm_str(c, "concept_tag"),
|
||||||
|
"headline_holding": _norm_str(c, "headline_holding"),
|
||||||
|
"summary": _norm_str(c, "summary") or _norm_str(c, "headline_holding"),
|
||||||
|
"underlying_court": _norm_str(c, "underlying_court"),
|
||||||
|
"practice_area": _norm_pa(c),
|
||||||
|
"subject_tags": _norm_tags(c),
|
||||||
|
})
|
||||||
|
|
||||||
|
articles: list[dict] = []
|
||||||
|
for a in result.get("articles") or []:
|
||||||
|
if not isinstance(a, dict):
|
||||||
|
continue
|
||||||
|
title = _norm_str(a, "title")
|
||||||
|
body = _norm_str(a, "body")
|
||||||
|
if not (title or body):
|
||||||
|
continue
|
||||||
|
articles.append({
|
||||||
|
"title": title,
|
||||||
|
"authors": _norm_str(a, "authors"),
|
||||||
|
"summary": _norm_str(a, "summary"),
|
||||||
|
"body": body,
|
||||||
|
"practice_area": _norm_pa(a),
|
||||||
|
"subject_tags": _norm_tags(a),
|
||||||
|
})
|
||||||
|
|
||||||
|
return {"cases": cases, "articles": articles}
|
||||||
220
mcp-server/src/legal_mcp/services/canonical_synthesis.py
Normal file
220
mcp-server/src/legal_mcp/services/canonical_synthesis.py
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
"""Canonical-halacha synthesis (V41 Phase 4).
|
||||||
|
|
||||||
|
The backfill carried each canonical's ``canonical_statement`` over verbatim from
|
||||||
|
its representative halacha. This pass asks a local ``claude_session`` model to
|
||||||
|
rewrite that statement into ONE clean, case-independent legal principle — for the
|
||||||
|
~6 multi-instance canonicals a genuine merge of the N phrasings, for the singleton
|
||||||
|
majority a faithful generalising polish — then advances ``review_status``
|
||||||
|
pending_synthesis → pending_review for the chair gate (G10 / INV-LRN1).
|
||||||
|
|
||||||
|
Invariants this module upholds:
|
||||||
|
• INV-AH — the synthesis is GROUNDED in the instances' ``supporting_quote``s.
|
||||||
|
The model abstains (``grounded=false``) rather than invent law, no
|
||||||
|
new case citations may appear, and a re-embedding **drift guard**
|
||||||
|
rejects any rewrite that drifts too far from the source statement.
|
||||||
|
• G10/INV-LRN1 — never auto-approves; lands at ``pending_review`` for the chair.
|
||||||
|
• G9 — every outcome (accepted / kept-original / abstained) is logged + returned.
|
||||||
|
• G2 — single synthesis path; the backfill script, the on-demand MCP tool and
|
||||||
|
the nightly drain all call :func:`synthesize_canonical` here.
|
||||||
|
|
||||||
|
LLM calls go through ``claude_session`` (local ``claude -p`` CLI) only — never the
|
||||||
|
Anthropic SDK, never from the FastAPI container (see claude_session docstring).
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import math
|
||||||
|
import re
|
||||||
|
from uuid import UUID
|
||||||
|
|
||||||
|
from legal_mcp import config
|
||||||
|
from legal_mcp.services import claude_session, db, embeddings
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# Case-citation shapes (docket numbers) that must NOT be invented by the rewrite:
|
||||||
|
# "1234/05", "85074-09-24", "8125-09-24". Statute section refs ("סעיף 197") do not
|
||||||
|
# match and are legitimately part of a principle.
|
||||||
|
_CITATION_RE = re.compile(r"\d{3,5}[-/]\d{2}(?:[-/]\d{2,4})?")
|
||||||
|
|
||||||
|
_SYSTEM = (
|
||||||
|
"אתה עורך-דין בכיר המנסח עקרונות-הלכה קנוניים לבסיס-ידע משפטי של ועדת ערר "
|
||||||
|
"לתכנון ובנייה. תפקידך לזקק ניסוח אחד, כללי ומדויק, של עיקרון משפטי — לא לסכם "
|
||||||
|
"תיק ולא להמציא דין."
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _build_prompt(data: dict) -> str:
|
||||||
|
instances = data.get("instances") or []
|
||||||
|
blocks: list[str] = []
|
||||||
|
for i, inst in enumerate(instances, 1):
|
||||||
|
parts = [f"### מופע {i} (תיק {inst.get('case_number') or '—'}, "
|
||||||
|
f"סוג: {inst.get('instance_type') or '—'})"]
|
||||||
|
if inst.get("rule_statement"):
|
||||||
|
parts.append(f"ניסוח-העיקרון: {inst['rule_statement']}")
|
||||||
|
if inst.get("supporting_quote"):
|
||||||
|
parts.append(f"ציטוט-תומך (מקור-העיגון): \"{inst['supporting_quote']}\"")
|
||||||
|
if inst.get("reasoning_summary"):
|
||||||
|
parts.append(f"נימוק: {inst['reasoning_summary']}")
|
||||||
|
blocks.append("\n".join(parts))
|
||||||
|
evidence = "\n\n".join(blocks) if blocks else "(אין מופעים)"
|
||||||
|
multi = len(instances) > 1
|
||||||
|
|
||||||
|
task = (
|
||||||
|
"מזג את כל ניסוחי-המופעים לעיקרון קנוני אחד המשותף לכולם."
|
||||||
|
if multi else
|
||||||
|
"נסח מחדש את העיקרון לניסוח קנוני נקי וכללי."
|
||||||
|
)
|
||||||
|
|
||||||
|
return f"""{_SYSTEM}
|
||||||
|
|
||||||
|
הניסוח הקנוני הנוכחי (שיש לשפר):
|
||||||
|
{data.get('canonical_statement') or '(ריק)'}
|
||||||
|
|
||||||
|
מקורות-העיגון (מופעי העיקרון בפסיקה):
|
||||||
|
{evidence}
|
||||||
|
|
||||||
|
## המשימה
|
||||||
|
{task}
|
||||||
|
|
||||||
|
## כללים מחייבים (INV-AH — עיגון, ללא הזיה)
|
||||||
|
1. **עיגון-מקור בלבד.** הניסוח חייב לנבוע מהציטוטים-התומכים שלמעלה. אסור להוסיף דין, חריג, סייג או תנאי שאינו עולה מהמקורות.
|
||||||
|
2. **ללא ציטוטי-תיקים חדשים.** אל תוסיף מספרי-תיק/פסקי-דין שאינם מופיעים במקורות. הפניה לסעיף-חוק כללי (למשל "סעיף 197 לחוק התכנון והבניה") מותרת אם היא חלק מהעיקרון.
|
||||||
|
3. **כללי ובלתי-תלוי-תיק.** הסר שמות-צדדים, עובדות-תיק ספציפיות ומספרים קונקרטיים. נסח עיקרון רב-תחולה, לא סיכום של מקרה.
|
||||||
|
4. **רגיסטר משפטי נקי** בעברית, משפט אחד עד שניים, ללא מילות-פתיחה ("נקבע כי", "בית-המשפט קבע") — רק העיקרון עצמו.
|
||||||
|
5. **הימנעות עדיפה על המצאה.** אם אינך יכול לזקק עיקרון מעוגן מהמקורות — החזר grounded=false והשאר את הניסוח הקיים.
|
||||||
|
|
||||||
|
## פלט — JSON בלבד, ללא markdown וללא הסבר:
|
||||||
|
{{
|
||||||
|
"canonical_statement": "<הניסוח הקנוני המזוקק, או הניסוח הקיים אם grounded=false>",
|
||||||
|
"grounded": true,
|
||||||
|
"changed": true,
|
||||||
|
"reason": "<משפט קצר: מה שונה, או מדוע נמנעת>"
|
||||||
|
}}"""
|
||||||
|
|
||||||
|
|
||||||
|
def _cosine(a: list[float], b: list[float]) -> 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 _new_citations(text: str, source_text: str) -> list[str]:
|
||||||
|
"""Docket-number tokens present in the rewrite but absent from the source evidence."""
|
||||||
|
src = set(_CITATION_RE.findall(source_text))
|
||||||
|
return [tok for tok in _CITATION_RE.findall(text) if tok not in src]
|
||||||
|
|
||||||
|
|
||||||
|
async def synthesize_canonical(
|
||||||
|
canonical_id: UUID,
|
||||||
|
*,
|
||||||
|
model: str | None = None,
|
||||||
|
effort: str | None = None,
|
||||||
|
drift_floor: float | None = None,
|
||||||
|
) -> dict:
|
||||||
|
"""Synthesize one canonical's statement. PURE — does not write to the DB.
|
||||||
|
|
||||||
|
Returns a proposal dict the caller applies (or not, for dry-run):
|
||||||
|
{status, canonical_id, accepted, original, proposed, embedding, drift_cosine, reason}
|
||||||
|
|
||||||
|
status ∈ {accepted, abstained, drift_rejected, new_citation, no_instances,
|
||||||
|
llm_error, not_found}. ``accepted`` carries ``proposed`` + ``embedding``
|
||||||
|
(the rewrite's vector, to commit alongside the statement). Every other status
|
||||||
|
keeps the original statement.
|
||||||
|
"""
|
||||||
|
model = model or config.HALACHA_CANONICAL_SYNTH_MODEL
|
||||||
|
effort = effort or config.HALACHA_CANONICAL_SYNTH_EFFORT
|
||||||
|
drift_floor = config.HALACHA_CANONICAL_SYNTH_DRIFT_FLOOR if drift_floor is None else drift_floor
|
||||||
|
|
||||||
|
data = await db.fetch_canonical_synthesis_input(canonical_id)
|
||||||
|
if data is None:
|
||||||
|
return {"status": "not_found", "canonical_id": str(canonical_id)}
|
||||||
|
|
||||||
|
original = data.get("canonical_statement") or ""
|
||||||
|
instances = data.get("instances") or []
|
||||||
|
base = {"status": "", "canonical_id": str(canonical_id), "accepted": False,
|
||||||
|
"original": original, "proposed": original, "embedding": None,
|
||||||
|
"drift_cosine": None, "reason": ""}
|
||||||
|
|
||||||
|
if not instances:
|
||||||
|
return {**base, "status": "no_instances", "reason": "no linked instances"}
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = await claude_session.query_json(
|
||||||
|
_build_prompt(data), model=model, effort=effort, tools="",
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning("synthesize_canonical %s: LLM error: %s", canonical_id, e)
|
||||||
|
return {**base, "status": "llm_error", "reason": str(e)}
|
||||||
|
|
||||||
|
if not isinstance(result, dict) or not result.get("canonical_statement"):
|
||||||
|
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["canonical_statement"]).strip()
|
||||||
|
if not proposed or proposed == original:
|
||||||
|
return {**base, "status": "abstained", "reason": "no change proposed"}
|
||||||
|
|
||||||
|
# AH-2: no invented docket citations. Source = current statement + all evidence.
|
||||||
|
source_text = original + " " + " ".join(
|
||||||
|
f"{i.get('rule_statement', '')} {i.get('supporting_quote', '')}" for i in instances
|
||||||
|
)
|
||||||
|
invented = _new_citations(proposed, source_text)
|
||||||
|
if invented:
|
||||||
|
return {**base, "status": "new_citation", "proposed": proposed,
|
||||||
|
"reason": f"introduced citations absent from source: {invented}"}
|
||||||
|
|
||||||
|
# Drift guard: re-embed the rewrite, compare to the source statement's vector.
|
||||||
|
new_emb = (await embeddings.embed_texts([proposed]))[0]
|
||||||
|
src_emb = data.get("embedding")
|
||||||
|
if not src_emb:
|
||||||
|
src_emb = (await embeddings.embed_texts([original]))[0]
|
||||||
|
drift = _cosine(new_emb, src_emb)
|
||||||
|
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", "accepted": True, "proposed": proposed,
|
||||||
|
"embedding": new_emb, "drift_cosine": round(drift, 4),
|
||||||
|
"reason": result.get("reason") or "synthesized"}
|
||||||
|
|
||||||
|
|
||||||
|
async def synthesize_and_apply(
|
||||||
|
canonical_id: UUID,
|
||||||
|
*,
|
||||||
|
model: str | None = None,
|
||||||
|
effort: str | None = None,
|
||||||
|
drift_floor: float | None = None,
|
||||||
|
) -> dict:
|
||||||
|
"""Synthesize one canonical and commit the outcome.
|
||||||
|
|
||||||
|
On ``accepted`` writes the new statement + its embedding. On any other terminal
|
||||||
|
outcome (abstained / drift_rejected / new_citation) the ORIGINAL statement is
|
||||||
|
kept but ``review_status`` still advances to ``pending_review`` — a synthesis was
|
||||||
|
attempted, so the row leaves the queue (no infinite re-attempt) and reaches the
|
||||||
|
chair as-is. ``not_found`` / ``no_instances`` / ``llm_error`` are NOT committed
|
||||||
|
(transient or empty) so they are retried on the next pass.
|
||||||
|
"""
|
||||||
|
proposal = await synthesize_canonical(
|
||||||
|
canonical_id, model=model, effort=effort, drift_floor=drift_floor,
|
||||||
|
)
|
||||||
|
status = proposal["status"]
|
||||||
|
if status in ("not_found", "no_instances", "llm_error"):
|
||||||
|
return proposal
|
||||||
|
|
||||||
|
if proposal["accepted"]:
|
||||||
|
await db.apply_canonical_synthesis(
|
||||||
|
canonical_id, proposal["proposed"], embedding=proposal["embedding"],
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
# keep original statement + embedding, just advance the gate
|
||||||
|
await db.apply_canonical_synthesis(canonical_id, proposal["original"])
|
||||||
|
return proposal
|
||||||
@@ -22,8 +22,25 @@ from legal_mcp import config
|
|||||||
# court rulings use slightly different vocabulary (פסק דין, נימוקים, סוף דבר).
|
# court rulings use slightly different vocabulary (פסק דין, נימוקים, סוף דבר).
|
||||||
SECTION_PATTERNS = [
|
SECTION_PATTERNS = [
|
||||||
(r"רקע\s*עובדתי|רקע\s*כללי|העובדות|הרקע", "facts"),
|
(r"רקע\s*עובדתי|רקע\s*כללי|העובדות|הרקע", "facts"),
|
||||||
(r"טענות\s*העוררי[םן]|טענות\s*המערערי[םן]|עיקר\s*טענות\s*העוררי[םן]", "appellant_claims"),
|
# parties_claims: bilateral section common in Supreme Court / administrative
|
||||||
(r"טענות\s*המשיבי[םן]|תשובת\s*המשיבי[םן]|עיקר\s*טענות\s*המשיבי[םן]", "respondent_claims"),
|
# court decisions ("טענות הצדדים", "טיעוני הצדדים"). Not split by side.
|
||||||
|
(
|
||||||
|
r"(?:טענות|טיעוני|עמדות)\s*הצדדים",
|
||||||
|
"parties_claims",
|
||||||
|
),
|
||||||
|
# appellant_claims: covers singular (עורר/עוררת, מערער/מערערת) and plural
|
||||||
|
# (עוררים/עוררין, מערערים), plus court-format verb "טיעוני".
|
||||||
|
(
|
||||||
|
r"(?:טענות|עיקר\s*טענות|טיעוני)\s*ה(?:עוררי[םן]|עורר[ת]?|מערערי[םן]|מערער[ת]?)",
|
||||||
|
"appellant_claims",
|
||||||
|
),
|
||||||
|
# respondent_claims: covers singular (משיב/משיבה) and plural (משיבים/משיבין),
|
||||||
|
# plus verb forms תשובת/תגובת/טיעוני. "טענות המשיבה:" (feminine singular) was
|
||||||
|
# the root cause of halacha 8181-21 index-11 being extracted from party claims.
|
||||||
|
(
|
||||||
|
r"(?:טענות|תשובת|תגובת|עיקר\s*טענות|טיעוני)\s*ה(?:משיבי[םן]|משיב[ה]?)",
|
||||||
|
"respondent_claims",
|
||||||
|
),
|
||||||
(r"דיון\s*והכרעה|דיון|הכרעה|ניתוח\s*משפטי|המסגרת\s*המשפטית|נימוקים", "legal_analysis"),
|
(r"דיון\s*והכרעה|דיון|הכרעה|ניתוח\s*משפטי|המסגרת\s*המשפטית|נימוקים", "legal_analysis"),
|
||||||
(r"מסקנ[הות]|סיכום|סוף\s*דבר", "conclusion"),
|
(r"מסקנ[הות]|סיכום|סוף\s*דבר", "conclusion"),
|
||||||
(r"פסק[- ]?דין|החלטה|לפיכך\s*אני\s*מחליט|התוצאה", "ruling"),
|
(r"פסק[- ]?דין|החלטה|לפיכך\s*אני\s*מחליט|התוצאה", "ruling"),
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ async def _extract_chunk(
|
|||||||
last_err: Exception | None = None
|
last_err: Exception | None = None
|
||||||
for attempt in range(CHUNK_RETRY_ATTEMPTS + 1):
|
for attempt in range(CHUNK_RETRY_ATTEMPTS + 1):
|
||||||
try:
|
try:
|
||||||
claims = await claude_session.query_json(prompt)
|
claims = await claude_session.query_json(prompt, tools="") # no tool_use → no error_max_turns
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
last_err = e
|
last_err = e
|
||||||
logger.warning(
|
logger.warning(
|
||||||
|
|||||||
@@ -60,6 +60,31 @@ _SESSION_MARKER_EXACT = frozenset({"AI_AGENT", "CLAUDE_EFFORT"})
|
|||||||
MAX_RETRIES = 3
|
MAX_RETRIES = 3
|
||||||
RETRY_BACKOFF_BASE = 5 # seconds; sleep = base * attempt_number
|
RETRY_BACKOFF_BASE = 5 # seconds; sleep = base * attempt_number
|
||||||
|
|
||||||
|
# Phrases the CLI emits as the "result" of an exit-0 run that actually hit a
|
||||||
|
# usage/rate limit (a refusal NOTICE, not a real answer). Matched only against a
|
||||||
|
# result that is NOT structured output (doesn't start with [ or {), so a genuine
|
||||||
|
# JSON extraction containing these words as content is never mis-flagged.
|
||||||
|
_LIMIT_NOTICE_MARKERS = (
|
||||||
|
"usage limit",
|
||||||
|
"rate limit",
|
||||||
|
"limit reached",
|
||||||
|
"limit will reset",
|
||||||
|
"try again later",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _looks_like_limit_notice(data: dict) -> bool:
|
||||||
|
"""True if an exit-0 ``result`` is really a usage/rate-limit refusal."""
|
||||||
|
result = data.get("result")
|
||||||
|
if not isinstance(result, str):
|
||||||
|
return False
|
||||||
|
stripped = result.lstrip()
|
||||||
|
# Structured output (JSON array/object) is a real answer, never a notice.
|
||||||
|
if stripped.startswith(("[", "{")):
|
||||||
|
return False
|
||||||
|
low = result.lower()
|
||||||
|
return any(m in low for m in _LIMIT_NOTICE_MARKERS)
|
||||||
|
|
||||||
|
|
||||||
def _clean_subprocess_env() -> dict[str, str]:
|
def _clean_subprocess_env() -> dict[str, str]:
|
||||||
"""Copy the current env minus Claude Code session markers.
|
"""Copy the current env minus Claude Code session markers.
|
||||||
@@ -82,6 +107,7 @@ async def query(
|
|||||||
system: str | None = None,
|
system: str | None = None,
|
||||||
model: str | None = None,
|
model: str | None = None,
|
||||||
effort: str | None = None,
|
effort: str | None = None,
|
||||||
|
tools: str | None = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""Send a prompt to Claude Code headless and return the text response.
|
"""Send a prompt to Claude Code headless and return the text response.
|
||||||
|
|
||||||
@@ -104,6 +130,12 @@ async def query(
|
|||||||
effort: Optional effort level (``low``/``medium``/``high``/``xhigh``/
|
effort: Optional effort level (``low``/``medium``/``high``/``xhigh``/
|
||||||
``max``). When set, passed as ``--effort``. Pairs with ``model``;
|
``max``). When set, passed as ``--effort``. Pairs with ``model``;
|
||||||
an empty string is treated as "unset" (CLI default).
|
an empty string is treated as "unset" (CLI default).
|
||||||
|
tools: Optional available-tools spec, passed as ``--tools``. Pass an
|
||||||
|
empty string (``""``) to disable ALL tools — for pure text→JSON
|
||||||
|
extraction the model has no reason to call a tool, and leaving
|
||||||
|
tools enabled makes it occasionally emit ``stop_reason: tool_use``
|
||||||
|
which trips ``--max-turns 1`` → ``error_max_turns`` and forces a
|
||||||
|
retry (slow). ``None`` leaves the CLI default (all tools).
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The text response from Claude.
|
The text response from Claude.
|
||||||
@@ -126,6 +158,8 @@ async def query(
|
|||||||
cmd += ["--model", model]
|
cmd += ["--model", model]
|
||||||
if effort:
|
if effort:
|
||||||
cmd += ["--effort", effort]
|
cmd += ["--effort", effort]
|
||||||
|
if tools is not None: # "" → disable all tools (no tool_use → no max-turns trip)
|
||||||
|
cmd += ["--tools", tools]
|
||||||
|
|
||||||
size_info = f"; prompt_len={len(full_prompt):,} chars" if len(full_prompt) > 100_000 else ""
|
size_info = f"; prompt_len={len(full_prompt):,} chars" if len(full_prompt) > 100_000 else ""
|
||||||
last_err = "unknown error"
|
last_err = "unknown error"
|
||||||
@@ -178,11 +212,27 @@ async def query(
|
|||||||
try:
|
try:
|
||||||
data = json.loads(stdout)
|
data = json.loads(stdout)
|
||||||
if isinstance(data, dict) and "result" in data:
|
if isinstance(data, dict) and "result" in data:
|
||||||
return data["result"]
|
# A usage/rate-limit hit can exit 0 with a refusal NOTICE
|
||||||
return stdout
|
# as the "result" (is_error / error subtype). Returning it
|
||||||
|
# as success makes callers treat a throttled run as a real
|
||||||
|
# empty answer — e.g. the halacha extractor then checkpoints
|
||||||
|
# the chunk as done-with-0-halachot and a resume skips it
|
||||||
|
# forever (#138/#144 silent under-extraction). Treat it as a
|
||||||
|
# transient failure → retry, and raise if it persists so the
|
||||||
|
# chunk stays un-checkpointed for a real resume.
|
||||||
|
if data.get("is_error") or _looks_like_limit_notice(data):
|
||||||
|
last_err = (
|
||||||
|
f"error result (subtype={data.get('subtype')}): "
|
||||||
|
f"{str(data.get('result',''))[:200]}"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return data["result"]
|
||||||
|
else:
|
||||||
|
return stdout
|
||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
return stdout
|
return stdout
|
||||||
last_err = "empty response"
|
else:
|
||||||
|
last_err = "empty response"
|
||||||
|
|
||||||
# Transient failure — retry with linear backoff unless this was the last try.
|
# Transient failure — retry with linear backoff unless this was the last try.
|
||||||
if attempt < MAX_RETRIES:
|
if attempt < MAX_RETRIES:
|
||||||
@@ -204,13 +254,15 @@ async def query_json(
|
|||||||
system: str | None = None,
|
system: str | None = None,
|
||||||
model: str | None = None,
|
model: str | None = None,
|
||||||
effort: str | None = None,
|
effort: str | None = None,
|
||||||
|
tools: str | None = None,
|
||||||
) -> dict | list | None:
|
) -> dict | list | None:
|
||||||
"""Send a prompt and parse the response as JSON.
|
"""Send a prompt and parse the response as JSON.
|
||||||
|
|
||||||
Uses parse_llm_json for robust parsing (handles markdown wrapping, truncation).
|
Uses parse_llm_json for robust parsing (handles markdown wrapping, truncation).
|
||||||
``model``/``effort`` are forwarded to :func:`query` (see its docstring).
|
``model``/``effort``/``tools`` are forwarded to :func:`query` (see its docstring).
|
||||||
|
Pure text→JSON extractors should pass ``tools=""`` to avoid ``error_max_turns``.
|
||||||
"""
|
"""
|
||||||
raw = await query(prompt, timeout=timeout, system=system, model=model, effort=effort)
|
raw = await query(prompt, timeout=timeout, system=system, model=model, effort=effort, tools=tools)
|
||||||
return parse_llm_json(raw)
|
return parse_llm_json(raw)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ async def classify_treatment(cited_citation: str, context: str) -> str:
|
|||||||
user, system=_TREATMENT_PROMPT,
|
user, system=_TREATMENT_PROMPT,
|
||||||
model=config.HALACHA_EXTRACT_MODEL or None,
|
model=config.HALACHA_EXTRACT_MODEL or None,
|
||||||
effort=config.HALACHA_EXTRACT_EFFORT or None,
|
effort=config.HALACHA_EXTRACT_EFFORT or None,
|
||||||
|
tools="", # pure text→JSON — no tool_use → no error_max_turns
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning("classify_treatment failed: %s", e)
|
logger.warning("classify_treatment failed: %s", e)
|
||||||
|
|||||||
@@ -117,6 +117,49 @@ def normalize_case_number(raw: str) -> str:
|
|||||||
return cleaned.replace("/", "-").strip("-")
|
return cleaned.replace("/", "-").strip("-")
|
||||||
|
|
||||||
|
|
||||||
|
def case_number_from_citation(citation: str) -> str:
|
||||||
|
"""Canonical ``case_number`` extracted from a full citation, or ``''``.
|
||||||
|
|
||||||
|
Returns the normalized number token only (e.g. ``85074-04-25``) — NEVER the
|
||||||
|
full citation string with party names / court / date. This is the
|
||||||
|
identifier-field rule from X1 (INV-ID2): a citation like
|
||||||
|
``ערר (ת"א 85074-04-25) רפאל לוי ואח' נ' הוועדה … - חולון`` yields
|
||||||
|
``85074-04-25``, not the whole display string.
|
||||||
|
|
||||||
|
Reuses ``classify`` (the one canonical citation parser) so callers that need
|
||||||
|
a case_number out of an arbitrary citation never roll their own regex (#137,
|
||||||
|
G2). Returns ``''`` when no number can be parsed — the caller MUST treat that
|
||||||
|
as "needs a manual case_number" and never fall back to the raw citation.
|
||||||
|
"""
|
||||||
|
return classify(citation).case_number_norm
|
||||||
|
|
||||||
|
|
||||||
|
def _norm_designator(prefix: str) -> str:
|
||||||
|
"""Collapse a court/proceeding prefix to a comparison token.
|
||||||
|
|
||||||
|
Strips gershayim variants and whitespace so ``עע"מ`` / ``עע״מ`` / ``עעמ``
|
||||||
|
all map to the same token, while DISTINCT courts stay distinct.
|
||||||
|
"""
|
||||||
|
return re.sub(r"[\s\"״׳']", "", prefix or "")
|
||||||
|
|
||||||
|
|
||||||
|
def citation_dedup_key(citation: str) -> str:
|
||||||
|
"""Designator-aware dedup key for a citation, or ``''`` if no number.
|
||||||
|
|
||||||
|
Returns ``f"{designator}|{case_number_norm}"`` — e.g.
|
||||||
|
``בג"ץ 389/87`` → ``בגץ|389-87`` and ``ע"א 389/87`` → ``עא|389-87`` are
|
||||||
|
DISTINCT keys, even though both share docket ``389-87``. This is the safe
|
||||||
|
dedup key for ``missing_precedents`` (#143/#136): deduping on the bare number
|
||||||
|
alone (``case_number_from_citation``) would WRONGLY MERGE the same docket
|
||||||
|
across different courts (18 such collisions already exist in the corpus). A
|
||||||
|
prefix-less citation (bare נט-format / unknown court) yields ``|<number>``.
|
||||||
|
"""
|
||||||
|
cit = classify(citation)
|
||||||
|
if not cit.case_number_norm:
|
||||||
|
return ""
|
||||||
|
return f"{_norm_designator(cit.court_prefix)}|{cit.case_number_norm}"
|
||||||
|
|
||||||
|
|
||||||
def _split_filed(num_norm: str) -> tuple[str, str, str] | None:
|
def _split_filed(num_norm: str) -> tuple[str, str, str] | None:
|
||||||
"""Split a normalized NNNNN-MM-YY number into (file, month, year).
|
"""Split a normalized NNNNN-MM-YY number into (file, month, year).
|
||||||
|
|
||||||
@@ -157,15 +200,23 @@ def classify(citation: str) -> CourtCitation:
|
|||||||
case_number_norm=normalize_case_number(raw),
|
case_number_norm=normalize_case_number(raw),
|
||||||
)
|
)
|
||||||
|
|
||||||
# 2. Supreme Court prefix → Tier 0.
|
# 2. Supreme Court prefix → Tier 0. Still parse a נט-format triple when the
|
||||||
|
# number carries one (e.g. בר"מ 72182-06-25): נט המשפט serves Supreme
|
||||||
|
# cases too, so a triple lets the orchestrator route to the validated
|
||||||
|
# Tier-1 flow instead of the serial-only Tier-0.
|
||||||
m = _SUPREME_RX.search(text)
|
m = _SUPREME_RX.search(text)
|
||||||
if m:
|
if m:
|
||||||
raw = m.group(2)
|
raw = m.group(2)
|
||||||
|
norm = normalize_case_number(raw)
|
||||||
|
filed = _split_filed(norm)
|
||||||
return CourtCitation(
|
return CourtCitation(
|
||||||
tier="supreme",
|
tier="supreme",
|
||||||
court_prefix=m.group(1),
|
court_prefix=m.group(1),
|
||||||
case_number_raw=raw,
|
case_number_raw=raw,
|
||||||
case_number_norm=normalize_case_number(raw),
|
case_number_norm=norm,
|
||||||
|
file_number=filed[0] if filed else None,
|
||||||
|
month=filed[1] if filed else None,
|
||||||
|
year=filed[2] if filed else None,
|
||||||
)
|
)
|
||||||
|
|
||||||
# 3. District / admin prefix → Tier 1.
|
# 3. District / admin prefix → Tier 1.
|
||||||
|
|||||||
@@ -41,11 +41,12 @@ logger = logging.getLogger(__name__)
|
|||||||
# human (INV-CF3). Kept low — the .gov site shouldn't be hammered (INV-CF4).
|
# human (INV-CF3). Kept low — the .gov site shouldn't be hammered (INV-CF4).
|
||||||
MAX_AUTONOMOUS_ATTEMPTS = int(os.environ.get("COURT_FETCH_MAX_ATTEMPTS", "2"))
|
MAX_AUTONOMOUS_ATTEMPTS = int(os.environ.get("COURT_FETCH_MAX_ATTEMPTS", "2"))
|
||||||
|
|
||||||
# The host-side Tier-1 browser service (pm2). The MCP server runs on the host,
|
# The host-side Tier-1 browser service (pm2). It binds the docker0 bridge
|
||||||
# so it reaches the service over loopback directly (the container bridge in
|
# gateway (10.0.1.1) — same as legal-chat-service — so both the host MCP server
|
||||||
# web/court_fetch_proxy.py is a separate, optional entry point).
|
# and containers can reach it; the host reaches 10.0.1.1 as a local interface.
|
||||||
|
# Override with COURT_FETCH_SERVICE_URL.
|
||||||
COURT_FETCH_SERVICE_URL = os.environ.get(
|
COURT_FETCH_SERVICE_URL = os.environ.get(
|
||||||
"COURT_FETCH_SERVICE_URL", "http://127.0.0.1:8771"
|
"COURT_FETCH_SERVICE_URL", "http://10.0.1.1:8771"
|
||||||
)
|
)
|
||||||
_SHARED_SECRET = os.environ.get("COURT_FETCH_SHARED_SECRET", "").strip()
|
_SHARED_SECRET = os.environ.get("COURT_FETCH_SHARED_SECRET", "").strip()
|
||||||
_TIER1_TIMEOUT_S = float(os.environ.get("COURT_FETCH_TIER1_TIMEOUT_S", "300"))
|
_TIER1_TIMEOUT_S = float(os.environ.get("COURT_FETCH_TIER1_TIMEOUT_S", "300"))
|
||||||
@@ -169,14 +170,15 @@ async def fetch_and_ingest(
|
|||||||
await db.court_fetch_job_update(job_id, status="running", bump_attempts=True)
|
await db.court_fetch_job_update(job_id, status="running", bump_attempts=True)
|
||||||
|
|
||||||
# ── fetch ──
|
# ── fetch ──
|
||||||
|
# Route by what the number lets us do, not just the court prefix: נט המשפט
|
||||||
|
# (Tier 1) serves ALL courts — Supreme included — as long as the citation
|
||||||
|
# carries a נט-format triple (file-month-year). Validated live on both
|
||||||
|
# district (עת"מ 43830-12-24) and Supreme (בר"מ 72182-06-25). Only a serial-
|
||||||
|
# only Supreme number (e.g. עע"מ 5886/24, no month) can't be looked up that
|
||||||
|
# way → fall through to Tier 0 (supremedecisions).
|
||||||
|
has_net_format = bool(cit.file_number and cit.month and cit.year)
|
||||||
try:
|
try:
|
||||||
if cit.tier == "supreme":
|
if has_net_format:
|
||||||
fetched = await fetch_supreme_verdict(
|
|
||||||
citation=citation, case_number_norm=cit.case_number_norm
|
|
||||||
)
|
|
||||||
content, filename = fetched.content, fetched.filename
|
|
||||||
source_url, court = fetched.source_url, fetched.court
|
|
||||||
else: # admin → Tier 1
|
|
||||||
res = await _fetch_tier1_admin(cit)
|
res = await _fetch_tier1_admin(cit)
|
||||||
if not res.get("ok"):
|
if not res.get("ok"):
|
||||||
raise RuntimeError(res.get("reason") or "אחזור נכשל")
|
raise RuntimeError(res.get("reason") or "אחזור נכשל")
|
||||||
@@ -185,7 +187,20 @@ async def fetch_and_ingest(
|
|||||||
filename = res.get("filename") or f"{cit.case_number_norm}.pdf"
|
filename = res.get("filename") or f"{cit.case_number_norm}.pdf"
|
||||||
source_url = res.get("source_url", "")
|
source_url = res.get("source_url", "")
|
||||||
court = res.get("court") or cit.court_prefix
|
court = res.get("court") or cit.court_prefix
|
||||||
except (_Tier1Unavailable, SupremeFetchError, RuntimeError) as e:
|
elif cit.tier == "supreme":
|
||||||
|
fetched = await fetch_supreme_verdict(
|
||||||
|
citation=citation, case_number_norm=cit.case_number_norm
|
||||||
|
)
|
||||||
|
content, filename = fetched.content, fetched.filename
|
||||||
|
source_url, court = fetched.source_url, fetched.court
|
||||||
|
else:
|
||||||
|
raise RuntimeError(
|
||||||
|
f"מספר-תיק {cit.case_number_norm} אינו בפורמט נט-המשפט ואינו עליון — "
|
||||||
|
"אין מסלול-אחזור ציבורי"
|
||||||
|
)
|
||||||
|
except Exception as e: # noqa: BLE001 — any fetch error is recorded, never
|
||||||
|
# left hanging in 'running' (INV-CF2). _record_failure escalates to
|
||||||
|
# 'manual' after MAX_AUTONOMOUS_ATTEMPTS (INV-CF3).
|
||||||
return await _record_failure(job_id, cit, citation, str(e))
|
return await _record_failure(job_id, cit, citation, str(e))
|
||||||
|
|
||||||
# ── ingest into the canonical pipeline (INV-CF1) ──
|
# ── ingest into the canonical pipeline (INV-CF1) ──
|
||||||
@@ -204,10 +219,77 @@ async def fetch_and_ingest(
|
|||||||
case_law_id=UUID(str(case_law_id)) if case_law_id else None,
|
case_law_id=UUID(str(case_law_id)) if case_law_id else None,
|
||||||
source_url=source_url, error="",
|
source_url=source_url, error="",
|
||||||
)
|
)
|
||||||
|
# Close the digest gap (INV-DIG3): if this fetch traces back to a digest,
|
||||||
|
# link it to the freshly-ingested ruling. Best-effort; never fails the job.
|
||||||
|
link_digest_id = digest_id or job.get("digest_id")
|
||||||
|
if case_law_id and link_digest_id:
|
||||||
|
try:
|
||||||
|
await db.link_digest_to_case_law(link_digest_id, UUID(str(case_law_id)))
|
||||||
|
logger.info("linked digest %s → case_law %s", link_digest_id, case_law_id)
|
||||||
|
except Exception:
|
||||||
|
logger.warning("could not relink digest %s after fetch", link_digest_id)
|
||||||
|
|
||||||
|
# Close any open missing-precedent gap this fetch fills (the citation graph
|
||||||
|
# often records the same ruling as a gap). Best-effort.
|
||||||
|
if case_law_id:
|
||||||
|
await _close_matching_gaps(cit.case_number_norm, UUID(str(case_law_id)))
|
||||||
|
|
||||||
return {"status": "done", "tier": cit.tier, "case_law_id": case_law_id,
|
return {"status": "done", "tier": cit.tier, "case_law_id": case_law_id,
|
||||||
"citation": citation, "source_url": source_url, "ingest": result}
|
"citation": citation, "source_url": source_url, "ingest": result}
|
||||||
|
|
||||||
|
|
||||||
|
async def _close_matching_gaps(case_number_norm: str, case_law_id: UUID) -> None:
|
||||||
|
"""Close open missing_precedents whose citation matches the fetched case."""
|
||||||
|
try:
|
||||||
|
gaps = await db.list_missing_precedents(status="open", limit=500)
|
||||||
|
for g in gaps:
|
||||||
|
if court_citation.normalize_case_number(g.get("citation", "")) == case_number_norm:
|
||||||
|
await db.close_missing_precedent(
|
||||||
|
UUID(str(g["id"])), linked_case_law_id=case_law_id,
|
||||||
|
status="closed", notes="נקלט אוטומטית דרך אחזור-פסיקה (X13)",
|
||||||
|
)
|
||||||
|
logger.info("closed missing_precedent %s", g["id"])
|
||||||
|
except Exception:
|
||||||
|
logger.warning("could not close gaps for %s", case_number_norm)
|
||||||
|
|
||||||
|
|
||||||
|
# Politeness between consecutive court fetches in a drain (INV-CF4) — serial,
|
||||||
|
# spaced. Mirrors the precedent-extraction queue cadence.
|
||||||
|
_INTER_FETCH_COOLDOWN_S = float(os.environ.get("COURT_FETCH_DRAIN_COOLDOWN_S", "20"))
|
||||||
|
|
||||||
|
|
||||||
|
async def drain_pending(limit: int = 10) -> dict:
|
||||||
|
"""Process queued court-fetch jobs (status pending/failed) serially.
|
||||||
|
|
||||||
|
Drains the ``court_fetch_jobs`` queue the digest trigger fills — fetch +
|
||||||
|
ingest each, link back to its digest. Serial with a cooldown (INV-CF4); a
|
||||||
|
job that fails is recorded and retried next drain until it escalates to
|
||||||
|
``manual`` (INV-CF3). Local-only (runs the ingest pipeline / claude CLI).
|
||||||
|
"""
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
jobs = await db.court_fetch_job_list(status="pending", limit=limit)
|
||||||
|
jobs += await db.court_fetch_job_list(status="failed", limit=limit)
|
||||||
|
seen, queue = set(), []
|
||||||
|
for j in jobs:
|
||||||
|
k = j["case_number_norm"]
|
||||||
|
if k not in seen:
|
||||||
|
seen.add(k); queue.append(j)
|
||||||
|
results = []
|
||||||
|
for i, j in enumerate(queue[:limit]):
|
||||||
|
if i:
|
||||||
|
await asyncio.sleep(_INTER_FETCH_COOLDOWN_S)
|
||||||
|
digest_id = j.get("digest_id")
|
||||||
|
try:
|
||||||
|
r = await fetch_and_ingest(j["citation_raw"], digest_id=digest_id)
|
||||||
|
except Exception as e: # noqa: BLE001 — recorded per-job, never aborts the drain
|
||||||
|
logger.exception("drain item failed: %s", j["case_number_norm"])
|
||||||
|
r = {"status": "error", "citation": j["citation_raw"], "error": str(e)}
|
||||||
|
results.append(r)
|
||||||
|
done = sum(1 for r in results if r.get("status") in ("done", "already_done"))
|
||||||
|
return {"processed": len(results), "done": done, "results": results}
|
||||||
|
|
||||||
|
|
||||||
async def _record_failure(
|
async def _record_failure(
|
||||||
job_id: UUID, cit: court_citation.CourtCitation, citation: str, err: str
|
job_id: UUID, cit: court_citation.CourtCitation, citation: str, err: str
|
||||||
) -> dict:
|
) -> dict:
|
||||||
@@ -232,10 +314,14 @@ async def _record_failure(
|
|||||||
async def _open_gap(citation: str, *, reason: str) -> None:
|
async def _open_gap(citation: str, *, reason: str) -> None:
|
||||||
"""Open a missing_precedent gap so the chair sees it (INV-CF2/CF3).
|
"""Open a missing_precedent gap so the chair sees it (INV-CF2/CF3).
|
||||||
|
|
||||||
Best-effort + de-duplicated by the missing_precedents layer; a failure
|
Best-effort + de-duplicated (designator-aware via citation_norm, #143); a
|
||||||
here is logged, never raised (it must not mask the original outcome).
|
failure here is logged, never raised (it must not mask the original outcome).
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
await db.create_missing_precedent(citation=citation, notes=reason)
|
if await db.find_missing_precedent_by_citation(citation):
|
||||||
|
return
|
||||||
|
await db.create_missing_precedent(
|
||||||
|
citation=citation, notes=reason, discovery_source="court_fetch",
|
||||||
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.warning("could not open missing_precedent for %s", citation)
|
logger.warning("could not open missing_precedent for %s", citation)
|
||||||
|
|||||||
@@ -1,37 +1,38 @@
|
|||||||
"""Tier 0 — Supreme Court verdict fetcher (X13).
|
"""Tier 0 — Supreme Court verdict fetcher (X13), via supremedecisions.court.gov.il.
|
||||||
|
|
||||||
Pulls a published Supreme Court verdict PDF from the **public** decisions
|
Pulls a published Supreme Court verdict PDF from the **public** decisions portal
|
||||||
portal ``supremedecisions.court.gov.il`` — no smart-card, no CAPTCHA. The
|
— no smart-card, no CAPTCHA, no browser (pure httpx). Used for serial-format
|
||||||
portal is an AngularJS SPA backed by a small JSON API (reverse-engineered
|
citations (בג"ץ/בר"מ/עע"מ NNNN/YY) that have no נט-format triple and so can't go
|
||||||
from ``/Scripts/app/config.js`` + the search/results controllers):
|
through the Tier-1 נט-המשפט flow.
|
||||||
|
|
||||||
POST Home/SearchVerdicts body {"document": <query>, "lan": 1} → result list
|
The portal is an AngularJS SPA over a small ASP.NET JSON API, reverse-engineered
|
||||||
GET Home/GetCasesYearNum ?... (year + number lookup) → case + docs
|
and validated live (2026-06-08 on בג"ץ 3483/05 → 75 KB PDF). The flow:
|
||||||
GET Home/Download?path=<path>&fileName=<file>&type=4 → the PDF bytes
|
|
||||||
|
|
||||||
Two things matter for getting a 200 instead of an F5 connection-reset
|
POST Home/SearchVerdicts
|
||||||
(verified empirically 2026-06-07):
|
body: {"document": {"Year": "YYYY", "CaseNum": "NNNN", "Month": {},
|
||||||
* a **complete** browser header set — UA + Accept + Accept-Language. A bare
|
"dateType": 1, "publishDate": 8,
|
||||||
UA alone gets reset.
|
"SearchText": [<empty clause>],
|
||||||
* **politeness** (INV-CF4): one request at a time, a cooldown between them,
|
"OldMainNumFormat": true}, "lan": 1}
|
||||||
a Referer of the portal root. We never parallelise or hammer.
|
→ {"data": [{Path, FileName, CaseName, Type, Pages, VerdictDt, ...}, ...]}
|
||||||
|
GET Home/Download?path=<Path>&fileName=<FileName>&type=4 → the verdict PDF
|
||||||
|
|
||||||
Honesty / scope: the *result→download* field mapping (where ``path`` and
|
Two things are required to get JSON instead of an F5 WAF block (verified):
|
||||||
``fileName`` live in the SearchVerdicts JSON) is derived from the client code,
|
* the **X-Requested-With: XMLHttpRequest** header on every AJAX call;
|
||||||
not yet confirmed against a live JSON response (the live site rate-limited
|
* a **complete** browser header set (UA + Accept + Accept-Language).
|
||||||
probing during development). ``fetch_supreme_verdict`` therefore validates the
|
|
||||||
response shape and **raises** on anything unexpected (INV-CF2 — no silent
|
A case can have many documents (interim החלטות + the final פסק דין). We pick the
|
||||||
swallow) so the orchestrator can record the failure and fall back, rather than
|
verdict: prefer a record whose Type contains "פסק דין", else the most-paginated /
|
||||||
returning a wrong/empty file. The first live run is the validation pass; see
|
latest one. Politeness (INV-CF4): serial, with a cooldown.
|
||||||
the X13 verification section.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import datetime as _dt
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
from dataclasses import dataclass
|
import re
|
||||||
|
import urllib.parse
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
|
|
||||||
@@ -39,8 +40,6 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
_BASE = "https://supremedecisions.court.gov.il"
|
_BASE = "https://supremedecisions.court.gov.il"
|
||||||
|
|
||||||
# A complete, browser-like header set. Empirically required to pass the F5
|
|
||||||
# WAF (a bare User-Agent gets a TCP reset).
|
|
||||||
_HEADERS = {
|
_HEADERS = {
|
||||||
"User-Agent": (
|
"User-Agent": (
|
||||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
|
||||||
@@ -48,134 +47,151 @@ _HEADERS = {
|
|||||||
),
|
),
|
||||||
"Accept": "application/json, text/plain, */*",
|
"Accept": "application/json, text/plain, */*",
|
||||||
"Accept-Language": "he-IL,he;q=0.9,en;q=0.8",
|
"Accept-Language": "he-IL,he;q=0.9,en;q=0.8",
|
||||||
|
"X-Requested-With": "XMLHttpRequest", # required — F5 WAF blocks AJAX without it
|
||||||
"Referer": _BASE + "/",
|
"Referer": _BASE + "/",
|
||||||
}
|
}
|
||||||
|
|
||||||
# Politeness knobs (INV-CF4). Serial only — never run these concurrently.
|
|
||||||
_REQUEST_TIMEOUT_S = float(os.environ.get("COURT_FETCH_HTTP_TIMEOUT_S", "30"))
|
_REQUEST_TIMEOUT_S = float(os.environ.get("COURT_FETCH_HTTP_TIMEOUT_S", "30"))
|
||||||
_INTER_REQUEST_COOLDOWN_S = float(os.environ.get("COURT_FETCH_COOLDOWN_S", "2"))
|
_INTER_REQUEST_COOLDOWN_S = float(os.environ.get("COURT_FETCH_COOLDOWN_S", "2"))
|
||||||
|
|
||||||
# type=4 → PDF in the portal's Download endpoint (from resultsControler.js).
|
|
||||||
_DOC_TYPE_PDF = "4"
|
_DOC_TYPE_PDF = "4"
|
||||||
|
|
||||||
|
# Empty search clause the portal expects inside the document.
|
||||||
|
_EMPTY_CLAUSE = {
|
||||||
|
"Text": "", "textOperator": 1, "option": 2, "Inverted": False,
|
||||||
|
"Synonym": False, "NearDistance": 3, "MatchOrder": False,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class FetchedVerdict:
|
class FetchedVerdict:
|
||||||
"""A downloaded verdict file held in memory, ready for ingest."""
|
"""A downloaded verdict file held in memory, ready for ingest."""
|
||||||
|
|
||||||
content: bytes
|
def __init__(self, content: bytes, filename: str, source_url: str,
|
||||||
filename: str
|
court: str = "בית המשפט העליון", case_name: str = ""):
|
||||||
source_url: str
|
self.content = content
|
||||||
court: str = "בית המשפט העליון"
|
self.filename = filename
|
||||||
|
self.source_url = source_url
|
||||||
|
self.court = court
|
||||||
|
self.case_name = case_name
|
||||||
|
|
||||||
|
|
||||||
class SupremeFetchError(RuntimeError):
|
class SupremeFetchError(RuntimeError):
|
||||||
"""Raised when the public portal returns an unexpected shape / no document.
|
"""The public portal returned an unexpected shape / no document. Carries a
|
||||||
|
Hebrew reason for the job row (INV-CF2)."""
|
||||||
|
|
||||||
Carries a human-readable Hebrew reason so the orchestrator can persist it
|
|
||||||
on the job row (INV-CF2) and decide on fallback.
|
def _four_digit_year(yy: str) -> str:
|
||||||
|
"""2-digit citation year → 4-digit. Pivot on the current year: a 2-digit
|
||||||
|
value above (this year + 4) is last century. e.g. 05→2005, 87→1987, 16→2016."""
|
||||||
|
yy = re.sub(r"\D", "", yy or "")
|
||||||
|
if len(yy) == 4:
|
||||||
|
return yy
|
||||||
|
if len(yy) != 2:
|
||||||
|
return yy
|
||||||
|
n = int(yy)
|
||||||
|
cutoff = (_dt.date.today().year % 100) + 4
|
||||||
|
return f"20{yy}" if n <= cutoff else f"19{yy}"
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_serial(case_number_norm: str, citation: str) -> tuple[str, str]:
|
||||||
|
"""Extract (CaseNum, YYYY) from a serial citation like 'בג"ץ 3483/05'.
|
||||||
|
|
||||||
|
Works off the normalized number (e.g. '3483-05') with the raw citation as a
|
||||||
|
fallback. Raises SupremeFetchError if it can't find a NNNN/YY pair.
|
||||||
"""
|
"""
|
||||||
|
m = re.search(r"(\d{1,5})[-/](\d{2,4})\b", case_number_norm or "")
|
||||||
|
if not m:
|
||||||
|
m = re.search(r"(\d{1,5})/(\d{2,4})", citation or "")
|
||||||
|
if not m:
|
||||||
|
raise SupremeFetchError(
|
||||||
|
f"לא ניתן לפרק '{citation}' למספר-תיק/שנה (פורמט עליון סדרתי)"
|
||||||
|
)
|
||||||
|
return m.group(1), _four_digit_year(m.group(2))
|
||||||
|
|
||||||
|
|
||||||
async def _get(client: httpx.AsyncClient, path: str, **kwargs) -> httpx.Response:
|
def _dt_key(r: dict) -> int:
|
||||||
await asyncio.sleep(_INTER_REQUEST_COOLDOWN_S)
|
m = re.search(r"/Date\((\d+)", str(r.get("VerdictDt") or ""))
|
||||||
resp = await client.get(f"{_BASE}/{path.lstrip('/')}", **kwargs)
|
return int(m.group(1)) if m else 0
|
||||||
resp.raise_for_status()
|
|
||||||
return resp
|
|
||||||
|
|
||||||
|
|
||||||
async def _post(client: httpx.AsyncClient, path: str, json: dict) -> httpx.Response:
|
def _rank_candidates(records: list[dict]) -> list[dict]:
|
||||||
await asyncio.sleep(_INTER_REQUEST_COOLDOWN_S)
|
"""Order a case's documents by how good a corpus target each is, best first.
|
||||||
resp = await client.post(f"{_BASE}/{path.lstrip('/')}", json=json)
|
|
||||||
resp.raise_for_status()
|
|
||||||
return resp
|
|
||||||
|
|
||||||
|
Preference: the reasoned ruling (Type contains 'פסק') over interim החלטות;
|
||||||
def _extract_doc_ref(results: object) -> tuple[str, str] | None:
|
then more pages (substantive over one-liners); then most recent. We return
|
||||||
"""Pull (path, fileName) of the first verdict document from a results blob.
|
a *ranked list*, not one pick, because the formally-labeled פסק-דין is
|
||||||
|
sometimes a published-report ('s'-prefix) file that the free Download
|
||||||
The SearchVerdicts/GetCasesYearNum responses nest documents under varying
|
endpoint blocks (WAF) — the caller tries each until one downloads as a PDF.
|
||||||
keys across the portal's endpoints. We probe the known shapes defensively
|
Records without a Path/FileName are dropped.
|
||||||
and return the first (path, fileName) pair found; ``None`` if none.
|
|
||||||
"""
|
"""
|
||||||
def walk(node):
|
usable = [r for r in records if r.get("Path") and r.get("FileName")]
|
||||||
if isinstance(node, dict):
|
|
||||||
# A document node carries both a path and a file name.
|
|
||||||
path = node.get("Path") or node.get("path")
|
|
||||||
fname = node.get("FileName") or node.get("fileName") or node.get("Filename")
|
|
||||||
if path and fname:
|
|
||||||
yield (str(path), str(fname))
|
|
||||||
for v in node.values():
|
|
||||||
yield from walk(v)
|
|
||||||
elif isinstance(node, list):
|
|
||||||
for v in node:
|
|
||||||
yield from walk(v)
|
|
||||||
|
|
||||||
for pair in walk(results):
|
def _score(r: dict) -> tuple:
|
||||||
return pair
|
is_verdict = 1 if "פסק" in str(r.get("Type") or "") else 0
|
||||||
return None
|
return (is_verdict, int(r.get("Pages") or 0), _dt_key(r))
|
||||||
|
|
||||||
|
return sorted(usable, key=_score, reverse=True)
|
||||||
|
|
||||||
|
|
||||||
async def fetch_supreme_verdict(
|
async def fetch_supreme_verdict(
|
||||||
*, citation: str, case_number_norm: str
|
*, citation: str, case_number_norm: str
|
||||||
) -> FetchedVerdict:
|
) -> FetchedVerdict:
|
||||||
"""Fetch a Supreme Court verdict PDF by citation. Raises on failure.
|
"""Fetch a Supreme Court verdict PDF by serial citation. Raises on failure."""
|
||||||
|
case_num, yyyy = _parse_serial(case_number_norm, citation)
|
||||||
|
|
||||||
Flow: full-text search for the citation → locate the verdict document's
|
|
||||||
(path, fileName) → download the PDF. Serial + cooled-down throughout.
|
|
||||||
"""
|
|
||||||
async with httpx.AsyncClient(
|
async with httpx.AsyncClient(
|
||||||
http2=True,
|
http2=False, headers=_HEADERS, timeout=_REQUEST_TIMEOUT_S,
|
||||||
headers=_HEADERS,
|
|
||||||
timeout=_REQUEST_TIMEOUT_S,
|
|
||||||
follow_redirects=True,
|
follow_redirects=True,
|
||||||
) as client:
|
) as client:
|
||||||
# 1. Search. The portal's quick-search posts {document, lan}; lan=1=Hebrew.
|
document = {
|
||||||
|
"Year": yyyy, "CaseNum": case_num, "Month": {},
|
||||||
|
"dateType": 1, "publishDate": 8, "SearchText": [dict(_EMPTY_CLAUSE)],
|
||||||
|
"OldMainNumFormat": True,
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
search = await _post(
|
await asyncio.sleep(_INTER_REQUEST_COOLDOWN_S)
|
||||||
client, "Home/SearchVerdicts",
|
resp = await client.post(
|
||||||
json={"document": citation, "lan": 1},
|
f"{_BASE}/Home/SearchVerdicts", json={"document": document, "lan": 1}
|
||||||
)
|
)
|
||||||
results = search.json()
|
resp.raise_for_status()
|
||||||
|
payload = resp.json()
|
||||||
except httpx.HTTPError as e:
|
except httpx.HTTPError as e:
|
||||||
raise SupremeFetchError(
|
raise SupremeFetchError(f"חיפוש בפורטל העליון נכשל עבור {citation}: {e}") from e
|
||||||
f"חיפוש בפורטל העליון נכשל עבור {citation}: {e}"
|
except ValueError as e:
|
||||||
) from e
|
raise SupremeFetchError(f"תשובת-חיפוש לא-JSON מהפורטל עבור {citation}") from e
|
||||||
except ValueError as e: # non-JSON body
|
|
||||||
raise SupremeFetchError(
|
|
||||||
f"תשובת-חיפוש לא-JSON מהפורטל עבור {citation}"
|
|
||||||
) from e
|
|
||||||
|
|
||||||
ref = _extract_doc_ref(results)
|
records = payload.get("data") if isinstance(payload, dict) else None
|
||||||
if not ref:
|
candidates = _rank_candidates(records or [])
|
||||||
|
if not candidates:
|
||||||
raise SupremeFetchError(
|
raise SupremeFetchError(
|
||||||
f"לא נמצא מסמך-פסק עבור {citation} בפורטל העליון "
|
f"לא נמצא מסמך-פסק עבור {citation} בפורטל העליון "
|
||||||
f"(ייתכן שאינו פורסם או שמבנה-התשובה השתנה)."
|
f"(תיק {case_num}/{yyyy[-2:]}; ייתכן שאינו פורסם או טרם דיגיטציה)."
|
||||||
)
|
|
||||||
path, fname = ref
|
|
||||||
|
|
||||||
# 2. Download the PDF.
|
|
||||||
try:
|
|
||||||
dl = await _get(
|
|
||||||
client, "Home/Download",
|
|
||||||
params={"path": path, "fileName": fname, "type": _DOC_TYPE_PDF},
|
|
||||||
)
|
|
||||||
except httpx.HTTPError as e:
|
|
||||||
raise SupremeFetchError(
|
|
||||||
f"הורדת PDF נכשלה עבור {citation} (path={path}): {e}"
|
|
||||||
) from e
|
|
||||||
|
|
||||||
content = dl.content
|
|
||||||
ctype = dl.headers.get("content-type", "")
|
|
||||||
if not content or ("pdf" not in ctype.lower() and not content[:4] == b"%PDF"):
|
|
||||||
raise SupremeFetchError(
|
|
||||||
f"הקובץ שהתקבל עבור {citation} אינו PDF תקין (content-type={ctype})."
|
|
||||||
)
|
)
|
||||||
|
|
||||||
source_url = (
|
# Try documents best-first until one downloads as a real PDF. The
|
||||||
f"{_BASE}/Home/Download?path={path}&fileName={fname}&type={_DOC_TYPE_PDF}"
|
# formally-labeled פסק-דין is sometimes a published-report file the free
|
||||||
)
|
# Download endpoint blocks (WAF) — fall back to the next substantive doc.
|
||||||
safe_name = fname if fname.lower().endswith(".pdf") else f"{case_number_norm}.pdf"
|
last_reason = ""
|
||||||
return FetchedVerdict(
|
for rec in candidates[:6]:
|
||||||
content=content, filename=safe_name, source_url=source_url,
|
path, fname = str(rec["Path"]), str(rec["FileName"])
|
||||||
|
qs = urllib.parse.urlencode(
|
||||||
|
{"path": path, "fileName": fname, "type": _DOC_TYPE_PDF}
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
await asyncio.sleep(_INTER_REQUEST_COOLDOWN_S)
|
||||||
|
dl = await client.get(f"{_BASE}/Home/Download?{qs}")
|
||||||
|
dl.raise_for_status()
|
||||||
|
except httpx.HTTPError as e:
|
||||||
|
last_reason = f"הורדה נכשלה ({e})"
|
||||||
|
continue
|
||||||
|
if dl.content[:4] == b"%PDF":
|
||||||
|
return FetchedVerdict(
|
||||||
|
content=dl.content,
|
||||||
|
filename=f"{case_number_norm}.pdf",
|
||||||
|
source_url=f"{_BASE}/Home/Download?{qs}",
|
||||||
|
case_name=str(rec.get("CaseName") or ""),
|
||||||
|
)
|
||||||
|
last_reason = f"מסמך {fname} חסום/לא-PDF ({len(dl.content)}B)"
|
||||||
|
|
||||||
|
raise SupremeFetchError(
|
||||||
|
f"אף מסמך של {citation} לא ירד כ-PDF ({len(candidates)} מועמדים) — {last_reason}"
|
||||||
)
|
)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -2,18 +2,23 @@
|
|||||||
|
|
||||||
A digest ("כל יום" daily one-pager) is a SECONDARY source that POINTS at a
|
A digest ("כל יום" daily one-pager) is a SECONDARY source that POINTS at a
|
||||||
ruling — it is never cited in a decision (INV-DIG1) and never enters the
|
ruling — it is never cited in a decision (INV-DIG1) and never enters the
|
||||||
precedent/halacha pipeline (INV-DIG2). Ingest is therefore a short, standalone
|
precedent/halacha pipeline (INV-DIG2). Ingest reuses only ATOMIC services
|
||||||
path that reuses only ATOMIC services (extract_text, embeddings), NOT the
|
(extract_text, embeddings), NOT the canonical ``ingest.ingest_document``.
|
||||||
canonical ``ingest.ingest_document`` (which is bound to case_law):
|
|
||||||
|
|
||||||
file → extract_text → content_hash (idempotent) → LLM metadata extract
|
Two intake paths share one enrichment core:
|
||||||
→ create_digest → single embedding (concept+headline+summary+analysis)
|
|
||||||
→ try_autolink(underlying_citation → case_law) [INV-DIG3]
|
- ``ingest_digest`` (local/MCP, e.g. batch script) — does everything
|
||||||
→ extraction_status='completed'
|
synchronously: stage → extract_text → create →
|
||||||
|
LLM enrich → embed → autolink → completed.
|
||||||
|
- ``create_pending_digest`` (CONTAINER-SAFE — the web upload) — stage →
|
||||||
|
extract_text → create row with status='pending'.
|
||||||
|
No LLM, no embedding. ``process_pending_digests``
|
||||||
|
(local/MCP) drains the queue and enriches.
|
||||||
|
|
||||||
claude_session rule: ``digest_metadata_extractor`` (local CLI) is imported
|
claude_session rule: ``digest_metadata_extractor`` (local CLI) is imported
|
||||||
LAZILY inside ``ingest_digest`` only, so this module is import-safe from the
|
LAZILY inside the enrichment core only, so this module stays import-safe from
|
||||||
FastAPI container for the search/list/link/delete paths (DB + voyage only).
|
the FastAPI container for create_pending / search / list / link / delete
|
||||||
|
(DB + voyage only — voyage embedding only runs in the local enrich path).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
@@ -25,7 +30,7 @@ from typing import Awaitable, Callable
|
|||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
from legal_mcp import config
|
from legal_mcp import config
|
||||||
from legal_mcp.services import db, embeddings, extractor, ingest
|
from legal_mcp.services import db, embeddings, extractor, ingest, storage
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -42,13 +47,26 @@ async def _noop_progress(_status: str, _percent: int, _msg: str) -> None:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _embedding_text(fields: dict) -> str:
|
def _coerce_date(v) -> date | None:
|
||||||
|
if v is None or v == "":
|
||||||
|
return None
|
||||||
|
if isinstance(v, date):
|
||||||
|
return v
|
||||||
|
if isinstance(v, str):
|
||||||
|
try:
|
||||||
|
return date.fromisoformat(v[:10])
|
||||||
|
except ValueError:
|
||||||
|
return None
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _embedding_text(row: dict) -> str:
|
||||||
"""The single vector indexes the digest as an atomic discovery unit."""
|
"""The single vector indexes the digest as an atomic discovery unit."""
|
||||||
parts = [
|
parts = [
|
||||||
fields.get("concept_tag", ""),
|
row.get("concept_tag", ""),
|
||||||
fields.get("headline_holding", ""),
|
row.get("headline_holding", ""),
|
||||||
fields.get("summary", ""),
|
row.get("summary", ""),
|
||||||
fields.get("analysis_text", ""),
|
row.get("analysis_text", ""),
|
||||||
]
|
]
|
||||||
return "\n".join(p for p in parts if p).strip()
|
return "\n".join(p for p in parts if p).strip()
|
||||||
|
|
||||||
@@ -65,11 +83,254 @@ async def try_autolink(digest_id: UUID | str, underlying_citation: str) -> str |
|
|||||||
logger.warning("digest try_autolink lookup failed for %r: %s", citation, e)
|
logger.warning("digest try_autolink lookup failed for %r: %s", citation, e)
|
||||||
return None
|
return None
|
||||||
if not match:
|
if not match:
|
||||||
|
# Gap (INV-DIG3): the underlying ruling isn't in the corpus. Surface it —
|
||||||
|
# never drop silently (INV-CF2). Court verdicts (supreme/admin) get an X13
|
||||||
|
# auto-fetch job; ועדת-ערר / unknown — which נט-המשפט can't serve — get a
|
||||||
|
# missing_precedent the chair sees on /missing-precedents (#136). Never
|
||||||
|
# raises.
|
||||||
|
await _handle_unlinked_citation(digest_id, citation)
|
||||||
return None
|
return None
|
||||||
await db.link_digest_to_case_law(digest_id, match["id"])
|
await db.link_digest_to_case_law(digest_id, match["id"])
|
||||||
return str(match["id"])
|
return str(match["id"])
|
||||||
|
|
||||||
|
|
||||||
|
async def _handle_unlinked_citation(digest_id: UUID | str, citation: str) -> None:
|
||||||
|
"""Surface an unlinked digest citation — auto-fetch if possible, else record
|
||||||
|
a missing_precedent. Closes the silent-drop gap (#136, INV-DIG3/CF2).
|
||||||
|
|
||||||
|
Routing via the ONE canonical classifier (``court_citation.classify``):
|
||||||
|
* supreme/admin → ``court_fetch_jobs`` (drained by X13; on fetch failure the
|
||||||
|
orchestrator opens its own missing_precedent, so no double-record here).
|
||||||
|
* skip (ערר/בל"מ) / unknown → ``missing_precedents`` (needs Nevo / manual;
|
||||||
|
נט-המשפט can't serve it). Deduped designator-aware via citation_norm
|
||||||
|
(#143) so re-runs and overlaps don't pile up.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
from legal_mcp.services import court_citation
|
||||||
|
cit = court_citation.classify(citation)
|
||||||
|
if cit.tier in ("supreme", "admin"):
|
||||||
|
await db.court_fetch_job_upsert(
|
||||||
|
case_number_norm=cit.case_number_norm,
|
||||||
|
citation_raw=citation,
|
||||||
|
tier=cit.tier,
|
||||||
|
court=cit.court_prefix,
|
||||||
|
digest_id=UUID(str(digest_id)),
|
||||||
|
)
|
||||||
|
logger.info("digest %s: enqueued court-fetch for %r (tier=%s)",
|
||||||
|
digest_id, citation, cit.tier)
|
||||||
|
return
|
||||||
|
# Non-fetchable (ערר/בל"מ/unknown) — open a missing_precedent gap so it's
|
||||||
|
# visible and actionable instead of vanishing. Dedup first (#143).
|
||||||
|
if await db.find_missing_precedent_by_citation(citation):
|
||||||
|
return
|
||||||
|
digest = await db.get_digest(digest_id)
|
||||||
|
yomon = (digest or {}).get("yomon_number") or ""
|
||||||
|
note = (f"זוהה דרך יומון מס' {yomon} (digest_id={digest_id})" if yomon
|
||||||
|
else f"זוהה דרך יומון (digest_id={digest_id})")
|
||||||
|
await db.create_missing_precedent(
|
||||||
|
citation=citation,
|
||||||
|
discovery_source="digest",
|
||||||
|
notes=note,
|
||||||
|
)
|
||||||
|
logger.info("digest %s: opened missing_precedent for %r (tier=%s)",
|
||||||
|
digest_id, citation, cit.tier)
|
||||||
|
except Exception as e: # never break digest ingest
|
||||||
|
logger.warning("digest unlinked-citation handling failed for %r: %s",
|
||||||
|
citation, e)
|
||||||
|
|
||||||
|
|
||||||
|
# ── Container-safe creation (web upload) — no LLM, no embedding ──────
|
||||||
|
|
||||||
|
async def create_pending_digest(
|
||||||
|
*,
|
||||||
|
file_path: str | Path,
|
||||||
|
yomon_number: str = "",
|
||||||
|
digest_date: date | str | None = None,
|
||||||
|
practice_area: str = "",
|
||||||
|
appeal_subtype: str = "",
|
||||||
|
subject_tags: list[str] | None = None,
|
||||||
|
progress: ProgressCb | None = None,
|
||||||
|
) -> dict:
|
||||||
|
"""Stage the file, extract text (PyMuPDF — container-safe), and create a
|
||||||
|
digest row with extraction_status='pending'. The LLM metadata extraction,
|
||||||
|
embedding, and autolink are deferred to ``process_pending_digests`` (local).
|
||||||
|
|
||||||
|
Returns {status, digest_id, extraction_status} or {status:'exists', ...}.
|
||||||
|
Idempotent on content_hash (INV-G3).
|
||||||
|
"""
|
||||||
|
progress = progress or _noop_progress
|
||||||
|
if practice_area and practice_area not in _VALID_PRACTICE_AREAS:
|
||||||
|
raise ValueError(f"invalid practice_area: {practice_area!r}")
|
||||||
|
src = Path(file_path)
|
||||||
|
if not src.exists():
|
||||||
|
raise ValueError(f"file not found: {file_path}")
|
||||||
|
|
||||||
|
await progress("staging", 10, "מעתיק קובץ")
|
||||||
|
# ``_stage_file`` returns the storage KEY (DATA_DIR-relative path). Resolve a
|
||||||
|
# real local path to read from — on s3-only this downloads to a temp file we
|
||||||
|
# own and remove after extraction (INV-STG1; the key is not guaranteed to be
|
||||||
|
# on local disk).
|
||||||
|
rel_path = await ingest._stage_file(src, DIGEST_LIBRARY_DIR, "incoming")
|
||||||
|
local = await storage.ensure_local(rel_path, bucket=storage.Bucket.DOCUMENTS)
|
||||||
|
local_is_tmp = storage.local_path(rel_path, bucket=storage.Bucket.DOCUMENTS) is None
|
||||||
|
|
||||||
|
await progress("extracting_text", 50, "מחלץ טקסט")
|
||||||
|
try:
|
||||||
|
raw_text, _pc, _off = await extractor.extract_text(str(local))
|
||||||
|
finally:
|
||||||
|
if local_is_tmp:
|
||||||
|
try:
|
||||||
|
local.unlink(missing_ok=True)
|
||||||
|
except OSError as e: # noqa: BLE001 — temp cleanup, never fatal
|
||||||
|
logger.debug("could not remove temp digest file %s: %s", local, e)
|
||||||
|
raw_text = (raw_text or "").strip()
|
||||||
|
if not raw_text:
|
||||||
|
raise ValueError("no text extracted from digest")
|
||||||
|
|
||||||
|
content_hash = db._content_hash(raw_text)
|
||||||
|
existing = await db.get_digest_by_content_hash(content_hash)
|
||||||
|
if existing:
|
||||||
|
await progress("completed", 100, "יומון זהה כבר קיים")
|
||||||
|
return {"status": "exists", "digest_id": existing["id"],
|
||||||
|
"extraction_status": existing.get("extraction_status")}
|
||||||
|
|
||||||
|
record = await db.create_digest(
|
||||||
|
analysis_text=raw_text,
|
||||||
|
yomon_number=yomon_number.strip(),
|
||||||
|
digest_date=_coerce_date(digest_date),
|
||||||
|
practice_area=practice_area,
|
||||||
|
appeal_subtype=appeal_subtype.strip(),
|
||||||
|
subject_tags=list(subject_tags) if subject_tags else [],
|
||||||
|
source_document_path=rel_path,
|
||||||
|
extraction_status="pending",
|
||||||
|
)
|
||||||
|
await progress("queued", 100, "ממתין לעיבוד מקומי (LLM)")
|
||||||
|
return {"status": "pending", "digest_id": record["id"],
|
||||||
|
"extraction_status": "pending"}
|
||||||
|
|
||||||
|
|
||||||
|
# ── Local enrichment core (LLM + embed + autolink) ──────────────────
|
||||||
|
|
||||||
|
async def enrich_digest(digest_id: UUID | str, progress: ProgressCb | None = None) -> dict:
|
||||||
|
"""Run LLM metadata extraction over a digest's analysis_text, fill ONLY
|
||||||
|
empty fields (preserve user-supplied values), embed, autolink, complete.
|
||||||
|
|
||||||
|
**MCP-tool-only path** (uses the local LLM extractor). Idempotent.
|
||||||
|
"""
|
||||||
|
progress = progress or _noop_progress
|
||||||
|
row = await db.get_digest(digest_id)
|
||||||
|
if not row:
|
||||||
|
raise ValueError("digest not found")
|
||||||
|
analysis = (row.get("analysis_text") or "").strip()
|
||||||
|
if not analysis:
|
||||||
|
await db.update_digest(digest_id, extraction_status="failed")
|
||||||
|
return {"status": "no_text", "digest_id": str(digest_id)}
|
||||||
|
|
||||||
|
await db.update_digest(digest_id, extraction_status="processing")
|
||||||
|
await progress("extracting_metadata", 40, "מחלץ מטא-דאטה (LLM)")
|
||||||
|
from legal_mcp.services import digest_metadata_extractor
|
||||||
|
extracted = await digest_metadata_extractor.extract(analysis)
|
||||||
|
|
||||||
|
# Fill only empty fields (preserve user-supplied values from the form).
|
||||||
|
fields: dict = {}
|
||||||
|
for key in ("yomon_number", "concept_tag", "headline_holding", "summary",
|
||||||
|
"underlying_citation", "underlying_court", "underlying_judge",
|
||||||
|
"practice_area", "appeal_subtype"):
|
||||||
|
if not (row.get(key) or "").strip() and extracted.get(key):
|
||||||
|
fields[key] = extracted[key]
|
||||||
|
if row.get("digest_date") is None and extracted.get("digest_date"):
|
||||||
|
fields["digest_date"] = extracted["digest_date"]
|
||||||
|
if row.get("underlying_date") is None and extracted.get("underlying_date"):
|
||||||
|
fields["underlying_date"] = extracted["underlying_date"]
|
||||||
|
if not (row.get("subject_tags") or []) and extracted.get("subject_tags"):
|
||||||
|
fields["subject_tags"] = extracted["subject_tags"]
|
||||||
|
# digest_kind classifies the issue (decision vs announcement). A successful
|
||||||
|
# extraction (any field returned) must end with a non-empty kind — that is the
|
||||||
|
# signal the drain self-heal uses to tell "enriched" from "failed". If the
|
||||||
|
# model omitted it, infer: a ruling citation → decision, else announcement.
|
||||||
|
if extracted and not (row.get("digest_kind") or "").strip():
|
||||||
|
kind = extracted.get("digest_kind")
|
||||||
|
if kind not in ("decision", "announcement", "other"):
|
||||||
|
cite = fields.get("underlying_citation") or row.get("underlying_citation") or ""
|
||||||
|
kind = "decision" if cite.strip() else "announcement"
|
||||||
|
fields["digest_kind"] = kind
|
||||||
|
|
||||||
|
if fields:
|
||||||
|
try:
|
||||||
|
await db.update_digest(digest_id, **fields)
|
||||||
|
except Exception as e:
|
||||||
|
# The same yomon issue can arrive as two different PDFs (re-sent /
|
||||||
|
# forwarded twice → different bytes → content_hash dedup misses it),
|
||||||
|
# but the yomon_number is unique. The extracted number then collides
|
||||||
|
# on uq_digests_yomon_number. This row is a duplicate of an already-
|
||||||
|
# ingested yomon → drop it so it isn't retried forever by the cron.
|
||||||
|
if "uq_digests_yomon_number" in str(e):
|
||||||
|
await db.delete_digest(digest_id)
|
||||||
|
logger.info(
|
||||||
|
"digest %s is a duplicate yomon (%s) — deleted",
|
||||||
|
digest_id, fields.get("yomon_number"),
|
||||||
|
)
|
||||||
|
return {"status": "duplicate", "digest_id": str(digest_id),
|
||||||
|
"yomon_number": fields.get("yomon_number")}
|
||||||
|
raise
|
||||||
|
merged = await db.get_digest(digest_id)
|
||||||
|
|
||||||
|
await progress("embedding", 75, "מחשב embedding")
|
||||||
|
emb_text = _embedding_text(merged)
|
||||||
|
if emb_text:
|
||||||
|
try:
|
||||||
|
vecs = await embeddings.embed_texts([emb_text], input_type="document")
|
||||||
|
if vecs:
|
||||||
|
await db.store_digest_embedding(digest_id, vecs[0])
|
||||||
|
except Exception as e: # surfaced, not swallowed (§6)
|
||||||
|
logger.warning("digest embedding failed for %s: %s", digest_id, e)
|
||||||
|
|
||||||
|
await progress("linking", 90, "מנסה לקשר לפסק המקורי")
|
||||||
|
linked_id = None
|
||||||
|
if not merged.get("linked_case_law_id"):
|
||||||
|
linked_id = await try_autolink(digest_id, merged.get("underlying_citation", ""))
|
||||||
|
|
||||||
|
await db.update_digest(digest_id, extraction_status="completed")
|
||||||
|
await progress("completed", 100, "הושלם")
|
||||||
|
return {
|
||||||
|
"status": "completed",
|
||||||
|
"digest_id": str(digest_id),
|
||||||
|
"yomon_number": merged.get("yomon_number", ""),
|
||||||
|
"underlying_citation": merged.get("underlying_citation", ""),
|
||||||
|
"linked_case_law_id": merged.get("linked_case_law_id") or linked_id,
|
||||||
|
"fields_filled": sorted(fields.keys()),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def process_pending_digests(limit: int = 20) -> dict:
|
||||||
|
"""Drain the digest extraction queue (rows stamped extraction_status='pending'
|
||||||
|
by the web upload). Local/MCP only — runs the LLM enrichment per row.
|
||||||
|
Sequential (avoids LLM rate-limit storms), mirrors process_pending_extractions."""
|
||||||
|
pending = await db.list_pending_digests(limit=limit)
|
||||||
|
if not pending:
|
||||||
|
return {"status": "no_pending", "processed": 0, "results": []}
|
||||||
|
results = []
|
||||||
|
processed = 0
|
||||||
|
for row in pending:
|
||||||
|
did = row["id"]
|
||||||
|
try:
|
||||||
|
res = await enrich_digest(did)
|
||||||
|
processed += 1
|
||||||
|
results.append({"digest_id": str(did), "status": res.get("status"),
|
||||||
|
"linked": bool(res.get("linked_case_law_id"))})
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception("process_pending_digests failed for %s: %s", did, e)
|
||||||
|
try:
|
||||||
|
await db.update_digest(did, extraction_status="failed")
|
||||||
|
except Exception:
|
||||||
|
logger.exception("could not mark digest %s failed", did)
|
||||||
|
results.append({"digest_id": str(did), "status": "failed", "error": str(e)})
|
||||||
|
return {"status": "completed", "processed": processed,
|
||||||
|
"total_pending": len(pending), "results": results}
|
||||||
|
|
||||||
|
|
||||||
|
# ── Full synchronous ingest (local/MCP, e.g. batch script) ──────────
|
||||||
|
|
||||||
async def ingest_digest(
|
async def ingest_digest(
|
||||||
*,
|
*,
|
||||||
file_path: str | Path,
|
file_path: str | Path,
|
||||||
@@ -80,109 +341,25 @@ async def ingest_digest(
|
|||||||
subject_tags: list[str] | None = None,
|
subject_tags: list[str] | None = None,
|
||||||
progress: ProgressCb | None = None,
|
progress: ProgressCb | None = None,
|
||||||
) -> dict:
|
) -> dict:
|
||||||
"""Ingest one digest. **MCP-tool-only** (uses the local LLM extractor).
|
"""Ingest one digest synchronously. **MCP-tool-only** (uses the LLM).
|
||||||
|
|
||||||
User-supplied args win over LLM-extracted values for the same field
|
Creates the row (with any user-supplied values) then enriches in place.
|
||||||
(the chair typed them deliberately); empty args are filled from the LLM.
|
Idempotent on content_hash (INV-G3).
|
||||||
Idempotent on yomon_number / content_hash (INV-G3).
|
|
||||||
"""
|
"""
|
||||||
progress = progress or _noop_progress
|
progress = progress or _noop_progress
|
||||||
if practice_area and practice_area not in _VALID_PRACTICE_AREAS:
|
created = await create_pending_digest(
|
||||||
raise ValueError(f"invalid practice_area: {practice_area!r}")
|
file_path=file_path, yomon_number=yomon_number, digest_date=digest_date,
|
||||||
|
practice_area=practice_area, appeal_subtype=appeal_subtype,
|
||||||
|
subject_tags=subject_tags, progress=progress,
|
||||||
|
)
|
||||||
|
if created.get("status") == "exists":
|
||||||
|
return created
|
||||||
|
digest_id = created["digest_id"]
|
||||||
|
enriched = await enrich_digest(digest_id, progress=progress)
|
||||||
|
return enriched
|
||||||
|
|
||||||
src = Path(file_path)
|
|
||||||
if not src.exists():
|
|
||||||
raise ValueError(f"file not found: {file_path}")
|
|
||||||
|
|
||||||
await progress("staging", 5, "מעתיק קובץ")
|
|
||||||
staged = ingest._stage_file(src, DIGEST_LIBRARY_DIR, "incoming")
|
|
||||||
rel_path = str(staged.relative_to(config.DATA_DIR)) \
|
|
||||||
if str(staged).startswith(str(config.DATA_DIR)) else str(staged)
|
|
||||||
|
|
||||||
await progress("extracting_text", 20, "מחלץ טקסט")
|
|
||||||
raw_text, _page_count, _offsets = await extractor.extract_text(str(staged))
|
|
||||||
raw_text = (raw_text or "").strip()
|
|
||||||
if not raw_text:
|
|
||||||
raise ValueError("no text extracted from digest")
|
|
||||||
|
|
||||||
# Idempotency: identical text already ingested → return existing row.
|
|
||||||
content_hash = db._content_hash(raw_text)
|
|
||||||
existing = await db.get_digest_by_content_hash(content_hash)
|
|
||||||
if existing:
|
|
||||||
await progress("completed", 100, "יומון זהה כבר קיים — לא נוצר כפל")
|
|
||||||
return {
|
|
||||||
"status": "exists",
|
|
||||||
"digest_id": existing["id"],
|
|
||||||
"yomon_number": existing.get("yomon_number", ""),
|
|
||||||
"linked_case_law_id": existing.get("linked_case_law_id"),
|
|
||||||
}
|
|
||||||
|
|
||||||
# LLM metadata extraction (lazy import — keeps this module container-safe).
|
|
||||||
await progress("extracting_metadata", 45, "מחלץ מטא-דאטה (LLM)")
|
|
||||||
from legal_mcp.services import digest_metadata_extractor
|
|
||||||
extracted = await digest_metadata_extractor.extract(raw_text)
|
|
||||||
|
|
||||||
def _coerce_date(v) -> date | None:
|
|
||||||
if v is None or v == "":
|
|
||||||
return None
|
|
||||||
if isinstance(v, date):
|
|
||||||
return v
|
|
||||||
if isinstance(v, str):
|
|
||||||
try:
|
|
||||||
return date.fromisoformat(v[:10])
|
|
||||||
except ValueError:
|
|
||||||
return None
|
|
||||||
return None
|
|
||||||
|
|
||||||
# Merge: explicit user args win; otherwise fall back to LLM extraction.
|
|
||||||
fields = {
|
|
||||||
"analysis_text": raw_text,
|
|
||||||
"yomon_number": yomon_number.strip() or extracted.get("yomon_number", ""),
|
|
||||||
"digest_date": _coerce_date(digest_date) or extracted.get("digest_date"),
|
|
||||||
"concept_tag": extracted.get("concept_tag", ""),
|
|
||||||
"headline_holding": extracted.get("headline_holding", ""),
|
|
||||||
"summary": extracted.get("summary", ""),
|
|
||||||
"underlying_citation": extracted.get("underlying_citation", ""),
|
|
||||||
"underlying_court": extracted.get("underlying_court", ""),
|
|
||||||
"underlying_date": extracted.get("underlying_date"),
|
|
||||||
"underlying_judge": extracted.get("underlying_judge", ""),
|
|
||||||
"practice_area": practice_area or extracted.get("practice_area", ""),
|
|
||||||
"appeal_subtype": appeal_subtype.strip() or extracted.get("appeal_subtype", ""),
|
|
||||||
"subject_tags": list(subject_tags) if subject_tags else extracted.get("subject_tags", []),
|
|
||||||
"source_document_path": rel_path,
|
|
||||||
"extraction_status": "processing",
|
|
||||||
}
|
|
||||||
|
|
||||||
await progress("storing", 70, "שומר רשומה")
|
|
||||||
record = await db.create_digest(**fields)
|
|
||||||
digest_id = record["id"]
|
|
||||||
|
|
||||||
# Single embedding for the whole digest (atomic discovery unit — X12 §6).
|
|
||||||
await progress("embedding", 85, "מחשב embedding")
|
|
||||||
emb_text = _embedding_text(fields)
|
|
||||||
if emb_text:
|
|
||||||
try:
|
|
||||||
vecs = await embeddings.embed_texts([emb_text], input_type="document")
|
|
||||||
if vecs:
|
|
||||||
await db.store_digest_embedding(digest_id, vecs[0])
|
|
||||||
except Exception as e: # surfaced, not swallowed (§6)
|
|
||||||
logger.warning("digest embedding failed for %s: %s", digest_id, e)
|
|
||||||
|
|
||||||
# Bridge to the underlying ruling if it is already in the library (INV-DIG3).
|
|
||||||
await progress("linking", 95, "מנסה לקשר לפסק המקורי")
|
|
||||||
linked_id = await try_autolink(digest_id, fields["underlying_citation"])
|
|
||||||
|
|
||||||
await db.update_digest(digest_id, extraction_status="completed")
|
|
||||||
await progress("completed", 100, "הושלם")
|
|
||||||
return {
|
|
||||||
"status": "completed",
|
|
||||||
"digest_id": digest_id,
|
|
||||||
"yomon_number": fields["yomon_number"],
|
|
||||||
"underlying_citation": fields["underlying_citation"],
|
|
||||||
"linked_case_law_id": linked_id,
|
|
||||||
"fields_extracted": sorted(extracted.keys()),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
# ── Linking (INV-DIG3) ──────────────────────────────────────────────
|
||||||
|
|
||||||
async def link_digest(digest_id: UUID | str, case_law_id: UUID | str) -> dict:
|
async def link_digest(digest_id: UUID | str, case_law_id: UUID | str) -> dict:
|
||||||
"""Manually link a digest to an underlying ruling (INV-DIG3). Idempotent."""
|
"""Manually link a digest to an underlying ruling (INV-DIG3). Idempotent."""
|
||||||
@@ -205,8 +382,7 @@ async def link_digest(digest_id: UUID | str, case_law_id: UUID | str) -> dict:
|
|||||||
|
|
||||||
|
|
||||||
async def relink_digest(digest_id: UUID | str) -> dict:
|
async def relink_digest(digest_id: UUID | str) -> dict:
|
||||||
"""Re-run autolink for a digest whose underlying ruling may now be in the
|
"""Re-run autolink for an unlinked digest. No-op if already linked / no match."""
|
||||||
library. No-op if already linked or no match found."""
|
|
||||||
digest = await db.get_digest(digest_id)
|
digest = await db.get_digest(digest_id)
|
||||||
if not digest:
|
if not digest:
|
||||||
raise ValueError("digest not found")
|
raise ValueError("digest not found")
|
||||||
@@ -222,6 +398,16 @@ async def relink_digest(digest_id: UUID | str) -> dict:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def unlink_digest(digest_id: UUID | str) -> dict:
|
||||||
|
"""Clear a digest's link to the underlying ruling."""
|
||||||
|
updated = await db.link_digest_to_case_law(digest_id, None)
|
||||||
|
if updated is None:
|
||||||
|
raise ValueError("digest not found")
|
||||||
|
return {"unlinked": True, "digest_id": str(digest_id)}
|
||||||
|
|
||||||
|
|
||||||
|
# ── Read / search (container-safe: DB + voyage) ─────────────────────
|
||||||
|
|
||||||
async def search_digests(
|
async def search_digests(
|
||||||
query: str,
|
query: str,
|
||||||
practice_area: str = "",
|
practice_area: str = "",
|
||||||
@@ -251,18 +437,19 @@ async def list_digests(
|
|||||||
concept_tag: str = "",
|
concept_tag: str = "",
|
||||||
linked: bool | None = None,
|
linked: bool | None = None,
|
||||||
search: str = "",
|
search: str = "",
|
||||||
|
publication: str = "",
|
||||||
limit: int = 100,
|
limit: int = 100,
|
||||||
offset: int = 0,
|
offset: int = 0,
|
||||||
) -> list[dict]:
|
) -> list[dict]:
|
||||||
return await db.list_digests(
|
return await db.list_digests(
|
||||||
practice_area=practice_area,
|
practice_area=practice_area, concept_tag=concept_tag, linked=linked,
|
||||||
concept_tag=concept_tag,
|
search=search, publication=publication, limit=limit, offset=offset,
|
||||||
linked=linked,
|
|
||||||
search=search,
|
|
||||||
limit=limit,
|
|
||||||
offset=offset,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def update_digest(digest_id: UUID | str, **fields) -> dict | None:
|
||||||
|
return await db.update_digest(digest_id, **fields)
|
||||||
|
|
||||||
|
|
||||||
async def delete_digest(digest_id: UUID | str) -> bool:
|
async def delete_digest(digest_id: UUID | str) -> bool:
|
||||||
return await db.delete_digest(digest_id)
|
return await db.delete_digest(digest_id)
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ from __future__ import annotations
|
|||||||
import logging
|
import logging
|
||||||
from datetime import date as date_type
|
from datetime import date as date_type
|
||||||
|
|
||||||
|
from legal_mcp import config
|
||||||
from legal_mcp.config import parse_llm_json
|
from legal_mcp.config import parse_llm_json
|
||||||
from legal_mcp.services import claude_session
|
from legal_mcp.services import claude_session
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ _VALID_PRACTICE_AREAS = {"", "rishuy_uvniya", "betterment_levy", "compensation_1
|
|||||||
# below contains '{' / '}' which str.format would treat as placeholders and
|
# below contains '{' / '}' which str.format would treat as placeholders and
|
||||||
# crash (same trap documented in precedent_metadata_extractor).
|
# crash (same trap documented in precedent_metadata_extractor).
|
||||||
DIGEST_EXTRACTION_PROMPT = """אתה מסייע משפטי בכיר. לפניך "יומון" — סיכום עמוד-אחד של משרד עפר טויסטר (עלון "כל יום")
|
DIGEST_EXTRACTION_PROMPT = """אתה מסייע משפטי בכיר. לפניך "יומון" — סיכום עמוד-אחד של משרד עפר טויסטר (עלון "כל יום")
|
||||||
על פסק דין/החלטה אחת בתחום תכנון ובנייה / היטל השבחה / פיצויים (ס' 197). חלץ ממנו מטא-דאטה לקטלוג.
|
על **החלטה/פסק דין** אחד, או על **עדכון/הודעה** (חקיקה, נוהל, הודעת-תכנון, ברכת-שנה) בתחום תכנון ובנייה / היטל השבחה / פיצויים (ס' 197). חלץ ממנו מטא-דאטה לקטלוג.
|
||||||
|
|
||||||
**אל תמציא** — שדה שלא מופיע בטקסט → השאר ריק (מחרוזת ריקה / מערך ריק).
|
**אל תמציא** — שדה שלא מופיע בטקסט → השאר ריק (מחרוזת ריקה / מערך ריק).
|
||||||
|
|
||||||
@@ -40,12 +41,13 @@ DIGEST_EXTRACTION_PROMPT = """אתה מסייע משפטי בכיר. לפניך
|
|||||||
החזר JSON אחד (object — לא array), ללא markdown וללא הסברים:
|
החזר JSON אחד (object — לא array), ללא markdown וללא הסברים:
|
||||||
|
|
||||||
{
|
{
|
||||||
|
"digest_kind": "סווג את הגיליון: 'decision' = סיכום פסק דין/החלטה (יש מראה-מקום בתחתית) · 'announcement' = עדכון/הודעה ללא הכרעה (חקיקה, נוהל, הודעת-תכנון, ברכה) · 'other' = אחר. **חובה למלא תמיד.**",
|
||||||
"yomon_number": "מספר היומון מהכותרת ('יומון מס' 5163' → '5163'). ספרות בלבד. אם אין — ריק.",
|
"yomon_number": "מספר היומון מהכותרת ('יומון מס' 5163' → '5163'). ספרות בלבד. אם אין — ריק.",
|
||||||
"digest_date_iso": "YYYY-MM-DD — תאריך גיליון היומון (בכותרת, למשל '7 ביוני 2026' → '2026-06-07').",
|
"digest_date_iso": "YYYY-MM-DD — תאריך גיליון היומון (בכותרת, למשל '7 ביוני 2026' → '2026-06-07').",
|
||||||
"concept_tag": "תג-המושג שבמרכאות בראש העמוד (למשל 'שיקול הדעת המצומצם', 'Cherry-picking'). ביטוי קצר אחד.",
|
"concept_tag": "תג-המושג/הכותרת בראש העמוד (למשל 'שיקול הדעת המצומצם', 'Cherry-picking', או 'עדכונים לשנה החדשה' בעדכון). ביטוי קצר אחד. **חלץ תמיד — קיים לכל סוג גיליון.**",
|
||||||
"headline_holding": "כותרת-ההלכה המודגשת מתחת לתג — משפט אחד שמסכם מה נקבע (למשל 'ביהמ\\"ש - שיקול דעת הוועדה המחוזית אינו מצומצם לטעות חמורה').",
|
"headline_holding": "הכותרת המודגשת מתחת לתג — משפט אחד שמסכם את עיקר הגיליון (מה נקבע בהחלטה, או נושא העדכון). **חלץ תמיד.**",
|
||||||
"summary": "תקציר ניטרלי 2-3 משפטים בגוף שלישי: מה הייתה השאלה ומה הוכרע. בלי שיפוט.",
|
"summary": "תקציר ניטרלי 2-3 משפטים בגוף שלישי: בהחלטה — מה הייתה השאלה ומה הוכרע; בעדכון — מה תוכן/משמעות העדכון. בלי שיפוט. **חלץ תמיד.**",
|
||||||
"underlying_citation": "מראה-המקום של פסק הדין/ההחלטה המקורי, כפי שמופיע בתחתית היומון, מילה במילה (למשל 'עת\\"מ 46111-12-22 יכין-אפק בע\\"מ נ' הוועדה המחוזית'). זהו השדה הקריטי — חלץ אותו במלואו ובדיוק.",
|
"underlying_citation": "**רק ל-decision** — מראה-המקום של פסק הדין/ההחלטה המקורי, כפי שמופיע בתחתית היומון, מילה במילה (למשל 'עת\\"מ 46111-12-22 יכין-אפק בע\\"מ נ' הוועדה המחוזית'). בעדכון/הודעה — ריק. זהו השדה הקריטי ל-decision — חלץ אותו במלואו ובדיוק.",
|
||||||
"underlying_court": "הערכאה שנתנה את פסק הדין המקורי (למשל 'בית המשפט לעניינים מנהליים מרכז-לוד', 'ועדת הערר מחוז ירושלים').",
|
"underlying_court": "הערכאה שנתנה את פסק הדין המקורי (למשל 'בית המשפט לעניינים מנהליים מרכז-לוד', 'ועדת הערר מחוז ירושלים').",
|
||||||
"underlying_date_iso": "YYYY-MM-DD — תאריך מתן פסק הדין/ההחלטה המקורי (לרוב 'ניתן ביום DD.M.YY' בתחתית). שים לב: זה שונה מתאריך גיליון היומון!",
|
"underlying_date_iso": "YYYY-MM-DD — תאריך מתן פסק הדין/ההחלטה המקורי (לרוב 'ניתן ביום DD.M.YY' בתחתית). שים לב: זה שונה מתאריך גיליון היומון!",
|
||||||
"underlying_judge": "שם השופט/ת או יו\\"ר ההרכב שנתן את פסק הדין המקורי (למשל 'יעל טויסטר ישראלי'). בלי תארים ('עו\\"ד', 'כב' השופט').",
|
"underlying_judge": "שם השופט/ת או יו\\"ר ההרכב שנתן את פסק הדין המקורי (למשל 'יעל טויסטר ישראלי'). בלי תארים ('עו\\"ד', 'כב' השופט').",
|
||||||
@@ -55,11 +57,12 @@ DIGEST_EXTRACTION_PROMPT = """אתה מסייע משפטי בכיר. לפניך
|
|||||||
}
|
}
|
||||||
|
|
||||||
## כללי איכות
|
## כללי איכות
|
||||||
1. **underlying_citation** — השדה החשוב ביותר; הוא הגשר לפסק הדין המקורי. חלץ מההערות/התחתית, מילה במילה.
|
1. **digest_kind** — חובה. אם יש מראה-מקום של פסק דין/החלטה בתחתית → 'decision'. אם זה עדכון/הודעה/נוהל/ברכה ללא הכרעה → 'announcement'.
|
||||||
2. **הבחן בין שני התאריכים**: digest_date_iso = תאריך גיליון היומון (בכותרת); underlying_date_iso = מועד מתן פסק הדין (בתחתית, 'ניתן ביום...'). אל תבלבל.
|
2. **concept_tag / headline_holding / summary** — חלץ **תמיד**, לכל סוג גיליון (גם עדכון). אלה לא ייחודיים להחלטות.
|
||||||
3. **summary** — ניטרלי, גוף שלישי, בלי מילות שיפוט.
|
3. **underlying_citation** — רק ל-decision; הוא הגשר לפסק הדין. בעדכון — השאר ריק (זה תקין, לא חוסר).
|
||||||
4. **subject_tags** — snake_case, תחום ועדת ערר תכנון ובנייה בלבד.
|
4. **הבחן בין שני התאריכים**: digest_date_iso = תאריך גיליון היומון (בכותרת); underlying_date_iso = מועד מתן פסק הדין (בתחתית, 'ניתן ביום...'). אל תבלבל.
|
||||||
5. אם רכיב לא מופיע בבירור — השאר את אותו שדה ריק. אל תנחש.
|
5. **subject_tags** — snake_case, תחום ועדת ערר תכנון ובנייה בלבד.
|
||||||
|
6. אם רכיב לא מופיע בבירור — השאר את אותו שדה ריק. אל תנחש.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@@ -79,13 +82,17 @@ def _norm_date(result: dict, key: str) -> date_type | None:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
async def extract(raw_text: str) -> dict:
|
async def extract(raw_text: str, model: str | None = None) -> dict:
|
||||||
"""Extract digest metadata from raw text. Returns a dict (never raises).
|
"""Extract digest metadata from raw text. Returns a dict (never raises).
|
||||||
|
|
||||||
Keys: yomon_number, digest_date (date|None), concept_tag, headline_holding,
|
Keys: yomon_number, digest_date (date|None), concept_tag, headline_holding,
|
||||||
summary, underlying_citation, underlying_court, underlying_date (date|None),
|
summary, underlying_citation, underlying_court, underlying_date (date|None),
|
||||||
underlying_judge, practice_area, appeal_subtype, subject_tags (list[str]).
|
underlying_judge, practice_area, appeal_subtype, subject_tags (list[str]).
|
||||||
Missing/invalid fields are omitted so the caller's merge keeps user values.
|
Missing/invalid fields are omitted so the caller's merge keeps user values.
|
||||||
|
|
||||||
|
Model: defaults to ``config.DIGEST_EXTRACT_MODEL`` (Sonnet — this is a
|
||||||
|
high-volume, simple extraction; no need for Opus). Override per-call via
|
||||||
|
``model``.
|
||||||
"""
|
"""
|
||||||
text = (raw_text or "").strip()
|
text = (raw_text or "").strip()
|
||||||
if not text:
|
if not text:
|
||||||
@@ -95,6 +102,9 @@ async def extract(raw_text: str) -> dict:
|
|||||||
try:
|
try:
|
||||||
result = await claude_session.query_json(
|
result = await claude_session.query_json(
|
||||||
user_msg, system=DIGEST_EXTRACTION_PROMPT,
|
user_msg, system=DIGEST_EXTRACTION_PROMPT,
|
||||||
|
model=(model or config.DIGEST_EXTRACT_MODEL or None),
|
||||||
|
tools="", # pure text→JSON: disable tools so the model never emits
|
||||||
|
# stop_reason=tool_use and trips --max-turns (error_max_turns).
|
||||||
)
|
)
|
||||||
except Exception as e: # surfaced as warning, not swallowed silently (§6)
|
except Exception as e: # surfaced as warning, not swallowed silently (§6)
|
||||||
logger.warning("digest_metadata_extractor: query failed: %s", e)
|
logger.warning("digest_metadata_extractor: query failed: %s", e)
|
||||||
@@ -117,6 +127,10 @@ async def extract(raw_text: str) -> dict:
|
|||||||
if s:
|
if s:
|
||||||
out[key] = s
|
out[key] = s
|
||||||
|
|
||||||
|
kind = _norm_str(result, "digest_kind").lower()
|
||||||
|
if kind in ("decision", "announcement", "other"):
|
||||||
|
out["digest_kind"] = kind
|
||||||
|
|
||||||
dd = _norm_date(result, "digest_date_iso")
|
dd = _norm_date(result, "digest_date_iso")
|
||||||
if dd is not None:
|
if dd is not None:
|
||||||
out["digest_date"] = dd
|
out["digest_date"] = dd
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import io
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
from datetime import date
|
from datetime import date
|
||||||
@@ -17,7 +18,7 @@ from docx.oxml import OxmlElement
|
|||||||
from docx.oxml.ns import qn
|
from docx.oxml.ns import qn
|
||||||
|
|
||||||
from legal_mcp import config
|
from legal_mcp import config
|
||||||
from legal_mcp.services import db
|
from legal_mcp.services import db, storage
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -474,8 +475,19 @@ async def export_decision(
|
|||||||
pass
|
pass
|
||||||
output_path = str(export_dir / f"{prefix}-v{next_ver}.docx")
|
output_path = str(export_dir / f"{prefix}-v{next_ver}.docx")
|
||||||
|
|
||||||
Path(output_path).parent.mkdir(parents=True, exist_ok=True)
|
# Persist through the storage layer (INV-STG1). Under the filesystem
|
||||||
doc.save(output_path)
|
# backend the bytes land at output_path exactly as before; a caller-
|
||||||
|
# provided path outside DATA_DIR falls back to a direct disk write.
|
||||||
|
buf = io.BytesIO()
|
||||||
|
doc.save(buf)
|
||||||
|
data = buf.getvalue()
|
||||||
|
_docx_ctype = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
||||||
|
try:
|
||||||
|
key = Path(output_path).resolve().relative_to(Path(config.DATA_DIR).resolve()).as_posix()
|
||||||
|
await storage.put_bytes(key, data, bucket=storage.Bucket.DOCUMENTS, content_type=_docx_ctype)
|
||||||
|
except ValueError:
|
||||||
|
Path(output_path).parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
Path(output_path).write_bytes(data) # noqa: STG1 — storage fallback (output_path outside DATA_DIR)
|
||||||
logger.info("DOCX exported (mode=%s): %s", mode, output_path)
|
logger.info("DOCX exported (mode=%s): %s", mode, output_path)
|
||||||
return output_path
|
return output_path
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ from __future__ import annotations
|
|||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
|
from legal_mcp import config
|
||||||
|
from legal_mcp.services import storage
|
||||||
import zipfile
|
import zipfile
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -304,10 +307,17 @@ def retrofit_bookmarks(
|
|||||||
end_idx = len(paragraphs) - 1
|
end_idx = len(paragraphs) - 1
|
||||||
ranges.append((name, start_idx, max(start_idx, end_idx)))
|
ranges.append((name, start_idx, max(start_idx, end_idx)))
|
||||||
|
|
||||||
# Backup if overwriting in place
|
# Backup if overwriting in place — through the storage layer (INV-STG1).
|
||||||
if backup and output_path.resolve() == docx_path.resolve():
|
if backup and output_path.resolve() == docx_path.resolve():
|
||||||
backup_path = docx_path.with_suffix(".pre-retrofit.docx")
|
backup_path = docx_path.with_suffix(".pre-retrofit.docx")
|
||||||
shutil.copy2(str(docx_path), str(backup_path))
|
try:
|
||||||
|
_bkey = backup_path.resolve().relative_to(
|
||||||
|
Path(config.DATA_DIR).resolve()).as_posix()
|
||||||
|
storage.put_file_sync(
|
||||||
|
docx_path, _bkey, bucket=storage.Bucket.DOCUMENTS,
|
||||||
|
content_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document")
|
||||||
|
except ValueError:
|
||||||
|
shutil.copy2(str(docx_path), str(backup_path)) # noqa: STG1 — storage fallback
|
||||||
|
|
||||||
# Inject bookmarks, skipping any that already exist
|
# Inject bookmarks, skipping any that already exist
|
||||||
next_id = _next_bookmark_id(doc_tree)
|
next_id = _next_bookmark_id(doc_tree)
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
|
from legal_mcp import config
|
||||||
|
from legal_mcp.services import storage
|
||||||
import zipfile
|
import zipfile
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
@@ -98,6 +101,22 @@ def _load_docx_xml(docx_path: Path) -> tuple[dict[str, bytes], etree._Element, e
|
|||||||
return members, document_tree, settings_tree
|
return members, document_tree, settings_tree
|
||||||
|
|
||||||
|
|
||||||
|
_DOCX_CTYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
||||||
|
|
||||||
|
|
||||||
|
def _persist_docx_sync(output_path: Path, data: bytes) -> None:
|
||||||
|
"""Persist DOCX bytes through the storage layer (INV-STG1); fall back to a
|
||||||
|
direct disk write when output_path is outside DATA_DIR (caller-provided)."""
|
||||||
|
out = Path(output_path)
|
||||||
|
try:
|
||||||
|
key = out.resolve().relative_to(Path(config.DATA_DIR).resolve()).as_posix()
|
||||||
|
storage.put_bytes_sync(key, data, bucket=storage.Bucket.DOCUMENTS,
|
||||||
|
content_type=_DOCX_CTYPE)
|
||||||
|
except ValueError:
|
||||||
|
out.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
out.write_bytes(data) # noqa: STG1 — storage fallback
|
||||||
|
|
||||||
|
|
||||||
def _save_docx_xml(
|
def _save_docx_xml(
|
||||||
members: dict[str, bytes],
|
members: dict[str, bytes],
|
||||||
document_tree: etree._Element,
|
document_tree: etree._Element,
|
||||||
@@ -113,12 +132,11 @@ def _save_docx_xml(
|
|||||||
settings_tree, xml_declaration=True, encoding="UTF-8", standalone=True
|
settings_tree, xml_declaration=True, encoding="UTF-8", standalone=True
|
||||||
)
|
)
|
||||||
|
|
||||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
buffer = BytesIO()
|
buffer = BytesIO()
|
||||||
with zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED) as zf:
|
with zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED) as zf:
|
||||||
for name, data in members.items():
|
for name, data in members.items():
|
||||||
zf.writestr(name, data)
|
zf.writestr(name, data)
|
||||||
output_path.write_bytes(buffer.getvalue())
|
_persist_docx_sync(output_path, buffer.getvalue())
|
||||||
|
|
||||||
|
|
||||||
def _ensure_track_revisions(settings_tree: etree._Element) -> None:
|
def _ensure_track_revisions(settings_tree: etree._Element) -> None:
|
||||||
@@ -511,4 +529,11 @@ def copy_with_revisions(
|
|||||||
source_path: str | Path, output_path: str | Path,
|
source_path: str | Path, output_path: str | Path,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Copy source → output unchanged (used when revisions list is empty)."""
|
"""Copy source → output unchanged (used when revisions list is empty)."""
|
||||||
shutil.copy2(str(source_path), str(output_path))
|
out = Path(output_path)
|
||||||
|
try:
|
||||||
|
key = out.resolve().relative_to(Path(config.DATA_DIR).resolve()).as_posix()
|
||||||
|
storage.put_file_sync(source_path, key, bucket=storage.Bucket.DOCUMENTS,
|
||||||
|
content_type=_DOCX_CTYPE)
|
||||||
|
except ValueError:
|
||||||
|
out.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
shutil.copy2(str(source_path), str(out)) # noqa: STG1 — storage fallback
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ from docx import Document as DocxDocument
|
|||||||
from striprtf.striprtf import rtf_to_text
|
from striprtf.striprtf import rtf_to_text
|
||||||
|
|
||||||
from legal_mcp import config
|
from legal_mcp import config
|
||||||
|
from legal_mcp.services import storage
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from google.cloud import vision
|
from google.cloud import vision
|
||||||
@@ -345,7 +346,19 @@ def render_pages_for_multimodal(
|
|||||||
max(1, int(img.height * ratio)),
|
max(1, int(img.height * ratio)),
|
||||||
)
|
)
|
||||||
thumb = img.resize(thumb_size, Image.Resampling.LANCZOS)
|
thumb = img.resize(thumb_size, Image.Resampling.LANCZOS)
|
||||||
thumb.save(thumb_path, "JPEG", quality=75, optimize=True)
|
# 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:
|
||||||
|
_tkey = thumb_path.resolve().relative_to(
|
||||||
|
Path(config.DATA_DIR).resolve()).as_posix()
|
||||||
|
storage.put_bytes_sync(
|
||||||
|
_tkey, _tbuf.getvalue(), bucket=storage.Bucket.DERIVED,
|
||||||
|
content_type="image/jpeg")
|
||||||
|
except ValueError:
|
||||||
|
thumb.save(thumb_path, "JPEG", quality=75, optimize=True)
|
||||||
|
|
||||||
out.append((img, thumb_path))
|
out.append((img, thumb_path))
|
||||||
finally:
|
finally:
|
||||||
|
|||||||
106
mcp-server/src/legal_mcp/services/gemini_session.py
Normal file
106
mcp-server/src/legal_mcp/services/gemini_session.py
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
"""Gemini structured-output helper — a drop-in for ``claude_session.query_json``
|
||||||
|
for BOUNDED extraction tasks (text → JSON).
|
||||||
|
|
||||||
|
Why a second LLM path: metadata extraction is a single structured call (fill
|
||||||
|
case_name/summary/headnote/tags from a verdict's text), not an agentic loop. The
|
||||||
|
``claude -p`` CLI behind ``claude_session`` is agentic — it reaches for tools and
|
||||||
|
hits ``error_max_turns`` on a task that should be one shot — so it was slow and
|
||||||
|
flaky for the precedent metadata queue. Gemini Flash with JSON mode
|
||||||
|
(``responseMimeType: application/json``) is the right tool: one call, schema-
|
||||||
|
clean JSON, fast, and ~$0.10/1M tokens (negligible for this volume).
|
||||||
|
|
||||||
|
Scope: **bounded extraction only** (precedent metadata). The agentic, voice-
|
||||||
|
sensitive work — decision writing, analysis, halacha extraction — stays on
|
||||||
|
``claude_session`` (Daphna's subscription, zero API cost). This is a deliberate
|
||||||
|
per-task provider choice, not a wholesale move off Claude.
|
||||||
|
|
||||||
|
Key: ``GOOGLE_GEMINI_API_KEY`` (the canonical host ~/.env / Infisical name, SoT
|
||||||
|
nautilus:/external-apis/gemini); ``GEMINI_API_KEY`` is also accepted as an alias.
|
||||||
|
Model: ``GEMINI_MODEL`` (default gemini-2.5-flash).
|
||||||
|
Direct REST via httpx — no extra SDK dependency.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
_BASE = "https://generativelanguage.googleapis.com/v1beta"
|
||||||
|
_DEFAULT_MODEL = os.environ.get("GEMINI_MODEL", "gemini-2.5-flash")
|
||||||
|
_DEFAULT_TIMEOUT = float(os.environ.get("GEMINI_TIMEOUT_S", "120"))
|
||||||
|
|
||||||
|
|
||||||
|
class GeminiError(RuntimeError):
|
||||||
|
"""Gemini API call failed or returned an unexpected shape."""
|
||||||
|
|
||||||
|
|
||||||
|
def _api_key() -> str:
|
||||||
|
# Accept BOTH names: the canonical Infisical / host-~/.env secret is
|
||||||
|
# ``GOOGLE_GEMINI_API_KEY`` (SoT nautilus:/external-apis/gemini), while older
|
||||||
|
# call sites / container envs may export ``GEMINI_API_KEY``. Reading only the
|
||||||
|
# latter silently broke ALL host metadata extraction (the key is present but
|
||||||
|
# under the canonical name). Prefer GEMINI_API_KEY if set, else the SoT name.
|
||||||
|
key = (
|
||||||
|
os.environ.get("GEMINI_API_KEY", "").strip()
|
||||||
|
or os.environ.get("GOOGLE_GEMINI_API_KEY", "").strip()
|
||||||
|
)
|
||||||
|
if not key:
|
||||||
|
raise GeminiError(
|
||||||
|
"GEMINI_API_KEY/GOOGLE_GEMINI_API_KEY אינו מוגדר (host ~/.env / "
|
||||||
|
"Infisical nautilus:/external-apis/gemini)."
|
||||||
|
)
|
||||||
|
return key
|
||||||
|
|
||||||
|
|
||||||
|
async def query_json(
|
||||||
|
prompt: str,
|
||||||
|
timeout: float | int = _DEFAULT_TIMEOUT,
|
||||||
|
*,
|
||||||
|
system: str | None = None,
|
||||||
|
model: str | None = None,
|
||||||
|
# Accepted for drop-in parity with claude_session.query_json; ignored here.
|
||||||
|
effort: str | None = None,
|
||||||
|
tools: str | None = None,
|
||||||
|
) -> dict | list | None:
|
||||||
|
"""Single structured-output call → parsed JSON. Drop-in for
|
||||||
|
``claude_session.query_json``. Raises ``GeminiError`` on failure (the caller
|
||||||
|
treats that like any extraction failure — recorded, never silently wrong).
|
||||||
|
"""
|
||||||
|
model = model or _DEFAULT_MODEL
|
||||||
|
body: dict = {
|
||||||
|
"contents": [{"role": "user", "parts": [{"text": prompt}]}],
|
||||||
|
"generationConfig": {
|
||||||
|
"responseMimeType": "application/json",
|
||||||
|
"temperature": 0,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if system:
|
||||||
|
body["system_instruction"] = {"parts": [{"text": system}]}
|
||||||
|
|
||||||
|
url = f"{_BASE}/models/{model}:generateContent"
|
||||||
|
try:
|
||||||
|
async with httpx.AsyncClient(timeout=float(timeout)) as client:
|
||||||
|
resp = await client.post(url, params={"key": _api_key()}, json=body)
|
||||||
|
except httpx.HTTPError as e:
|
||||||
|
raise GeminiError(f"Gemini request failed: {e}") from e
|
||||||
|
if resp.status_code != 200:
|
||||||
|
raise GeminiError(f"Gemini HTTP {resp.status_code}: {resp.text[:200]}")
|
||||||
|
|
||||||
|
data = resp.json()
|
||||||
|
# Surface an explicit safety/finish block rather than returning empty.
|
||||||
|
cand = (data.get("candidates") or [{}])[0]
|
||||||
|
if cand.get("finishReason") in ("SAFETY", "RECITATION", "PROHIBITED_CONTENT"):
|
||||||
|
raise GeminiError(f"Gemini blocked output: finishReason={cand['finishReason']}")
|
||||||
|
try:
|
||||||
|
text = cand["content"]["parts"][0]["text"]
|
||||||
|
except (KeyError, IndexError, TypeError) as e:
|
||||||
|
raise GeminiError(f"Gemini unexpected response: {str(data)[:200]}") from e
|
||||||
|
try:
|
||||||
|
return json.loads(text)
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
raise GeminiError(f"Gemini returned non-JSON: {text[:200]}") from e
|
||||||
@@ -6,8 +6,10 @@ structured list of halachot, validates each one against the source text,
|
|||||||
embeds the rule statement, and stores everything as ``pending_review`` in
|
embeds the rule statement, and stores everything as ``pending_review`` in
|
||||||
the ``halachot`` table.
|
the ``halachot`` table.
|
||||||
|
|
||||||
All extraction is idempotent — calling ``extract(case_law_id)`` twice
|
All extraction is idempotent — calling ``extract(case_law_id, force=True)``
|
||||||
deletes prior rows for that precedent first.
|
twice drops the precedent's un-reviewed rows and re-extracts. Chair-approved /
|
||||||
|
published halachot are PRESERVED across a re-extract (INV-G10); see
|
||||||
|
``db.reset_halacha_extraction``.
|
||||||
|
|
||||||
Trust model:
|
Trust model:
|
||||||
Per chair decision, NO halacha is auto-published. Every extracted
|
Per chair decision, NO halacha is auto-published. Every extracted
|
||||||
@@ -24,10 +26,12 @@ import logging
|
|||||||
import re
|
import re
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
|
import asyncpg
|
||||||
|
|
||||||
from legal_mcp import config
|
from legal_mcp import config
|
||||||
from legal_mcp.config import parse_llm_json
|
from legal_mcp.config import parse_llm_json
|
||||||
from legal_mcp.services import (
|
from legal_mcp.services import (
|
||||||
claude_session, db, embeddings, halacha_quality, proofreader,
|
claude_session, db, embeddings, halacha_quality, panel_extraction, proofreader,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -48,6 +52,34 @@ CHUNK_CONCURRENCY = config.HALACHA_CHUNK_CONCURRENCY
|
|||||||
# 4-5 overlapping driver processes × CHUNK_CONCURRENCY each → 12-16 concurrent
|
# 4-5 overlapping driver processes × CHUNK_CONCURRENCY each → 12-16 concurrent
|
||||||
# xhigh `claude -p` procs → load 69 → hard reboot.
|
# xhigh `claude -p` procs → load 69 → hard reboot.
|
||||||
_HALACHA_EXTRACT_LOCK_KEY = 0x48414C41 # 'HALA'
|
_HALACHA_EXTRACT_LOCK_KEY = 0x48414C41 # 'HALA'
|
||||||
|
|
||||||
|
# The advisory lock is a SESSION lock held on a dedicated ``lock_conn`` that
|
||||||
|
# sits idle while extraction work runs on OTHER pool connections. A hard crash
|
||||||
|
# ("RuntimeError: Event loop is closed", OOM-kill, container restart) skips the
|
||||||
|
# ``finally`` that unlocks AND skips ``pool.release`` — so the backend stays
|
||||||
|
# alive, idle, holding the lock, and EVERY future extraction gets ``busy``
|
||||||
|
# forever (#142: a leaked lock froze all halacha extraction ~4.5 min on
|
||||||
|
# 2026-06-14 until a manual ``pg_terminate_backend``). Two mechanisms make the
|
||||||
|
# lock self-recovering:
|
||||||
|
# 1. KEEPALIVE — a background task touches ``lock_conn`` every
|
||||||
|
# ``_LOCK_KEEPALIVE_INTERVAL`` s, keeping ``pg_stat_activity.state_change``
|
||||||
|
# fresh. A *live* extraction's lock-holder is therefore never stale; a
|
||||||
|
# crashed one's keepalive dies with the loop, so ``state_change`` freezes.
|
||||||
|
# 2. SELF-HEAL ON ACQUIRE — when ``pg_try_advisory_lock`` fails, we inspect
|
||||||
|
# the current holder; if it is idle AND its ``state_change`` is older than
|
||||||
|
# ``_LOCK_STALE_AFTER`` (≫ keepalive interval) it is a leaked orphan, so we
|
||||||
|
# ``pg_terminate_backend`` it (its session locks release on exit) and retry.
|
||||||
|
# This is why a session lock + keepalive is preferred over ``pg_advisory_xact_lock``
|
||||||
|
# (option ג): an xact lock would force a multi-minute open transaction
|
||||||
|
# (idle-in-transaction bloat) and STILL wouldn't release a live-but-orphaned
|
||||||
|
# connection promptly. ``_LOCK_STALE_AFTER`` is large enough that an in-flight
|
||||||
|
# extraction is never mistaken for an orphan — the box-freeze the lock prevents
|
||||||
|
# must never be re-introduced by killing a live holder.
|
||||||
|
_LOCK_KEEPALIVE_INTERVAL = 30 # seconds between lock-conn keepalive touches
|
||||||
|
_LOCK_STALE_AFTER = 150 # seconds idle ⇒ leaked orphan (5× keepalive)
|
||||||
|
_LOCK_RECLAIM_RETRIES = 10 # poll attempts to re-acquire after terminate
|
||||||
|
_LOCK_RECLAIM_DELAY = 0.2 # seconds between reclaim polls
|
||||||
|
|
||||||
CHUNK_RETRY_ATTEMPTS = 1
|
CHUNK_RETRY_ATTEMPTS = 1
|
||||||
|
|
||||||
# If at least this fraction of chunks crash and the precedent yields zero
|
# If at least this fraction of chunks crash and the precedent yields zero
|
||||||
@@ -62,6 +94,15 @@ EXTRACTION_FAILURE_THRESHOLD = 0.5
|
|||||||
# never contain holdings, only positions, so we skip them.
|
# never contain holdings, only positions, so we skip them.
|
||||||
EXTRACTABLE_SECTIONS = ("legal_analysis", "ruling", "conclusion")
|
EXTRACTABLE_SECTIONS = ("legal_analysis", "ruling", "conclusion")
|
||||||
|
|
||||||
|
# Sections confidently classified as NON-reasoning (parties' positions, the
|
||||||
|
# factual background, the opening). The fallback path — taken when the chunker
|
||||||
|
# labeled nothing as an extractable section (non-standard headings → 'other') —
|
||||||
|
# excludes these so facts/arguments are NEVER fed into extraction, while
|
||||||
|
# reasoning that merely landed under 'other' is still reached. Raises precision
|
||||||
|
# on the dominant Facts↔Reasoning confusion class (#81.6; INV-LRN2
|
||||||
|
# quality-at-source; LegalSeg / rhetorical-role labeling).
|
||||||
|
NON_REASONING_SECTIONS = ("facts", "appellant_claims", "respondent_claims", "parties_claims", "intro")
|
||||||
|
|
||||||
|
|
||||||
# Two prompts — choose by source's is_binding flag.
|
# Two prompts — choose by source's is_binding flag.
|
||||||
#
|
#
|
||||||
@@ -76,8 +117,12 @@ EXTRACTABLE_SECTIONS = ("legal_analysis", "ruling", "conclusion")
|
|||||||
# wants to be able to cite "another committee reached the same conclusion"
|
# wants to be able to cite "another committee reached the same conclusion"
|
||||||
# even though it is not binding.
|
# even though it is not binding.
|
||||||
#
|
#
|
||||||
# The schema's rule_type field accepts six values:
|
# The prompt branches on is_binding only to choose the EXTRACTION STRATEGY
|
||||||
# binding | interpretive | procedural | obiter | application | persuasive
|
# (what to pull, how to phrase) — NOT the rule_type. rule_type is the rule
|
||||||
|
# ROLE and uses the SAME five values for both sources (INV-DM7):
|
||||||
|
# holding | interpretive | procedural | application | obiter
|
||||||
|
# The authority axis (binding/persuasive) is derived from the source, never
|
||||||
|
# a rule_type value — so the model never classifies it.
|
||||||
|
|
||||||
HALACHA_EXTRACTION_PROMPT_BINDING = """אתה משפטן בכיר המתמחה בדיני תכנון ובניה (ועדות ערר, היטל השבחה, פיצויים לפי סעיף 197 לחוק התכנון והבניה). תפקידך: לחלץ הלכות מחייבות מתוך פסק דין/החלטה משפטית של ערכאה עליונה (עליון / מנהלי).
|
HALACHA_EXTRACTION_PROMPT_BINDING = """אתה משפטן בכיר המתמחה בדיני תכנון ובניה (ועדות ערר, היטל השבחה, פיצויים לפי סעיף 197 לחוק התכנון והבניה). תפקידך: לחלץ הלכות מחייבות מתוך פסק דין/החלטה משפטית של ערכאה עליונה (עליון / מנהלי).
|
||||||
|
|
||||||
@@ -101,10 +146,12 @@ HALACHA_EXTRACTION_PROMPT_BINDING = """אתה משפטן בכיר המתמחה
|
|||||||
|
|
||||||
הלכה אחת יכולה לחול על כמה תחומים — practice_areas הוא array ולא string יחיד.
|
הלכה אחת יכולה לחול על כמה תחומים — practice_areas הוא array ולא string יחיד.
|
||||||
|
|
||||||
## סוגי הלכה (rule_type)
|
## סוג הכלל (rule_type) — מהות הכלל בלבד, לא סמכות-המקור
|
||||||
- binding — הלכה מחייבת שהוחלה על התיק.
|
**אל תסווג "מחייב/משכנע"** — דרגת-המחייבות נגזרת אוטומטית מזהות הערכאה. כאן בחר רק את **סוג הכלל**:
|
||||||
- interpretive — פרשנות סעיף חוק/תכנית שאומצה.
|
- holding — עיקרון מהותי שהיה הכרחי להכרעה (ה-ratio; מבחן Wambaugh: שלילתו הייתה משנה את התוצאה).
|
||||||
- procedural — כלל פרוצדורלי (סמכות, מועדים, הליכי שמיעה).
|
- interpretive — פרשנות הוראת-חוק/מונח/תכנית שאומצה.
|
||||||
|
- procedural — כלל סדר-דין (סמכות, מועדים, זכות-עמידה, מיצוי הליכים, נטל).
|
||||||
|
- application — החלת כלל על עובדות התיק (תלוי-עובדות; לרוב לא-הלכה בת-הכללה).
|
||||||
- obiter — אמרת אגב חשובה (חלץ רק אם משמעותית; סמן confidence נמוך).
|
- obiter — אמרת אגב חשובה (חלץ רק אם משמעותית; סמן confidence נמוך).
|
||||||
|
|
||||||
## פלט נדרש
|
## פלט נדרש
|
||||||
@@ -112,7 +159,7 @@ HALACHA_EXTRACTION_PROMPT_BINDING = """אתה משפטן בכיר המתמחה
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"rule_statement": "ניסוח הכלל בלשון משפטית מדויקת בגוף שלישי, 1-3 משפטים.",
|
"rule_statement": "ניסוח הכלל בלשון משפטית מדויקת בגוף שלישי, 1-3 משפטים.",
|
||||||
"rule_type": "binding",
|
"rule_type": "holding",
|
||||||
"reasoning_summary": "תמצית ההיגיון: למה בית המשפט הגיע לכלל הזה (1-2 משפטים).",
|
"reasoning_summary": "תמצית ההיגיון: למה בית המשפט הגיע לכלל הזה (1-2 משפטים).",
|
||||||
"supporting_quote": "ציטוט מילולי מדויק מהפסק התומך בכלל. חייב להופיע מילה במילה בטקסט הקלט.",
|
"supporting_quote": "ציטוט מילולי מדויק מהפסק התומך בכלל. חייב להופיע מילה במילה בטקסט הקלט.",
|
||||||
"page_reference": "פס' 12 / עמ' 8 — ככל שניתן לזהות מהקלט.",
|
"page_reference": "פס' 12 / עמ' 8 — ככל שניתן לזהות מהקלט.",
|
||||||
@@ -139,11 +186,11 @@ HALACHA_EXTRACTION_PROMPT_PERSUASIVE = """אתה משפטן בכיר המתמח
|
|||||||
|
|
||||||
המקור הזה **אינו** מקור להלכות מחייבות חדשות (binding rules). הלכות מחייבות מגיעות מהעליון/מנהלי. עם זאת, יש כאן ערך משמעותי שצריך לחלץ — איך הפנל הזה ניתח ויישם את הדין הקיים. כשנכתוב החלטה עתידית, נצטט מהמקור הזה כ"גם ועדת הערר ב-X הגיעה למסקנה דומה" — לא כסמכות מחייבת, אלא כתמיכה משכנעת.
|
המקור הזה **אינו** מקור להלכות מחייבות חדשות (binding rules). הלכות מחייבות מגיעות מהעליון/מנהלי. עם זאת, יש כאן ערך משמעותי שצריך לחלץ — איך הפנל הזה ניתח ויישם את הדין הקיים. כשנכתוב החלטה עתידית, נצטט מהמקור הזה כ"גם ועדת הערר ב-X הגיעה למסקנה דומה" — לא כסמכות מחייבת, אלא כתמיכה משכנעת.
|
||||||
|
|
||||||
**יש לחלץ:**
|
**יש לחלץ** (סווג לפי **סוג הכלל** בלבד — אל תסווג "מחייב/משכנע", דרגת-המחייבות נגזרת אוטומטית):
|
||||||
- **יישום של הלכה ידועה** (rule_type=`application`) — הפנל החיל הלכה ידועה (של עליון/מנהלי) על עובדות הנידונות. תצטט את ניסוח הכלל **כפי שהוצג כאן** (לא בהכרח כפי שנקבע במקור) ואת התוצאה.
|
- **יישום של הלכה ידועה** (rule_type=`application`) — הפנל החיל הלכה ידועה (של עליון/מנהלי) על עובדות הנידונות. תצטט את ניסוח הכלל **כפי שהוצג כאן** (לא בהכרח כפי שנקבע במקור) ואת התוצאה.
|
||||||
- **עקרון פרשני שאומץ** (rule_type=`interpretive`) — איך הפנל פירש סעיף חוק / תכנית, באופן שניתן לאמץ.
|
- **עקרון פרשני שאומץ** (rule_type=`interpretive`) — איך הפנל פירש סעיף חוק / תכנית, באופן שניתן לאמץ.
|
||||||
- **כלל פרוצדורלי** (rule_type=`procedural`) — קביעות בנושאי סמכות, מועדים, הליך.
|
- **כלל פרוצדורלי** (rule_type=`procedural`) — קביעות בנושאי סמכות, מועדים, הליך.
|
||||||
- **מסקנה מנומקת ומשכנעת** (rule_type=`persuasive`) — מסקנה שלמה של הפנל בסוגיה, עם ההיגיון התומך, ניתנת לציטוט כאסמכתא משכנעת.
|
- **מסקנה מהותית מנומקת** (rule_type=`holding`) — מסקנה עקרונית שלמה של הפנל בסוגיה, עם ההיגיון התומך, בת-הכללה ובת-הסתמכות.
|
||||||
|
|
||||||
**אין לחלץ:**
|
**אין לחלץ:**
|
||||||
- ממצאים עובדתיים ספציפיים לתיק או יישום על נסיבות התיק ("העורר לא הוכיח X", "במקרה דנן", שמות צדדים, סכומים קונקרטיים) — חלץ את העיקרון/היישום בניסוח בר-הכללה בלבד.
|
- ממצאים עובדתיים ספציפיים לתיק או יישום על נסיבות התיק ("העורר לא הוכיח X", "במקרה דנן", שמות צדדים, סכומים קונקרטיים) — חלץ את העיקרון/היישום בניסוח בר-הכללה בלבד.
|
||||||
@@ -175,7 +222,7 @@ HALACHA_EXTRACTION_PROMPT_PERSUASIVE = """אתה משפטן בכיר המתמח
|
|||||||
## כללי איכות
|
## כללי איכות
|
||||||
1. **נאמנות מוחלטת לציטוט** — supporting_quote חייב להיות הדבקה מדויקת מהקלט. אם אין ציטוט מתאים — אל תוסיף את ההלכה.
|
1. **נאמנות מוחלטת לציטוט** — supporting_quote חייב להיות הדבקה מדויקת מהקלט. אם אין ציטוט מתאים — אל תוסיף את ההלכה.
|
||||||
2. **מספר הלכות** — החלטה ארוכה של ועדת ערר יכולה להניב 2-8 פריטים (יישומים + מסקנות). אל תמתח את הרשימה. אם אין מה לחלץ — החזר [].
|
2. **מספר הלכות** — החלטה ארוכה של ועדת ערר יכולה להניב 2-8 פריטים (יישומים + מסקנות). אל תמתח את הרשימה. אם אין מה לחלץ — החזר [].
|
||||||
3. **rule_type מדויק** — application = יישום הלכה ידועה. interpretive = פרשנות. procedural = פרוצדורה. persuasive = מסקנה כללית בעלת ערך כאסמכתא.
|
3. **rule_type מדויק (סוג הכלל בלבד)** — application = יישום הלכה ידועה. interpretive = פרשנות. procedural = פרוצדורה. holding = מסקנה מהותית עקרונית. **לא** binding/persuasive (סמכות נגזרת אוטומטית).
|
||||||
4. **לא לפצל יתר על המידה — קריטי** — כל פריט = שאלה משפטית מובחנת אחת. פנים שונים של אותה שאלה = פריט אחד (בחר את הניסוח הכללי ביותר). אל תחזיר את אותו עיקרון בכמה ניסוחים.
|
4. **לא לפצל יתר על המידה — קריטי** — כל פריט = שאלה משפטית מובחנת אחת. פנים שונים של אותה שאלה = פריט אחד (בחר את הניסוח הכללי ביותר). אל תחזיר את אותו עיקרון בכמה ניסוחים.
|
||||||
5. **שפה** — עברית משפטית מקצועית, גוף שלישי.
|
5. **שפה** — עברית משפטית מקצועית, גוף שלישי.
|
||||||
6. **subject_tags** — 2-5 תגיות בעברית, snake_case.
|
6. **subject_tags** — 2-5 תגיות בעברית, snake_case.
|
||||||
@@ -184,10 +231,15 @@ HALACHA_EXTRACTION_PROMPT_PERSUASIVE = """אתה משפטן בכיר המתמח
|
|||||||
|
|
||||||
|
|
||||||
_VALID_PRACTICE_AREAS = {"rishuy_uvniya", "betterment_levy", "compensation_197"}
|
_VALID_PRACTICE_AREAS = {"rishuy_uvniya", "betterment_levy", "compensation_197"}
|
||||||
|
# rule_type holds the rule ROLE only — what KIND of statement it is (INV-DM7).
|
||||||
|
# The authority axis (binding/persuasive) is DERIVED from the source, never a
|
||||||
|
# rule_type value: see halacha_quality.derive_authority.
|
||||||
_VALID_RULE_TYPES = {
|
_VALID_RULE_TYPES = {
|
||||||
"binding", "interpretive", "procedural", "obiter",
|
"holding", "interpretive", "procedural", "application", "obiter",
|
||||||
"application", "persuasive",
|
|
||||||
}
|
}
|
||||||
|
# Legacy authority-as-role values → fold to the nearest genuine role. Kept so
|
||||||
|
# old LLM outputs (and pre-split rows re-fed) coerce safely.
|
||||||
|
_LEGACY_RULE_TYPE_FOLD = {"binding": "holding", "persuasive": "interpretive"}
|
||||||
|
|
||||||
|
|
||||||
def _normalize_for_comparison(text: str) -> str:
|
def _normalize_for_comparison(text: str) -> str:
|
||||||
@@ -227,13 +279,14 @@ def _verify_quote(supporting_quote: str, full_text: str) -> bool:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def _coerce_halacha(raw: dict, is_binding: bool = True) -> dict | None:
|
def _coerce_halacha(raw: dict) -> dict | None:
|
||||||
"""Validate and normalize one LLM-returned halacha dict.
|
"""Validate and normalize one LLM-returned halacha dict.
|
||||||
|
|
||||||
Returns ``None`` if the entry is missing required fields. ``is_binding``
|
Returns ``None`` if the entry is missing required fields. ``rule_type`` is
|
||||||
only affects the default rule_type when the LLM returned an unknown
|
the rule ROLE only (INV-DM7) — it is NEVER defaulted from the source's
|
||||||
value — for binding sources we default to ``binding``, otherwise to
|
bindingness (that was the source-conflation this split removed). Legacy
|
||||||
``persuasive`` (never pretend an appeals committee created halacha).
|
authority values fold to the nearest role; unknown defaults to
|
||||||
|
``interpretive`` (the most common role).
|
||||||
"""
|
"""
|
||||||
if not isinstance(raw, dict):
|
if not isinstance(raw, dict):
|
||||||
return None
|
return None
|
||||||
@@ -242,13 +295,10 @@ def _coerce_halacha(raw: dict, is_binding: bool = True) -> dict | None:
|
|||||||
if not rule_statement or not supporting_quote:
|
if not rule_statement or not supporting_quote:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
default_rule_type = "binding" if is_binding else "persuasive"
|
rule_type = (raw.get("rule_type") or "").strip().lower()
|
||||||
rule_type = (raw.get("rule_type") or default_rule_type).strip().lower()
|
rule_type = _LEGACY_RULE_TYPE_FOLD.get(rule_type, rule_type)
|
||||||
if rule_type not in _VALID_RULE_TYPES:
|
if rule_type not in _VALID_RULE_TYPES:
|
||||||
rule_type = default_rule_type
|
rule_type = "interpretive"
|
||||||
# Guard: don't let a non-binding source produce 'binding' rule_type
|
|
||||||
if not is_binding and rule_type == "binding":
|
|
||||||
rule_type = "persuasive"
|
|
||||||
|
|
||||||
practice_areas_raw = raw.get("practice_areas") or []
|
practice_areas_raw = raw.get("practice_areas") or []
|
||||||
if isinstance(practice_areas_raw, str):
|
if isinstance(practice_areas_raw, str):
|
||||||
@@ -298,6 +348,7 @@ async def _nli_check(items: list[dict]) -> list[str]:
|
|||||||
system=halacha_quality.NLI_SYSTEM,
|
system=halacha_quality.NLI_SYSTEM,
|
||||||
model=config.HALACHA_NLI_MODEL or None,
|
model=config.HALACHA_NLI_MODEL or None,
|
||||||
effort=config.HALACHA_NLI_EFFORT or None,
|
effort=config.HALACHA_NLI_EFFORT or None,
|
||||||
|
tools="", # pure text→JSON — no tool_use → no error_max_turns
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning("halacha NLI check failed (fail-open, no flags): %s", e)
|
logger.warning("halacha NLI check failed (fail-open, no flags): %s", e)
|
||||||
@@ -341,6 +392,7 @@ async def _consolidate_precedent(case_law_id: UUID) -> int:
|
|||||||
system=halacha_quality.CONSOLIDATE_SYSTEM,
|
system=halacha_quality.CONSOLIDATE_SYSTEM,
|
||||||
model=config.HALACHA_CONSOLIDATE_MODEL or None,
|
model=config.HALACHA_CONSOLIDATE_MODEL or None,
|
||||||
effort=config.HALACHA_CONSOLIDATE_EFFORT or None,
|
effort=config.HALACHA_CONSOLIDATE_EFFORT or None,
|
||||||
|
tools="", # pure text→JSON — no tool_use → no error_max_turns
|
||||||
)
|
)
|
||||||
groups = halacha_quality.parse_fold_groups(raw)
|
groups = halacha_quality.parse_fold_groups(raw)
|
||||||
if not groups:
|
if not groups:
|
||||||
@@ -412,6 +464,7 @@ async def _extract_chunk(
|
|||||||
system=base_prompt,
|
system=base_prompt,
|
||||||
model=config.HALACHA_EXTRACT_MODEL or None,
|
model=config.HALACHA_EXTRACT_MODEL or None,
|
||||||
effort=(effort or config.HALACHA_EXTRACT_EFFORT) or None,
|
effort=(effort or config.HALACHA_EXTRACT_EFFORT) or None,
|
||||||
|
tools="", # pure text→JSON — no tool_use → no error_max_turns
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
last_err = e
|
last_err = e
|
||||||
@@ -433,6 +486,82 @@ async def _extract_chunk(
|
|||||||
return [], False
|
return [], False
|
||||||
|
|
||||||
|
|
||||||
|
# Reconstruct the 64-bit advisory key from pg_locks' (classid, objid) pair so
|
||||||
|
# the holder lookup is correct regardless of how Postgres splits the key.
|
||||||
|
_LOCK_HOLDER_SQL = """
|
||||||
|
SELECT a.pid,
|
||||||
|
a.state,
|
||||||
|
EXTRACT(EPOCH FROM (now() - a.state_change)) AS idle_seconds
|
||||||
|
FROM pg_locks l
|
||||||
|
JOIN pg_stat_activity a ON a.pid = l.pid
|
||||||
|
WHERE l.locktype = 'advisory'
|
||||||
|
AND ((l.classid::bigint << 32) | (l.objid::bigint)) = $1
|
||||||
|
AND l.objsubid = 1
|
||||||
|
AND l.granted
|
||||||
|
AND a.pid <> pg_backend_pid()
|
||||||
|
LIMIT 1
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
async def _acquire_global_lock(pool) -> "asyncpg.Connection | None":
|
||||||
|
"""Take the global advisory lock, self-healing a leaked (orphaned) holder.
|
||||||
|
|
||||||
|
Returns a connection that HOLDS the lock, or ``None`` if a *live* extraction
|
||||||
|
legitimately holds it. On failure we look up the holder: only an **idle**
|
||||||
|
backend whose ``state_change`` is older than ``_LOCK_STALE_AFTER`` (i.e. its
|
||||||
|
keepalive stopped — a crash) is treated as a leaked orphan and terminated;
|
||||||
|
a live extraction's holder is kept fresh by its keepalive and is never
|
||||||
|
killed, so the serialization guarantee (and the box-freeze it prevents) is
|
||||||
|
preserved.
|
||||||
|
"""
|
||||||
|
conn = await pool.acquire()
|
||||||
|
try:
|
||||||
|
if await conn.fetchval("SELECT pg_try_advisory_lock($1)",
|
||||||
|
_HALACHA_EXTRACT_LOCK_KEY):
|
||||||
|
return conn
|
||||||
|
holder = await conn.fetchrow(_LOCK_HOLDER_SQL, _HALACHA_EXTRACT_LOCK_KEY)
|
||||||
|
if (holder and holder["state"] == "idle"
|
||||||
|
and (holder["idle_seconds"] or 0) >= _LOCK_STALE_AFTER):
|
||||||
|
logger.warning(
|
||||||
|
"halacha extract: reclaiming LEAKED lock — holder pid=%s idle "
|
||||||
|
"%.0fs (≥%ds, keepalive stopped → crashed). pg_terminate_backend.",
|
||||||
|
holder["pid"], holder["idle_seconds"], _LOCK_STALE_AFTER,
|
||||||
|
)
|
||||||
|
await conn.execute("SELECT pg_terminate_backend($1)", holder["pid"])
|
||||||
|
for _ in range(_LOCK_RECLAIM_RETRIES):
|
||||||
|
if await conn.fetchval("SELECT pg_try_advisory_lock($1)",
|
||||||
|
_HALACHA_EXTRACT_LOCK_KEY):
|
||||||
|
logger.info("halacha extract: leaked lock reclaimed.")
|
||||||
|
return conn
|
||||||
|
await asyncio.sleep(_LOCK_RECLAIM_DELAY)
|
||||||
|
await pool.release(conn)
|
||||||
|
return None
|
||||||
|
except Exception:
|
||||||
|
await pool.release(conn)
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
async def _lock_keepalive(conn, stop: asyncio.Event) -> None:
|
||||||
|
"""Touch ``conn`` every ``_LOCK_KEEPALIVE_INTERVAL`` s while extraction runs.
|
||||||
|
|
||||||
|
Keeps the lock-holder's ``pg_stat_activity.state_change`` fresh so a live
|
||||||
|
extraction is never mistaken for a leaked orphan by ``_acquire_global_lock``.
|
||||||
|
Exits on ``stop`` (clean finish) or on any DB error (so the final unlock,
|
||||||
|
which reuses ``conn``, never races a keepalive query on the same connection).
|
||||||
|
"""
|
||||||
|
while not stop.is_set():
|
||||||
|
try:
|
||||||
|
await asyncio.wait_for(stop.wait(), timeout=_LOCK_KEEPALIVE_INTERVAL)
|
||||||
|
return # stop signaled — clean exit
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
await conn.execute("SELECT 1")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning("halacha lock keepalive failed (stopping): %s", e)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
async def extract(case_law_id: UUID | str, force: bool = False,
|
async def extract(case_law_id: UUID | str, force: bool = False,
|
||||||
effort: str | None = None) -> dict:
|
effort: str | None = None) -> dict:
|
||||||
"""Extract halachot from an uploaded precedent — globally serialized.
|
"""Extract halachot from an uploaded precedent — globally serialized.
|
||||||
@@ -460,28 +589,116 @@ async def extract(case_law_id: UUID | str, force: bool = False,
|
|||||||
case_law_id = UUID(case_law_id)
|
case_law_id = UUID(case_law_id)
|
||||||
|
|
||||||
pool = await db.get_pool()
|
pool = await db.get_pool()
|
||||||
lock_conn = await pool.acquire()
|
lock_conn = await _acquire_global_lock(pool)
|
||||||
try:
|
if lock_conn is None:
|
||||||
got = await lock_conn.fetchval(
|
logger.warning(
|
||||||
"SELECT pg_try_advisory_lock($1)", _HALACHA_EXTRACT_LOCK_KEY,
|
"halacha extract: global lock held by a live extraction — "
|
||||||
|
"skipping %s (stays pending for next drain)", case_law_id,
|
||||||
)
|
)
|
||||||
if not got:
|
return {
|
||||||
logger.warning(
|
"status": "busy", "extracted": 0, "stored": 0,
|
||||||
"halacha extract: global lock held by another extraction — "
|
"case_law_id": str(case_law_id),
|
||||||
"skipping %s (stays pending for next drain)", case_law_id,
|
}
|
||||||
)
|
|
||||||
return {
|
stop_keepalive = asyncio.Event()
|
||||||
"status": "busy", "extracted": 0, "stored": 0,
|
keepalive_task = asyncio.create_task(_lock_keepalive(lock_conn, stop_keepalive))
|
||||||
"case_law_id": str(case_law_id),
|
try:
|
||||||
}
|
if config.HALACHA_PANEL_REGIME_ENABLED:
|
||||||
|
# #152 Phase B — decision-level 3-model panel (votes+cap+source label).
|
||||||
|
res = await _extract_via_panel(case_law_id, force=force)
|
||||||
|
if res is not None:
|
||||||
|
return res
|
||||||
|
# panel unavailable (all judges down) → degrade to legacy path so
|
||||||
|
# extraction still makes progress instead of stalling the queue.
|
||||||
|
logger.warning("panel regime returned no result for %s — "
|
||||||
|
"falling back to legacy per-chunk extraction", case_law_id)
|
||||||
|
return await _extract_impl(case_law_id, force=force, effort=effort)
|
||||||
|
finally:
|
||||||
|
# Stop the keepalive and await it BEFORE reusing lock_conn for unlock —
|
||||||
|
# two coroutines must never query the same asyncpg connection at once.
|
||||||
|
stop_keepalive.set()
|
||||||
|
try:
|
||||||
|
await keepalive_task
|
||||||
|
except Exception: # pragma: no cover — keepalive swallows its own errors
|
||||||
|
logger.warning("halacha lock keepalive task ended abnormally")
|
||||||
try:
|
try:
|
||||||
return await _extract_impl(case_law_id, force=force, effort=effort)
|
|
||||||
finally:
|
|
||||||
await lock_conn.fetchval(
|
await lock_conn.fetchval(
|
||||||
"SELECT pg_advisory_unlock($1)", _HALACHA_EXTRACT_LOCK_KEY,
|
"SELECT pg_advisory_unlock($1)", _HALACHA_EXTRACT_LOCK_KEY,
|
||||||
)
|
)
|
||||||
finally:
|
finally:
|
||||||
await pool.release(lock_conn)
|
await pool.release(lock_conn)
|
||||||
|
|
||||||
|
|
||||||
|
async def _select_extractable_chunks(
|
||||||
|
case_law_id: UUID,
|
||||||
|
) -> tuple[list[dict], bool]:
|
||||||
|
"""Pick the chunks that are candidates for halacha extraction (#81.6).
|
||||||
|
|
||||||
|
Rhetorical-role pre-filter (INV-LRN2 quality-at-source): only
|
||||||
|
reasoning/decision sections feed extraction.
|
||||||
|
|
||||||
|
Primary: chunks labeled as an extractable section
|
||||||
|
(``EXTRACTABLE_SECTIONS``). Fallback — taken only when the chunker labeled
|
||||||
|
*nothing* extractable (non-standard headings collapse everything to
|
||||||
|
'other') — is every chunk EXCEPT those confidently classified as
|
||||||
|
non-reasoning (``NON_REASONING_SECTIONS``: facts / parties' arguments /
|
||||||
|
intro). This preserves recall for reasoning that landed under 'other' while
|
||||||
|
never feeding the factual background or the parties' positions into
|
||||||
|
extraction. Previously the fallback took *all* chunks, re-admitting exactly
|
||||||
|
the sections the primary filter excludes.
|
||||||
|
|
||||||
|
Positive-anchor guard: when a document has a "דיון/הכרעה" section
|
||||||
|
(section_type='legal_analysis'), extraction starts from that section
|
||||||
|
onwards. Any 'ruling' chunks that appear BEFORE the first legal_analysis
|
||||||
|
chunk by position are dropped — they most likely result from a party-claims
|
||||||
|
section whose header was not recognised by the chunker and was therefore
|
||||||
|
absorbed into the preceding section.
|
||||||
|
|
||||||
|
Returns ``(chunks, used_fallback)`` so the caller can log the fallback once.
|
||||||
|
"""
|
||||||
|
chunks = await db.list_precedent_chunks(
|
||||||
|
case_law_id, section_types=EXTRACTABLE_SECTIONS,
|
||||||
|
)
|
||||||
|
if chunks:
|
||||||
|
chunks = _apply_discussion_anchor(chunks)
|
||||||
|
return chunks, False
|
||||||
|
all_chunks = await db.list_precedent_chunks(case_law_id)
|
||||||
|
filtered = [
|
||||||
|
c for c in all_chunks
|
||||||
|
if c.get("section_type") not in NON_REASONING_SECTIONS
|
||||||
|
]
|
||||||
|
return filtered, True
|
||||||
|
|
||||||
|
|
||||||
|
def _apply_discussion_anchor(chunks: list[dict]) -> list[dict]:
|
||||||
|
"""Drop 'ruling' chunks that precede the first 'legal_analysis' chunk.
|
||||||
|
|
||||||
|
In Israeli planning-committee decisions the discussion section
|
||||||
|
(דיון / הכרעה / דיון והכרעה) always comes after the parties' claims.
|
||||||
|
A 'ruling'-labelled chunk that appears before the discussion is a strong
|
||||||
|
signal that a party-claims section was silently absorbed into it (chunker
|
||||||
|
regex didn't match the header). Dropping those early 'ruling' chunks is
|
||||||
|
safe because all reasoning content falls at or after the 'דיון' anchor.
|
||||||
|
"""
|
||||||
|
analysis_indices = [
|
||||||
|
c["chunk_index"] for c in chunks
|
||||||
|
if c.get("section_type") == "legal_analysis"
|
||||||
|
]
|
||||||
|
if not analysis_indices:
|
||||||
|
return chunks
|
||||||
|
first_analysis = min(analysis_indices)
|
||||||
|
filtered = [
|
||||||
|
c for c in chunks
|
||||||
|
if not (c.get("section_type") == "ruling" and c["chunk_index"] < first_analysis)
|
||||||
|
]
|
||||||
|
dropped = len(chunks) - len(filtered)
|
||||||
|
if dropped:
|
||||||
|
logger.info(
|
||||||
|
"halacha_extractor: positive-anchor guard dropped %d pre-discussion "
|
||||||
|
"'ruling' chunk(s) (first legal_analysis at chunk_index=%d)",
|
||||||
|
dropped, first_analysis,
|
||||||
|
)
|
||||||
|
return filtered
|
||||||
|
|
||||||
|
|
||||||
async def _extract_impl(case_law_id: UUID, force: bool = False,
|
async def _extract_impl(case_law_id: UUID, force: bool = False,
|
||||||
@@ -500,29 +717,35 @@ async def _extract_impl(case_law_id: UUID, force: bool = False,
|
|||||||
|
|
||||||
is_binding = bool(record.get("is_binding"))
|
is_binding = bool(record.get("is_binding"))
|
||||||
|
|
||||||
# Try the targeted sections first (legal_analysis / ruling / conclusion).
|
# Rhetorical-role pre-filter (#81.6, INV-LRN2): only reasoning/decision
|
||||||
# If the chunker labeled everything as 'other' (common when a ruling
|
# sections are candidates. The fallback (no targeted section labeled)
|
||||||
# uses non-standard headings or the section markers aren't bracketed
|
# still excludes facts/arguments/intro — see _select_extractable_chunks.
|
||||||
# cleanly), fall back to ALL chunks — better to over-include than to
|
chunks, used_fallback = await _select_extractable_chunks(case_law_id)
|
||||||
# silently skip a ruling that has reasoning under an unexpected label.
|
if used_fallback and chunks:
|
||||||
chunks = await db.list_precedent_chunks(
|
logger.info(
|
||||||
case_law_id, section_types=EXTRACTABLE_SECTIONS,
|
"halacha_extractor: case_law=%s — no targeted sections, "
|
||||||
)
|
"falling back to %d non-argument chunks (facts/arguments excluded)",
|
||||||
if not chunks:
|
case_law_id, len(chunks),
|
||||||
chunks = await db.list_precedent_chunks(case_law_id)
|
)
|
||||||
if chunks:
|
|
||||||
logger.info(
|
|
||||||
"halacha_extractor: case_law=%s — no targeted sections, "
|
|
||||||
"falling back to all %d chunks",
|
|
||||||
case_law_id, len(chunks),
|
|
||||||
)
|
|
||||||
if not chunks:
|
if not chunks:
|
||||||
await db.set_case_law_halacha_status(case_law_id, "completed")
|
await db.set_case_law_halacha_status(case_law_id, "completed")
|
||||||
return {"status": "no_chunks", "extracted": 0, "stored": 0}
|
return {"status": "no_chunks", "extracted": 0, "stored": 0}
|
||||||
|
|
||||||
# force = clean slate; otherwise resume (skip already-checkpointed chunks).
|
# force = clean slate; otherwise resume (skip already-checkpointed chunks).
|
||||||
|
# "Clean slate" preserves chair-approved/published halachot (INV-G10) — only
|
||||||
|
# un-reviewed rows are dropped; the per-chunk dedup-on-insert skips fresh
|
||||||
|
# extractions that duplicate a preserved approval, so approvals survive a
|
||||||
|
# re-extract without duplicating. See db.reset_halacha_extraction / #108.
|
||||||
|
preserved_approved = 0
|
||||||
if force:
|
if force:
|
||||||
await db.reset_halacha_extraction(case_law_id)
|
reset = await db.reset_halacha_extraction(case_law_id)
|
||||||
|
preserved_approved = reset.get("preserved", 0)
|
||||||
|
if preserved_approved:
|
||||||
|
logger.info(
|
||||||
|
"halacha_extractor: case_law=%s force re-extract — preserved %d "
|
||||||
|
"approved/published halachot (INV-G10), dropped %d un-reviewed.",
|
||||||
|
case_law_id, preserved_approved, reset.get("deleted", 0),
|
||||||
|
)
|
||||||
for c in chunks:
|
for c in chunks:
|
||||||
c["halacha_extracted_at"] = None
|
c["halacha_extracted_at"] = None
|
||||||
|
|
||||||
@@ -580,7 +803,7 @@ async def _extract_impl(case_law_id: UUID, force: bool = False,
|
|||||||
return
|
return
|
||||||
cleaned: list[dict] = []
|
cleaned: list[dict] = []
|
||||||
for raw in items:
|
for raw in items:
|
||||||
coerced = _coerce_halacha(raw, is_binding=is_binding)
|
coerced = _coerce_halacha(raw)
|
||||||
if coerced is None:
|
if coerced is None:
|
||||||
continue
|
continue
|
||||||
coerced["quote_verified"] = _verify_quote(
|
coerced["quote_verified"] = _verify_quote(
|
||||||
@@ -597,10 +820,10 @@ async def _extract_impl(case_law_id: UUID, force: bool = False,
|
|||||||
coerced["quality_flags"] = flags
|
coerced["quality_flags"] = flags
|
||||||
if halacha_quality.FLAG_NON_DECISION in flags and coerced["rule_type"] != "obiter":
|
if halacha_quality.FLAG_NON_DECISION in flags and coerced["rule_type"] != "obiter":
|
||||||
coerced["rule_type"] = "obiter"
|
coerced["rule_type"] = "obiter"
|
||||||
# #81.4 — a binding-labeled rule that reads as a case-application is
|
# #81.4 — a holding-labeled rule that reads as a case-application is
|
||||||
# re-typed application (it carries FLAG_APPLICATION either way).
|
# re-typed application (it carries FLAG_APPLICATION either way).
|
||||||
elif (halacha_quality.FLAG_APPLICATION in flags
|
elif (halacha_quality.FLAG_APPLICATION in flags
|
||||||
and coerced["rule_type"] == "binding"):
|
and coerced["rule_type"] == "holding"):
|
||||||
coerced["rule_type"] = "application"
|
coerced["rule_type"] = "application"
|
||||||
cleaned.append(coerced)
|
cleaned.append(coerced)
|
||||||
# #81.3 NLI entailment — one batched judge call per chunk (fail-open).
|
# #81.3 NLI entailment — one batched judge call per chunk (fail-open).
|
||||||
@@ -629,10 +852,10 @@ async def _extract_impl(case_law_id: UUID, force: bool = False,
|
|||||||
|
|
||||||
await asyncio.gather(*[_process(c) for c in pending])
|
await asyncio.gather(*[_process(c) for c in pending])
|
||||||
|
|
||||||
# Decide final status from what's LEFT (re-read checkpoints).
|
# Decide final status from what's LEFT (re-read checkpoints). Use the same
|
||||||
after = await db.list_precedent_chunks(case_law_id, section_types=EXTRACTABLE_SECTIONS)
|
# candidate-selection policy as above so the pending count matches the set
|
||||||
if not after:
|
# we actually extracted from (G2 — single source of truth, no parallel path).
|
||||||
after = await db.list_precedent_chunks(case_law_id)
|
after, _ = await _select_extractable_chunks(case_law_id)
|
||||||
still_pending = sum(1 for c in after if c.get("halacha_extracted_at") is None)
|
still_pending = sum(1 for c in after if c.get("halacha_extracted_at") is None)
|
||||||
total = len(await db.list_halachot(case_law_id=case_law_id, limit=10_000))
|
total = len(await db.list_halachot(case_law_id=case_law_id, limit=10_000))
|
||||||
|
|
||||||
@@ -677,5 +900,125 @@ async def _extract_impl(case_law_id: UUID, force: bool = False,
|
|||||||
"folded": folded,
|
"folded": folded,
|
||||||
"stored": stored,
|
"stored": stored,
|
||||||
"stored_this_run": stored_total,
|
"stored_this_run": stored_total,
|
||||||
|
"preserved_approved": preserved_approved,
|
||||||
"total_chunks": len(chunks),
|
"total_chunks": len(chunks),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Cap the text sent to each judge — extractable chunks already exclude
|
||||||
|
# facts/intro/arguments, but a very long decision could still blow a context.
|
||||||
|
_PANEL_MAX_CHARS = 80_000
|
||||||
|
|
||||||
|
# Canonical states a new extraction may dedup-link against (frees a cap slot).
|
||||||
|
_PANEL_DEDUP_STATES = ("pending_synthesis", "pending_review", "approved", "published")
|
||||||
|
|
||||||
|
|
||||||
|
async def _extract_via_panel(
|
||||||
|
case_law_id: UUID, force: bool = False, dry_run: bool = False,
|
||||||
|
) -> dict | None:
|
||||||
|
"""Decision-level tri-model panel extraction (#152, Phase B).
|
||||||
|
|
||||||
|
Replaces the per-chunk single-model auto-approve with: 3 models propose →
|
||||||
|
cross-model votes + mean-score → chair's approval rule → dedup vs corpus
|
||||||
|
(link known → frees a slot) → cap of HALACHA_PANEL_MAX_NEW genuinely-new
|
||||||
|
principles per decision (by score). A principle from a binding higher court
|
||||||
|
is a הלכה; from the appeals committee a כלל פרשני (labeling via source).
|
||||||
|
|
||||||
|
Returns the result dict, or **None** when fewer than 2 judges are reachable
|
||||||
|
(caller falls back to the legacy path so the queue still drains). ``dry_run``
|
||||||
|
computes the full plan WITHOUT writing — used for validation/chair preview.
|
||||||
|
"""
|
||||||
|
record = await db.get_case_law(case_law_id)
|
||||||
|
if not record:
|
||||||
|
return {"status": "not_found", "extracted": 0, "stored": 0}
|
||||||
|
|
||||||
|
# Idempotency: panel extraction is decision-level (no per-chunk checkpoints).
|
||||||
|
# Without force, skip if this decision already has halachot (avoid dup re-run).
|
||||||
|
if not force and not dry_run:
|
||||||
|
existing = await db.list_halachot(case_law_id=case_law_id, limit=1)
|
||||||
|
if existing:
|
||||||
|
total = len(await db.list_halachot(case_law_id=case_law_id, limit=10_000))
|
||||||
|
await db.set_case_law_halacha_status(case_law_id, "completed")
|
||||||
|
return {"status": "completed", "extracted": total, "stored": total,
|
||||||
|
"resumed": True, "panel": True}
|
||||||
|
|
||||||
|
source_kind = record.get("source_kind") or "external_upload"
|
||||||
|
is_binding = bool(record.get("is_binding"))
|
||||||
|
full_text = record.get("full_text") or ""
|
||||||
|
|
||||||
|
chunks, used_fallback = await _select_extractable_chunks(case_law_id)
|
||||||
|
if not chunks:
|
||||||
|
if not dry_run:
|
||||||
|
await db.set_case_law_halacha_status(case_law_id, "completed")
|
||||||
|
return {"status": "no_chunks", "extracted": 0, "stored": 0, "panel": True}
|
||||||
|
|
||||||
|
preserved = 0
|
||||||
|
if force and not dry_run:
|
||||||
|
reset = await db.reset_halacha_extraction(case_law_id)
|
||||||
|
preserved = reset.get("preserved", 0)
|
||||||
|
|
||||||
|
if not dry_run:
|
||||||
|
await db.set_case_law_halacha_status(case_law_id, "processing")
|
||||||
|
|
||||||
|
text = "\n\n".join(c["content"] for c in chunks)[:_PANEL_MAX_CHARS]
|
||||||
|
clusters = await panel_extraction.panel_extract(
|
||||||
|
text, source_kind=source_kind, is_binding=is_binding,
|
||||||
|
)
|
||||||
|
if not clusters:
|
||||||
|
# distinguish "judges down" (→ fallback) from "genuinely nothing found".
|
||||||
|
if sum(panel_extraction.panel_judges.available().values()) < 2:
|
||||||
|
return None
|
||||||
|
if not dry_run:
|
||||||
|
await db.mark_all_chunks_extracted(case_law_id)
|
||||||
|
await db.set_case_law_halacha_status(case_law_id, "completed")
|
||||||
|
return {"status": "completed", "extracted": 0, "stored": 0,
|
||||||
|
"new": 0, "linked": 0, "panel": True, "preserved_approved": preserved}
|
||||||
|
|
||||||
|
kept = [c for c in clusters if c["verdict"] in ("approved", "pending_review")]
|
||||||
|
max_new = config.HALACHA_PANEL_MAX_NEW
|
||||||
|
new_count = linked = dropped_cap = 0
|
||||||
|
to_store: list[dict] = []
|
||||||
|
for c in kept: # strongest first (panel_extract sorts by votes,score)
|
||||||
|
emb = c.get("embedding")
|
||||||
|
canonical_id, instance_type = None, "original"
|
||||||
|
if emb is not None and config.HALACHA_CANONICAL_LOOKUP_ENABLED:
|
||||||
|
match = await db.nearest_canonical_halacha(
|
||||||
|
emb, threshold=config.HALACHA_CANONICAL_THRESHOLD,
|
||||||
|
status_filter=_PANEL_DEDUP_STATES,
|
||||||
|
)
|
||||||
|
if match:
|
||||||
|
canonical_id, instance_type = match[0], "citation"
|
||||||
|
if instance_type == "original":
|
||||||
|
if new_count >= max_new: # cap: linked don't count, only new
|
||||||
|
dropped_cap += 1
|
||||||
|
continue
|
||||||
|
new_count += 1
|
||||||
|
else:
|
||||||
|
linked += 1
|
||||||
|
to_store.append({
|
||||||
|
"rule_statement": c["rule_statement"], "supporting_quote": c["supporting_quote"],
|
||||||
|
"reasoning_summary": c["reasoning_summary"], "rule_type": c["rule_type"],
|
||||||
|
"confidence": c["score"], "score": c["score"], "votes": c["votes"],
|
||||||
|
"voters": c["voters"], "review_status": c["verdict"], "embedding": emb,
|
||||||
|
"instance_type": instance_type, "canonical_id": canonical_id,
|
||||||
|
"quote_verified": _verify_quote(c["supporting_quote"], full_text),
|
||||||
|
})
|
||||||
|
|
||||||
|
if dry_run:
|
||||||
|
return {"status": "dry_run", "panel": True, "source_kind": source_kind,
|
||||||
|
"candidates": clusters, "to_store": to_store,
|
||||||
|
"new": new_count, "linked": linked, "dropped_over_cap": dropped_cap}
|
||||||
|
|
||||||
|
res = await db.store_panel_principles(case_law_id, to_store)
|
||||||
|
await db.mark_all_chunks_extracted(case_law_id)
|
||||||
|
await db.set_case_law_halacha_status(case_law_id, "completed")
|
||||||
|
total = len(await db.list_halachot(case_law_id=case_law_id, limit=10_000))
|
||||||
|
logger.info(
|
||||||
|
"halacha panel: case_law=%s (%s) — %d new + %d linked stored, "
|
||||||
|
"%d dropped over cap-%d", case_law_id, source_kind,
|
||||||
|
res["created_new"], res["linked"], dropped_cap, max_new,
|
||||||
|
)
|
||||||
|
return {"status": "completed", "extracted": total,
|
||||||
|
"stored": res["created_new"] + res["linked"], "new": res["created_new"],
|
||||||
|
"linked": res["linked"], "dropped_over_cap": dropped_cap,
|
||||||
|
"panel": True, "preserved_approved": preserved}
|
||||||
|
|||||||
@@ -18,6 +18,37 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
# ── Authority axis — DERIVED from the source, never LLM-classified (INV-DM7) ──
|
||||||
|
#
|
||||||
|
# A halacha's *authority* (binding vs persuasive) is a property of WHERE it came
|
||||||
|
# from, not of the rule's content. It is therefore derived deterministically
|
||||||
|
# from ``case_law.precedent_level`` and never stored on ``halachot`` or guessed
|
||||||
|
# by the extractor — keeping it orthogonal to ``rule_type`` (the rule ROLE).
|
||||||
|
# Higher courts (עליון/מנהלי) bind the appeals committee; another committee is
|
||||||
|
# only persuasive. See docs/spec/02-data-model.md INV-DM7.
|
||||||
|
|
||||||
|
AUTHORITY_BINDING = "binding"
|
||||||
|
AUTHORITY_PERSUASIVE = "persuasive"
|
||||||
|
|
||||||
|
_BINDING_LEVELS = {"עליון", "מנהלי"}
|
||||||
|
_PERSUASIVE_LEVELS = {"ועדת_ערר_מחוזית"}
|
||||||
|
|
||||||
|
|
||||||
|
def derive_authority(precedent_level: str | None) -> str | None:
|
||||||
|
"""Map a source's precedent_level to its authority over the committee.
|
||||||
|
|
||||||
|
Returns ``"binding"`` for higher courts (עליון/מנהלי), ``"persuasive"`` for
|
||||||
|
another appeals committee (ועדת_ערר_מחוזית), or ``None`` when the level is
|
||||||
|
unknown/empty (never guesses). Pure — the single source of truth for the
|
||||||
|
authority axis (INV-DM7).
|
||||||
|
"""
|
||||||
|
level = (precedent_level or "").strip()
|
||||||
|
if level in _BINDING_LEVELS:
|
||||||
|
return AUTHORITY_BINDING
|
||||||
|
if level in _PERSUASIVE_LEVELS:
|
||||||
|
return AUTHORITY_PERSUASIVE
|
||||||
|
return None
|
||||||
|
|
||||||
# ── Hebrew text normalization (shared with the extractor's quote check) ──
|
# ── Hebrew text normalization (shared with the extractor's quote check) ──
|
||||||
|
|
||||||
_HEB_QUOTE_VARIANTS = "\"'׳״‘’“”«»„′″"
|
_HEB_QUOTE_VARIANTS = "\"'׳״‘’“”«»„′″"
|
||||||
@@ -213,15 +244,85 @@ def lexical_near_duplicate(
|
|||||||
or normalized_levenshtein(a, b) >= levenshtein_min)
|
or normalized_levenshtein(a, b) >= levenshtein_min)
|
||||||
|
|
||||||
|
|
||||||
|
def dedup_action(
|
||||||
|
dist: float, rule_new: str, rule_neighbor: str,
|
||||||
|
dedup_distance: float, band_distance: float,
|
||||||
|
) -> str:
|
||||||
|
"""Decide a fresh halacha's fate vs its nearest same-precedent neighbor (#82.4).
|
||||||
|
|
||||||
|
PAIRWISE by construction — it compares the new rule to exactly ONE neighbor
|
||||||
|
(the nearest already-stored one), never to a cluster, so dedup-on-insert can
|
||||||
|
NEVER collapse a chain A~B~C into a single row even when A and C are
|
||||||
|
distinct: each insert is an independent pairwise decision and only the
|
||||||
|
*incoming* row is ever skipped (no existing row is merged or deleted). This
|
||||||
|
is the over-merge guard (#82.6) — connected-components closure, the central
|
||||||
|
over-merge risk in entity-resolution, is deliberately NOT performed here.
|
||||||
|
|
||||||
|
``dist`` is cosine distance (1 − cosine sim) to the neighbor. Returns:
|
||||||
|
* 'skip' — semantic duplicate (dist ≤ dedup_distance): drop the incoming
|
||||||
|
row; the caller unions its provenance (cites) into the surviving
|
||||||
|
neighbor rather than blind-dropping it.
|
||||||
|
* 'flag' — lexical tail (dedup_distance < dist ≤ band_distance AND high
|
||||||
|
lexical overlap): keep the row but mark near_duplicate → chair review.
|
||||||
|
* 'keep' — distinct enough: store normally.
|
||||||
|
"""
|
||||||
|
if dist <= dedup_distance:
|
||||||
|
return "skip"
|
||||||
|
if dist <= band_distance and lexical_near_duplicate(rule_new, rule_neighbor):
|
||||||
|
return "flag"
|
||||||
|
return "keep"
|
||||||
|
|
||||||
|
|
||||||
# ── Aggregate ──
|
# ── Aggregate ──
|
||||||
|
|
||||||
FLAG_NON_DECISION = "non_decision"
|
FLAG_NON_DECISION = "non_decision"
|
||||||
FLAG_TRUNCATED_QUOTE = "truncated_quote"
|
FLAG_TRUNCATED_QUOTE = "truncated_quote"
|
||||||
FLAG_THIN_RESTATEMENT = "thin_restatement"
|
FLAG_THIN_RESTATEMENT = "thin_restatement"
|
||||||
FLAG_QUOTE_UNVERIFIED = "quote_unverified"
|
FLAG_QUOTE_UNVERIFIED = "quote_unverified"
|
||||||
FLAG_NLI_UNSUPPORTED = "nli_unsupported" # rule not entailed by its quote (#81.3)
|
FLAG_NLI_UNSUPPORTED = "nli_unsupported" # rule not entailed by its quote (#81.3)
|
||||||
FLAG_APPLICATION = "application" # fact-dependent, not a holding (#81.4)
|
FLAG_APPLICATION = "application" # fact-dependent, not a holding (#81.4)
|
||||||
FLAG_NEAR_DUPLICATE = "near_duplicate" # cosine-tail lexical dup (#82.3)
|
FLAG_NEAR_DUPLICATE = "near_duplicate" # cosine-tail lexical dup (#82.3)
|
||||||
|
FLAG_PARTY_CLAIM = "party_claim_language" # quote reads as a party's position, not the court's
|
||||||
|
|
||||||
|
|
||||||
|
# ── Party-claim language: quote is the court's words, not a party's ──
|
||||||
|
#
|
||||||
|
# Positive markers that a quote comes from a party's argument section rather
|
||||||
|
# than the court's own reasoning. The chunker now correctly classifies these
|
||||||
|
# sections, but a belt-and-suspenders lexical gate catches any case where
|
||||||
|
# the chunker still absorbs a party-claims section into a reasoning chunk
|
||||||
|
# (e.g. an unrecognised header variant). We scan the supporting_quote only —
|
||||||
|
# the rule_statement is already abstracted and should not contain these phrases.
|
||||||
|
|
||||||
|
_PARTY_CLAIM_MARKERS = (
|
||||||
|
# Named-party attribution forms — always party-claim language, never court reasoning
|
||||||
|
"לטענת העורר",
|
||||||
|
"לטענת העוררת",
|
||||||
|
"לטענת העוררים",
|
||||||
|
"לטענת המשיב",
|
||||||
|
"לטענת המשיבה",
|
||||||
|
"לטענת המשיבים",
|
||||||
|
"טוען העורר",
|
||||||
|
"טוענת העוררת",
|
||||||
|
"טוען המשיב",
|
||||||
|
"טוענת המשיבה",
|
||||||
|
# Excluded (too broad — courts also use these in their own reasoning):
|
||||||
|
# "נטען כי", "נטען על ידי", "נטען על-ידי", "לטענתו", "לטענתה", "לטענתם"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def detect_party_claim_language(supporting_quote: str) -> str | None:
|
||||||
|
"""Return the first party-claim marker found in the quote (or None).
|
||||||
|
|
||||||
|
Only the supporting_quote is scanned — rule_statement is already abstracted.
|
||||||
|
A match means the LLM likely extracted from a party's argument section
|
||||||
|
rather than the court's reasoning.
|
||||||
|
"""
|
||||||
|
norm = normalize_text(supporting_quote)
|
||||||
|
for marker in _PARTY_CLAIM_MARKERS:
|
||||||
|
if marker in norm:
|
||||||
|
return marker
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
# ── NLI entailment check (rule_statement ⊨ supporting_quote) — #81.3 ──
|
# ── NLI entailment check (rule_statement ⊨ supporting_quote) — #81.3 ──
|
||||||
@@ -337,7 +438,7 @@ def compute_quality_flags(
|
|||||||
supporting_quote: str,
|
supporting_quote: str,
|
||||||
reasoning_summary: str = "",
|
reasoning_summary: str = "",
|
||||||
quote_verified: bool = True,
|
quote_verified: bool = True,
|
||||||
rule_type: str = "binding",
|
rule_type: str = "interpretive",
|
||||||
) -> list[str]:
|
) -> list[str]:
|
||||||
"""Return the list of quality flags for one halacha (empty == clean).
|
"""Return the list of quality flags for one halacha (empty == clean).
|
||||||
|
|
||||||
@@ -357,4 +458,8 @@ def compute_quality_flags(
|
|||||||
# rule_type='application' and add a high-precision deixis catch.
|
# rule_type='application' and add a high-precision deixis catch.
|
||||||
if rule_type == "application" or is_fact_dependent(rule_statement):
|
if rule_type == "application" or is_fact_dependent(rule_statement):
|
||||||
flags.append(FLAG_APPLICATION)
|
flags.append(FLAG_APPLICATION)
|
||||||
|
# Belt-and-suspenders: if the quote contains party-claim language the
|
||||||
|
# chunker's section filter should have excluded, flag for manual review.
|
||||||
|
if detect_party_claim_language(supporting_quote):
|
||||||
|
flags.append(FLAG_PARTY_CLAIM)
|
||||||
return flags
|
return flags
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
import mimetypes
|
||||||
import re
|
import re
|
||||||
import shutil
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import date
|
from datetime import date
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -23,7 +23,7 @@ from typing import Awaitable, Callable
|
|||||||
from uuid import UUID, uuid4
|
from uuid import UUID, uuid4
|
||||||
|
|
||||||
from legal_mcp import config
|
from legal_mcp import config
|
||||||
from legal_mcp.services import chunker, db, embeddings, extractor
|
from legal_mcp.services import chunker, db, embeddings, extractor, storage
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -66,12 +66,22 @@ def _safe_filename(name: str) -> str:
|
|||||||
return re.sub(r"[^\w.\-+א-ת ]", "_", base) or f"upload-{uuid4().hex[:8]}"
|
return re.sub(r"[^\w.\-+א-ת ]", "_", base) or f"upload-{uuid4().hex[:8]}"
|
||||||
|
|
||||||
|
|
||||||
def _stage_file(src_path: Path, root: Path, subdir: str) -> Path:
|
async def _stage_file(src_path: Path, root: Path, subdir: str) -> str:
|
||||||
dest_dir = root / (subdir or "other")
|
"""Stage an intake file through the unified storage layer (INV-STG1).
|
||||||
dest_dir.mkdir(parents=True, exist_ok=True)
|
|
||||||
dest = dest_dir / f"{uuid4().hex[:8]}_{_safe_filename(src_path.name)}"
|
Returns the storage KEY (DATA_DIR-relative path) the blob was written under.
|
||||||
shutil.copy2(src_path, dest)
|
The caller resolves a readable local path via ``storage.ensure_local`` — the
|
||||||
return dest
|
key is NOT guaranteed to map to an existing on-disk file (under the s3-only
|
||||||
|
backend the bytes live only in object storage). The Hebrew original filename
|
||||||
|
rides as object metadata, never as the key (INV-STG2)."""
|
||||||
|
dest = root / (subdir or "other") / f"{uuid4().hex[:8]}_{_safe_filename(src_path.name)}"
|
||||||
|
key = dest.relative_to(config.DATA_DIR).as_posix()
|
||||||
|
await storage.put_file(
|
||||||
|
src_path, key, bucket=storage.Bucket.DOCUMENTS,
|
||||||
|
content_type=mimetypes.guess_type(src_path.name)[0],
|
||||||
|
metadata={"filename": src_path.name},
|
||||||
|
)
|
||||||
|
return key
|
||||||
|
|
||||||
|
|
||||||
def _validate_enums(spec: IntakeSpec, inputs: dict) -> None:
|
def _validate_enums(spec: IntakeSpec, inputs: dict) -> None:
|
||||||
@@ -146,88 +156,108 @@ async def ingest_document(
|
|||||||
page_count = 0
|
page_count = 0
|
||||||
page_offsets = None
|
page_offsets = None
|
||||||
staged: Path | None = None
|
staged: Path | None = None
|
||||||
|
staged_is_tmp = False
|
||||||
if file_path:
|
if file_path:
|
||||||
src = Path(file_path)
|
src = Path(file_path)
|
||||||
if not src.is_file():
|
if not src.is_file():
|
||||||
raise FileNotFoundError(f"file not found: {src}")
|
raise FileNotFoundError(f"file not found: {src}")
|
||||||
await progress("staging", 5, "מעתיק את הקובץ לאחסון")
|
await progress("staging", 5, "מעתיק את הקובץ לאחסון")
|
||||||
staged = _stage_file(src, spec.staging_root, spec.staging_subdir(inputs))
|
staged_key = await _stage_file(src, spec.staging_root, spec.staging_subdir(inputs))
|
||||||
await progress("extracting", 15, "מחלץ טקסט מהקובץ")
|
# Resolve a real local path to read from. Under filesystem/dual this is
|
||||||
try:
|
# the on-disk copy; under s3-only the blob lives only in object storage,
|
||||||
raw_text, page_count, page_offsets = await extractor.extract_text(str(staged))
|
# so ensure_local downloads it to a temp file we own and must clean up
|
||||||
except Exception as e:
|
# (INV-STG1 — the pipeline must read through the storage layer, never
|
||||||
await progress("failed", 100, f"כשל בחילוץ טקסט: {e}")
|
# assume the key maps to an existing DATA_DIR file).
|
||||||
raise
|
staged_is_tmp = storage.local_path(
|
||||||
raw_text = (raw_text or "")
|
staged_key, bucket=storage.Bucket.DOCUMENTS) is None
|
||||||
else:
|
staged = await storage.ensure_local(
|
||||||
raw_text = (text or "")
|
staged_key, bucket=storage.Bucket.DOCUMENTS)
|
||||||
# Capture the Nevo מיני-רציו (editorial holdings summary) BEFORE stripping
|
|
||||||
# it out — it is a free professional gold-set for benchmarking halacha
|
|
||||||
# extraction (#86.3). Stored on the case_law row below once we have its id.
|
|
||||||
nevo_ratio = extractor.extract_nevo_ratio(raw_text)
|
|
||||||
raw_text = extractor.strip_nevo_preamble(raw_text).strip()
|
|
||||||
if not raw_text:
|
|
||||||
await progress("failed", 100, "לא נמצא טקסט בקובץ")
|
|
||||||
raise ValueError("no extractable text in file")
|
|
||||||
|
|
||||||
# Step 6: DB create (type-specific, routed — get case_law_id).
|
|
||||||
await progress("storing_metadata", 25, "שומר את הרשומה במסד הנתונים")
|
|
||||||
display_name = (inputs.get("case_name") or "").strip() or (
|
|
||||||
inputs.get(spec.display_name_fallback) or ""
|
|
||||||
).strip()
|
|
||||||
record = await spec.create_record(
|
|
||||||
full_text=raw_text,
|
|
||||||
case_name=display_name,
|
|
||||||
decision_date=_coerce_date(inputs.get("decision_date")),
|
|
||||||
document_id=document_id,
|
|
||||||
**{k: v for k, v in inputs.items()
|
|
||||||
if k not in {"case_name", "decision_date", "file_path", "text"}},
|
|
||||||
)
|
|
||||||
case_law_id = UUID(str(record["id"]))
|
|
||||||
|
|
||||||
# Persist the captured mini-ratio (best-effort; never block ingest on it).
|
|
||||||
if nevo_ratio:
|
|
||||||
try:
|
|
||||||
await db.update_case_law(case_law_id, nevo_ratio=nevo_ratio)
|
|
||||||
except Exception as e: # noqa: BLE001 — additive metadata, non-fatal
|
|
||||||
logger.warning("could not store nevo_ratio for %s: %s", case_law_id, e)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
stored_chunks = await _chunk_embed_store(case_law_id, raw_text, page_offsets, page_count, progress)
|
if staged is not None:
|
||||||
await db.mark_indexed(case_law_id)
|
await progress("extracting", 15, "מחלץ טקסט מהקובץ")
|
||||||
|
|
||||||
# Step 9: multimodal — uniform: flag + PDF + page_count, NOT intake type.
|
|
||||||
if (config.MULTIMODAL_ENABLED and page_count > 0
|
|
||||||
and staged is not None and staged.suffix.lower() == ".pdf"):
|
|
||||||
try:
|
try:
|
||||||
await progress("embedding_images", 70, f"מטמיע {page_count} עמודי תמונה (multimodal)")
|
raw_text, page_count, page_offsets = await extractor.extract_text(str(staged))
|
||||||
await _embed_pages(case_law_id, staged, page_count)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning("Multimodal embedding failed (non-fatal): %s", e)
|
await progress("failed", 100, f"כשל בחילוץ טקסט: {e}")
|
||||||
|
raise
|
||||||
|
raw_text = (raw_text or "")
|
||||||
|
else:
|
||||||
|
raw_text = (text or "")
|
||||||
|
# Capture the Nevo מיני-רציו (editorial holdings summary) BEFORE stripping
|
||||||
|
# it out — it is a free professional gold-set for benchmarking halacha
|
||||||
|
# extraction (#86.3). Stored on the case_law row below once we have its id.
|
||||||
|
nevo_ratio = extractor.extract_nevo_ratio(raw_text)
|
||||||
|
raw_text = extractor.strip_nevo_preamble(raw_text).strip()
|
||||||
|
if not raw_text:
|
||||||
|
await progress("failed", 100, "לא נמצא טקסט בקובץ")
|
||||||
|
raise ValueError("no extractable text in file")
|
||||||
|
|
||||||
# Steps 10-12: queue BOTH extractions (GAP-02 fix) + statuses.
|
# Step 6: DB create (type-specific, routed — get case_law_id).
|
||||||
await db.set_case_law_extraction_status(case_law_id, "completed")
|
await progress("storing_metadata", 25, "שומר את הרשומה במסד הנתונים")
|
||||||
await db.set_case_law_halacha_status(case_law_id, "pending")
|
display_name = (inputs.get("case_name") or "").strip() or (
|
||||||
await db.request_metadata_extraction(case_law_id)
|
inputs.get(spec.display_name_fallback) or ""
|
||||||
await db.request_halacha_extraction(case_law_id)
|
).strip()
|
||||||
await db.recompute_searchable(case_law_id)
|
record = await spec.create_record(
|
||||||
|
full_text=raw_text,
|
||||||
|
case_name=display_name,
|
||||||
|
decision_date=_coerce_date(inputs.get("decision_date")),
|
||||||
|
document_id=document_id,
|
||||||
|
**{k: v for k, v in inputs.items()
|
||||||
|
if k not in {"case_name", "decision_date", "file_path", "text"}},
|
||||||
|
)
|
||||||
|
case_law_id = UUID(str(record["id"]))
|
||||||
|
|
||||||
await progress("completed", 100,
|
# Persist the captured mini-ratio (best-effort; never block ingest on it).
|
||||||
f"נקלט: {stored_chunks} chunks. חילוץ הלכות ומטא-דאטה ממתינים בתור.")
|
if nevo_ratio:
|
||||||
return {
|
try:
|
||||||
"status": "completed",
|
await db.update_case_law(case_law_id, nevo_ratio=nevo_ratio)
|
||||||
"case_law_id": str(case_law_id),
|
except Exception as e: # noqa: BLE001 — additive metadata, non-fatal
|
||||||
"chunks": stored_chunks,
|
logger.warning("could not store nevo_ratio for %s: %s", case_law_id, e)
|
||||||
"halachot": 0,
|
|
||||||
"halachot_pending": True,
|
try:
|
||||||
"metadata_filled": [],
|
stored_chunks = await _chunk_embed_store(case_law_id, raw_text, page_offsets, page_count, progress)
|
||||||
"pages": page_count,
|
await db.mark_indexed(case_law_id)
|
||||||
}
|
|
||||||
except Exception as e:
|
# Step 9: multimodal — uniform: flag + PDF + page_count, NOT intake type.
|
||||||
logger.exception("ingest_document failed (%s): %s", spec.source_kind, e)
|
if (config.MULTIMODAL_ENABLED and page_count > 0
|
||||||
await db.set_case_law_extraction_status(case_law_id, "failed")
|
and staged is not None and staged.suffix.lower() == ".pdf"):
|
||||||
await progress("failed", 100, f"כשל בעיבוד: {e}")
|
try:
|
||||||
raise
|
await progress("embedding_images", 70, f"מטמיע {page_count} עמודי תמונה (multimodal)")
|
||||||
|
await _embed_pages(case_law_id, staged, page_count)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning("Multimodal embedding failed (non-fatal): %s", e)
|
||||||
|
|
||||||
|
# Steps 10-12: queue BOTH extractions (GAP-02 fix) + statuses.
|
||||||
|
await db.set_case_law_extraction_status(case_law_id, "completed")
|
||||||
|
await db.set_case_law_halacha_status(case_law_id, "pending")
|
||||||
|
await db.request_metadata_extraction(case_law_id)
|
||||||
|
await db.request_halacha_extraction(case_law_id)
|
||||||
|
await db.recompute_searchable(case_law_id)
|
||||||
|
|
||||||
|
await progress("completed", 100,
|
||||||
|
f"נקלט: {stored_chunks} chunks. חילוץ הלכות ומטא-דאטה ממתינים בתור.")
|
||||||
|
return {
|
||||||
|
"status": "completed",
|
||||||
|
"case_law_id": str(case_law_id),
|
||||||
|
"chunks": stored_chunks,
|
||||||
|
"halachot": 0,
|
||||||
|
"halachot_pending": True,
|
||||||
|
"metadata_filled": [],
|
||||||
|
"pages": page_count,
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception("ingest_document failed (%s): %s", spec.source_kind, e)
|
||||||
|
await db.set_case_law_extraction_status(case_law_id, "failed")
|
||||||
|
await progress("failed", 100, f"כשל בעיבוד: {e}")
|
||||||
|
raise
|
||||||
|
finally:
|
||||||
|
# Drop the temp download (s3-only); on filesystem/dual ``staged`` is the
|
||||||
|
# canonical on-disk copy and must NOT be removed.
|
||||||
|
if staged_is_tmp and staged is not None:
|
||||||
|
try:
|
||||||
|
staged.unlink(missing_ok=True)
|
||||||
|
except OSError as e: # noqa: BLE001 — temp cleanup, never fatal
|
||||||
|
logger.debug("could not remove temp staged file %s: %s", staged, e)
|
||||||
|
|
||||||
|
|
||||||
async def _chunk_embed_store(case_law_id, text, page_offsets, page_count, progress) -> int:
|
async def _chunk_embed_store(case_law_id, text, page_offsets, page_count, progress) -> int:
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user