fix(sync): onWebhook statusLabels נגזרת מ-/api/status-model (legal-ai #616) #13
Reference in New Issue
Block a user
Delete Branch "fix/616-onwebhook-status-labels"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
מטפל ב-legal-ai #616
(issue-tracker בריפו האחר; אסגור אותו ידנית אחרי המיזוג — Gitea לא סוגר cross-repo).
המשך ישיר ל-#604 / plugin PR#9.
מה תוקן ולמה
בפלאגין היו שתי מפות-תוויות עבריות לאותו enum של סטטוסי-תיק. #604 גזר את הראשונה
(
CASE_STATUS_TO_ISSUE_STATUS, הג'ובsync-case-status) מ-GET /api/status-model.השנייה —
statusLabelsבתוךonWebhook— נשארה קשיחה, וכבר הספיקה לסטות.מדידת-הדריפט מול 12 הסטטוסים החיים (
case_status_model.py:51-64):new·processing·documents_ready·outcome_set·direction_approved·qa_review·drafted·exported·reviewed·final(10)analyst_verified·research_complete(2) — נוספו למודל ב-30.6uploading·brainstorming·drafting(הוסרו מה-enum) ·in_progress(זהissue.statusשל Paperclip, לאcase.status— ערבוב-מושגים) ·qa_failed(הוסר מפורשות;web/app.py:7396: "pass→drafted, fail→qa_review; הסטטוס qa_failed הוסר")כלומר: תיק שנכנס ל-
analyst_verifiedהפיק תגובה בעברית שבתוכה מפתח-אנגלית גולמי, בלי שוםעקבה בלוג שמשהו חסר.
labelכבר קיים ב-SSOT (StatusDef.label→to_dict()→/api/status-model), ו-labelFor()מ-#604 כבר קוראת אותו. ⇒
legal-aiלא נגע כלל בשינוי הזה — אין endpoint חדש, אין שדה חדש,אפס סמל ספציפי-Paperclip נכנס לשכבת-האינטליגנציה (G12).
טבלת AC ↔ מימוש
statusLabelsנמחקת, מוחלפת בגזירה מ-/api/status-modellabelFor()הקיימת היא הלוקאפ היחידworker.ts(היה 1707-1724)grepמחזיר רק שימושיםenumהמיושן ב-legal_case_update, והמנייה בתיאורlegal_case_list.grepעל 9 שמות-סטטוס → 0 תוצאותworker.ts:114·257-261·1707-1723logger.warnעםcaseNumber+newStatus; ובנפרד שניlogger.errorלשתי הסיבות ל"מודל לא-זמין" (כשל-רשת ·LegalApiחסר)worker.tsresolveStatusLabel(מוכר / לא-מוכר +doesNotThrow/ מודל-null/ רגרסיה על 10 המפתחות ששרדו)sync-target.test.tsהחלטות-תכנון שראוי לשים לב אליהן
resolveStatusLabelב-sync-target.ts, לא ב-worker.ts. היא מרכיבה אתlabelForהקיימת (לא מחפשת שוב — אין כפילות-לוגיקה), ומחזירה גם את סיבת הנפילה-לגולמי
(
"unknown_status"/"model_unavailable"/null). ההפרדה בין ההחלטה לדיווחהיא מה שמאפשר כיסוי-טסט:
worker.tsאינו ניתן ל-import בטסט (מריץrunWorker()ברמת-המודול)— בדיוק הסיבה ש-
sync-target.tsקיים כמודול-טהור מאז #446.model_unavailableנבדלות, ושתיהן משאירות עקבה. תווית חסרה אינה מפילהאת ה-webhook: התגובה עדיין מתפרסמת והערת-ה-CEO עדיין נורית, עם מפתח גולמי +
errorבלוג.לזרוק כאן היה מחליף באג-שקט בהשבתת-תפקוד.
enumמ-legal_case_updateהיא הסרת-דריפט, לא הרפיית-ולידציה. המניפסט —מה שהסוכנים באמת רואים — כבר מגדיר
status: { type: "string" }בליenum(manifest.ts:103);ה-
enumב-worker.tsחסם 8 סטטוסים חוקיים והתיר אחד שאינו קיים. גזירתו מ-/api/status-modelבלתי-אפשרית מבנית: הרישום קורה ב-
setup(), שאין לו הקשר-חברה ולכן אינו יכול לפתור אתlegalApiBaseUrl(מתועד ב-worker.ts:41-70— זה מה ששבר את הפלאגין ב-722.0). הוולידציההאמיתית היא server-side.
("⚙️ עיבוד מסמכים"). לא הוספתי שדה-אימוג'י ל-
case_status_model.py— זה היה מכניס עיטורספציפי-לצרכן ל-SSOT. מסלול-חזרה: אם ירצו אימוג'י, הוא חוזר בשורה אחת בפלאגין
(
Record<phase, emoji>לפיphaseשכבר מגיע ב-/api/status-model), בלי לגעת ב-legal-ai.oldStatusמתורגם אף הוא (היה מודפס כמפתח-אנגלית בתוך משפט עברי), אך בלי לוג —הוא ריק לגיטימית בתיק-חדש ועשוי להיות מפתח היסטורי מת;
warnעליו היה רעש כרוני.legalApiעשה hoist לידpluginCtxומועבר מפורשות כפרמטר ל-handleCaseStatusWebhook.
onWebhookהוא מתודה-אחות שלsetup()ואין לו closure על המופע. אותו מופע, לא שני.newStatus === "qa_failed"לא נגעתי בו — הוא שימוש ולא הגדרה. עם התיקון הוא נעשהגלוי: מסירה כזו תפיק
warnמפורש במקום ליפול בשקט על תווית קשיחה.שער (אין CI בריפו הזה — האימות הוא ההרצה, והורצה פעמיים ע"י wf-lead)
35 הטסטים הקיימים עברו ללא שינוי באסרשנים שלהם; הפיקסצ'ר
STATUS_MODELכבר הכיל את כל 12הסטטוסים ולא נזקק להרחבה (טסט-הרגרסיה מסנן לפיו — ואומת שהוא מכסה את כל 10 המפתחות, אינו ריק).
Invariants
G2 — מקור-אמת אחד לתוויות-הסטטוס, ושני צרכני-הפלאגין (
sync-case-statusמ-#604ו-
onWebhookכאן) קוראים אותו דרך אותה פונקציה ואותו endpoint. לא נוצר מודול/endpoint/מטמוןמקביל. · G1 — נרמול-במקור: הפלאגין מפסיק להחזיק העתק-סטטי ומושך מה-SSOT; לא תיקון-תסמין
בצד-התצוגה. · G12 —
legal-aiלא נגע כלל. · X7 INV-INT9 —onWebhookעדיין אינוכותב
issue.status(רקcreateComment+agents.invoke); "המשבצת השמורה" נשארת שמורה. ·כלל-הנדסה §6 — אין בליעה שקטה בשום נתיב.
🚧 פריסה — לא בוצעה, ממתינה להחלטת חיים
הפלאגין אינו נטען מ-git; מיזוג לבדו אינו מפעיל כלום:
(ב-#604 שלב-ההתקנה הוחמץ פעם אחת וה-restart הפעיל את הקוד הישן.)
זו פעולה על שירות-ייצור חי — לא בוצעה אוטומטית.
פער שנפתח כ-issue המשך (לא נבלע)
worker.ts— הענףnewStatus === "qa_failed"(עֵרָת-CEO בכשל-QA) הוא ככל הנראה קוד-מת:הסטטוס הוסר מ-
case_status_model.py, והנתיב החי הואqa_review. שינוי-ההתנהגות מחוץ ל-ACשל #616 ודורש הכרעה (להעביר את הטריגר ל-
qa_review? או שכשל-QA כבר לא אמור להעיר CEO?).התיקון הזה הופך אותו לגלוי במקום להסתירו.