fix(agents): INV-AG3 — כלי שמורים לסוכן להריץ חייב להיות מוענק לו, ושער-CI שיאכוף #424

Merged
chaim merged 1 commits from worktree-agent-tool-grants into main 2026-08-04 09:09:03 +00:00
Owner

הבעיה

ה-frontmatter tools: של סוכן claude_local הוא allow-list סגורה. כלי הרשום בשרת-ה-MCP אך חסר ממנה אינו ניתן לקריאה — גם כשהשרת מחובר לחלוטין.

analyze_protocol נרשם בשרת ב-24e3e2f (2026-06-30), בקומיט שנגע ב-9 קבצים — אף אחד מהם ב-.claude/agents/. אחר כך #226 הוסיף את wake_analyst_for_protocol_analysis, שכותב לתוך ה-issue של המנתח:

«הרץ mcp__legal-ai__analyze_protocol(case_number="...")»

כלומר המערכת הורתה לסוכן להריץ כלי שמעולם לא הוענק לו.

מה זה עשה בפועל — CMP-229 (2026-08-04)

המנתח דיווח נכונה: "the tools exist on the connected server but aren't exposed as callable in this session", ואז עקף — psql ידני + סקריפט מקומי. ההרצה הראשונה שיגרה אותו לרקע וסיימה את התור → קבוצת-התהליכים נהרגה → הניתוח אבד. רק הרצת ה-recovery השנייה הצליחה. שתי הרצות, ~19 דקות, במקום קריאת-כלי אחת.

INV-AG3 כיסה את זה בספ מ-2026-06-06 — אבל האכיפה נדחתה ("אכיפה אוטומטית עתידית — תת-פרויקט 5"), ולכן הדריפט חי חמישה שבועות.

התיקון

הענקות — כל אחת עם ההוראה המתאימה, כדי לא ליצור הענקה עודפת (INV-AG3 = "לא חסר ולא עודף"):

סוכן נוסף נימוק
legal-analyst analyze_protocol, get_protocol_analysis ה-backend מורה להריץ. + סעיף הוראות חדש — אף סוכן לא ידע שהיכולת קיימת
legal-analyst get_legal_arguments, get_appraiser_facts קריאה-בחזרה אחרי כתיבה (אסימטריה)
legal-ceo get_appraiser_facts אימות שהחילוץ נחת
legal-qa precedent_library_list הוראותיו כבר אמרו "הרץ" אותו — אותו באג בדיוק, התגלה אגב הסריקה

סעיף ההוראות החדש למנתח כולל גם את הלקח התפעולי: להריץ בקדמה, לעולם לא ברקע.

שער-CIscripts/agent_tool_grants_guard.py, בדפוס leak_guard.py של G12. ארבעה כללים קשיחים:

  1. כל mcp__legal-ai__X ב-web/ מוענק לסוכן כלשהו — זה הכלל שתופס את הבאג הזה
  2. כל mcp__legal-ai__X בגוף קובץ-סוכן מוענק ב-frontmatter של אותו קובץ
  3. אין הענקה לכלי שאינו רשום ב-@mcp.tool (typo / כלי שנמחק)
  4. שם-כלי בגרשיים ללא תחילית — מוענק, או מסווג ב-CONTRASTIVE_OK עם נימוק. 9 סווגו (אזכור ניגודי / מטלת-סוכן-אחר / שם-עמודה מתנגש), עם בדיקת-התיישנות לסיווגים

מוחרגים קבצים שאינם סוכני-claude_local: hermes-curator.md, legal-analyst-gemini-critique.md (בלי frontmatter בכוונה — האדפטר שולח פרומפט גולמי), HEARTBEAT.md.

אימות

אימות שלילי אמיתי — השער הורץ על העץ לפני התיקון והחזיר בדיוק 3 הפרות ואפס רעש: analyze_protocol (כלל 1), precedent_library_list (כלל 2), get_legal_arguments (כלל 4). אחרי התיקון:

INV-AG3 agent-tool-grants guard: OK (7 agents, 66 distinct grants, 108 tools registered)
G12 leak-guard: intelligence layer is platform-clean; import seam intact.

Invariants

  • INV-AG3 — מקיים; האכיפה עברה מידנית ל-CI, וה-"הפרה ידועה" בספ עודכנה עם ההישנות.
  • G2 — סוכן שאינו יכול לקרוא לכלי בונה מסלול מקביל (SQL ישיר / סקריפט מקומי). זה מה שנחסם.
  • G12 — leak-guard רץ נקי (רגרסיה).

