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:
2026-05-30 17:38:31 +00:00
parent 28bed4906c
commit d72d5429ed

View File

@@ -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": {