feat(case-ui): חלוקת רשימת-המסמכים בטאב-הסקירה ל-4 קבוצות #390

Merged
chaim merged 1 commits from worktree-docs-grouped-overview into main 2026-07-05 06:54:17 +00:00
Owner

מה ולמה

טאב "סקירה" בדף-התיק: רשימת מסמכי-התיק חולקה פנימית ל-4 קבוצות לנוחות היו"ר (החלוקה תצוגתית בלבד — לא משנה doc_type):

  1. מסמכים עיקרייםappeal · response · appraisal (הוגשו לפני הדיון)
  2. מסמכים נלווים — החלטת/פרוטוקול ועדה מקומית-מחוזית, תכניות, וכל השאר
  3. פרוטוקול דיון ועדת העררprotocol שסומן "ועדת הערר" (ברירת-מחדל)
  4. מסמכים לאחר הדיון — כל מסמך שסומן "לאחר הדיון" (גובר על הסיווג-לפי-סוג)

הסיווג נגזר בצד-הלקוח (documentGroup ב-doc-types.ts) מ-doc_type + שני דגלי-metadata.

שני פקדים חדשים בעורך-התיוג (document-type-editor.tsx):

  • מתג "התקבל אחרי הדיון"metadata.is_post_hearing (דגל שכבר קיים ונצרך ע"י כותב בלוק-ח) — פותר את כפילות response (תשובה לפני≠אחרי הדיון).
  • בורר "פרוטוקול של: ועדת הערר / ועדה מקומית-מחוזית"metadata.protocol_scope (מוצג רק כשהסוג protocol) — פותר את כפילות protocol (ועדת-ערר≠ועדה-מקומית).

Backend: PATCH /api/cases/{n}/documents/{id} וכלי-ה-MCP document_update מקבלים כעת is_post_hearing (bool) ו-protocol_scope (appeal/lower), נשמרים ב-documents.metadata JSONB — אותו מסלול של appraiser_side, ללא שינוי-סכמה.

עיצוב אושר ב-Claude Design (X17): 18k-case-documents-grouped.html.

Invariants — הצהרה (חובה)

  • נוגע / מקיים:
    • G2 (מקור-אמת יחיד) — אין מסלול-נתונים מקביל: הדגלים החדשים נשמרים ב-documents.metadata דרך אותו PATCH/כלי-MCP הקיים; הקיבוץ נגזר-בקריאה ואינו כותב מצב חדש. ה-doc_type נשאר מקור-האמת היחיד לסוג.
    • G1 (נרמול-במקור) — הדגל נשמר במקור (metadata) והתצוגה נגזרת ממנו.
    • X6/X9 (חוזי UI↔API / MCP) — endpoint וכלי-ה-MCP הורחבו יחד ונשארים בפָּריטי (הולידציה זהה, אותם ערכים מותרים).
    • G12 (שער-הפלטפורמה) — אין מגע-Paperclip; mcp-server/src ו-skills נקיים.
    • G11 — ללא נגיעה בתוכן-משפטי.

צ'קליסט — פרוטוקול כתיבת-קוד

  • קראתי את מודל-הנתונים הרלוונטי (schema documents, is_post_hearing, PATCH handler) לפני הכתיבה
  • השינוי לא יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1)
  • לא הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12)
  • אין בליעה שקטה של שגיאות — ולידציה מחזירה 422 עם ערכים מותרים
  • בדקתי מול gap-audit.md — לא נוגע ב-GAP/FU ממופה
  • בדיקות: tsc --noEmit ✓ · eslint ✓ · py_compile

אימות

  • npx tsc --noEmit — עבר (exit 0).
  • npx eslint על קבצי-הפרונט המשונים — עבר (exit 0).
  • python3 -m py_compile web/app.py mcp-server/.../documents.py — עבר.
  • לוגיקת-הקיבוץ (documentGroup): is_post_hearing גובר → קבוצה 4; protocol+scope=lower→2, אחרת→3; appeal/response/appraisal→1; אחרת→2.
  • ⚠️ מגבלה: אין סביבת-הרצה מקומית ל-legal-ai (Docker/Coolify בלבד) — לא בוצע drive E2E חי. אחרי מיזוג+דיפלוי מומלץ npm run api:types לרענון סכמת-ה-OpenAPI (הפרונט לא תלוי בו — DocumentPatch מוקלד-יד).

🤖 Generated with Claude Code

