feat(arguments): הפרדת-משיבים בצבירה לפי כתב-תשובה (#224) #392

Merged
chaim merged 1 commits from worktree-respondent-party-separation into main 2026-07-05 09:53:28 +00:00
Owner

הבעיה

בתיק 1043-02-26: כל המשיבים התמזגו למפלגה אחת respondent בכרטיס "טיעונים ועמדות". שני כתבי-תשובה נפרדים — משיבות 2-3 ו-משיבים 4-6 — עם עמדות שעלולות להיות מנוגדות, נבלעו לרשימה אחת ואי-אפשר היה להבחין מי-אמר-מה.

שורש: argument_aggregator קיבץ לפי party_role בלבד; party_name היה שדה-מת (קיים בסכמת claims, נשמר ריק, אף פעם לא נקרא). המבחין היחיד ששרד — source_document — לא נוצל.

הפתרון (v1)

פיצול הצדדים הרב-משתתפים (respondent/permit_applicant) לפי source_document — כל כתב-תשובה משותף = יחידת-ליטיגציה קוהרנטית נפרדת. עוררים/ועדה נשארים קבוצה יחידה (single-voice).

  • DBSCHEMA_V50_SQL: legal_arguments.party_name (ADD COLUMN IF NOT EXISTS, אידמפוטנטי).
  • צבירה — קיבוץ (party, party_name); ה-prompt מקבל את שם-הכתב כדי ש-Claude לא יערבב עמדות; get_legal_arguments מחזיר party_name.
  • UIPartySection מתת-קבץ את המשיבים לפי כתב-תשובה (כותרת-משנה לכל בלוק); טיפוס LegalArgument.party_name.

בונוס: פיצול ה-129 טענות ל-קריאות-Claude קטנות (34+51) מתקן את הכשל-בשקט המקורי — קריאה של 100+ פרופוזיציות החזירה non-JSON והפילה את כל צד-המשיבים (למה הם נשמטו מלכתחילה).

טווח / המשך ב-#224

  • v1 מקבץ לפי source_document; אכלוס party_name ב-extractor וזיהוי עמדות-מנוגדות בין משיבים בבלוק ז/י — משימות המשך.
  • מלכודת ידועה: נספחים של משיבים (התנגדויות/תגובות) הופכים לקבוצה משלהם — עידון-מיפוי-לבלוק בהמשך.

בדיקות

  • py_compile נקי; tsc --noEmit נקי (רק שגיאות .next תלושות מ-/compose שנמחק).
  • טרם נבדק end-to-end חי — הצבירה רצה בשרת-ה-MCP המקומי; דורש טעינה-מחדש של ה-MCP + aggregate_claims_to_arguments(force=true) על 1043-02-26 לאימות שמשיבות 2-3 ו-4-6 מופיעות בנפרד.

Invariants

  • G1 — נרמול-במקור: party_name בסכמה, לא תיקון-בזמן-קריאה.
  • G2 — אין מסלול-צבירה מקביל; אותו pipeline קיים.
  • §6 — אין בליעה שקטה; הכשל-בשקט המקורי תוקן.

🤖 Generated with Claude Code

## הבעיה בתיק 1043-02-26: כל המשיבים התמזגו למפלגה אחת `respondent` בכרטיס "טיעונים ועמדות". שני כתבי-תשובה נפרדים — **משיבות 2-3** ו-**משיבים 4-6** — עם עמדות שעלולות להיות מנוגדות, נבלעו לרשימה אחת ואי-אפשר היה להבחין מי-אמר-מה. **שורש:** `argument_aggregator` קיבץ לפי `party_role` בלבד; `party_name` היה שדה-מת (קיים בסכמת `claims`, נשמר ריק, אף פעם לא נקרא). המבחין היחיד ששרד — `source_document` — לא נוצל. ## הפתרון (v1) פיצול הצדדים הרב-משתתפים (`respondent`/`permit_applicant`) לפי `source_document` — כל כתב-תשובה משותף = יחידת-ליטיגציה קוהרנטית נפרדת. עוררים/ועדה נשארים קבוצה יחידה (single-voice). - **DB** — `SCHEMA_V50_SQL`: `legal_arguments.party_name` (ADD COLUMN IF NOT EXISTS, אידמפוטנטי). - **צבירה** — קיבוץ `(party, party_name)`; ה-prompt מקבל את שם-הכתב כדי ש-Claude לא יערבב עמדות; `get_legal_arguments` מחזיר `party_name`. - **UI** — `PartySection` מתת-קבץ את המשיבים לפי כתב-תשובה (כותרת-משנה לכל בלוק); טיפוס `LegalArgument.party_name`. **בונוס:** פיצול ה-129 טענות ל-קריאות-Claude קטנות (34+51) **מתקן את הכשל-בשקט המקורי** — קריאה של 100+ פרופוזיציות החזירה non-JSON והפילה את כל צד-המשיבים (למה הם נשמטו מלכתחילה). ## טווח / המשך ב-#224 - v1 מקבץ לפי `source_document`; אכלוס `party_name` ב-extractor וזיהוי **עמדות-מנוגדות** בין משיבים בבלוק ז/י — משימות המשך. - מלכודת ידועה: נספחים של משיבים (התנגדויות/תגובות) הופכים לקבוצה משלהם — עידון-מיפוי-לבלוק בהמשך. ## בדיקות - `py_compile` נקי; `tsc --noEmit` נקי (רק שגיאות `.next` תלושות מ-`/compose` שנמחק). - **טרם נבדק end-to-end חי** — הצבירה רצה בשרת-ה-MCP המקומי; דורש טעינה-מחדש של ה-MCP + `aggregate_claims_to_arguments(force=true)` על 1043-02-26 לאימות שמשיבות 2-3 ו-4-6 מופיעות בנפרד. ## Invariants - **G1** — נרמול-במקור: `party_name` בסכמה, לא תיקון-בזמן-קריאה. - **G2** — אין מסלול-צבירה מקביל; אותו pipeline קיים. - **§6** — אין בליעה שקטה; הכשל-בשקט המקורי תוקן. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-07-05 09:43:01 +00:00
feat(arguments): הפרדת-משיבים בצבירה לפי כתב-תשובה (#224)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 11m48s
Lint — undefined names / undefined-names (pull_request) Successful in 12s
68c2be2a7b
הצבירה קיבצה את כל המשיבים תחת מפלגה אחת "respondent", כך שכתבי-תשובה
נפרדים (משיבות 2-3 מול משיבים 4-6) עם עמדות שעלולות להיות מנוגדות נבלעו
לרשימה אחת. התגלה בתיק 1043-02-26.

השינוי מפצל את הצדדים הרב-משתתפים (respondent/permit_applicant) לפי
source_document — כל כתב-תשובה משותף = יחידת-ליטיגציה קוהרנטית נפרדת —
ומאחסן את התווית ב-legal_arguments.party_name (מיגרציה V50). עוררים/ועדה
נשארים קבוצה יחידה. בונוס: פיצול ה-129 טענות ל-קריאות-Claude קטנות מתקן
את הכשל-בשקט המקורי (קריאה של 100+ פרופוזיציות החזירה non-JSON והפילה את
כל הצד).

- db.py: SCHEMA_V50_SQL — legal_arguments.party_name (ADD COLUMN IF NOT EXISTS, אידמפוטנטי)
- argument_aggregator: קיבוץ (party, party_name); _build_prompt מקבל שם-כתב; SELECT מחזיר party_name
- UI: PartySection מתת-קבץ לפי כתב-תשובה; טיפוס LegalArgument.party_name

טווח v1: הקיבוץ לפי source_document; אכלוס party_name ב-extractor וזיהוי
עמדות-מנוגדות בבלוק ז/י — המשך ב-#224.

Invariants: G1 (נרמול-במקור — party_name בסכמה, לא תיקון-בקריאה) · G2 (אין
מסלול-צבירה מקביל, אותו pipeline) · §6 (אין בליעה שקטה — הכשל-בשקט תוקן).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit e5c7455284 into main 2026-07-05 09:53:28 +00:00
chaim deleted branch worktree-respondent-party-separation 2026-07-05 09:53:28 +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#392