The Harness — מי בפועל מריץ את הסוכן

הארנס כמתווך בין המודל למציאות

כפי שהוזכר בקצרה בפרק המבוא לנושא: המודל עצמו יודע רק לחזות טקסט. כשהוא "מבקש" למחוק קובץ או להריץ פקודה, כל מה שהוא באמת עשה הוא לייצר טקסט שמתאר בקשה כזו — הביצוע בפועל נמצא לגמרי בידי תוכנה חיצונית למודל.

ה-Harness הוא בדיוק התוכנה הזו: הוא מריץ את הלולאה האגנטית (שולח פרומפטים, מקבל תשובות), מפרש כל בקשת פעולה שהמודל מחזיר, ומחליט בעצמו — לפי חוקים שהוגדרו מראש ע"י מי שבנה או הגדיר אותו — האם, מתי ואיך לבצע אותה בפועל מול המערכת האמיתית (קבצים, רשת, מסדי נתונים).

ההפרדה הזו קריטית: המודל מציע, ה-harness מחליט. גם המודל הכי חכם ומיושר לא יכול לעקוף הגבלה שה-harness אוכף, כי הביצוע בפועל פשוט לא עובר דרכו.

תרשים המציג בועת דיבור (המודל, כחול) עם חץ אל צורת מגן (ה-harness) עם סימן ✓ במרכזו. מהמגן יוצא חץ כחול אחד כלפי מעלה אל סמל קובץ (פעולה מותרת שמתבצעת) וחץ כתום נוסף כלפי מטה אל סימן X בתוך עיגול (פעולה שנחסמת) — ממחיש שהמודל רק מציע פעולה בטקסט, וה-harness הוא שמחליט אם לבצע אותה בפועל.
המודל מציע פעולה כטקסט בלבד; ה-harness הוא שמחליט אם ואיך לבצע אותה בפועל מול העולם האמיתי

הרשאות ו-Approval Gates

הדרך הנפוצה ביותר להטמיע שליטה אנושית היא approval gate: לפני ביצוע פעולה שהוגדרה כ"רגישה" (מחיקת קובץ, שליחת הודעה, הרצת פקודת shell, ביצוע תשלום), ה-harness עוצר ומבקש אישור מפורש ממשתמש אנושי לפני שהוא ממשיך.

לרוב מוגדרות רמות שונות: פעולות "בטוחות" (קריאת קובץ, חיפוש) מתבצעות אוטומטית בלי לעצור; פעולות "הרסניות" (מחיקה, כתיבה למערכת חיצונית) דורשות אישור בכל פעם; ולעיתים המשתמש יכול מראש להרחיב הרשאות לסוג פעולה מסוים כדי לא להתבקש שוב ושוב על אותו דבר.

תרשים המציג תיבת פעולה שמתפצלת לשני מסלולים מנקודת הסתעפות: מסלול כחול עליון ('בטוחה') ממשיך ישר לעיגול עם סימן ✓ בלי לעצור; מסלול כתום תחתון ('הרסנית') נעצר בתמרור עצור עם סימן X, וממשיך משם רק דרך חץ מקווקו אל סמל דמות אדם (אישור אנושי נדרש).
פעולות בטוחות עוברות אוטומטית; פעולות הרסניות נעצרות בתמרור ודורשות אישור אנושי מפורש לפני שממשיכות

Sandboxing — הגבלת מרחב הפעולה

מעבר לאישור ידני, harness יכול פשוט להגביל מראש אילו פעולות בכלל אפשריות — למשל להריץ פקודות רק בתוך תיקייה מוגדרת, לחסום גישה לרשת לגמרי, או להריץ קוד שנוצר ע"י המודל בסביבה מבודדת (container או מכונה וירטואלית זמנית) שאין לה גישה למערכת האמיתית כלל.

