From d72d5429ed2bae239d91b8f458d7161f0a9fe391 Mon Sep 17 00:00:00 2001 From: Chaim Date: Sat, 30 May 2026 17:38:31 +0000 Subject: [PATCH] tasks(legal-ai): 8 fix-unit tasks (59-66) + 23 GAP subtasks from gap-audit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .taskmaster/tasks/tasks.json | 342 +++++++++++++++++++++++++++++++++++ 1 file changed, 342 insertions(+) diff --git a/.taskmaster/tasks/tasks.json b/.taskmaster/tasks/tasks.json index 20dca90..e60a0b0 100644 --- a/.taskmaster/tasks/tasks.json +++ b/.taskmaster/tasks/tasks.json @@ -2000,6 +2000,348 @@ "testStrategy": "document_list על 7 וריאציות פורמט של תיק קיים → כולן מחזירות את אותם מסמכים; תיק לא-קיים אמיתי עדיין מחזיר 'לא נמצא'.", "subtasks": [], "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": {