feat(eval): כיול-effort ייעודי לבלוק י' (דיון) עם אספקת-כיוון read-only (#212) #374

Merged
chaim merged 1 commits from worktree-agent-a9878f5b0b82c055b into main 2026-06-30 18:51:52 +00:00
Owner

מה ולמה

בלוק י' (דיון והכרעה) הוא הבלוק החשוב ביותר — ליבת-ההחלטה (ratio decidendi) — אך ה-effort שלו (xhigh) נקבע 'by feel' (block_writer.py:72) ולא כויל אמפירית מעולם. ה-harness הכללי (#208, scripts/calibrate_effort.py) הוציא את בלוק-הדיון מ-CALIBRATABLE_BLOCKS כי write_block(block-yod) זורק ValueError("לא ניתן לכתוב בלוק דיון ללא כיוון מאושר…") — בלוק-הדיון דורש decisions.direction_doc.approved (brainstorm → approve_direction) שתיקי-הכיול חסרים.

ה-PR מוסיף scripts/calibrate_block_yod.py — harness ייעודי שמספק את הכיוון החסר ומכייל את בלוק-הדיון, תוך שימוש-חוזר מלא במכונת-המדידה של #208.

שכבת אספקת-הכיוון (read-only — הליבה החדשה)

  • overlay על קריאת-ה-DB: monkeypatch של db.get_decision_by_case/db.get_decision לתהליך-הזה-בלבד מזריק direction_doc שמיש ל-write_block (שמרענן את ה-decision פנימית). אפס כתיבה ל-DB — מצב-תיק-הייצור לא משתנה (אין UPDATE); ה-overlay מוסר ב-__exit__.
  • אסטרטגיה per-תיק (מתועדת בדוח):
    1. stored (מועדף, נאמן) — כיוון-מאושר שמור (approved+selected_direction, או סכמת-8126 עם direction_id/structure, מנורמל ל-approved=True על העותק בלבד).
    2. reconstructed (נסיגה, עדות-כיוון-בלבד) — direction_doc מינימלי שנגזר מ-decision.outcome + סקשן-הדיון של הסופי באותו תיק, מתויג reconstructed. INV-LRN5: outcome+מצביע-לסופי-עצמי בלבד — אפס מהות חוצת-תיקים.
    3. skip — אין סקשן-דיון או אין כיוון.

ממצא-קורפוס (2026-06-30, dry-run מול DB חי)

מ-8 סופיים: 7 ניתנים-לכיול. רק 8126-03-25 הוא stored+scorable (8174-12-24 שמור-אך-חסר-סקשן-דיון). לכן --allow-reconstructed false נותן תא-יחיד, וברירת-המחדל (reconstructed פעיל) נותנת 7 — הנסיגה היא מה שמפעיל את ה-harness היום.

