feat(sync): מוני-ריצה מובחנים ל-sync-case-status — "אין מה לעשות" מובחן מ"שבור" (legal-ai #617) #12
Reference in New Issue
Block a user
Delete Branch "feat/617-sync-status-run-counters"
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?
סוגר את ezer-mishpati/legal-ai#617 ("sync-case-status: 13,872 ריצות ואי-אפשר להבדיל בין 'אין מה לעשות' ל'שבור'").
תכנון מלא + כל המדידות: ezer-mishpati/legal-ai#617 (comment)
מה זה עושה
הג'וב
sync-case-statusסיים עד כה בשורה אחת —casesChecked— שאינה מבחינה בין "אין מה לעשות", "נדחה בכוונה" ו**"נפל"**. מעתה כל ריצה פולטת:הפליטה יושבת ב-
finallyוזורקת את השגיאה המקורית הלאה, כך שריצה שנפלה נשארתfailedב-plugin_job_runsוגם נושאת את המונים שהספיקה לצבור.למה דווקא הערוצים האלה (AC3 — "לא לפלוט למקום מת")
נמדד מה בכלל צורך פלט של ג'וב:
plugin_job_runscompleteRunבהצלחה מקבל רק{status,durationMs}— אין ערוץ-החזרה ל-handler. נשאר בינאריplugin_job_runs.logs[]— ערוץ מתctx.logger.*plugin-worker-manager.js:289-317) ומחזיר לפניhostHandlers["log"]→ לעולם לא מגיע ל-plugin_logs. רק stdout של pm2ctx.metrics.writeplugin_logs(level='metric'), והממשק מושךGET /plugins/:id/logs?limit=50כל 30ש' ומרנדר פאנל "Recent Logs"ctx.activity.logcompanyId→InvocationScopeDenied)לכן:
ctx.logger.info(pm2) +ctx.metrics.write(plugin_logs) — שניהם משטחים קיימים. לא נוצרה טבלה, לא endpoint, ולא תור, ושורת-הסיכום הישנה הוחלפה ולא נוספה לצידה (G2).⚠️ המונים בתוך מחרוזת-ההודעה ולא רק ב-
meta, כי נמדד ששני המשטחים מתעלמים מ-meta: הפאנל מרנדרcreatedAt/level/messageבלבד, ומ-pino נמדד ששדה{error:…}שהקוד מעביר נופל בפועל מהשורה.הרשאה חדשה ב-manifest
נוספה
"metrics.write"— הדרך היחידה לכתוב ל-plugin_logs. נבדק שזה בטוח: בדיקת-הסלמת-ההרשאות קיימת רק ב-upgradePlugin(plugin-loader.js:1026-1034), מסלול שאיננו משתמשים בו; מסלול-האתחול עובר ב-refreshPluginManifestFromPackageשמעדכן את ה-manifest בלי בדיקת-הסלמה. metrics.writeהיא capability מוכרת (shared/dist/constants.js:958).מסלול-חזרה: הסרת השורה →
npm run build→pm2 restart paperclip.Invariants
metrics.writeשנכשל מדווח ב-logger.errorעם טקסט-השגיאה בתוך המחרוזת, ואינו מסווה את כשל-הריצה (הפונקציה לעולם אינה זורקת — היא נקראת מ-finally).plugin_logsהוא מאגר-הלוגים של המארח עם API ופאנל קיימים;ctx.metrics.writeהוא הפרימיטיב שהמארח מייעד בדיוק לזה.src/sync-target.tsלא נגע כלל (git diffריק), ובכלל זהNON_WRITABLE_STATUSES(הכרעת-יו"ר, #626).אימות
שני הטסטים המהותיים: AC2 — שלוש ריצות (ריקה · דחתה-12 · נפלה), כולן
written=0, מפיקות שלוש מחרוזות שונות. אינvariant — סימולציית-לולאה עםpickSyncTargetIssue/resolveIssueStatusהאמיתיים מאמתתmatched === written + already_matchingו-scanned === matched + סך-הדחיות-שאינן-already_matching.אין Gitea Actions בריפו הזה —
pr-checksיחזיר "אין checks", וזה תקין ולא כשל.פריסה ידנית (אין Coolify hook):
git pullב-/home/chaim/plugin-legal-ai→npm run build→pm2 restart paperclip.מה לא בתחום ה-PR הזה
הג'וב נופל כרגע בכל ריצה ב-
resolveApiBase/ctx.issues.*שנדחים במנוע-ההרשאות — זהו #645 (p0-blockerנפרד). ה-PR הזה אינו נוגע בו, ולכן ריצה חיה תיראהrun=failed scanned=0 …עד שייסגר. זו בדיוק ההבחנה שה-issue דרש: "נפלה" מובחנת מ"אין מה לעשות".🤖 Generated with Claude Code
הג'וב סיים עד כה בשורה אחת — `casesChecked` — שאינה מבחינה בין "אין מה לעשות", "נדחה בכוונה" ו"נפל". 13,872 ריצות דיווחו בריאות ירוקה, ובפועל היו בהן 389 כתיבות בלבד; האבחנה ב-#604 נבנתה על היעדר-ראיה. כל ריצה פולטת מעתה: scanned · matched · written · declined{no_linked_issues, no_writable_root, ambiguous_writable_roots, unknown_status, already_matching}. הפליטה יושבת ב-`finally` וזורקת את השגיאה המקורית הלאה, כך שריצה שנפלה נשארת `failed` ב-`plugin_job_runs` **וגם** נושאת את המונים שהספיקה לצבור. שני משטחים קיימים וצורכים, שנמדדו: - `ctx.logger.info` → stdout של pm2 — שם בוצע בפועל האבחון של #626/#637. - `ctx.metrics.write` → `plugin_logs` (level='metric') — הטבלה שפאנל "Recent Logs" בדף-הפלאגין מרנדר, וניתנת לשאילתת-SQL (AC4). המונים בתוך מחרוזת-ההודעה ולא רק ב-meta, כי שני המשטחים מתעלמים מ-meta בפועל (הפאנל מרנדר createdAt/level/message בלבד; ומ-pino נמדד ששדה `{error:…}` נופל). נדרשה הרשאת `metrics.write` ב-manifest — זו הדרך היחידה לכתוב ל-`plugin_logs`. אפס שינוי בהתנהגות-הכתיבה: `sync-target.ts` לא נגע כלל, ובכלל זה `NON_WRITABLE_STATUSES` (הכרעת-יו"ר, #626). Closes ezer-mishpati/legal-ai#617 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>