feat(learning): אינדיקציית-תיק למצב למידת-קול + חילוץ-הלכות אחרי החלטה סופית #233

Merged
chaim merged 1 commits from worktree-case-learning-indicator into main 2026-06-12 10:51:19 +00:00
Owner

הצורך

אחרי שהיו"ר מעלה החלטה סופית ומריץ את שני הפייפליינים האוטומטיים — למידת-קול (final_learning_pipeline.py) וחילוץ/אימות-הלכות (final_halacha_pipeline.py) — התיק לא הציג אם כל תהליך בוצע / הצליח / למה-נכשל / כמה הלכות חולצו. במיוחד תקלת chair_name ריק (2026-06-12) שמפילה בשקט את העתק-ה-case_law → חילוץ-הלכות לא מתחיל בכלל, בלי שזה גלוי. כעת מוצגות שתי אינדיקציות ליד כפתורי-ההרצה.

הגישה — גזירה ממקור-יחיד (G1/G2)

רוב הנתונים כבר קיימים ב-DB; נגזרים במקום אחד ולא נוצר מסלול-מעקב מקביל. התוספת היחידה ל-DB: שדה-תיעוד-תוצאה לפייפליין-הלמידה (שהיום חסר סימון-כישלון מתמשך).

Backend

  • SCHEMA_V36draft_final_pairs.learning_run (JSONB): שדה-תיעוד על פנקס-ההתאמה הקיים (INV-LRN4), חותם את תוצאת-הריצה (succeeded/failed + error + at). NULL = לא נרשמה תוצאה (=טרם-בוצע).
  • set_learning_run_outcome() — חיתום על ה-pair האחרון; case_learning_status() — גזירה read-only מ-draft_final_pairs/style_corpus/decision_lessons/case_law/halachot.
  • final_learning_pipeline.py — חותם outcome בהצלחה וב-except (surfaced, לא בלוע).
  • חשיפה (exposer יחיד): case_get מוסיף learning_status (→ MCP + /api/cases/{case}/details) + endpoint ייעודי GET /api/cases/{case}/learning-status — אותה פונקציית-גזירה, בלי כפילות-לוגיקה.

UI (אושר דרך שער-העיצוב Claude Design — כרטיס 21-final-learning-status)

  • useCaseLearningStatus (הורחב api/learning.ts הקיים — לא מודול מקביל) + polling עדין בזמן pending/processing/busy.
  • LearningStatusBadges — 2 שורות (למידת-קול / חילוץ-הלכות) עם badge + תת-שורה: מס' לקחים · רישום-קורפוס · מס' הוצעו / מס' הלכות + פירוק אושרו·ממתינות·נדחו / סיבת-כישלון / "לא נכנס לקורפוס".
  • שולב ב-drafts-panel תחת "החלטה סופית של היו״ר" + אינוולידציה בכפתורי-ההרצה.

אימות

מול ה-DB החי: הצליח+5 הלכות (8174-12-24, 2 אושרו/3 נדחו) · נכנס-אך-pending (1200-12-25) · לא-נכנס-לקורפוס (8125-09-24) · round-trip חיתום-כישלון (rollback). tsc --noEmit + eslint נקיים על שלושת הקבצים. המיגרציה אומתה (learning_run קיימת).

npm run api:types יורץ לאחר deploy (ה-endpoint עדיין לא ב-OpenAPI החי); הטיפוס מוגדר ידנית במודול-הדומיין בינתיים.

Invariants

  • G1 — נרמול-במקור: גזירה ממקורות-אמת, לא טלאי-בקריאה.
  • G2 — אין מסלול מקביל: שדה על פנקס-ההתאמה הקיים + exposer יחיד + הרחבת מודול-API קיים.
  • INV-LRN4 ��� draft_final_pairs הוא פנקס-ההתאמה; learning_run הוא שדה-תיעוד עליו.
  • INV-IA1 — מקור-אמת יחיד ל-UI (case_learning_status).

🤖 Generated with Claude Code

