feat(mcp): FU-14 פרוסה 1 — get_appraiser_facts (GAP-44) + limit-caps (GAP-53) #62

Merged
chaim merged 1 commits from fix/fu14-slice1-appraiser-getter-limit-caps into main 2026-06-06 14:38:22 +00:00
Owner

מה ולמה

הפרוסה הבטוחה (תוספתית, אפס שבירת-תאימות) מתוך FU-14 (חוזה כלי-ה-MCP, X9). שתי הפרוסות הנותרות: 2 (תיקונים — GAP-45/51/52) ו-3 (שובר — GAP-48/49/50).

Invariants — הצהרה

  • GAP-44 / INV-TOOL4 (G2) — לכל extract יש get מקביל; הפלט נגיש durably.
  • GAP-53 / INV-TOOL5 (OWASP API4:2023) — תקרת-limit נאכפת בכל כלי list/search.

GAP-44 — get_appraiser_facts

נוסף הכלי החסר שמפר את סימטריית extract/get: extract_appraiser_facts כתב ל-DB אבל לא היה getter → חילוץ-חוזר יקר ולא-דטרמיניסטי. ה-getter החדש קורא list_appraiser_facts + detect_appraiser_conflicts (שניהם קיימים ב-db.py) — facts + סתירות, ללא קריאת-LLM. מחזיר count=0 (לא שגיאה) אם החילוץ טרם רץ.

GAP-53 — limit-caps

נוסף _clamp_limit (תקרה _MAX_LIMIT=200, non-positive→max) ב-server.py, מוחל על ~13 כלי list/search: case_list, search_decisions, search_case_documents, find_similar_cases, search_internal_decisions, search_precedent_library, precedent_search_library, precedent_library_list, halachot_pending, style_corpus_pending_enrichment, missing_precedent_list, list_internal_citations, list_incoming_citations. list_chair_feedback — שהיה ללא limit כלל — קיבל param חדש שמושחל server→workflow→db (עם LIMIT $n).

לא שובר: כלי-batch/processing (precedent_process_pending, extract_internal_citations שבהם limit=0="הכל") לא נכללו — הם אינם כלי list-return.

INV-AG3: get_appraiser_facts לא נוסף ל-frontmatter של סוכנים — ההוראות עוד לא מפנות אליו; חיווט = follow-up (עקבי עם FU-13 "לא עודף").

צ'קליסט — פרוטוקול כתיבת-קוד

  • קראתי 00-constitution.md + X9-mcp-tool-contract.md לפני הכתיבה
  • אין מסלול מקביל (G2) — getter יחיד שנשען על db functions קיימים; clamp helper יחיד
  • אין בליעה שקטה — getter מחזיר count=0 מפורש, לא בולע
  • בדקתי מול gap-audit — מתאים ל-GAP-44/53, עדכנתי סטטוס
  • py_compile עבר על 4 קבצי הקוד

אימות

- py_compile: server.py, drafting.py, workflow.py, db.py → ✅
- _clamp_limit: 15 מופעים (def + ~14 יישומים)
- get_appraiser_facts: רשום ב-server.py:589, מימוש ב-drafting.py
- list_chair_feedback: limit מושחל ב-3 השכבות, אינדקס $n מאומת

⚠️ אימות runtime נדחה: FU-14 נוגע ב-mcp-server/ שרץ מקומית; השינויים נכנסים לתוקף ב-restart של ה-MCP server. לא ארסטרט אותו כל עוד החילוץ הפעיל של היו"ר רץ. מיזוג יפעיל deploy לקונטיינר (אינו משפיע על ה-MCP המקומי ולא על החילוץ).

🤖 Generated with Claude Code

