All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 1m28s
Three improvements to the precedent library based on usage feedback:
1. Auto-fill metadata at upload time. New service
precedent_metadata_extractor reads the ruling's full_text and
suggests case_name (short), summary, headnote, key_quote,
subject_tags, appeal_subtype. The merge policy fills only empty
fields, preserving everything the chair typed in the upload form.
Wired into the ingest pipeline; also exposed as a re-run endpoint
POST /api/precedent-library/{id}/extract-metadata for existing
records.
2. Edit sheet in the UI. Pencil icon on each library row opens a
pre-populated form covering every field. A Sparkles button on the
sheet runs the metadata extractor on demand and refreshes the
form. The case_number is read-only because halachot are FK'd to
it; renaming requires delete + re-upload.
3. Halacha extractor branches on is_binding. Sources marked binding
(Supreme/Administrative) keep the strict halacha prompt. Non-binding
sources (other appeals committees, district courts on planning
matters) get a different prompt that extracts applications,
interpretive principles, and persuasive conclusions — labeled with
new rule_types 'application' and 'persuasive'. The fallback also
widens chunk selection: if the chunker labeled nothing as
legal_analysis/ruling/conclusion, we now run on all chunks rather
than returning zero halachot for a usable ruling.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1170 lines
98 KiB
JSON
1170 lines
98 KiB
JSON
{
|
||
"master": {
|
||
"tasks": [
|
||
{
|
||
"id": 32,
|
||
"title": "הקמת סביבת פיתוח ותשתית בסיסית",
|
||
"description": "הקמת סביבת הפיתוח הבסיסית עם Python, FastAPI, PostgreSQL ו-Infisical לניהול סודות",
|
||
"details": "יצירת פרויקט Python עם FastAPI כשרת API, PostgreSQL כמסד נתונים, ו-Infisical לניהול סודות. הגדרת Docker containers לפיתוח מקומי. יצירת מבנה תיקיות: /src, /tests, /docs, /data. הגדרת requirements.txt עם כל התלויות הנדרשות: fastapi, uvicorn, sqlalchemy, psycopg2, python-multipart, python-docx, PyPDF2, anthropic, infisical-python. הגדרת משתני סביבה דרך Infisical.",
|
||
"testStrategy": "בדיקת התחברות למסד נתונים, טעינת משתני סביבה מ-Infisical, הרצת שרת FastAPI בסיסי",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T08:53:33.842Z"
|
||
},
|
||
{
|
||
"id": 33,
|
||
"title": "מודול קליטה ועיבוד מסמכים",
|
||
"description": "פיתוח מודול לקליטת קבצי PDF, DOCX, MD וחילוץ טקסט כולל OCR",
|
||
"details": "יצירת מחלקה DocumentProcessor שמטפלת בקבצים מסוגים שונים. עבור PDF: שימוש ב-PyPDF2 לטקסט רגיל ו-pytesseract לOCR של קבצים סרוקים. עבור DOCX: שימוש ב-python-docx. עבור MD: קריאה ישירה. הוספת זיהוי אוטומטי של קבצים סרוקים. יצירת API endpoint POST /documents/upload שמקבל קבצים ומחזיר טקסט מחולץ. שמירת מטא-דאטה של כל מסמך במסד הנתונים.",
|
||
"testStrategy": "בדיקה עם קבצי PDF רגילים וסרוקים, קבצי DOCX עם עברית RTL, קבצי MD. וידוא חילוץ טקסט נכון ושמירת מטא-דאטה",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"32"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:38:55.716Z"
|
||
},
|
||
{
|
||
"id": 34,
|
||
"title": "מודול סיווג מסמכים וזיהוי צדדים",
|
||
"description": "פיתוח מודול לסיווג מסמכים לסוגים (ערר, תשובה, פרוטוקול וכו') וזיהוי צדדים",
|
||
"details": "יצירת מחלקה DocumentClassifier שמשתמשת ב-Claude API לסיווג מסמכים. הגדרת prompt מובנה שמזהה: סוג מסמך (ערר/תשובה/תגובה/פרוטוקול/תכנית/היתר/פסק דין/החלטה), צדדים (עוררים, משיבים, ועדה, מבקשי היתר), סוג ערר לפי מספר תיק (1xxx=רישוי, 8xxx=השבחה, 9xxx=פיצויים). יצירת מבנה נתונים מובנה לשמירת המידע המסווג. הוספת ולידציה לתוצאות הסיווג.",
|
||
"testStrategy": "בדיקה עם מסמכים מכל הסוגים, וידוא זיהוי נכון של צדדים וסוג ערר, בדיקת טיפול במסמכים לא ברורים",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"33"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:43:02.411Z"
|
||
},
|
||
{
|
||
"id": 35,
|
||
"title": "מודול חילוץ טענות",
|
||
"description": "פיתוח מודול לחילוץ וסיכום טענות מכתבי טענות לפי צד",
|
||
"details": "יצירת מחלקה ClaimsExtractor שמחלצת טענות מכתבי ערר ותשובה. שימוש ב-Claude API עם prompt מיוחד שמזהה טענות לפי צד ומסכם אותן בצורה נאמנה למקור. יצירת מבנה נתונים שמקשר בין טענה למסמך המקור ולמיקום בו. הוספת מנגנון לזיהוי טענות חוזרות או דומות. שמירת הטענות במסד הנתונים עם קישור לתיק ולצד.",
|
||
"testStrategy": "בדיקה עם כתבי ערר מורכבים, וידוא נאמנות לטקסט המקור, בדיקת זיהוי טענות לפי צד",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"34"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:45:38.799Z"
|
||
},
|
||
{
|
||
"id": 36,
|
||
"title": "מודול זיהוי תכניות ופסיקה",
|
||
"description": "פיתוח מודול לזיהוי תכניות חלות על המקרקעין ופסיקה מצוטטת במסמכים",
|
||
"details": "יצירת מחלקה LegalReferencesExtractor שמזהה: תכניות (תב\"ע, תמ\"א, תכניות מקומיות), פסיקה מצוטטת (עם מספרי תיק ושנה), חקיקה רלוונטית. שימוש ב-regex patterns לזיהוי דפוסים נפוצים ו-Claude API לאימות ועידון. יצירת מאגר מקומי של תכניות ופסיקה שכבר זוהו. הוספת מנגנון לולידציה של הפניות שזוהו.",
|
||
"testStrategy": "בדיקה עם מסמכים המכילים הפניות לתכניות ופסיקה, וידוא זיהוי מדויק ואי-זיהוי של הפניות שגויות",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"34"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:48:16.636Z"
|
||
},
|
||
{
|
||
"id": 37,
|
||
"title": "ממשק הזנת תוצאה וסיעור מוחות",
|
||
"description": "פיתוח ממשק CLI להזנת תוצאה (דחייה/קבלה/חלקית) ומנגנון סיעור מוחות",
|
||
"details": "יצירת CLI interface עם typer שמאפשר לחיים להזין: סוג תוצאה (דחייה/קבלה/קבלה חלקית), נימוק (אופציונלי). אם לא הוזן נימוק - הפעלת מודול BrainstormingEngine שמציג טענות מרכזיות ומציע 2-3 כיוונים אפשריים. יצירת שיח אינטראקטיבי בין חיים למערכת עד הגעה לכיוון מוסכם. שמירת מסמך הכיוון הסופי. הוספת מנגנון מניעה מכתיבת דיון ללא כיוון מאושר.",
|
||
"testStrategy": "בדיקת תרחישים עם ובלי נימוק, וידוא איכות הצעות הכיוון, בדיקת מניעת כתיבה ללא אישור",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"35",
|
||
"36"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:55:06.069Z"
|
||
},
|
||
{
|
||
"id": 38,
|
||
"title": "מנוע כתיבת בלוק הפתיחה (בלוק ה)",
|
||
"description": "פיתוח מנוע לכתיבת בלוק הפתיחה בסגנון דפנה",
|
||
"details": "יצירת מחלקה OpeningBlockWriter שכותבת את בלוק הפתיחה. ניתוח דפוסי הפתיחה מ-7 ההחלטות הקיימות (\"לפנינו\" vs \"עניינה של החלטה זו\"). יצירת prompt מובנה שמתאים את הפתיחה לסוג הערר ולמורכבות התיק. הוספת מנגנון לבחירת נוסח הפתיחה המתאים. שמירת תבניות פתיחה במסד הנתונים.",
|
||
"testStrategy": "בדיקה עם סוגי ערר שונים, השוואה לפתיחות בהחלטות הקיימות, וידוא התאמה לסגנון דפנה",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"37"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:58:34.296Z"
|
||
},
|
||
{
|
||
"id": 39,
|
||
"title": "מנוע כתיבת בלוק הרקע (בלוק ו)",
|
||
"description": "פיתוח מנוע לכתיבת בלוק הרקע בצורה ניטרלית",
|
||
"details": "יצירת מחלקה BackgroundBlockWriter שכותבת רקע ניטרלי. הגדרת כללי ניטרליות: אין ציטוטים מצדדים, אין מילות שיפוט, הצגת עובדות בלבד. יצירת רשימת מילים אסורות ומנגנון ולידציה. שימוש במידע מהמסמכים המסווגים לבניית הרקע. הוספת מנגנון לקביעת אורך הרקע לפי מורכבות התיק (3%-18% מההחלטה).",
|
||
"testStrategy": "בדיקת ניטרליות הטקסט, וידוא היעדר מילות שיפוט, בדיקת אורך מתאים לפי מורכבות",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"38"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:58:34.300Z"
|
||
},
|
||
{
|
||
"id": 40,
|
||
"title": "מנוע כתיבת בלוק הטענות (בלוק ז)",
|
||
"description": "פיתוח מנוע לכתיבת סיכום טענות הצדדים בגוף שלישי",
|
||
"details": "יצירת מחלקה ClaimsBlockWriter שמסכמת טענות בגוף שלישי. שימוש בטענות שחולצו במודול חילוץ הטענות. הבטחת נאמנות מוחלטת למקור - אין שינוי מילים או קיצור ללא ציון. יצירת מבנה לוגי של הצגת הטענות לפי צד. הוספת מנגנון לקישור כל טענה למקור המדויק במסמך.",
|
||
"testStrategy": "השוואת הטענות המסוכמות לטקסט המקור, וידוא נאמנות מוחלטת, בדיקת מבנה לוגי",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"39"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:58:34.303Z"
|
||
},
|
||
{
|
||
"id": 41,
|
||
"title": "מנוע כתיבת בלוק ההליכים (בלוק ח)",
|
||
"description": "פיתוח מנוע לכתיבת בלוק ההליכים (רק כשהיו הליכים מעבר לדיון פשוט)",
|
||
"details": "יצירת מחלקה ProceduresBlockWriter שכותבת תיעוד כרונולוגי של הליכים. זיהוי אוטומטי מתי נדרש הבלוק (סיור, השלמות טיעון, החלטות ביניים). יצירת ציר זמן של האירועים מהמסמכים. הבטחת דיוק עובדתי ומבנה כרונולוגי. הוספת מנגנון להחלטה אוטומטית האם הבלוק נדרש.",
|
||
"testStrategy": "בדיקה עם תיקים עם ובלי הליכים מורכבים, וידוא דיוק כרונולוגי, בדיקת החלטה נכונה על נחיצות הבלוק",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"40"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:58:34.305Z"
|
||
},
|
||
{
|
||
"id": 42,
|
||
"title": "מנוע כתיבת בלוק התכניות (בלוק ט)",
|
||
"description": "פיתוח מנוע לכתיבת בלוק התכניות והמסגרת הנורמטיבית",
|
||
"details": "יצירת מחלקה PlansBlockWriter שמטפלת ברישום תכניות. הגדרת כללי החלטה מתי נדרש פרק נפרד (מורכבות תכנונית, שאלה משפטית כמו ס' 152). שימוש במידע התכניות שזוהו במודול זיהוי התכניות. יצירת מבנה הירכי של התכניות (ארציות, מחוזיות, מקומיות). הוספת מנגנון לקביעת עומק הפירוט הנדרש.",
|
||
"testStrategy": "בדיקה עם תיקים בעלי מורכבות תכנונית שונה, וידוא החלטה נכונה על צורת ההצגה, בדיקת דיוק המידע",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"41"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:58:34.308Z"
|
||
},
|
||
{
|
||
"id": 43,
|
||
"title": "מנוע כתיבת בלוק הדיון (בלוק י) - ליבת המערכת",
|
||
"description": "פיתוח מנוע הכתיבה המרכזי לבלוק הדיון בשיטת CREAC",
|
||
"details": "יצירת מחלקה DiscussionBlockWriter - הליבה של המערכת. יישום שיטת CREAC: מסקנה בפתיחה, כלל משפטי, הסבר, יישום על המקרה, מסקנה. הבטחת מענה לכל טענה מבלוק ז. שימוש בכיוון שנקבע בשלב סיעור המוחות. הוספת מנגנון למניעת כפילויות והפניות לבלוקים קודמים. יצירת מבנה לוגי של הנימוקים לפי סדר חשיבות.",
|
||
"testStrategy": "בדיקת כיסוי כל הטענות, וידוא מבנה CREAC, בדיקת התאמה לכיוון שנקבע, בדיקת היעדר כפילויות",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"42"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:58:34.311Z"
|
||
},
|
||
{
|
||
"id": 44,
|
||
"title": "מנוע כתיבת בלוק הסיכום (בלוק יא)",
|
||
"description": "פיתוח מנוע לכתיבת בלוק הסיכום עם הוראות אופרטיביות",
|
||
"details": "יצירת מחלקה SummaryBlockWriter שכותבת הוראות אופרטיביות. גזירת ההוראות מהדיון שנכתב בבלוק י. הבטחת התאמה מדויקת להכרעה שנקבעה. יצירת מבנה ברור של ההוראות (מה מתקבל, מה נדחה, מה התנאים). הוספת מנגנון לולידציה של עקביות בין הדיון לסיכום.",
|
||
"testStrategy": "בדיקת התאמה בין הדיון לסיכום, וידוא בהירות ההוראות, בדיקת עקביות עם ההכרעה",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"43"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:58:34.313Z"
|
||
},
|
||
{
|
||
"id": 45,
|
||
"title": "מנוע ייצוא DOCX מעוצב",
|
||
"description": "פיתוח מנוע לייצוא ההחלטה לקובץ DOCX מעוצב בעברית RTL",
|
||
"details": "יצירת מחלקה DocxExporter שמייצרת DOCX מעוצב. הגדרת גופן David, כיוון RTL, כותרות מעוצבות, מספור סעיפים רציף. יצירת תבנית DOCX בסיסית עם הגדרות העיצוב. הוספת מנגנון לסימון מקומות תמונה (GIS, תשריט, סיור). הבטחת תמיכה מלאה בעברית ובכיוון RTL. יצירת מבנה היררכי של כותרות וסעיפים.",
|
||
"testStrategy": "בדיקת פתיחה נכונה של הקובץ ב-Word, וידוא עיצוב RTL, בדיקת גופנים וכותרות, בדיקת מספור",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"44"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:12:36.842Z"
|
||
},
|
||
{
|
||
"id": 46,
|
||
"title": "מנגנון בקרת איכות ווולידציה",
|
||
"description": "פיתוח מנגנון בקרת איכות לוולידציה של ההחלטה לפני הפלט",
|
||
"details": "יצירת מחלקה QualityController שבודקת: אפס הזיות (כל הפניה מול מסמכים שסופקו), מענה לכל טענה, רקע ניטרלי (ללא מילות שיפוט), משקלות בלוקים בטווח יחסי הזהב ±10%, ציטוטים נאמנים למקור. יצירת דוח ולידציה מפורט. הוספת מנגנון למניעת פלט במקרה של כשלון ולידציה קריטי.",
|
||
"testStrategy": "בדיקה עם החלטות תקינות ופגומות, וידוא זיהוי בעיות, בדיקת דיוק הולידציה",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"45"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:14:00.311Z"
|
||
},
|
||
{
|
||
"id": 47,
|
||
"title": "מודול לולאת למידה",
|
||
"description": "פיתוח מודול לקליטת גרסה סופית והשוואה לטיוטה ללמידה",
|
||
"details": "יצירת מחלקה LearningLoop שמקבלת את הגרסה הסופית שדפנה חתמה. השוואת הטיוטה לגרסה הסופית וזיהוי הבדלים. חילוץ לקחים: ביטויים חדשים, דפוסים שהשתנו, שגיאות חוזרות. עדכון מודל הסגנון על בסיס הלקחים. יצירת דוח למידה לחיים. שמירת הלקחים במסד הנתונים לשיפור עתידי.",
|
||
"testStrategy": "בדיקה עם גרסאות סופיות שונות, וידוא זיהוי נכון של הבדלים, בדיקת איכות הלקחים שחולצו",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"46"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:15:14.639Z"
|
||
},
|
||
{
|
||
"id": 48,
|
||
"title": "מודול מדדי הצלחה ודשבורד",
|
||
"description": "פיתוח מודול למדידת KPIs ויצירת דשבורד מעקב",
|
||
"details": "יצירת מחלקה MetricsTracker שמודדת: אחוז שינוי (השוואת טיוטה לגרסה סופית), זמן לטיוטה (מקצה לקצה), אפס הזיות (ספירת הפניות לא תקינות), מענה לכל טענה, משקלות בלוקים, רקע ניטרלי. יצירת דשבורד פשוט עם הצגת המדדים לאורך זמן. הוספת התראות כשמדד יורד מתחת לסף המינימום.",
|
||
"testStrategy": "בדיקת דיוק המדידות, וידוא עבודת הדשבורד, בדיקת התראות",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"47"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:16:10.708Z"
|
||
},
|
||
{
|
||
"id": 49,
|
||
"title": "מנגנון ניהול סודות ואבטחה",
|
||
"description": "יישום מנגנון אבטחה מלא עם Infisical וניהול סודות",
|
||
"details": "הגדרת Infisical לניהול כל הסודות: Anthropic API key, מחרוזות חיבור למסד נתונים, מפתחות הצפנה. יצירת מנגנון הצפנה לחומרי התיקים במסד הנתונים. הגדרת מדיניות גישה והרשאות. יצירת מנגנון audit log לכל הפעולות. הבטחת שחומרי התיקים לא נשלחים לשירותים חיצוניים מלבד Anthropic API.",
|
||
"testStrategy": "בדיקת טעינת סודות מ-Infisical, וידוא הצפנה של נתונים רגישים, בדיקת audit log",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"32"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:17:43.954Z"
|
||
},
|
||
{
|
||
"id": 50,
|
||
"title": "מנגנון גיבוי ושחזור",
|
||
"description": "יישום מנגנון גיבוי יומי אוטומטי ושחזור מסד הנתונים",
|
||
"details": "יצירת סקריפט גיבוי יומי אוטומטי למסד הנתונים PostgreSQL. הגדרת cron job לביצוע הגיבוי בשעות הלילה. יצירת מנגנון שחזור מגיבוי. שמירת הגיבויים במיקום מאובטח. הוספת מנגנון לבדיקת תקינות הגיבויים. יצירת תיעוד לתהליכי גיבוי ושחזור.",
|
||
"testStrategy": "בדיקת ביצוע גיבוי אוטומטי, בדיקת שחזור מגיבוי, וידוא תקינות הנתונים לאחר שחזור",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"49"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:18:18.247Z"
|
||
},
|
||
{
|
||
"id": 51,
|
||
"title": "ממשק CLI מלא ותיעוד",
|
||
"description": "פיתוח ממשק CLI מלא עם כל הפקודות הנדרשות ותיעוד מקיף",
|
||
"details": "יצירת CLI מקיף עם typer שכולל: העלאת מסמכים, הזנת תוצאה, סיעור מוחות, יצירת טיוטה, הזנת גרסה סופית, הצגת מדדים. הוספת help מפורט לכל פקודה. יצירת תיעוד מקיף למשתמש עם דוגמאות שימוש. הוספת מנגנון לולידציה של קלטים. יצירת מנגנון לטיפול בשגיאות ומסרי שגיאה ברורים בעברית.",
|
||
"testStrategy": "בדיקת כל הפקודות, וידוא הודעות עזרה ברורות, בדיקת טיפול בשגיאות, בדיקת תיעוד",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"48",
|
||
"50"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:19:20.241Z"
|
||
},
|
||
{
|
||
"id": 52,
|
||
"title": "בדיקות אינטגרציה ומבחן הסמכה",
|
||
"description": "יצירת חבילת בדיקות מקיפה ומבחן הסמכה על תיק אמיתי",
|
||
"details": "יצירת בדיקות אינטגרציה לכל התהליך מקצה לקצה. בדיקה עם תיק הכט (תיק שכבר יש לו החלטה סופית) - השוואת הטיוטה שהמערכת מייצרת להחלטה הסופית. מדידת פער ווידוא שהוא קטן מ-10%. יצירת מבחן הסמכה מובנה לפני שימוש מבצעי. הוספת בדיקות ביצועים - וידוא שהמערכת מייצרת טיוטה תוך יום עבודה.",
|
||
"testStrategy": "הרצת מבחן הסמכה על תיק הכט, מדידת זמן ביצוע, השוואה להחלטה הסופית, וידוא עמידה בכל הדרישות",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"51"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-04T07:50:59.998Z"
|
||
},
|
||
{
|
||
"id": 53,
|
||
"title": "הוספת שלב 6 - הגהת דפנה לדרישות הפונקציונליות",
|
||
"description": "הגדרת שלב הגהת דפנה החסר מהדרישות הפונקציונליות, כולל זרימת העבודה והממשקים",
|
||
"details": "יש להגדיר בדרישות הפונקציונליות: (1) איך דפנה מקבלת את הטיוטה בפורמט DOCX, (2) איך מחזירה הערות ותיקונים (ממשק או פורמט מובנה), (3) מי מעלה את הגרסה הסופית ללולאת הלמידה. כולל הגדרת API endpoints לקבלת הטיוטה ולהחזרת הערות, ומנגנון עדכון המודל על בסיס הפידבק.",
|
||
"testStrategy": "בדיקת זרימת העבודה המלאה מהעברת טיוטה לדפנה ועד עדכון המודל. וולידציה של פורמטים ותקינות הממשקים.",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T20:58:19.827Z"
|
||
},
|
||
{
|
||
"id": 54,
|
||
"title": "החלפת דרישת 'אפס הזיות' במנגנון grounding ווולידציה",
|
||
"description": "החלפת הדרישה הלא ריאלית של אפס הזיות במנגנון grounding מתקדם ומערכת וולידציה אוטומטית",
|
||
"details": "יישום מנגנון grounding שמקשר כל הפניה למסמך מקור ספציפי עם citation tracking. פיתוח מערכת וולידציה אוטומטית שבודקת כל ציטוט/הפניה מול המסמכים שסופקו. הגדרת מדד: שיעור הפניות שלא עוברות וולידציה = 0. כולל מנגנון flagging של הפניות חשודות ודרישה לאישור ידני.",
|
||
"testStrategy": "בדיקת דיוק הקישור בין הפניות למסמכי מקור. טסטים על מקרי קצה של הפניות שגויות וולידציה שהמערכת תופסת אותן.",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T20:58:55.741Z"
|
||
},
|
||
{
|
||
"id": 55,
|
||
"title": "הוספת ניהול context window overflow",
|
||
"description": "פיתוח מנגנון לטיפול בתיקים מורכבים שחורגים מ-context window של המודל",
|
||
"details": "יישום מדידת גודל חומרים בטוקנים, אסטרטגיית chunking חכמה ו/או summarization של מסמכים ארוכים. הגדרת סף התראה כשמתקרבים לגבול context window. פיתוח אלגוריתם לסדר עדיפויות של מסמכים והחלטה איזה חלקים לכלול בהקשר הנוכחי.",
|
||
"testStrategy": "בדיקה עם תיקים של 50+ מסמכים. וולידציה שהמערכת מזהה overflow ומפעילה אסטרטגיות הפחתה מתאימות.",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T20:59:34.704Z"
|
||
},
|
||
{
|
||
"id": 56,
|
||
"title": "הגדרה מתמטית מדויקת של 'אחוז שינוי'",
|
||
"description": "הגדרה ברורה ומתמטית של מדד אחוז השינוי עם דוגמאות קונקרטיות",
|
||
"details": "הגדרת מדד אחוז שינוי מבוסס edit distance על מילים (לא תווים). ספירת שינויים: הוספה, מחיקה, החלפה של מילים. נוסחה: (מספר שינויים / סך מילים בטקסט המקורי) * 100. כולל דוגמאות מפורטות ומקרי קצה כמו שינוי סדר מילים, שינויי פיסוק, וטיפול בסעיפים חדשים.",
|
||
"testStrategy": "בדיקת חישוב המדד על דוגמאות ידועות. השוואה עם מדדי edit distance סטנדרטיים כמו Levenshtein.",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:00:03.477Z"
|
||
},
|
||
{
|
||
"id": 57,
|
||
"title": "הוספת דרישות לבלוקים א-ד ויב",
|
||
"description": "הגדרת דרישות פונקציונליות לבלוקים החסרים: כותרת, הרכב, צדדים וחתימות",
|
||
"details": "הגדרת דרישות מפורטות לבלוק א (כותרת התיק), בלוק ב (הרכב בית הדין), בלוק ג (זיהוי הצדדים), בלוק ד (פרטים נוספים על הצדדים), ובלוק יב (חתימות). כולל פורמט הפלט, מקורות המידע, וכללי עיבוד לכל בלוק. התאמה לתבנית הפסיקה הסטנדרטית.",
|
||
"testStrategy": "וולידציה של פורמט הפלט לכל בלוק מול תבניות פסיקה קיימות. בדיקת שלמות המידע והתאמה לדרישות משפטיות.",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"53"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T20:58:19.831Z"
|
||
},
|
||
{
|
||
"id": 58,
|
||
"title": "יישום מנגנון שמירת מצב ביניים (persistence)",
|
||
"description": "פיתוח מערכת לשמירת מצב העבודה ו-recovery מנפילות מערכת",
|
||
"details": "יישום מנגנון auto-save שמשמר את מצב העבודה כל כמה דקות. שמירת גרסאות ביניים של כל בלוק, מעקב אחר השלב הנוכחי בתהליך, ומנגנון recovery שמאפשר המשך עבודה מהנקודה האחרונה שנשמרה. כולל ממשק למשתמש לבחירת נקודת שחזור.",
|
||
"testStrategy": "סימולציה של נפילות מערכת בשלבים שונים ובדיקת יכולת השחזור. וולידציה של שלמות הנתונים לאחר recovery.",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:01:07.799Z"
|
||
},
|
||
{
|
||
"id": 59,
|
||
"title": "תיקון ספירת שלבים בטבלת מעקב",
|
||
"description": "עדכון טבלת המעקב להתאמה למספר השלבים בפועל",
|
||
"details": "עדכון הטבלה לציון 7 שלבים במקום 6, כולל השלב החדש של הגהת דפנה. עדכון כל הרפרנסים למספר השלבים במסמכי הדרישות והתיעוד. וידוא עקביות בין כל המסמכים.",
|
||
"testStrategy": "סקירה מקיפה של כל המסמכים לוידוא עקביות במספר השלבים. בדיקת התאמה בין הטבלה לדרישות הפונקציונליות.",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"53"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:01:45.876Z"
|
||
},
|
||
{
|
||
"id": 60,
|
||
"title": "הכרה ב-MVP לרישוי והשבחה בלבד",
|
||
"description": "הגדרת גרסה ראשונה שמכסה רק רישוי והשבחה בשל חוסר נתוני אימון לפיצויים",
|
||
"details": "הגדרת MVP שמתמקד ברישוי והשבחה בלבד. תיעוד המגבלות הנוכחיות בנוגע לפיצויים ותכנית לאיסוף נתוני אימון עתידיים. הגדרת קריטריונים להרחבה לפיצויים בגרסאות עתידיות. עדכון מטריקות הצלחה בהתאם למגבלות הגרסה הראשונה.",
|
||
"testStrategy": "וולידציה שהמערכת מטפלת נכון רק בתיקי רישוי והשבחה. בדיקת התנהגות נכונה כשמתקבל תיק פיצויים.",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:01:45.879Z"
|
||
},
|
||
{
|
||
"id": 61,
|
||
"title": "בחינה מחדש של יעד 98% שיעור שינוי",
|
||
"description": "הערכה מחדש של ריאליות יעד 98% בהתבסס על מחקר Endsley על התנהגות מומחים",
|
||
"details": "ניתוח מחקרי על התנהגות מומחים ונטייתם לבצע שינויים. הגדרת יעד ריאלי יותר המתחשב בגורמים פסיכולוגיים. הצעת מדדי הצלחה חלופיים כמו שיעור שינויים משמעותיים או שביעות רצון המומחים. כולל הגדרת baseline מתוך נתונים היסטוריים אם קיימים.",
|
||
"testStrategy": "ניתוח סטטיסטי של נתוני שינויים מהמערכת הנוכחית (אם קיימת). השוואה ליעדים דומים במערכות אחרות.",
|
||
"priority": "medium",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:02:13.446Z"
|
||
},
|
||
{
|
||
"id": 62,
|
||
"title": "הגדרת מנגנון לולאת למידה",
|
||
"description": "פיתוח מנגנון עדכון המודל על בסיס פידבק מדפנה ומשתמשים",
|
||
"details": "הגדרת אסטרטגיית עדכון המודל: fine-tuning מול prompt engineering מול עדכון RAG. יישום מנגנון איסוף פידבק מובנה, עיבוד הנתונים לפורמט מתאים לאימון, ותהליך עדכון אוטומטי או חצי-אוטומטי. כולל מנגנון A/B testing לבדיקת שיפורים.",
|
||
"testStrategy": "בדיקת יעילות מנגנון העדכון על דוגמאות ידועות. מדידת שיפור ביצועים לאחר עדכונים.",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"53",
|
||
"58"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:02:32.651Z"
|
||
},
|
||
{
|
||
"id": 63,
|
||
"title": "הוספת הגנה מפני prompt injection",
|
||
"description": "יישום מנגנון הגנה מפני prompt injection ממסמכי מקור חיצוניים",
|
||
"details": "פיתוח מנגנון סינון וסניטיזציה של מסמכי קלט לזיהוי ניסיונות prompt injection. יישום validation של תוכן המסמכים, הפרדה בין הוראות המערכת לתוכן המסמכים, ומנגנון flagging של מסמכים חשודים. כולל רשימה שחורה של דפוסים מסוכנים.",
|
||
"testStrategy": "בדיקות חדירה עם מסמכים המכילים ניסיונות prompt injection ידועים. וולידציה שהמערכת מזהה ומנטרלת איומים.",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"54"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:02:49.768Z"
|
||
},
|
||
{
|
||
"id": 64,
|
||
"title": "הוספת מנגנון back-flows בתהליך",
|
||
"description": "יישום יכולת חזרה אחורה בתהליך לעריכת בלוקים קודמים או שינוי כיוון",
|
||
"details": "פיתוח ממשק לחזרה לשלבים קודמים בתהליך. מנגנון לעריכת בלוקים שכבר הושלמו, עדכון אוטומטי של בלוקים תלויים, ומעקב אחר שינויים. כולל אזהרות למשתמש על השפעת שינויים על בלוקים אחרים ואפשרות לביטול פעולות.",
|
||
"testStrategy": "בדיקת זרימת עבודה עם חזרות אחורה. וולידציה של עקביות הנתונים לאחר שינויים בבלוקים קודמים.",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"58"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:01:07.801Z"
|
||
},
|
||
{
|
||
"id": 65,
|
||
"title": "הוספת שלב QA/ולידציה לפני שליחה לדפנה",
|
||
"description": "יישום checklist אוטומטי ומנגנון QA לפני הפלט הסופי",
|
||
"details": "פיתוח checklist אוטומטי שבודק שלמות כל הבלוקים, תקינות הפורמט, נוכחות כל הרכיבים הנדרשים, ועקביות פנימית. מנגנון וולידציה של ציטוטים והפניות, בדיקת איכות השפה, ואזהרות על בעיות פוטנציאליות. כולל דוח QA מפורט למשתמש.",
|
||
"testStrategy": "בדיקת יעילות ה-checklist על פסיקות עם בעיות ידועות. וולידציה שהמערכת תופסת שגיאות נפוצות.",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"54",
|
||
"57"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:03:09.658Z"
|
||
},
|
||
{
|
||
"id": 66,
|
||
"title": "יישום ניהול גרסאות של בלוקים",
|
||
"description": "פיתוח מערכת ניהול גרסאות לכל בלוק בנפרד",
|
||
"details": "יישום version control לכל בלוק בנפרד, שמירת היסטוריית שינויים, יכולת השוואה בין גרסאות, ואפשרות לחזרה לגרסה קודמת של בלוק ספציפי. כולל ממשק גרפי להצגת ההבדלים בין גרסאות ומטא-דאטה על כל שינוי (זמן, משתמש, סיבה).",
|
||
"testStrategy": "בדיקת שמירה ושחזור של גרסאות שונות. וולידציה של דיוק ההשוואות בין גרסאות.",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"58"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:04:33.961Z"
|
||
},
|
||
{
|
||
"id": 67,
|
||
"title": "טיפול באיחוד תיקים",
|
||
"description": "פיתוח מנגנון לטיפול באיחוד תיקים כמו במקרה אריאלי 1078+1083",
|
||
"details": "יישום לוגיקה לזיהוי תיקים הקשורים זה לזה ומנגנון איחוד אוטומטי או חצי-אוטומטי. טיפול בחפיפות מידע, פתרון קונפליקטים, ושמירת קישוריות בין התיקים המאוחדים. כולל ממשק למשתמש לאישור ועריכת האיחוד המוצע.",
|
||
"testStrategy": "בדיקה על מקרי איחוד ידועים. וולידציה של שלמות המידע לאחר איחוד ותקינות הקישורים.",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"57",
|
||
"66"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:04:33.964Z"
|
||
},
|
||
{
|
||
"id": 68,
|
||
"title": "תיקון LOA של סיעור מוחות",
|
||
"description": "תיקון רמת האוטומציה של סיעור מוחות מרמה ג' לרמה ב'",
|
||
"details": "עדכון הגדרת רמת האוטומציה (LOA) של תהליך סיעור המוחות מרמה ג' (אוטומציה מלאה) לרמה ב' (אוטומציה עם פיקוח אנושי). עדכון כל המסמכים והממשקים הרלוונטיים. הבטחת התאמה לרמת הביקורת הנדרשת.",
|
||
"testStrategy": "סקירת כל המסמכים לוידוא עדכון עקבי של רמת האוטומציה. בדיקת התאמה לדרישות הביקורת.",
|
||
"priority": "low",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:04:33.967Z"
|
||
},
|
||
{
|
||
"id": 69,
|
||
"title": "הגדרת סיעור מוחות כאופציונלי",
|
||
"description": "שינוי הגדרת סיעור המוחות לאופציונלי גם במקרים שיש נימוק קיים",
|
||
"details": "עדכון הלוגיקה כך שסיעור מוחות יהיה אופציונלי בכל המקרים, כולל כאשר קיים נימוק בסיסי. הוספת אפשרות למשתמש לבחור האם להפעיל סיעור מוחות או לדלג עליו. עדכון ממשק המשתמש והדרישות בהתאם.",
|
||
"testStrategy": "בדיקת התנהגות המערכת במקרים שונים של נוכחות או היעדר נימוק. וולידציה של חופש הבחירה של המשתמש.",
|
||
"priority": "low",
|
||
"dependencies": [
|
||
"68"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:04:33.969Z"
|
||
},
|
||
{
|
||
"id": 70,
|
||
"title": "הוספת ניטרליות מבנית",
|
||
"description": "הרחבת דרישות הניטרליות מלקסיקלית למבנית",
|
||
"details": "הגדרת כללים לניטרליות מבנית בנוסף ללקסיקלית: סדר הצגת הטיעונים, אורך היחסי של סעיפים, מיקום המידע, ומבנה הפסיקה. פיתוח מנגנון בדיקה אוטומטית לזיהוי הטיה מבנית ואזהרות למשתמש. כולל הנחיות לכתיבה מאוזנת.",
|
||
"testStrategy": "ניתוח פסיקות לזיהוי דפוסי הטיה מבנית. בדיקת יעילות המנגנון בזיהוי וטיפול בהטיות.",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"57"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:04:33.973Z"
|
||
},
|
||
{
|
||
"id": 71,
|
||
"title": "מיפוי פרסורמן 4 stages",
|
||
"description": "הרחבת המיפוי מ-LOA בלבד לכלל 4 השלבים של מודל פרסורמן",
|
||
"details": "מיפוי מלא של התהליך לפי 4 השלבים של פרסורמן: Information acquisition, Information analysis, Decision selection, Action implementation. הגדרת רמת האוטומציה לכל שלב בנפרד ולא רק LOA כללי. עדכון התיעוד והדרישות בהתאם.",
|
||
"testStrategy": "וולידציה של המיפוי מול מודל פרסורמן המקורי. בדיקת עקביות ההגדרות בין השלבים השונים.",
|
||
"priority": "low",
|
||
"dependencies": [
|
||
"68"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:04:33.976Z"
|
||
},
|
||
{
|
||
"id": 72,
|
||
"title": "הגדרת דרישות ביצועים per-block וסינכרוני/אסינכרוני",
|
||
"description": "הגדרת דרישות ביצועים מפורטות לכל בלוק ובחירה בין עיבוד סינכרוני לאסינכרוני",
|
||
"details": "הגדרת SLA ספציפי לכל בלוק: זמני תגובה מקסימליים, throughput נדרש, ושיעור זמינות. החלטה על ארכיטקטורת עיבוד: סינכרונית לבלוקים קריטיים, אסינכרונית לבלוקים כבדים. יישום מנגנון ניטור ביצועים ואזהרות על חריגה מהסטנדרטים.",
|
||
"testStrategy": "בדיקות עומס לכל בלוק בנפרד. מדידת זמני תגובה ותפוקה בתנאים שונים. וולידציה של עמידה ב-SLA.",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"57"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-02T21:04:33.980Z"
|
||
},
|
||
{
|
||
"id": 73,
|
||
"title": "הרחבת DB schema לתהליך מלא",
|
||
"description": "הוספת שדות וטבלאות חסרים לתמיכה בתהליך המלא של כתיבת החלטות משפטיות",
|
||
"details": "בקובץ db.py:\n1. הוספת שדות לטבלת decisions:\n - direction_doc JSONB - לשמירת מסמך הכיוון\n - outcome_reasoning TEXT - לנימוק התוצאה\n2. הרחבת enum של status בטבלת cases ל-13 ערכים:\n ['new', 'uploading', 'processing', 'documents_ready', 'outcome_set', 'brainstorming', 'direction_approved', 'drafting', 'qa_review', 'drafted', 'exported', 'reviewed', 'final']\n3. יצירת טבלת qa_results חדשה:\n - id SERIAL PRIMARY KEY\n - case_number VARCHAR REFERENCES cases\n - validation_type VARCHAR\n - passed BOOLEAN\n - errors JSONB\n - created_at TIMESTAMP\n4. יישום כ-migration עם Alembic",
|
||
"testStrategy": "1. בדיקת migration up/down\n2. וידוא שכל השדות החדשים נוצרו\n3. בדיקת constraints ו-foreign keys\n4. בדיקת ערכי enum החדשים\n5. בדיקת insert/update על השדות החדשים",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T08:54:55.256Z"
|
||
},
|
||
{
|
||
"id": 74,
|
||
"title": "הוספת 5 API endpoints חדשים ב-MCP server",
|
||
"description": "יצירת endpoints חדשים לתמיכה בתהליך כתיבת ההחלטות",
|
||
"details": "בקובץ server.py או בקבצי API:\n1. POST /api/cases/{case_number}/outcome\n - קבלת: {outcome: string, reasoning: string}\n - שמירה ב-DB\n - עדכון סטטוס ל-outcome_set\n2. GET /api/cases/{case_number}/claims\n - החזרת טענות מחולצות מה-JSONB\n3. POST /api/cases/{case_number}/direction\n - קבלת מסמך כיוון כ-JSON\n - שמירה בשדה direction_doc\n - עדכון סטטוס ל-direction_approved\n4. POST /api/cases/{case_number}/qa\n - הרצת בדיקות QA\n - שמירה בטבלת qa_results\n - החזרת תוצאות\n5. POST /api/cases/{case_number}/learn\n - הפעלת לולאת למידה\n - עדכון מודלים/פרמטרים",
|
||
"testStrategy": "1. בדיקת כל endpoint עם Postman/pytest\n2. בדיקת validations על הקלט\n3. בדיקת error handling\n4. בדיקת עדכוני סטטוס\n5. בדיקת permissions/auth",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"73"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T08:55:56.839Z"
|
||
},
|
||
{
|
||
"id": 75,
|
||
"title": "הוספת 8 tools חדשים לפלאגין Paperclip",
|
||
"description": "הרחבת הפלאגין עם כלים חדשים לאינטראקציה עם המערכת המשפטית",
|
||
"details": "1. בקובץ src/worker.ts - הוספת 8 tools:\n - legal_document_upload: העלאת מסמך\n - legal_document_list: רשימת מסמכים\n - legal_document_text: קריאת טקסט ממסמך\n - legal_search_case: חיפוש תיק\n - legal_find_similar: מציאת תקדימים\n - legal_set_outcome: הגדרת תוצאה\n - legal_get_claims: קבלת טענות\n - legal_style_guide: קבלת הנחיות סגנון\n\n2. בקובץ src/legal-api.ts - יישום 8 methods:\n ```typescript\n async uploadDocument(caseNumber: string, file: File) {...}\n async listDocuments(caseNumber: string) {...}\n async getDocumentText(docId: string) {...}\n async searchCase(query: string) {...}\n async findSimilar(caseNumber: string) {...}\n async setOutcome(caseNumber: string, outcome: string, reasoning: string) {...}\n async getClaims(caseNumber: string) {...}\n async getStyleGuide() {...}\n ```\n\n3. בקובץ plugin.json - עדכון manifest",
|
||
"testStrategy": "1. בדיקת כל tool בנפרד\n2. בדיקת error handling\n3. בדיקת response format\n4. בדיקת אינטגרציה עם Claude\n5. בדיקת performance",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"74"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T08:59:27.838Z"
|
||
},
|
||
{
|
||
"id": 76,
|
||
"title": "שיפור status sync ב-Paperclip",
|
||
"description": "מיפוי מלא של 13 סטטוסים והוספת comments מפורטים",
|
||
"details": "1. עדכון מיפוי סטטוסים:\n ```javascript\n const statusMapping = {\n 'new': 'תיק חדש',\n 'uploading': 'העלאת מסמכים',\n 'processing': 'עיבוד מסמכים',\n 'documents_ready': 'מסמכים מוכנים',\n 'outcome_set': 'תוצאה הוגדרה',\n 'brainstorming': 'גיבוש כיוון',\n 'direction_approved': 'כיוון אושר',\n 'drafting': 'כתיבת החלטה',\n 'qa_review': 'בדיקת איכות',\n 'drafted': 'טיוטה מוכנה',\n 'exported': 'יוצאה ל-DOCX',\n 'reviewed': 'נבדקה ע\"י עו\"ד',\n 'final': 'סופית'\n }\n ```\n\n2. הוספת comments אוטומטיים ב-Paperclip:\n - בכל מעבר סטטוס\n - עם timestamp\n - עם פירוט הפעולה\n\n3. עדכון job sync-case-status",
|
||
"testStrategy": "1. בדיקת כל מעבר סטטוס\n2. וידוא comments נוצרים\n3. בדיקת sync דו-כיווני\n4. בדיקת edge cases\n5. בדיקת performance עם הרבה עדכונים",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"73"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T09:00:19.243Z"
|
||
},
|
||
{
|
||
"id": 77,
|
||
"title": "כתיבת SOUL.md לסוכנים",
|
||
"description": "יצירת קבצי הנחיות לסוכני AI בעברית",
|
||
"details": "1. CEO Agent SOUL.md:\n ```markdown\n # CEO Agent - סוכן מנהל\n \n ## תפקיד\n ניהול תהליך כתיבת החלטה משפטית מקצה לקצה\n \n ## הנחיות\n - עבוד בעברית תמיד\n - נהל את התהליך לפי 13 הסטטוסים\n - התרע לחיים במקרים: תקלה טכנית, החלטה מורכבת, חריגה מזמנים\n - וודא שכל שלב הושלם לפני מעבר לבא\n \n ## מיפוי סטטוסים\n [רשימת 13 סטטוסים עם הסבר לכל אחד]\n ```\n\n2. Case Analyst Agent SOUL.md:\n ```markdown\n # Case Analyst - סוכן מנתח\n \n ## תפקיד\n ניתוח מסמכים משפטיים וחילוץ מידע\n \n ## הנחיות\n - נתח מסמכים בעברית\n - חלץ טענות מרכזיות\n - זהה תקדימים רלוונטיים\n - סכם עובדות מהותיות\n ```",
|
||
"testStrategy": "1. בדיקת קריאות והבנה\n2. בדיקת שהסוכנים פועלים לפי ההנחיות\n3. בדיקת תגובות בעברית\n4. בדיקת זיהוי מצבי התראה\n5. בדיקת מעברי סטטוס",
|
||
"priority": "medium",
|
||
"dependencies": [],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T08:57:14.984Z"
|
||
},
|
||
{
|
||
"id": 78,
|
||
"title": "יישום skill /brainstorm",
|
||
"description": "יצירת skill לגיבוש כיוון ההחלטה בשיתוף עם המשתמש",
|
||
"details": "בקובץ skills/brainstorm.ts:\n```typescript\nexport async function brainstorm(caseNumber: string) {\n // שלב 1: הצגת טענות מרכזיות\n const claims = await api.getClaims(caseNumber);\n displayClaims(claims);\n \n // שלב 2: הצעת 2-3 כיוונים\n const directions = generateDirections(claims);\n displayDirections(directions);\n \n // שלב 3: דיון אינטראקטיבי\n let approved = false;\n while (!approved) {\n const feedback = await getUserFeedback();\n if (feedback.type === 'approve') {\n approved = true;\n } else {\n directions = refineDirections(directions, feedback);\n }\n }\n \n // שלב 4: יצירת מסמך כיוון\n const directionDoc = {\n mainDirection: directions.selected,\n keyPoints: directions.keyPoints,\n precedents: directions.precedents,\n approvedBy: 'user',\n timestamp: new Date()\n };\n \n // שלב 5: שמירה ועדכון סטטוס\n await api.saveDirection(caseNumber, directionDoc);\n}\n```",
|
||
"testStrategy": "1. בדיקת תצוגת טענות\n2. בדיקת יצירת כיוונים\n3. בדיקת אינטראקציה\n4. בדיקת שמירת מסמך כיוון\n5. בדיקת חסימה - אין התקדמות בלי אישור",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"74"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:16:24.667Z"
|
||
},
|
||
{
|
||
"id": 79,
|
||
"title": "שיפור skill /draft-decision לכתיבה בלוק-אחרי-בלוק",
|
||
"description": "שדרוג מ-stub לכתיבה מלאה עם 12 בלוקים",
|
||
"details": "בקובץ skills/draft-decision.ts:\n```typescript\nconst BLOCKS = [\n {id: 'ה', name: 'כותרת', temperature: 0.3},\n {id: 'ו', name: 'פתיח', temperature: 0.5},\n {id: 'ז', name: 'רקע', temperature: 0.4},\n {id: 'ח', name: 'טענות הצדדים', temperature: 0.3},\n {id: 'ט', name: 'תמצית', temperature: 0.6},\n {id: 'י', name: 'דיון והכרעה', temperature: 0.7, model: 'opus'},\n {id: 'יא', name: 'סוף דבר', temperature: 0.5}\n];\n\nexport async function draftDecision(caseNumber: string) {\n const direction = await api.getDirection(caseNumber);\n const lastBlock = await getLastCompletedBlock(caseNumber);\n \n for (let i = getBlockIndex(lastBlock) + 1; i < BLOCKS.length; i++) {\n const block = BLOCKS[i];\n \n // כתיבת בלוק\n const content = await writeBlock(block, {\n direction,\n previousBlocks: await getPreviousBlocks(caseNumber, i),\n temperature: block.temperature,\n model: block.model || 'default'\n });\n \n // שמירה מיידית\n await saveBlock(caseNumber, block.id, content);\n \n // בלוק י - CREAC + thinking\n if (block.id === 'י') {\n await applyCREAC(content);\n await addThinkingTags(content);\n }\n }\n}\n\n// Recovery function\nexport async function recoverDraft(caseNumber: string) {\n const lastBlock = await getLastCompletedBlock(caseNumber);\n return draftDecision(caseNumber); // ממשיך מאיפה שנפל\n}\n```",
|
||
"testStrategy": "1. בדיקת כתיבה רציפה של כל הבלוקים\n2. בדיקת recovery אחרי נפילה\n3. בדיקת CREAC בבלוק י\n4. בדיקת שמירה אחרי כל בלוק\n5. בדיקת פרמטרים שונים לכל בלוק",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"78",
|
||
"73"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:16:24.670Z"
|
||
},
|
||
{
|
||
"id": 80,
|
||
"title": "יישום skill /qa-validate",
|
||
"description": "בדיקות איכות אוטומטיות על ההחלטה",
|
||
"details": "בקובץ skills/qa-validate.ts:\n```typescript\nexport async function qaValidate(caseNumber: string) {\n const decision = await api.getDecision(caseNumber);\n const documents = await api.getDocuments(caseNumber);\n const claims = await api.getClaims(caseNumber);\n \n const checks = [\n {\n name: 'grounding_check',\n fn: () => validateGrounding(decision, documents),\n critical: true\n },\n {\n name: 'claims_coverage',\n fn: () => validateClaimsCoverage(decision, claims),\n critical: true\n },\n {\n name: 'neutral_background',\n fn: () => validateNeutrality(decision.background),\n critical: false\n },\n {\n name: 'weights_range',\n fn: () => validateWeightsInRange(decision),\n critical: true\n },\n {\n name: 'sequential_numbering',\n fn: () => validateNumbering(decision),\n critical: false\n },\n {\n name: 'definitions',\n fn: () => validateDefinitions(decision),\n critical: false\n }\n ];\n \n const results = [];\n let hasErrors = false;\n \n for (const check of checks) {\n const result = await check.fn();\n results.push({...result, name: check.name});\n if (!result.passed && check.critical) {\n hasErrors = true;\n }\n }\n \n // שמירת תוצאות\n await api.saveQAResults(caseNumber, results);\n \n // חסימת ייצוא אם יש שגיאות קריטיות\n if (hasErrors) {\n await api.blockExport(caseNumber);\n throw new Error('QA failed - export blocked');\n }\n \n return results;\n}\n```",
|
||
"testStrategy": "1. בדיקת כל validation בנפרד\n2. בדיקת חסימת ייצוא\n3. בדיקת דוח שגיאות מפורט\n4. בדיקת false positives\n5. בדיקת performance",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"79"
|
||
],
|
||
"status": "done",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:16:24.673Z"
|
||
},
|
||
{
|
||
"id": 81,
|
||
"title": "אינטגרציה E2E וחיבור Paperclip events",
|
||
"description": "חיבור מלא בין Paperclip ל-Claude Code עם trigger אוטומטי",
|
||
"details": "1. חיבור Paperclip events:\n```javascript\n// בקובץ paperclip-integration.js\npaperclip.on('issue.comment.created', async (event) => {\n if (event.comment.includes('/draft')) {\n await claudeCode.trigger('draft-decision', {\n caseNumber: event.issue.number\n });\n }\n});\n```\n\n2. E2E test על תיק הכט:\n```javascript\ntest('full flow - Hecht case', async () => {\n // העלאת חומרים\n await uploadDocuments('hecht', ['doc1.pdf', 'doc2.pdf']);\n \n // הזנת תוצאה\n await setOutcome('hecht', 'rejected', 'אין עילה');\n \n // כתיבה\n await triggerDraft('hecht');\n await waitForStatus('drafted');\n \n // QA\n const qaResults = await runQA('hecht');\n expect(qaResults.passed).toBe(true);\n \n // ייצוא\n const docx = await exportToDocx('hecht');\n \n // השוואה\n const similarity = await compareToFinal(docx, 'hecht-final.docx');\n expect(similarity).toBeGreaterThan(0.9);\n});\n```",
|
||
"testStrategy": "1. בדיקת trigger מ-Paperclip\n2. בדיקת flow מלא על תיק אמיתי\n3. בדיקת error handling\n4. בדיקת recovery\n5. השוואה להחלטה סופית",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
"75",
|
||
"76",
|
||
"77",
|
||
"78",
|
||
"79",
|
||
"80"
|
||
],
|
||
"status": "deferred",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:19:26.776Z"
|
||
},
|
||
{
|
||
"id": 82,
|
||
"title": "מבחן הסמכה",
|
||
"description": "בדיקת המערכת על תיק עם החלטה קיימת והשוואת איכות",
|
||
"details": "שלב ב - בדיקה על תיק עם החלטה:\n```javascript\nexport async function certificationTest() {\n // בחירת תיק עם החלטה סופית\n const testCase = await selectTestCase();\n \n // הסתרת ההחלטה המקורית\n await hideOriginalDecision(testCase.number);\n \n // הרצת המערכת\n await runFullFlow(testCase.number);\n \n // השוואה\n const draft = await getDecision(testCase.number);\n const original = testCase.originalDecision;\n \n const comparison = {\n structure: compareStructure(draft, original),\n content: compareContent(draft, original),\n reasoning: compareReasoning(draft, original),\n outcome: compareOutcome(draft, original)\n };\n \n // חישוב ציון כולל\n const score = calculateScore(comparison);\n \n // בדיקת סף - 90%\n if (score < 0.9) {\n throw new Error(`Score ${score} is below threshold`);\n }\n \n return {score, comparison};\n}\n\n// שלב ג - תיק חי\nexport async function liveTest() {\n const liveCase = await getLiveCase();\n await runFullFlow(liveCase.number);\n \n // שליחה לדפנה לבדיקה\n await sendForReview('dafna@law.firm', liveCase.number);\n}\n```",
|
||
"testStrategy": "1. בדיקת בחירת תיק מתאים\n2. בדיקת הסתרת החלטה מקורית\n3. בדיקת אלגוריתם השוואה\n4. בדיקת חישוב ציון\n5. בדיקת תהליך review עם דפנה",
|
||
"priority": "high",
|
||
"dependencies": [
|
||
"81"
|
||
],
|
||
"status": "deferred",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-03T10:19:26.779Z"
|
||
},
|
||
{
|
||
"id": 83,
|
||
"title": "Phase 1 — Project setup (legal-ai UI rewrite)",
|
||
"description": "הקמת scaffold של Next.js עם TypeScript + Tailwind v4 + App Router ב-web-ui/. התקנת כל התלויות: @tanstack/react-query, @tanstack/react-table, react-hook-form, @hookform/resolvers, zod, lucide-react, react-dropzone, openapi-typescript. העברת design-system.css tokens (navy/gold/parchment, Heebo) ל-Tailwind theme דרך @theme ו-CSS variables. הגדרת RTL עברית עם Heebo via next/font/google. בניית AppShell עם navy header + gold rule + nav.",
|
||
"status": "done",
|
||
"dependencies": [],
|
||
"priority": "high",
|
||
"details": "**השלמות (2026-04-11):**\n\n✅ **Scaffold:** Next.js 16.2.3 (חדש יותר מ-v15 שתוכנן), React 19.2.4, Tailwind v4, Turbopack.\n\n✅ **תלויות מותקנות** (`web-ui/package.json:11-21`):\n- @tanstack/react-query ^5.97.0\n- @tanstack/react-table ^8.21.3\n- react-hook-form ^7.72.1 + @hookform/resolvers ^5.2.2\n- zod ^4.3.6\n- lucide-react ^1.8.0\n- react-dropzone ^15.0.0\n- openapi-typescript ^7.13.0 (devDep)\n\n✅ **Design tokens** (`web-ui/src/app/globals.css:10-107`): Tailwind v4 @theme עם כל הצבעים (navy, cream, parchment, gold, ink, status colors), radii, shadows, fonts, dark mode preserved.\n\n✅ **RTL Hebrew** (`web-ui/src/app/layout.tsx:5-10, 23`): Heebo עם hebrew+latin subsets, `lang=\"he\" dir=\"rtl\"` on html.\n\n✅ **AppShell** (`web-ui/src/components/app-shell.tsx:29-70`): Navy header עם gold border-b-3, RTL nav, parchment body.\n\n✅ **Home page placeholder** (`web-ui/src/app/page.tsx`).\n\n✅ **Build:** `npm run build` עובר ב-3.8s, 0 errors, static.\n\n**נותר:** אישור ויזואלי של המשתמש עם `npm run dev`.\n\n**תוכנית מלאה:** `~/.claude/plans/joyful-marinating-sutton.md`",
|
||
"testStrategy": "1. `cd web-ui && npm run dev` — פתיחה ב-http://localhost:3000\n2. וידוא ויזואלי: Header navy עם gold rule, RTL rendering, פונט Heebo טעון\n3. השוואה ל-legal-ai.nautilus.marcusgroup.org — אותו מראה header\n4. בדיקת dark mode (toggle class על html)\n5. אישור סופי מהמשתמש",
|
||
"subtasks": [
|
||
{
|
||
"id": 1,
|
||
"title": "יצירת Next.js 16 scaffold עם TypeScript + Tailwind v4 + App Router",
|
||
"description": "הרצת create-next-app ב-web-ui/ עם App Router, TypeScript, Tailwind v4, ESLint",
|
||
"dependencies": [],
|
||
"details": "Next.js 16.2.3 (חדש יותר מ-v15), React 19.2.4, Tailwind v4, Turbopack. קבצים: web-ui/package.json, tsconfig.json, next.config.ts",
|
||
"status": "done",
|
||
"testStrategy": "npm run build succeeds",
|
||
"parentId": "undefined"
|
||
},
|
||
{
|
||
"id": 2,
|
||
"title": "התקנת כל התלויות הנדרשות",
|
||
"description": "npm install של @tanstack/react-query, @tanstack/react-table, react-hook-form, @hookform/resolvers, zod, lucide-react, react-dropzone, openapi-typescript",
|
||
"dependencies": [
|
||
1
|
||
],
|
||
"details": "ראה web-ui/package.json:11-21 לגרסאות המותקנות. כולל openapi-typescript כ-devDep לשלב 2.",
|
||
"status": "done",
|
||
"testStrategy": "npm ls shows all packages",
|
||
"parentId": "undefined"
|
||
},
|
||
{
|
||
"id": 3,
|
||
"title": "העברת design tokens ל-Tailwind v4 @theme",
|
||
"description": "פורט מלא של design-system.css ל-globals.css עם Tailwind v4 @theme syntax",
|
||
"dependencies": [
|
||
1
|
||
],
|
||
"details": "web-ui/src/app/globals.css:10-107 כולל כל הצבעים (navy, cream, parchment, gold, ink), status colors, radii, shadows, fonts, dark mode. CSS variables עובדים עם Tailwind classes.",
|
||
"status": "done",
|
||
"testStrategy": "Tailwind classes like bg-navy, text-gold work correctly",
|
||
"parentId": "undefined"
|
||
},
|
||
{
|
||
"id": 4,
|
||
"title": "הגדרת RTL Hebrew עם Heebo font",
|
||
"description": "next/font/google Heebo עם hebrew+latin, lang=he dir=rtl על html",
|
||
"dependencies": [
|
||
1
|
||
],
|
||
"details": "web-ui/src/app/layout.tsx:5-10 — Heebo עם weights 300-900, display swap. שורה 23: html lang=he dir=rtl.",
|
||
"status": "done",
|
||
"testStrategy": "Page renders RTL, Heebo font loaded",
|
||
"parentId": "undefined"
|
||
},
|
||
{
|
||
"id": 5,
|
||
"title": "בניית AppShell component עם navy header + gold rule",
|
||
"description": "רכיב shell עם header navy, gold border, RTL nav, parchment body",
|
||
"dependencies": [
|
||
3,
|
||
4
|
||
],
|
||
"details": "web-ui/src/components/app-shell.tsx:29-70 — Header עם bg-navy, border-b-3 border-gold, nav links (בית, העלאת מסמכים, אימון סגנון, מיומנויות, אבחון), main content area עם max-w-1400px.",
|
||
"status": "done",
|
||
"testStrategy": "Visual match to current header",
|
||
"parentId": "undefined"
|
||
},
|
||
{
|
||
"id": 6,
|
||
"title": "יצירת דף בית placeholder",
|
||
"description": "דף page.tsx עם AppShell ו-placeholder content",
|
||
"dependencies": [
|
||
5
|
||
],
|
||
"details": "web-ui/src/app/page.tsx:1-27 — דף בית עם כותרת 'עוזר משפטי', תיאור המערכת, gold gradient divider, כרטיס סטטוס.",
|
||
"status": "done",
|
||
"testStrategy": "npm run build succeeds (done: 3.8s, 0 errors)",
|
||
"parentId": "undefined"
|
||
},
|
||
{
|
||
"id": 7,
|
||
"title": "אישור ויזואלי מהמשתמש — npm run dev",
|
||
"description": "הרצת dev server ואישור סופי שה-UI תואם לציפיות — header, RTL, fonts, colors",
|
||
"dependencies": [
|
||
6
|
||
],
|
||
"details": "המשתמש צריך להריץ 'cd web-ui && npm run dev' ולאשר שהכל נראה כמו legal-ai.nautilus.marcusgroup.org. בדיקת dark mode אופציונלית.",
|
||
"status": "pending",
|
||
"testStrategy": "User confirms visual parity with current site, RTL works, Heebo font loads",
|
||
"parentId": "undefined"
|
||
}
|
||
],
|
||
"updatedAt": "2026-04-11T13:50:47.941Z"
|
||
},
|
||
{
|
||
"id": 84,
|
||
"title": "Phase 2 — API client + generated TypeScript types",
|
||
"description": "Add npm run api:types script that runs openapi-typescript against FastAPI's /openapi.json -> src/lib/api/types.ts. Build lib/api/client.ts (typed fetch wrapper + TanStack Query client with default retry/staleTime). Create one lib/api/<domain>.ts per endpoint category (cases, upload, compose, training, system), each exporting typed useQuery/useMutation hooks. Build lib/sse.ts as EventSource -> Query cache adapter. Plan: ~/.claude/plans/joyful-marinating-sutton.md.",
|
||
"details": "See full plan at ~/.claude/plans/joyful-marinating-sutton.md for architecture, critical files, risks, and open questions. This task is phase 2 of 7 in the legal-ai UI rewrite from vanilla HTML to Next.js 15 + shadcn/ui.",
|
||
"testStrategy": "useCases() hook returns typed array from live FastAPI. TypeScript errors if backend endpoint changes without frontend update.",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"83"
|
||
],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-11T15:51:34.020Z"
|
||
},
|
||
{
|
||
"id": 85,
|
||
"title": "Phase 3 — Core read views (home, case detail, compose)",
|
||
"description": "Port the 3 highest-value screens. Use the frontend-design Claude Code skill to generate layout + composition, passing design tokens (navy/gold/parchment, Heebo), editorial voice, and typed API hooks. Use shadcn Card/Badge/Tabs/Sheet/ScrollArea as primitives. Port the custom donut chart into <DonutChart> component. TanStack Query staleTime:5000 for case detail replaces manual 5s polling. Plan: ~/.claude/plans/joyful-marinating-sutton.md.",
|
||
"details": "See full plan at ~/.claude/plans/joyful-marinating-sutton.md for architecture, critical files, risks, and open questions. This task is phase 3 of 7 in the legal-ai UI rewrite from vanilla HTML to Next.js 15 + shadcn/ui.",
|
||
"testStrategy": "Users can browse case list, open a case detail, and view the compose screen with live data from FastAPI. All 3 screens visually match the existing legal-ai identity.",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"84"
|
||
],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-11T16:09:18.006Z"
|
||
},
|
||
{
|
||
"id": 86,
|
||
"title": "Phase 4 — Forms and wizards (new case, upload, inline edits)",
|
||
"description": "Port new case wizard, bulk upload, inline forms on case detail. Use react-hook-form + zod with schemas in lib/schemas/<entity>.ts. Build shared <WizardShell> from shadcn Card + Progress + Tabs. Build <DropZone> (react-dropzone + shadcn). Integrate SSE for upload progress via lib/sse.ts. Plan: ~/.claude/plans/joyful-marinating-sutton.md.",
|
||
"details": "See full plan at ~/.claude/plans/joyful-marinating-sutton.md for architecture, critical files, risks, and open questions. This task is phase 4 of 7 in the legal-ai UI rewrite from vanilla HTML to Next.js 15 + shadcn/ui.",
|
||
"testStrategy": "Users can create a new case via the multi-step wizard (case appears in Gitea + Paperclip), upload documents with live SSE progress, and edit case fields inline.",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"85"
|
||
],
|
||
"priority": "medium",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-11T16:25:55.569Z"
|
||
},
|
||
{
|
||
"id": 87,
|
||
"title": "Phase 5 — Secondary screens (compare, training, style report, skills, diagnostics)",
|
||
"description": "Port the remaining 5 views. Use TanStack Table for training corpus and diagnostics lists. Port any charts/visualizations from current index.html. Plan: ~/.claude/plans/joyful-marinating-sutton.md.",
|
||
"details": "See full plan at ~/.claude/plans/joyful-marinating-sutton.md for architecture, critical files, risks, and open questions. This task is phase 5 of 7 in the legal-ai UI rewrite from vanilla HTML to Next.js 15 + shadcn/ui.",
|
||
"testStrategy": "Feature parity with old legal-ai/web/static/index.html across all 10 views.",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"86"
|
||
],
|
||
"priority": "medium",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-11T17:33:42.976Z"
|
||
},
|
||
{
|
||
"id": 88,
|
||
"title": "Phase 6 — Polish & testing",
|
||
"description": "Accessibility pass (keyboard nav, aria-label on RTL icons, focus trap in modals). Error boundaries + toast notifications for failed mutations. Loading states for every query. Cross-browser smoke test (Chrome, Firefox, Safari) + mobile device test. Document E2E smoke test script in web-ui/README.md. Plan: ~/.claude/plans/joyful-marinating-sutton.md.",
|
||
"details": "See full plan at ~/.claude/plans/joyful-marinating-sutton.md for architecture, critical files, risks, and open questions. This task is phase 6 of 7 in the legal-ai UI rewrite from vanilla HTML to Next.js 15 + shadcn/ui.",
|
||
"testStrategy": "Lighthouse a11y score > 90, all loading states visible, errors show toasts, README has documented smoke test steps.",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"87"
|
||
],
|
||
"priority": "medium",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-11T17:44:08.337Z"
|
||
},
|
||
{
|
||
"id": 89,
|
||
"title": "Phase 7 — Deployment & cutover",
|
||
"description": "Add multi-stage Dockerfile for web-ui/ (Node 20 build -> nginx serve of out/). Add web-ui as new app in Coolify project pointing to staging subdomain legal-ai-next.nautilus.marcusgroup.org. Run full smoke test against staging. Cutover: DNS flip legal-ai.nautilus.marcusgroup.org to new app, keep old on rollback subdomain for 1 week. Follow-up PR removes legal-ai/web/static/index.html + design-system.css once stable. Plan: ~/.claude/plans/joyful-marinating-sutton.md.",
|
||
"details": "See full plan at ~/.claude/plans/joyful-marinating-sutton.md for architecture, critical files, risks, and open questions. This task is phase 7 of 7 in the legal-ai UI rewrite from vanilla HTML to Next.js 15 + shadcn/ui.",
|
||
"testStrategy": "legal-ai.nautilus.marcusgroup.org serves the new Next.js UI in production. Old UI accessible on rollback subdomain for 7 days. SSE streams working through Coolify proxy.",
|
||
"status": "pending",
|
||
"dependencies": [
|
||
"88"
|
||
],
|
||
"priority": "medium",
|
||
"subtasks": []
|
||
},
|
||
{
|
||
"id": 90,
|
||
"title": "Phase 4.5 — Practice area integration",
|
||
"description": "Add practice_area + appeal_subtype to the wizard, types, schema, case header, and cases table. Gap identified after backend commit 26d09d6 (multi-tenant axis) — new Next.js UI has zero integration while vanilla UI is fully wired. Plan: ~/.claude/plans/woolly-cooking-graham.md",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"86"
|
||
],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-11T17:15:57.831Z"
|
||
},
|
||
{
|
||
"id": 91,
|
||
"title": "Precedent attachment in compose screen",
|
||
"description": "Add case_precedents table + FastAPI endpoints + MCP tools + Next.js compose UI for attaching legal precedents (quote + citation + optional archived PDF) to threshold_claims/issues and to the case as a whole. Plan: ~/.claude/plans/woolly-cooking-graham.md",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-04-11T19:20:56.040Z"
|
||
},
|
||
{
|
||
"id": 92,
|
||
"title": "הסרת אפליקציית Flask הישנה מ-Coolify",
|
||
"description": "ארכיון והסרה של אפליקציית Flask הישנה מ-Coolify, וכיוון DNS כך ש-legal-ai.nautilus.marcusgroup.org יצביע על אפליקציית Next.js",
|
||
"details": "## פסאודו-קוד:\n```\n1. גיבוי הגדרות Flask מ-Coolify לפני מחיקה\n2. ב-Coolify dashboard:\n - מצא את הקונטיינר legal-ai-flask (או שם דומה)\n - עצור את הקונטיינר\n - צור snapshot או ארכיון של ההגדרות\n - מחק את הקונטיינר והסרוויס\n3. ב-DNS (Cloudflare/Coolify proxy):\n - שנה את legal-ai.nautilus.marcusgroup.org\n - הפנה ל-IP/service של legal-ai-next (Next.js app)\n4. ב-Next.js app (Coolify):\n - הוסף domain alias: legal-ai.nautilus.marcusgroup.org\n - עדכן SSL certificate\n```\n\n## קבצים מושפעים:\n- Coolify dashboard settings\n- DNS records (Cloudflare או ספק אחר)\n- Coolify proxy/Traefik configuration\n\n## הערות:\n- **אין שינויים בקוד** - רק הגדרות תשתית\n- ודא שה-Next.js app עובד עם שני הדומיינים במקביל לפני הסרת Flask\n- שמור לוגים מ-Flask לפני מחיקה למקרה של rollback",
|
||
"testStrategy": "## בדיקות:\n1. **לפני הסרה**: ודא ש-legal-ai-next.nautilus.marcusgroup.org עובד תקין\n2. **אחרי שינוי DNS**: \n - `curl -I https://legal-ai.nautilus.marcusgroup.org` - צריך להחזיר 200\n - בדוק SSL certificate תקין\n3. **בדיקת UI**: \n - פתח את legal-ai.nautilus.marcusgroup.org בדפדפן\n - ודא שזה אותו UI כמו legal-ai-next\n4. **בדיקת API**: \n - `curl https://legal-ai.nautilus.marcusgroup.org/api/cases`\n - ודא שמחזיר נתונים",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "pending",
|
||
"subtasks": []
|
||
},
|
||
{
|
||
"id": 93,
|
||
"title": "עדכון סטטוסים ב-WorkflowTimeline וב-status-badge",
|
||
"description": "עדכון רשימת הסטטוסים בממשק לפי ה-pipeline החדש: new → proofread → documents_ready → analyst_verified → research_complete → outcome_set → direction_approved → drafted → qa_passed → exported, כולל qa_failed ו-blocked",
|
||
"details": "## קבצים לעדכון:\n1. `web-ui/src/lib/api/cases.ts` - עדכון type CaseStatus\n2. `web-ui/src/components/cases/status-badge.tsx` - תוויות ועיצוב\n3. `web-ui/src/components/cases/workflow-timeline.tsx` - שלבי pipeline\n\n## פסאודו-קוד:\n\n### 1. cases.ts - עדכון הטיפוס:\n```typescript\nexport type CaseStatus =\n | \"new\"\n | \"proofread\"\n | \"documents_ready\"\n | \"analyst_verified\"\n | \"research_complete\"\n | \"outcome_set\"\n | \"direction_approved\"\n | \"drafted\"\n | \"qa_passed\"\n | \"exported\"\n | \"qa_failed\"\n | \"blocked\";\n```\n\n### 2. status-badge.tsx - תוויות עבריות וצבעים:\n```typescript\nconst STATUS_LABELS: Record<CaseStatus, string> = {\n new: \"חדש\",\n proofread: \"הוגה\",\n documents_ready: \"מסמכים מוכנים\",\n analyst_verified: \"אומת ע״י אנליסט\",\n research_complete: \"מחקר הושלם\",\n outcome_set: \"תוצאה נקבעה\",\n direction_approved: \"כיוון אושר\",\n drafted: \"טיוטה\",\n qa_passed: \"עבר QA\",\n exported: \"יוצא\",\n qa_failed: \"נכשל QA\",\n blocked: \"חסום\",\n};\n\nconst STATUS_TONE: Record<CaseStatus, string> = {\n new: \"bg-rule-soft text-ink-muted border-rule\",\n proofread: \"bg-info-bg text-info border-info/30\",\n documents_ready: \"bg-info-bg text-info border-info/40\",\n analyst_verified: \"bg-info-bg text-info border-info/50\",\n research_complete: \"bg-gold-wash text-gold-deep border-gold/40\",\n outcome_set: \"bg-gold-wash text-gold-deep border-gold/50\",\n direction_approved: \"bg-gold-wash text-gold-deep border-gold/60\",\n drafted: \"bg-warn-bg text-warn border-warn/40\",\n qa_passed: \"bg-success-bg text-success border-success/40\",\n exported: \"bg-success-bg text-success border-success/60\",\n qa_failed: \"bg-danger-bg text-danger border-danger/40\",\n blocked: \"bg-danger-bg text-danger border-danger/50\",\n};\n```\n\n### 3. workflow-timeline.tsx - קבוצות שלבים חדשות:\n```typescript\nconst PHASES: Phase[] = [\n { key: \"intake\", label: \"קליטה ועיבוד\", statuses: [\"new\", \"proofread\", \"documents_ready\"] },\n { key: \"analysis\", label: \"ניתוח\", statuses: [\"analyst_verified\", \"research_complete\"] },\n { key: \"direction\", label: \"קביעת כיוון\", statuses: [\"outcome_set\", \"direction_approved\"] },\n { key: \"writing\", label: \"כתיבה וביקורת\", statuses: [\"drafted\", \"qa_passed\"] },\n { key: \"done\", label: \"סגירה\", statuses: [\"exported\"] },\n];\n\n// טיפול בסטטוסי שגיאה (qa_failed, blocked) - הצגה מיוחדת\nif (status === \"qa_failed\" || status === \"blocked\") {\n // הצג באדום עם אייקון אזהרה\n}\n```",
|
||
"testStrategy": "## בדיקות:\n1. **Unit Tests** (אם קיימים):\n - ודא שכל הסטטוסים מופו נכון\n - בדוק שאין סטטוס חסר ב-STATUS_LABELS ו-STATUS_TONE\n\n2. **Visual Testing**:\n - צור/ערוך תיק ידנית ב-DB לכל סטטוס\n - ודא שהתווית מוצגת בעברית נכונה\n - ודא שהצבע מתאים (כחול לעיבוד, זהב לניתוח, ירוק להצלחה, אדום לשגיאה)\n\n3. **WorkflowTimeline**:\n - ודא שהשלב הנוכחי מודגש בצהוב\n - ודא ששלבים שהושלמו מסומנים בירוק\n - ודא שסטטוסי שגיאה (qa_failed, blocked) מוצגים עם אינדיקציה ויזואלית מיוחדת",
|
||
"priority": "high",
|
||
"dependencies": [],
|
||
"status": "pending",
|
||
"subtasks": []
|
||
},
|
||
{
|
||
"id": 94,
|
||
"title": "דף/קומפוננטה להצגת כל הסטטוסים עם הסברים",
|
||
"description": "יצירת דף /statuses או מודל עזרה שמסביר את כל הסטטוסים האפשריים - מה כל סטטוס אומר, איזה agent קובע אותו, ומה קורה אחר כך",
|
||
"details": "## אפשרויות מימוש:\n\n### אפשרות A: Popover tooltip בתוך WorkflowTimeline (מומלץ)\n```typescript\n// web-ui/src/components/cases/workflow-timeline.tsx\n// הוסף אייקון (?) ליד הכותרת שפותח popover\n\nconst STATUS_INFO: Record<CaseStatus, StatusInfo> = {\n new: {\n description: \"תיק נוצר, ממתין להעלאת מסמכים\",\n agent: \"משתמש\",\n nextStep: \"העלאת מסמכים → proofread\"\n },\n proofread: {\n description: \"מסמכים הועלו, עוברים הגהה אוטומטית\",\n agent: \"Proofread Agent\",\n nextStep: \"הגהה הושלמה → documents_ready\"\n },\n documents_ready: {\n description: \"מסמכים מוכנים לניתוח\",\n agent: \"Document Processor\",\n nextStep: \"בדיקת אנליסט → analyst_verified\"\n },\n analyst_verified: {\n description: \"אנליסט אימת את חילוץ הטענות\",\n agent: \"Analyst Agent\",\n nextStep: \"מחקר → research_complete\"\n },\n research_complete: {\n description: \"מחקר משפטי הושלם, פסיקה זוהתה\",\n agent: \"Research Agent\",\n nextStep: \"קביעת תוצאה → outcome_set\"\n },\n outcome_set: {\n description: \"דפנה קבעה את התוצאה (דחייה/קבלה)\",\n agent: \"משתמש (דפנה)\",\n nextStep: \"אישור כיוון → direction_approved\"\n },\n direction_approved: {\n description: \"כיוון ההחלטה אושר, מוכן לכתיבה\",\n agent: \"משתמש\",\n nextStep: \"כתיבה → drafted\"\n },\n drafted: {\n description: \"טיוטת החלטה נכתבה\",\n agent: \"Writing Agent\",\n nextStep: \"בדיקת QA → qa_passed\"\n },\n qa_passed: {\n description: \"טיוטה עברה בדיקת איכות\",\n agent: \"QA Agent\",\n nextStep: \"ייצוא → exported\"\n },\n exported: {\n description: \"ההחלטה יוצאה כ-DOCX\",\n agent: \"Export Service\",\n nextStep: \"הושלם\"\n },\n qa_failed: {\n description: \"טיוטה נכשלה בבדיקת QA\",\n agent: \"QA Agent\",\n nextStep: \"חזרה לכתיבה → drafted\"\n },\n blocked: {\n description: \"תיק חסום - דורש התערבות ידנית\",\n agent: \"מערכת\",\n nextStep: \"טיפול ידני\"\n },\n};\n```\n\n### אפשרות B: דף /statuses נפרד\n```typescript\n// web-ui/src/app/statuses/page.tsx\n// דף עצמאי עם טבלה של כל הסטטוסים\n```\n\n## המלצה: אפשרות A - פשוטה יותר ומשתלבת ב-UX הקיים",
|
||
"testStrategy": "## בדיקות:\n1. **UI Testing**:\n - לחיצה על אייקון העזרה פותחת popover/tooltip\n - כל סטטוס מציג: תיאור, agent, שלב הבא\n - סגירת ה-popover עובדת (לחיצה מחוץ/Escape)\n\n2. **Accessibility**:\n - ה-popover נגיש למקלדת (Tab, Enter, Escape)\n - aria-label מתאים\n - RTL מוצג נכון\n\n3. **Content Review**:\n - כל ההסברים בעברית תקנית\n - הזרימה בין סטטוסים מובנת",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
93
|
||
],
|
||
"status": "pending",
|
||
"subtasks": []
|
||
},
|
||
{
|
||
"id": 95,
|
||
"title": "עריכה ידנית של סטטוס בדף התיק",
|
||
"description": "הוספת dropdown או מודל בדף התיק לשינוי סטטוס ידני, לטיפול במקרים שבהם ה-pipeline נתקע או צריך reset",
|
||
"details": "## מיקום: בתוך הכרטיס של WorkflowTimeline (בצד ימין של דף התיק)\n\n## פסאודו-קוד:\n\n### 1. קומפוננטת StatusEditor:\n```typescript\n// web-ui/src/components/cases/status-editor.tsx\n\nimport { Select } from \"@/components/ui/select\";\nimport { Button } from \"@/components/ui/button\";\nimport { useUpdateCase } from \"@/lib/api/cases\";\nimport { toast } from \"sonner\";\n\nexport function StatusEditor({ caseNumber, currentStatus }: Props) {\n const [selectedStatus, setSelectedStatus] = useState(currentStatus);\n const updateCase = useUpdateCase(caseNumber);\n\n const handleSave = async () => {\n if (selectedStatus === currentStatus) return;\n \n try {\n await updateCase.mutateAsync({ status: selectedStatus });\n toast.success(\"סטטוס עודכן בהצלחה\");\n } catch (error) {\n toast.error(\"שגיאה בעדכון הסטטוס\");\n }\n };\n\n return (\n <div className=\"flex items-center gap-2 mt-4\">\n <Select value={selectedStatus} onValueChange={setSelectedStatus}>\n {ALL_STATUSES.map(status => (\n <SelectItem key={status} value={status}>\n {STATUS_LABELS[status]}\n </SelectItem>\n ))}\n </Select>\n <Button \n onClick={handleSave} \n disabled={selectedStatus === currentStatus || updateCase.isPending}\n size=\"sm\"\n >\n עדכן\n </Button>\n </div>\n );\n}\n```\n\n### 2. שילוב בדף התיק:\n```typescript\n// web-ui/src/app/cases/[caseNumber]/page.tsx\n// בתוך הכרטיס של WorkflowTimeline\n\n<Card className=\"bg-surface border-rule shadow-sm h-fit\">\n <CardContent className=\"px-6 py-5\">\n <h2 className=\"text-navy text-base mb-4\">שלב בתהליך</h2>\n <WorkflowTimeline status={data?.status} />\n {data && <StatusEditor caseNumber={caseNumber} currentStatus={data.status} />}\n </CardContent>\n</Card>\n```\n\n### 3. עדכון ה-API (אם נדרש):\nה-`useUpdateCase` כבר תומך ב-status field לפי `caseUpdateSchema`.",
|
||
"testStrategy": "## בדיקות:\n1. **Functionality**:\n - בחירת סטטוס חדש מה-dropdown\n - לחיצה על \"עדכן\" שולחת PUT request ל-API\n - הסטטוס מתעדכן ב-UI אחרי הצלחה\n - toast הודעה מוצגת\n\n2. **Edge Cases**:\n - לחיצה על \"עדכן\" כשהסטטוס לא השתנה - כפתור disabled\n - טיפול בשגיאת API - הודעת שגיאה\n - כפתור disabled בזמן loading\n\n3. **Integration**:\n - ה-WorkflowTimeline מתעדכן מיד אחרי שינוי סטטוס\n - ה-StatusBadge בכותרת מתעדכן\n - הנתונים מסונכרנים עם ה-DB",
|
||
"priority": "medium",
|
||
"dependencies": [
|
||
93
|
||
],
|
||
"status": "pending",
|
||
"subtasks": []
|
||
},
|
||
{
|
||
"id": 96,
|
||
"title": "מיזוג כפתורי פעולות לכרטיס הסקירה הראשי",
|
||
"description": "העברת הכפתורים 'פתח בעורך ההחלטה' ו'עריכת פרטי תיק' מהלשונית 'פעולות' לכרטיס הכותרת העליון, והסרת הלשונית המיותרת",
|
||
"details": "## קבצים לעדכון:\n- `web-ui/src/app/cases/[caseNumber]/page.tsx`\n- `web-ui/src/components/cases/case-header.tsx`\n\n## פסאודו-קוד:\n\n### 1. עדכון CaseHeader להוספת כפתורי פעולה:\n```typescript\n// web-ui/src/components/cases/case-header.tsx\n\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\";\nimport { CaseEditDialog } from \"@/components/cases/case-edit-dialog\";\n\nexport function CaseHeader({ data }: { data?: CaseDetail }) {\n return (\n <Card className=\"bg-surface border-rule shadow-sm\">\n <CardContent className=\"px-6 py-5\">\n {/* ... breadcrumb קיים ... */}\n \n <div className=\"flex items-start justify-between gap-6 flex-wrap\">\n <div className=\"space-y-2\">\n {/* ... כותרת וסטטוס קיימים ... */}\n </div>\n\n {/* כפתורי פעולה - חדש */}\n <div className=\"flex items-center gap-3 flex-wrap\">\n <Button asChild className=\"bg-navy hover:bg-navy-soft text-parchment\">\n <Link href={`/cases/${data?.case_number}/compose`}>\n פתח בעורך ההחלטה\n </Link>\n </Button>\n {data && <CaseEditDialog data={data} />}\n </div>\n </div>\n\n {/* ... תאריכים קיימים ... */}\n </CardContent>\n </Card>\n );\n}\n```\n\n### 2. הסרת לשונית \"פעולות\" מדף התיק:\n```typescript\n// web-ui/src/app/cases/[caseNumber]/page.tsx\n\n// הסר את TabsTrigger value=\"actions\"\n<TabsList className=\"bg-rule-soft/60\">\n <TabsTrigger value=\"overview\">סקירה</TabsTrigger>\n <TabsTrigger value=\"documents\">מסמכים (...)</TabsTrigger>\n {/* הוסר: <TabsTrigger value=\"actions\">פעולות</TabsTrigger> */}\n</TabsList>\n\n// הסר את TabsContent value=\"actions\"\n// הקוד הבא נמחק:\n// <TabsContent value=\"actions\" className=\"mt-5\">\n// <div className=\"flex items-center gap-3 flex-wrap\">\n// <Button asChild>...</Button>\n// {data && <CaseEditDialog data={data} />}\n// </div>\n// </TabsContent>\n```\n\n### 3. עדכון CaseHeader props:\n```typescript\n// צריך להעביר caseNumber ל-CaseHeader אם עדיין לא קיים\n<CaseHeader data={data} caseNumber={caseNumber} />\n```",
|
||
"testStrategy": "## בדיקות:\n1. **Visual**:\n - כפתורי הפעולה מופיעים בכרטיס העליון\n - הכפתורים מיושרים ימינה (RTL)\n - responsive - נגלשים נכון במסכים קטנים\n\n2. **Functionality**:\n - \"פתח בעורך ההחלטה\" מנווט ל-/cases/{caseNumber}/compose\n - \"עריכת פרטי תיק\" פותח את ה-CaseEditDialog\n - ה-dialog עובד כרגיל\n\n3. **Removal**:\n - לשונית \"פעולות\" לא מופיעה יותר ב-Tabs\n - אין שגיאות קונסול\n - ניווט ל-#actions לא עובד (ולא אמור)\n\n4. **Regression**:\n - לשוניות \"סקירה\" ו\"מסמכים\" עובדות כרגיל\n - שאר הדף לא נפגע",
|
||
"priority": "low",
|
||
"dependencies": [],
|
||
"status": "pending",
|
||
"subtasks": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"created": "2026-04-13T14:20:54.888Z",
|
||
"updated": "2026-04-13T14:20:54.888Z",
|
||
"description": "Tasks for master context"
|
||
}
|
||
},
|
||
"legal-ai": {
|
||
"tasks": [
|
||
{
|
||
"id": "1",
|
||
"title": "V7 schema: precedent library + halachot tables",
|
||
"description": "Add SCHEMA_V7_SQL to db.py: extend case_law with source_kind/document_id/extraction_status/halacha_extraction_status/practice_area (CHECK constraint for 3 areas)/appeal_subtype/headnote. Create precedent_chunks table with vector(1024). Create halachot table with vector(1024), review_status, practice_areas array. Add IVFFlat indexes. Register V7 in init_schema().",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T08:17:59.928Z"
|
||
},
|
||
{
|
||
"id": "2",
|
||
"title": "Chunker: add court ruling section patterns",
|
||
"description": "Extend services/chunker.py SECTION_PATTERNS with 4 patterns for external court rulings: פסק דין→ruling, נימוקים→legal_analysis, סוף דבר→conclusion, העובדות הצריכות לעניין→facts",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"1"
|
||
],
|
||
"priority": "medium",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T08:18:33.239Z"
|
||
},
|
||
{
|
||
"id": "3",
|
||
"title": "Service: halacha_extractor.py",
|
||
"description": "New service that runs claude_session.query_json() over chunks where section_type IN (legal_analysis, ruling, conclusion). Concurrency=3, retry=1. Validates supporting_quote with substring check after Hebrew normalization. All halachot inserted with review_status=pending_review (no auto-publish). Embeds rule_statement+reasoning_summary via Voyage. Uses Hebrew prompt from plan appendix א. Idempotent on case_law_id.",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"1",
|
||
"2"
|
||
],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T08:22:12.392Z"
|
||
},
|
||
{
|
||
"id": "4",
|
||
"title": "Service: precedent_library.py orchestrator",
|
||
"description": "New service with ingest_precedent(file_path, citation, court, decision_date, source_type, precedent_level, practice_area, appeal_subtype, subject_tags, case_name, task_id) that orchestrates: extract_text → proofread → INSERT case_law (source_kind=external_upload) → chunk → embed → store precedent_chunks → halacha_extractor.extract → embed halachot → publish progress. Plus delete_precedent (cascading), list_precedents(filters), get_precedent(id), search_library(query, filters, limit) merging chunks+approved-halachot ranked.",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"1",
|
||
"2",
|
||
"3"
|
||
],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T08:23:33.235Z"
|
||
},
|
||
{
|
||
"id": "5",
|
||
"title": "MCP tools: precedent_library + halacha_review",
|
||
"description": "Create mcp-server/src/legal_mcp/tools/precedent_library.py with tools: precedent_library_upload, precedent_library_list, precedent_library_get, precedent_library_delete, precedent_extract_halachot, search_precedent_library (semantic, returns merged halachot+chunks), halacha_review (approve/reject). Register all in server.py. Do NOT modify existing precedent_search_library or search_decisions.",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"4"
|
||
],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T08:25:07.439Z"
|
||
},
|
||
{
|
||
"id": "6",
|
||
"title": "FastAPI endpoints under /api/precedent-library",
|
||
"description": "Add to web/app.py: POST /api/precedent-library/upload (multipart), GET /api/precedent-library (filters), GET /api/precedent-library/{id}, PATCH /api/precedent-library/{id}, DELETE /api/precedent-library/{id}, POST /api/precedent-library/{id}/extract-halachot, GET /api/precedent-library/search, GET /api/halachot?status=pending_review, PATCH /api/halachot/{id}, GET /api/precedent-library/stats. Reuse existing /api/progress/{task_id} SSE.",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"5"
|
||
],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T08:26:21.860Z"
|
||
},
|
||
{
|
||
"id": "7",
|
||
"title": "UI: /precedents page with 4 tabs",
|
||
"description": "New web-ui/src/app/precedents/page.tsx with tabs: Library (table+filters+upload), Semantic Search, Pending Review (PRIMARY - bulk approval UX with J/K nav, A/R/E shortcuts, side-by-side rule_statement vs supporting_quote, badge count), Stats. New components in web-ui/src/components/precedents/: precedent-upload-sheet, precedent-list-table, precedent-search-panel, precedent-detail-panel, halacha-review-card. New hooks in web-ui/src/lib/api/precedent-library.ts. Add nav link in app-shell.tsx.",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"6"
|
||
],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T08:34:00.548Z"
|
||
},
|
||
{
|
||
"id": "8",
|
||
"title": "Agent integration: legal-writer + 3 others",
|
||
"description": "Update .claude/agents/legal-writer.md (PRIMARY) — add mcp__legal-ai__search_precedent_library to tools and prompt section explaining when to use it for CREAC rule+explanation in block י. Update legal-researcher.md, legal-analyst.md, legal-ceo.md, legal-qa.md to add the tool. Update skills/decision/SKILL.md with section explaining the 3 corpora (style_corpus, case_precedents, precedent_library).",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"5"
|
||
],
|
||
"priority": "medium",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T08:36:24.711Z"
|
||
},
|
||
{
|
||
"id": "9",
|
||
"title": "Service: precedent_metadata_extractor.py",
|
||
"description": "LLM-based extractor that auto-fills empty metadata fields after upload: short case_name (e.g. 'אהרון ברק' from long citation), summary (2-3 sentences), headnote, key_quote, subject_tags array, appeal_subtype. Reuses claude_session.query_json. Returns dict; caller decides which empty fields to merge (never overrides user values).",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T10:19:15.105Z"
|
||
},
|
||
{
|
||
"id": "10",
|
||
"title": "Halacha extractor: dual mode (binding vs persuasive)",
|
||
"description": "Update halacha_extractor.py prompt to branch on is_binding: binding=true → strict halacha extraction (current). binding=false → extract reasoning principles, applications of established halachot, persuasive conclusions. New rule_types: 'application' (applying known rule to facts), 'persuasive' (committee's reasoning citable as authority). Schema unchanged (rule_type already TEXT).",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T10:19:15.117Z"
|
||
},
|
||
{
|
||
"id": "11",
|
||
"title": "Ingest pipeline: add metadata extraction stage",
|
||
"description": "In services/precedent_library.py:ingest_precedent, after halacha extraction, run metadata_extractor and PATCH the case_law row with auto-filled fields (only those left empty by user). Publish progress 'extracting_metadata'.",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [
|
||
"9"
|
||
],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T10:19:15.128Z"
|
||
},
|
||
{
|
||
"id": "12",
|
||
"title": "UI: precedent edit sheet",
|
||
"description": "Add edit button to library-list-panel rows that opens a Sheet with all editable fields (case_name, citation, court, date, practice_area, appeal_subtype, subject_tags, summary, headnote, key_quote, source_type, precedent_level, is_binding). Pre-populated from current values. Submit calls PATCH /api/precedent-library/{id} via useUpdatePrecedent. After save, invalidate library list query.",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "done",
|
||
"dependencies": [],
|
||
"priority": "high",
|
||
"subtasks": [],
|
||
"updatedAt": "2026-05-03T10:19:15.134Z"
|
||
},
|
||
{
|
||
"id": "13",
|
||
"title": "Test on 403-17: fix metadata + re-extract",
|
||
"description": "After deploy: PATCH 403-17 to set case_name='ערר 403/17', then trigger precedent_extract_halachot to test the dual-mode extraction on a non-binding committee decision.",
|
||
"details": "",
|
||
"testStrategy": "",
|
||
"status": "pending",
|
||
"dependencies": [
|
||
"9",
|
||
"10",
|
||
"11",
|
||
"12"
|
||
],
|
||
"priority": "medium",
|
||
"subtasks": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"version": "1.0.0",
|
||
"lastModified": "2026-05-03T10:19:15.134Z",
|
||
"taskCount": 13,
|
||
"completedCount": 12,
|
||
"tags": [
|
||
"legal-ai"
|
||
]
|
||
}
|
||
}
|
||
} |