fix(sync): sync-case-status יכתוב רק על issue-שורש פתוח (legal-ai #446) #8

Merged
chaim merged 1 commits from fix/446-sync-target-root-issue into main 2026-08-24 15:07:37 +00:00
Owner

מה ולמה

הג'וב sync-case-status (מסונכרן, */15 * * * *) בחר issue מקושר-תיק לפי plugin_state.state_key=legal-case-number ללא סינון לפי parentId/סטטוס — וכתב in_progress גם על sub-task שכבר done/cancelled, ואף על issue ב-in_review/blocked (שהם מצבי בעלות-Paperclip/המתנה-לאדם). אובחן על תיק 8125-09-24 / CMPA-140 שחזר שוב ושוב מ-done ל-in_progress.

שינוי

  • src/sync-target.ts (חדש) — מודול טהור pickSyncTargetIssue(): בוחר issue-שורש יחיד (parentId === null) שאינו done/cancelled/in_review/blocked. אפס/יותר-מאחד מועמדים → target: null + reason (ללא בליעה שקטה).
  • src/worker.ts — הג'וב עובר על ה-issues פעם אחת, מקבץ למפת case_number → מועמדים, ומשתמש ב-pickSyncTargetIssue. statusMap/statusLabels יצאו ל-scope-מודול (תוכן זהה).
  • src/sync-target.test.ts (חדש) — 8 טסטים node:test, כולל רגרסיית 8125-09-24/CMPA-140.
  • tsconfig.jsonexclude לקובצי-טסט (לא נכנסים ל-build).

אימות

npx tsc --noEmit        → exit 0
npx biome check src/    → Checked 9 files. No fixes applied.
node --test              → tests 8 · pass 8 · fail 0

מבחן-מוטציה: הרצת אותם 8 טסטים מול הכלל הישן (ללא סינון) → 6/8 נכשלים, מוכיח שהטסט נושך את הבאג המקורי.

רקע מלא + הכרעת-פאנל (X15/G12/G2): legal-ai issue #446.

Closes ezer-mishpati/legal-ai#446

## מה ולמה הג'וב `sync-case-status` (מסונכרן, `*/15 * * * *`) בחר issue מקושר-תיק לפי `plugin_state.state_key=legal-case-number` ללא סינון לפי `parentId`/סטטוס — וכתב `in_progress` גם על sub-task שכבר `done`/`cancelled`, ואף על issue ב-`in_review`/`blocked` (שהם מצבי בעלות-Paperclip/המתנה-לאדם). אובחן על תיק 8125-09-24 / CMPA-140 שחזר שוב ושוב מ-`done` ל-`in_progress`. ## שינוי - `src/sync-target.ts` (חדש) — מודול טהור `pickSyncTargetIssue()`: בוחר issue-שורש יחיד (`parentId === null`) שאינו `done`/`cancelled`/`in_review`/`blocked`. אפס/יותר-מאחד מועמדים → `target: null` + `reason` (ללא בליעה שקטה). - `src/worker.ts` — הג'וב עובר על ה-issues פעם אחת, מקבץ למפת `case_number → מועמדים`, ומשתמש ב-`pickSyncTargetIssue`. `statusMap`/`statusLabels` יצאו ל-scope-מודול (תוכן זהה). - `src/sync-target.test.ts` (חדש) — 8 טסטים `node:test`, כולל רגרסיית 8125-09-24/CMPA-140. - `tsconfig.json` — `exclude` לקובצי-טסט (לא נכנסים ל-build). ## אימות ``` npx tsc --noEmit → exit 0 npx biome check src/ → Checked 9 files. No fixes applied. node --test → tests 8 · pass 8 · fail 0 ``` מבחן-מוטציה: הרצת אותם 8 טסטים מול הכלל הישן (ללא סינון) → **6/8 נכשלים**, מוכיח שהטסט נושך את הבאג המקורי. רקע מלא + הכרעת-פאנל (X15/G12/G2): legal-ai issue #446. Closes ezer-mishpati/legal-ai#446
chaim added 1 commit 2026-08-24 15:07:26 +00:00
הג'וב sync-case-status כתב על כל issue מקושר-לתיק שסטטוסו שונה מהיעד — השומר
היחיד היה 'issue.status !== targetStatus'. לכן הוא החזיר sub-tasks שנסגרו
(done) ל-in_progress, כפי שתועד ב-CMPA-140 / תיק 8125-09-24.

בחירת-היעד חולצה ל-src/sync-target.ts: נבחר שורש יחיד (parentId === null)
שאינו done/cancelled ואינו in_review/blocked; אפס או יותר-מאחד → לא נכתב
דבר, ונרשם לוג עם הסיבה. שני הקבועים מובחנים בכוונה — CLOSED_ISSUE_STATUSES
הוא ההגדרה היחידה של 'סגור' (מראה של legal-ai/web/paperclip_client.py:561),
ו-NON_WRITABLE_STATUSES הוא 'מצב בבעלות Paperclip/בהמתנה-לאדם': כתיבת
in_progress על issue ב-in_review מזמינה auto-block תוך דקה
(legal-ai/docs/paperclip-quirks.md §3) וגונבת אותו מתור-הביקורת של היו"ר.

הלולאה הכפולה הוחלפה במעבר אחד + קיבוץ למפת case_number→מועמדים; הקיבוץ
נדרש כדי לבחור 'השורש היחיד', וכתוצר-לוואי O(NxM)→O(M) קריאות state.get.

מבחן-רגרסיה (node --test, ללא תלויות חדשות) משחזר את 11 ה-issues שנמדדו
לתיק 8125-09-24 ומוכיח את הדלתא: הכלל הישן היה כותב על CMPA-140, החדש לא.

בבעלות ריפו זה בהחלטת פאנל — העברת הלוגיקה ל-legal-ai נפסלה כי היא מוסיפה
UPDATE ישיר ל-DB של Paperclip, בהפרת INV-INT4 (GAP-24/25).
chaim merged commit 602b42ca5e into main 2026-08-24 15:07:37 +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/plugin-legal-ai#8