Invariants — הצהרה

  • נוגע / מקיים:
    • G8 (eval-harness) — כיול אמפירי של ברירת-effort מול הסופיים; כתיבה אינקרמנטלית per-תיק + שער-per-תא לא-פטאלי (קריסה לא מאבדת תיקים שכבר יוצרו / תא בודד שנכשל מדולג).
    • G2 (מקור-אמת יחיד, אין fork) — שימוש-חוזר ב-style_distance.block_distance_to_final + _score_cell/recommend_effort/_finals_for_calibration מ-calibrate_effort (#208). אין מסלול-מדידה/harness מקביל.
    • INV-LRN5 (טוהר-הקול) — הכיוון המשוחזר נושא את ה-outcome של התיק עצמו + מצביע לסופי שלו; precedents=[] — אפס מהות (הלכה/עובדה) נגררת מתיק לתיק.
    • claude_session local-only — הייצור עובר block_writer.write_blockclaude_session.queryclaude -p (Opus 4.8 נעו��, מנוי, מקומי-בלבד; לא בקונטיינר/worktree-ללא-CLI).

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

  • קראתי את docs/spec/00-constitution.md (G8/G2) + docs/spec/07-learning.md (INV-LRN4/5) לפני הכתיבה
  • השינוי לא יוצר מסלול מקביל (G2) — משתמש-חוזר במכונת-המדידה של #208
  • לא הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — mcp-server/src נקי; ה-harness ב-scripts/
  • אין בליעה שקטה — כל תא שנכשל נרשם warning ומדולג; הדוח מסמן supply_mode=skip
  • בדקתי מול gap-audit.md — לא נגעתי ב-GAP/FU ממופה (יחידה חדשה מעל #208)
  • בדיקות עוברות — --self-test ALL PASS (28 בדיקות)
  • לא data-migration — read-only מאומת: אפס mutation calls ב-harness

אימות

  • --self-testALL PASS (28 checks): מדידה (block_distance_to_final), לוגיקת אספקת-כיוון (usable/normalize/reconstruct/plan), ו-overlay install+revert (target מקבל כיוון, non-target לא נגוע, מסלול get_decision מכוסה, מוסר אחרי ה-context).
  • --dry-run מול DB חי (read-only): 7/8 scorable, אספקת-כיוון 2 stored · 6 reconstructed · 0 skipped, 28 ייצורים מתוכננים (4 efforts × 7 cases).
  • --allow-reconstructed false → 1 scorable (נאמן בלבד). --case 1200-12-25 → מסנן לתיק-בודד.
  • grep אימת אפס update_decision/UPDATE/INSERT/.execute( ב-harness.

פקודת הכיול-החי (לבצע ע"י היו"ר — long, צורך-מכסה):

POSTGRES_PASSWORD=… POSTGRES_HOST=127.0.0.1 POSTGRES_PORT=5433 \
  mcp-server/.venv/bin/python scripts/calibrate_block_yod.py

🤖 Generated with Claude Code

## מה ולמה בלוק י' (דיון והכרעה) הוא הבלוק החשוב ביותר — ליבת-ההחלטה (ratio decidendi) — אך ה-`effort` שלו (`xhigh`) נקבע **'by feel'** (`block_writer.py:72`) ולא כויל אמפירית מעולם. ה-harness הכללי (#208, `scripts/calibrate_effort.py`) **הוציא** את בלוק-הדיון מ-`CALIBRATABLE_BLOCKS` כי `write_block(block-yod)` זורק `ValueError("לא ניתן לכתוב בלוק דיון ללא כיוון מאושר…")` — בלוק-הדיון דורש `decisions.direction_doc.approved` (brainstorm → approve_direction) שתיקי-הכיול חסרים. ה-PR מוסיף `scripts/calibrate_block_yod.py` — harness ייעודי שמספק את הכיוון החסר ומכייל את בלוק-הדיון, **תוך שימוש-חוזר מלא** במכונת-המדידה של #208. ### שכבת אספקת-הכיוון (read-only — הליבה החדשה) - **overlay על קריאת-ה-DB**: monkeypatch של `db.get_decision_by_case`/`db.get_decision` **לתהליך-הזה-בלבד** מזריק `direction_doc` שמיש ל-`write_block` (שמרענן את ה-decision פנימית). **אפס כתיבה ל-DB** — מצב-תיק-הייצור לא משתנה (אין `UPDATE`); ה-overlay מוסר ב-`__exit__`. - **אסטרטגיה per-תיק** (מתועדת בדוח): 1. **stored** (מועדף, נאמן) — כיוון-מאושר שמור (`approved`+`selected_direction`, או סכמת-8126 עם `direction_id`/`structure`, מנורמל ל-`approved=True` על העותק בלבד). 2. **reconstructed** (נסיגה, עדות-כיוון-בלבד) — `direction_doc` מינימלי שנגזר מ-`decision.outcome` + סקשן-הדיון של הסופי **באותו תיק**, מתויג `reconstructed`. **INV-LRN5:** outcome+מצביע-לסופי-עצמי בלבד — אפס מהות חוצת-תיקים. 3. **skip** — אין סקשן-דיון או אין כיוון. ### ממצא-קורפוס (2026-06-30, dry-run מול DB חי) מ-8 סופיים: **7 ניתנים-לכיול**. רק **8126-03-25** הוא stored+scorable (8174-12-24 שמור-אך-חסר-סקשן-דיון). לכן `--allow-reconstructed false` נותן **תא-יחיד**, וברירת-המחדל (reconstructed פעיל) נותנת **7** — הנסיגה היא מה שמפעיל את ה-harness היום. ## Invariants — הצהרה - **נוגע / מקיים:** - **G8 (eval-harness)** — כיול אמפירי של ברירת-effort מול הסופיים; כתיבה אינקרמנטלית per-תיק + שער-per-תא לא-פטאלי (קריסה לא מאבדת תיקים שכבר יוצרו / תא בודד שנכשל מדולג). - **G2 (מקור-אמת יחיד, אין fork)** — שימוש-חוזר ב-`style_distance.block_distance_to_final` + `_score_cell`/`recommend_effort`/`_finals_for_calibration` מ-`calibrate_effort` (#208). אין מסלול-מדידה/harness מקביל. - **INV-LRN5 (טוהר-הקול)** — הכיוון המשוחזר נושא את ה-outcome של התיק עצמו + מצביע לסופי שלו; `precedents=[]` — אפס מהות (הלכה/עובדה) נגררת מתיק לתיק. - **claude_session local-only** — הייצור עובר `block_writer.write_block` → `claude_session.query` → `claude -p` (Opus 4.8 נעו��, מנוי, מקומי-בלבד; לא בקונטיינר/worktree-ללא-CLI). ## צ'קליסט — פרוטוקול כתיבת-קוד - [x] קראתי את `docs/spec/00-constitution.md` (G8/G2) + `docs/spec/07-learning.md` (INV-LRN4/5) לפני הכתיבה - [x] השינוי **לא** יוצר מסלול מקביל (G2) — משתמש-חוזר במכונת-המדידה של #208 - [x] **לא** הוספתי מגע-Paperclip מחוץ ל-Platform Port (G12) — `mcp-server/src` נקי; ה-harness ב-`scripts/` - [x] אין בליעה שקטה — כל תא שנכשל נרשם `warning` ומדולג; הדוח מסמן `supply_mode=skip` - [x] בדקתי מול `gap-audit.md` — לא נגעתי ב-GAP/FU ממופה (יחידה חדשה מעל #208) - [x] בדיקות עוברות — `--self-test` ALL PASS (28 בדיקות) - [x] לא data-migration — **read-only מאומת**: אפס mutation calls ב-harness ## אימות - `--self-test` → **ALL PASS** (28 checks): מדידה (`block_distance_to_final`), לוגיקת אספקת-כיוון (usable/normalize/reconstruct/plan), ו-overlay install+revert (target מקבל כיוון, non-target לא נגוע, מסלול `get_decision` מכוסה, מוסר אחרי ה-context). - `--dry-run` מול DB חי (read-only): **7/8 scorable**, אספקת-כיוון 2 stored · 6 reconstructed · 0 skipped, 28 ייצורים מתוכננים (4 efforts × 7 cases). - `--allow-reconstructed false` → 1 scorable (נאמן בלבד). `--case 1200-12-25` → מסנן לתיק-בודד. - `grep` אימת **אפס** `update_decision`/`UPDATE`/`INSERT`/`.execute(` ב-harness. **פקודת הכיול-החי (לבצע ע"י היו"ר — long, צורך-מכסה):** ``` POSTGRES_PASSWORD=… POSTGRES_HOST=127.0.0.1 POSTGRES_PORT=5433 \ mcp-server/.venv/bin/python scripts/calibrate_block_yod.py ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-30 18:51:04 +00:00
feat(eval): block-yod effort calibration harness with read-only direction supply (#212)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 10s
858e05fb8b
בלוק י' (דיון והכרעה) הוא הבלוק החשוב ביותר אך ה-effort שלו (xhigh) נקבע
'by feel' ולא כויל אמפירית. ה-harness הכללי (#208) לא יכל לכייל אותו כי
write_block(block-yod) זורק "ללא כיוון מאושר" — בלוק-הדיון דורש
decisions.direction_doc.approved שתיקי-הכיול חסרים.

scripts/calibrate_block_yod.py מוסיף שכבת אספקת-כיוון read-only מעל מכונת
המדידה של #208:
- overlay על db.get_decision_by_case/get_decision לתהליך-הזה-בלבד מזרים
  direction_doc שמיש ל-write_block — אפס כתיבה ל-DB, מצב-תיק-הייצור לא
  משתנה (reverted ב-__exit__).
- אסטרטגיה per-תיק: stored (כיוון-מאושר שמור, נאמן) → reconstructed
  (מינימלי מ-decision.outcome + סקשן-הדיון של הסופי באותו תיק, INV-LRN5:
  אפס מהות חוצת-תיקים, מתויג reconstructed) → skip.
- משתמש-חוזר ב-style_distance.block_distance_to_final + _score_cell/
  recommend_effort מ-calibrate_effort (G2 — אין מסלול-מדידה מקביל).
- כתיבה אינקרמנטלית per-תיק + שער-per-תא לא-פטאלי (INV-G8).

ממצא-קורפוס: מ-8 סופיים 7 ניתנים-לכיול; רק 8126-03-25 stored+scorable
(8174-12-24 שמור-אך-חסר-סקשן-דיון) → הנסיגה reconstructed היא מה שמפעיל
את ה-harness היום.

Invariants: G8 (eval-harness), G2 (שימוש-חוזר ב-style_distance/block_writer,
אין fork), INV-LRN5 (כיוון משוחזר = סגנון/שיטה בלבד, אפס מהות חוצת-תיקים),
claude_session local-only (ייצור דרך claude -p, מקומי-בלבד).

אימות: --self-test ALL PASS (28 checks: מדידה + אספקת-כיוון + overlay
install/revert) · --dry-run מול DB חי (read-only): 7/8 scorable, 28
ייצורים מתוכננים · --allow-reconstructed false → 1 (נאמן בלבד) ·
--case מסנן. אפס mutation calls ב-harness (read-only מאומת).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 7fd94cdd30 into main 2026-06-30 18:51:52 +00:00
chaim deleted branch worktree-agent-a9878f5b0b82c055b 2026-06-30 18:51:52 +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#374