## מה ולמה הפרוסה הבטוחה (תוספתית, אפס שבירת-תאימות) מתוך FU-14 (חוזה כלי-ה-MCP, [X9](docs/spec/X9-mcp-tool-contract.md)). שתי הפרוסות הנותרות: 2 (תיקונים — GAP-45/51/52) ו-3 (שובר — GAP-48/49/50). ## Invariants — הצהרה - **GAP-44 / INV-TOOL4 (G2)** — לכל extract יש get מקביל; הפלט נגיש durably. - **GAP-53 / INV-TOOL5 (OWASP API4:2023)** — תקרת-limit נאכפת בכל כלי list/search. ## GAP-44 — get_appraiser_facts נוסף הכלי החסר שמפר את סימטריית extract/get: `extract_appraiser_facts` כתב ל-DB אבל לא היה getter → חילוץ-חוזר יקר ולא-דטרמיניסטי. ה-getter החדש קורא `list_appraiser_facts` + `detect_appraiser_conflicts` (שניהם קיימים ב-db.py) — facts + סתירות, **ללא** קריאת-LLM. מחזיר `count=0` (לא שגיאה) אם החילוץ טרם רץ. ## GAP-53 — limit-caps נוסף `_clamp_limit` (תקרה `_MAX_LIMIT=200`, non-positive→max) ב-[server.py](mcp-server/src/legal_mcp/server.py), מוחל על ~13 כלי list/search: `case_list`, `search_decisions`, `search_case_documents`, `find_similar_cases`, `search_internal_decisions`, `search_precedent_library`, `precedent_search_library`, `precedent_library_list`, `halachot_pending`, `style_corpus_pending_enrichment`, `missing_precedent_list`, `list_internal_citations`, `list_incoming_citations`. `list_chair_feedback` — שהיה **ללא limit כלל** — קיבל param חדש שמושחל server→workflow→db (עם `LIMIT $n`). > **לא שובר:** כלי-batch/processing (`precedent_process_pending`, `extract_internal_citations` שבהם `limit=0`="הכל") **לא** נכללו — הם אינם כלי list-return. > **INV-AG3:** `get_appraiser_facts` **לא** נוסף ל-frontmatter של סוכנים — ההוראות עוד לא מפנות אליו; חיווט = follow-up (עקבי עם FU-13 "לא עודף"). ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי `00-constitution.md` + `X9-mcp-tool-contract.md` לפני הכתיבה - [x] אין מסלול מקביל (G2) — getter יחיד שנשען על db functions קיימים; clamp helper יחיד - [x] אין בליעה שקטה — getter מחזיר count=0 מפורש, לא בולע - [x] בדקתי מול gap-audit — מתאים ל-GAP-44/53, עדכנתי סטטוס - [x] py_compile עבר על 4 קבצי הקוד ## אימות ``` - py_compile: server.py, drafting.py, workflow.py, db.py → ✅ - _clamp_limit: 15 מופעים (def + ~14 יישומים) - get_appraiser_facts: רשום ב-server.py:589, מימוש ב-drafting.py - list_chair_feedback: limit מושחל ב-3 השכבות, אינדקס $n מאומת ``` > ⚠️ **אימות runtime נדחה:** FU-14 נוגע ב-`mcp-server/` שרץ מקומית; השינויים נכנסים לתוקף ב-restart של ה-MCP server. **לא ארסטרט** אותו כל עוד החילוץ הפעיל של היו"ר רץ. מיזוג יפעיל deploy לקונטיינר (אינו משפיע על ה-MCP המקומי ולא על החילוץ). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-06 14:38:10 +00:00
תוספתי בלבד, אפס שבירת-תאימות. שני invariants מחוזה-כלי-ה-MCP (X9):

GAP-44 (INV-TOOL4, סימטריית extract/get): נוסף get_appraiser_facts — ה-get
המקביל ל-extract_appraiser_facts. קורא list_appraiser_facts + detect_appraiser_conflicts
מה-DB ללא חילוץ-LLM יקר ולא-דטרמיניסטי. מחזיר count=0 (לא שגיאה) אם טרם חולץ.

GAP-53 (INV-TOOL5, limit-caps / OWASP API4:2023): נוסף _clamp_limit (תקרה 200,
non-positive→max) על ~13 כלי list/search ב-server.py (case_list, search_*,
precedent_library_list, halachot_pending, missing_precedent_list, list_*_citations…).
list_chair_feedback קיבל param limit חדש (server→workflow→db עם LIMIT) — היה ללא תקרה כלל.

לא הוסף get_appraiser_facts ל-frontmatter של סוכנים (INV-AG3 "לא עודף" — ההוראות
עוד לא מפנות אליו; חיווט = follow-up). נותר ב-FU-14: GAP-45/48/49/50/51/52.

עודכנו docs/spec/X9 (INV-TOOL4/5) ו-gap-audit (סטטוס פרוסה 1).

אומת: py_compile על 4 קבצי הקוד. אימות runtime (restart MCP server) נדחה עד
שהחילוץ הפעיל של היו"ר יסתיים.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit b53d65c1f6 into main 2026-06-06 14:38:22 +00:00
chaim deleted branch fix/fu14-slice1-appraiser-getter-limit-caps 2026-06-06 14:38:22 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#62