feat(ui): אינדיקטור התקדמות לחילוץ מטא-דאטה + מתג-מקטעים בספריית הפסיקה #70

Merged
chaim merged 1 commits from worktree-feat+metadata-extraction-progress into main 2026-06-06 16:22:42 +00:00
Owner

מה ולמה

שתי בעיות UX בדף /precedents שזיהה היו"ר:

1. חילוץ מטא-דאטה לא נתן שום אינדיקציה שהוא רץ. בלחיצה על "חלץ מטא-דאטה" נשמרה רק חותמת-זמן metadata_extraction_requested_at + הופעל toast, ומכאן שקט. בניגוד לחילוץ-טקסט (extraction_status) וחילוץ-הלכות (halacha_extraction_status) — שיש להם עמודת-מצב עם processing — למטא-דאטה לא היה מצב "מעבד", ולכן StatusPill לא הציג כלום וה-polling לא חשף התקדמות.

הפתרון: נוספה עמודה metadata_extraction_status (pending|processing|completed|failed) במתכונת העמודות הקיימות + helper set_case_law_metadata_status (מנקה את החותמת במצב terminal, כמו set_case_law_halacha_status). ה-worker (process_pending_extractions + reextract_metadata) מעדכן: processing בתחילת כל פריט, completed בסיום, pending בכשל (לריטריי, מונע "processing" תקוע). ה-UI:

  • תג StatusPill חדש: "מחלץ מטא-דאטה" / "ממתין למטא-דאטה" / "מטא-דאטה נכשל".
  • באנר מונה-אצווה עם אחוז התקדמות אמיתי (high-water-mark של עומק-התור) שמתעדכן אוטומטית דרך ה-polling הקיים (5ש'), מוסתר כשהתור ריק.
  • isPrecedentActive עודכן להישען על העמודה החדשה.

2. שתי טבלאות מוערמות (בתי משפט / ועדות ערר) חייבו גלילה ארוכה עם עשרות פריטים. הוחלפו במתג-מקטעים — טבלה אחת בכל פעם עם ספירה על כל כפתור, תוך שמירה על העמודות הייעודיות לכל סוג (בתי משפט: "רמה"; ועדות: "מחוז"/"יו״ר"). שתי השאילתות נשארות mounted כדי לשמר ספירות ו-polling חוצה-טבלאות.

Invariants — הצהרה (חובה)

  • נוגע / מקיים: G2 (מקור-אמת יחיד) — מרחיב את מנגנון-הסטטוס הקיים של טקסט/הלכות במקום לבנות מסלול מקביל. INV-TOOL4 / GAP-45 — המשך חשיפת תור-החילוץ הסמוי שמנקז process_pending_extractions. אין נגיעה בתוכן משפטי (G11).

צ'קליסט — פרוטוקול כתיבת-קוד

  • קראתי את ספ-החוקה + ספ-התחום הרלוונטי לפני הכתיבה
  • השינוי לא יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1)
  • אין בליעה שקטה של שגיאות — כשל ב-worker מתועד (logger.exception) והמצב חוזר ל-pending
  • בדקתי מול gap-audit.md — המשך GAP-45
  • בדיקות: npm run lint (0 errors) + tsc --noEmit (0 errors). הערה: npm run build המקומי נכשל רק בגלל symlink ל-node_modules ב-worktree (Turbopack חוסם נתיב מחוץ ל-root) — אינו קשור לקוד; ה-build בפועל רץ בקונטיינר Coolify.

אימות

לאחר merge + deploy:

  1. כפתור "חלץ מטא-דאטה" על פסיקה → metadata_extraction_status='pending' + חותמת.
  2. mcp__legal-ai__precedent_process_pending(kind="metadata") → תוך כדי ריצה השורה ב-processing (UI: תג "מחלץ מטא-דאטה" + באנר), בסיום completed + חותמת מנוקה.
  3. מתג-המקטעים מחליף בין הטבלאות בלי גלילה; הספירות נכונות.

🤖 Generated with Claude Code

