fix(research): עמדת ועדת הערר בטענות-סף נשמרה אך לא נקראה בחזרה #422

Merged
chaim merged 1 commits from worktree-chair-position-bullet-parse into main 2026-08-02 14:05:37 +00:00
Owner

מה ולמה

בתיק 1069-04-26 עמדת ועדת הערר בטענת-סף 1 "נשמרה" (200 + ✓ נשמר) ונעלמה ברענון, בעוד באותו דף בסוגיה 5 היא נשמרה כרגיל.

סיבת השורש: הקורא והכותב של analysis-and-research.md לא הסכימו על מהו שדה.
FIELD_LABEL_RE דרש **כותרת:** בתחילת שורה, בעוד הכותב התאים את התווית בכל מקום בשורה. האנליסט כותב טענות-סף כרשימה (- **עמדת ועדת הערר:**) ואת הסוגיות בתחילת שורה — ולכן הכתיבה הצליחה והקריאה לא ראתה את השדה כלל. באותן טענות-סף גם יתר השדות (טענה/תשובה/שאלה משפטית) היו בלתי-נראים ב-UI.

הטקסט שחיים הקליד עדיין קיים פיזית בקובץ (1069-04-26 שורה 49) — התיקון מחזיר אותו להיקרא, בלי מיגרציה.

היקף מעבר ל-UI: אותו chair_position מוזן ל-extract_chair_directionsget_chair_directionslegal-writer (קיבל direction: "" ומוני filled/empty דיווחו בחסר), ול-analysis_docx_exporter (העמדה הושמטה מה-DOCX והוחלפה ב-placeholder).

