← לכל המאמרים

המק של הסוכנים התמלא — ולא בגלל ההורדות: איך 774 עותקי עבודה של git בלעו דיסק של 926GB, ומה עשינו עם זה

בוקר אחד המחשב שמריץ את צי הסוכנים שלנו התחיל לגמגם. בדקתי: 16GB פנויים מתוך דיסק של 926GB, והחלפת הזיכרון לדיסק (swap) עמדה על 94% מהתקרה שלה. הדבר הראשון שעושים במצב כזה הוא לרוץ לתיקיית ההורדות. אז רצתי. ההורדות, המסמכים ושולחן העבודה יחד תפסו 2GB. פחות מרבע אחוז מהדיסק.

המקום היה במקומות אחרים לגמרי — במקומות שאף כלי ניקוי מדף לא מסתכל עליהם, כי הם לא קיימים במחשב רגיל. הם קיימים רק במחשב שסוכני Claude Code עובדים עליו כל היום. זה מה שמצאנו, מה בטוח למחוק ומה אסור, ואיך הפכנו את הניקוי לשגרה שרצה לבד כל לילה.

מה באמת תפס את המקום

אחרי שעה של מדידה, הייתה לנו טבלה שאף אחד לא ציפה לה:

  • עותקי עבודה של git (worktrees) — רוב ה-233GB של תיקיית הקוד. 774 תיקיות בשם *-wt-*, עד 1GB כל אחת. כל סוכן שמקבל משימה פותח לעצמו עותק עבודה מקושר של המאגר, עובד בו, פותח בקשת מיזוג — ולא מוחק אותו אף פעם. 500 מהתיקיות האלה לא נגעו בהן יותר משבוע.
  • שיבוטים שנשארו מהתקנת תוספים — 34GB. 937 תיקיות temp_git_* במטמון התוספים של Claude Code. כל התקנה משבטת את המאגר, ושום דבר לא מנקה אחריה.
  • פרופילי דפדפן של הסוכנים — 7GB. 46 פרופילים של Playwright, אחד לכל אתר שסוכן מתחבר אליו. חצי מזה מטמון של Chromium שמתחדש לבד, חצי מידע התחברות שאסור לגעת בו.
  • תוצרי בנייה של Xcode — 6GB. DerivedData, שנבנה מחדש בבנייה הבאה.
  • תמלילי שיחות של Claude Code — 13GB. כל שיחה נשמרת. Claude Code מנקה אותם בעצמו לפי הגדרה בשם cleanupPeriodDays, שברירת המחדל שלה היא 30 יום.

שימו לב למה לא ברשימה: תמונות, סרטונים, קבצים אישיים. שום דבר שבן אדם יצר. הכול תוצר לוואי של סוכנים שעובדים נכון — אבל בלי מישהו שמסדר אחריהם.

קודם מודדים, אחר כך מוחקים

הפיתוי הוא להתחיל למחוק. התנגדנו לו, ושני דברים הצילו אותנו.

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

השני: פרופיל דפדפן הוא כניסה, לא מטמון. תיקיית playwright-linkedin היא החיבור של הסוכן ל-LinkedIn. למחוק אותה אומר שמישהו צריך להתחבר מחדש ידנית, עם אימות דו-שלבי ובדיקות נגד בוטים. לכן מחקנו רק את תיקיות המטמון שבתוך הפרופיל — Cache, Code Cache, GPUCache, מטמון ה-Service Worker — ואת העוגיות, ה-Local Storage וה-IndexedDB לא נגענו בכלל. פרופיל שדפדפן פתוח עליו כרגע דילגנו עליו לגמרי.

מה בטוח למחוק, ומה לא

