feat(halacha): drain לילי (23:00–05:00) + per-upload חילוץ תיק-בודד דרך ה-CEO (#120) #186

Merged
chaim merged 1 commits from worktree-halacha-nightly-drain into main 2026-06-11 14:03:12 +00:00
Owner

הבעיה (אבחנה 2026-06-11)

לחיצת "חלץ הלכות" על תיק בודד יצרה issue (CMP-165) שהורה ל-CEO להריץ precedent_process_pending(halacha) — בולען סינכרוני שמרוקן את כל התור ההיסטורי (147 ממתינים, שעות) בתוך heartbeat שחסום לשעה (effectiveTimeoutSec=3600). תוצאה: timed_out כל שעה → process_lost בפירוק קבוצת-התהליכים → retry → סטורם רעש, והתיק הבודד (FIFO אחרון) לא טופל. לא OOM, לא קוד שבור — אי-התאמה ארכיטקטונית.

התיקון — הפרדת אחריות

per-upload (מיידי, תיק-בודד דרך ה-CEO):

  • web/paperclip_client.py (wake_for_precedent_extraction): גוף ה-issue + תיאור-הפרויקט מורים כעת precedent_extract_metadata + precedent_extract_halachot ל-case_law_id של ה-issue בלבד, עם אזהרה מפורשת לא להריץ process_pending.
  • .claude/agents/legal-ceo.md: אותו שינוי בהוראות ה-CEO.
  • reextract_halachot כבר מנקה requested_at ומסמן completedהתיק לא יחזור לתור הלילי.

backlog (לילי, מגודר):

  • scripts/drain_halacha_queue.py: שער חלון 23:00–05:00 שעון-ישראל (zoneinfo, DST-safe — המכונה UTC). מחוץ לחלון ===SKIP===; נעצר ===STOP=== כשהחלון נסגר, השאר ממשיך בלילה הבא (FIFO + per-chunk checkpoint → אין אובדן/כפילות). env: HALACHA_DRAIN_WINDOW_START/_END/_TZ.
  • scripts/legal-halacha-drain.config.cjs: cron UTC 0 20,21,22,23,0,1,2,3 = superset שמכסה את חלון-ישראל בקיץ ובחורף; הסקריפט גוזם לחלון המדויק. ירייה שעתית מחדשת one-shot שמת (advisory-lock → חפיפה בטוחה).

הבטחת ה-"לא ידליק שוב את כל התור"

ביקורת מלאה של נתיבי-ההפעלה: הבולען היה מופעל מ-(א) גוף issue CMP-165, (ב) הוראות ה-CEO. שניהם שונו לחילוץ תיק-בודד. request_halacha_extraction ממשיך לסמן requested_at כרשת-ביטחון בלבד (אם wakeup נכשל → הדריינר הלילי יתפוס, בלילה, חסום). שום נתיב יומי לא מרוקן את כל התור.

Invariants

  • מקיים G12 / INV-PORT1paperclip_client = shell; scripts/leak_guard.py עובר.
  • נוגע X16 (durability — העברת עבודה ארוכה מתקציב-זמן heartbeat ל-job ייעודי).

בדיקות

  • py_compile ✓ · window-logic + zoneinfo ✓ (17:00 IDT → _in_window()=False) · leak_guard.py ✓.

צעדים תפעוליים אחרי מיזוג (לא בקוד)

  1. deploy ל-Coolify (שינוי web/).
  2. scripts/sync_agents_across_companies.py --apply (פרומפט ה-CEO לשתי החברות).
  3. pm2 start scripts/legal-halacha-drain.config.cjs && pm2 save + ניקוי דגל drain_controls ב-/operations (כדי שלא יישאר disabled).

TaskMaster: legal-ai #120

🤖 Generated with Claude Code

## הבעיה (אבחנה 2026-06-11) לחיצת "חלץ הלכות" על תיק בודד יצרה issue (CMP-165) שהורה ל-CEO להריץ `precedent_process_pending(halacha)` — בולען סינכרוני שמרוקן את **כל** התור ההיסטורי (147 ממתינים, שעות) בתוך heartbeat שחסום לשעה (`effectiveTimeoutSec=3600`). תוצאה: **timed_out כל שעה → process_lost** בפירוק קבוצת-התהליכים → retry → סטורם רעש, והתיק הבודד (FIFO אחרון) לא טופל. **לא OOM, לא קוד שבור** — אי-התאמה ארכיטקטונית. ## התיקון — הפרדת אחריות **per-upload (מיידי, תיק-בודד דרך ה-CEO):** - `web/paperclip_client.py` (`wake_for_precedent_extraction`): גוף ה-issue + תיאור-הפרויקט מורים כעת `precedent_extract_metadata` + `precedent_extract_halachot` ל-`case_law_id` של ה-issue **בלבד**, עם אזהרה מפורשת לא להריץ `process_pending`. - `.claude/agents/legal-ceo.md`: אותו שינוי בהוראות ה-CEO. - `reextract_halachot` כבר מנקה `requested_at` ומסמן `completed` → **התיק לא יחזור לתור הלילי**. **backlog (לילי, מגודר):** - `scripts/drain_halacha_queue.py`: שער חלון 23:00–05:00 שעון-ישראל (`zoneinfo`, DST-safe — המכונה UTC). מחוץ לחלון `===SKIP===`; נעצר `===STOP===` כשהחלון נסגר, השאר ממשיך בלילה הבא (FIFO + per-chunk checkpoint → אין אובדן/כפילות). env: `HALACHA_DRAIN_WINDOW_START`/`_END`/`_TZ`. - `scripts/legal-halacha-drain.config.cjs`: cron UTC `0 20,21,22,23,0,1,2,3` = superset שמכסה את חלון-ישראל בקיץ ובחורף; הסקריפט גוזם לחלון המדויק. ירייה שעתית מחדשת one-shot שמת (advisory-lock → חפיפה בטוחה). ## הבטחת ה-"לא ידליק שוב את כל התור" ביקורת מלאה של נתיבי-ההפעלה: הבולען היה מופעל מ-(א) גוף issue CMP-165, (ב) הוראות ה-CEO. שניהם שונו לחילוץ תיק-בודד. `request_halacha_extraction` ממשיך לסמן `requested_at` כ**רשת-ביטחון** בלבד (אם wakeup נכשל → הדריינר הלילי יתפוס, בלילה, חסום). **שום נתיב יומי לא מרוקן את כל התור.** ## Invariants - מקיים **G12 / INV-PORT1** — `paperclip_client` = shell; `scripts/leak_guard.py` עובר. - נוגע **X16** (durability — העברת עבודה ארוכה מתקציב-זמן heartbeat ל-job ייעודי). ## בדיקות - `py_compile` ✓ · window-logic + zoneinfo ✓ (17:00 IDT → `_in_window()=False`) · `leak_guard.py` ✓. ## צעדים תפעוליים אחרי מיזוג (לא בקוד) 1. deploy ל-Coolify (שינוי `web/`). 2. `scripts/sync_agents_across_companies.py --apply` (פרומפט ה-CEO לשתי החברות). 3. `pm2 start scripts/legal-halacha-drain.config.cjs && pm2 save` + ניקוי דגל `drain_controls` ב-/operations (כדי שלא יישאר disabled). TaskMaster: legal-ai #120 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-11 14:03:05 +00:00
feat(halacha): drain לילי (23:00–05:00) + per-upload חילוץ תיק-בודד דרך ה-CEO (#120)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 6s
4fa62db192
מפריד בין ריקון-באקלוג המוני לבין חילוץ per-upload, ומסיר את ה"פקק" שגרם
timeout/process_lost ב-heartbeat של ה-CEO.

הבעיה (אבחנה 2026-06-11): לחיצת "חלץ הלכות" על תיק בודד יצרה issue (CMP-165)
שהורה ל-CEO להריץ precedent_process_pending(halacha) — בולען סינכרוני שמרוקן את
כל התור ההיסטורי (147 ממתינים, שעות) בתוך heartbeat שחסום לשעה. תוצאה: timeout
כל שעה → process_lost בפירוק קבוצת-התהליכים → retry → סטורם, והתיק הבודד (FIFO
אחרון) לא טופל. לא OOM, לא קוד שבור — אי-התאמה ארכיטקטונית.

התיקון:
1. per-upload (web/paperclip_client.py, wake_for_precedent_extraction): גוף ה-issue
   + תיאור-הפרויקט מורים כעת להריץ precedent_extract_metadata +
   precedent_extract_halachot ל-case_law_id של ה-issue **בלבד** — עם אזהרה
   מפורשת לא להריץ process_pending. reextract_halachot כבר מנקה requested_at
   ומסמן completed → התיק לא יחזור לתור הלילי.
2. הוראות ה-CEO (.claude/agents/legal-ceo.md): אותו שינוי — חילוץ תיק-בודד, לא
   ריקון-תור. (צריך sync_agents_across_companies.py --apply אחרי מיזוג.)
3. ריקון-באקלוג (scripts/drain_halacha_queue.py): שער חלון-לילה 23:00–05:00 שעון
   ישראל (zoneinfo, DST-safe — המכונה UTC). מחוץ לחלון ===SKIP===; נעצר ===STOP===
   כשהחלון נסגר, השאר ממשיך בלילה הבא (FIFO + per-chunk checkpoint). env:
   HALACHA_DRAIN_WINDOW_START/_END/_TZ.
4. cron (scripts/legal-halacha-drain.config.cjs): UTC band 20:00–03:00 שמכסה את
   חלון-ישראל בשני מצבי-DST; הסקריפט גוזם לחלון המדויק. ירייה שעתית מחדשת
   one-shot שמת (advisory-lock → חפיפה בטוחה).

רשת-ביטחון: request_halacha_extraction עדיין מסמן requested_at, כך שאם wakeup
ל-CEO נכשל — הדריינר הלילי יתפוס את התיק (בלילה, חסום), אך שום נתיב יומי לא
מרוקן את כל התור.

Invariants: מקיים G12/INV-PORT1 (paperclip_client = shell; leak_guard עובר).
נוגע X16 (durability — מתקציב-זמן heartbeat ל-job ייעודי).

בדיקות: py_compile ✓ · window-logic + zoneinfo ✓ (17:00 IDT→False) · leak_guard ✓.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 369755c350 into main 2026-06-11 14:03:12 +00:00
chaim deleted branch worktree-halacha-nightly-drain 2026-06-11 14:03:12 +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#186