feat(ops): /operations — מוני-תור אחידים, "מה רץ עכשיו", וניהול-תהליכים כמו שירותי-Windows #157

Merged
chaim merged 1 commits from worktree-ops-controls into main 2026-06-08 08:59:54 +00:00
Owner

למה

דף /operations הציג את התורים-שברקע אבל באופן לא-אחיד ולא-שלם:

  • כל כרטיס שפך by_status גולמי (חלק "142 pending", חלק "1 processing") בלי מבנה קבוע.
  • בלבול "ממתין" מול "בתור": status='pending' (142) = הבקלוג הכולל (כל פסיקה שטרם עובדה), בעוד התור הפעיל ש-process_pending_extractions שואב הוא requested_at IS NOT NULL (2). שני מושגים שונים שהוצגו בלי הבחנה.
  • אין הצגה של מה רץ כרגע, ואין שום שליטה בתהליכים.

מה השתנה

  1. כרטיסי-תור אחידים לכל drain: בתור / ממתין(בקלוג) / בעיבוד / הושלם / נכשל + שורת "רץ עכשיו" (citation/case_number של הפריט בעיבוד). טולטיפ מסביר את ההבדל בתור↔ממתין. שערי-אנוש (אישור-הלכות, פסיקה-חסרה) נשארים מוני-סטטוס.
  2. פאנל ניהול-תהליכים ("שירותי Windows"):
    • דמון (legal-court-fetch-service/xvfb/chat-service/reaper): הפעל-מחדש / עצור / הפעל.
    • cron drain (metadata/halacha/court-fetch/digest): "הרץ עכשיו" (pm2 restart) + מתג הפעל/כבה תזמון.
  3. כל תגי-הסטטוס מתורגמים לעברית.

מנגנון

  • הפעל/כבה תזמון = דגל ב-DB (טבלה drain_controls). pm2 cron_restart מחיה תהליך שעוצר ב-pm2 stop, לכן ה"כיבוי" האמין הוא דגל שכל drain בודק ב-startup ועושה no-op מיידי כשכבוי. הקונטיינר קורא/כותב ישירות מ-DB (בלי roundtrip למארח).
  • הרץ-עכשיו + restart/stop/start = proxy ל-pm2 דרך endpoint חדש בגשר-המארח POST /pm2/control (court_fetch_service), מאובטח Bearer (COURT_FETCH_SHARED_SECRET הקיים) + whitelist ל-legal-* בלבד.
  • יומונים → pm2: drain_digests הועבר מ-crontab של המערכת ל-pm2 (legal-digest-drain.config.cjs) כדי שיופיע ויהיה שליט. drain_halacha_queue.py (שהיה untracked) הובא לבקרת-גרסאות.

Invariants

  • G2 (אין מסלול מקביל) — הרחבת /operations + גשר-המארח הקיימים, לא דשבורד/שירות חדש.
  • G1 (נרמול-במקור) — drain_controls = מקור-אמת יחיד לכיבוי-תזמון; ה-drains קוראים אותו, לא מתקנים תסמין בקריאה.
  • כלל-הנדסה §6 — אין בליעת שגיאות שקטה: הגשר מחזיר {ok,error}, המוטציות מציגות toast.

פריסה (שני מסלולים)

  • קונטיינר (web/+web-ui): commit→push→Coolify (אוטומטי על merge ל-main).
  • מארח (גשר-pm2 + קונפיג): לאחר merge — git pull בעץ הראשי, pm2 restart legal-court-fetch-service, pm2 start scripts/legal-digest-drain.config.cjs && pm2 save, והסרת שורת ה-crontab של היומונים.

אימות

tsc 0 שגיאות; lint נקי בקבצים שנגעתי בהם; py_compile נקי. בדיקות end-to-end (גשר 200/401/403, דגל-DB, snapshot, UI, יומונים) יבוצעו אחרי הפריסה.

🤖 Generated with Claude Code