אחרי המיזוג

host_sync.sh (cron כל דקה) מושך את קבצי-הסוכנים לעץ-המארח אוטומטית — אין צעד ידני.

## הבעיה ה-frontmatter `tools:` של סוכן `claude_local` הוא **allow-list סגורה**. כלי הרשום בשרת-ה-MCP אך חסר ממנה **אינו ניתן לקריאה** — גם כשהשרת מחובר לחלוטין. `analyze_protocol` נרשם בשרת ב-`24e3e2f` (2026-06-30), בקומיט שנגע ב-9 קבצים — **אף אחד מהם ב-`.claude/agents/`**. אחר כך #226 הוסיף את `wake_analyst_for_protocol_analysis`, שכותב לתוך ה-issue של המנתח: > «הרץ `mcp__legal-ai__analyze_protocol(case_number="...")`» כלומר **המערכת הורתה לסוכן להריץ כלי שמעולם לא הוענק לו.** ## מה זה עשה בפועל — CMP-229 (2026-08-04) המנתח דיווח נכונה: *"the tools exist on the connected server but aren't exposed as callable in this session"*, ואז **עקף** — psql ידני + סקריפט מקומי. ההרצה הראשונה שיגרה אותו לרקע וסיימה את התור → קבוצת-התהליכים נהרגה → הניתוח אבד. רק הרצת ה-recovery השנייה הצליחה. שתי הרצות, ~19 דקות, במקום קריאת-כלי אחת. **INV-AG3 כיסה את זה בספ מ-2026-06-06** — אבל האכיפה נדחתה (*"אכיפה אוטומטית עתידית — תת-פרויקט 5"*), ולכן הדריפט חי חמישה שבועות. ## התיקון **הענקות** — כל אחת עם ההוראה המתאימה, כדי לא ליצור הענקה עודפת (INV-AG3 = "לא חסר ולא עודף"): | סוכן | נוסף | נימוק | |-------|------|-------| | legal-analyst | `analyze_protocol`, `get_protocol_analysis` | ה-backend מורה להריץ. **+ סעיף הוראות חדש** — אף סוכן לא ידע שהיכולת קיימת | | legal-analyst | `get_legal_arguments`, `get_appraiser_facts` | קריאה-בחזרה אחרי כתיבה (אסימטריה) | | legal-ceo | `get_appraiser_facts` | אימות שהחילוץ נחת | | legal-qa | `precedent_library_list` | **הוראותיו כבר אמרו "הרץ" אותו** — אותו באג בדיוק, התגלה אגב הסריקה | סעיף ההוראות החדש למנתח כולל גם את הלקח התפעולי: **להריץ בקדמה, לעולם לא ברקע.** **שער-CI** — `scripts/agent_tool_grants_guard.py`, בדפוס `leak_guard.py` של G12. ארבעה כללים קשיחים: 1. כל `mcp__legal-ai__X` ב-`web/` מוענק לסוכן כלשהו — *זה הכלל שתופס את הבאג הזה* 2. כל `mcp__legal-ai__X` בגוף קובץ-סוכן מוענק ב-frontmatter של **אותו** קובץ 3. אין הענקה לכלי שאינו רשום ב-`@mcp.tool` (typo / כלי שנמחק) 4. שם-כלי בגרשיים ללא תחילית — מוענק, או מסווג ב-`CONTRASTIVE_OK` עם נימוק. 9 סווגו (אזכור ניגודי / מטלת-סוכן-אחר / שם-עמודה מתנגש), עם בדיקת-התיישנות לסיווגים מוחרגים קבצים שאינם סוכני-`claude_local`: `hermes-curator.md`, `legal-analyst-gemini-critique.md` (בלי frontmatter **בכוונה** — האדפטר שולח פרומפט גולמי), `HEARTBEAT.md`. ## אימות **אימות שלילי אמיתי** — השער הורץ על העץ *לפני* התיקון והחזיר **בדיוק 3 הפרות ואפס רעש**: `analyze_protocol` (כלל 1), `precedent_library_list` (כלל 2), `get_legal_arguments` (כלל 4). אחרי התיקון: ``` INV-AG3 agent-tool-grants guard: OK (7 agents, 66 distinct grants, 108 tools registered) G12 leak-guard: intelligence layer is platform-clean; import seam intact. ``` ## Invariants - **INV-AG3** — מקיים; האכיפה עברה מידנית ל-CI, וה-"הפרה ידועה" בספ עודכנה עם ההישנות. - **G2** — סוכן שאינו יכול לקרוא לכלי בונה מסלול מקביל (SQL ישיר / סקריפט מקומי). זה מה שנחסם. - **G12** — leak-guard רץ נקי (רגרסיה). ## אחרי המיזוג `host_sync.sh` (cron כל דקה) מושך את קבצי-הסוכנים לעץ-המארח אוטומטית — אין צעד ידני.
chaim added 1 commit 2026-08-04 09:06:24 +00:00
fix(agents): INV-AG3 — כלי שמורים לסוכן להריץ חייב להיות מוענק לו, ושער-CI שיאכוף
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
INV-AG3 Agent Tool Grants / agent-tool-grants (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 12s
20a1da0a0e
ה-frontmatter `tools:` של סוכן claude_local הוא allow-list סגורה: כלי הרשום
בשרת-ה-MCP אך חסר ממנה אינו ניתן לקריאה, גם כשהשרת מחובר לחלוטין.

`analyze_protocol` נרשם בשרת ב-24e3e2f (2026-06-30) בקומיט שנגע ב-9 קבצים,
אף אחד מהם ב-.claude/agents/. אחר כך #226 הוסיף את
wake_analyst_for_protocol_analysis, שכותב לתוך ה-issue "הרץ
mcp__legal-ai__analyze_protocol(...)" — כלומר המערכת הורתה למנתח להריץ כלי
שמעולם לא הוענק לו. ב-CMP-229 (2026-08-04) המנתח דיווח נכונה ש"הכלים קיימים
בשרת אך אינם נחשפים לסשן", ועקף דרך psql ידני וסקריפט מקומי: ההרצה הראשונה
שיגרה אותו לרקע וסיימה את התור, קבוצת-התהליכים נהרגה, והניתוח אבד. רק ההרצה
השנייה (recovery) הצליחה.

INV-AG3 כיסה את זה בספ מ-2026-06-06, אבל האכיפה נדחתה ("אכיפה אוטומטית
עתידית — תת-פרויקט 5"), ולכן הדריפט חי חמישה שבועות.

הענקות שנוספו (כל אחת עם ההוראה המתאימה — לא הענקה עודפת):
- legal-analyst: analyze_protocol + get_protocol_analysis (+ סעיף "משימה
  על-פי-דרישה: ניתוח פרוטוקול-הדיון" — אף סוכן לא ידע שהיכולת קיימת),
  get_legal_arguments ו-get_appraiser_facts (קריאה-בחזרה אחרי כתיבה)
- legal-ceo: get_appraiser_facts (אימות שהחילוץ נחת)
- legal-qa: precedent_library_list — הוראותיו כבר אמרו "הרץ" אותו. אותו באג
  בדיוק, שהתגלה אגב הסריקה

שער-CI חדש `scripts/agent_tool_grants_guard.py` בדפוס leak_guard.py של G12,
ארבעה כללים קשיחים: (1) כל mcp__legal-ai__X ב-web/ מוענק לסוכן כלשהו · (2) כל
mcp__legal-ai__X בגוף קובץ-סוכן מוענק באותו קובץ · (3) אין הענקה לכלי לא-רשום
· (4) שם-כלי בגרשיים ללא תחילית — מוענק, או מסווג ב-CONTRASTIVE_OK עם נימוק
(9 סווגו: אזכור ניגודי, מטלת-סוכן-אחר, שם-עמודה מתנגש), עם בדיקת-התיישנות.
מוחרגים קבצים שאינם סוכני-claude_local (hermes-curator,
legal-analyst-gemini-critique — בלי frontmatter בכוונה; HEARTBEAT).

השער אומת שלילית: לפני התיקון החזיר בדיוק 3 הפרות (analyze_protocol,
precedent_library_list, get_legal_arguments) ואפס רעש; אחריו OK.

invariants: INV-AG3 (docs/spec/X4-agents.md §2א) — מקיים; האכיפה עברה מידנית
ל-CI. G2 — סוכן שאינו יכול לקרוא לכלי בונה מסלול מקביל (SQL ישיר/סקריפט),
וזה מה שנחסם כאן. G12 — leak-guard רץ נקי (רגרסיה).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
chaim merged commit b8f6226fb1 into main 2026-08-04 09:09:03 +00:00
chaim deleted branch worktree-agent-tool-grants 2026-08-04 09:09:03 +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#424