23438922209dbcfad9c0728c71e36fc81cd58716
תיק יכול להיות <kind>_extraction_status='pending' עם _requested_at=NULL — מעולם-לא-נכנס-לתור (מסלולי bulk/מיגרציה, או status שנכתב לפני החותם), והדריינר (סורק requested_at IS NOT NULL) עיוור אליו לנצח → ה-backlog מתנקז בשקט לאפס. requeue_stale_processing_extractions מרפא רק 'processing'. נצפה 2026-06-14: 96 תיקים pending אך 0 בתור (תוקנו ידנית). תיקון (G1 — שחזור invariant במקור, G2 — predicate יחיד): - db.reconcile_orphaned_pending_extractions(kind=) — kind-agnostic, מחזיר את invariant "שורה ברת-חילוץ ⇒ בתור": חותם requested_at ל-rows שהם pending + requested_at IS NULL + EXTRACTION_ELIGIBLE_PREDICATE (אותו מסנן של #140 — cited_only/chunkless לעולם לא נדחפים). אידמפוטנטי (rows מסומנים לא נתפסים). - precedent_library.process_pending_extractions קורא reconcile אחרי requeue_stale ולפני list — תיקים-משוחזרים נקלטים באותו pass. מנגנון-ריפוי יחיד (G2), לא מסלול מקביל; requeue_stale='processing', reconcile='pending'. - request_halacha_extraction מציב status='pending' עם החותם (סימטרי ל-metadata) — סוגר את חלון-ה-drift שמייצר pending+NULL מלכתחילה. מצב חי נקי (0 יתומים-כשירים אחרי התיקון-הידני); זהו תיקון מונע — הדריינר יְרַפֵּא יתומים עתידיים אוטומטית. בדיקות: test_extraction_orphan_reconcile (predicate משותף, pending+NULL בלבד, מובחן מ-requeue_stale, request_halacha סימטרי), שני ה-kinds. כל 349 עוברות. Invariants: G1, G2 (predicate משותף עם #140, ריפוי יחיד), INV-G3/INV-DUR1 (X16), INV-G4 (אין בליעה שקטה — reconcile מתעד), G12. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Description
AI Legal Decision Drafting System — MCP server, web upload, RAG search
Languages
Python
64.1%
TypeScript
33.7%
JavaScript
1.2%
Shell
0.7%
CSS
0.2%