fix(sync): מיפוי-הסטטוסים מ-/api/status-model + סריקת כל החברות (legal-ai #604) #9

Merged
chaim merged 1 commits from fix/604-paperclip-status-sync into main 2026-08-25 22:34:30 +00:00
Owner

מה ולמה

תיקון-הקוד של legal-ai #604 — הג'וב sync-case-status רץ ירוק 13,872 פעם אך לא כתב
issue.status ולו פעם אחת מאז 22.7. שלוש סיבות-שורש, כולן מתוקנות כאן:

1. המפה הקשיחה נותקה ממקור-האמת (G2). CASE_STATUS_TO_ISSUE_STATUS לא נגזרה מ-
case_status_model.py בצד legal-ai ולכן סטתה ממנו: חסרו analyst_verified ו-
research_complete (נוספו בקומיט 851a4fb, 30.6), ונשארו בה 3 מפתחות מתים
uploading, brainstorming, drafting — שאינם קיימים יותר ב-CaseStatus. סטטוס
שאינו במפה נפל ל-continue בלי לוג ובלי שגיאה.

כעת המיפוי נגזר בזמן-ריצה מ-GET /api/status-model (ה-endpoint שכבר קיים ומגיש את
case_status_model.py), דרך resolveIssueStatus — פונקציה טהורה שמשתמשת אך ורק בשדות
גנריים: terminal: truedone, הסטטוס הראשון בסדר → todo, כל השאר →
in_progress. סטטוס חדש בצד legal-ai לא ידרוש עוד עריכה בפלאגין.

הערה על G12 (שער-הפלטפורמה): בכוונה לא הוספנו שדה issue_status ל-
case_status_model.py — זה היה מזריק מושג ספציפי-Paperclip לשכבת-האינטליגנציה של
legal-ai. הגזירה חיה כאן, בפלאגין, שהוא האדפטר המורשה להכיר את שני הצדדים.

2. companies[0] בלבד. מתוך שתי החברות, אחת מעולם לא נסרקה. נמדד ב-DB החי:
42a7acd0… = 135 issues מקושרי-תיק, 8639e837… = 67 — כלומר 67 issues מחוץ לטווח-הראייה
של הג'וב. כעת נסרקות כל החברות (אותה תבנית שכבר בשימוש ב-route-pending-comments),
וה-companyId שנכתב אליו הוא של המועמד שנבחר (target.companyId), לא החברה הראשונה
גורפת — SyncCandidate נושא את השדה עד נקודת-הכתיבה.

3. דילוג שקט. סטטוס לא-מוכר → ctx.logger.warn מפורש עם שם-הסטטוס ומספר-התיק.

לוגיקת בחירת-היעד של #446 לא נגעה: pickSyncTargetIssue, isWritableStatus,
CLOSED_ISSUE_STATUSES, NON_WRITABLE_STATUSES — זהות. ל-SyncCandidate נוסף שדה
companyId בלבד, passthrough טהור שאינו משתתף בשום החלטת-בחירה.

אימות

שקילוּת מול המפה הישנה — מול השרת החי (/api/status-model, 12 סטטוסים):

new→todo · processing/documents_ready/outcome_set/direction_approved/qa_review/
drafted/exported/reviewed→in_progress · final→done      ← same (10/10)
analyst_verified→in_progress · research_complete→in_progress   ← NEWLY-COVERED (2)
מפתחות מתים שהוסרו: uploading, brainstorming, drafting
סטטוס לא-מוכר → null (מסלול ה-warn)
RESULT: mismatches=0  newly_covered=2

סימולציה על הנתונים החיים (6 תיקים מ-legal-ai × 202 issues מקושרים מה-DB של Paperclip):

מדד לפני אחרי
דילוג שקט (אפס לוג) 3 (1043-02-26, 1195-12-25, 1027-04-26 — כולם analyst_verified) 0
שורות-לוג בנות-אבחון 3 6
כתיבות בפועל 0 0 ← אין נסיגה ל-flip-flop של #446
חברות נסרקות 1 2
issues מקושרים בטווח-ראייה 135 202

הבהרה חשובה על "התיקים התקועים": שלושת התיקים ב-analyst_verified אינם תקועים בגלל
הבאג הזה
— שורשיהם ב-Paperclip כבר in_review/done, כלומר הסלמה תקינה הממתינה להכרעת
היו"ר (בדיוק כתיאור הסטטוס: "ממתין להכרעת תוצאה של היו״ר"). מה שהבאג גרם הוא היעדר
נראות
— הם לא הפיקו אף שורת-לוג. אחרי התיקון הם מדווחים no_writable_root. הג'וב לא
ידרוס אותם, וזה הנכון (הגנת #446).

שערים:

npx tsc --noEmit            → 0 שגיאות
npx biome check src/        → Checked 9 files. No fixes applied.
node --test sync-target.ts  → 15/15 עברו (8 קיימים ללא שינוי באסרשנים + 7 חדשים), 0 נכשלו

פריסה (ידנית, אחרי מיזוג): npm run buildpaperclipai plugin uninstall/install
pm2 restart paperclip → מעקב pm2 logs בטיק-הקרון הבא (≤15 דק').

legal-ai #604 · PR-אחות בריפו legal-ai: ezer-mishpati/legal-ai#612 (תיעוד INV-INT9 ב-X7).

## מה ולמה תיקון-הקוד של **legal-ai #604** — הג'וב `sync-case-status` רץ ירוק 13,872 פעם אך לא כתב `issue.status` ולו פעם אחת מאז 22.7. שלוש סיבות-שורש, כולן מתוקנות כאן: **1. המפה הקשיחה נותקה ממקור-האמת (G2).** `CASE_STATUS_TO_ISSUE_STATUS` לא נגזרה מ- `case_status_model.py` בצד legal-ai ולכן סטתה ממנו: חסרו `analyst_verified` ו- `research_complete` (נוספו בקומיט `851a4fb`, 30.6), ונשארו בה **3 מפתחות מתים** — `uploading`, `brainstorming`, `drafting` — שאינם קיימים יותר ב-`CaseStatus`. סטטוס שאינו במפה נפל ל-`continue` **בלי לוג ובלי שגיאה**. כעת המיפוי **נגזר בזמן-ריצה** מ-`GET /api/status-model` (ה-endpoint שכבר קיים ומגיש את `case_status_model.py`), דרך `resolveIssueStatus` — פונקציה טהורה שמשתמשת אך ורק בשדות **גנריים**: `terminal: true` → `done`, הסטטוס הראשון בסדר → `todo`, כל השאר → `in_progress`. **סטטוס חדש בצד legal-ai לא ידרוש עוד עריכה בפלאגין.** > **הערה על G12 (שער-הפלטפורמה):** בכוונה **לא** הוספנו שדה `issue_status` ל- > `case_status_model.py` — זה היה מזריק מושג ספציפי-Paperclip לשכבת-האינטליגנציה של > legal-ai. הגזירה חיה כאן, בפלאגין, שהוא האדפטר המורשה להכיר את שני הצדדים. **2. `companies[0]` בלבד.** מתוך שתי החברות, אחת **מעולם לא נסרקה**. נמדד ב-DB החי: `42a7acd0…` = 135 issues מקושרי-תיק, `8639e837…` = 67 — כלומר 67 issues מחוץ לטווח-הראייה של הג'וב. כעת נסרקות כל החברות (אותה תבנית שכבר בשימוש ב-`route-pending-comments`), וה-`companyId` שנכתב אליו הוא **של המועמד שנבחר** (`target.companyId`), לא החברה הראשונה גורפת — `SyncCandidate` נושא את השדה עד נקודת-הכתיבה. **3. דילוג שקט.** סטטוס לא-מוכר → `ctx.logger.warn` מפורש עם שם-הסטטוס ומספר-התיק. **לוגיקת בחירת-היעד של #446 לא נגעה:** `pickSyncTargetIssue`, `isWritableStatus`, `CLOSED_ISSUE_STATUSES`, `NON_WRITABLE_STATUSES` — זהות. ל-`SyncCandidate` נוסף שדה `companyId` בלבד, passthrough טהור שאינו משתתף בשום החלטת-בחירה. ## אימות **שקילוּת מול המפה הישנה — מול השרת החי** (`/api/status-model`, 12 סטטוסים): ``` new→todo · processing/documents_ready/outcome_set/direction_approved/qa_review/ drafted/exported/reviewed→in_progress · final→done ← same (10/10) analyst_verified→in_progress · research_complete→in_progress ← NEWLY-COVERED (2) מפתחות מתים שהוסרו: uploading, brainstorming, drafting סטטוס לא-מוכר → null (מסלול ה-warn) RESULT: mismatches=0 newly_covered=2 ``` **סימולציה על הנתונים החיים** (6 תיקים מ-legal-ai × 202 issues מקושרים מה-DB של Paperclip): | מדד | לפני | אחרי | |---|---|---| | דילוג שקט (אפס לוג) | **3** (1043-02-26, 1195-12-25, 1027-04-26 — כולם `analyst_verified`) | **0** | | שורות-לוג בנות-אבחון | 3 | **6** | | כתיבות בפועל | 0 | **0** ← אין נסיגה ל-flip-flop של #446 | | חברות נסרקות | 1 | **2** | | issues מקושרים בטווח-ראייה | 135 | **202** | **הבהרה חשובה על "התיקים התקועים":** שלושת התיקים ב-`analyst_verified` **אינם תקועים בגלל הבאג הזה** — שורשיהם ב-Paperclip כבר `in_review`/`done`, כלומר הסלמה תקינה הממתינה להכרעת היו"ר (בדיוק כתיאור הסטטוס: "ממתין להכרעת תוצאה של היו״ר"). מה שהבאג גרם הוא **היעדר נראות** — הם לא הפיקו אף שורת-לוג. אחרי התיקון הם מדווחים `no_writable_root`. הג'וב **לא** ידרוס אותם, וזה הנכון (הגנת #446). **שערים:** ``` npx tsc --noEmit → 0 שגיאות npx biome check src/ → Checked 9 files. No fixes applied. node --test sync-target.ts → 15/15 עברו (8 קיימים ללא שינוי באסרשנים + 7 חדשים), 0 נכשלו ``` **פריסה** (ידנית, אחרי מיזוג): `npm run build` → `paperclipai plugin uninstall/install` → `pm2 restart paperclip` → מעקב `pm2 logs` בטיק-הקרון הבא (≤15 דק'). legal-ai #604 · PR-אחות בריפו legal-ai: `ezer-mishpati/legal-ai#612` (תיעוד `INV-INT9` ב-X7).
chaim added 1 commit 2026-08-25 22:34:07 +00:00
שלושה כשלים בג'וב sync-case-status, שהשביתו אותו בשקט מאז 22.7:

1. המפה הקשיחה CASE_STATUS_TO_ISSUE_STATUS נותקה מ-case_status_model.py
   (מקור-האמת בצד legal-ai): חסרו analyst_verified ו-research_complete
   שנוספו ב-851a4fb, ונשארו בה 3 מפתחות מתים (uploading/brainstorming/drafting).
   סטטוס חסר נפל ל-`continue` — בלי לוג ובלי שגיאה. כעת המיפוי נגזר מ-
   GET /api/status-model דרך resolveIssueStatus/labelFor: terminal→done,
   הסטטוס הראשון בסדר→todo, השאר→in_progress. סטטוס חדש בצד legal-ai לא
   דורש עוד עריכה כאן (G2 — מקור-אמת אחד).
2. companies[0] בלבד — מתוך שתי החברות, אחת מעולם לא נסרקה (נמדד: 135 מול
   67 issues מקושרי-תיק). כעת נסרקות כל החברות, וה-companyId של המועמד
   שנבחר הוא זה שנכתב אליו — לא החברה הראשונה גורפת.
3. דילוג שקט על סטטוס לא-מוכר → ctx.logger.warn עם שם-הסטטוס ומספר-התיק.

אימות מול השרת החי: 0 סטיות מול המפה הישנה על כל 10 הסטטוסים שכיסתה,
+2 שכוסו לראשונה. סימולציה על הנתונים החיים: דילוג-שקט 3→0, שורות-לוג 3→6,
כתיבות בפועל 0→0 — כלומר אין נסיגה ל-flip-flop של #446.

לוגיקת בחירת-היעד (#446) לא שונתה: pickSyncTargetIssue, isWritableStatus,
CLOSED_ISSUE_STATUSES ו-NON_WRITABLE_STATUSES זהות; ל-SyncCandidate נוסף שדה
companyId בלבד (passthrough). 8 הטסטים הקיימים עוברים ללא שינוי באסרשנים,
+7 חדשים.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
chaim merged commit 10d6216bec into main 2026-08-25 22:34:30 +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#9