הכלל שהתגבש פשוט: מוחקים רק מה שמתחדש לבד או שכבר קיים במקום אחר.

  • DerivedData של Xcode — כן, אבל לא בזמן שבנייה רצה.
  • שיבוטי התקנה של תוספים שגילם מעל יממה — כן.
  • תיקיות מטמון בתוך פרופילי דפדפן — כן. מידע התחברות — לעולם לא.
  • מטמוני מודלים שאפשר להוריד מחדש (whisper, למשל) — כן, אם אף תהליך לא משתמש בהם.
  • עותקי עבודה של git — רק אם הם ישנים, נקיים, לא בשימוש, וכל הקומיטים שלהם כבר בשרת.
  • סימולטורים של iOS, קבצי תמיכה של המכשיר המחובר, כל דבר תחת System או Library של המערכת — לא.
  • sudo — אף פעם. אין שום דבר ברשימה שדורש הרשאות מנהל, וזה בדיוק הסימן שהרשימה נכונה.

השגרה היומית

ניקוי חד-פעמי לא פותר כלום — הסוכנים ממשיכים לעבוד מחר, והדיסק מתמלא שוב. אז כתבנו את הכללים האלה כסקריפט, והגדרנו LaunchAgent שמריץ אותו כל לילה ב-04:30 בעדיפות נמוכה, עם יומן שמתעד מה נמחק ומה נשמר ולמה.

הריצה הראשונה: 420 עותקי עבודה נמחקו, 133GB חזרו, 80 תיקיות נשמרו עם הסיבה ליד כל אחת. יחד עם שאר הקטגוריות, המחשב עבר מ-16GB פנויים ל-219GB באותו בוקר. ואת cleanupPeriodDays הורדנו ל-14, כך שתמלילי השיחות לא יצטברו מעבר לשבועיים.

שלוש מלכודות שתפסנו בדרך, ושווה להכיר:

  1. launchd לא נותן לסקריפט PATH. סקריפט שעובד בטרמינל נכשל בשקט כשהוא רץ מתוזמן, כי launchd לא מכיר את תיקיות Homebrew ולפעמים גם לא את /usr/sbin. הפתרון: PATH מפורש בקובץ ה-plist, ונתיבים מוחלטים לכל פקודת מערכת.
  2. הרשומה .git בעותק עבודה מקושר היא קובץ, לא תיקייה. הבדיקה הנפוצה [ -d .git ] מחזירה שקר בדיוק על התיקיות שרצינו לזהות.
  3. מיזוג מסוג squash מכניס את התוכן לענף הראשי בלי שהקומיט המקורי יהיה אב קדמון שלו. בדיקת "האם הקומיט בשרת" לבדה הייתה משאירה עשרות תיקיות שכבר מוזגו. לכן בודקים גם מול רשימת בקשות המיזוג שמוזגו.

וזה כבר תוסף

מכיוון שיש לנו יותר ממחשב אחד שמריץ סוכנים — ומכיוון שזו בעיה שכל מי שמריץ Claude Code ברצינות יפגוש — ארזנו את השגרה כתוסף פתוח בשם mac-agent-hygiene. הוא כולל שרת MCP עם ארבעה כלים: hygiene_status לקריאת המצב, hygiene_plan לריצה יבשה שמציגה כל מועמד למחיקה עם הסיבה, hygiene_apply שמבצע רק את מה שתוכנן ואושר במפורש, ו-hygiene_schedule שמתקין את הריצה היומית. כשמריצים אותו ידנית, שום דבר לא נמחק בלי תוכנית ואישור; הריצה הלילית מפעילה את אותם כללים בדיוק, אוטומטית. בכל מקרה, כל פריט נבדק שוב ברגע הביצוע.

ההתקנה היא שתי פקודות ב-Claude Code:

/plugin marketplace add MSApps-Mobile/claude-plugins
/plugin install mac-agent-hygiene@msapps-plugins

התוסף, כמו שאר התוספים הפתוחים שלנו, מתועד בעמוד claudeservices.ai/plugins, והקוד נמצא ב-GitHub. אם זה החיבור הראשון שלכם לחנות התוספים שלנו, כתבנו גם על שאר התוספים ומה הם עושים.

מה לקחת מזה

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

רוצים שנסתכל יחד על הסביבה שלכם או על הסוכנים שאתם מתכננים? דברו איתנו או שלחו הודעה ב-WhatsApp.

← לכל המאמרים