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

Sheets: חיבור שני מסלולי הלידים בחבילה המבודדת

המודול yskit/sheets_bridge_v3.py מקבל רשומת מקור סינתטית מאומתת ומעביר אותה דרך SheetsAdapter ו־SheetsValuesTransport הקיימים. הוא אינו מכיל מפתח, לקוח HTTP או הרשאת Google. מריץ מאושר צריך להזריק request(method,url,body) מאומת ומוגבל, ו־verifier.verify(subject,evidence) שמאמת בעצמו את קבלת המקור ואת ההרשאה ליעד. source_verified=True ברשומה לבדו אינו ראיה מספקת. ב־customer-pilot נדחה verifier.test_only=True.

ממשק

SheetScope(tenant_id, route, provider, source_namespace, source_generation, spreadsheet_id, sheet_id, sheet_title, max_rows=1000) מגדיר יעד ומקור מדויקים. עבור אתר: route=website; עבור טופס מטא: route=meta_instant_form. SheetsLeadBridge(scope, request, verifier, absolute_journal_path, mode='integration-test') משתמש ביומן SQLite מקומי קבוע. קבלת מקור SourceInbox.accept(...) מחזירה record ו־write_id. הרשומה צריכה לכלול tenant_id, route, provider, source_namespace, source_generation, source_lead_id, source_receipt, synthetic=True, source_verified=True, contact_alias. המבצע המוגן חייב לקשור את source_receipt ואת digest תוכן הרשומה למקור וליעד המותרים; השדות ברשומה אינם אישור עצמי.

מפתח הליד כולל tenant, route, provider, namespace ואת מזהה הליד. עמודת source הקיימת מקודדת route/provider/namespace/generation באופן חד־משמעי, כך שמזהה מספרי זהה משני מסלולים אינו מתנגש. שורת גיליון אינה משמשת זהות. עבור אותו יעד פיזי, שני המסלולים חייבים לשתף בדיוק אותו נתיב יומן מוחלט; נעילת קובץ מקומית מקיפה קריאה, כתיבה ואימות כדי למנוע שני כותבים מקומיים בו־זמנית. אין מכאן הגנה בין מחשבים או בפני עורך ידני; פריסה כזו דורשת נעילה מרכזית. יומן שקשור כבר ללקוח/גיליון אחר נדחה.

התעבורה משתמשת ב־RAW; טקסט שמתחיל = נשמר כטקסט. כשל אחרי שליחה או קריסה משאיר מצב עמום. עם חידוש מתבצעת קריאה ופיוס, ולא כתיבה עיוורת נוספת. גם קריאה ריקה אינה מוכיחה שהבקשה הקודמת בוטלה. שינוי סטטוס אינו דורס עמודות אנושיות בעת replay של הליד.

בדיקה מוגבלת בכלי המחובר

גיליון עם כותרות או סדר עמודות אחרים אינו יעד מתאים למודול הזה. לבדיקות משתמשים בלשונית בדיקה פרטית חדשה, עם sheetId ידוע וללא נתונים אמיתיים. סדר A:L הדרוש: source_key, tenant_id, source, source_lead_id, write_id, payload_sha256, status, qualified, qualification_reason, notes, owner_id, contact_alias.

לאחר קריאת metadata מדויקת ווידוא טווח ריק, build_connector_initial_write_plan(record, write_id, evidence, now, metadata, observed_rows) מפיק בקשת updateCells אחת בפורמט הנתמך של מחבר Google Drive. כל תא משתמש ב־userEnteredValue.stringValue, ולכן נוסחאות בקלט נשארות טקסט. יש להשתמש בבקשה פעם אחת בלבד, ואז לקרוא את A1:L2 ולהעביר את הערכים ל־validate_connector_initial_readback. אם תוצאת הבקשה עמומה, קוראים שוב את היעד; אין להפיק או לשלוח מחדש את אותה בקשה על סמך קריאה ריקה. יומן הכוונה נשמר לפני הפקת הבקשה.

זה מוכיח לכל היותר בקשת מוצר אחת ורשומה שאומתה דרך מחבר חי בזמן שהצ'אט עובד. הוא אינו מוכיח התקן מקור חי, עבודה רציפה בלי צ'אט, הרשאות caller לתעבורת Values API, או עריכת סטטוס אנושית. בשביל שני המסלולים לאורך זמן דרוש requester מאומת שתומך ב־read/append/update, מקור מאומת, מאמת הרשאות מוגן, מריץ עצמאי ונעילה מתאימה לסביבת הפריסה.

בדיקות מקומיות

python3 -m unittest discover -s tests -p test_sheets_bridge_v3.py -v עברו 9 בדיקות ב־24.10.2026. הבדיקות משתמשות בשרת Sheets מדומה ברמת בקשות: שני מסלולים לאותו גיליון, שימור סטטוס, תוצאה לא ודאית ואתחול, מקור/הרשאה/יעד שגויים, stringValue ובקרת כתיבה מקבילה. הן אינן קריאות Google אמיתיות.