מסלול-יקיצה יחיד להערת-יו"ר — יישור כלל-הניתוב ל-needs_ceo_run (legal-ai #772) #16

Open
opened 2026-09-10 14:21:32 +00:00 by chaim · 0 comments
Owner

What & Why

ב-10.09.2026 הערת-יו"ר בודדת על CMP-324 הפעילה שתי ריצות-CEO במקביל שרצו 18 דקות זו לצד זו, יצרו שני issues לכותב על אותו בלוק, שתי רשומות chair_feedback, ושני ייצואי DOCX זהים. תיעוד מלא: legal-ai #772.

הראיה המדודה (Paperclip DB, סוכן 752cebdd)

reason payload.issueId requested_at (IL) run
issue_commented (נייטיבי) 29f937ca (CMP-324) 15:40:09.947 3aea82f1
user_commented_on_CMP-324 (הפלאגין) NULL 15:40:27.241 8ac0f2bb

מחרוזת ה-reason היא בדיוק הפורמט של routeCommentToCeo (src/worker.ts:707), כלומר המקור השני הוא ctx.agents.invoke של הפלאגין.

סיבת-השורש

src/worker.ts:801-812 מדלג על הניתוב רק כאשר issue.assigneeAgentId === ceoAgentId וגם payload.reopened === true.

  • CMP-321 היה done → ההערה פתחה אותו מחדש → reopened=true → הפלאגין דילג. תקין.
  • CMP-324 היה in_review (פתוח, משויך ל-CEO) → אין reopened → הפלאגין ניתב בנוסף ליקיצה הנייטיבית.

הכלל הנכון כבר קיים ומדוד בצד legal-aiweb/paperclip_client.py:714 needs_ceo_run():

Paperclip's native delivery wakes the issue's assignee. Measured on the live Paperclip DB (120 days): agent-owned + open → 70/70 chair comments produced a wakeup on the same issue. Human-owned/unassigned → the wakeup targets a person and is cancelled. Closed → Paperclip skips the wakeup entirely.

כלומר: פותחים מסלול-מסירה משלנו בדיוק במקום שבו הנייטיבי מת — issue סגור, או issue שאינו משויך לסוכן. הפלאגין מממש כלל שני, צר יותר, לאותה החלטה — וזה ה-drift (G2).

