fix(learning): process_final_version מאחסן דיסטילציה גם כשאין pair (INV-LRN4, #125.1) #196

Merged
chaim merged 1 commits from worktree-learning-loop-ops into main 2026-06-11 17:09:11 +00:00
Owner

הקשר

אודיט לולאת-הלמידה (TaskMaster legal-ai #122, דוח: data/audit/learning-loop-activity-20260611.md) מצא ש-process_final_version מחשב diff+analysis אך משליך אותם כשאין draft_final_pair במצב final_received — קרה ל-5 תיקים סופיים היסטוריים שקדמו למנגנון ה-snapshot ב-mark-final (pair ראשון 2026-06-06), ולכל קריאת ingest_final_version ישירה. הפרת INV-LRN4 בפועל (סופי שלא הושווה/נשמר).

השינוי

learning_loop.py::process_final_versioncreate-or-update: כשאין pair, פותחים אחד מ-decision_blocks החיים ומקדמים ל-analyzed, כך שהדיסטילציה נשמרת כ-הצעה ברשם.

  • תיקים חדשים — אפס שינוי-התנהגות: תמיד יש pair מ-mark-final (final_received) → רק ה-update רץ, כמו קודם.
  • תיקים היסטוריים / ingest ישיר: נפתח pair → הדיסטילציה נשמרת.
  • זהו keystone ל-backfill (#125.2): מאפשר להריץ את final_learning_pipeline.py הקיים על 3 תיקי-מאי המוכנים (8070-25, 1194-25, 1200-25) ללא סקריפט נפרד.
  • caveat מתועד בלוג: לתיק היסטורי ה-draft = blocks נוכחיים (אולי נערכו אחרי-חתימה), לא snapshot-אמיתי.

Invariants

  • INV-LRN4 (מקיים) — כל סופי מקבל pair ומנותח; אין סופי "פתוח".
  • INV-LRN1 / G10 (נשמר) — הדיסטילציה נשמרת כ-הצעה (analyzed) בלבד; שער ה-promote הידני לקיפול ל-appeal_type_rules לא נעקף.
  • G2 (מקיים) — אותו פנקס draft_final_pairs, ללא מסלול מקביל.
  • G1 (מקיים) — נרמול-במקור (הרשם) במקום תיקון-בקריאה.

בדיקה

  • py_compile עובר; חתימת db.create_draft_final_pair(case_id, draft_text, final_path='') תואמת.
  • לא נוגע ב-GAP/FU ב-gap-audit.md.
  • אימות מלא בייצור: הרצת final_learning_pipeline.py --case 8070-25 (וכו') תאכלס את הרשם — מתבצע ב-#125.2 לאחר מיזוג.

ref: #122 · #125.1

🤖 Generated with Claude Code

## הקשר אודיט לולאת-הלמידה (TaskMaster `legal-ai` #122, דוח: `data/audit/learning-loop-activity-20260611.md`) מצא ש-`process_final_version` מחשב diff+analysis אך **משליך אותם** כשאין `draft_final_pair` במצב `final_received` — קרה ל-5 תיקים סופיים היסטוריים שקדמו למנגנון ה-snapshot ב-mark-final (pair ראשון 2026-06-06), ולכל קריאת `ingest_final_version` ישירה. **הפרת INV-LRN4 בפועל** (סופי שלא הושווה/נשמר). ## השינוי `learning_loop.py::process_final_version` — **create-or-update**: כשאין pair, פותחים אחד מ-`decision_blocks` החיים ומקדמים ל-`analyzed`, כך שהדיסטילציה נשמרת כ-**הצעה** ברשם. - **תיקים חדשים — אפס שינוי-התנהגות:** תמיד יש pair מ-mark-final (`final_received`) → רק ה-`update` רץ, כמו קודם. - **תיקים היסטוריים / ingest ישיר:** נפתח pair → הדיסטילציה נשמרת. - זהו **keystone** ל-backfill (#125.2): מאפשר להריץ את `final_learning_pipeline.py` הקיים על 3 תיקי-מאי המוכנים (8070-25, 1194-25, 1200-25) ללא סקריפט נפרד. - **caveat מתועד בלוג:** לתיק היסטורי ה-draft = blocks נוכחיים (אולי נערכו אחרי-חתימה), לא snapshot-אמיתי. ## Invariants - **INV-LRN4 (מקיים)** — כל סופי מקבל pair ומנותח; אין סופי "פתוח". - **INV-LRN1 / G10 (נשמר)** — הדיסטילציה נשמרת כ-הצעה (`analyzed`) בלבד; שער ה-promote הידני לקיפול ל-`appeal_type_rules` **לא נעקף**. - **G2 (מקיים)** — אותו פנקס `draft_final_pairs`, ללא מסלול מקביל. - **G1 (מקיים)** — נרמול-במקור (הרשם) במקום תיקון-בקריאה. ## בדיקה - `py_compile` עובר; חתימת `db.create_draft_final_pair(case_id, draft_text, final_path='')` תואמת. - לא נוגע ב-GAP/FU ב-`gap-audit.md`. - אימות מלא בייצור: הרצת `final_learning_pipeline.py --case 8070-25` (וכו') תאכלס את הרשם — מתבצע ב-#125.2 לאחר מיזוג. ref: #122 · #125.1 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-11 17:08:18 +00:00
fix(learning): process_final_version מאחסן דיסטילציה גם כשאין pair (create-or-update, INV-LRN4)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 5s
94a4c3600e
אודיט #122 חשף ש-process_final_version מחשב diff+analysis אך משליך אותם כשאין
draft_final_pair במצב final_received — קרה ל-5 תיקים סופיים היסטוריים שקדמו למנגנון
ה-snapshot ב-mark-final (pair ראשון 2026-06-06), ולכל קריאת ingest_final_version ישירה.
התוצאה: הפרת INV-LRN4 בפועל (סופי שלא הושווה/נשמר).

התיקון: create-or-update — כשאין pair, פותחים אחד מ-decision_blocks החיים (status→analyzed)
כך שהדיסטילציה נשמרת כ-הצעה ברשם. לתיקים חדשים אין שינוי-התנהגות (תמיד יש pair
מ-mark-final → רק ה-update רץ). זה keystone שמאפשר backfill (#125.2) דרך הפייפליין הקיים.

caveat מתועד בלוג: לתיק היסטורי ה-draft = blocks נוכחיים (אולי נערכו אחרי-חתימה),
לא snapshot-אמיתי.

Invariants:
- INV-LRN4 (מקיים) — כל סופי מקבל pair ומנותח; אין סופי "פתוח".
- INV-LRN1/G10 (נשמר) — הדיסטילציה נשמרת כ-הצעה (analyzed) בלבד; שער ה-promote הידני
  לקיפול ל-appeal_type_rules לא נעקף.
- G2 (מקיים) — אותו פנקס draft_final_pairs, לא מסלול מקביל.
- G1 (מקיים) — נרמול במקור (הרשם) במקום תיקון-בקריאה.

ref: data/audit/learning-loop-activity-20260611.md · TaskMaster legal-ai #122/#125.1

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim scheduled this pull request to auto merge when all checks succeed 2026-06-11 17:09:09 +00:00
chaim merged commit 671edf1128 into main 2026-06-11 17:09:11 +00:00
chaim deleted branch worktree-learning-loop-ops 2026-06-11 17:09:11 +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#196