feat(eval): ממד model×prompt ל-harness הכיול (#208) — A/B מודל-ייצור מול הסופיים #420
Reference in New Issue
Block a user
Delete Branch "worktree-opus5-model-calibration"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
מה ולמה
scripts/calibrate_effort.py(#208) כייל effort בלבד, על מודל נעוץ (GENERATION_MODEL). כדי לענות על "האם להחליף את מודל-הייצור" (opus-4-8 → opus-5) נדרש ממד שני — ובלי לפתוח מסלול-מדידה מקביל לצדstyle_distance/learning_loopהקיימים.ה-PR מוסיף שני צירים ל-harness הקיים:
--models— A/B של מודל-הייצור מול הסופיים החתומים של דפנה ב-draft_final_pairs.--instructions— A/B של וריאנט-פרומפט (למשל הוראת-עיצוב), שמוחל על כל המודלים בריצה כדי שהשוואת-מודלים לא תהפוך בשקט להשוואת-פרומפטים.בצד ה-generation,
block_writer.write_blockמקבלmodel_override— אותו חוזה בדיוק כמוeffort_overrideשכבר קיים ונוצר עבור #208.החלטת-תכנון שכדאי לשים לב אליה:
model_overrideמקבל את מזהה-הבסיס בלבד; אסקלציית ההקשר-1M (#216) מוחלת מעליו (<model>[1m]כשהפרומפט > 350K תווים). כלומר override לא מאבד בשקט את חלון ה-1M — מלכודת אמיתית עבור בלוק-י.Invariants — הצהרה (חובה)
style_distance.block_distance_to_finalובשדה-התוצאה הקייםmodel_used.by_blockנשאר בסכימה הקיימת (--rerankממשיך לעבוד);by_modelנוסף רק בריצה רב-מודלית.model_usedשה-CLI דיווח בפועל, ואי-התאמה מסומנת בדוח כאזהרת fallback-שקט במקום להיזקף בטעות למודל המבוקש. וריאנט-פרומפט נרשם בדוח כדי שלא יושווה בטעות לריצת-בסיס.צ'קליסט — פרוטוקול כתיבת-קוד
docs/spec/00-constitution.md+ ספ-התחום הרלוונטי לפני הכתיבהdocs/spec/gap-audit.md— לא נוגע ב-GAP/FU ממופהאימות
scripts/calibrate_effort.py --self-test— 24/24 ALL PASS (לוגיקת-המדידה, offline).pytest mcp-server/tests/— 470 passed.--dry-runעם שני מודלים: תכנון-גריד נכון (מכפיל אתtotal_generationsבמספר המודלים).models_usedתאם את המודל המבוקש בכל תא (ללא fallback שקט). הדוח:data/eval/effort-calibration-20260728T093903-IL.md.מה ה-PR הזה לא כולל
מסקנת-המודל עצמה. הריצה על 8125-09-24 היא n=1 ואינה מספיקה להכרעה; ריצה רחבה על 9 התיקים בעלי סופי חתום + וריאנט מכויל רצה בנפרד, ותדווח בנפרד.
`block_distance_to_final` החזיר `anti_pattern_total` בלבד. ריצת-כיול שמדווחת "anti=4" אינה יכולה לומר מה לתקן — באבחון ה-A/B של 2026-07-28 נאלצנו להסיק את הדפוס האשם מהקשר במקום למדוד אותו. - `anti_by_pattern` (שם-דפוס → מספר-פגיעות) נוסף לתא-המדידה, מ- `count_anti_patterns` הקיים — אין ספירה מקבילה. - `_mean_by_pattern` ממצע על **כל** הריצות: דפוס שלא נורה בריצה נספר כ-0 ולא מושמט, אחרת הממוצע היה מוטה כלפי מעלה. - הדוח מקבל טבלת "פילוח אנטי-דפוסים (איזה כלל הופר)" per block×effort×model. invariants: INV-G8 (eval-harness) · G2 (מרונדר מ-count_anti_patterns/ ANTI_PATTERNS הקנוניים — מקור אחד). אימות: self-test ALL PASS · 470 passed · בדיקת-שפיות ישירה — טקסט עם 1 כותרת + 2 תבליטים + 1 פיצול-מיני מפולח נכון ל- {markdown_headers:1, bullet_lists:2, inline_numbered_fragments:1}. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>