fix(learning): chair_name במקור — סופי-ועדה תמיד נכנס לקורפוס-הפסיקה (#134) #226

Merged
chaim merged 1 commits from worktree-chair-name-rootfix into main 2026-06-12 07:26:32 +00:00
Owner

תיקון-שורש ל-TaskMaster #134.

הבאג

שלב-הלמידה (ingest_final_versioningest_internal_decision) מוסיף כל סופי כתקדים ציטוטי ב-case_law (source_kind=internal_committee), אך נכשל בשקט (non-fatal warning) כש-cases.chair_name ריק — בגלל case_law_internal_chair_check. כך הסופיים של 1194/1200/8070 לא נכנסו לקורפוס-הפסיקה (רק 8126/1130 שהיה להם chair). 11/18 תיקים היו עם chair ריק.

שורש (3 שכבות)

  1. cases.chair_name לא נקבע בפתיחת תיק.
  2. מסלול-ה-MCP העביר case.get('chair_name','') גולמי — בעוד מסלול-ה-UI ב-web/app.py כבר פתר אותו דטרמיניסטית (_committee_chair_for_case). מסלולים מקבילים מתפצלים — הפרת INV-G2.
  3. הכשל נבלע ב-except → logger.warning (נגד כלל-הנדסה §6 / feedback_silent_swallow).

התיקון

שכבה 1+G2 — SoT יחיד: config.committee_chair_for_case הוא המקום היחיד שממנו גוזרים chair. web/app.py אוחד אליו (הכפילות הוסרה); db.create_case ו-tools/workflow.ingest_final_version משתמשים בו. db.create_case קובע chair_name תמיד לא-ריק בפתיחת תיק (INV-G1, נרמול-במקור); cases.case_create חושף chair_name param.

שכבה 2 — נראות (§6): ingest_final_version מחזיר internal_corpus_error במקום בליעה, ו-final_learning_pipeline מדפיס אזהרה בולטת אם ההעתק נכשל.

שכבה 3 — רשת-ביטחון: backfill ל-11 תיקים; audit_corpus_integrity — נוספו CHECK_D (תיקים מוכרעים ללא chair) ו-CHECK_E (סופי-final חסר מקורפוס-הפסיקה). שניהם 0 כעת.

Invariants

  • INV-G1 — chair_name מנורמל בכתיבה (במקור), לא תיקון-בקריאה.
  • INV-G2 — מסלול-יחיד: web↔MCP אוחדו ל-resolver אחד; אין יותר מסלול מקביל מתפצל.
  • §6 — אין בליעה שקטה: הכשל מסומן ומדווח.

בדיקות

  • py_compile לכל 7 הקבצים ✓
  • 14 pytest (test_chair_seed_gate, test_audit_provenance) ✓
  • integration של db.create_case (default 1xxx→דפנה תמיר, override נשמר) ✓
  • הרצת audit_corpus_integrity חי על ה-DB: A–E = 0 ✓

🤖 Generated with Claude Code

תיקון-שורש ל-TaskMaster #134. ## הבאג שלב-הלמידה (`ingest_final_version` → `ingest_internal_decision`) מוסיף כל סופי כתקדים ציטוטי ב-`case_law` (`source_kind=internal_committee`), אך **נכשל בשקט** (non-fatal warning) כש-`cases.chair_name` ריק — בגלל `case_law_internal_chair_check`. כך הסופיים של 1194/1200/8070 לא נכנסו לקורפוס-הפסיקה (רק 8126/1130 שהיה להם chair). 11/18 תיקים היו עם chair ריק. ## שורש (3 שכבות) 1. `cases.chair_name` לא נקבע בפתיחת תיק. 2. מסלול-ה-MCP העביר `case.get('chair_name','')` גולמי — בעוד מסלול-ה-UI ב-`web/app.py` כבר פתר אותו דטרמיניסטית (`_committee_chair_for_case`). **מסלולים מקבילים מתפצלים — הפרת INV-G2.** 3. הכשל נבלע ב-`except → logger.warning` (נגד כלל-הנדסה §6 / feedback_silent_swallow). ## התיקון **שכבה 1+G2 — SoT יחיד:** `config.committee_chair_for_case` הוא המקום היחיד שממנו גוזרים chair. `web/app.py` אוחד אליו (הכפילות הוסרה); `db.create_case` ו-`tools/workflow.ingest_final_version` משתמשים בו. `db.create_case` קובע chair_name **תמיד לא-ריק** בפתיחת תיק (INV-G1, נרמול-במקור); `cases.case_create` חושף `chair_name` param. **שכבה 2 — נראות (§6):** `ingest_final_version` מחזיר `internal_corpus_error` במקום בליעה, ו-`final_learning_pipeline` מדפיס אזהרה בולטת אם ההעתק נכשל. **שכבה 3 — רשת-ביטחון:** backfill ל-11 תיקים; `audit_corpus_integrity` — נוספו **CHECK_D** (תיקים מוכרעים ללא chair) ו-**CHECK_E** (סופי-`final` חסר מקורפוס-הפסיקה). שניהם 0 כעת. ## Invariants - **INV-G1** — chair_name מנורמל בכתיבה (במקור), לא תיקון-בקריאה. - **INV-G2** — מסלול-יחיד: web↔MCP אוחדו ל-resolver אחד; אין יותר מסלול מקביל מתפצל. - **§6** — אין בליעה שקטה: הכשל מסומן ומדווח. ## בדיקות - `py_compile` לכל 7 הקבצים ✓ - 14 pytest (`test_chair_seed_gate`, `test_audit_provenance`) ✓ - integration של `db.create_case` (default 1xxx→דפנה תמיר, override נשמר) ✓ - הרצת `audit_corpus_integrity` חי על ה-DB: A–E = 0 ✓ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-12 07:26:21 +00:00
fix(learning): chair_name במקור — סופי-ועדה תמיד נכנס לקורפוס-הפסיקה (TaskMaster #134)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 5s
242e6cfd11
הבאג: שלב-הלמידה (ingest_final_version → ingest_internal_decision) מוסיף כל
סופי כתקדים ציטוטי ב-case_law (source_kind=internal_committee), אך נכשל
בשקט (non-fatal warning) כש-cases.chair_name ריק — בגלל constraint
case_law_internal_chair_check. כך סופיים של 1194/1200/8070 לא נכנסו
לקורפוס-הפסיקה. שורש: (1) chair_name לא נקבע בפתיחת תיק; (2) מסלול-ה-MCP
העביר chair גולמי בעוד מסלול-ה-UI (web/) כבר פתר אותו דטרמיניסטית —
**מסלולים מקבילים מתפצלים (הפרת INV-G2)**; (3) הכשל נבלע (נגד §6).

תיקון-שורש (3 שכבות):
1. **SoT יחיד (INV-G2):** `config.committee_chair_for_case` — המקום היחיד
   שגם web/app.py וגם tools/workflow.py + db.create_case גוזרים ממנו chair
   (לפי תחילית מספר-התיק; override ל-env). web/ אחוד אליו (הוסרה הכפילות).
2. **נרמול-במקור (INV-G1):** `db.create_case` קובע chair_name תמיד לא-ריק;
   `cases.case_create` חושף param. `ingest_final_version` גוזר chair מה-SoT
   במקום הערך הגולמי → ה-constraint לא נופל.
3. **נראות (§6/feedback_silent_swallow):** כשל-העתק מוחזר ב-result
   (`internal_corpus_error`) ו-`final_learning_pipeline` מדפיס אזהרה — לא
   נבלע. backfill ל-11 תיקים עם chair ריק. `audit_corpus_integrity`:
   נוספו CHECK_D (תיקים מוכרעים ללא chair) + CHECK_E (סופי-final חסר
   מקורפוס-הפסיקה) — שניהם 0 כעת.

invariants: מקיים INV-G1 (נרמול בכתיבה), INV-G2 (מסלול-יחיד, אוחד web↔MCP),
§6 (אין בליעה שקטה). בדיקות: py_compile + 14 pytest (chair_seed_gate,
audit_provenance) + integration של create_case (default+override) + הרצת
ה-audit החי (A–E=0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit ca1a0ddaac into main 2026-06-12 07:26:32 +00:00
chaim deleted branch worktree-chair-name-rootfix 2026-06-12 07:26:32 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#226