Files
legal-ai/docs/spec/07-learning.md
Chaim c7156b575e
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
feat(calibration): style-clean recommend_effort (anti-primary) + confidence + --rerank (#213)
Make the effort-calibration recommendation style-clean (style acquisition is
the goal — write like chair Dafna Tamir):

- recommend_effort ranks by anti_pattern_total (PRIMARY, the clean style-rule
  violation count) → golden_ratio_deviation_pp (SECONDARY, structural-style,
  None=worst) → distance (faint final tiebreak). change_percent is EXCLUDED from
  the ranking (it mixes style with content-completeness per 07-learning §0.7 —
  noise for STYLE) and kept in the report as context only.
- Add a confidence flag ("clear"/"weak"): a pick whose anti-pattern lead over the
  runner-up is within noise (margin < epsilon = max(0.5, 0.20·spread)) is flagged
  ⚠️ weak, so an over-claimed pick (the old confident block-zayin "low") is never
  shown as confident. Rendered as a confidence column in the report.
- Add --rerank <report.json>: re-apply the new key to a saved calibration JSON
  offline (NO LLM, NO DB), print + write *-reranked.md. Re-ranks today's 8-final
  run without regenerating.
- recommend_effort stays a single shared pure function reused by
  scripts/calibrate_block_yod.py (G2); both --self-test suites pass.
- Spec note added (07-learning §0.7) + SCRIPTS.md updated.

Invariants: G8 (style-clean empirical ranking), G2 (single shared recommend_effort,
reused by the block-yod harness — no parallel metric path), INV-LRN5 (style-only
signal; change% reported-not-ranked).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 19:00:41 +00:00

36 KiB
Raw Blame History

07 — לולאת הלמידה (Learning Loop)

קובץ-תחום זה כפוף ל-חוקת המערכת ומפרט כיצד המערכת לומדת לאורך זמן — מהחלטות סופיות (Hermes), מפידבק-היו"ר, ומצמיחת-הקורפוס — באופן שמזין חזרה את הכתיבה (04-analysis-writing.md) ואת שערי-האיכות (05-qa-review.md). הוא אוכף את INV-G10 (שערים אנושיים — אישור היו"ר על כל עדכון-ידע) ואת INV-G4 / כלל-ההנדסה quality-at-source (האחריות לאיכות יושבת במקור, לא בטלאי במורד הזרם).

