מסמך מקור מתקדם. דפי ההתקנה, פרוטוקול ההפעלה וששת הסקילים זמינים לקריאה בעברית; קובץ המקור נשמר כפי שהוא.
קליטת מקור לשני מסלולי לידים — V3
yskit/source_routes_v3.py מוסיף חוזה קליטה מקומי ועמיד עבור website ו־meta_instant_form. הוא אינו מושך לידים מספק ואינו חושף webhook. כל בדיקה בקובץ tests/test_source_routes_v3.py מתבצעת עם נתונים סינתטיים ו־SQLite מקומי, ללא רשת.
זרימה
- בעל מערכת מגדיר
SourceScope: לקוח, מסלול, ספק, מקור מסוים, דור מקור, רשימת שדות מותרת וזהות מקור ממקור תצורה מהימן. source_namespace הוא זוג מקודד של מקור ודור, ולא ערך שקיבלנו מאירוע חיצוני. בעת החלפת דור, נדרשת סקירת מעבר דרך generation_reviewer מוגן; המודול אינו מספק שירות אישור אנושי.
- מתאם מקור מורשה מחזיר
evidence עם מזהה ליד שנקרא חזרה, סימון סינתטי שנשמר בצד השרת וקבלת מקור יציבה (receipt_id). authenticator חייב לאמת אותו ממשית ולזהות את אותו מקור, מסלול, לקוח ודור. פונקציית lambda של הבדיקות אינה אימות אבטחה לפריסה.
- באתר נדרשת קריאה חוזרת למזהה הרשומה ומצב בדיקה המבודד אירועי production: דיכוי מדידה, או אירוע בדיקה מאומת ונפרד. דיכוי בלבד מאפשר הוכחת קליטה ל־Sheets בהמשך, אך מחזיר
measurement_verified=False; אירוע בדיקה מאומת מחזיר True. דגל בדפדפן לבדו אינו ראיה.
- בטופס מטא, הודעת webhook לבדה אינה ליד. נדרש
retrieved_id מהשליפה המורשית של אותו טופס ואותו ליד. לא נדרשת מדידת Pixel באתר כדי להוכיח קליטה של ליד פנימי.
accept() כותב רשומת inbox עם write_id יציב, digest ומעטפת נורמלית, ורק אז מחזיר אישור durable. אותו מזהה ואותו תוכן עסקי מחזירים duplicate ואותו write_id, גם אם קבלת השליפה המאומתת החדשה שונה; הקבלה הראשונה השמורה ממשיכה עם הרשומה. תוכן עסקי סותר נרשם ביומן הסגר ללא תוכן אישי וללא קידום cursor. accept_page() מקדם cursor רק אחרי שכל פריטי העמוד התקבלו; כשל באמצע משאיר פריטים קודמים שמורים ומאפשר שידור חוזר זהיר.
pending(limit=100, after_key=None) מחזירה רק רשומות לא מאושרות במקור ובדור הפעילים. אחרי שהגשר המוגן קרא חזרה את שורת היעד, mark_delivered(write_id, bridge_result) מסמן אותה כמסורה רק אם התוצאה היא done, מזהה הכתיבה תואם וגם הרשומה שנקראה מכילה אותו מזהה. delivered(limit=100, after_key=None) נותנת קריאה מוגבלת לאותן רשומות לצפיית סטטוס בהמשך. שתי הקריאות מגבילות את שאילתת SQLite עצמה ל־1–1000 רשומות, ומדפדפות לפי key_digest עולה באמצעות WHERE key_digest > after_key. המפעיל שומר את המפתח האחרון בנפרד למסלול ולשלב, וחוזר להתחלה כאשר העמוד הבא ריק; אין מעבר אוטומטי בקוד המקור. המפתח חייב להיות digest מדויק, או None/מחרוזת ריקה להתחלה. ערכים כמו 0, בוליאני, טקסט שאינו digest, או limit לא תקין נדחים. המעבר לדור מקור חדש נחסם כל עוד יש רשומות בדור הישן שלא נמסרו, כדי שלא ייעלמו מתור העבודה.
נקודת החיבור לשכבה המשותפת
accept()['record'] מכיל tenant_id, route, provider, source_namespace, source_generation, source_lead_id, synthetic, source_verified, source_receipt והשדות המותרים כמו contact_alias. המזהה האחיד הוא tenant, route, provider, namespace, lead ID; הדור כבר כלול ב־namespace. אסור להשתמש בטלפון/מייל כמפתח כפילויות. source_receipt דורש verifier נפרד בגבול כתיבת Sheets; עצם קיומו במילון אינו הוכחת אותנטיות. גם mark_delivered חייב לקבל בפועל את תוצאת הגשר המוגן, לא מילון שהוכן חופשי על ידי גורם לא מהימן.
גבולות שלא אומתו
- אין כאן מתאם קריאה לטופס האתר שנבחר, אימות בעלות/גישה למקור, מזהה ליד יציב או readback אמיתי. החוזה מקבל ספק אתר מוגדר לכל לקוח; Supabase אינו רכיב נדרש במוצר או יעד הלידים. אין שינוי לטופס או לדאטהסט פעיל.
- אין כאן אימות חתימת הודעות Meta, בדיקת הרשאות לקריאת לידים, טופס בבעלות הלקוח או קבלת תנאי Lead Ads. אין יצירת test lead.
- אין כאן יעד Sheets פעיל או עובד רקע מחובר; מעבר הרשומה ל־Sheets ובדיקת סטטוס נעשים בשכבות אחרות.
accept() מוכיח קליטה מקומית בלבד.
generation_reviewer הוא חוזה לשירות אישור מוגן; בדיקת lambda אינה הרשאת מעבר. שחזור/איפוס מקור אמיתי צריכים ראיית דור ממקור מאומת ומיפוי בעלים לפני הפעלה.
- אין טענת exactly-once ברשת. cursor ומזהה כתיבה מסייעים לפיוס; שליחה מרחוק שתוצאתה עמומה אינה חוזרת אוטומטית.
הבדיקות כוללות קבלה לאחר אתחול מחדש, replay, סתירה, scope שגוי, סמן סינתטי לא מהימן, אירוע מדידה לא מבודד, webhook בלי שליפת ליד, שדות לא מורשים, מזהים שווים בשני מסלולים, ומעבר דור מאושר בלבד. הרצה: python3 -m unittest discover -s tests -p test_source_routes_v3.py -v.