Acceptance Criteria

  • issue.comment.created בפלאגין מדלג על ctx.agents.invoke בכל issue פתוח (status שאינו done/cancelled) שמשויך לסוכן — לא רק כשה-reopened===true. הסימון (markCommentRouted) נשאר, כדי שה-sweep לא ישחזר את הכפילות.
  • הכלל נגזר מ-needs_ceo_run ואינו מועתק כניסוח שלישי — או ע"י קריאה ל-legal-ai, או ע"י הערה מפורשת בקוד שמצביעה למקור-האמת ומתעדת שכל שינוי שם מחייב שינוי כאן.
  • issue שמשויך לאדם או שאינו משויך → הניתוב נשאר כמו היום (שם הנייטיבי מת — זו כל הסיבה שהמסלול קיים, #164/#454).
  • טסט-יחידה: issue פתוח משויך-CEO ללא reopenedאין agents.invoke, יש markCommentRouted.
  • טסט-יחידה: issue משויך-אדם → יש agents.invoke.
  • אחרי מיזוג — build + pm2 restart paperclip, ואימות חי: הערת-יו"ר על issue פתוח משויך-CEO מייצרת wakeup אחד ב-agent_wakeup_requests.

הערה

ctx.agents.invoke ב-SDK מקבל {prompt, reason} בלבד (@paperclipai/plugin-sdk/dist/types.d.ts:1199) — אין אפשרות ל-scope את הריצה ל-issue. לכן "לא לירות כשהנייטיבי מכסה" הוא הפתרון היחיד בצד-הלקוח; ריצה לא-scoped נחסמת ממילא מכל כתיבת-בקרה (cross_issue_influence_run_context_required) ואינה יכולה אפילו לקבוע blockedByIssueIds.

## What & Why ב-10.09.2026 הערת-יו"ר בודדת על CMP-324 הפעילה **שתי ריצות-CEO במקביל** שרצו 18 דקות זו לצד זו, יצרו שני issues לכותב על אותו בלוק, שתי רשומות `chair_feedback`, ושני ייצואי DOCX זהים. תיעוד מלא: [legal-ai #772](https://gitea.nautilus.marcusgroup.org/ezer-mishpati/legal-ai/issues/772). ### הראיה המדודה (Paperclip DB, סוכן 752cebdd) | reason | payload.issueId | requested_at (IL) | run | |---|---|---|---| | `issue_commented` (נייטיבי) | `29f937ca` (CMP-324) | 15:40:09.947 | `3aea82f1` | | `user_commented_on_CMP-324` (הפלאגין) | **NULL** | 15:40:27.241 | `8ac0f2bb` | מחרוזת ה-reason היא בדיוק הפורמט של `routeCommentToCeo` (`src/worker.ts:707`), כלומר המקור השני הוא `ctx.agents.invoke` של הפלאגין. ### סיבת-השורש `src/worker.ts:801-812` מדלג על הניתוב רק כאשר `issue.assigneeAgentId === ceoAgentId` **וגם** `payload.reopened === true`. - CMP-321 היה `done` → ההערה פתחה אותו מחדש → `reopened=true` → הפלאגין דילג. תקין. - CMP-324 היה `in_review` (פתוח, משויך ל-CEO) → אין `reopened` → הפלאגין ניתב **בנוסף** ליקיצה הנייטיבית. **הכלל הנכון כבר קיים ומדוד בצד legal-ai** — `web/paperclip_client.py:714` `needs_ceo_run()`: > Paperclip's native delivery wakes the issue's *assignee*. Measured on the live Paperclip DB (120 days): agent-owned + open → **70/70** chair comments produced a wakeup on the same issue. Human-owned/unassigned → the wakeup targets a person and is cancelled. Closed → Paperclip skips the wakeup entirely. כלומר: **פותחים מסלול-מסירה משלנו בדיוק במקום שבו הנייטיבי מת** — issue סגור, או issue שאינו משויך לסוכן. הפלאגין מממש כלל שני, צר יותר, לאותה החלטה — וזה ה-drift (G2). ## Acceptance Criteria - [ ] `issue.comment.created` בפלאגין מדלג על `ctx.agents.invoke` **בכל** issue פתוח (`status` שאינו `done`/`cancelled`) שמשויך לסוכן — לא רק כשה-`reopened===true`. הסימון (`markCommentRouted`) נשאר, כדי שה-sweep לא ישחזר את הכפילות. - [ ] הכלל נגזר מ-`needs_ceo_run` ואינו מועתק כניסוח שלישי — או ע"י קריאה ל-legal-ai, או ע"י הערה מפורשת בקוד שמצביעה למקור-האמת ומתעדת שכל שינוי שם מחייב שינוי כאן. - [ ] issue שמשויך ל**אדם** או שאינו משויך → הניתוב נשאר כמו היום (שם הנייטיבי מת — זו כל הסיבה שהמסלול קיים, #164/#454). - [ ] טסט-יחידה: issue פתוח משויך-CEO ללא `reopened` → **אין** `agents.invoke`, **יש** `markCommentRouted`. - [ ] טסט-יחידה: issue משויך-אדם → **יש** `agents.invoke`. - [ ] אחרי מיזוג — build + `pm2 restart paperclip`, ואימות חי: הערת-יו"ר על issue פתוח משויך-CEO מייצרת **wakeup אחד** ב-`agent_wakeup_requests`. ## הערה `ctx.agents.invoke` ב-SDK מקבל `{prompt, reason}` בלבד (`@paperclipai/plugin-sdk/dist/types.d.ts:1199`) — **אין** אפשרות ל-scope את הריצה ל-issue. לכן "לא לירות כשהנייטיבי מכסה" הוא הפתרון היחיד בצד-הלקוח; ריצה לא-scoped נחסמת ממילא מכל כתיבת-בקרה (`cross_issue_influence_run_context_required`) ואינה יכולה אפילו לקבוע `blockedByIssueIds`.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/plugin-legal-ai#16