fix(writer): כלל-הסגנון בסוף הפרומפט — חותך אנטי-דפוסים ב-72–93% #421

Merged
chaim merged 2 commits from worktree-anti-pattern-directive-position into main 2026-07-28 11:53:58 +00:00
Owner

מה ולמה

הכלל לא היה חסר — הוא היה במקום שבו הוא לא תופס.

lessons.ANTI_PATTERNS (הרשימה שמולה style_distance מודד) כבר הוזרקה לפרומפט-הכותב. אבל היא יושבת בתו ~46,781 מתוך 46,950 של style_context, שהוא עצמו מקטע אחד מתוך ~12 בפרומפט המורכב. התוצאה: הלולאה מזהה את ההפרות, הכותב ממשיך לייצר אותן, ודפנה מוחקת אותן ידנית.

A/B מדוד מול הסופיים החתומים (9 תיקים, 60 ייצורים, 2026-07-28) בודד את התיקון: אותו כלל בדיוק, בסוף הפרומפט, חותך anti_pattern_total ב-72–93%.

בלוק מודל anti לפני anti אחרי distance לפני → אחרי
ו (רקע) opus-4-8 1.75 0.12 0.459 → 0.402
ו (רקע) opus-5 2.25 0.62 0.452 → 0.412
ז (טענות) opus-4-8 4.57 0.43 0.475 → 0.338
ז (טענות) opus-5 4.43 0.43 0.490 → 0.358

לשם קנה-מידה: ההפרש שנמדד בין המודלים באותו מדד היה ≤0.5 ולא עקבי. הכיול נותן 1.6–4.1. מיקום הכלל שווה פי-3 מבחירת-המודל.

מה השתנה

  1. lessons.anti_pattern_directive() — רינדור שני של אותה רשימה קנונית. מקור אחד, שתי תצוגות — לא שני כללים שיכולים להיפרד.
  2. מתווסף אחרון בשני מסלולי-הכתיבה: write_block (בתהליך) ו-get_block_context (סוכן legal-writer). המסלול השני התגלה תוך כדי — אילו התיקון הוחל רק על הראשון, הבלוקים שהסוכן כותב היו ממשיכים להפר ושני הכותבים היו נפרדים בסגנון.
  3. תיקון בליעה-שקטה: הרשימה הקנונית רונדרה בתוך לולאת-ה-overrides, אחרי קריאות-DB. כשל ב-golden_ratios (הקטגוריה הראשונה) הפיל את הלולאה לפני שהגיעה לאנטי-דפוסים והשמיט את אינווריאנטי-הסגנון כליל — עם logger.warning גנרי בלבד. תקלת-overrides לא יכולה יותר "ללמד מחדש" את הכותב סגנון שגוי.

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

  • נוגע / מקיים:
    • G11 (תוכן משפטי — סגנון דפנה): אוכף את אינווריאנט הנרטיב-הרציף בפועל, לא רק בהצהרה.
    • G2 (מקור-אמת יחיד): אין רשימת-כללים חדשה — רינדור מ-lessons.ANTI_PATTERNS, אותו מקור ש-style_distance מודד מולו. שני מסלולי-הכתיבה יושרו כדי שלא ייפרדו.
    • כלל-הנדסה §6 (אין בליעה שקטה): כשל-DB בקריאת overrides אינו משמיט עוד את אינווריאנטי-הסגנון.

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

  • קראתי את docs/spec/00-constitution.md + ספ-התחום הרלוונטי
  • לא מסלול מקביל (G2) ולא תיקון-תסמין-בקריאה (G1) — התיקון במקור, בהרכבת הפרומפט
  • אין מגע-Paperclip מחוץ ל-Platform Port (G12)
  • אין בליעה שקטה — נהפוך הוא, מתקן אחת
  • מול gap-audit.md — לא נוגע ב-GAP/FU ממופה
  • בדיקות עוברות
  • לא data-migration

אימות

  • pytest mcp-server/tests/473 passed (470 קיימות + 3 חדשות).
  • בדיקות חדשות ב-test_anti_pattern_directive.py:
    1. ההוראה מרנדרת את כל האנטי-דפוסים הקנוניים (מונע דריפט מהרשימה שמולה מודדים).
    2. שני מסלולי-הכתיבה מוסיפים אותה (מונע פיצול בין הכותב-בתהליך לסוכן).
    3. הרשימה שורדת כשל-DB ב-overrides (רגרסיה ל-§6).
  • אימות מבני: שום prompt += לא מתרחש אחרי ההוראה — היא באמת אחרונה.