sandboxing הוא הגנה שונה במהותה מ-approval gate: הוא לא שואל את המשתמש — הוא פשוט הופך פעולה מסוימת לבלתי אפשרית מלכתחילה, גם אם המודל "ינסה". שתי הגישות משלימות זו את זו: sandboxing מגביל את הנזק האפשרי המקסימלי, ו-approval gates מוסיפים שכבת שליטה אנושית לפעולות שכן מותרות עקרונית.

תרשים המציג אזור מגודר בקו כחול עבה (הסביבה המוגבלת) המכיל כמה נקודות כחולות (פעולות מותרות בתוכו). מחוץ לגדר, חץ כתום המנסה להיכנס פוגע בקיר עבה ונעצר לחלוטין בסימן X — בניגוד לתמרור העצור בתרשים הקודם, אין כאן שאלה או המתנה לאישור, הפעולה פשוט בלתי אפשרית מלכתחילה.
Sandboxing: גבול קשיח שהופך פעולות מסוימות לבלתי אפשריות מלכתחילה, בלי לשאול ובלי לחכות לאישור

תקציבים ותצפית: Step Limits, עלות ולוגים

בפרק הקודם ראינו שהלולאה האגנטית עלולה להיתקע או להימשך יותר מדי — הפתרון הוא ברמת ה-harness: מגבלת מספר סיבובים מקסימלית, תקציב עלות או זמן כולל למשימה, וזיהוי אוטומטי של דפוסי חזרה חשודים שעוצר את הלולאה גם אם המודל עצמו לא "ביקש" לעצור.

לצד זה, harness רציני שומר לוג מלא של כל פעולה שהמודל ביקש ושל כל החלטה שהוא (ה-harness) קיבל לגביה — לא רק לצורך דיבוג, אלא כרשומת ביקורת (audit trail) שמאפשרת לבדוק בדיעבד בדיוק מה קרה, מי אישר מה, ולמה.

תרשים המציג מד תקציב אופקי מלבני, מלא בחלקו הגדול בכחול, עם קו מקווקו כתום וחץ אזהרה המסמנים את קו הגבול העליון (limit) שעוד לא נחצה. מתחתיו תיבת יומן ביקורת (audit log) עם ארבע שורות רשומה, כל אחת עם נקודה בתחילתה — שלוש כחולות ואחת כתומה — המסמנת רשומה שסומנה לתשומת לב.
מד תקציב (מספר סיבובים/עלות) המתקרב לגבול, לצד לוג ביקורת שמתעד כל פעולה והחלטה

דוגמה מלאה: הארנס עוצר פעולה הרסנית

נניח שהמודל, תוך כדי ניקוי קבצים זמניים, מחזיר בקשה להריץ פקודת מחיקה רקורסיבית על תיקייה שלמה. ה-harness מיירט את הבקשה לפני שהיא מגיעה למערכת ההפעלה בכלל, ובודק אותה מול חוקי ההרשאות שהוגדרו לו.

מכיוון שמחיקה רקורסיבית מסווגת כפעולה הרסנית, ה-harness לא מבצע אותה מיד — הוא מציג למשתמש בדיוק מה המודל ביקש לעשות, וממתין לאישור מפורש. רק אם המשתמש מאשר, הפעולה באמת מתבצעת; אחרת, ה-harness מחזיר למודל תשובת "נדחה" כתוצאת הכלי, וה-agent ממשיך את הלולאה מנקודה הזו — למשל ע"י הצעת פעולה זהירה יותר.

TypeScript
function shouldExecute(action: ToolCall): "auto" | "ask" | "deny" {
  if (SANDBOXED_PATHS.some((p) => !action.path?.startsWith(p))) {
    return "deny"; // מחוץ לתיקייה המותרת - נחסם לגמרי
  }
  if (DESTRUCTIVE_ACTIONS.includes(action.name)) {
    return "ask"; // דורש אישור אנושי מפורש
  }
  return "auto"; // פעולה בטוחה - מתבצעת מיד
}