tasks(legal-ai): 8 fix-unit tasks (59-66) + 23 GAP subtasks from gap-audit
Granularity (epic-per-fix-unit + subtask-per-gap) and dependency-aware/WSJF prioritization both backed by ≥3 authoritative sources (SAFe/Pichler/OWASP/CVSS; Wake-INVEST/Cohn/Agile-Alliance/Atlassian/SAFe). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -2000,6 +2000,348 @@
|
|||||||
"testStrategy": "document_list על 7 וריאציות פורמט של תיק קיים → כולן מחזירות את אותם מסמכים; תיק לא-קיים אמיתי עדיין מחזיר 'לא נמצא'.",
|
"testStrategy": "document_list על 7 וריאציות פורמט של תיק קיים → כולן מחזירות את אותם מסמכים; תיק לא-קיים אמיתי עדיין מחזיר 'לא נמצא'.",
|
||||||
"subtasks": [],
|
"subtasks": [],
|
||||||
"updatedAt": "2026-05-30T11:54:34.291Z"
|
"updatedAt": "2026-05-30T11:54:34.291Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "59",
|
||||||
|
"title": "[FU-1] איחוד מסלול ה-ingest למסלול קנוני אחד",
|
||||||
|
"description": "מאחד את ingest_precedent ו-ingest_internal_decision למסלול קנוני יחיד; מבטל את האסימטריות.",
|
||||||
|
"details": "מכסה GAP-01,02,04,05. מספק INV-ING1/ING3/G2/G4. severity: Critical. סוג: קוד. יסוד — FU-2/FU-3/FU-7 תלויים בו. מקור: docs/spec/gap-audit.md + 01-ingest.md.",
|
||||||
|
"testStrategy": "",
|
||||||
|
"status": "pending",
|
||||||
|
"dependencies": [],
|
||||||
|
"priority": "high",
|
||||||
|
"subtasks": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "[GAP-01] מסלול ingest קנוני יחיד",
|
||||||
|
"description": "ביטול שני המסלולים המקבילים (precedent_library.py:88 vs internal_decisions.py:73); כל סוג = פרמטרים, לא פונקציה נפרדת.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-ING1/G2",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "59"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "[GAP-02] תזמון חילוץ metadata לכל סוג",
|
||||||
|
"description": "קריאה ל-request_metadata_extraction גם במסלול הפנימי (היום רק halacha, internal_decisions.py:208).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-ING3/DM1",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "59"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"title": "[GAP-04] ולידציית enums אחידה",
|
||||||
|
"description": "הוספת ולידציית practice_area/source_type למסלול הפנימי (כמו precedent_library.py:131-134).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-G4",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "59"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"title": "[GAP-05] איחוד staging/derivation/citation-guard/multimodal/fallback",
|
||||||
|
"description": "שאר 6 האסימטריות → פרמטרים של המסלול הקנוני (01-ingest §4).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-ING1",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "59"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updatedAt": "2026-05-30T17:37:34.741136+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "60",
|
||||||
|
"title": "[FU-2] ingest idempotent + מזהים קנוניים",
|
||||||
|
"description": "מפתח-upsert דטרמיניסטי + נרמול case_number בכתיבה + תיאום מספרים מעורבים.",
|
||||||
|
"details": "מכסה GAP-03,06,07,08,13. מספק INV-ING2/G3/G1/ID1/ID2/DM2/DM1. severity: Critical. סוג: קוד + מיגרציית-נתונים (דורש אישור-עלות). תלוי ב-FU-1.",
|
||||||
|
"testStrategy": "",
|
||||||
|
"status": "pending",
|
||||||
|
"dependencies": [
|
||||||
|
"59"
|
||||||
|
],
|
||||||
|
"priority": "high",
|
||||||
|
"subtasks": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "[GAP-03] קליטה idempotent (upsert על מפתח קנוני)",
|
||||||
|
"description": "קליטה חוזרת = עדכון, לא כפילות.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-ING2/G3",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "[GAP-06] נרמול case_number בכתיבה",
|
||||||
|
"description": "היום רק תיקון-קריאה (_normalize_case_number, db.py:1196-1211).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-G1/ID1",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"title": "[GAP-07] תיאום מספרי-תיק מעורבים (with-month canonical)",
|
||||||
|
"description": "מיגרציה חד-פעמית; הצורה עם-חודש קנונית (החלטת-יו\"ר).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-ID1",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"title": "[GAP-08] הסרת ציטוט-מלא כ-case_number",
|
||||||
|
"description": "רשומות עם ציטוט מלא כמזהה (legacy).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-DM2/ID2",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"title": "[GAP-13] שדה searchable מפורש",
|
||||||
|
"description": "דגל 'עבר חוזה-שלמות' מובחן מ-extraction_status.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-DM1",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "60"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updatedAt": "2026-05-30T17:37:34.741136+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "61",
|
||||||
|
"title": "[FU-3] re-index בשינוי תוכן",
|
||||||
|
"description": "embedding מתעדכן אוטומטית בשינוי תוכן (כיום trigger-dependent, לא GENERATED).",
|
||||||
|
"details": "מכסה GAP-09. מספק INV-DM3/G6. severity: High. סוג: קוד + מיגרציה (re-embed). תלוי ב-FU-1.",
|
||||||
|
"testStrategy": "",
|
||||||
|
"status": "pending",
|
||||||
|
"dependencies": [
|
||||||
|
"59"
|
||||||
|
],
|
||||||
|
"priority": "medium",
|
||||||
|
"subtasks": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "[GAP-09] re-index/re-embed בשינוי תוכן",
|
||||||
|
"description": "embedding לא GENERATED בניגוד ל-tsvectors; נקודת-drift.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-DM3/G6",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "61"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updatedAt": "2026-05-30T17:37:34.741136+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "62",
|
||||||
|
"title": "[FU-4] בידוד-קורפוס בכל מסלול query",
|
||||||
|
"description": "אכיפת source_kind בכל פילטר (כולל halacha_filters); חסימת חיפוש ללא תחום.",
|
||||||
|
"details": "מכסה GAP-10,12. מספק INV-RET1/G5. severity: Critical. סוג: קוד. ללא תלות — דחוף (דליפה פעילה).",
|
||||||
|
"testStrategy": "",
|
||||||
|
"status": "pending",
|
||||||
|
"dependencies": [],
|
||||||
|
"priority": "high",
|
||||||
|
"subtasks": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "[GAP-10] סינון source_kind ב-halacha_filters (#56)",
|
||||||
|
"description": "db.py:3168/3401 — halacha_filters בלי source_kind בעוד chunk_filters עם.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-RET1/G5",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "62"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "[GAP-12] חסימת חיפוש ללא practice_area",
|
||||||
|
"description": "search_decisions מזהיר אך לא חוסם (search.py:45-49).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-RET/G5",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "62"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updatedAt": "2026-05-30T17:37:34.741136+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "63",
|
||||||
|
"title": "[FU-5] eval-harness + נראות backlog",
|
||||||
|
"description": "מדידת precision/recall על gold-set + חשיפת backlog הלכות בבדיקת-בריאות.",
|
||||||
|
"details": "מכסה GAP-11,14. מספק INV-RET4/G8/QA1/G10. severity: High. סוג: קוד + החלטת-יו\"ר (בניית gold-set). תלוי ב-FU-2.",
|
||||||
|
"testStrategy": "",
|
||||||
|
"status": "pending",
|
||||||
|
"dependencies": [
|
||||||
|
"60"
|
||||||
|
],
|
||||||
|
"priority": "medium",
|
||||||
|
"subtasks": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "[GAP-11] eval-harness precision+recall + gold-set",
|
||||||
|
"description": "כיום רק telemetry.log_search_bg; איכות-אחזור לא נמדדת.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-RET4/G8",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "63"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "[GAP-14] נראות backlog הלכות",
|
||||||
|
"description": "ספירת pending_review בבדיקת-בריאות (10/19 התגלה במקרה).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-QA1/G10",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "63"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updatedAt": "2026-05-30T17:37:34.741136+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "64",
|
||||||
|
"title": "[FU-6] שערי-QA נאכפים בקוד",
|
||||||
|
"description": "export חוסם בקוד על כשל-QA קריטי; תיקון neutral_background critical-but-passes.",
|
||||||
|
"details": "מכסה GAP-15,16. מספק INV-QA3/EX3/G10. severity: Critical. סוג: קוד. ללא תלות — מהיר.",
|
||||||
|
"testStrategy": "",
|
||||||
|
"status": "pending",
|
||||||
|
"dependencies": [],
|
||||||
|
"priority": "high",
|
||||||
|
"subtasks": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "[GAP-15] export חוסם QA קריטי בקוד",
|
||||||
|
"description": "export_docx (drafting.py:384) לא קורא ל-validate_decision — ניתן לעקיפה.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-QA3/EX3",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "[GAP-16] תיקון neutral_background critical-but-passes",
|
||||||
|
"description": "fallback בלוק-ו ריק מסומן critical אך passed=True (qa_validator.py:70).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "QA-gate",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updatedAt": "2026-05-30T17:37:34.741136+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "65",
|
||||||
|
"title": "[FU-7] audit-trail + provenance",
|
||||||
|
"description": "כתיבת audit_log בכל פעולה; קישור בלוק→קטעי-מקור; סנכרון DB אחרי עריכה; אימות citation→corpus.",
|
||||||
|
"details": "מכסה GAP-17,18,19,20. מספק INV-AUD1/2/3/EX1/G9. severity: High. סוג: קוד + backfill קל. תלוי ב-FU-1. (זרע לתת-פרויקט 3/audit-provenance.)",
|
||||||
|
"testStrategy": "",
|
||||||
|
"status": "pending",
|
||||||
|
"dependencies": [
|
||||||
|
"59"
|
||||||
|
],
|
||||||
|
"priority": "medium",
|
||||||
|
"subtasks": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "[GAP-17] סנכרון בלוקי-DB אחרי עריכת draft",
|
||||||
|
"description": "active_draft_path הופך ל'מקור-אמת', בלוקים לא מסונכרנים (db.py:189).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-EX1/AUD2",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "65"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "[GAP-18] כתיבת audit_log בכל פעולה מהותית",
|
||||||
|
"description": "הטבלה קיימת אך נכתבת כמעט רק ב-case_subtype_override (cases.py:203).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-AUD1",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "65"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"title": "[GAP-19] קישור בלוק→קטעי-מקור",
|
||||||
|
"description": "decision_blocks שומר model_used אך לא אילו chunks/precedents הזינו.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-AUD1",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "65"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"title": "[GAP-20] אימות citation→corpus",
|
||||||
|
"description": "decision_paragraphs.citations ללא ולידציה שכל ציטוט מתאים.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-AUD3",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "65"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updatedAt": "2026-05-30T17:37:34.741136+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "66",
|
||||||
|
"title": "[FU-8] מחסומי-תהליך → מחסומי-קוד",
|
||||||
|
"description": "אכיפת sync חוצה-חברות; מחסומי-קוד ל-wakeup/API; חיווט הספ לסוכנים.",
|
||||||
|
"details": "מכסה GAP-21,22,23. מספק INV-MC1/INT1/INT3/AG1. severity: High. סוג: קוד + החלטת-יו\"ר. GAP-23 prereq לתת-פרויקט 5.",
|
||||||
|
"testStrategy": "",
|
||||||
|
"status": "pending",
|
||||||
|
"dependencies": [],
|
||||||
|
"priority": "medium",
|
||||||
|
"subtasks": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "[GAP-21] אכיפת sync חוצה-חברות",
|
||||||
|
"description": "sync ידני ולא-נאכף; adapter_type-mismatch מדולג בשקט (sync...py:387-389).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-MC1",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "66"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "[GAP-22] מחסומי-קוד ל-wakeup/API",
|
||||||
|
"description": "אין אילוץ-schema נגד INSERT ישיר ל-agent_wakeup_requests; אין linter נגד httpx/curl גולמי.",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-INT1/INT3",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "66"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"title": "[GAP-23] חיווט הספ לסוכנים",
|
||||||
|
"description": "HEARTBEAT/agent docs דורשים קריאת 00-constitution + ספ-תחום (prereq לתת-פרויקט 5).",
|
||||||
|
"dependencies": [],
|
||||||
|
"details": "INV-AG1",
|
||||||
|
"status": "pending",
|
||||||
|
"testStrategy": "",
|
||||||
|
"parentId": "66"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updatedAt": "2026-05-30T17:37:34.741136+00:00"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"metadata": {
|
"metadata": {
|
||||||
|
|||||||
Reference in New Issue
Block a user