## למה דף `/operations` הציג את התורים-שברקע אבל באופן לא-אחיד ולא-שלם: - כל כרטיס שפך `by_status` גולמי (חלק "142 pending", חלק "1 processing") בלי מבנה קבוע. - **בלבול "ממתין" מול "בתור"**: `status='pending'` (142) = הבקלוג הכולל (כל פסיקה שטרם עובדה), בעוד התור הפעיל ש-`process_pending_extractions` שואב הוא `requested_at IS NOT NULL` (2). שני מושגים שונים שהוצגו בלי הבחנה. - אין הצגה של **מה רץ כרגע**, ואין **שום שליטה** בתהליכים. ## מה השתנה 1. **כרטיסי-תור אחידים** לכל drain: בתור / ממתין(בקלוג) / בעיבוד / הושלם / נכשל + שורת "רץ עכשיו" (citation/case_number של הפריט בעיבוד). טולטיפ מסביר את ההבדל בתור↔ממתין. שערי-אנוש (אישור-הלכות, פסיקה-חסרה) נשארים מוני-סטטוס. 2. **פאנל ניהול-תהליכים** ("שירותי Windows"): - דמון (`legal-court-fetch-service`/`xvfb`/`chat-service`/`reaper`): הפעל-מחדש / עצור / הפעל. - cron drain (`metadata`/`halacha`/`court-fetch`/`digest`): "הרץ עכשיו" (pm2 restart) + מתג הפעל/כבה תזמון. 3. **כל תגי-הסטטוס מתורגמים לעברית.** ## מנגנון - **הפעל/כבה תזמון = דגל ב-DB** (טבלה `drain_controls`). pm2 `cron_restart` מחיה תהליך שעוצר ב-`pm2 stop`, לכן ה"כיבוי" האמין הוא דגל שכל drain בודק ב-startup ועושה no-op מיידי כשכבוי. הקונטיינר קורא/כותב ישירות מ-DB (בלי roundtrip למארח). - **הרץ-עכשיו + restart/stop/start = proxy ל-pm2** דרך endpoint חדש בגשר-המארח `POST /pm2/control` (`court_fetch_service`), מאובטח Bearer (`COURT_FETCH_SHARED_SECRET` הקיים) + whitelist ל-`legal-*` בלבד. - **יומונים → pm2**: `drain_digests` הועבר מ-crontab של המערכת ל-pm2 (`legal-digest-drain.config.cjs`) כדי שיופיע ויהיה שליט. `drain_halacha_queue.py` (שהיה untracked) הובא לבקרת-גרסאות. ## Invariants - **G2** (אין מסלול מקביל) — הרחבת `/operations` + גשר-המארח הקיימים, לא דשבורד/שירות חדש. - **G1** (נרמול-במקור) — `drain_controls` = מקור-אמת יחיד לכיבוי-תזמון; ה-drains קוראים אותו, לא מתקנים תסמין בקריאה. - **כלל-הנדסה §6** — אין בליעת שגיאות שקטה: הגשר מחזיר `{ok,error}`, המוטציות מציגות toast. ## פריסה (שני מסלולים) - **קונטיינר** (web/+web-ui): commit→push→Coolify (אוטומטי על merge ל-main). - **מארח** (גשר-pm2 + קונפיג): לאחר merge — `git pull` בעץ הראשי, `pm2 restart legal-court-fetch-service`, `pm2 start scripts/legal-digest-drain.config.cjs && pm2 save`, והסרת שורת ה-crontab של היומונים. ## אימות tsc 0 שגיאות; lint נקי בקבצים שנגעתי בהם; py_compile נקי. בדיקות end-to-end (גשר 200/401/403, דגל-DB, snapshot, UI, יומונים) יבוצעו אחרי הפריסה. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-08 08:58:14 +00:00
הדף הציג את התורים באופן לא-אחיד (by_status גולמי), בלי הבחנה בין "ממתין"
(בקלוג: status=pending) ל"בתור" (התור הפעיל: requested_at IS NOT NULL), בלי
הצגת הפריט שרץ כרגע, ובלי שום שליטה בתהליכים.

מה נוסף:
1. כרטיסי-תור אחידים — בתור / ממתין(בקלוג) / בעיבוד / הושלם / נכשל + "רץ עכשיו"
   (citation/case_number של הפריט בעיבוד) לכל drain (אחזור-פסיקה, מטא-דאטה,
   הלכות, יומונים). שערי-אנוש (אישור-הלכות, פסיקה-חסרה) נשארים מוני-סטטוס.
2. פאנל ניהול-תהליכים בסגנון "שירותי Windows":
   - דמון (court-fetch-service/xvfb/chat/reaper): הפעל-מחדש / עצור / הפעל.
   - cron drain: "הרץ עכשיו" (pm2 restart) + מתג הפעל/כבה תזמון.
3. כל תגי-הסטטוס מתורגמים לעברית.

מנגנון:
- הפעל/כבה תזמון = דגל ב-DB (טבלה drain_controls). pm2 cron_restart מחיה תהליך
  שעוצר ב-stop, לכן ה"כיבוי" האמין הוא דגל שכל drain בודק ב-startup (no-op מיידי
  כשכבוי). הקונטיינר כותב/קורא ישירות מ-DB.
- הרץ-עכשיו + restart/stop/start = proxy ל-pm2 דרך endpoint חדש בגשר-המארח
  (court_fetch_service /pm2/control), מאובטח Bearer + whitelist ל-legal-* בלבד.
- יומונים: drain_digests הועבר מ-crontab ל-pm2 (legal-digest-drain.config.cjs)
  כדי שיופיע ויהיה שליט כמו כל drain. drain_halacha_queue.py הובא לבקרת-גרסאות.

Invariants: מקיים G2 (הרחבת /operations + הגשר הקיים, לא מסלול מקביל) ו-G1
(drain_controls = מקור-אמת יחיד לכיבוי, נורמליזציה במקור ולא תיקון-בקריאה).
אין בליעת שגיאות שקטה (הגשר מחזיר {ok,error}; המוטציות מציגות toast).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit ae30a4d19a into main 2026-06-08 08:59:54 +00:00
chaim deleted branch worktree-ops-controls 2026-06-08 08:59:54 +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#157