fix(agents): INV-AG3 — כלי שמורים לסוכן להריץ חייב להיות מוענק לו, ושער-CI שיאכוף #424
Reference in New Issue
Block a user
Delete Branch "worktree-agent-tool-grants"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
הבעיה
ה-frontmatter
tools:של סוכןclaude_localהוא allow-list סגורה. כלי הרשום בשרת-ה-MCP אך חסר ממנה אינו ניתן לקריאה — גם כשהשרת מחובר לחלוטין.analyze_protocolנרשם בשרת ב-24e3e2f(2026-06-30), בקומיט שנגע ב-9 קבצים — אף אחד מהם ב-.claude/agents/. אחר כך #226 הוסיף אתwake_analyst_for_protocol_analysis, שכותב לתוך ה-issue של המנתח:כלומר המערכת הורתה לסוכן להריץ כלי שמעולם לא הוענק לו.
מה זה עשה בפועל — 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 = "לא חסר ולא עודף"):
analyze_protocol,get_protocol_analysisget_legal_arguments,get_appraiser_factsget_appraiser_factsprecedent_library_listסעיף ההוראות החדש למנתח כולל גם את הלקח התפעולי: להריץ בקדמה, לעולם לא ברקע.
שער-CI —
scripts/agent_tool_grants_guard.py, בדפוסleak_guard.pyשל G12. ארבעה כללים קשיחים:mcp__legal-ai__Xב-web/מוענק לסוכן כלשהו — זה הכלל שתופס את הבאג הזהmcp__legal-ai__Xבגוף קובץ-סוכן מוענק ב-frontmatter של אותו קובץ@mcp.tool(typo / כלי שנמחק)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). אחרי התיקון:Invariants
אחרי המיזוג
host_sync.sh(cron כל דקה) מושך את קבצי-הסוכנים לעץ-המארח אוטומטית — אין צעד ידני.