ג'וזי לאתר ג'וזי ←
הבלוג של ג'וזי · הנדסה
מהשטח · חלק שני

השורה הכי משעממת בזיכרון של הצוות שלי. וגם היקרה ביותר

בפוסט הקודם כתבתי ש"הזיכרון הוא הנכס, לא הסוכנים", ואז המשכתי הלאה בלי להראות אף שורה ממנו. אז הנה שורה אחת, והנה הבאג שבגללו שכתבתי את כל הפרוטוקול.

י״ר
ישראל רוטCTO ומייסד־שותף, ג'וזי · 14 באוגוסט 2026
דגם תלת־ממד של מוח אנושי, בגוני אפור, על רקע בהיר
אני יודע — תמונה של מוח, בפוסט על AI. שמתי אותה כאן בכוונה, כי המסקנה של הפוסט הפוכה בדיוק: מה שהפך את הסוכנים שלי לצוות הוא לא משהו שדומה למוח. אלה קבצי טקסט משעממים בגיט.

Image by TheDigitalArtist from Pixabay

נתחיל בשורה עצמה. היא עוסקת בהתנהגות של סינון (filter) במסד הנתונים שלנו — מונגו (MongoDB) — והיא אומרת בערך כך: כשמוסיפים שדה חדש למודל, כל המסמכים שנוצרו לפני כן פשוט לא מכילים אותו, וסינון לפי ערך לעולם לא ימצא אותם. לא "לא שווה אמת", לא "שונה מ־אמת", לא שום ניסוח אחר. אפס תוצאות. הדרך היחידה למצוא אותם היא לשאול אם השדה קיים בכלל.

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

בפעם השנייה זה קרה גם בווב וגם במובייל, כי אותה הנחה שגויה נכתבה פעמיים. אין כמו עקביות.

למה זה לא ויקי

הרפלקס הטבעי הוא "אז תכתבו את זה בתיעוד". ניסיתי. תיעוד הוא מקום שבו כותבים דברים כדי להרגיש טוב, לא כדי לקרוא אותם.

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

.claude/agent-memory/discovery-engineer/journal/2026-08-13-music-service-taste-import-closed.md
# Reading user listening habits from Spotify / Apple Music is closed off (2026-08-13) Investigated for an onboarding initiative: connect Spotify or Apple Music at signup, pull listening history, seed a taste profile. Don't — three independent blockers. Recording the findings so this isn't re-researched from scratch.

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

01משימה נגמרתהסוכן מסכם
02רשומת לקחמה למדתי, לא מה עשיתי
03קובץ חדשביומן, בעותק הראשי
04זיקוקמעבר יחיד, כותב יחיד
05קיצוץחזרה מתחת לתקציב
06טעינהאוטומטית, בכל התעוררות

הזיכרון של הצוות, במספרים

מדדכמותנכון ל־13.8.2026
רשומות יומן שנכתבו מאז 2 ביולי256
קבצי נושא מזוקקים109
שורות של זיכרון מתוחזק1,019
תיקים אישיים13
תקרה לתיק זיכרון ראשי~200 שורות

ספירה ישירה מהריפוזיטורי. "רשומת יומן" = קובץ לקחים בודד שנכתב בסוף משימה; "קובץ נושא" = מה שנשאר אחרי הזיקוק. היחס בין השניים הוא לא בזבוז — הוא כל העבודה.

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

והתקרה הזאת היא גם מקור כל הצרות. מיד אסביר למה.

הבאג שגרם לי לשכתב את כל הפרוטוקול

תקציב קשיח אומר שהזיכרון לא נכתב בהוספה (append). הוא נכתב בכתיבה מחדש: שורות מתמזגות, מתקצרות, זזות ממקום למקום.

עכשיו הוסיפו לזה שאני מריץ שלוש עד חמש עבודות במקביל, כל אחת בעותק עבודה נפרד של הקוד (git worktree) ועל ענף משלה (branch). שתי עבודות שונות שמזקקות את אותו קובץ זיכרון לא מייצרות התנגשות מיזוג (merge conflict) שגיט יודע לפתור — הן מייצרות התנגשות של משמעות. שתי הגרסאות תקינות תחבירית. שתיהן נראות סבירות. ומי שמיישב ביניהן בוחר, בלי לדעת, איזו עובדה שורדת.

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

