מסמך מקור מתקדם. דפי ההתקנה, פרוטוקול ההפעלה וששת הסקילים זמינים לקריאה בעברית; קובץ המקור נשמר כפי שהוא.
מדידה V1 — חוזה חישוב מקומי
24.10.2026. מקור: Astra-gap-closure-spec.md סעיף 3 ו-Claude-disposition.md שורה 5, שנקראו במשימה. מימוש: yskit.measurement_v2.measurement_report. אין קריאת Meta/CRM, חיבור חשבון או חישוב הכנסה במודול.
הפונקציה מקבלת tenant, רשומות ליד ותצפיות היסטוריות, cohort_start/cohort_end, as_of, timezone מסוג IANA, attribution_window, qualified_definition_version, ואופציונלית snapshot הוצאה וספירת Meta. timestamps מחייבים offset; החלון חצי פתוח [start,end) לפי זמן יצירת ליד. לידים שנקלטו אחרי as_of אינם נראים; תצפית מאוחרת אינה משנה דוח היסטורי. המיון לפי observed_at; זמן זה הוא זמן התצפית ולא טענה לזמן שבו הלקוח שינה סטטוס. נדרשת היסטוריית תצפיות כדי לשחזר דוח קודם; snapshot נוכחי לבדו אינו מספיק.
כל ליד כולל tenant_id, lead_id, created_at, received_at, is_test בוליאני; ad_id חסר נכנס ל־unknown. כפילות lead_id וערבוב לקוחות נדחים; אין ניכוי כפילויות מנחש. observations כוללות observed_at, qualified=yes/no/unknown, definition_version; החלטת yes/no מחייבת reason ו-reviewer. הגדרה שאינה תואמת לגרסת הדוח נדחית. לא־נבדק נשאר unknown. sale_status הוא תווית שנצפתה בלבד. אין קליטת PII לצורך חישוב זה.
| שדה פלט | נוסחה/משמעות |
| crm_leads | לידים ייחודיים שנקלטו בחלון, בלי בדיקות |
| reviewed_coverage | נבדקו / כלל הלידים |
| qualified_rate_among_reviewed | qualified=yes / נבדקו |
| verified_qualified_share_all_leads | qualified=yes / כלל הלידים; אינו מסווג unknown ככישלון |
| cpl | הוצאה תואמת / כלל הלידים |
| cost_per_qualified | הוצאה תואמת / qualified=yes; זמני עד הבשלה וכיסוי מלא |
| meta_minus_crm | ספירת Meta תואמת פחות רשומות CRM; פער אינו אבחון סיבתו |
| independently_verified_sales/revenue | null: אימות עסקי עצמאי אינו ממומש |
אפס מכנה או הוצאה חסרה מחזירים null, כולל cohort ריק. גם הוצאה אפס תקינה, ואינה נתון חסר. סכום שלילי/NaN/אינסוף נדחה. הוצאה וספירת פלטפורמה חייבים tenant, cohort, timezone, attribution_window זהים, observed_at אחרי סוף החלון ולפני as_of, ו-excludes_test=true. אין לטעון ליכולת להוציא בדיקות מ-snapshot ספק אם בפועל אין התאמה כזו: במקרה זה לא מעבירים snapshot בר־השוואה ולא מחשבים CPL. snapshot הוצאה מחייב currency; אין המרת מטבע או חיבור כמה מטבעות.
cohort_mature הוא הכרזה מפורשת של מקור הדוח; המודול אינו מנחש הבשלה על בסיס ימים קבועים. עלות איכותית מסומנת final רק ב-cohort לא ריק ובשל, בכיסוי מלא, עם הוצאה ומכנה חיובי. המונח final מתייחס לחישוב באותו as_of בלבד, ולא לתוצאה עסקית מובטחת. UTM, תווית sold וליד סינתטי אינם מכירה מאומתת.
בדיקה שבוצעה ב־24.10.2026: python3 -B -m unittest discover -s tests -p test_measurement_v2.py -v — 10 בדיקות עברו: מכנים, כיסוי חלקי, גרסאות, חלונות, זמני as-of, בדיקות מוחרגות, מקור unknown, אפס הכנסה מומצאת ובידוד. אלו ראיות offline בלבד; אין נתוני עסק אמיתיים ואין מסקנות סיבתיות או אופטימיזציה אוטומטית.
גישור לתוצר report ב־V2
report_stage_data(measured, *, snapshot_id, refreshed_window, observations, hypotheses, currency, spend_unit) ממפה תוצאה ממשית של measurement_report לאובייקט data של שלב report. הוא מאמת את הפלט עם product_v1.check_v2 מול CONTRACT_V2['stages']['report']; אינו יוצר envelope או חותם על ראיה. snapshot_id, refreshed_window, observations ו-hypotheses נמסרים במפורש ואינם נוצרים מניחוש. המזהה חייב להתייחס ל-snapshot ששימש לחישוב; caller אחראי לשמירת הראיה ולשיוכה ל-tenant שבמעטפת.
החוזה מחייב currency גם כשההוצאה חסרה: לכן currency מועבר במפורש, וכרגע מותר ILS בלבד בהתאם לחוזה. spend_unit חייב להיות major (שקלים) או minor (אגורות). ההמרה לאגורות דטרמיניסטית, והוצאה שאינה ניתנת לייצוג כמספר אגורות שלם נדחית. אין עיגול שקט. null נשמר; intake_gap שלילי נשמר; unknown_ad_source נספר מהקבוצה unknown. עלות איכותית זמנית/לא זמינה מקבלת cpql_limitation מפורש, וכל limitations המקוריים נשמרים. תוויות מכירה אינן מוכנסות לשדות מספריים ואין שדות הכנסה מומצאים.
עדכון בדיקה מ־24.10.2026: 14 בדיקות עברו, כולל פלט גישור שנבדק ישירות מול חוזה report, cohort הכולל לידי בדיקה בלבד (לידים עסקיים אפס וכל היחסים null), פער קליטה שלילי, יחידות כסף מפורשות והיעדר שינוי קלט. אלו עדיין ראיות offline בלבד.