fix(routing): הוראת-יו"ר תעבוד בדרך הטבעית — הערה פותחת הרצת-CEO #415

Merged
chaim merged 1 commits from worktree-natural-comment-routing into main 2026-07-16 12:33:29 +00:00
Owner

הבעיה

היו"ר כותב הוראה על תיק — והסוכן "מתעלם". ההרצה מדווחת succeeded / exit_code=0, בלי שגיאה, ואפילו עולה כסף. זו הסיבה שזה שרד חודשים בלי שאף אחד שם לב.

שתי סיבות-שורש בלתי-תלויות — שתיהן מאומתות מול ה-DB והלוגים

  1. ה-wakeup הישיר מבוטל תמיד. תיק שממתין ליו"ר הוא in_review ומשויך לאדם. Paperclip עונה issue_assignee_changed → "אעיר את הבעלים החדש" → הבעלים הוא אדם → אף סוכן לא מתעורר.
  2. רשת-הביטחון בולעת את ההוראה. ה-sweep בפלאגין מוסר אותה כ-payload.prompt, וה-runner קורא רק payload.issueId.

מדידה ב-DB: 18 מתוך 18 ה-wakeups שאי-פעם נשאו payload.prompt לא הגיעו לאף הרצה — 0% מסירה, מול 107,172 עם issueId שעובדים. אימות ישיר: בלוג-ההרצה שנבלעה (27KB) אפס אזכורים של מספר-התיק, והמודל פותח ב-"This heartbeat has no scoped wake payload".

התיקון

