fix(halacha): split authority (derived) from rule_role — stop source-conflation (INV-DM7) #112

Merged
chaim merged 1 commits from worktree-halacha-authority-split into main 2026-06-07 18:19:43 +00:00
Owner

מה ולמה

ניתוח קפדני של מדגם-הזהב חשף ש-rule_type של ההלכות מערבב שני צירים אורתוגונליים, וזה שורש רעש-הסיווג (התאמה לתיוג-אנושי 58% בלבד):

  • המחלץ סיווג לפי סמכות-המקור (עליון→binding, ועדה→persuasive) — הוכחה חותכת: binding הופיע על 19/19 פסקים חיצוניים ו-0 ועדות; persuasive על 13/13 ועדות ו-0 חיצוניים.
  • האדם תייג סוג-כלל (פרשני/פרוצדורלי). שני הצירים נדחסו ל-enum אחד.

הפתרון (INV-DM7) — שני צירים נפרדים

ציר מקור ערכים
authority נגזר מ-case_law.precedent_level (לא מאוחסן, לא LLM) binding (עליון/מנהלי) · persuasive (ועדת_ערר_מחוזית)
rule_type (role) מסווג ע"י ה-LLM holding · interpretive · procedural · application · obiter
  • halacha_quality.derive_authority() — pure, מקור-אמת יחיד; נחשף read-only ב-list_halachot/goldset_list/חיפוש.
  • שני prompts-המחלץ אוחדו לאוצר-מילים של תפקיד; _coerce_halacha כבר לא גוזר rule_type מהמקור (fold: binding→holding, persuasive→interpretive לבטיחות).
  • UI: badge-סמכות read-only נפרד (זהב=מחייב / אפור=משכנע) בתור-הסקירה, פרטי-התקדים, והמדגם-זהב; בורר-התפקיד במדגם מאבד binding/persuasive ומוסיף "מהותי".

מיגרציה (אחרי deploy)

  • scripts/halacha_rule_role_backfill.py — מסווג-מחדש 276 שורות-קדם-פיצול לתפקיד אמיתי דרך claude_session המקומי (אפס עלות; backup CSV; dry-run כברירת-מחדל).
  • gold-set correct_type/ai_correct_type: bindingholding ב-SQL.

מקורות (≥3, מדיניות החלטות-ארכיטקטורה)

  • OASIS LegalRuleML v1.0 — appliesAuthority/Strength כ-metadata אורתוגונלי, נפרד מלוגיקת-הכלל.
  • SemEval-2023 Task 6 LegalEval — rhetorical-roles לפי תפקיד; סמכות נשמרת בנפרד.
  • Bluebook signals — משקל-סמכות = ציר נפרד מהפרופוזיציה.

Invariants

  • מקים INV-DM7 (docs/spec/02-data-model.md).
  • מקיים G1 (נרמול-במקור: המחלץ מסווג תפקיד, המערכת גוזרת סמכות) ו-G2 (מקור-אמת יחיד: סמכות נגזרת, לא שדה מקבילי מאוחסן).

בדיקות

  • 211 טסטים עוברים + כיסוי חדש ל-derive_authority ו-_coerce_halacha fold.
  • web-ui tsc --noEmit נקי + next build עבר (כל 16 המסלולים).

🤖 Generated with Claude Code