מה תוקן:

  • הקורא מקבל תווית עם סמן-רשימה אופציונלי, כמו הכותב.
  • הכותב עובר להשתמש באותה הגדרת-גבולות של הקורא (_chair_field_span) במקום regex משלו. ה-[^*]*? הישן גם קטע עמדה שהכילה **הדגשה** או ---. התווית, סמן-הרשימה ו---- הסוגר נשמרים כפי שהם.
  • תווית מעוטרת (עמדת ועדת הערר (הכוונת יו"ר 24.6) — קיימת ב-8125-09-24, 8137-11-24) מזוהה בהתאמת-רישא; קודם הכותב הוסיף בלוק כפול במקום לעדכן.
  • שדה כפול באותו H3 (### סוגיות 4–6 ב-1033-02-25): הקורא לקח את האחרון והכותב את הראשון — כלומר עריכה נקראה בחזרה משדה אחר. שניהם לוקחים עכשיו את הראשון.
  • read-after-write: שמירה שהפרסר לא קורא בחזרה מדווחת כשגיאה במקום "✓ נשמר" ירוק, וה-UI שומר בקאש את מה שהשרת קרא — לא את מה ששלח. זה מה שהסתיר את הבאג עד עכשיו.
  • תבנית האנליסט (§5 טענות סף) קיבלה שלד מפורש, זהה לזה של הסוגיות — קודם היא פירטה פורמט רק לסוגיות, ולכן הסוכן אילתר רשימה בטענות-הסף.

Invariants — הצהרה

  • נוגע / מקיים:
    • G2 (מקור-אמת יחיד) — הקורא והכותב חלקו שתי הגדרות של "היכן מתחיל ומסתיים שדה" שהתפצלו. _chair_field_span מבטל את המסלול המקביל: הכותב נשען על FIELD_LABEL_RE של הקורא, כך שמה שנכתב הוא בהכרח מה שנקרא.
    • G1 (נרמול-במקור, לא תיקון-בקריאה) — התבנית של האנליסט מתוקנת כך שקבצים חדשים ייווצרו בפורמט אחיד. הסובלנות בקורא נדרשת בנוסף, כי 9 קבצים קיימים כבר כתובים בפורמט החורג.
    • כלל-הנדסה §6 (אין בליעה שקטה) — כתיבה שלא ניתן לקרוא בחזרה מחזירה שגיאה במקום saved: true.
    • INV-UI9 — לא שונה; חותמות-הזמן נשארות ב-IL_TZ.
  • לא נגעתי ב-Paperclip (G12) ולא ב-DB. אין מיגרציית-נתונים.

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

  • קראתי את docs/spec/00-constitution.md + ספ-התחום (04-analysis-writing.md §"עמדת ועדת הערר", 06-export.md)
  • השינוי לא יוצר מסלול מקביל (G2) — להפך, מבטל אחד
  • לא הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12)
  • אין בליעה שקטה של שגיאות — נוסף read-after-write
  • בדקתי מול gap-audit.md — GAP-47-חלק-ב (העברת הנחיות-יו"ר ל-DB) עדיין פתוח ולא נפתר-מחדש כאן; זה תיקון בתוך המסלול הקיים מבוסס-הקובץ
  • בדיקות עוברות
  • לא data-migration — הקבצים הקיימים נקראים כמו שהם

בדיקות

mcp-server/tests/test_research_md_chair_position.py — 34 בדיקות, כולל round-trip על כל קובץ ניתוח בקורפוס.

מצב round-trips נכשלו
לפני התיקון 141 24 (1017, 1019, 1027, 1033, 1043, 1069, 8124)
אחרי התיקון 141 0

14 מהבדיקות החדשות נכשלות על הקוד שלפני התיקון.

  • pytest mcp-server/tests/ — 507 passed
  • npx tsc --noEmit — נקי
  • npm run lint — 0 errors (26 warnings קיימות מראש)

אחרי המיזוג

  • web/ ו-mcp-server/ שניהם מייבאים את research_md — נדרש deploy ל-Coolify כדי שה-UI יקבל את התיקון.
  • mcp-server דורש reload-סשן כדי ש-get_chair_directions יחזיר את העמדות המשוחזרות.
  • שינוי .claude/agents/legal-analyst.md דורש scripts/sync_agents_across_companies.py --apply.

🤖 Generated with Claude Code

## מה ולמה בתיק 1069-04-26 עמדת ועדת הערר בטענת-סף 1 "נשמרה" (200 + ✓ נשמר) ונעלמה ברענון, בעוד באותו דף בסוגיה 5 היא נשמרה כרגיל. **סיבת השורש:** הקורא והכותב של `analysis-and-research.md` לא הסכימו על מהו שדה. `FIELD_LABEL_RE` דרש `**כותרת:**` **בתחילת שורה**, בעוד הכותב התאים את התווית **בכל מקום** בשורה. האנליסט כותב טענות-סף כרשימה (`- **עמדת ועדת הערר:**`) ואת הסוגיות בתחילת שורה — ולכן הכתיבה הצליחה והקריאה לא ראתה את השדה כלל. באותן טענות-סף גם יתר השדות (טענה/תשובה/שאלה משפטית) היו בלתי-נראים ב-UI. הטקסט שחיים הקליד עדיין קיים פיזית בקובץ (`1069-04-26` שורה 49) — התיקון מחזיר אותו להיקרא, בלי מיגרציה. **היקף מעבר ל-UI:** אותו `chair_position` מוזן ל-`extract_chair_directions` → `get_chair_directions` → `legal-writer` (קיבל `direction: ""` ומוני filled/empty דיווחו בחסר), ול-`analysis_docx_exporter` (העמדה הושמטה מה-DOCX והוחלפה ב-placeholder). **מה תוקן:** - הקורא מקבל תווית עם סמן-רשימה אופציונלי, כמו הכותב. - הכותב עובר להשתמש באותה הגדרת-גבולות של הקורא (`_chair_field_span`) במקום regex משלו. ה-`[^*]*?` הישן גם קטע עמדה שהכילה `**הדגשה**` או `---`. התווית, סמן-הרשימה ו-`---` הסוגר נשמרים כפי שהם. - תווית מעוטרת (`עמדת ועדת הערר (הכוונת יו"ר 24.6)` — קיימת ב-8125-09-24, 8137-11-24) מזוהה בהתאמת-רישא; קודם הכותב הוסיף בלוק **כפול** במקום לעדכן. - שדה כפול באותו H3 (`### סוגיות 4–6` ב-1033-02-25): הקורא לקח את האחרון והכותב את הראשון — כלומר עריכה נקראה בחזרה משדה אחר. שניהם לוקחים עכשיו את הראשון. - **read-after-write:** שמירה שהפרסר לא קורא בחזרה מדווחת כשגיאה במקום "✓ נשמר" ירוק, וה-UI שומר בקאש את מה שהשרת קרא — לא את מה ששלח. זה מה שהסתיר את הבאג עד עכשיו. - תבנית האנליסט (§5 טענות סף) קיבלה שלד מפורש, זהה לזה של הסוגיות — קודם היא פירטה פורמט רק לסוגיות, ולכן הסוכן אילתר רשימה בטענות-הסף. ## Invariants — הצהרה - **נוגע / מקיים:** - **G2 (מקור-אמת יחיד)** — הקורא והכותב חלקו *שתי* הגדרות של "היכן מתחיל ומסתיים שדה" שהתפצלו. `_chair_field_span` מבטל את המסלול המקביל: הכותב נשען על `FIELD_LABEL_RE` של הקורא, כך שמה שנכתב הוא בהכרח מה שנקרא. - **G1 (נרמול-במקור, לא תיקון-בקריאה)** — התבנית של האנליסט מתוקנת כך שקבצים חדשים ייווצרו בפורמט אחיד. הסובלנות בקורא נדרשת בנוסף, כי 9 קבצים קיימים כבר כתובים בפורמט החורג. - **כלל-הנדסה §6 (אין בליעה שקטה)** — כתיבה שלא ניתן לקרוא בחזרה מחזירה שגיאה במקום `saved: true`. - **INV-UI9** — לא שונה; חותמות-הזמן נשארות ב-`IL_TZ`. - לא נגעתי ב-Paperclip (G12) ולא ב-DB. אין מיגרציית-נתונים. ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי את `docs/spec/00-constitution.md` + ספ-התחום (`04-analysis-writing.md` §"עמדת ועדת הערר", `06-export.md`) - [x] השינוי **לא** יוצר מסלול מקביל (G2) — להפך, מבטל אחד - [x] **לא** הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) - [x] אין בליעה שקטה של שגיאות — נוסף read-after-write - [x] בדקתי מול `gap-audit.md` — GAP-47-חלק-ב (העברת הנחיות-יו"ר ל-DB) עדיין פתוח ולא נפתר-מחדש כאן; זה תיקון בתוך המסלול הקיים מבוסס-הקובץ - [x] בדיקות עוברות - [x] לא data-migration — הקבצים הקיימים נקראים כמו שהם ## בדיקות `mcp-server/tests/test_research_md_chair_position.py` — 34 בדיקות, כולל round-trip על **כל** קובץ ניתוח בקורפוס. | מצב | round-trips | נכשלו | |-----|------------|-------| | לפני התיקון | 141 | **24** (1017, 1019, 1027, 1033, 1043, 1069, 8124) | | אחרי התיקון | 141 | **0** | 14 מהבדיקות החדשות נכשלות על הקוד שלפני התיקון. - `pytest mcp-server/tests/` — 507 passed - `npx tsc --noEmit` — נקי - `npm run lint` — 0 errors (26 warnings קיימות מראש) ## אחרי המיזוג - `web/` ו-`mcp-server/` שניהם מייבאים את `research_md` — נדרש deploy ל-Coolify כדי שה-UI יקבל את התיקון. - `mcp-server` דורש reload-סשן כדי ש-`get_chair_directions` יחזיר את העמדות המשוחזרות. - שינוי `.claude/agents/legal-analyst.md` דורש `scripts/sync_agents_across_companies.py --apply`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-08-02 14:05:31 +00:00
fix(research): עמדת ועדת הערר בטענות-סף נשמרה אך לא נקראה בחזרה
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 37s
Lint — undefined names / undefined-names (pull_request) Successful in 11s
fbdbc64366
הקורא והכותב של analysis-and-research.md לא הסכימו על מהו שדה:
FIELD_LABEL_RE דרש `**כותרת:**` בתחילת שורה, בעוד הכותב התאים את
התווית בכל מקום בשורה. האנליסט כותב טענות-סף כרשימה
(`- **עמדת ועדת הערר:**`) ואת הסוגיות בתחילת שורה — ולכן שמירה
בטענת-סף הצליחה (200 + "✓ נשמר"), אבל הקורא לא ראה את השדה כלל
והעמדה נעלמה ברענון. גם יתר שדות הטענה (טענה/תשובה/שאלה משפטית)
היו בלתי-נראים באותן טענות.

- הקורא מקבל תווית עם סמן-רשימה אופציונלי, כמו הכותב.
- הכותב עובר להשתמש באותה הגדרת-גבולות של הקורא (_chair_field_span)
  במקום regex משלו — `[^*]*?` הישן גם קטע עמדה שהכילה `**הדגשה**`.
  התווית והסמן נשמרים כפי שהם, וכך גם `---` הסוגר.
- תווית מעוטרת (`עמדת ועדת הערר (הכוונת יו"ר 24.6)`) מזוהה בהתאמת-רישא;
  קודם הכותב הוסיף בלוק כפול במקום לעדכן.
- שדה כפול באותו H3 (`### סוגיות 4–6`): הקורא לקח את האחרון והכותב את
  הראשון. שניהם לוקחים עכשיו את הראשון.
- read-after-write: שמירה שהפרסר לא קורא בחזרה מדווחת כשגיאה במקום
  "נשמר" ירוק, וה-UI שומר בקאש את מה שהשרת קרא — לא את מה ששלח.
- תבנית האנליסט (§5) קיבלה שלד מפורש לטענות-סף, זהה לזה של הסוגיות,
  כדי שקבצים חדשים לא ייווצרו במבנה החורג (נרמול-במקור, G1).

הרצת round-trip על כל הקורפוס: 24 מתוך 141 תת-סעיפים נכשלו לפני
התיקון (1017, 1019, 1027, 1033, 1043, 1069, 8124) — 0 אחריו. העמדות
שכבר נשמרו בקבצים הקיימים חוזרות להיקרא בלי מיגרציה.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
chaim merged commit bf9559c61a into main 2026-08-02 14:05:37 +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#422