## מה ולמה שתי בעיות UX בדף `/precedents` שזיהה היו"ר: **1. חילוץ מטא-דאטה לא נתן שום אינדיקציה שהוא רץ.** בלחיצה על "חלץ מטא-דאטה" נשמרה רק חותמת-זמן `metadata_extraction_requested_at` + הופעל toast, ומכאן שקט. בניגוד לחילוץ-טקסט (`extraction_status`) וחילוץ-הלכות (`halacha_extraction_status`) — שיש להם עמודת-מצב עם `processing` — למטא-דאטה **לא היה מצב "מעבד"**, ולכן `StatusPill` לא הציג כלום וה-polling לא חשף התקדמות. **הפתרון:** נוספה עמודה `metadata_extraction_status` (`pending`|`processing`|`completed`|`failed`) במתכונת העמודות הקיימות + helper `set_case_law_metadata_status` (מנקה את החותמת במצב terminal, כמו `set_case_law_halacha_status`). ה-worker (`process_pending_extractions` + `reextract_metadata`) מעדכן: `processing` בתחילת כל פריט, `completed` בסיום, `pending` בכשל (לריטריי, מונע "processing" תקוע). ה-UI: - תג `StatusPill` חדש: "מחלץ מטא-דאטה" / "ממתין למטא-דאטה" / "מטא-דאטה נכשל". - **באנר מונה-אצווה** עם אחוז התקדמות אמיתי (high-water-mark של עומק-התור) שמתעדכן אוטומטית דרך ה-polling הקיים (5ש'), מוסתר כשהתור ריק. - `isPrecedentActive` עודכן להישען על העמודה החדשה. **2. שתי טבלאות מוערמות (בתי משפט / ועדות ערר)** חייבו גלילה ארוכה עם עשרות פריטים. הוחלפו ב**מתג-מקטעים** — טבלה אחת בכל פעם עם ספירה על כל כפתור, תוך שמירה על העמודות הייעודיות לכל סוג (בתי משפט: "רמה"; ועדות: "מחוז"/"יו״ר"). שתי השאילתות נשארות mounted כדי לשמר ספירות ו-polling חוצה-טבלאות. ## Invariants — הצהרה (חובה) - **נוגע / מקיים:** **G2** (מקור-אמת יחיד) — מרחיב את מנגנון-הסטטוס הקיים של טקסט/הלכות במקום לבנות מסלול מקביל. **INV-TOOL4 / GAP-45** — המשך חשיפת תור-החילוץ הסמוי שמנקז `process_pending_extractions`. אין נגיעה בתוכן משפטי (G11). ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי את ספ-החוקה + ספ-התחום הרלוונטי לפני הכתיבה - [x] השינוי **לא** יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1) - [x] אין בליעה שקטה של שגיאות — כשל ב-worker מתועד (`logger.exception`) והמצב חוזר ל-`pending` - [x] בדקתי מול `gap-audit.md` — המשך GAP-45 - [x] בדיקות: `npm run lint` (0 errors) + `tsc --noEmit` (0 errors). *הערה:* `npm run build` המקומי נכשל רק בגלל symlink ל-node_modules ב-worktree (Turbopack חוסם נתיב מחוץ ל-root) — אינו קשור לקוד; ה-build בפועל רץ בקונטיינר Coolify. ## אימות לאחר merge + deploy: 1. כפתור "חלץ מטא-דאטה" על פסיקה → `metadata_extraction_status='pending'` + חותמת. 2. `mcp__legal-ai__precedent_process_pending(kind="metadata")` → תוך כדי ריצה השורה ב-`processing` (UI: תג "מחלץ מטא-דאטה" + באנר), בסיום `completed` + חותמת מנוקה. 3. מתג-המקטעים מחליף בין הטבלאות בלי גלילה; הספירות נכונות. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-06 16:22:35 +00:00
שתי בעיות UX בדף /precedents:

1. חילוץ מטא-דאטה לא נתן שום אינדיקציה שהוא רץ. בניגוד לחילוץ טקסט/הלכות
   (extraction_status / halacha_extraction_status) למטא-דאטה היתה רק חותמת-זמן
   metadata_extraction_requested_at — אין מצב "processing", לכן StatusPill לא
   הציג כלום. נוספה עמודת metadata_extraction_status ('pending'|'processing'|
   'completed'|'failed') במתכונת העמודות הקיימות, וה-worker
   (process_pending_extractions + reextract_metadata) מעדכן אותה: processing
   בתחילת פריט, completed בסיום (מנקה גם את החותמת), pending בכשל (לריטריי).
   ה-UI מציג תג "מחלץ מטא-דאטה" + באנר מונה-אצווה עם אחוז התקדמות (high-water-mark
   של עומק-התור) שמתעדכן אוטומטית דרך ה-polling הקיים (5ש').

2. שתי טבלאות מוערמות (בתי משפט / ועדות ערר) חייבו גלילה ארוכה. הוחלפו במתג-
   מקטעים — טבלה אחת בכל פעם, עם שמירה על העמודות הייעודיות לכל סוג.

Invariants: G2 (מרחיב מנגנון-סטטוס קיים, לא מסלול מקביל), INV-TOOL4/GAP-45
(המשך חשיפת תור-החילוץ הסמוי). אין נגיעה בתוכן משפטי (G11).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit c52b5986a3 into main 2026-06-06 16:22:42 +00:00
chaim deleted branch worktree-feat+metadata-extraction-progress 2026-06-06 16:22:42 +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#70