# שומר הסשנים: גרסה לשיתוף

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

## הבעיה

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

```
API Error: JSON Parse error: Unexpected EOF
```

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

**מי שנמצא מאחורי מסנן תוכן** (אצלנו נטפרי) רואה את זה הרבה יותר. מדידה על
47,000 קריאות מ-1.9.2026 עד 14.9.2026 העלתה:

- **1.5% מהקריאות נקטעו**, ובימים גרועים בין 4% ל-7%.
- **הקטיעה שייכת לחיבור ולא לסשן.** ב-108 מתוך 115 קטיעות באותו יום, סשן
  אחר קיבל תשובה תקינה באותה דקה.
- **הסיכון עולה עם משך התור**, מ-0.03% לשנייה בחמש השניות הראשונות ועד
  כ-0.25% לשנייה מ-20 שניות והלאה. תור של דקה נקטע בכ-10% מהמקרים.
- **מה שלא נמצא כגורם:** גודל ההקשר, גודל הבקשה, גודל פלט הכלי, אורך
  התשובה ושעת היום. לכן ההנחיה לסשן שנקטע חוזר ונשנה היא לקצר את התור
  **בזמן**, ולא להקטין פלטים.
- **בשני שליש מהמקרים** החיבור נסגר בדיוק במעבר מהחשיבה לתשובה הגלויה.
  התוכן שאבד הוא אפס, ולכן "המשך מהמקום שבו עצרת" הוא הוראה נכונה.

**אין ניסיון חוזר אוטומטי:** Claude Code מנסה שוב לבד רק בכשל שהוא מזהה
כניתוק חיבור. כאן שורת SSE נקטמת באמצע, הפענוח נכשל, והכשל מסווג כשגיאה
לא ידועה שמסיימת את התור. hook מסוג `StopFailure` כן רץ, אבל הפלט שלו
נזרק, ולכן הסשן אינו יכול להחיות את עצמו.

**הפתרון בשורש** הוא אצל המסנן: להחריג את `api.anthropic.com` מסריקת תוכן.
כל השאר הוא צמצום נזק.

## מה הפתרון עושה

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

| סוג   | הזיהוי                                    | התגובה                                                     |
| ----- | ----------------------------------------- | ---------------------------------------------------------- |
| קטיעה | `Unexpected EOF`, `JSON Parse error`      | הודעת המשך. שום תוכן לא אבד.                               |
| מגבלה | `session limit`, `reached your ... limit` | **לא שולחים.** מדווחים למשתמש מתי החשבון נפתח.             |
| חסימה | `API Error: 418` עם דף חסימה              | מזהירים את הסשן להימנע מהפעולה שהפילה אותו ולא לחזור עליה. |

**מה זה הרוויח אצלנו:** בבוקר אחד 19 החייאות בחמישה סשנים, כולן החזירו את
הסשן לעבודה. בשני סשנים שנפלו ברצף הפער בין הקטיעות התארך אחרי שההודעה
כללה הנחיה לקצר את התור, מ-40 שניות לכמה עשרות דקות. זו תצפית ולא ניסוי,
וייתכן שחלק מהשיפור נובע מהחלפת החיבור.

## דרישות הקדם, לקרוא לפני שמנסים

- **אפליקציית הדסקטופ של Claude Code.** המנגנון נשען על כלים שמאפשרים
  לסשן לראות סשנים אחרים ולשלוח להם הודעה (`list_sessions`,
  `send_message`). בהרצה מהטרמינל הם אינם קיימים.
- **לא בסשן מתוזמן.** שליחת הודעה חסומה בסשנים שרצים בלי השגחה, ולכן
  השומר אינו יכול להיות רוטינה. הוא חייב להיות סשן פתוח.
- **Node.js** להרצת הסקריפט.
- הסקריפט קורא את תיקיית התמלילים `~/.claude/projects` בלבד. הוא אינו
  כותב לשום מקום ואינו נוגע בקוד.

## התקנה

1. העתיקו את `session-guard.mjs` מהריפו של הכלי (`scripts/session-guard.mjs`)
   לאיזו תיקייה שתרצו. הקובץ כללי ואין בו שום תלות בפרויקט, ולכן לא שמרנו
   כאן עותק שני שיתיישן.
2. העתיקו את `SKILL.md` שבתיקייה הזו אל `.claude/skills/session-guard/SKILL.md`
   בריפו שלכם, ועדכנו בו את הנתיב לסקריפט.
3. פתחו סשן חדש וכתבו `/session-guard`.

## איך זה מוצא את הסשנים

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

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

## מגבלות ידועות

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