מקור-הראיה

הדוחות המלאים ב-data/eval/effort-calibration-20260728T1047*/1108*/1210*/1233*אך הם gitignored (.gitignore:23), כלומר קיימים רק ב-worktree. הטבלה למעלה היא התמצית העמידה.

תלות

ה-harness שהפיק את המדידה הוא PR #420 (ממד model×prompt). ה-PR הזה עומד בפני עצמו ואינו תלוי בו לוגית.

## מה ולמה **הכלל לא היה חסר — הוא היה במקום שבו הוא לא תופס.** `lessons.ANTI_PATTERNS` (הרשימה שמולה `style_distance` מודד) כבר הוזרקה לפרומפט-הכותב. אבל היא יושבת בתו **~46,781 מתוך 46,950** של `style_context`, שהוא עצמו מקטע אחד מתוך ~12 בפרומפט המורכב. התוצאה: הלולאה מזהה את ההפרות, הכותב ממשיך לייצר אותן, ודפנה מוחקת אותן ידנית. A/B מדוד מול הסופיים החתומים (9 תיקים, 60 ייצורים, 2026-07-28) בודד את התיקון: **אותו כלל בדיוק, בסוף הפרומפט**, חותך `anti_pattern_total` ב-72–93%. | בלוק | מודל | anti לפני | anti אחרי | distance לפני → אחרי | |---|---|---|---|---| | ו (רקע) | opus-4-8 | 1.75 | **0.12** | 0.459 → 0.402 | | ו (רקע) | opus-5 | 2.25 | **0.62** | 0.452 → 0.412 | | ז (טענות) | opus-4-8 | 4.57 | **0.43** | 0.475 → 0.338 | | ז (טענות) | opus-5 | 4.43 | **0.43** | 0.490 → 0.358 | לשם קנה-מידה: ההפרש שנמדד **בין המודלים** באותו מדד היה ≤0.5 ולא עקבי. הכיול נותן 1.6–4.1. **מיקום הכלל שווה פי-3 מבחירת-המודל.** ### מה השתנה 1. `lessons.anti_pattern_directive()` — רינדור שני של אותה רשימה קנונית. מקור אחד, שתי תצוגות — לא שני כללים שיכולים להיפרד. 2. מתווסף **אחרון** בשני מסלולי-הכתיבה: `write_block` (בתהליך) ו-`get_block_context` (סוכן `legal-writer`). המסלול השני התגלה תוך כדי — אילו התיקון הוחל רק על הראשון, הבלוקים שהסוכן כותב היו ממשיכים להפר ושני הכותבים היו נפרדים בסגנון. 3. **תיקון בליעה-שקטה:** הרשימה הקנונית רונדרה **בתוך** לולאת-ה-overrides, אחרי קריאות-DB. כשל ב-`golden_ratios` (הקטגוריה הראשונה) הפיל את הלולאה **לפני** שהגיעה לאנטי-דפוסים והשמיט את אינווריאנטי-הסגנון כליל — עם `logger.warning` גנרי בלבד. תקלת-overrides לא יכולה יותר "ללמד מחדש" את הכותב סגנון שגוי. ## Invariants — הצהרה (חובה) - **נוגע / מקיים:** - **G11 (תוכן משפטי — סגנון דפנה):** אוכף את אינווריאנט הנרטיב-הרציף בפועל, לא רק בהצהרה. - **G2 (מקור-אמת יחיד):** אין רשימת-כללים חדשה — רינדור מ-`lessons.ANTI_PATTERNS`, אותו מקור ש-`style_distance` מודד מולו. שני מסלולי-הכתיבה יושרו כדי שלא ייפרדו. - **כלל-הנדסה §6 (אין בליעה שקטה):** כשל-DB בקריאת overrides אינו משמיט עוד את אינווריאנטי-הסגנון. ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי את `docs/spec/00-constitution.md` + ספ-התחום הרלוונטי - [x] לא מסלול מקביל (G2) ולא תיקון-תסמין-בקריאה (G1) — התיקון במקור, בהרכבת הפרומפט - [x] אין מגע-Paperclip מחוץ ל-Platform Port (G12) - [x] אין בליעה שקטה — נהפוך הוא, מתקן אחת - [x] מול `gap-audit.md` — לא נוגע ב-GAP/FU ממופה - [x] בדיקות עוברות - [x] לא data-migration ## אימות - `pytest mcp-server/tests/` — **473 passed** (470 קיימות + 3 חדשות). - בדיקות חדשות ב-`test_anti_pattern_directive.py`: 1. ההוראה מרנדרת את **כל** האנטי-דפוסים הקנוניים (מונע דריפט מהרשימה שמולה מודדים). 2. **שני** מסלולי-הכתיבה מוסיפים אותה (מונע פיצול בין הכותב-בתהליך לסוכן). 3. הרשימה שורדת כשל-DB ב-overrides (רגרסיה ל-§6). - אימות מבני: שום `prompt +=` לא מתרחש אחרי ההוראה — היא באמת אחרונה. ## מקור-הראיה הדוחות המלאים ב-`data/eval/effort-calibration-20260728T1047*/1108*/1210*/1233*` — **אך הם `gitignored`** (`.gitignore:23`), כלומר קיימים רק ב-worktree. הטבלה למעלה היא התמצית העמידה. ## תלות ה-harness שהפיק את המדידה הוא PR #420 (ממד model×prompt). ה-PR הזה עומד בפני עצמו ואינו תלוי בו לוגית.
chaim added 1 commit 2026-07-28 11:15:46 +00:00
fix(writer): כלל-הסגנון בסוף הפרומפט — הוא היה שם, במקום שבו הוא לא תופס
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 35s
Lint — undefined names / undefined-names (pull_request) Successful in 11s
42ea1a7c58
הרשימה הקנונית של lessons.ANTI_PATTERNS כבר הוזרקה לכותב, אבל בתו ~46,781
מתוך 46,950 של style_context — שהוא עצמו מקטע אחד מתוך ~12 בפרומפט. הטיוטות
המשיכו לפלוט בדיוק את מה שהיא אוסרת.

