מסמך מקור מתקדם. דפי ההתקנה, פרוטוקול ההפעלה וששת הסקילים זמינים לקריאה בעברית; קובץ המקור נשמר כפי שהוא.
חוזי הדמו — שלב 1
נבדק מול contracts/pipeline.contract.json, yskit/core.py, yskit/simulation.py, yskit/cli.py, שני הפרופילים ושתי דוגמאות הצינור ב־24/10/2026. החוזים מתארים סימולציה מקומית בלבד.
skills/ הוא הנתיב הקנוני לשכבת השיטות המקצועיות בחבילה. פרופיל הדמו נפרד ממנה: הוא מספק הקשר ונתוני מותג סינתטיים, ואינו משנה את השיטה או מעניק הרשאה. מסמכים אלה אינם הוכחה שמארח סוכנים טוען את הכישורים בזמן ריצה.
שפת החוזה
yskit-contract-v1 הוא אוצר מונחים ייעודי של החבילה, אינו JSON Schema ואין להעבירו למאמת JSON Schema בציפייה לתאימות. המאמת המקומי תומך ב־type (object, array, string, integer), fields, items, const, enum, min_items, max_items, min_length, max_length, pattern, minimum, maximum. לאובייקטים נדרש סט שדות מדויק; שדה חסר או נוסף נדחה. מחרוזת ריקה או המורכבת מרווחים נדחית. pattern נבדק בהתאמה מלאה; bool אינו מתקבל כ־integer.
קובץ החוזה קובע את מבנה data והפרופיל. core.py מוסיף את מעטפת השלבים ואת בדיקות הקשרים, התקציב והאישור. שינוי בקובץ החוזה לבדו אינו מגדיר יכולת חדשה במאמת.
מעטפת ושרשרת גרסאות
כל שלב הוא אובייקט בעל שבעה שדות בדיוק:
| שדה | כלל |
contract_version | המספר השלם 1 |
mode | simulation בלבד |
tenant_id | זהה לפרופיל |
stage | שם השלב במיקום הצפוי בצינור |
revision_id | מזהה סינתטי התואם demo-[a-z0-9-]+ |
previous_sha256 | null ב־brief; בשלבים הבאים תקציר בן 64 תווי hex קטנים של המעטפת הקודמת |
data | אובייקט התוכן לפי חוזה השלב |
תקציר SHA-256 מחושב על כל המעטפת הקודמת לאחר JSON קנוני: מפתחות ממוינים, ללא רווחי הפרדה, Unicode ב־UTF-8 וללא NaN. חבילה מתקבלת רק עם ארבעת השלבים הראשונים או כל ששת השלבים, בסדר brief → messages → creative → campaign → lead → status. חבילה בת חמישה שלבים נדחית.
השרשרת מזהה שינוי בקודמים כאשר התקצירים הקיימים נשמרים; זו אינה חתימה, הוכחת מקור או הגנה מפני מי שיכול לשכתב את כל החבילה ולחשב תקצירים חדשים.
פרופיל וראיות
שדות הפרופיל: schema_version, mode, tenant_id, brand_name, offer, audience, voice, account_id, page_id, form_id, crm_id, owner_id, currency, timezone, max_daily_budget_minor, claims, product_context, crm_connection.
product_context=customer_product מבדיל את המוצר מהסוכנות הפנימית. ב־crm_connection נדרש owner=customer, provider=simulation; השדה pilot_live_provider מקבל unselected, airtable או customer_choice. אלו העדפות עתידיות בלבד, ולא מחברים. alpha לא בוחר ספק, beta מדגים העדפת Airtable של לקוח. שניהם נשארים מקומיים; אין חיבור לחשבון של ספק השירות. בפיילוט עתידי ייבדק ספק אחד לפי בחירת הלקוח.
הגרסה היא 1, המצב simulation, המטבע ILS ואזור הזמן Asia/Jerusalem. מזהי הלקוח והנכסים סינתטיים עם תחיליות ייעודיות: demo-, demo-act-, demo-page-, demo-form-, demo-crm-, demo-owner-. בכל פרופיל 1–10 טענות, כל אחת עם id, text, source; מזהי הטענות ייחודיים בתוך הפרופיל. אלה נתוני בדיקה, לא הוכחת בעלות, גישה או אמיתות מסחרית.
הבריף מחויב להצעה ולקהל של הפרופיל; evidence_ids מפנה רק לטענות שנמצאות בו. כל מסר חייב להפנות ב־claim_id לראיה שנבחרה בבריף. המאמת בודק הפניות, ואינו בודק שהקופי נגזר סמנטית מהראיה או שהמקור אמין.
תוכן השלבים
| שלב | שדות data והגבלות עיקריות |
brief | offer, audience, goal=לידים, evidence_ids, blocking_gaps. חבילה מוכנה מחייבת blocking_gaps=[]. |
messages | messages: בדיוק שני אובייקטים עם id, angle, hook, claim_id. מזהי המסרים שונים; הוק עד 8 מילים. הדמו מתאר בדיוק שתי זוויות; תוויות הזווית חייבות להיות שונות לאחר הסרת רווחי קצה; שונות מסחרית משמעותית עדיין דורשת ביקורת מקצועית. |
creative | variants: בדיוק שתי חלופות עם message_id, primary_text, headline, description, cta, image_text, visual, formats. חלופה לכל מזהה מסר. לכל אחת בדיוק שני היחסים 1:1 ו־9:16; visual=geometric-placeholder. טקסט התמונה עד 6 מילים; primary_text, headline, image_text מתחילים באות עברית. |
campaign | account_id, page_id, form_id, crm_id, status=PAUSED, objective=LEADS, destination=INSTANT_FORM, daily_budget_minor, currency=ILS, timezone=Asia/Jerusalem, schedule=not_scheduled, variant_ids. מזהי הנכסים זהים לפרופיל, התקציב אינו עולה על התקרה, ומזהי החלופות מכסים את שני המסרים. |
lead | account_id, page_id, form_id, crm_id, source_lead_id, contact_alias, owner_id. נכסים ובעלים זהים לפרופיל. |
status | source_lead_id, status, owner_id. הבעלים זהה לפרופיל; הסטטוס אחד מ־חדש, בטיפול, נקבעה שיחה, נסגר בהצלחה, נסגר ללא הצלחה. בחבילה מלאה מזהה הליד זהה לשלב הקודם. |
ה־CLI יוצר לכל חלופה SVG בשני היחסים ועמוד creative/preview.html. הוויזואל הוא גאומטריה מקומית, והעברית נכתבת כצומתי טקסט נפרדים עם כיוון RTL; אין מודל תמונה שמרנדר אותיות עבריות. יצירת קובץ אינה בדיקה חזותית של התוצאה או אימות של כל מיקום פרסום במטא.
אישור בדיקה ואחסון מקומי
approve_demo מפיק אובייקט עם simulation_only, tenant_id, account_id, profile_sha256, action, spec_sha256, issued_at, expires_at, approver_id. authorize_demo קושר אותו ללקוח, לחשבון, לתקציר הפרופיל ולתקציר מעטפת campaign, דורש action=stage_paused, approver_id=demo-human, וחלון זמן של עד 24 שעות. שינוי בפרופיל או במפרט מבטל התאמה לאישור הקודם.
אישור הדמו הוא נתון בדיקה שניתן לזייף. כל קוד שמחזיק במפרט יכול ליצור אותו; אין בו אימות זהות, סוד, חתימה או אישור אנושי מוגן. אין להשתמש בו כשער להפעלה חיה.
Simulation יוצר לכל tenant_id תיקייה עם queue.sqlite3 ו־simulated-crm.sqlite3. תקציר פרופיל נשמר בשני הקבצים; פתיחה מחדש עם פרופיל שונה נדחית. הכנת קמפיין מקבלת ארבעה שלבים ואישור בדיקה בלבד, שומרת מפרט מקומי, ומחזירה PAUSED ו־platform_written=False.
קליטת ליד דורשת קמפיין מקומי מוכר. זהות אירוע נקבעת לפי source_lead_id; שידור חוזר זהה אינו מוסיף אירוע, ושידור בעל אותו מזהה ותוכן שונה נדחה. מצבי התור: pending, processing, retry, uncertain, done. כשל offline מוזרק לפני כתיבת יעד; timeout_after_write משאיר תוצאה לא ודאית לאחר כתיבה מקומית. reconcile קורא את היעד המקומי ומשווה תקציר לפני סגירה. התאוששות מפעולה שנקטעה מעבירה processing ל־uncertain במפורש, לאחר עצירת כל העובדים, ללא חזרה אוטומטית על כתיבה.
עדכון סטטוס מחייב אירוע done, קישור לתקציר הליד המדויק והתאמת payload_hash גם ברשומת היעד; הוא משנה רשומה אחת ב־CRM המקומי. מנגנונים אלה אינם הבטחת exactly-once מול שירות חיצוני, טיפול מלא בכל תרחיש קריסה, או הוכחת התאמה של מחבר עתידי.
עדכון בדיקת הבריף — 24/10/2026
גרסת חבילה 0.2.0-draft-simulation מוסיפה מילת חוזה מקומית nullable: true רק ל־profile.max_daily_budget_minor ול־campaign.daily_budget_minor. בשדות האלה בלבד null מתאר החלטה פתוחה. אם התקציב היומי מספרי, התקרה חייבת להיות מספרית והתקציב חייב לעמוד בה; אפס, boolean וערכים שליליים עדיין נדחים. שאר השדות והשלבים נשארו כפי שהיו. קורא ישן של החוזה אינו תומך בערכי הטיוטה החדשים.
אפשר לאמת שרשרת חדשה של שישה שלבים ולהפעיל תור ו־CRM מדומים גם עם תקציב פתוח. stage_campaign מפיק budget_state=awaiting_approval כשהתקציב null; מספר שסופק להדמיה מסומן simulation_value_only. הקבלה מציינת תמיד human_approval_verified=false, execution_ready=false, platform_written=false. אישור דמו חסר עדיין נדחה. אין בכך אישור תקציב, קמפיין שנוצר במטא או רכיב פעולה חיה.