מסמך מקור מתקדם. דפי ההתקנה, פרוטוקול ההפעלה וששת הסקילים זמינים לקריאה בעברית; קובץ המקור נשמר כפי שהוא.

חיבור שני מסלולי הלידים — מקומי וסינתטי

yskit.dual_pipeline_v3.DualRoutePipeline מחבר שתי תיבות מקור נפרדות (website, meta_instant_form) לשני מתאמי מקור שמשתפים לשונית Sheets אחת, יומן כתיבה אחד ונעילת קובץ אחת. זהו קוד מוצר מקומי; אין כאן caller מחובר למטא, לאתר או ל־Google.

חוזה הפעלה

הקורא מספק שני SourceInbox מאומתים ושני SheetsLeadBridge לאותו tenant, גיליון, לשונית ונתיב יומן. חובה להתאים במדויק route, provider, namespace ודור מקור בכל זוג. הקורא מספק גם מפיק ראיית אישור מוגנת לכל פעולה. callback שמחזיר "test-approved" מתאים לבדיקות בלבד; אינו גבול הרשאה לפיילוט.

drain_once() קורא ב־SQL לכל היותר 100 רשומות ממתינות מכל מסלול, מעביר אותן דרך המתאם, ומסמן רשומת מקור כטופלה רק אחרי קריאה חוזרת חיובית של שורת היעד עם אותו write_id. אחרי timeout או חריגה הוא משאיר את המקור ממתין. ניסיון מאוחר מפעיל את פיוס המתאם לפי היומן הקיים, ואינו שולח אוטומטית בקשת append שנייה. אותו מזהה ליד בשני מסלולים נשמר בשתי זהויות נפרדות. הנעילה והיומן משותפים לשני המתאמים על אותו יעד בתוך מערכת קבצים מקומית; סביבת הפצה מבוזרת דורשת מנגנון נעילה חיצוני מאומת.

poll_status_once() קורא ב־SQL לכל היותר 100 רשומות שכבר אומתו מכל מסלול. שינוי בתמונת המצב נשמר במסד מקומי וב־outbox עמיד, בתוך טרנזקציה בלעדית כדי ששני pollers לא ידווחו פעמיים על אותו שינוי; כשל קריאה משנה רק מצב בריאות ולא מוחק סטטוס קיים. זהות העורך האנושי אינה מאומתת מקריאת ערך התא; בדיקת סטטוס סינתטית אינה מכירה מוכחת. ה־outbox אינו שליחת הודעה ואין dispatcher חיצוני במחלקה זו. חלונות דיווח שהוחמצו אינם מסומנים כנמסרו.

הסריקה משתמשת בסמן עמיד נפרד למסלול, לדור מקור ולשלב (ingest או status). שאילתות המקור משתמשות במפתח עולה וב־SQL LIMIT. לאחר סוף הרשימה הסריקה חוזרת להתחלה; ליד שנשאר uncertain אינו מרעיב לידים שבאו אחריו. מסירה מאוחרת לאחר קריסה עוברת רק דרך פיוס עם אותו write_id.

הבדיקות python3 -B -m unittest discover -s tests -p test_dual_pipeline_v3.py -v יוצרות שני מקורות סינתטיים עם אותו lead ID, כותבות לשתי שורות שונות דרך requester מדומה, שומרות תצפית סטטוס וחוזרות לאחר פתיחה מחדש. בדיקת timeout אחרי כתיבה מאמתת פיוס ללא append נוסף; ליד ראשון שנותר עמום אינו חוסם ליד שני, גם אחרי אתחול. שני pollers נפרדים במקביל מפיקים אירוע סטטוס אחד, וגם יעד שגוי נדחה. חמש הבדיקות עברו ב־24.10.2026. אלה בדיקות אינטגרציה של מודולי הקוד עם שירות מדומה; הן אינן בדיקת מקור האתר, Meta, Google חי או תהליך שרץ אחרי סגירת הצ׳אט.

להוכחת עבודה בזמן שהצ׳אט סגור דרושים caller מאומת של כל מקור ושל Sheets, supervisor מקומי שממשיך לפעול כשהמחשב ער, גיליון פרטי בעל schema מדויק, verifier מוגן, ניטור ורישום קבלות. כשהמחשב כבוי נדרשת פריסת ענן מורשית בנפרד. בשלב זה אין שירות מותקן, סודות או גישה מתמשכת חדשים.

הקליטה המסתגלת מחזירה invalidated_keys כאשר תשובת המשתמש משנה מפרט. חוזה הקמפיין מחייב hash של מפרט ואישור מדויק; אולם אין בחבילה מאגר אישורים מוגן שמקבל את מפתחות הפסילה האלה. לפיכך הפסילה היא כרגע הודעה תפעולית וחוזה למימוש עתידי, ולא הוכחת ביטול אוטומטי של אישור שנשמר במערכת חיצונית. אין להציג מסלול יצירה חי עד לחיבור מאגר האישור המוגן ובדיקת שינוי תשובה מולו.