A/B מדוד מול הסופיים החתומים (9 תיקים, 60 ייצורים, 2026-07-28) הראה שאותו
כלל, בסוף הפרומפט, חותך anti_pattern_total ב-72–93%:

  block-vav   opus-4-8 1.75→0.12 · opus-5 2.25→0.62
  block-zayin opus-4-8 4.57→0.43 · opus-5 4.43→0.43

וב-distance: −12%/−29% (4-8), −9%/−27% (5). זה שיפור גדול פי-3 מכל הבדל
שנמדד בין המודלים עצמם.

- `lessons.anti_pattern_directive()` — רינדור שני של אותה רשימה קנונית
  (מקור אחד, שתי תצוגות — לא שני כללים).
- מתווסף **אחרון** בשני מסלולי-הכתיבה: `write_block` (בתהליך) ו-
  `get_block_context` (סוכן legal-writer). אילו הוחל רק באחד, שני הכותבים
  היו נפרדים בסגנון (G2).
- **תיקון בליעה-שקטה (§6):** הרשימה הקנונית רונדרה בתוך לולאת-ה-overrides,
  כך שכשל-DB בקטגוריה מוקדמת (golden_ratios) הפיל את הלולאה והשמיט את
  אינווריאנטי-הסגנון כליל — עם אזהרה גנרית בלבד. עכשיו היא מרונדרת ללא
  תנאי, לפני כל קריאת-DB; הערות-היו"ר מתווספות מעליה.

invariants: G11 (תוכן משפטי — סגנון דפנה) · G2 (מקור-אמת יחיד לכלל, ושני
מסלולי-הכתיבה מיושרים) · §6 (אין בליעה שקטה).

בדיקות: 473 passed (3 חדשות — רינדור מלא, שני המסלולים, שרידות לכשל-DB).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
chaim added 1 commit 2026-07-28 11:53:50 +00:00
Merge remote-tracking branch 'origin/main' into worktree-anti-pattern-directive-position
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 11s
2ebaa82f85
chaim merged commit 08419e4434 into main 2026-07-28 11:53:58 +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#421