feat(analysis): דגל "לא-נותח" + ניתוח-מחדש מאחד + בדיקת-השפעה (#201) #361

Merged
chaim merged 1 commits from worktree-agent-abe485b6eb373903f into main 2026-06-30 12:20:40 +00:00
Owner

מה ולמה

WS2b של עיצוב-מחדש זרימת-העבודה (תוכנית groovy-doodling-token.md, משימה #201). מאפשר לנתח את כתב-הערר לבד, ואז לאחד מסמך-עיקרי שנוסף מאוחר — בלי force-delete גורף — ולהציג ליו"ר מה השתנה.

נבנה מעל #200 (PR #354, is_primary/PRIMARY_DOC_TYPES).

מה נוסף

  1. דגל "לא-נותח" per-מסמך (SCHEMA_V49)documents.claims_extracted_at TIMESTAMPTZ + claims_extraction_status TEXT (pending/completed/no_claims/failed). מתעדים את אירוע חילוץ-הטענות, לא נגזרים מ-doc_type. אינדקס חלקי idx_documents_claims_pending(case_id) WHERE is_primary AND claims_extracted_at IS NULL. idempotent (ADD COLUMN IF NOT EXISTS). V48 שמור ל-#357.
  2. זיהוי "מסמך-עיקרי שטרם-נכלל"db.primary_docs_not_analyzed (משלב is_primary של V47 + claims_extracted_at IS NULL); claims_extractor חותם כל מסמך אחרי חילוץ; _row_to_doc חושף claims_analyzed. נחשף ב-workflow_status (שדה primary_docs_not_analyzed + next-step).
  3. כלי ניתוח-מחדש מאחדreanalyze_claims(case_number, reanalyze_all_primary=False): חילוץ-מחדש רק למסמכים-עיקריים חדשים/לא-נותחו, איחוד עם הטענות הקיימות, צבירה-מחדש.
  4. בדיקת-השפעה ליו"ר_impact_diff מחזיר per-צד אילו טיעונים נוספו/הוסרו ואיך השתנה תמהיל-העדיפויות ("מאזן-ההמלצה"), עם דגל changed.

האיחוד (merge, לא force-delete)

  • store_claims כבר מחליף רק את טענות אותו source_document → חילוץ-מחדש של מסמך בודד לא נוגע בטענות ממסמכים אחרים (האיחוד).
  • aggregate_claims_to_arguments(force=True) מחשב את הטיעונים מחדש מתוך מערך-הטענות המאוחד — מוחק רק legal_arguments (נגזר), לעולם לא claims.

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

  • נוגע / מקיים:
    • G1 (נרמול-במקור): claims_extracted_at נחתם בנקודת-החילוץ; claims_analyzed נגזר ממנו — לא תיקון-סלחני-בקריאה.
    • G2 (מקור-אמת יחיד / merge-not-fork): reanalyze_claims מרחיב את מסלול claims_extractor + argument_aggregator הקיים — לא forks. האיחוד דרך store_claims per-source; הצבירה-מחדש היא מסלול-החישוב הקנוני (force=True מוחק רק נגזר).
    • INV-DM1/DM3/DM4 (מודל-נתונים): דגל-אירוע per-מסמך עם אינדקס חלקי; מקור-אמת יחיד (claims_extracted_at); תיעוד provenance per-מסמך.
    • G10 (שער-אנושי): בדיקת-ההשפעה מוצגת ליו"ר ולא מוחלת אוטומטית.
    • INV-TOOL (idempotency): SCHEMA_V49 idempotent; ניתוח-מחדש חוזר על מסמך כבר-נותח = refresh נקי (replace per-source).
    • תוכן-משפטי (G11): ללא שינוי במהות.

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

  • קראתי את 00-constitution.md + 02-data-model.md + 04-analysis-writing.md לפני הכתיבה
  • השינוי לא יוצר מסלול מקביל (G2) ולא מתקן תסמין בקריאה (G1)
  • לא הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — mcp-server/src נקי
  • אין בליעה שקטה — חתימת-מסמך כוללת no_claims/failed/empty_text
  • בדקתי מול gap-audit.md — לא נגעתי ב-GAP/FU סגור; השארתי את GAP-39/40 (שער-אישור ל-legal_arguments) לטיפול נפרד
  • בדיקות עוברות — 436 passed (כולל 5 חדשות ל-_impact_diff)
  • אין data-migration ידנית — רק SCHEMA_V49 idempotent שמוחל ב-deploy

אימות

  • PYTHONPATH=src pytest -q436 passed (5 חדשות: tests/test_reanalyze_impact_diff.py).
  • בדיקת-יבוא של כל המודולים שנערכו + נוכחות הסמלים (mark_document_claims_extracted, primary_docs_not_analyzed, reanalyze_claims, SCHEMA_V49_SQL).
  • AST parse נקי לכל הקבצים.
  • לא הורצו migrations מול ה-Postgres המשותף (SCHEMA_V49 idempotent, מוחל ב-deploy).

🤖 Generated with Claude Code

## מה ולמה WS2b של עיצוב-מחדש זרימת-העבודה (תוכנית `groovy-doodling-token.md`, משימה #201). מאפשר לנתח את כתב-הערר לבד, ואז לאחד מסמך-עיקרי שנוסף מאוחר — **בלי force-delete גורף** — ולהציג ליו"ר מה השתנה. נבנה מעל #200 (PR #354, `is_primary`/`PRIMARY_DOC_TYPES`). ### מה נוסף 1. **דגל "לא-נותח" per-מסמך (SCHEMA_V49)** — `documents.claims_extracted_at TIMESTAMPTZ` + `claims_extraction_status TEXT` (`pending`/`completed`/`no_claims`/`failed`). מתעדים את *אירוע* חילוץ-הטענות, לא נגזרים מ-`doc_type`. אינדקס חלקי `idx_documents_claims_pending(case_id) WHERE is_primary AND claims_extracted_at IS NULL`. **idempotent** (`ADD COLUMN IF NOT EXISTS`). V48 שמור ל-#357. 2. **זיהוי "מסמך-עיקרי שטרם-נכלל"** — `db.primary_docs_not_analyzed` (משלב `is_primary` של V47 + `claims_extracted_at IS NULL`); `claims_extractor` חותם כל מסמך אחרי חילוץ; `_row_to_doc` חושף `claims_analyzed`. נחשף ב-`workflow_status` (שדה `primary_docs_not_analyzed` + next-step). 3. **כלי ניתוח-מחדש מאחד** — `reanalyze_claims(case_number, reanalyze_all_primary=False)`: חילוץ-מחדש **רק** למסמכים-עיקריים חדשים/לא-נותחו, איחוד עם הטענות הקיימות, צבירה-מחדש. 4. **בדיקת-השפעה ליו"ר** — `_impact_diff` מחזיר per-צד אילו טיעונים נוספו/הוסרו ואיך השתנה תמהיל-העדיפויות ("מאזן-ההמלצה"), עם דגל `changed`. ### האיחוד (merge, לא force-delete) - `store_claims` כבר מחליף רק את טענות *אותו* `source_document` → חילוץ-מחדש של מסמך בודד לא נוגע בטענות ממסמכים אחרים (האיחוד). - `aggregate_claims_to_arguments(force=True)` מחשב את הטיעונים מחדש מתוך מערך-הטענות המאוחד — מוחק רק `legal_arguments` (נגזר), **לעולם לא `claims`**. ## Invariants — הצהרה (חובה) - **נוגע / מקיים:** - **G1 (נרמול-במקור):** `claims_extracted_at` נחתם בנקודת-החילוץ; `claims_analyzed` נגזר ממנו — לא תיקון-סלחני-בקריאה. - **G2 (מקור-אמת יחיד / merge-not-fork):** `reanalyze_claims` מרחיב את מסלול `claims_extractor` + `argument_aggregator` הקיים — לא forks. האיחוד דרך `store_claims` per-source; הצבירה-מחדש היא מסלול-החישוב הקנוני (`force=True` מוחק רק נגזר). - **INV-DM1/DM3/DM4 (מודל-נתונים):** דגל-אירוע per-מסמך עם אינדקס חלקי; מקור-אמת יחיד (`claims_extracted_at`); תיעוד provenance per-מסמך. - **G10 (שער-אנושי):** בדיקת-ההשפעה **מוצגת** ליו"ר ולא מוחלת אוטומטית. - **INV-TOOL (idempotency):** `SCHEMA_V49` idempotent; ניתוח-מחדש חוזר על מסמך כבר-נותח = refresh נקי (replace per-source). - תוכן-משפטי (G11): ללא שינוי במהות. ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי את `00-constitution.md` + `02-data-model.md` + `04-analysis-writing.md` לפני הכתיבה - [x] השינוי **לא** יוצר מסלול מקביל (G2) ולא מתקן תסמין בקריאה (G1) - [x] **לא** הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — `mcp-server/src` נקי - [x] אין בליעה שקטה — חתימת-מסמך כוללת `no_claims`/`failed`/`empty_text` - [x] בדקתי מול `gap-audit.md` — לא נגעתי ב-GAP/FU סגור; השארתי את GAP-39/40 (שער-אישור ל-legal_arguments) לטיפול נפרד - [x] בדיקות עוברות — 436 passed (כולל 5 חדשות ל-`_impact_diff`) - [x] **אין data-migration ידנית** — רק SCHEMA_V49 idempotent שמוחל ב-deploy ## אימות - `PYTHONPATH=src pytest -q` → **436 passed** (5 חדשות: `tests/test_reanalyze_impact_diff.py`). - בדיקת-יבוא של כל המודולים שנערכו + נוכחות הסמלים (`mark_document_claims_extracted`, `primary_docs_not_analyzed`, `reanalyze_claims`, `SCHEMA_V49_SQL`). - AST parse נקי לכל הקבצים. - **לא** הורצו migrations מול ה-Postgres המשותף (SCHEMA_V49 idempotent, מוחל ב-deploy). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-30 12:19:44 +00:00
feat(analysis): דגל "לא-נותח" + ניתוח-מחדש מאחד + בדיקת-השפעה (#201)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 5s
Lint — undefined names / undefined-names (pull_request) Successful in 11s
dfb2ffe7ce
WS2b של עיצוב-מחדש זרימת-העבודה. מאפשר ניתוח כתב-הערר לבד ואז איחוד
מסמך-עיקרי שנוסף מאוחר, בלי force-delete גורף, עם diff ליו"ר.

- SCHEMA_V49: documents.claims_extracted_at + claims_extraction_status
  (אירוע-חילוץ per-מסמך, לא נגזר מ-doc_type), + אינדקס חלקי
  idx_documents_claims_pending. idempotent (ADD COLUMN IF NOT EXISTS).
  V48 שמור ל-#357.
- claims_extractor חותם את המסמך אחרי שמירת/אי-מציאת טענות.
- db.primary_docs_not_analyzed (is_primary V47 + claims_extracted_at IS NULL)
  + mark_document_claims_extracted; _row_to_doc חושף claims_analyzed.
- reanalyze_claims (כלי-MCP): snapshot→חילוץ-מאחד רק למסמכים חדשים/לא-נותחו
  (store_claims מחליף per-source ⇒ טענות אחרות נשמרות)→aggregate force=True
  (מסלול קנוני, מוחק רק legal_arguments)→_impact_diff before↔after ליו"ר.
- workflow_status חושף primary_docs_not_analyzed + next-step.
- ספ: 02-data-model §2ג (דגל לא-נותח), 04-analysis-writing §1.3.
- 5 בדיקות-יחידה ל-_impact_diff/_snapshot (פונקציות טהורות).

Invariants:
- G1 (נרמול-במקור): claims_extracted_at נחתם בנקודת-החילוץ, claims_analyzed
  נגזר ממנו — לא תיקון-בקריאה.
- G2 (מסלול קנוני יחיד / merge-not-fork): reanalyze מרחיב את מסלול
  claims_extractor+argument_aggregator הקיים, לא forks; האיחוד דרך
  store_claims per-source; aggregate force=True מוחק רק נגזר (legal_arguments).
- INV-DM (מודל-נתונים): דגל-אירוע per-מסמך, אינדקס חלקי, מקור-אמת יחיד.
- G10 (שער-אנושי): בדיקת-ההשפעה מוצגת ליו"ר, לא מוחלת אוטומטית.
- INV-TOOL idempotency: SCHEMA_V49 idempotent; ניתוח-מחדש חוזר על מסמך
  כבר-נותח הוא refresh נקי (store_methods replace per-source).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim force-pushed worktree-agent-abe485b6eb373903f from 1e43c12418 to dfb2ffe7ce 2026-06-30 12:19:44 +00:00 Compare
chaim merged commit 4feac756ba into main 2026-06-30 12:20:40 +00:00
chaim deleted branch worktree-agent-abe485b6eb373903f 2026-06-30 12:20:40 +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#361