feat(drafting): טיוטת-ביניים דטרמיניסטית — Opus 4.8 + effort per-בלוק (#204) #356

Merged
chaim merged 1 commits from worktree-agent-a0d2502e8308bc27c into main 2026-06-30 12:03:43 +00:00
Owner

מה ולמה

WS5 / TaskMaster legal-ai #204. הופך את write_interim_draft/export_interim_draft לדטרמיניסטיים-מבנית.

הבאג שתוקן: מנגנון-הייצור עובר claude_session.query()claude -p (מנוי claude.ai, עלות-שולית-אפס, מקומי-בלבד). BLOCK_CONFIG הגדיר temp (0/0.1/0.4) ו-model (sonnet/opus) per-בלוק — מטא-דאטה-מת: הקריאה ב-block_writer.py:447 העבירה רק prompt/timeout/tools, אף פעם לא model/effort/temp. הייצור רץ על מודל ברירת-המחדל של ה-CLI עם פרומפטים-חופשיים → מקור אי-העקביות ("מסמך שונה בכל פעם").

התיקון:

  1. נעיצת model="claude-opus-4-8" (GENERATION_MODEL) לכל בלוקי-ה-AI + effort per-בלוק שמועבר בפועל דרך claude_session.queryclaude -p --model … --effort ….
    • מפת-effort: ה=medium · ו=medium · ז=high · ח=medium · ט=high · יא=high · (י=xhigh, מחוץ-לתחום-WS5). ברירת-מחדל high בספק.
  2. ניסוח-פתיחה קבוע לבלוק-ה: תמיד "לפנינו ערר…" (סוף ל-OR "עניינה של החלטה זו").
  3. מבנה-פנימי קבוע לבלוק-ה; סדר-בלוקים בייצוא כבר קבוע (docx_exporter._INTERIM_BLOCK_ORDER).
  4. endpoint יחיד דטרמיניסטיwrite_interim_draft מתזמר את אותו write_and_store_blockwrite_block הקנוני (אין מסלול-ייצור שני).
  5. ניקוי שדות-מתים: הוסרו temp/model(אליאס) מ-BLOCK_CONFIG; model כעת מפתח-dispatch בלבד ("script"/"ai"). temperature מתועד deprecated (Opus 4.7/4.8 דוחים אותו→HTTP 400); decision_blocks.temperature נשמר=0 לתאימות-עמודה בלבד. MODEL_MAP הוסר. timeout נגזר מ-effort.

הוכחת מסלול (model+effort מגיעים ל-CLI):
write_interim_draftwrite_and_store_blockwrite_block (block_writer.py: effort = block_cfg.get("effort", DEFAULT_EFFORT); query(prompt, model=GENERATION_MODEL, effort=effort, …)) → claude_session.query (if model: cmd += ["--model", model]; if effort: cmd += ["--effort", effort]).

צרכנים שעודכנו: /api/settings/mcp/blocks (web/app.py) + blocks-tab.tsx + McpBlock — חושפים effort (לא temperature המת) + המודל-הנעוץ.

ספ: docs/block-schema.md §3 (effort מחליף Temperature/Thinking-budget) · docs/spec/06-export.md (דטרמיניזם-מבני של טיוטת-הביניים).

לא נגעתי בסט-בלוקי-הביניים [ה,ו,ט,ז,ח] (כבר נכון). לא נדרשה migration.

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

  • נוגע / מקיים:
    • G2 (מקור-אמת יחיד — אין מסלול-ייצור מקביל)write_interim_draft מתזמר את אותו block_writer.write_and_store_blockwrite_block של ההחלטה המלאה; השינוי הוא באותו מסלול, לא פיצול חדש.
    • claude_session-local-only — הייצור נשאר דרך גשר-ה-CLI (claude -p), לא Anthropic SDK ולא מהקונטיינר (ראה claude_session docstring / reference_claude_generation_path).
    • INV-EX1 (06-export) — ה-DOCX נשאר נתון-נגזר; סדר-הייצוא הדטרמיניסטי (_INTERIM_BLOCK_ORDER) נשמר; השינוי מחזק את הדטרמיניזם של מקור-התוכן.
    • G11 (עקרונות-כתיבה ל-12 הבלוקים) — הפרומפטים המבניים שומרים על רקע-ניטרלי (ו), טענות-מקוריות (ז), ללא-ניתוח בבלוקי-העובדה; ��ק קיבעו ניסוח-פתיחה ומבנה.
    • INV-AH (בלוק-ט) — לא שונה: ציטוט-תכניות נשאר רשומות-בלבד.

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

  • קראתי את docs/spec/00-constitution.md + 06-export.md + block-schema.md + project_workflow_redesign/התוכנית לפני הכתיבה
  • השינוי לא יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1) — נורמלתי במקור (write_block)
  • לא הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — mcp-server/src וה-skills נקיים
  • אין בליעה שקטה — הסרת שדות-מתים מתועדת, לא מושתקת
  • בדקתי מול docs/spec/gap-audit.md — אין GAP/FU ממופה לשדות-המתים האלה (זו עבודת #204)
  • בדיקות עוברות — pytest mcp-server/tests431 passed; tsc --noEmit → 0 שגיאות
  • לא data-migration — אין שינוי-סכמה

אימות

  • python3 -m pytest mcp-server/tests -q431 passed, 1 warning.
  • cd web-ui && npx tsc --noEmit → exit 0.
  • בדיקת-מסלול סטטית: אומת ש-write_block מעביר model=GENERATION_MODEL, effort=effort ל-claude_session.query, ו-query מתרגם ל---model/--effort ב-claude -p. (אי-אפשר להריץ את המודל-החי מ-כאן — אין claude CLI/Python venv בעץ; הדטרמיניזם-המבני ניתן-לחיזוי מהקוד.)
  • לא הורצו migrations; אין שינוי-DB.

לצורך #208 (כיול-אמפירי): נקודות-ההזרקה מוכנות — model=/effort= ב-claude_session.query + BLOCK_CONFIG[*].effort הם הידיות ל-A/B; מדידה דרך style_distance על draft_final_pairs.

🤖 Generated with Claude Code

## מה ולמה WS5 / TaskMaster `legal-ai` #204. הופך את `write_interim_draft`/`export_interim_draft` ל**דטרמיניסטיים-מבנית**. **הבאג שתוקן:** מנגנון-הייצור עובר `claude_session.query()` → `claude -p` (מנוי claude.ai, עלות-שולית-אפס, מקומי-בלבד). `BLOCK_CONFIG` הגדיר `temp` (0/0.1/0.4) ו-`model` (sonnet/opus) per-בלוק — **מטא-דאטה-מת**: הקריאה ב-`block_writer.py:447` העבירה רק `prompt/timeout/tools`, אף פעם לא `model/effort/temp`. הייצור רץ על **מודל ברירת-המחדל של ה-CLI עם פרומפטים-חופשיים** → מקור אי-העקביות ("מסמך שונה בכל פעם"). **התיקון:** 1. **נעיצת `model="claude-opus-4-8"`** (`GENERATION_MODEL`) לכל בלוקי-ה-AI + **`effort` per-בלוק** שמועבר **בפועל** דרך `claude_session.query` → `claude -p --model … --effort …`. - מפת-effort: **ה=medium · ו=medium · ז=high · ח=medium · ט=high** · יא=high · (י=xhigh, מחוץ-לתחום-WS5). ברירת-מחדל `high` בספק. 2. **ניסוח-פתיחה קבוע** לבלוק-ה: תמיד `"לפנינו ערר…"` (סוף ל-OR `"עניינה של החלטה זו"`). 3. **מבנה-פנימי קבוע** לבלוק-ה; **סדר-בלוקים בייצוא** כבר קבוע (`docx_exporter._INTERIM_BLOCK_ORDER`). 4. **endpoint יחיד דטרמיניסטי** — `write_interim_draft` מתזמר את אותו `write_and_store_block`→`write_block` הקנוני (אין מסלול-ייצור שני). 5. **ניקוי שדות-מתים:** הוסרו `temp`/`model`(אליאס) מ-`BLOCK_CONFIG`; `model` כעת מפתח-dispatch בלבד (`"script"`/`"ai"`). `temperature` מתועד deprecated (Opus 4.7/4.8 דוחים אותו→HTTP 400); `decision_blocks.temperature` נשמר=0 לתאימות-עמודה בלבד. `MODEL_MAP` הוסר. `timeout` נגזר מ-`effort`. **הוכחת מסלול (model+effort מגיעים ל-CLI):** `write_interim_draft` → `write_and_store_block` → `write_block` (`block_writer.py`: `effort = block_cfg.get("effort", DEFAULT_EFFORT)`; `query(prompt, model=GENERATION_MODEL, effort=effort, …)`) → `claude_session.query` (`if model: cmd += ["--model", model]`; `if effort: cmd += ["--effort", effort]`). **צרכנים שעודכנו:** `/api/settings/mcp/blocks` (web/app.py) + `blocks-tab.tsx` + `McpBlock` — חושפים `effort` (לא `temperature` המת) + המודל-הנעוץ. **ספ:** `docs/block-schema.md §3` (effort מחליף Temperature/Thinking-budget) · `docs/spec/06-export.md` (דטרמיניזם-מבני של טיוטת-הביניים). > **לא** נגעתי בסט-בלוקי-הביניים `[ה,ו,ט,ז,ח]` (כבר נכון). **לא** נדרשה migration. ## Invariants — הצהרה (חובה) - **נוגע / מקיים:** - **G2 (מקור-אמת יחיד — אין מסלול-ייצור מקביל)** — `write_interim_draft` מתזמר את אותו `block_writer.write_and_store_block`→`write_block` של ההחלטה המלאה; השינוי הוא *באותו* מסלול, לא פיצול חדש. - **claude_session-local-only** — הייצור נשאר דרך גשר-ה-CLI (`claude -p`), לא Anthropic SDK ולא מהקונטיינר (ראה `claude_session` docstring / `reference_claude_generation_path`). - **INV-EX1 (06-export)** — ה-DOCX נשאר נתון-נגזר; סדר-הייצוא הדטרמיניסטי (`_INTERIM_BLOCK_ORDER`) נשמר; השינוי מחזק את הדטרמיניזם של מקור-התוכן. - **G11 (עקרונות-כתיבה ל-12 הבלוקים)** — הפרומפטים המבניים שומרים על רקע-ניטרלי (ו), טענות-מקוריות (ז), ללא-ניתוח בבלוקי-העובדה; ��ק קיבעו ניסוח-פתיחה ומבנה. - INV-AH (בלוק-ט) — לא שונה: ציטוט-תכניות נשאר רשומות-בלבד. ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי את `docs/spec/00-constitution.md` + `06-export.md` + `block-schema.md` + `project_workflow_redesign`/התוכנית לפני הכתיבה - [x] השינוי **לא** יוצר מסלול מקביל ליכולת קיימת (G2) ולא מתקן תסמין בקריאה (G1) — נורמלתי במקור (`write_block`) - [x] **לא** הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — `mcp-server/src` וה-skills נקיים - [x] אין בליעה שקטה — הסרת שדות-מתים מתועדת, לא מושתקת - [x] בדקתי מול `docs/spec/gap-audit.md` — אין GAP/FU ממופה לשדות-המתים האלה (זו עבודת #204) - [x] בדיקות עוברות — `pytest mcp-server/tests` → **431 passed**; `tsc --noEmit` → 0 שגיאות - [x] **לא** data-migration — אין שינוי-סכמה ## אימות - `python3 -m pytest mcp-server/tests -q` → **431 passed, 1 warning**. - `cd web-ui && npx tsc --noEmit` → exit 0. - בדיקת-מסלול סטטית: אומת ש-`write_block` מעביר `model=GENERATION_MODEL, effort=effort` ל-`claude_session.query`, ו-`query` מתרגם ל-`--model`/`--effort` ב-`claude -p`. (אי-אפשר להריץ את המודל-החי מ-כאן — אין `claude` CLI/Python venv בעץ; הדטרמיניזם-המבני ניתן-לחיזוי מהקוד.) - לא הורצו migrations; אין שינוי-DB. לצורך #208 (כיול-אמפירי): נקודות-ההזרקה מוכנות — `model=`/`effort=` ב-`claude_session.query` + `BLOCK_CONFIG[*].effort` הם הידיות ל-A/B; מדידה דרך `style_distance` על `draft_final_pairs`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-30 11:20:22 +00:00
feat(drafting): טיוטת-ביניים דטרמיניסטית — נעיצת Opus 4.8 + effort per-בלוק (#204)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
aad2de9205
מנגנון-הייצור (claude_session→claude -p) לא העביר model/effort: BLOCK_CONFIG
הגדיר temp+model per-בלוק שהיו מטא-דאטה-מת (block_writer.py:447 העביר רק
prompt/timeout/tools). הייצור רץ על מודל ברירת-המחדל של ה-CLI עם פרומפטים-חופשיים
→ מקור אי-העקביות בטיוטת-הביניים.

תיקון (עקביות-מבנית, WS5):
- נעיצת model="claude-opus-4-8" (GENERATION_MODEL) לכל בלוקי-ה-AI + effort per-בלוק
  שמועבר בפועל דרך claude_session.query → `claude -p --model --effort`.
  מפת-effort: ה=medium · ו=medium · ז=high · ח=medium · ט=high · יא=high · י=xhigh.
- ניסוח-פתיחה קבוע לבלוק-ה (תמיד "לפנינו ערר…", סוף ל-OR "עניינה של החלטה זו").
- מבנה-פנימי קבוע לבלוק-ה; סדר-בלוקים בייצוא כבר קבוע (_INTERIM_BLOCK_ORDER).
- הסרת שדות temp/model המתים מ-BLOCK_CONFIG; "temp" deprecated (Opus 4.7/4.8 דוחים
  temperature→400). decision_blocks.temperature נשמר=0 לתאימות-עמודה בלבד.
- timeout נגזר מ-effort (לא מפיצול sonnet/opus שכבר לא קיים).
- עדכון endpoint reference /api/settings/mcp/blocks + blocks-tab + McpBlock לחשוף effort.
- ספ: docs/block-schema.md §3 (effort מחליף temperature), docs/spec/06-export.md
  (דטרמיניזם-מבני של טיוטת-הביניים).

G2 (מקור-אמת יחיד) — אין מסלול-ייצור מקביל: write_interim_draft מתזמר את אותו
write_and_store_block→write_block של ההחלטה המלאה.
claude_session-local-only — הייצור נשאר דרך גשר-ה-CLI, לא SDK/קונטיינר.
INV-EX1 — סדר-ייצוא דטרמיניסטי נשמר; G11 — עקרונות-הכתיבה ל-12 הבלוקים נשמרים.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit faee621f0b into main 2026-06-30 12:03:43 +00:00
chaim deleted branch worktree-agent-a0d2502e8308bc27c 2026-06-30 12:03:43 +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#356