feat(mcp): FU-14 GAP-51 — איחוד אוצר-המילים של תוצאת-תיק (set_outcome SSoT) #65

Merged
chaim merged 1 commits from fix/fu14-gap51-outcome-ssot-impl into main 2026-06-06 15:35:36 +00:00
Owner

מה ולמה

GAP-51 (FU-14). תוצאת-תיק הייתה מקודדת ב-3 אוצרות-מילים לא-מתואמות → טופס ה-UI שלח rejection ש-set_outcome דחה (valid=rejected/accepted/partial). הכרעת-יו"ר: קנוני = 3 תוצאות (rejection/partial_acceptance/full_acceptance); betterment_levy הוא practice_area, לא תוצאה.

Invariants — הצהרה

  • GAP-51 / INV-TOOL2 + X6-INV-UI1 (G2) — SSoT יחיד ל-enum-תוצאה.
  • עקרון-יו"ר חדש: ערכים קנוניים אנגלית ב-DB/קוד, תווית עברית ב-UI — מיושם ל-outcome דרך OUTCOME_LABELS_HE.

מה שונה

  • lessons.pyVALID_OUTCOMES=3; OUTCOME_LABELS_HE (SSoT תצוגה, מחליף 3 מפות מוטמעות); canonical_outcome() + LEGACY_OUTCOME_MAP (rejected→rejection…); PRACTICE_AREA_OVERRIDES["betterment_levy"] מרכז golden_ratios/opening/summary/discussion/template; accessors מקבלים practice_area ומחילים override.
  • block_writer.pySTRUCTURE_GUIDANCE קנוני; תווית מ-SSoT; override betterment לפי case.practice_area.
  • workflow.set_outcome — קנוני 3 + מיפוי-legacy סלחני; תווית מ-SSoT.
  • drafting.py — טבלת יחסי-זהב + get_decision_template מודעי-practice_area (template/ratios של betterment כ-override).
  • web-ui case.tsexpectedOutcomes ללא betterment_levy (נבחר כ-practice_area).
  • server.py — docstrings קנוניים.

מיגרציית-נתונים (בוצעה)

scripts/migrate_gap51_outcomes.py9 שורות נורמלו (decisions.outcome + cases.expected_outcome: rejected→rejection / accepted→full_acceptance / partial→partial_acceptance). גיבוי: data/audit/gap51-outcome-backup-20260606T153257Z.csv. betterment_levy לא קיים בנתונים — לא מופה. הקוד canonicalize בקריאה ⇒ backward-compatible גם ללא מיגרציה.

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

  • קראתי 00-constitution.md + X9 + lessons/block_writer לפני הכתיבה
  • G2 — SSoT יחיד (VALID_OUTCOMES + OUTCOME_LABELS_HE), הוסרו 3 מפות כפולות
  • אין בליעה שקטה; canonical_outcome סלחני אך מפורש
  • data-migration — דטרמיניסטי, גיבוי + טרנזקציה, נוגע רק ב-cases/decisions (לא בטבלאות החילוץ)
  • py_compile (5) + בדיקות-יחידה offline (override/legacy/labels) + אימות-DB אחרי מיגרציה

אימות

- py_compile: lessons/block_writer/workflow/drafting/server → ✅
- offline: VALID_OUTCOMES=3 · canonical_outcome(rejected)=rejection ·
  get_lessons_for_outcome("rejection","betterment_levy") ratios=6-18% (override) → ✅
- DB אחרי מיגרציה: decisions/cases.outcome ⊆ {rejection,partial_acceptance,full_acceptance,''} → ✅

⚠️ activation: mcp-server/ נכנס לתוקף ב-restart מקומי (לא בזמן החילוץ). web-ui נבנה ב-Docker; case.ts הוא שינוי const טריוויאלי (lint/build ב-CI).

נותר ב-FU-14: GAP-48 (envelope), GAP-49/50 (מיזוג+rename כלים — שובר). נגזרת נפרדת: שינוי-שם practice_area (rishuy_uvniya→building_permit) + עקרון "אנגלית-ב-DB/עברית-ב-UI" כ-invariant ב-X6.

🤖 Generated with Claude Code