## מה ולמה ניתוח קפדני של מדגם-הזהב חשף ש-`rule_type` של ההלכות **מערבב שני צירים אורתוגונליים**, וזה שורש רעש-הסיווג (התאמה לתיוג-אנושי 58% בלבד): - המחלץ סיווג לפי **סמכות-המקור** (עליון→`binding`, ועדה→`persuasive`) — הוכחה חותכת: `binding` הופיע על **19/19 פסקים חיצוניים ו-0 ועדות**; `persuasive` על **13/13 ועדות ו-0 חיצוניים**. - האדם תייג **סוג-כלל** (פרשני/פרוצדורלי). שני הצירים נדחסו ל-enum אחד. ## הפתרון (INV-DM7) — שני צירים נפרדים | ציר | מקור | ערכים | |-----|------|-------| | **authority** | **נגזר** מ-`case_law.precedent_level` (לא מאוחסן, לא LLM) | `binding` (עליון/מנהלי) · `persuasive` (ועדת_ערר_מחוזית) | | **rule_type** (role) | מסווג ע"י ה-LLM | `holding` · `interpretive` · `procedural` · `application` · `obiter` | - `halacha_quality.derive_authority()` — pure, מקור-אמת יחיד; נחשף read-only ב-`list_halachot`/`goldset_list`/חיפוש. - שני prompts-המחלץ אוחדו לאוצר-מילים של תפקיד; `_coerce_halacha` כבר לא גוזר rule_type מהמקור (fold: binding→holding, persuasive→interpretive לבטיחות). - **UI:** badge-סמכות read-only נפרד (זהב=מחייב / אפור=משכנע) בתור-הסקירה, פרטי-התקדים, והמדגם-זהב; בורר-התפקיד במדגם מאבד binding/persuasive ומוסיף "מהותי". ## מיגרציה (אחרי deploy) - `scripts/halacha_rule_role_backfill.py` — מסווג-מחדש 276 שורות-קדם-פיצול לתפקיד אמיתי דרך claude_session המקומי (אפס עלות; backup CSV; dry-run כברירת-מחדל). - gold-set `correct_type`/`ai_correct_type`: `binding`→`holding` ב-SQL. ## מקורות (≥3, מדיניות החלטות-ארכיטקטורה) - OASIS LegalRuleML v1.0 — `appliesAuthority`/`Strength` כ-metadata אורתוגונלי, נפרד מלוגיקת-הכלל. - SemEval-2023 Task 6 LegalEval — rhetorical-roles לפי תפקיד; סמכות נשמרת בנפרד. - Bluebook signals — משקל-סמכות = ציר נפרד מהפרופוזיציה. ## Invariants - **מקים INV-DM7** (`docs/spec/02-data-model.md`). - מקיים **G1** (נרמול-במקור: המחלץ מסווג תפקיד, המערכת גוזרת סמכות) ו-**G2** (מקור-אמת יחיד: סמכות נגזרת, לא שדה מקבילי מאוחסן). ## בדיקות - 211 טסטים עוברים + כיסוי חדש ל-`derive_authority` ו-`_coerce_halacha` fold. - web-ui `tsc --noEmit` נקי + `next build` עבר (כל 16 המסלולים). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-07 18:19:37 +00:00
The extractor classified rule_type by SOURCE bindingness (higher-court→binding,
committee→persuasive) instead of by rule KIND. The gold-set proved it: 'binding'
appeared on 19/19 external rulings & 0 committees; 'persuasive' on 13/13
committees & 0 external — only 58% agreement with the human role tags. The two
axes (authority vs rule role) were crammed into one enum.

This splits them per INV-DM7:
- authority (binding/persuasive) — DERIVED from case_law.precedent_level
  (עליון/מנהלי→binding, ועדת_ערר_מחוזית→persuasive), never stored, never
  LLM-guessed. New helper halacha_quality.derive_authority; surfaced read-only
  in list_halachot / goldset_list / search results.
- rule_type — now the rule ROLE only: holding/interpretive/procedural/
  application/obiter. Both extractor prompts unified to this vocabulary;
  _coerce_halacha no longer defaults rule_type from the source; legacy
  binding→holding / persuasive→interpretive fold for safety.

UI: authority shown as a separate read-only badge (gold=מחייב / muted=משכנע)
across the review queue, precedent detail, and gold-set; the gold-set role
selector drops binding/persuasive and adds מהותי (holding).

Migration: scripts/halacha_rule_role_backfill.py re-classifies the 276 pre-split
binding/persuasive rows into a genuine role via local claude_session (run after
deploy). Gold-set correct_type/ai_correct_type 'binding'→'holding' via SQL.

Sources (≥3, per research-decision policy): OASIS LegalRuleML v1.0
(appliesAuthority/Strength as metadata orthogonal to rule logic) · SemEval-2023
Task 6 LegalEval (rhetorical roles by function, authority kept separate) ·
Bluebook signals (weight-of-authority is a separate dimension).

Invariants: ESTABLISHES INV-DM7. Upholds G1 (normalize at source — extractor
classifies role, system derives authority) and G2 (single source of truth —
authority derived, not a parallel stored field). Tests: 211 pass + new
derive_authority/coerce coverage. web-ui build + tsc clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit f3740fef68 into main 2026-06-07 18:19:43 +00:00
chaim deleted branch worktree-halacha-authority-split 2026-06-07 18:19:43 +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#112