## מה ולמה טאב "סקירה" בדף-התיק: רשימת מסמכי-התיק חולקה **פנימית ל-4 קבוצות** לנוחות היו"ר (החלוקה תצוגתית בלבד — לא משנה `doc_type`): 1. **מסמכים עיקריים** — `appeal` · `response` · `appraisal` (הוגשו לפני הדיון) 2. **מסמכים נלווים** — החלטת/פרוטוקול ועדה מקומית-מחוזית, תכניות, וכל השאר 3. **פרוטוקול דיון ועדת הערר** — `protocol` שסומן "ועדת הערר" (ברירת-מחדל) 4. **מסמכים לאחר הדיון** — כל מסמך שסומן "לאחר הדיון" (**גובר** על הסיווג-לפי-סוג) הסיווג נגזר בצד-הלקוח (`documentGroup` ב-`doc-types.ts`) מ-`doc_type` + שני דגלי-metadata. **שני פקדים חדשים בעורך-התיוג** (`document-type-editor.tsx`): - מתג **"התקבל אחרי הדיון"** → `metadata.is_post_hearing` (דגל שכבר קיים ונצרך ע"י כותב בלוק-ח) — פותר את כפילות `response` (תשובה לפני≠אחרי הדיון). - בורר **"פרוטוקול של: ועדת הערר / ועדה מקומית-מחוזית"** → `metadata.protocol_scope` (מוצג רק כשהסוג `protocol`) — פותר את כפילות `protocol` (ועדת-ערר≠ועדה-מקומית). **Backend:** `PATCH /api/cases/{n}/documents/{id}` וכלי-ה-MCP `document_update` מקבלים כעת `is_post_hearing` (bool) ו-`protocol_scope` (`appeal`/`lower`), נשמרים ב-`documents.metadata` JSONB — **אותו מסלול** של `appraiser_side`, ללא שינוי-סכמה. עיצוב אושר ב-Claude Design (X17): `18k-case-documents-grouped.html`. ## Invariants — הצהרה (חובה) - **נוגע / מקיים:** - **G2 (מקור-אמת יחיד)** — אין מסלול-נתונים מקביל: הדגלים החדשים נשמרים ב-`documents.metadata` דרך אותו PATCH/כלי-MCP הקיים; הקיבוץ נגזר-בקריאה ואינו כותב מצב חדש. ה-`doc_type` נשאר מקור-האמת היחיד לסוג. - **G1 (נרמול-במקור)** — הדגל נשמר במקור (metadata) והתצוגה נגזרת ממנו. - **X6/X9 (חוזי UI↔API / MCP)** — endpoint וכלי-ה-MCP הורחבו יחד ונשארים בפָּריטי (הולידציה זהה, אותם ערכים מותרים). - **G12 (שער-הפלטפורמה)** — אין מגע-Paperclip; `mcp-server/src` ו-skills נקיים. - **G11** — ללא נגיעה בתוכן-משפטי. ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי את מודל-הנתונים הרלוונטי (schema documents, is_post_hearing, PATCH handler) לפני הכתיבה - [x] השינוי **לא** יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1) - [x] **לא** הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) - [x] אין בליעה שקטה של שגיאות — ולידציה מחזירה 422 עם ערכים מותרים - [x] בדקתי מול `gap-audit.md` — לא נוגע ב-GAP/FU ממופה - [x] בדיקות: `tsc --noEmit` ✓ · `eslint` ✓ · `py_compile` ✓ ## אימות - `npx tsc --noEmit` — עבר (exit 0). - `npx eslint` על קבצי-הפרונט המשונים — עבר (exit 0). - `python3 -m py_compile web/app.py mcp-server/.../documents.py` — עבר. - לוגיקת-הקיבוץ (`documentGroup`): `is_post_hearing` גובר → קבוצה 4; `protocol`+scope=`lower`→2, אחרת→3; `appeal/response/appraisal`→1; אחרת→2. - ⚠️ **מגבלה:** אין סביבת-הרצה מקומית ל-legal-ai (Docker/Coolify בלבד) — לא בוצע drive E2E חי. אחרי מיזוג+דיפלוי מומלץ `npm run api:types` לרענון סכמת-ה-OpenAPI (הפרונט לא תלוי בו — `DocumentPatch` מוקלד-יד). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-07-05 06:54:06 +00:00
feat(case-ui): חלוקת רשימת-המסמכים בטאב-הסקירה ל-4 קבוצות
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 36s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
cc8af903b7
חלוקה פנימית (לנוחות בלבד, לא משנה doc_type) של רשימת מסמכי-התיק:
1. עיקריים (appeal/response/appraisal) · 2. נלווים · 3. פרוטוקול ועדת הערר ·
4. לאחר הדיון. הסיווג נגזר בצד-הלקוח מ-doc_type + שני דגלי-metadata.

שני פקדים חדשים בעורך-התיוג:
- מתג "התקבל אחרי הדיון" → metadata.is_post_hearing (כבר נצרך ע"י בלוק-ח);
  גובר על הסיווג-לפי-סוג ומעביר לקבוצה 4.
- בורר "פרוטוקול של: ועדת הערר / ועדה מקומית-מחוזית" → metadata.protocol_scope
  (נראה רק כשהסוג protocol); ברירת-מחדל appeal→קבוצה 3, lower→קבוצה 2.

Backend: PATCH /documents/{id} + MCP document_update מקבלים is_post_hearing
ו-protocol_scope, נשמרים ב-metadata JSONB (אותו מסלול כמו appraiser_side).

עיצוב אושר ב-Claude Design (X17): 18k-case-documents-grouped.html.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit cc48896a0e into main 2026-07-05 06:54:17 +00:00
chaim deleted branch worktree-docs-grouped-overview 2026-07-05 06:54:17 +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#390