אותה שורה שגויה · שישה תיקי זיכרון · מתי כל אחד תוקן
ארכיטקט
פלטפורמה
מעורבות
אירועים
צמיחה
זהות
02/07נכתבה 25/07תוקנה אצל שניים 12/08זיקוק
הגרסה השגויה פעילה ונטענת תוקן

שניים מהסוכנים קיבלו את התיקון ב־25 ביולי, בשתי בקשות משיכה נפרדות שנחתו במקרה באותו יום. ארבעת האחרים המשיכו להתעורר עם הגרסה השגויה עוד שמונה־עשר יום, עד שמעבר הזיקוק ניקה אותה מכולם בבת אחת.

הזיכרון לא רק נכשל במניעת באג. הוא החזיר לחיים באג שכבר שילמנו עליו וקברנו

ובאותו 25 ביולי, על אותו קובץ עצמו, קיבלתי גם את הכשל השני — זה שלקח לי עשר דקות לזהות: בקשת משיכה (Pull Request) שלא רצות עליה בדיקות בכלל. לא נכשלות — לא קיימות. נראה בדיוק כמו תקלה בשירות הבדיקות (CI).

25 ביולי · שני כותבים · קובץ זיכרון אחד
mainסשן אחר, מיזג ישירות
PR #183ענף משלו
✕ התנגשות
אותו קובץ, אותו יום. גיטהאב לא מצליח לחשב את המיזוג, ולכן לא מייצר הרצות בכלל — 0 בדיקות, ולא בדיקה אחת אדומה שאפשר ללכת לפיה.

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

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

התיקון היה מטופש עד כדי עלבון

זיכרון לא שייך לעותק המבודד של הסוכן.

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

בלי לתכנן את זה מראש, הפרדתי כתיבה מקריאה: היומן הוא תוסף־בלבד (append-only), קבצי הנושא הם נתיב הקריאה המהיר. מפתחים יזהו את התבנית. אני גיליתי אותה מחדש בדרך הקשה, אחרי שהפסדתי בדיוק עובדה אחת.

והיום זה נאכף, לא מבוקש:

02/07/26 הקמת הצוות. הזיכרון נכתב ישירות לקבצים, מכל מקום
25/07/26 הפרוטוקול נשבר במקביליות ונכתב מחדש: יומן בלבד, בעותק הראשי
28/07/26 חסימה אוטומטית של כתיבה לזיכרון מתוך עותק צדדי
13/08/26 תיבת דואר יוצא לסשנים מבודדים, וזיקוק שנפתח אוטומטית בסף

כל אחד מהתאריכים האלה הוא כלל שנוסף אחרי כישלון, בדיוק בסדר הזה. אף אחד מהם לא נכתב מראש.

מה שבאמת שווה כסף

התוכן ברשומות הוא לא ידע. ידע יש לסוכנים בשפע, ואת רובו הם יודעים טוב ממני.

מה שיש שם זה ידע מקומי (local knowledge): ששרתי הייצור אצלנו נושאים שם שנשמע כמו סביבת פיתוח, ואסור להסיק מהשם כלום. שמדד זמן מסוים בלוגים שלנו לא מודד את מה שכתוב בשמו. שתהליך רקע מסוים עלול, בכיבוי לא מסודר, להשתיק את כל מיילי ההתראות של המערכת בלי שאף אחד ישים לב.

זה בדיוק הידע שעובד חדש לא יכול להביא איתו, ושעובד ותיק לוקח איתו כשהוא עוזב. ההבדל היחיד הוא שאצלי הוא בגיט, ואפשר לראות מתי הוא נכתב ועל חשבון איזה באג.

שורת זיכרון היא באג ששילמנו עליו פעם אחת. בלי זיכרון משלמים עליו כל שבוע מחדש. עם זיכרון שאי אפשר לתקן — משלמים עליו לנצח

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

וזאת, אם כבר, המקבילה הכי מדויקת שמצאתי בין תיק זיכרון של סוכן לבין עובד ותיק: על שניהם נוטים לסמוך קצת יותר מדי. ההבדל היחיד הוא שאת אחד מהם אפשר לפתוח ולמחוק ממנו שורה.
הנתונים הכמותיים בפוסט נמדדו ישירות מהריפוזיטורי של ג'וזי ב־13 באוגוסט 2026 וניתנים לשחזור. הפוסט הקודם בסדרה: יש לי 13 מהנדסים בצוות. אף אחד מהם לא בן אדם.