feat(case-ui): agents tab v2 + dismiss/reaper for stale interactions (#215) #388

Merged
chaim merged 1 commits from worktree-agents-tab-v2 into main 2026-06-30 20:38:16 +00:00
Owner

מה זה עושה

עיצוב-מחדש של טאב-הסוכנים (מוקאפ 18i v2, מאושר ב-Claude Design) + תיקון-מקור להצטברות issue_thread_interactions במצב pending (TaskMaster #215).

UI — agent-activity-feed.tsx

  1. רוסטר-סוכנים בשורה אחת — כרטיסים קומפקטיים (grid-cols-9); הוסרה שורת "מה הסוכן עושה עכשיו" (היא שייכה תגובה לפי role-fallback → סוכנים בעלי אותו תפקיד הציגו טקסט זהה).
  2. כל אירוע "ממתין לתשובתך" = אקורדיון (הראשון פתוח).
  3. כפתור "התעלם" לכל בקשה ממתינה — מבטל שאלה כפולה/מיושנת בלי להעיר את הסוכן.
  4. ציר-הזמן מקובץ לפי משימה (issue), כל קבוצה אקורדיון עם מזהה+סטטוס+מונה.

Backend — מניעת הצטברות (#215)

  • cancel_interaction — ביטול interaction בודד ישירות ל-cancelled, ללא wake_assignee (resolve רגיל מעיר את הסוכן). אומת: אין triggers על הטבלה.
  • reap_stale_interactions — reaper שמבטל pending על issues סגורים (done/cancelled) — המקור הדומיננטי לערימה. רץ כל 15 דק' ב-lifespan.
  • POST /api/cases/{case}/agents/interaction-dismiss (מאחורי כפתור "התעלם").

supersede-at-creation נדחה (תועד ב-#215): ביטול-אוטומטי של שאלה על issue פעיל אחד על-פני אחר אינו דטרמיניסטי; הליבה הבטוחה = reaper-ליתומים + כפתור-ביטול, והשורש הוא ריסון לולאות-recovery.

Invariants

  • G12 — כל מגע-Paperclip דרך agent_platform_port (cancel/reap נחשפים שם).
  • G2 — אין מסלול מקביל; מרחיב את endpoints הסוכנים הקיימים.
  • §6 — אין בליעת-שגיאות שקטה: הביטול מחזיר {ok,error}, ה-reaper מתעד warning.

בדיקות

  • tsc --noEmit · eslint · py_compile (אין venv ל-legal-ai במארח; build מלא ב-CI/Coolify).
  • ניקוי ידני קודם הוכיח את מנגנון הביטול: 37→8 pending.

🤖 Generated with Claude Code

## מה זה עושה עיצוב-מחדש של טאב-הסוכנים (מוקאפ **18i v2**, מאושר ב-Claude Design) + תיקון-מקור להצטברות `issue_thread_interactions` במצב `pending` (TaskMaster **#215**). ### UI — `agent-activity-feed.tsx` 1. **רוסטר-סוכנים בשורה אחת** — כרטיסים קומפקטיים (`grid-cols-9`); **הוסרה שורת "מה הסוכן עושה עכשיו"** (היא שייכה תגובה לפי `role`-fallback → סוכנים בעלי אותו תפקיד הציגו טקסט זהה). 2. **כל אירוע "ממתין לתשובתך" = אקורדיון** (הראשון פתוח). 3. **כפתור "התעלם"** לכל בקשה ממתינה — מבטל שאלה כפולה/מיושנת **בלי להעיר את הסוכן**. 4. **ציר-הזמן מקובץ לפי משימה (issue)**, כל קבוצה אקורדיון עם מזהה+סטטוס+מונה. ### Backend — מניעת הצטברות (#215) - `cancel_interaction` — ביטול interaction בודד ישירות ל-`cancelled`, ללא `wake_assignee` (resolve רגיל מעיר את הסוכן). אומת: אין triggers על הטבלה. - `reap_stale_interactions` — reaper שמבטל `pending` על issues סגורים (`done`/`cancelled`) — המקור הדומיננטי לערימה. רץ כל 15 דק' ב-`lifespan`. - `POST /api/cases/{case}/agents/interaction-dismiss` (מאחורי כפתור "התעלם"). `supersede-at-creation` **נדחה** (תועד ב-#215): ביטול-אוטומטי של שאלה על issue פעיל אחד על-פני אחר אינו דטרמיניסטי; הליבה הבטוחה = reaper-ליתומים + כפתור-ביטול, והשורש הוא ריסון לולאות-recovery. ## Invariants - **G12** — כל מגע-Paperclip דרך `agent_platform_port` (cancel/reap נחשפים שם). - **G2** — אין מסלול מקביל; מרחיב את endpoints הסוכנים הקיימים. - **§6** — אין בליעת-שגיאות שקטה: הביטול מחזיר `{ok,error}`, ה-reaper מתעד `warning`. ## בדיקות - `tsc --noEmit` ✅ · `eslint` ✅ · `py_compile` ✅ (אין venv ל-legal-ai במארח; build מלא ב-CI/Coolify). - ניקוי ידני קודם הוכיח את מנגנון הביטול: 37→8 pending. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-30 20:37:47 +00:00
feat(case-ui): agents tab v2 + dismiss/reaper for stale interactions (#215)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 3s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
581a4ba36f
מוקאפ 18i v2 (מאושר ב-Claude Design) + תיקון-מקור להצטברות pending interactions.

UI (agent-activity-feed.tsx):
- רוסטר-סוכנים קומפקטי, כל הסוכנים בשורה אחת (grid-cols-9); הוסרה שורת
  "מה הסוכן עושה עכשיו" — היא שייכה תגובה לפי role-fallback, כך שסוכנים
  בעלי אותו תפקיד הציגו טקסט זהה.
- כל אירוע "ממתין לתשובתך" מקופל כאקורדיון (הראשון פתוח).
- כפתור "התעלם" לכל בקשה ממתינה — מבטל שאלה כפולה/מיושנת בלי להעיר את הסוכן.
- ציר-הזמן מקובץ לפי משימה (issue), כל קבוצה אקורדיון עם מזהה+סטטוס+מונה.

Backend (#215 — מניעת הצטברות pending):
- cancel_interaction: ביטול interaction בודד ישירות ל-cancelled, ללא
  wake_assignee (resolve רגיל היה מעיר את הסוכן). אין triggers על הטבלה.
- reap_stale_interactions: reaper שמבטל pending על issues סגורים
  (done/cancelled) — המקור הדומיננטי לערימה. רץ כל 15 דק' ב-lifespan.
- endpoint POST /api/cases/{case}/agents/interaction-dismiss (מאחורי כפתור
  "התעלם"). הכל דרך agent_platform_port (G12).

supersede-at-creation נדחה (תועד ב-#215): ביטול-אוטומטי של שאלה על issue
פעיל אחד על-פני אחר אינו דטרמיניסטי; הליבה הבטוחה = reaper-ליתומים +
כפתור-ביטול, והשורש האמיתי הוא ריסון לולאות-recovery של Paperclip.

Invariants: מקיים G12 (מגע-Paperclip רק דרך הפורט), G2 (אין מסלול מקביל —
מרחיב את endpoints הסוכנים הקיימים), §6 (אין בליעת-שגיאות שקטה — הביטול
מחזיר {ok,error}, ה-reaper מתעד warning).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 9d88255050 into main 2026-06-30 20:38:16 +00:00
chaim deleted branch worktree-agents-tab-v2 2026-06-30 20:38:16 +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#388