⚠ קובץ מעורב — שני מודלי-סמכות (לפי החוקה §3, §5):

  • שער-הממשל (Hermes מציע — היו"ר מאשרת ידנית; אין auto-commit ל-SKILL/lessons) הוא invariant הנדסי במודל הממשל-שיפוטי → נושא מקורות: (NCSC/JTC · CEPEJ 2018 · FJC) + סטטוס: verified.
  • כלל-ההנדסה quality-at-source (היכן יושבת האחריות לאיכות-הידע) → invariant הנדסי במודל הנדסת-הנתונים → נושא מקורות: (Fowler — Data Mesh / quality-at-source · DAMA-UK · ISO 8000) + סטטוס: verified.

0. תת-מערכת רכישת-הסגנון (Style Acquisition) — יעד-העל וההפרדה מהכתיבה

יעד-העל של legal-ai: שהסוכנים יכתבו וינתחו עררים בדיוק כמו עו"ד דפנה תמיר — להפנים את הקול והשיטה, לא רק לייצר טיוטה תקנית. ל-end זה מחייב הפרדה מובהקת בין שתי תת-מערכות:

Writing Subsystem Style-Acquisition Subsystem
שאלה "איך אכתוב את התיק כמו דפנה?" "מה למדנו מהפער בין מה שכתבנו למה שדפנה חתמה?"
טריגר issue כתיבה mark-final
פלט 12 בלוקים עדכוני-קול מאושרים + מדד-מרחק
סוכנים writer/analyst/qa/ceo hermes-curator (מורחב)
יחס ל-artifacts-הקול צרכן read-only היחיד שכותב (דרך שער INV-G10)

0.1 הגישה: Authorial Style Profiling, לא fine-tuning

היעד הוא Text Style Transfer מבוסס פרופיל-סגנון מופשט — להכליל את סגנון/שיטת דפנה ולהתאים לתיק הספציפי. fine-tuning של משקולות לא רלוונטי: המודל (Opus) סגור, והקורפוס (~48 החלטות, יו"ר חדשה) קטן מדי — מצב שבו הספרות מראה שפרופיל-מופשט + דוגמאות מנצח (≈+15% מעל RAG-בלבד). מדיניות-העתקה לפי סוג-תוכן: קבוע/נוסחאי (פתיחים דוקטרינליים, תבניות-סיום) → מותר להעתיק; ניתוח/טענות ספציפיים → להכליל ולהתאים; מהות (הלכה/עובדה מתיק אחר) → אסור (INV-LRN5).

0.2 שלושת ערוצי-ההזנה לכותב

  1. A — פרופיל-מופשט (ראשי): voice-fingerprint + author-features כמותיים, מוזרק לכתיבה. חידוש מהקורפוס: החלק הכמותי (יחסי-מבנה) מתרענן אוטומטית-ודטרמיניסטית מהקורפוס הגדל (measure_corpus_ratios→כותב); הפרוזה המופשטת מסונתזת מחדש ע"י scripts/regenerate_voice_fingerprint.py (Opus) כהצעה מגודרת-יו (INV-LRN1 קשיח — לא auto, היו"ר מקבעת ידנית; STYLE בלבד INV-LRN5).
  2. B — דוגמאות + תבניות (תומך): פסקאות-בלוק אמיתיות + Copy-Paste Templates + contrastive.
  3. C — deep-read (נקודתי): voice-XXXX.md — worked example לתיק-מופת.

0.3 הצינור החוזר per-final (7 שלבים)

mark-final → [1] INTAKE (snapshot של הטיוטה) → [2] PAIRING (בלוק↔בלוק) → [3] ALIGNMENT (diff פר-בלוק) → [4] DISTILLATION (מפריד סגנון↔מהות) → [5] CURATION (Hermes + שער-יו"ר) → [6] FEEDBACK (ניתוב לערוץ A/B/C) → [7] MEASUREMENT (מדד-מרחק-סגנון + snapshot-held-out פרוספקטיבי, §0.7).

0.4 ניהול ב-UI

/methodology = עורך-הפרופיל היחיד (declarative: יחסי-זהב, כללי-דיון, צ׳קליסטים, ביטויי-מעבר, אנטי-דפוסים, voice-invariants). /training = שולחן-הלמידה (קורפוס, פורטרט-סגנון, השוואת draft↔final, curator, מדד-מרחק, פנקס-התאמה).

שער-אישור אחד · טרנזקציית-כותב אחת (INV-IA3 → X17): ל-decision_lesson יש סטטוס-יחיד שקובע "זורם-לכותב" — review_status='approved' (INV-LRN1/G10). הדגל applied_to_skill הוסר (היה אינפורמטיבי-בלבד, נכתב-לשומקום → בלבל את היו"ר ב"שני שערים"; גל-2 #131). לקח שהיו"ר מחבר ידנית נוצר כבר כ-approved; לקח-פאנל נוצר כ-proposed וממתין לשער. promote של זוג draft↔final מטמיע את הלקחים/הביטויים שהיו"ר בחר דרך appeal_type_rules בטרנזקציה אחת נעולה (FOR UPDATE) — מסלול-כתיבה-יחיד, ללא read-modify-write מתפצל מול עורך-המתודולוגיה (MET-2/3, להלן G2 הפרות-ידועות).

0.5 Invariants חדשים

INV-LRN4 (ניגוד-אמת → G10/G9): למידת-קול מבוססת pairing draft↔final ברמת-בלוק, לא קריאת-final בלבד. כל החלטה אינה "סגורה" עד שהושוותה מול הסופי; כל סופי מנותח מול הטיוטה. נשמר פנקס-התאמה (draft_final_pairs) עם מצב-חיים draft_done → final_received → analyzed → lessons_folded. ההכללה (האם הלמידה משפרת תיקים שלא-נלמדו) נמדדת פרוספקטיבית — §0.7. מקורות: imitation-learning-from-expert-edits · contrastive personalization (arxiv 2504.08745) · author-profiling. סטטוס: verified.

INV-LRN5 (טוהר-הקול → G4/G11): שכבת-ידע-הקול (voice-fingerprint, style_patterns, exemplars) לא תכיל הלכות/עובדות ספציפיות — רק סגנון ושיטה. מהות מנותבת ל-precedent_library/halacha. ה-distillation מפריד במקור. מקורות: quality-at-source (Data Mesh) · separation-of-concerns. סטטוס: verified.

0.6 מסלול-העלאת-סופי נקי + פאנלים אוטומטיים (מדורג)

היו"ר מעלה את ההחלטה החתומה שלה דרך מסלול ייעודי — POST /api/cases/{case}/final/upload (כפתור "העלאת החלטה סופית של היו"ר" בלשונית-הטיוטות). נבדל מ-exports/upload (גרסה-מתוקנת-שלנו+retrofit) ומ-mark-final (סימון export-שלנו), ולכן אינו מסלול-מקביל (G2) אלא יכולת חסרה. הקליטה (סינכרונית ב-endpoint) מבצעת את לולאת-צמיחת-הקורפוס (§1.3) במלואה:

  1. קורפוס-הסגנון (voice) תחת ה-case_number המלא (בל"מ≠ערר — מונע התנגשות-מספר) + פתיחת draft_final_pairs (final_received, INV-LRN4).
  2. ספריית-הפסיקה — ההחלטה נכנסת ל-case_law כ-internal_committee תמיד (כדי שתהיה ברת-ציטוט בהחלטות עתידיות). chair_name נקבע דטרמיניסטית (תיק → ברירת-מחדל-ועדה, לעולם לא ריק — אילוץ case_law_internal_chair_check); לא נשען על חילוץ-LLM. מטה-דאטה נוסף (תאריך/צדדים) מועשר אסינכרונית ע"י מחלץ-Gemini.
  3. בדיקת-ציטוטיםextract_internal_citations מקשר את הפסיקה שההחלטה מצטטת לספרייה; כל ציטוט שאינו בספרייה מסומן אוטומטית כ-missing_precedent (open) להעלאה ע"י היו"ר.
  4. הציטוטים-המקושרים מזינים את לולאת-ה-corroboration (X11): ציטוט-נכנס מההחלטה שלנו מחזק את ההלכות של התקדים המצוטט (corroboration_rebuild). ואז שני שלבים אוטומטיים נפרדים (run-learning / run-halacha) המעירים worker מקומי (claude/DeepSeek/Gemini מקומיים בלבד):
  • למידה: הצינור (final_learning_pipeline.py) רץ בסדר enroll_style_corpus (יצירת רשומת-הקורפוס, מהיר — ראשון מאז #159 כדי שהקורפוס יהיה זמין לפני הדיסטילציה הארוכה) → ingest_final_version (Opus distillation) → פאנל-סגנון דו-סוכני (DeepSeek+Gemini, "למידה כפולה") שמצביע על כל לקח-style_method; הסכמה 2/2 → decision_lesson (source=panel:deepseek+gemini) שזורם אוטומטית לכותב כ-approved (שער-מדורג, INV-LRN1) — הפיך (veto-יו"ר ב-/training); פיצול → ליו"ר. במקביל (יקיצת final_learning_*) האוצֵר ממשיך ל-§A ורושם ממצאי-source='curator' (ערוץ ג׳, §1.1).
  • הלכות: extract_internal_citationsprecedent_extract_halachotcorroboration_rebuildפאנל-הלכות תלת-סוכני (halacha_panel_approve.py --apply). שני הפאנלים הפיכים (גיבוי-CSV ל-data/audit/) ומסלימים מחלוקות. ההטמעה ל-SKILL.md/legal-decision-lessons.md ולכל מהות נשארת אישור-יו"ר ידני קשיח (INV-LRN1/G10); לקחי-סגנון בקונצנזוס זורמים אוטומטית-והפיך לכותב.

0.7 מדד-ההכללה הפרוספקטיבי (held-out trend — "מסלול A")

השאלה שזה עונה: האם הלמידה באמת מכלילה — כלומר משפרת טיוטות של תיקים שלא נלמדו — ולא רק "משננת" תיקים שכבר ראינו. מדד-מרחק-הסגנון (שלב [7]) על תיק שלקחיו כבר הוטמעו אינו held-out; מדידה רטרואקטיבית בלתי-אפשרית כי הלקחים נשמרים appeal_type_rules (universal) ללא תיוג-מקור → אין leave-one-out. לכן המדידה פרוספקטיבית: נלכדת ברגע היחיד שבו היא נקייה.

המנגנון (אוטומטי, ב-final/upload, ללא LLM): מיד אחרי פתיחת הזוג draft_final_pair אבל לפני הטמעת-לקחי-התיק (ה-fold הוא שלב-promote ידני נפרד ב-/training, §0.4), נלכד snapshot של style_distance (anti_pattern_total, סטיית-יחסי-זהב, change_percent) יחד עם גודל-בריכת-הלקחים באותו רגע (מספר discussion_rules+transition_phrases ב-universal). מכיוון שהטיוטה נכתבה עם הבריכה הקודמת בלבד, כל שורה היא נקודת-נתון held-out נקייה: "עם N לקחים מצטברים, הטיוטה שלנו על תיק שלא-נראה קיבלה ציון X".

הקריאה: טבלת style_distance_history (append-only) + GET /api/learning/style-distance-history. ירידה ב-anti_pattern_total/change_percent ככל ש-N גדל = הוכחה מתגלגלת שהלמידה מכלילה (INV-LRN4 — זהו משטח-המגמה של "ניגוד-האמת"). אזהרת-פרשנות: change_percent מערבב סגנון עם שלמות-תוכן (לפעמים היו"ר מכפילה אורך כי חסרה מהות, לפעמים חותכת) → anti_pattern_total הוא הסיגנל הנקי-יותר לסגנון. שימוש-חוזר בשירות style_distance ובבריכת appeal_type_rules — אין מסלול-מדד מקביל (G2).

המלצת-הכיול style-ranked (#213): recommend_effort ב-scripts/calibrate_effort.py מדרג efforts לפי anti_pattern_total ראשי (סיגנל-סגנון נקי) → סטיית-יחסי-זהב → distance (tiebreak קלוש). change_percent מדווח-לא-מדורג מאותה אזהרת-פרשנות לעיל (מערבב סגנון עם שלמות-תוכן). ההמלצה נושאת דגל-confidence ("clear"/"weak") כך שבחירה שההובלה-ב-anti שלה בתוך-הרעש (epsilon=max(0.5, 0.20·spread)) לא מוצגת כוודאית. אין מסלול-מדד מקביל — שימוש-חוזר ב-style_distance (G2).

חלון נקי חד-פעמי: תיק שכבר lessons_folded פספס את חלון ה-held-out שלו — אין backfill. הטבלה מתמלאת קדימה מהסופי הבא.


1. שלוש לולאות-המשנה

הלמידה אינה אירוע יחיד אלא שלוש לולאות המתנקזות לאותם מסמכי-ידע מוסמכים (legal-decision-lessons.md, skills/decision/SKILL.md) ולקורפוסים:

1.1 לולאת-Hermes (post-export → הצעה → אישור)

הסוכן hermes-curator (adapter deepseek_local, פרופילים curator-cmp / curator-cmpa) נקרא אחרי שדפנה מסמנת קובץ כסופי ב-UI (POST /api/cases/{case_number}/exports/{filename}/mark-finalpc_wake_curator_for_final() ב-web/paperclip_client.py → sub-issue + wakeup; חיבור ישיר מה-UI, לא דרך CEOhermes-curator.md:27-35). הוא:

  • קורא בלבד את הטקסט הסופי (case_get_final_text), get_style_guide, ואת SKILL.md / legal-decision-lessons.md / corpus-analysis.md המקומיים (hermes-curator.md:60-70).
  • מזהה 35 דפוסים/פערים חדשים, כל ממצא מתויג [סגנון] / [מבנה] / [לקסיקון משפטי] / [טבלאי] (hermes-curator.md:99-108).
  • מציע — comment + interaction בערוץ-הפלטפורמה, וגם רושם כל ממצא מבנית כ-decision_lesson (source='curator', review_status='proposed') דרך כלי-ה-MCP record_curator_findings (hermes-curator.md §A.5b → tools/workflow.py::record_curator_findingsdb.add_decision_lesson). הממצאים מופיעים ב-/training טאב "אוצֵר" (ערוץ ג׳) ועוברים את שער-היו"ר (INV-LRN1).

    דריפט-מימוש שנסגר (2026-06-28): עד גל זה הסוכן כתב comment בלבד והספ תיאר endpoint שלא נקרא — הממצאים האיכותיים אבדו, וכרטיס-האוצֵר (get_curator_stats) ספר source='curator' שאיש לא כתב → 0. record_curator_findings מממש את INV-LRN3 בפועל.

  • אינו מאשר ואינו מטמיע — read-only על התוכן; רישום-הממצא הוא הצעה מגודרת-שער, לא שינוי-קול. אינו עורך skills/ / lessons.py / שכבת-הקול בעצמו (hermes-curator.md §"כללים כלליים").
  • שני ערוצי-למידה נפרדים על אותו סופי: ערוץ-האוצֵר (כאן, qualitative, source='curator') ופאנל-הסגנון הדו-סוכני שהצינור מפעיל (§0.6 — DeepSeek+Gemini, source='panel:deepseek+gemini'). שניהם decision_lessons ממתיני-שער; ערוץ הדיסטילציה (appeal_type_rules, §0.4) הוא השלישי.

נסגר (TaskMaster #159, 2026-06-28): ה-PIPELINE-WAKE BRANCH (hermes-curator.md) מבדיל כעת final_learning_* מ-final_halacha_*: על learning הסוכן מפעיל את הצינור ברקע וממשיך ל-§A (מצב AUTO — רושם ממצאי-curator, מדלג על interaction), על halacha יוצא מיד כקודם. המירוץ מול enroll_style_corpus נסגר בכך ש-enroll רץ ראשון בצינור (§0.6) — הקורפוס קיים תוך שניות, הרבה לפני שהסוכן/ה-§A מסיים את ניתוח-ה-LLM; record_curator_findings כולל גם retry כרשת-ביטחון.

1.2 לולאת-פידבק-היו"ר (capture → ניתוח שבועי → לקחים)

  • לכידה מובנית: record_chair_feedback שומר הערת-דפנה בטבלת chair_feedback (category ∈ {missing_content, wrong_tone, wrong_structure, factual_error, style, other}) — tools/workflow.py:348, ראה 05-qa-review.md §2.3.
  • ניתוח שבועי: ה-scheduled job weekly-feedback-analysis (ראשון 19:00, plugin-legal-ai/src/manifest.ts:175-179) מושך GET /api/chair-feedback/weekly-summary, ואם יש פריטים — מעיר את ה-CEO לעדכן את legal-decision-lessons.md עם הלקחים החדשים (worker.ts:784-837; הוראת ה-prompt: "הוסף רק לקחים חדשים… קבץ לפי נושא" — worker.ts:830).
  • אין פריטים → הג'וב מדלג בשקט (worker.ts:805). ל-CEO שמתעורר מ-weekly-feedback-job אין issueId — הוא כותב לקובץ בלבד, לא מפרסם comment ולא סוגר issue (כלל מ-CLAUDE.md "Scheduled Jobs").

1.3 לולאת-צמיחת-הקורפוס (החלטה סופית → קורפוס → אחזור)

החלטה סופית נקלטת לקורפוס-הסגנון (ingest_final_version — ראה 06-export.md § Hermes), ופסיקה/החלטות-ועדה חדשות נקלטות דרך המסלול הקנוני של 01-ingest.md. כך הקורפוס שמזין את האחזור (03-retrieval.md) גדל מהפלט עצמו — והדיון הבא נשען על תקדים עשיר יותר. צמיחה זו כפופה לאותו חוזה-שלמות (G4) כמו כל קליטה.


2. הלולאה במלואה (הציור)

                 ┌──────────────────────────────────────────────────────┐
                 │                                                      │
   ┌─────────────▼─────────────┐         ┌────────────────────────┐     │
   │  כתיבה (04)               │  ───▶   │  QA + שערים אנושיים (05)│     │
   │  12 בלוקים · סגנון דפנה   │         │  validate_decision +    │     │
   │  ← lessons.py CONTENT_    │         │  פידבק-היו"ר            │     │
   │    CHECKLISTS · SKILL.md  │         └───────────┬────────────┘     │
   └───────────────────────────┘                     │ ייצוא (06)        │
            ▲                                         ▼                   │
            │                              ┌──────────────────────┐      │
   ┌────────┴──────────────┐               │  סימון "סופי" (UI)    │      │
   │ legal-decision-       │               │  mark-final           │      │
   │ lessons.md + SKILL.md │               └───────┬──────────────┘      │
   │ (מסמכי-ידע מוסמכים)   │                       │                      │
   └────────▲──────────────┘            ┌──────────┴───────────┐         │
            │                           ▼                      ▼         │
            │  ✋ אישור-יו"ר ידני  ┌───────────────┐   ┌────────────────┐│
            └──────────────────────│ Hermes curator │   │ ingest_final → ││
            (commit ידני בלבד)     │ → הצעות(comment)│   │ קורפוס-סגנון → ┘│
                                   └───────────────┘   │ אחזור (03)      │
   ┌───────────────────────────┐                       └────────────────┘
   │ פידבק-היו"ר (05) ──┐       │
   │ chair_feedback     │       │
   └────────────────────┼───────┘
                        ▼
              weekly-feedback-analysis (job)
                        │ מעיר CEO
                        ▼
              עדכון legal-decision-lessons.md  ──┐
                                                 └──▶ (חזרה ל-04 / lessons.py)

הקשר לכתיבה: הלקחים והצ'קליסטים שב-CONTENT_CHECKLISTS (mcp-server/src/legal_mcp/services/lessons.py:355, בורר get_content_checklist :509-555) ו-get_lessons_for_outcome (lessons.py:309) מוזרקים ל-prompt-הכתיבה לפי סוג-ערר ותוצאה — ראה 04-analysis-writing.md §5. כל סגירה של לולאה (Hermes או פידבק) שמשנה את legal-decision-lessons.md / SKILL.md משפיעה ישירות על הכתיבה הבאה.


3. Invariants של התחום

INV-LRN1: עדכון-ידע דורש שער-יו"ר — שער מדורג לפי סיכון (governance →G10)

כלל (מעודכן 2026-06-28, הכרעת-יו"ר): השער מדורג לפי סיכון-התוכן, לא אחיד:

  • מהות (הלכה / תקדים / עובדה / כל שינוי ב-SKILL.md או ב-legal-decision-lessons.md) → שער-קשיח: בחינה ואישור ידניים של היו"ר/חיים ואז commit ידני — לעולם לא auto-committed. פאנל-ההלכות התלת-סוכני מציע בלבד.
  • סגנון (decision_lessons בקטגוריות style/structure/lexicon/tabular, וכן discussion_rules / transition_phrases / anti_patterns) שעבר קונצנזוס-פאנל 2/2זורם אוטומטית לכותב (review_status='approved'), הפיך: היו"ר רואה ויכול לבטל בדיעבד ב-/training. זהו שינוי-קול נמוך-סיכון (טהור-מהות לפי INV-LRN5), בקרת-איכות מובנית (2 מודלים), והפיכוּת — ולכן עדיין "תחת בקרת-המשתמש" במובן NCSC/CEPEJ (veto, לא אישור-מראש על כל פריט).

זהו פֶּאֶט של INV-G10 על שכבת-הידע: הלמידה כפופה לשיקול-הדעת האנושי — קשיח למהות, הפיך-veto לסגנון. מימוש: scripts/style_lesson_panel.py:_review_status_for קובע approved לקטגוריות-סגנון בקונצנזוס, proposed אחרת; הכותב צורך רק approved ([db.get_recent_decision_lessons]). מקורות: NCSC/JTC — Principles & Practices for AI Use in Courts (human-in-the-loop; never replace human judgment) · Council of Europe / CEPEJ (2018, under user control) · Federal Judicial Center — Judicial Writing Manual (2d ed.) | סטטוס: verified אכיפה: הסוכן read-only על תוכן ו-write רק על comments (hermes-curator.md:1-3, 125-130); תהליך-האישור — הצעת-curator כ-comment ב-Paperclip → חיים בוחן ומאשר ידנית → commit ל- SKILL.md ו-docs/legal-decision-lessons.md (מ-CLAUDE.md "Hermes Curator"); ה-CEO השבועי מתעורר בלי issueId וכותב לקובץ בלבד (CLAUDE.md "Scheduled Jobs"). הפרה ידועה:

INV-LRN2: האחריות לאיכות יושבת במקור — quality-at-source (engineering →G4)

כלל: האחריות לאיכות-הידע (לקחים, הלכות, metadata של פריטים מואנדקסים) נאכפת קרוב ככל האפשר לנקודת-היצירה/הקליטה — בעת ניסוח-ההחלטה, בעת לכידת-הפידבק, ובעת קליטת-פריט — לא מתוקנת בדיעבד במורד-הזרם (re-OCR, טלאי-קריאה, ניחוש בזמן-חיפוש). פריט-ידע חסר-שלמות מסומן ומדווח בנקודת-הכניסה, לא מתקבל בשקט. מקורות: Martin Fowler — Data Mesh (quality-at-source: domain owns data quality at the point of creation) · DAMA-UK Six Primary Dimensions for Data Quality (2013, completeness) · ISO 8000 (Data quality) | סטטוס: verified אכיפה: חוזה-שלמות בקליטה (01-ingest.md §2, 02-data-model.md)

  • "אין בליעה שקטה" (חוקה §6); לכידת-פידבק מובנית בנקודת-ההערה (record_chair_feedback, tools/workflow.py:348); לקחים נשמרים מבני ולא ad-hoc (lessons.py, legal-decision-lessons.md). הפרה ידועה: ראה INV-G4 (ערן סופר 8046/24 אונדקס עם headnote/summary/tags ריקים — שלמות לא נאכפה במקור) → ממצא ל-audit.

INV-LRN3: ידע נלכד באופן מובנה — לא ad-hoc (engineering →G9)

כלל: פידבק ולקחים נלכדים במבנה דטרמיניסטי ועקיבchair_feedback (עם category ו-block_id), decision_lessons (עם category/source), ו-CONTENT_CHECKLISTS בקוד — כך שהלמידה עמידה וניתנת-לביקורת, לא פזורה בהערות חופשיות. מקור-הלקח (source:"curator" מול פידבק-יו"ר) משומר לעקיבוּת. מקורות: ISO 15489-1:2016 (records reliability/authenticity) · DAMA-UK Six Primary Dimensions for Data Quality (2013) · ISO 8000 (Data quality) | סטטוס: verified אכיפה: טבלת chair_feedback + record_chair_feedback/list_chair_feedback (tools/workflow.py:348, 393); decision_lessons עם source+category (hermes-curator.md:79-96); CONTENT_CHECKLISTS/get_lessons_for_outcome (lessons.py:355, 309). עקיבוּת-מקור קושרת ל-X5-audit-provenance.md. הפרה ידועה:

INV-LRN6: סינתזת-עיקרון-קנוני מעוגנת ומגודרת-שער (V41 Phase 4 → G10/INV-AH/G9)

כלל: סינתזת ה-canonical_statement של עיקרון-הלכה קנוני (מיזוג/זיקוק ניסוחי-המופעים לניסוח אחד כללי) חייבת לקיים שלושה תנאים: (א) עיגון — הניסוח נובע מ-supporting_quote של המופעים בלבד, ללא הוספת דין/סייג/ציטוט-תיק שאינו במקור; חוסר-עיגון → הימנעות (grounded=false, נשמר הניסוח הקיים) ולא המצאה (INV-AH, AH-1/2/3). (ב) שער-drift — הניסוח המסונתז מוטמע-מחדש ומושווה (cosine) לניסוח-המקור; מתחת לרצפה (HALACHA_CANONICAL_SYNTH_DRIFT_FLOOR=0.80) הסינתזה נדחית (נשמר המקור) — הטמעה מהוזה/סוטה-נושא לא תדרוס עיקרון תקין בשקט. (ג) שער-יו — סינתזה אף פעם אינה מאשרת: היא מקדמת review_status מ-pending_synthesis ל-pending_review בלבד; ההכרעה הסופית היא של היו"ר בפאנל (INV-LRN1/G10). כל ניסיון-סינתזה (התקבל / נשמר-מקור / נמנע) מתועד (CSV ב-data/audit/ + log), ובהטמעה מתעדכן ה-embedding יחד עם הניסוח כדי ש-lookup-before-insert (cosine) לא יסחף (INV-G6). מסלול-יחיד (G2): כל הקוראים (backfill, כלי-MCP canonical_synthesize_pending, דריינר-לילה) עוברים דרך services/canonical_synthesis.py::synthesize_canonical — אין נתיב-סינתזה מקביל. מקורות: Stanford RegLab/Magesh et al. (JELS 2025 — grounding מול הזיה) · Dhuliawala et al. Chain-of-Verification (arXiv:2309.11495, 2023) · RAGAS faithfulness (atomic-claim grounding) | סטטוס: verified אכיפה: services/canonical_synthesis.py (עיגון בפרומפט, _new_citations, שער-drift); db.apply_canonical_synthesis (סטטוס→pending_review אטומי + רענון-embedding); הפאנל הקנוני (/precedents, PR#300) לאישור-יו"ר; CSV-audit ב-data/audit/canonical-synthesis-*.csv. הפרה ידועה: — (חדש)

INV-LRN7: חילוץ-עקרונות מגודר-פאנל + טרמינולוגיה נכונה (#152 → G2/G10/INV-AH)

כלל: חילוץ עקרונות-משפטיים מפסיקה (להבא ורטרואקטיבית) עובר משטר-פאנל אחיד: 3 מודלים עצמאיים (Claude מקומי + DeepSeek + Gemini) מנתחים לעומק כל החלטה, מציעים מועמדים עם ציון, המועמדים מותאמים בין-מודלית (cosine), ולכל אחד votes (# מודלים) ו-score (ממוצע-המצביעים). כלל-אישור: 3 קולות→אישור · 2 וציון≥0.85→ אישור · 2 ו<0.85→pending_review (יו"ר, G10) · ≤1→נדחה. תקרה: עד HALACHA_PANEL_MAX_NEW=5 עקרונות חדשים לכל החלטה (לפי ציון); עיקרון מוכר מקושר ל-canonical קיים (cosine, V41) ואינו נספר בתקרה. טרמינולוגיה (מהות, לא קוסמטיקה): ועדת-ערר מיישמת דין ואינה יוצרת הלכה — עיקרון מפס"ד מחוזי/עליון מחייב = הלכה, מהחלטת ועדת-ערר = כלל פרשני, מפסיקה משכנעת = עיקרון; המטרייה = עקרונות משפטיים. הסיווג נגזר מ-first_established_in (source_kind/is_binding), ללא עמודה חדשה. מקור-יחיד (G2): extractor (_extract_via_panel), סינון רטרואקטיבי (cull_principles.py), ושני הם דרך services/panel_extraction + panel_judges — אין נתיב-פאנל מקביל. מקורות: gold-set tri-model consensus (AC1=0.92, project_goldset_tri_model_consensus) · LegalBench (gemini-2.5-flash) · Trust-or-Escalate (ICLR 2025) | סטטוס: verified אכיפה: services/panel_extraction.py (panel_extract/panel_keep_score/classify/apply_cap), services/panel_judges.py, halacha_extractor._extract_via_panel, db.store_panel_principles, scripts/cull_principles.py, services/principles.py (תווית). config HALACHA_PANEL_*. החלטת-יו"ר 2026-06-19; מקור-אמת: ../legal-principles-redesign.md. הפרה ידועה: — (חדש)

INV-LRN8: סינתזת-לקחים מעוגנת + מגודרת-שער-מדורג (#158 → G2/G10/INV-AH)

כלל: לקחי-סגנון (decision_lessons) חופפים מאוחדים ללקח-על אחד עשיר ומוכלל, כך שהסט שזורם לכותב קטֵן ומשתבח (פותר את החיתוך-השקט limit=15, #157) — Authorial Style Profiling (§0.1: פרופיל-מופשט מנצח ערימת-דוגמאות). המנגנון מחקה את סינתזת-הקנוני (INV-LRN6) על אותה טבלה — אין מאגר-מקביל (G2): (א) אשכול greedy לפי cosine (LESSON_SYNTH_CLUSTER_THRESHOLD) בתוך shard של practice_area+category; (ב) מיזוג ע"י claude_session מעוגן-מקור — נובע מלקחי-המקור בלבד, סגנון-בלבד (לא מהות, INV-LRN5), abstain אם לא-מתמזג (INV-AH); (ג) שער-drift — הלקח-הממוזג מוטמע-מחדש ומושווה (cosine) ל-centroid האשכול; מתחת ל-LESSON_SYNTH_DRIFT_FLOOR נדחה. הלקח-על נכתב source='synthesis' עם synthesized_from, והמקורות → review_status='superseded' (provenance, לא נצרכים-כותב). שער מדורג-הפיך (הכרעת-יו"ר 2026-06-28): מאחר שכל המקורות approved, הלקח-על זורם approved עם veto-יו"ר ב-/training — דחייתו משחזרת את המקורות ל-approved (db.revert_lesson_synthesis). idempotency: lookup-cosine מול synthesis קיים לפני INSERT. מסלול-יחיד (G2): הכלי lesson_synthesize_pending והסקריפט backfill_lesson_synthesis.py עוברים שניהם דרך services/lesson_synthesis.py. audit CSV ב-data/audit/lesson-synthesis-*.csv. מקורות: Authorial Style Profiling · grounding-vs-hallucination (Stanford RegLab) · CoVe (arXiv:2309.11495) | סטטוס: verified אכיפה: services/lesson_synthesis.py (אשכול/מיזוג/drift), db.{fetch_synthesis_candidates, apply_lesson_synthesis,revert_lesson_synthesis,nearest_synthesis_lesson,synthesis_shards}, SCHEMA_V46 (embedding+synthesized_from). config LESSON_SYNTH_*. הפרה ידועה: — (חדש)


4. הג'ובים המתוזמנים (תמיכת-תשתית ללולאה)

Job (manifest.ts) לוח-זמנים תפקיד בלולאה
weekly-feedback-analysis ראשון 19:00 (:175-179) מסכם פידבק-יו"ר → מעיר CEO לעדכון legal-decision-lessons.md (worker.ts:784-837)
stale-case-reminder יומי 08:00 (:169-172) תזכורת על תיקים תקועים 30+ ימים (worker.ts:710-780) — היגיינת-תהליך, לא ידע
sync-case-status כל 15 דק' (:162-166) מסנכרן סטטוסי-תיקים legal-ai↔Paperclip (worker.ts:624) — תשתית, לא ידע

רק weekly-feedback-analysis הוא חלק מלולאת-הלמידה; שני האחרים הם היגיינת-תהליך/סנכרון.


5. הפניות-אחיות