המסלול הטבעי (הערה בטאב-הסוכנים) מפרסם את ההערה בשרשור כרגיל וגם פותח הרצת-CEO עם ההוראה, דרך pc_open_ceo_run — הפרימיטיב היחיד שאומת כמגיע לסוכן. אותו תיקון ל-interaction-response, שסובל מאותה תקלה בדיוק (החצי השני של #228).

הוכחת-שטח: הרצתי את הפרימיטיב ידנית על 1043-02-26 → CMP-202. הסוכן עבד 25 דק' והרחיב את פרק טענות-הצדדים מ-3,212 ל-7,697 מילים. הניגוד מול המסלול השבור: לוג 538KB עם 12 אזכורי-תיק, מול 27KB ואפס.

Invariants

Invariant איך ה-PR מקיים
INV-G2 — מסלול קנוני אחד מסיר את ה-wakeup הנדון-לביטול מ-post_comment. הוא היה המסלול המקביל, זה ששותק. נשאר מסלול-מסירה אחד.
INV-G12 — שער-הפלטפורמה המגע החדש (mark_comment_routed) נחשף דרך agent_platform_port.py בלבד; leak_guard.py עובר.
§6 — אין בליעה שקטה כשל בפתיחת ההרצה מחזיר 502 מפורש ("ההערה נשמרה אך פתיחת ההרצה נכשלה") במקום 202 שקרי.

mark_comment_routed מסמן את ההערה כמנותבת כך שה-sweep לא יירה הרצת-סרק (~$1) על מה שכבר טופל — ה-CEO עונה על ה-issue-הילד, מה שמשאיר את ההורה בלי תשובת-סוכן ולכן "pending" לנצח בעיני ה-sweep.

למה בצד ה-backend ולא בפלאגין

ניסיתי קודם לתקן בפלאגין. זה נכשל: ctx.issues.requestWakeup מחזיר missing, expired, or unknown invocation scope מתוך scheduled job, למרות ש-capability issues.wakeup מוצהר ומותקן. אותה שגיאה מפילה גם companies.list/issues.list/listComments בתוך ה-sweep — כלומר רשת-הביטחון עצמה לא אמינה, והשגיאות קיימות מ-08:42, לפני שנגעתי בכלום. התיקון הזה יושב ב-REST של legal-ai ולכן אינו חשוף לבאג.

תיעוד

docs/paperclip-quirks.md §7 — כולל שתי מלכודות שנפלתי בהן: (א) issues.create של ה-SDK עם assigneeAgentId לא מעיר, בעוד ה-REST המקביל כן; (ב) באג ה-invocation-scope.

בדיקות

leak_guard.py ✓ · syntax + wiring של ה-Port ✓ · web/tests/test_comment_target.py נוגע רק ב-pick_default_comment_target ש��א שונתה. אין pytest על המארח (legal-ai רץ בקונטיינר) — אימות מלא מקצה-לקצה יבוצע אחרי הפריסה, בהערה אמיתית על תיק.

TaskMaster: legal-ai #228.

🤖 Generated with Claude Code

## הבעיה היו"ר כותב הוראה על תיק — והסוכן "מתעלם". ההרצה מדווחת `succeeded` / `exit_code=0`, בלי שגיאה, ואפילו עולה כסף. **זו הסיבה שזה שרד חודשים בלי שאף אחד שם לב.** ## שתי סיבות-שורש בלתי-תלויות — שתיהן מאומתות מול ה-DB והלוגים 1. **ה-wakeup הישיר מבוטל תמיד.** תיק שממתין ליו"ר הוא `in_review` ומשויך *לאדם*. Paperclip עונה `issue_assignee_changed` → "אעיר את הבעלים החדש" → הבעלים הוא אדם → אף סוכן לא מתעורר. 2. **רשת-הביטחון בולעת את ההוראה.** ה-sweep בפלאגין מוסר אותה כ-`payload.prompt`, וה-runner קורא **רק** `payload.issueId`. מדידה ב-DB: **18 מתוך 18** ה-wakeups שאי-פעם נשאו `payload.prompt` לא הגיעו לאף הרצה — 0% מסירה, מול 107,172 עם `issueId` שעובדים. אימות ישיר: בלוג-ההרצה שנבלעה (27KB) **אפס** אזכורים של מספר-התיק, והמודל פותח ב-*"This heartbeat has no scoped wake payload"*. ## התיקון המסלול הטבעי (הערה בטאב-הסוכנים) מפרסם את ההערה בשרשור כרגיל **וגם** פותח הרצת-CEO עם ההוראה, דרך `pc_open_ceo_run` — הפרימיטיב היחיד שאומת כמגיע לסוכן. אותו תיקון ל-`interaction-response`, שסובל מאותה תקלה בדיוק (החצי השני של #228). **הוכחת-שטח:** הרצתי את הפרימיטיב ידנית על 1043-02-26 → CMP-202. הסוכן עבד 25 דק' והרחיב את פרק טענות-הצדדים מ-3,212 ל-7,697 מילים. הניגוד מול המסלול השבור: לוג 538KB עם 12 אזכורי-תיק, מול 27KB ואפס. ## Invariants | Invariant | איך ה-PR מקיים | |---|---| | **INV-G2** — מסלול קנוני אחד | מסיר את ה-wakeup הנדון-לביטול מ-`post_comment`. הוא היה המסלול המקביל, זה ששותק. נשאר מסלול-מסירה אחד. | | **INV-G12** — שער-הפלטפורמה | המגע החדש (`mark_comment_routed`) נחשף דרך `agent_platform_port.py` בלבד; `leak_guard.py` עובר. | | **§6 — אין בליעה שקטה** | כשל בפתיחת ההרצה מחזיר 502 מפורש ("ההערה נשמרה אך פתיחת ההרצה נכשלה") במקום 202 שקרי. | `mark_comment_routed` מסמן את ההערה כמנותבת כך שה-sweep לא יירה הרצת-סרק (~$1) על מה שכבר טופל — ה-CEO עונה על ה-issue-הילד, מה שמשאיר את ההורה בלי תשובת-סוכן ולכן "pending" לנצח בעיני ה-sweep. ## למה בצד ה-backend ולא בפלאגין ניסיתי קודם לתקן בפלאגין. זה נכשל: `ctx.issues.requestWakeup` מחזיר `missing, expired, or unknown invocation scope` מתוך scheduled job, למרות ש-capability `issues.wakeup` מוצהר ומותקן. אותה שגיאה מפילה גם `companies.list`/`issues.list`/`listComments` בתוך ה-sweep — כלומר **רשת-הביטחון עצמה לא אמינה**, והשגיאות קיימות מ-08:42, לפני שנגעתי בכלום. התיקון הזה יושב ב-REST של legal-ai ולכן אינו חשוף לבאג. ## תיעוד `docs/paperclip-quirks.md` §7 — כולל שתי מלכודות שנפלתי בהן: (א) `issues.create` של ה-SDK עם `assigneeAgentId` **לא** מעיר, בעוד ה-REST המקביל כן; (ב) באג ה-invocation-scope. ## בדיקות `leak_guard.py` ✓ · syntax + wiring של ה-Port ✓ · `web/tests/test_comment_target.py` נוגע רק ב-`pick_default_comment_target` ש��א שונתה. אין pytest על המארח (legal-ai רץ בקונטיינר) — **אימות מלא מקצה-לקצה יבוצע אחרי הפריסה**, בהערה אמיתית על תיק. TaskMaster: `legal-ai` #228. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-07-16 12:33:22 +00:00
fix(routing): הוראת-יו"ר תעבוד בדרך הטבעית — הערה פותחת הרצת-CEO
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 37s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
f58ddba93e
**התסמין:** היו"ר כותב הוראה על תיק והסוכן "מתעלם". ההרצה מדווחת succeeded/exit 0
ואפילו עולה כסף — ולכן זה שרד חודשים בלי שמישהו שם לב.

**שתי סיבות-שורש בלתי-תלויות, שתיהן מאומתות:**

1. ה-wakeup הישיר על ה-issue של התיק מבוטל תמיד: תיק שממתין ליו"ר הוא `in_review`
   ומשויך *לאדם*, ו-Paperclip עונה `issue_assignee_changed` → "אעיר את הבעלים החדש"
   → הבעלים אדם → אף סוכן לא מתעורר.
2. רשת-הביטחון בפלאגין מוסרת את ההוראה כ-`payload.prompt`, וה-runner קורא רק
   `payload.issueId` — הפרומפט נבלע. 18/18 מדידה ב-DB: 0% מסירה, אי-פעם.

**התיקון:** המסלול הטבעי (הערה בטאב-הסוכנים) מפרסם את ההערה בשרשור כרגיל **וגם**
פותח הרצת-CEO עם ההוראה, דרך `pc_open_ceo_run` — הפרימיטיב היחיד שאומת כמגיע
לסוכן (הוכח היום על 1043-02-26: 3,212→7,697 מילים). אותו תיקון ל-interaction-response,
שסובל מאותה תקלה (החצי השני של #228).

**G2 — הסרת מסלול מקביל:** ה-wakeup הנדון-לביטול הוסר מ-`post_comment`; הוא היה
המסלול השני, זה ששותק. כעת מסלול-מסירה קנוני אחד. `mark_comment_routed` מסמן את
ההערה כמנותבת כדי שה-sweep לא יירה הרצת-סרק על מה שכבר טופל.

**G12 — שער-הפלטפורמה:** המגע החדש (`mark_comment_routed`) נחשף דרך
`agent_platform_port.py` בלבד; leak-guard עובר.

התיקון יושב ב-backend (REST) ולא בפלאגין, ולכן אינו חשוף לבאג ה-invocation-scope
שמפיל את ה-sweep. תועד ב-docs/paperclip-quirks.md §7 עם המלכודות שנתקלנו בהן.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 4d227a4999 into main 2026-07-16 12:33:29 +00:00
chaim deleted branch worktree-natural-comment-routing 2026-07-16 12:33:29 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#415