fix(export): תיקוני-תבנית DOCX — חתימות לסוף, א–ד ללא נתונים, "החלטה"=כותרת (#205) #355

Merged
chaim merged 1 commits from worktree-agent-a4e6a6d273c4c3379 into main 2026-06-30 12:18:41 +00:00
Owner

מה ולמה

תיקוני-תבנית DOCX מ-WS5 של עיצוב-מחדש זרימת-העבודה (TaskMaster #205, tag legal-ai), פריטים ת1–ת3.

שורש הבעיה (ת3): הטמפלט skills/docx/decision_template.docx מכיל 3 טבלאות-דוגמה בגוף-המסמך — כותרת מוסדית (בלוק-א), הרכב-הוועדה (בלוק-ב), וטבלת-חתימות (בלוק-יב, "ניתנה פה אחד" + יו"ר/מזכירה) בסוף. _clear_body הסיר רק אלמנטי <w:p> והשאיר את כל הטבלאות. כתוצאה:

  • ת3: טבלת-החתימות שרדה במיקומה בטמפלט (למעלה, צמוד לטבלת-הכותרת = בלוק-ד / הטבלה הראשונה), וכל תוכן-ההחלטה נדחף אחריה. החתימות הופיעו בראש המסמך במקום בסוף — בדיוק התקלה שדווחה.
  • ת1: טבלאות הכותרת/ההרכב הזריקו נתוני בלוק-א–ד שלא חולצו מהפרוטוקול (פורמט-ההזנה המוכר).

שכבת-התיקון — exporter, לא הטמפלט (G1, INV-EX1): ההחלטה היא נתון-נגזר המשוחזר במלואו מ-decision_blocks; החתימות מגיעות מ-block-yod-bet שמרונדר אחרון בסדר-הבלוקים. לכן טבלאות-הדוגמה הן פיגום מיושן ולא מקור-תוכן — _clear_body מתוקן להסיר את כל גוף-המסמך (פסקאות, טבלאות, ו-bookmarks יתומים) ולהשאיר רק sectPr (הגדרות-עמוד/bidi). אין נגיעה בקובץ-הטמפלט הבינארי (נשאר משולח ב-Dockerfile + allowlist ב-.dockerignore).

ת2 — כבר תקין: block-dalet מרנדר אך-ורק את הכותרת "החלטה" (Heading 1, מתעלם לחלוטין מתוכן-ה-DB). הוסף test מפורש לנעילת ההתנהגות.

תוקן גם ב-analysis_docx_exporter._clear_body — אותו באג, סימטריה (G2).

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

  • נוגע / מקיים:
    • INV-EX1 (06-export.md) — DOCX נתון-נגזר מ-decision_blocks; הסרת טבלאות-הטמפלט מונעת זחילת תוכן-טמפלט למסמך, מחזקת את החוזה שהפלט משוחזר אך-ורק מהבלוקים.
    • G1 (תיקון-במקור) — תוקן ב-_clear_body (השורש), לא טלאי בקריאה/רינדור פר-בלוק.
    • G2 (סימטריה) — אותו תיקון בשני ה-exporters (decision + analysis), לא מסלול מקביל.
    • G11 / block-schema — block-ד = כותרת "החלטה" בלבד (Weight 0%, "מילה אחת"); block-יב = חתימות בסוף המסמך (Authentication, סדר א→יב).

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

  • קראתי את 00-constitution.md + 06-export.md + block-schema.md + dafna-decision-template/SKILL.md לפני הכתיבה
  • השינוי לא יוצר מסלול מקביל (G2) ולא מתקן תסמין בקריאה (G1) — תוקן במקור (_clear_body)
  • לא הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — שינוי בשכבת-רינדור-DOCX בלבד
  • אין בליעה שקטה של שגיאות
  • בדקתי מול gap-audit.md — אין FU/GAP ממופה ל-_clear_body/מיקום-חתימות; זה תיקון-תבנית מ-WS5
  • בדיקות עוברות — 4 regression חדשים + 27 docx-tests (test_docx_exporter_bookmarks + test_export_qa_gate + test_track_changes_e2e)
  • לא data-migration

אימות

  • _clear_body(Document(TEMPLATE_PATH)) → גוף-המסמך מכיל רק sectPr (0 טבלאות, 0 פסקאות).
  • רינדור מלא בסדר קנוני (א→יב): שורת-התוכן הראשונה = הכותרת המוסדית; החתימות ("ניתנה פה אחד" + "דפנה תמיר") בזנב, אחרי גוף-ההחלטה; אפס דליפה של טקסט טבלת-החתימות מהטמפלט ("מזכירת ועדת ערר").
  • ת2: _write_block_to_docx(block-dalet, content="נתון ישן…") → שורת-תוכן יחידה "החלטה", ללא Title-style.
  • ת1: בלוקים א–ג עם content ריק מדולגים (שמירת ה-guard content.strip()); נתוני-טמפלט כבר לא מוזרקים.
  • pytest tests/test_docx_exporter_bookmarks.py tests/test_export_qa_gate.py tests/test_track_changes_e2e.py → 27 passed.

🤖 Generated with Claude Code

## מה ולמה תיקוני-תבנית DOCX מ-WS5 של עיצוב-מחדש זרימת-העבודה (TaskMaster #205, tag `legal-ai`), פריטים ת1–ת3. **שורש הבעיה (ת3):** הטמפלט `skills/docx/decision_template.docx` מכיל **3 טבלאות-דוגמה** בגוף-המסמך — כותרת מוסדית (בלוק-א), הרכב-הוועדה (בלוק-ב), ו**טבלת-חתימות** (בלוק-יב, "ניתנה פה אחד" + יו"ר/מזכירה) בסוף. `_clear_body` הסיר **רק** אלמנטי `<w:p>` והשאיר את כל הטבלאות. כתוצאה: - **ת3:** טבלת-החתימות שרדה במיקומה בטמפלט (למעלה, צמוד לטבלת-הכותרת = בלוק-ד / הטבלה הראשונה), וכל תוכן-ההחלטה נדחף *אחריה*. החתימות הופיעו בראש המסמך במקום בסוף — בדיוק התקלה שדווחה. - **ת1:** טבלאות הכותרת/ההרכב הזריקו נתוני בלוק-א–ד שלא חולצו מהפרוטוקול (פורמט-ההזנה המוכר). **שכבת-התיקון — exporter, לא הטמפלט (G1, INV-EX1):** ההחלטה היא נתון-נגזר המשוחזר במלואו מ-`decision_blocks`; החתימות מגיעות מ-`block-yod-bet` שמרונדר אחרון בסדר-הבלוקים. לכן טבלאות-הדוגמה הן **פיגום מיושן** ולא מקור-תוכן — `_clear_body` מתוקן להסיר את כל גוף-המסמך (פסקאות, טבלאות, ו-bookmarks יתומים) ולהשאיר רק `sectPr` (הגדרות-עמוד/bidi). אין נגיעה בקובץ-הטמפלט הבינארי (נשאר משולח ב-Dockerfile + allowlist ב-.dockerignore). **ת2 — כבר תקין:** `block-dalet` מרנדר אך-ורק את הכותרת "החלטה" (Heading 1, מתעלם לחלוטין מתוכן-ה-DB). הוסף test מפורש לנעילת ההתנהגות. תוקן גם ב-`analysis_docx_exporter._clear_body` — אותו באג, סימטריה (G2). ## Invariants — הצהרה (חובה) - **נוגע / מקיים:** - **INV-EX1** (06-export.md) — DOCX נתון-נגזר מ-`decision_blocks`; הסרת טבלאות-הטמפלט מונעת זחילת תוכן-טמפלט למסמך, מחזקת את החוזה שהפלט משוחזר אך-ורק מהבלוקים. - **G1** (תיקון-במקור) — תוקן ב-`_clear_body` (השורש), לא טלאי בקריאה/רינדור פר-בלוק. - **G2** (סימטריה) — אותו תיקון בשני ה-exporters (decision + analysis), לא מסלול מקביל. - **G11 / block-schema** — block-ד = כותרת "החלטה" בלבד (Weight 0%, "מילה אחת"); block-יב = חתימות בסוף המסמך (Authentication, סדר א→יב). ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי את `00-constitution.md` + `06-export.md` + `block-schema.md` + `dafna-decision-template/SKILL.md` לפני הכתיבה - [x] השינוי **לא** יוצר מסלול מקביל (G2) ולא מתקן תסמין בקריאה (G1) — תוקן במקור (`_clear_body`) - [x] **לא** הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — שינוי בשכבת-רינדור-DOCX בלבד - [x] אין בליעה שקטה של שגיאות - [x] בדקתי מול `gap-audit.md` — אין FU/GAP ממופה ל-`_clear_body`/מיקום-חתימות; זה תיקון-תבנית מ-WS5 - [x] בדיקות עוברות — 4 regression חדשים + 27 docx-tests (`test_docx_exporter_bookmarks` + `test_export_qa_gate` + `test_track_changes_e2e`) - [x] לא data-migration ## אימות - `_clear_body(Document(TEMPLATE_PATH))` → גוף-המסמך מכיל רק `sectPr` (0 טבלאות, 0 פסקאות). - רינדור מלא בסדר קנוני (א→יב): שורת-התוכן הראשונה = הכותרת המוסדית; החתימות ("ניתנה פה אחד" + "דפנה תמיר") בזנב, אחרי גוף-ההחלטה; אפס דליפה של טקסט טבלת-החתימות מהטמפלט ("מזכירת ועדת ערר"). - ת2: `_write_block_to_docx(block-dalet, content="נתון ישן…")` → שורת-תוכן יחידה `"החלטה"`, ללא Title-style. - ת1: בלוקים א–ג עם content ריק מדולגים (שמירת ה-guard `content.strip()`); נתוני-טמפלט כבר לא מוזרקים. - `pytest tests/test_docx_exporter_bookmarks.py tests/test_export_qa_gate.py tests/test_track_changes_e2e.py` → 27 passed. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-30 11:17:59 +00:00
fix(export): clear template tables in _clear_body — חתימות לסוף, א–ד ללא נתונים (#205)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
23e088d25e
תיקוני-תבנית DOCX (WS5 ת1–ת3): הטמפלט decision_template.docx מכיל 3 טבלאות-
דוגמה (כותרת מוסדית / הרכב / חתימות). _clear_body הסיר רק <w:p> והשאיר את
הטבלאות. כתוצאה:

- ת3 (שורש): טבלת-החתימות שרדה במיקום-הטמפלט (למעלה, צמוד לטבלת-הכותרת/בלוק-ד),
  וכל תוכן-ההחלטה נדחף אחריה. החתימות הופיעו בראש המסמך במקום בסוף.
- ת1: טבלאות הכותרת/הרכב הזריקו נתוני בלוק-א–ד שלא חולצו מהפרוטוקול.

התיקון בשכבת-הרינדור (G1 — לתקן במקור, לא לשכפל סימפטום): _clear_body מסיר
כעת את כל גוף-המסמך (פסקאות, טבלאות, ו-bookmarks יתומים) ומשאיר רק sectPr.
ההחלטה משוחזרת כולה מ-decision_blocks (INV-EX1) — החתימות מגיעות מ-block-yod-bet
שמרונדר אחרון בסדר-הבלוקים, ולכן טבלאות-הדוגמה הן פיגום מיושן שצריך להימחק.

ת2 כבר תקין: block-dalet מרנדר רק את הכותרת "החלטה" (Heading 1, מתעלם מתוכן-
ה-DB) — הוסף test מפורש לנעילה.

תוקן גם ב-analysis_docx_exporter._clear_body (אותו באג, סימטריה G2).

Tests: 4 regression חדשים + 27 docx-tests עוברים.

Invariants: INV-EX1 (DOCX נתון-נגזר מ-decision_blocks, ללא דליפת תוכן-טמפלט) ·
G1 (תיקון-במקור) · G2 (סימטריה בין שני ה-exporters) · G11/block-schema
(block-ד = כותרת בלבד, block-יב = חתימות בסוף).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 99574f0eba into main 2026-06-30 12:18:41 +00:00
chaim deleted branch worktree-agent-a4e6a6d273c4c3379 2026-06-30 12:18:41 +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#355