## הצורך אחרי שהיו"ר מעלה החלטה סופית ומריץ את שני הפייפליינים האוטומטיים — **למידת-קול** (`final_learning_pipeline.py`) ו**חילוץ/אימות-הלכות** (`final_halacha_pipeline.py`) — התיק לא הציג אם כל תהליך **בוצע / הצליח / למה-נכשל / כמה הלכות חולצו**. במיוחד תקלת `chair_name` ריק (2026-06-12) שמפילה בשקט את העתק-ה-case_law → חילוץ-הלכות לא מתחיל בכלל, בלי שזה גלוי. כעת מוצגות שתי אינדיקציות ליד כפתורי-ההרצה. ## הגישה — גזירה ממקור-יחיד (G1/G2) רוב הנתונים כבר קיימים ב-DB; נגזרים במקום אחד ולא נוצר מסלול-מעקב מקביל. התוספת היחידה ל-DB: שדה-תיעוד-תוצאה לפייפליין-הלמידה (שהיום חסר סימון-כישלון מתמשך). ### Backend - **`SCHEMA_V36`** — `draft_final_pairs.learning_run` (JSONB): שדה-תיעוד על פנקס-ההתאמה הקיים (INV-LRN4), חותם את תוצאת-הריצה (`succeeded`/`failed` + `error` + `at`). NULL = לא נרשמה תוצאה (=טרם-בוצע). - **`set_learning_run_outcome()`** — חיתום על ה-pair האחרון; **`case_learning_status()`** — גזירה read-only מ-`draft_final_pairs`/`style_corpus`/`decision_lessons`/`case_law`/`halachot`. - **`final_learning_pipeline.py`** — חותם outcome בהצלחה וב-`except` (surfaced, לא בלוע). - **חשיפה (exposer יחיד):** `case_get` מוסיף `learning_status` (→ MCP + `/api/cases/{case}/details`) + endpoint ייעודי `GET /api/cases/{case}/learning-status` — אותה פונקציית-גזירה, בלי כפילות-לוגיקה. ### UI (אושר דרך שער-העיצוב Claude Design — כרטיס `21-final-learning-status`) - `useCaseLearningStatus` (הורחב `api/learning.ts` הקיים — לא מודול מקביל) + polling עדין בזמן `pending`/`processing`/`busy`. - `LearningStatusBadges` — 2 שורות (למידת-קול / חילוץ-הלכות) עם badge + תת-שורה: מס' לקחים · רישום-קורפוס · מס' הוצעו / מס' הלכות + פירוק אושרו·ממתינות·נדחו / סיבת-כישלון / "לא נכנס לקורפוס". - שולב ב-`drafts-panel` תחת "החלטה סופית של היו״ר" + אינוולידציה בכפתורי-ההרצה. ## אימות מול ה-DB החי: **הצליח+5 הלכות** (8174-12-24, 2 אושרו/3 נדחו) · **נכנס-אך-pending** (1200-12-25) · **לא-נכנס-לקורפוס** (8125-09-24) · **round-trip חיתום-כישלון** (rollback). `tsc --noEmit` + `eslint` נקיים על שלושת הקבצים. המיגרציה אומתה (`learning_run` קיימת). > `npm run api:types` יורץ לאחר deploy (ה-endpoint עדיין לא ב-OpenAPI החי); הטיפוס מוגדר ידנית במודול-הדומיין בינתיים. ## Invariants - **G1** — נרמול-במקור: גזירה ממקורות-אמת, לא טלאי-בקריאה. - **G2** — אין מסלול מקביל: שדה על פנקס-ההתאמה הקיים + exposer יחיד + הרחבת מודול-API קיים. - **INV-LRN4** ��� `draft_final_pairs` הוא פנקס-ההתאמה; `learning_run` הוא שדה-תיעוד עליו. - **INV-IA1** — מקור-אמת יחיד ל-UI (`case_learning_status`). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-12 10:51:07 +00:00
אחרי העלאת החלטה סופית והרצת שני הפייפליינים האוטומטיים (למידת-קול,
חילוץ/אימות-הלכות), התיק לא הציג אם כל תהליך בוצע/הצליח/למה-נכשל. במיוחד
תקלת chair_name ריק (2026-06-12) שמפילה בשקט את העתק-ה-case_law → חילוץ-הלכות
לא מתחיל בכלל, בלי שזה גלוי. כעת מוצגות שתי אינדיקציות ליד כפתורי-ההרצה.

Backend (גזירה ממקור-יחיד, ללא מסלול-מעקב מקביל):
- SCHEMA_V36: draft_final_pairs.learning_run (JSONB) — שדה-תיעוד על פנקס-ההתאמה
  (INV-LRN4), חותם את תוצאת-הריצה של פייפליין-הלמידה (succeeded/failed+סיבה+at).
- set_learning_run_outcome() — חיתום הצלחה/כישלון על ה-pair האחרון.
- case_learning_status() — גזירה read-only מ-draft_final_pairs/style_corpus/
  decision_lessons/case_law/halachot: בוצע? הצליח? למה-לא? כמה הלכות חולצו.
- final_learning_pipeline.py — חותם outcome בהצלחה וב-except (surfaced, לא בלוע).
- חשיפה: case_get מוסיף learning_status (→MCP + /api/cases/{case}/details) +
  endpoint ייעודי GET /api/cases/{case}/learning-status (אותה פונקציה — בלי כפילות).

UI (אושר דרך שער-העיצוב Claude Design — כרטיס 21-final-learning-status):
- useCaseLearningStatus (api/learning.ts) — hook + polling עדין בזמן in-flight.
- LearningStatusBadges — 2 שורות (למידת-קול / חילוץ-הלכות) עם badge + תת-שורה
  (מס' לקחים · רישום-קורפוס / מס' הלכות + פירוק אושרו/ממתינות/נדחו / סיבת-כישלון).
- שילוב ב-drafts-panel תחת "החלטה סופית של היו״ר" + אינוולידציה בכפתורי-ההרצה.

אומת מול ה-DB החי: הצליח+5 הלכות (8174-12-24) · נכנס-אך-pending (1200-12-25) ·
לא-נכנס-לקורפוס (8125-09-24) · round-trip חיתום-כישלון. tsc/eslint נקיים.

Invariants: G1 (נרמול-במקור — גזירה, לא טלאי), G2 (אין מסלול מקביל — שדה על
הפנקס הקיים + exposer יחיד), INV-LRN4 (פנקס-ההתאמה), INV-IA1 (מקור-אמת יחיד).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit c474b58311 into main 2026-06-12 10:51:19 +00:00
chaim deleted branch worktree-case-learning-indicator 2026-06-12 10:51:19 +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#233