## מה ולמה GAP-51 (FU-14). תוצאת-תיק הייתה מקודדת ב-3 אוצרות-מילים לא-מתואמות → טופס ה-UI שלח `rejection` ש-`set_outcome` **דחה** (`valid=rejected/accepted/partial`). הכרעת-יו"ר: **קנוני = 3 תוצאות** (`rejection/partial_acceptance/full_acceptance`); `betterment_levy` הוא **practice_area**, לא תוצאה. ## Invariants — הצהרה - **GAP-51 / INV-TOOL2 + X6-INV-UI1 (G2)** — SSoT יחיד ל-enum-תוצאה. - **עקרון-יו"ר חדש:** ערכים קנוניים **אנגלית ב-DB/קוד**, **תווית עברית ב-UI** — מיושם ל-outcome דרך `OUTCOME_LABELS_HE`. ## מה שונה - **lessons.py** — `VALID_OUTCOMES`=3; `OUTCOME_LABELS_HE` (SSoT תצוגה, מחליף 3 מפות מוטמעות); `canonical_outcome()` + `LEGACY_OUTCOME_MAP` (rejected→rejection…); `PRACTICE_AREA_OVERRIDES["betterment_levy"]` מרכז golden_ratios/opening/summary/discussion/template; accessors מקבלים `practice_area` ומחילים override. - **block_writer.py** — `STRUCTURE_GUIDANCE` קנוני; תווית מ-SSoT; override betterment לפי `case.practice_area`. - **workflow.set_outcome** — קנוני 3 + מיפוי-legacy סלחני; תווית מ-SSoT. - **drafting.py** — טבלת יחסי-זהב + `get_decision_template` מודעי-practice_area (template/ratios של betterment כ-override). - **web-ui `case.ts`** — `expectedOutcomes` ללא `betterment_levy` (נבחר כ-practice_area). - **server.py** — docstrings קנוניים. ## מיגרציית-נתונים (בוצעה) `scripts/migrate_gap51_outcomes.py` — **9 שורות** נורמלו (`decisions.outcome` + `cases.expected_outcome`: rejected→rejection / accepted→full_acceptance / partial→partial_acceptance). גיבוי: `data/audit/gap51-outcome-backup-20260606T153257Z.csv`. **`betterment_levy` לא קיים בנתונים** — לא מופה. הקוד canonicalize בקריאה ⇒ backward-compatible גם ללא מיגרציה. ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי `00-constitution.md` + `X9` + lessons/block_writer לפני הכתיבה - [x] G2 — SSoT יחיד (VALID_OUTCOMES + OUTCOME_LABELS_HE), הוסרו 3 מפות כפולות - [x] אין בליעה שקטה; canonical_outcome סלחני אך מפורש - [x] **data-migration** — דטרמיניסטי, גיבוי + טרנזקציה, נוגע רק ב-cases/decisions (לא בטבלאות החילוץ) - [x] py_compile (5) + בדיקות-יחידה offline (override/legacy/labels) + אימות-DB אחרי מיגרציה ## אימות ``` - py_compile: lessons/block_writer/workflow/drafting/server → ✅ - offline: VALID_OUTCOMES=3 · canonical_outcome(rejected)=rejection · get_lessons_for_outcome("rejection","betterment_levy") ratios=6-18% (override) → ✅ - DB אחרי מיגרציה: decisions/cases.outcome ⊆ {rejection,partial_acceptance,full_acceptance,''} → ✅ ``` > ⚠️ activation: `mcp-server/` נכנס לתוקף ב-restart מקומי (לא בזמן החילוץ). web-ui נבנה ב-Docker; `case.ts` הוא שינוי const טריוויאלי (lint/build ב-CI). > נותר ב-FU-14: GAP-48 (envelope), GAP-49/50 (מיזוג+rename כלים — שובר). נגזרת נפרדת: שינוי-שם practice_area (`rishuy_uvniya→building_permit`) + עקרון "אנגלית-ב-DB/עברית-ב-UI" כ-invariant ב-X6. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-06 15:35:31 +00:00
הכרעת-יו"ר: קנוני = 3 תוצאות אמיתיות (rejection/partial_acceptance/full_acceptance);
betterment_levy יוצא מהיותו "תוצאה" ועובר ל-override לפי practice_area.
+ עקרון "אנגלית-ב-DB, עברית-ב-UI": מפת-תוויות SSoT אחת.

lessons.py:
- VALID_OUTCOMES = 3 (הוסר betterment_levy).
- OUTCOME_LABELS_HE (SSoT לתצוגה) + LEGACY_OUTCOME_MAP + canonical_outcome().
- PRACTICE_AREA_OVERRIDES["betterment_levy"] מרכז את כל ה-guidance שהיה מפתוח כ-outcome
  (golden_ratios/opening/summary/discussion/template).
- get_lessons_for_outcome(outcome, practice_area) + format_ratios_comment(..., practice_area)
  מחילים override + מנרמלים legacy.

block_writer.py: STRUCTURE_GUIDANCE קנוני + תווית מ-OUTCOME_LABELS_HE + override betterment.
workflow.set_outcome: קנוני 3 + מיפוי-legacy סלחני; תווית מ-SSoT.
drafting.py: טבלת יחסי-זהב + get_decision_template מודעי-practice_area (override).
web-ui case.ts: הסרת betterment_levy מ-expectedOutcomes (הוא practice_area).
server.py: docstrings קנוניים.

מיגרציה: migrate_gap51_outcomes.py — 9 שורות נורמלו (rejected→rejection וכו'),
גיבוי ב-data/audit/. הקוד canonicalize בקריאה ⇒ backward-compatible גם בלי מיגרציה.

אומת: py_compile (5 קבצים) + בדיקות-יחידה offline (override/legacy/labels) + אימות-DB.
עודכנו X9 §3 + gap-audit (GAP-51 ).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 4977ab8d9a into main 2026-06-06 15:35:36 +00:00
chaim deleted branch fix/fu14-gap51-outcome-ssot-impl 2026-06-06 15:35:36 +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#65