🧠 מוניטור
LIVE·1 תקלות פתוחות500 ממתינים לבדיקה· 66 סשנים שינוי אחרון 11.10, 18:39
סטטוס חי — סשנים
רחלה חורש - Genius Flow
תקלה פתוחההכנסתי את 15 הלידים שהסוכנות שלחה בקבצים, עם תאריך ההרשמה האמיתי של כל אחד. בנוסף התברר שהחיבור החדש לפייסבוק כבר עובד ומכניס לידים לבד, ותיקנתי בו באג שהשאיר אותם בלי תאריך.
0 0 1 10:37
שירה וקנין
ממתין לבדיקהעברתי על השיחה של היום עם שירה וטיפלתי בארבעה מהשבעה שסיכמתם. דף הנחיתה החדש שהיא בנתה כבר עולה ועובד, אפשר עכשיו לערוך פרטים של קליניקה אחרי שפתחו אותה כולל המייל של המתאמת, אפשר לסנן לידים לפי קליניקה וחודש, והלוגו שלה כבר בלי הציור כמו שביקשה פעמיים. הכל מוכן ועוד לא עלה לאוויר.
0 0 18:39
Samsung SM-S948B (רופאה/מטיימת בקליניקה)
ממתין לבדיקהדיספאטץ׳ [חסום — צריך אישור]: קדם מהשיחה: Product Fine-Tuning Sync
1 0 18:14
שרית נחמני
ממתין לבדיקהדיספאטץ׳ [חסום — צריך אישור]: קדם מהשיחה: WhatsApp Automation Migration
1 0 18:13
לידור דוד חי
ממתין לבדיקההריצה האמיתית הראשונה אחרי המעבר עבדה: בקשת בדיקת זכאות יצאה לקבוצה של לידור מהמספר החדש דרך evo lychee.
0 5 16:27
שקד הנדסת חשמל (משה נעמן)
ממתין לבדיקהנשלח לרותי ריכוז השיחות שלא נענו: 34 מספרים, 16 מהם זוהו כלקוחות או אנשי קשר.
0 24 16:00
lychee
ממתין לבדיקהאפשר עכשיו לבנות תבנית עם כפתור קישור שסוף הכתובת שלו משתנה בכל שליחה, ולתת אותו מ-Make, מאוטומציה (גם משדות הלקוח) או בשליחה ידנית.
1 21 15:59
Publish
ממתין לבדיקה4 בקשות תיקון של לקוחות נשארו בלי טיפול. אף אחת לא הורצה אוטומטית, צריך מבט.
0 0 15:40
שירות ריזולטס
ממתין לבדיקהנפתח חיבור וואטסאפ חדש לשירות ריזולטס.
0 1 15:15
Builders
ממתין לבדיקהדף הלקוח של evo lychee עובד עכשיו בכתובת הקבועה evo.builders-tech.com, והקישורים החדשים שיוצאים ללקוחות הם בכתובת הזו.
2 12 14:41
שני ברגר
ממתין לבדיקהנפתח חיבור וואטסאפ חדש לשני ברגר.
0 1 14:38
סקייל רווחי
ממתין לבדיקהדשבורד השיווק של סקייל רווחי נעלם מהאוויר אחרי עדכון של מערכת אחרת באותו אתר, והוחזר. עכשיו שתי המערכות יושבות באותה גרסה.
0 1 14:30
Horizon Dubai
ממתין לבדיקהדיספאטץ׳ [חסום — צריך אישור]: קדם מהשיחה: WhatsApp Business Onboarding
1 0 14:13
בדיקת evo lychee
ממתין לבדיקההוואטסאפ של בדיקת evo lychee התנתק, ונשלחה ללקוח הודעה עם קישור לחיבור מחדש.
0 1 14:10
קל ביט
ממתין לבדיקהתאריכי הלידה של 1,576 הלקוחות של קל ביט נשמרו בפורמט שהכרטיס לא יודע להציג, ולכן הופיעו ריקים. הם תוקנו, וייבוא מקובץ שומר מעכשיו תאריכים בפורמט הנכון.
0 0 13:45
ניב אזולאי
ממתין לבדיקההוכנה לסשה הודעה מוכנה לניב אזולאי עם לינק להתקנת המודול של וואטסאפ ב-Make והפרטים לחיבור המספר שלו.
0 1 13:34
צ׳אנס בלימודים
ממתין לבדיקה25 תזכורות יום ראשון לתלמידי 1:1 יצאו בין 12:38 ל-12:58, אחת בכל פעם, ונמצאו בפועל בצ'אטים של הוואטסאפ. אביב שרם דולג כי יש לו שיעור בשעתיים הקרובות.
0 12 13:00
איתי קיין יזמות נדל״ן
ממתין לבדיקההאוטומציה שמכניסה לידים מדף הנחיתה לאוריגמי הייתה כבויה שבועיים, מאז 27/09, ולכן באוקטובר לא נכנס אף ליד מהאתר. היא הופעלה מחדש, הליד שחיכה בתור נכנס, ונוספה הגנה שתמנע ממנה להיכבות שוב מאותה סיבה. נשאר דבר אחד שרק איתי או מוריה יכולים לעשות באוריגמי.
0 1 12:53
builders
ממתין לבדיקהבדקתי את אפליקציית Evolution מול שרת אמיתי בקריאה בלבד, והכל עבד. תוך כך גיליתי שמספר שכתבתי בתיעוד נתן רושם מוטעה והוא תוקן. לא נשלחה שום הודעה, ואת זה השארתי לסשה.
0 2 12:52
ליצ׳י
ממתין לבדיקהביקשנו לעצב מחדש את מסך בחירת הטריגר באוטומציות, שייראה מסודר, סימטרי ונעים יותר.
11 2 12:50
IBC (רבקה לנצנר)
ממתין לבדיקהבדקנו את שתי התזכורות: זו של יומיים באמת יוצאת, והאחרונה יצאה היום ב-12:01. זו של שלושה חודשים עוד לא יצאה אף פעם, וזה תקין, כי היא מתחילה רק ב-5 בנובמבר. הוצאנו דוח עם כל מי שאמור לקבל, והוספנו שורת חיפוש בלידים לפי שם או טלפון.
0 0 12:17
Ready Action - יובל צרפתי
ממתין לבדיקהתיקיות הדרייב של 55 הפרויקטים הפתוחים קיבלו מספר חודש בהתחלה, וכל תיקייה חדשה תיפתח ככה מעכשיו
1 7 12:03
הולדינג קייר
ממתין לבדיקהליד חדש מלידים הולדינגקייר שירותים נכנס לבד למנדיי.
0 9 09:54
MyOne
ממתין לבדיקההמוח העמיק את הידע על MyOne מ-40 פעולות אחרונות.
0 0 09:13
DY WEB
ממתין לבדיקההמוח העמיק את הידע על DY WEB מ-27 פעולות אחרונות.
0 4 09:13
Builders (פנימי)
ממתין לבדיקההמוח העמיק את הידע על Builders (פנימי) מ-40 פעולות אחרונות.
0 1 09:12
רייבנבך
ממתין לבדיקהמסך התבניות היה מסודר לפי האלפבית, ודניאלה ביקשה שהתבנית האחרונה שאושרה תופיע למעלה. בניתי את זה, הוא כבר עלה לליצ׳י, ומחכה לאישור אחרון כדי לעלות גם אצלה.
0 1 22:51
קידר פרויקטים
ממתין לבדיקהנבנתה אוטומציה שתופסת מי שמשאיר טלפון בתגובה בפייסבוק או באינסטגרם ושולחת אותו למערכת, ומי שלא השאיר מקבל הודעה פרטית שמבקשת מספר. עובדת בבדיקות, מחכה לחיבור לדף.
0 1 21:47
רדי אקשן
ממתין לבדיקהכתבתי בתיאור של קבוצת הוואטסאפ של יובל את כל מה שאפשר לבקש מהבוט, עם דוגמה קצרה לכל דבר. זה מה שסשה הבטיח לו בשיחה. עכשיו הוא רואה את זה בקבוצה עצמה בלי לשאול אף אחד.
0 1 21:47
רדי אקשן (יובל צרפתי)
ממתין לבדיקההמוח העמיק את הידע על רדי אקשן (יובל צרפתי) מ-17 פעולות אחרונות.
0 1 19:13
Nir Photos
ממתין לבדיקההמוח העמיק את הידע על Nir Photos מ-13 פעולות אחרונות.
0 0 19:13
BMeniv
ממתין לבדיקההמוח העמיק את הידע על BMeniv מ-9 פעולות אחרונות.
0 0 19:12
קלניצקי
ממתין לבדיקההמוח העמיק את הידע על קלניצקי מ-40 פעולות אחרונות.
0 0 19:12
נינג׳ה קידס
ממתין לבדיקההמוח העמיק את הידע על נינג׳ה קידס מ-2 פעולות אחרונות.
0 0 19:12
ירין זאנו
ממתין לבדיקההמוח העמיק את הידע על ירין זאנו מ-40 פעולות אחרונות.
0 0 09:13
alon-guri
ממתין לבדיקההמוח העמיק את הידע על alon-guri מ-4 פעולות אחרונות.
0 0 09:12
אביגיל לב
ממתין לבדיקההמוח העמיק את הידע על אביגיל לב מ-4 פעולות אחרונות.
0 0 09:12
EDOORS
ממתין לבדיקההמוח העמיק את הידע על EDOORS מ-40 פעולות אחרונות.
0 0 19:13
אבי נמני
ממתין לבדיקההמוח העמיק את הידע על אבי נמני מ-1 פעולות אחרונות.
0 1 19:12
Lichi System
ממתין לבדיקההמוח העמיק את הידע על Lichi System מ-3 פעולות אחרונות.
1 0 19:12
פנינה רוזנטל
ממתין לבדיקההמוח העמיק את הידע על פנינה רוזנטל מ-39 פעולות אחרונות.
0 0 09:12
צאנס בלימודים
ממתין לבדיקההמוח העמיק את הידע על צאנס בלימודים מ-40 פעולות אחרונות.
0 0 09:12
עומר צוקר
ממתין לבדיקההמוח העמיק את הידע על עומר צוקר מ-40 פעולות אחרונות.
0 0 09:12
לא צוין
ממתין לבדיקההמוח העמיק את הידע על לא צוין מ-2 פעולות אחרונות.
1 0 19:12
Publish · דניאל גרינוולד
ממתין לבדיקההמוח העמיק את הידע על Publish · דניאל גרינוולד מ-1 פעולות אחרונות.
0 1 19:12
צורית סבג
ממתין לבדיקההמוח העמיק את הידע על צורית סבג מ-2 פעולות אחרונות.
1 0 19:12
ליצ'י
ממתין לבדיקהתמלול חדש מהפגישה "ליצ'י שבועי" (ליצ'י) — 0 משימות מוכנות לאישורך (לא נוצרו אוטומטית).
0 0 17:12
יובל צרפתי
ממתין לבדיקההמוח העמיק את הידע על יובל צרפתי מ-3 פעולות אחרונות.
0 0 09:12
איתי עוזרי
ממתין לבדיקההמוח העמיק את הידע על איתי עוזרי מ-3 פעולות אחרונות.
0 0 09:12
בדיקת לילה
ממתין לבדיקההמוח העמיק את הידע על בדיקת לילה מ-3 פעולות אחרונות.
0 0 09:12
ירין ז׳אנו
ממתין לבדיקההמוח העמיק את הידע על ירין ז׳אנו מ-10 פעולות אחרונות.
0 3 19:12
Grabo (חן גרבויס)
ממתין לבדיקההמוח העמיק את הידע על Grabo (חן גרבויס) מ-2 פעולות אחרונות.
0 2 19:12
מתנאל לוי
ממתין לבדיקההמוח העמיק את הידע על מתנאל לוי מ-2 פעולות אחרונות.
0 2 19:12
אושרה הפקות
ממתין לבדיקההמוח העמיק את הידע על אושרה הפקות מ-1 פעולות אחרונות.
0 1 19:12
אושרה הפקות (דרך גלעד, צליל נוימן)
ממתין לבדיקההמוח העמיק את הידע על אושרה הפקות (דרך גלעד, צליל נוימן) מ-1 פעולות אחרונות.
1 0 09:12
מתנאל
ממתין לבדיקההמוח העמיק את הידע על מתנאל מ-1 פעולות אחרונות.
0 0 09:12
nadav-friedman-easyflow
ממתין לבדיקההמוח העמיק את הידע על nadav-friedman-easyflow מ-8 פעולות אחרונות.
0 2 09:12
sara-yitzhak
ממתין לבדיקההמוח העמיק את הידע על sara-yitzhak מ-13 פעולות אחרונות.
0 1 09:12
שרה יצחק (דרך נדב, easyflow)
ממתין לבדיקההמוח העמיק את הידע על שרה יצחק (דרך נדב, easyflow) מ-2 פעולות אחרונות.
0 0 23:12
naamamar
ממתין לבדיקההמוח העמיק את הידע על naamamar מ-1 פעולות אחרונות.
0 0 23:12
יהודה
ממתין לבדיקההמוח העמיק את הידע על יהודה מ-1 פעולות אחרונות.
0 0 23:12
מתן ספדה
ממתין לבדיקההמוח העמיק את הידע על מתן ספדה מ-1 פעולות אחרונות.
0 0 14:12
טוהר עסיס
ממתין לבדיקההמוח העמיק את הידע על טוהר עסיס מ-1 פעולות אחרונות.
0 0 14:12
אורי גבאי
ממתין לבדיקההמוח העמיק את הידע על אורי גבאי מ-2 פעולות אחרונות.
0 0 14:12
Video Workflow Review
ממתין לבדיקההמוח העמיק את הידע על Video Workflow Review מ-1 פעולות אחרונות.
0 0 14:12
עידן
ממתין לבדיקההמוח העמיק את הידע על עידן מ-1 פעולות אחרונות.
0 0 14:12
כל הלקוחותשירה וקניןSamsung SM-S948B (רופאה/מטיימת בקליניקה)שרית נחמנילידור דוד חישקד הנדסת חשמל (משה נעמן)lycheePublishשירות ריזולטסBuildersשני ברגרסקייל רווחיHorizon Dubaiבדיקת evo lycheeקל ביטניב אזולאיצ׳אנס בלימודיםאיתי קיין יזמות נדל״ןbuildersליצ׳יIBC (רבקה לנצנר)Ready Action - יובל צרפתירחלה חורש - Genius Flowהולדינג קיירMyOneDY WEBBuilders (פנימי)רייבנבךקידר פרויקטיםרדי אקשןרדי אקשן (יובל צרפתי)Nir PhotosBMenivקלניצקינינג׳ה קידסירין זאנוalon-guriאביגיל לבEDOORSאבי נמניLichi Systemפנינה רוזנטלצאנס בלימודיםעומר צוקרלא צויןPublish · דניאל גרינוולדצורית סבגליצ'ייובל צרפתיאיתי עוזריבדיקת לילהירין ז׳אנוGrabo (חן גרבויס)מתנאל לויאושרה הפקותאושרה הפקות (דרך גלעד, צליל נוימן)מתנאלnadav-friedman-easyflowsara-yitzhakשרה יצחק (דרך נדב, easyflow)naamamarיהודהמתן ספדהטוהר עסיסאורי גבאיVideo Workflow Reviewעידן
featureאפשר עכשיו לבנות תבנית עם כפתור קישור שסוף הכתובת שלו משתנה בכל שליחה, ולתת אותו מ-Make, מאוטומציה (גם משדות הלקוח) או בשליחה ידנית.
PR #409 merged d582312, live. Meta dynamic URL ({{1}} at end + example). Editor toggle + example; Make send-template linkValues -> button_url_values (published to Make app lychee-gytclg eu2, api+expect = master); API catalog; automation send_template url_vars rendered + encodeLinkValue; inbox fill dialog; sendTemplate refuses missing value by button name before Meta; campaign-execute refuses such templates. npm test 3814/3814. Requested by a customer (Gilad Ashkenazi, WhatsApp group).
fixכל שדות התאריך בליצ'י מציגים עכשיו יום/חודש/שנה (12/11/2026) בכל מחשב. קודם, במחשב באנגלית, התאריך הופיע הפוך.
PR #408 merged 3201151, live. IsraeliDateInput (src/app/wa/date-input.tsx) + src/lib/wap-israeli-date.ts replace all native date/datetime-local inputs in src/app: inbox contact card + schedule, wa-client tasks + contacts inline editor (display too), webinars x3, public form /f, admin partners + leads. Same value contract. Verified locally light/dark/390. npm test 3800/3800. Not changed: read-only displays using he-IL locale (dd.mm.yyyy with dots, day first), and {{field.x}} in messages renders the stored ISO value.
featureבמודול של Make לעדכון שדות בליצ'י, השדה נבחר עכשיו מרשימה, ולשדה תאריך כתוב באיזה פורמט לשלוח.
PR #405 merged 495f54e. Make app lychee-gytclg (eu2): new RPC customFields (POST + api PUT) -> /make-contact-fields, label 'label · key' + date format; updateCustomFields expect: key select rpc://customFields mappable, value help YYYY-MM-DD. Live before = master (backup saved), after = repo. Server unchanged. Found: קל ביט channel 5ba90458 field תאריך_לידה has 1576 values in dd-mm-yyyy (not ISO) so the contact card date input shows empty; not touched.
fixבהגדרת טריגר באוטומציה, התגית נבחרת עכשיו מרשימה, והשדה שהיה 'על מי זה רץ' אומר בבירור שהוא בוחר את כל אנשי הקשר או רק בעלי תגית מסוימת.
PR #404 merged a1d802f, live. TagSelect in trigger-picker.tsx replaces 3 <input list>/<datalist> (tag_added, daily, monthly). Label 'לאילו אנשי קשר', first option 'כל אנשי הקשר', tags as 'רק עם התגית: X', 'תגית אחרת' free text, saved unknown tag kept. trigger_config.tag unchanged. Verified locally light+dark. npm test 3784/3784.
diagnosisהמספר של גאדג'טשופ מנותק מאז 25.09: מטא כבר לא נותנת לנו גישה לחשבון הוואטסאפ שלהם, ולכן הודעות לא נכנסות ושליחה נכשלת. צריך שהלקוח יחזיר את ההרשאה או יחבר מחדש.
Channel 833d5abe (מוצרי פרסום ומתנות, account גאדג'טשופ 63cfbe1b), coexistence, wabaId 2236905920431637, phoneNumberId 1304154982780745. Stored token valid: GET /me -> Builders System User 122100015243460003. GET waba, phone, waba/phone_numbers, waba/subscribed_apps all 400 code 100 subcode 33 (object not visible to this token). Last inbound 2026-09-25T22:17Z, last delivered outbound 2026-09-25T13:57Z, first failure 2026-10-11T10:18Z template send code 100; 'תיקון חיבור' (cloud-register) fails the same way. Conclusion: client side removed the system user/app access to the WABA, or moved/deleted the WABA. Not fixable from our side; needs client to reassign asset or reconnect. Webhook-events lookup for account_update timed out (wap_webhook_events size, see night task 2). Read-only, nothing changed.
designמסך בחירת הטריגר באוטומציה סודר מחדש: סימטרי, כרטיסים אחידים עם אייקון, בחירה עדינה, ומצב בדיקה רגוע שמזהיר רק כשבאמת אין למי לשלוח.
PR #403 merged 1aac6ca, live on /api/wap/version; master verify+smoke success. New src/app/wa/trigger-picker.tsx (TriggerPicker radiogroup with roving tabindex, TestModePanel switch 56x44), theme.css wa-trigger-*/wa-switch* light+dark. Groups as 2-column panels so 2/3/4 per group never leaves a hole (ready for #365 facebook_lead). Contrast measured: light label 17.5 hint 4.79 selected hint 4.52; dark label 12.9 hint 7.21; warning 6.84/8.05. 390: 10 cards 60px, same width, no truncation, no horizontal scroll. Display only, wap-triggers.ts untouched. tests/trigger-picker.test.ts 18; npm test 3762/3762.
featureניהול הלקוחות של הריסלרים עבר להיות לשונית רגילה בתוך המערכת שלהם, במקום קישור חבוי בתחתית מסך ההגדרות שהוציא אותם החוצה. רק מי שהוא באמת ריסלר רואה אותה, וההרשאה בשרת לא הורחבה בכלל.
PR #402 merged as 30ed477 and deployed; /api/wap/version returns it; GitHub verify AND smoke both completed success on that commit. Production check: /wa/reseller returns 307 to login exactly like /wa/chats and /wa/settings, confirming middleware now treats it as an ordinary console route. BEFORE: the only entry point was a card at the bottom of the billing tab in settings, rendered behind isAdmin && tab === 'billing', linking out of the console to a standalone page. CHANGE: 'reseller' added to WapViewKey and VIEW_KEYS in wap-route.ts so /wa/reseller parses as a console address and src/app/wa/[screen] serves it inside the normal shell (same nav, same mobile chrome, same back button). Deleted src/app/wa/reseller/page.tsx, which is what lets [screen] match the segment; reseller-portal.tsx and its children stay. Links already sent keep working because the address did not change. Deliberately NOT added to USER_VIEW_OPTIONS: those are per-person grantable screens and this one is decided by the account being a reseller, so listing it there would have offered it in the tab-grant UI to anybody. It sits beside settings in UTILITY and appears only when reseller-status answers enabled && (is_reseller || operator), asked once and only when the three conditions the server also requires are already true (admin or operator, channel_ids null, not blocked), so an ordinary customer never gets a pointless 404. GATE NOT WIDENED: resellerEnabledFor and resellerManager are untouched and still refuse every action server-side; hiding the tab is presentation only. A user without the gate who types /wa/reseller is sent to the dashboard, but only after identityReady AND the gate have both answered, so a real reseller is not bounced off their own tab mid-load. Opens without a WhatsApp number like the social screens. Removed the billing-tab card and reseller-link.tsx entirely rather than keeping a shortcut: two doors to one room drift apart. Label chosen 'ניהול לקוחות' after rejecting 'הלקוחות שלי', because every other nav label is a neutral noun and 'לקוחות' alone reads as אנשי קשר. VERIFICATION: npm test exit 0 with 3762 passed 0 failed, typecheck exit 0, build exit 0, CI verify and smoke both green on head 181acd5 / merge 30ed477. Browser at desktop and 390px via the repo's own /wa/demo/reseller, which exercises the same ResellerPortal component, confirming it still renders after the page removal. Nine of thirteen new tests fail on master; the four that pass are the server-gate assertions plus 'not a per-user grantable view', present specifically to prove the permission was not widened. NOT VERIFIED: the tab itself inside a real logged-in reseller console, which needs a live reseller session I will not create. Worth a look on an Easyflow login. NOT DONE: no migration, no billing logic, no reseller data touched, no Cardcom call. Port 3022 was held by another session's dev server; flipped autoPort locally and restored .claude/launch.json so it is not in the diff. SCOPE NOTE: the console is reserved for other sessions in my lane definition; the main session routed this here and confirmed via tools/agents-status.mjs that nobody else was on wa-client.tsx, and PR #399 which it warned about was already merged.
deployכפתור הקישור בתבניות עלה לאוויר וזמין לכל הלקוחות.
PR #399 squash-merged as 5cb63c409e23237150f6ba94ec91ab8f576b6bba after CI success on exact head d4973f5. Production /api/wap/version returns 5cb63c4, /api/wap/auth 200. No migration, no env change.
featureמעכשיו לקוח חדש מקבל מיד אחרי ההקמה חלון שמבקש להוסיף כרטיס, בלי לגבות כלום באותו רגע, והחיוב הראשון יורד רק כשהניסיון נגמר. אפשר לסגור את החלון ולהמשיך לעבוד כרגיל, ואז נשארת תזכורת עדינה בלוח הבקרה. זה פותר את הבעיה שבגללה עשרה לקוחות ננעלו בחוץ בלי שאף אחד מהם הפך למשלם.
PR #313 REVIVED, REBASED, RESHAPED, MERGED AND DEPLOYED. Merge commit 1efadd8; live /api/wap/version returns it; production smoke /api/wap/auth 200 and /wa/signup 200. Sasha's decision 11.10 via the main session: card window after onboarding, NOT blocking. That reverses the 23.09 'mandatory' shape I built. REBASE VS REBUILD: measured first, 75 commits of drift; of the touched files only wa-client.tsx (14 commits incl. my #389) and CHANGELOG had moved, wap-billing.ts by one. Chose rebase because the Cardcom 'save' operation, the hard part that keeps the end-of-trial charge single, was undisturbed and risky to re-derive. Squashed the branch to one commit first so conflicts resolved once; the ONLY conflict was CHANGELOG; typecheck passed on the rebased tree before new work. BEHAVIOUR: window opens after the tour; charge:false makes it a J2 validation that stores the card and takes nothing; amount and trial end date shown before entry via billing-summary, same resolver as #389 so an agreed rate quotes the agreed rate; 'אוסיף אחר כך' closes it permanently and sets onboarding_state.card_deferred_at (its own field, NOT dismissed_at, because dismissing the setup checklist must not silence a missing payment method); a quiet row then appears on the dashboard checklist; the existing lockout screen speaks at trial end. The trial runs its full length either way. trialCardPromptOpen and trialCardReminderOwed read one shared cardFacts in the shell so exactly one surface is ever showing. trialCardRequired keeps the safety rule: partners, operator-opened accounts and accounts that already hold a card are never asked, unknown billing data fails open, admin only. NO DOUBLE CHARGE: 'save' opens no term, does not set billing_status active, does not clear trial_ends_at, does not sync customer status, so runTrialBilling still sees a trial with a card at the end and charges once; ChargeAndCreateToken would have charged on save AND at trial end. It also fixes the previous 'replace' label that would have written 'הכרטיס אומת והוחלף' into every new customer's history about a card that never existed. Hash branch still keys on the raw period so addon ExternalUniqTranId values are byte-identical. auth now returns has_card as a boolean only. VERIFICATION: npm test exit 0 with 3716 passed 0 failed, typecheck exit 0, build exit 0, GitHub CI verify passed in 2m57s on head 5c014db. Browser on the real build at desktop and 390px via a throwaway harness (deleted). Two of five new behavioural tests fail on the required version; the other three are invariants holding either way and are labelled as regression locks, not coverage. Note on method: reverting the whole module made the test file fail to LOAD so everything 'failed' for the wrong reason; I reverted only the behaviour and kept the exports, and the numbers are from that. NOT DONE: no Cardcom call of any kind, no charge, no refund, no subscription change, no migration. Post-deploy check: zero billing events today, 15 accounts still trial, nothing moved for any customer. The 10 locked-out accounts were deliberately left untouched; they already see the lockout screen with the amount from #389. Port 3022 was held by another session's dev server; flipped autoPort locally and restored .claude/launch.json, so it is not in the diff.
featureבתבניות אפשר עכשיו להוסיף כפתור שפותח קישור, ועריכה של תבנית שיש בה קישור כבר לא הופכת אותו לכפתור תגובה רגיל.
PR #399 (claude/template-link-button): up to 2 static URL buttons per template in both editors, mixed with quick replies; wap-template-buttons.ts split/validate/build helpers; edit dialog and new-version previously mapped every button text to QUICK_REPLY, silently converting URL buttons; kept kinds (PHONE_NUMBER, dynamic URL) round-trip verbatim. Static URLs only, since no send path passes button parameters. tests/template-link-buttons.test.ts 16 tests, 4 mutations caught, full suite 3711/3711, tsc clean, browser QA desktop light + 390 dark with intercepted API. Also merged PR #398 (presence test no longer hangs test runs). CI pending on #399 at time of logging.
diagnosisנבדק למה התבניות של מאור נדחו ולמה תבנית של אושרה הפקות עדיין ממתינה: מטא דחתה את התבניות של מאור כחשד להונאה, והתבנית של אושרה ממתינה אצל מטא אחרי עריכה. אין תקלה אצלנו.
Read-only GETs to Graph v21.0 with each channel's own token. Maor (channel 7ca3f398, WABA 1932478564618456): welcome (MARKETING, previous_category UTILITY) and ask_payment (UTILITY) both status REJECTED, rejected_reason SCAM. ask_payment body asks for bank account confirmation and ID photo to transfer winnings. WABA account_review_status APPROVED, phone quality GREEN, status CONNECTED; business not verified (141010, LIMITED), same as other clients. Our wap_templates rows match Meta (synced 07:40 UTC 11.10). Osherat (channel 16669de1, WABA 2092001114754173): mashov_beikvot_peilut_baut_sifer status PENDING at Meta, rejected_reason NONE; it had been APPROVED on 09.10 04:58 UTC per webhook, so the PENDING is a resubmission after edit. Template status webhooks still arriving (last 10.10 17:04 UTC), so an approval will update automatically. Nothing changed at Meta or in the database.
fixמסך המינויים בניהול הציג 32 שורות כשרק 13 מהן באמת משלמים, והכניסו לשם גם ניסיונות וחשבונות שנמחקו. תיקנתי שיוצגו רק המשלמים. בנוסף הלקוח השנתי נספר כאילו הוא משלם מחיר מלא כל חודש, וזה ניפח את ההכנסה, אז עכשיו הוא נספר לפי מה שבאמת נכנס.
TWO PRs MERGED AND DEPLOYED THIS MORNING. (1) PR #389 commit bde85f7: the trial-expired lockout screen now names the amount above the button that takes it. Carried over from last night's QA; it was unmerged only because the browser pane was down and I would not ship an unseen UI change. Verified visually this morning at desktop and 390px before merging. (2) PR #397 commit d2374df, the subscriptions screen. FILTER: subscriptions() asked 'has a plan_key', which rendered 32 rows live today: 13 paying (billing_status=active, not deleted), 13 trials, 2 pending, and 4 deleted accounts (2 pending + 2 trial, correcting the relayed claim of 4 of one kind). Now: not deleted AND billing_status in (active, past_due). past_due stays deliberately because the failed-charge counter above the list is derived from these same rows, so excluding them would have silently zeroed that warning; they contribute no revenue because monthlyRevenue already counts only active. ANNUAL: 12 payments buy 15 months (ANNUAL_PAID_MONTHS / ANNUAL_SERVICE_MONTHS), and revenue counted the full monthly rate, overstating by 25%. One annual account live: אבי נמני, starter_ils, no override, term through 2028-01-14, read 79/mo against 948 paid for 15 months. New monthlyEquivalent() in wap-billing-offers returns monthly*12/15 = 63.20, derived from the same two constants so changing the offer moves the dashboard. Decision and rationale: zero would understate a paying customer, full rate overstates cash never taken; 948/15 is the only figure matching both the cash and the service owed. The ROW still shows 79 because that is the rate the charge multiplies and the field the admin edits; swapping the normalized figure there would make the editable input save something other than it displays. The annual reality is stated beneath it plus a term badge. monthlyAmountFor is UNTOUCHED: reading changed, charging did not. REFACTOR: the rule moved into admin-analytics-core as subscriptionRows()/isPayingSubscription() so it is testable without a database; that file's 'no imports at all' header was rewritten rather than left false, since it now imports two dependency-free billing modules. One pre-existing assertion pinned must<RawAccount> by name and was changed to the generic form its neighbour already used, preserving its intent. Also fixed: the term badge rendered '14 בינו׳ 2028, 02:00', UTC midnight seen from Israel; a term end is a date so it uses dayText. VERIFICATION: npm test exit 0 with 3652 passed 0 failed, typecheck exit 0, build exit 0, GitHub CI verify passed in 3m39s. Browser on the real build at desktop and 390px with a harness carrying live shapes: revenue rendered 401.20 (63.20+119+90+129) where the old code would show 417.00; trials and deleted absent; past_due warning intact. Five of seven new tests fail on master; the two that pass are deliberate no-change regression locks. NOT DONE: no migration, no billing logic, no Cardcom call, no charge, no subscription change. OPEN QUESTION relayed to Sasha and NOT built: whether anyone paid annually outside the system (transfer/invoice) and is therefore recorded as none or cardless; marking such an account active without a card could arm the billing sweep, so it waits for his answer.
featureבהודעה שנשלחת מ-Make אפשר עכשיו להוסיף כפתורים ולבחור לכל כפתור אוטומציה של ליצ'י שתרוץ כשהלקוח לוחץ עליו.
PR #394 merged 98c1457, live. Migration 20261011090000_wap_flow_waits_make_buttons applied to shxsdijepxzybjjhxxjz (button_runs jsonb, flow_kind make), rollback round trip OK, types regenerated. Make app lychee-gytclg (eu2) sendTextMessage/sendTemplateMessage api+expect+interface PUT via SDK API, all 8 sections now equal repo; fields visible via Make MCP. No sends. Not yet proven: rpc dropdown inside array, real press end to end.
fixמי שמחבר עוזר AI משלו לליצ׳י ונתקע, מקבל עכשיו הסבר אמיתי מה הבעיה במפתח ואיפה לתקן אותה, במקום משפט אחד שמאחד שלוש תקלות שונות. בדקתי גם את כל מודולי ה-Make ואת התיעוד, ומצאתי שחסרים בתיעוד המספרים של מגבלת הקצב.
PR #387 merged as 21f88f8 and deployed; production /api/wap/version returns 21f88f8. QA of the API, MCP and Make track. FOUND AND FIXED: #380 (dbaf0f6) gave the real refusal reason to src/app/api/wap/[action]/route.ts only; src/app/api/mcp/route.ts kept a hardcoded lumped sentence. The MCP route now calls apiKeyRefusal, and apiKeyRefusalFor gained an optional surface so the advice points at the agent connection instead of a Make screen an MCP user does not have; make stays the default so every #380 message and test is unchanged. New test tests/mcp-refusal-says-why.test.ts fails 4 of 9 against master code. Live acceptance on 21f88f8: MCP with no key, with a wrong-format key and with a well-formed unknown key each return a distinct actionable Hebrew message, while REST still points at Make. VERIFIED #380 AND #370 LIVE: refusal reasons work on REST and make-automations now reaches the refusal path rather than a proxy 401. CORRECTED AN EARLIER WRONG READ OF MINE: the smoke failure on dbaf0f6 was not a failed deploy. dbaf0f6 is an ancestor of 6ef88ab, so the next merge deploy carried #380 in; smoke timed out on its 300 second window while the three earlier master deploys that day each passed in 9 to 11 seconds. Net finding: a red smoke X stands on master for a release that is healthy. MAKE AUDIT, reads only, no sends, no key minted: all 17 calls across modules, RPCs, connection test and webhook attach/detach have zero method mismatches against the catalogue; api-whoami and make-automations sit outside PUBLIC_ACTIONS by design. Every error body probed carries .error, so base.jsonc renders a real sentence in Make rather than undefined. DOCS VS BEHAVIOUR: /docs documents idempotency, idempotency_key, scopes, the 24h window, 428 and the 19 tools, and the live tools/list count matches 19. It never states 429, 409, Retry-After, the X-RateLimit headers, or the actual limits from wap-api-protection.ts (120 requests and 30 mutations per key, 600 and 120 per account, per-minute window via date_trunc). BLOCKED: positive-path live QA of the Make modules needs one agreed test key on a test account; minting a production credential was out of scope tonight.
qaעשיתי בדיקה מקיפה לאפליקציית האנדרואיד על מכשיר מדומה. רוב הדברים שחשדתי בהם התבררו כתקינים. אישרתי שתיקון לוח הבקרה באמת עובד על מסך טלפון אמיתי. מצאתי ותיקנתי כפתור אחד שלא עשה כלום בתוך האפליקציה. את תיקון המקלדת לא הצלחתי להוכיח כי המכשיר המדומה סירב לפתוח מקלדת בכלל.
Full Android shell QA on emulator lychee-test (API 35, 1080x2400, density 420), app versionCode 3 installed, logged-in console loaded from production. VERIFIED WORKING: safe-area insets (WebView bounds [0,136][1080,2337] exactly match statusBars=136 and navigationBars=63 from dumpsys window displays); back button (handled by @capacitor/app OnBackPressedCallback canGoBack/goBack, confirmed by CoreBackPreview log); external links (BridgeWebViewClient.shouldOverrideUrlLoading -> bridge.launchIntent); file upload and camera capture (BridgeWebChromeClient implements onShowFileChooser; NOT declaring CAMERA is the supported path per isMediaCaptureSupported()); POST_NOTIFICATIONS (merged in from the push plugin, confirmed in the merged manifest); downloads (custom handler with cookie); FileProvider paths present. DASHBOARD FIX VERIFIED ON DEVICE: every stat label 53px tall and every value ~68px, i.e. single line, including ממתינות לתשובה which wrapped before; זמן מענה at 501px wide confirms service cards went full width. BUG FOUND AND FIXED: window.open(url, _blank) is a no-op in the app - @capacitor/android has zero matches for setSupportMultipleWindows or onCreateWindow - so the צפייה בטופס button in forms.tsx did nothing. Replaced with an anchor; PR 391 merged to fb1c2c2. KEYBOARD FIX NOT PROVEN: dumpsys window displays reported InsetsSource type=ime frame=[0,0][0,0] visible=false throughout - the emulator never showed a soft keyboard for a WebView input even with hw.keyboard overridden via show_ime_with_hard_keyboard=1 and Gboard installed and enabled. The test never exercised the fix. The same listener demonstrably applies bars insets correctly, which is strong circumstantial evidence only. iOS: mobile/ios does not exist on master; Xcode 27 IS now installed; CocoaPods is NOT; @capacitor/ios is installed; docs/IOS.md exists (194 lines) but its code has never been compiled.
auditעשרה אנשים שנרשמו לניסיון נעולים עכשיו מחוץ למערכת כי אף אחד מהם לא השאיר כרטיס אשראי, ואף אחד מהם לא הפך ללקוח משלם. בנוסף תיקנתי מסך שביקש מהם לשלם בלי להגיד כמה. החיובים של הלקוחות הקיימים עובדים תקין.
Night QA of billing, plans and signup screens. FINDING 1 (headline): live read-only query found 10 accounts with billing_status='trial', trial_ends_at in the past, not partners, and ZERO with a cardcom card on file. Longest locked out 19 days (טסט 3). Two had real usage: value-x imported 161 contacts, ארבע כנפות has 14 contacts and 1 message. None converted. All 10 hit productAccessBlock -> trial_expired and see only the payment recovery path. Root cause: PR #313 (card at onboarding) has been open and unmerged since 23.09, so every self-serve signup since reaches day 7 with no payment method. Recorded as BILLING-006 in docs/TASKS.md. FINDING 2 and the only thing I changed: ProductAccessGate, the screen those 10 people see, calls billing-page whose operation resolves to ChargeAndCreateToken for an account with no card, charging the first period on completion, while the screen named no amount anywhere. The customer first met a price at Cardcom after deciding to click. Its copy also said 'choose a plan' when the route deliberately refuses a body-supplied plan and looks it up on the account. Fixed in PR #389 commit f20c86e: the amount now renders above the button via billing-summary (which applies monthlyAmountFor, so an agreed rate quotes the agreed rate) with purchaseAmount applying the cycle, same resolver the charge uses. Fails open: fetch is caught, line absent if summary fails, button never disabled on it. ProductAccessGate exported so it is renderable and testable; tests assert that anchor explicitly because without it the slice collapses and every assertion fails for the wrong reason. FINDING 3: a failed charge is invisible to the customer. past_due deliberately keeps product access and there is no banner anywhere in wa-client.tsx; past_due appears only in billing.tsx, partner.tsx and accounts.tsx. Customer learns only by opening the payments screen while the sweep retries the card every 24h indefinitely. Urgency stated honestly as LOW: 7 charges in the last 30 days, all 7 succeeded, zero failed, earliest stored card expiry is 05/27. Recorded as BILLING-007. ALSO PROVEN: the 46-character ExternalUniqTranId from PR #300 has now carried 7 real charges, not just the one on 23.09. VERIFICATION: npm test exit 0 with 3606 passed 0 failed, typecheck exit 0, build exit 0, and GitHub CI 'verify' PASSED in 4m32s, so the CI-001 account block is resolved. NOT VERIFIED and the reason PR #389 is NOT merged: the browser pane host was unreachable all night (PreToolUse hook timeout, retried four times), so I never looked at the screen I changed. I am not merging an unseen UI change on the billing path overnight; CI is green so it is a one-glance merge. NOT DONE: no charge, no refund, no subscription change, no Cardcom call, no migration. All database access read-only after verifying ref shxsdijepxzybjjhxxjz.
checkמספר סרוק של יריד החשמל, הערוץ הגדול ביותר במערכת, מנותק שלושה ימי עבודה ולא מקבל הודעות. בסך הכל שישה מספרים מנותקים אצל לקוחות פעילים, היו ארבעה. בנוסף מצאתי שהמסד עובד קשה מאוד בחינם על טבלה אחת, ותיקנתי אזהרת אבטחה אחת.
ריצה 2 (משימת לילה). תקין עם ראיה: cron חי (evo_checked_at לפני 9 שניות), תור שליחה 0 באיחור 10 ממתינים 0 תקועים, 0 כשלים ב-15 דק, נכנס חי (הודעה לפני 47 שניות), 35 ערוצי ענן (היה 25) ו-10 סרוקים. H-001 החמיר מ-4 ל-6: יריד החשמל active 59319 הודעות 944 אנשי קשר מנותק מ-08.10 11:59 (inbound אחרון 11:04), yotam חשבון deleted ולכן רעש אזעקה ולא לקוח, חכמים פיננסים 26 יום, מאור 48 יום, stealth ו-ארבע כנפות 24 יום. ריצה שנייה רצופה, אף ערוץ לא חזר ב-17 יום. המלצה: לדלג על ערוצים בחשבון deleted/suspended. H-002: 197 מתים (היה 183) אבל הסוג התחלף, תגובות אימוג׳י נעצרו ב-18.09 וכל 14 החדשים הם message edit original not found yet, נמסר לנתיב הוואטסאפ. H-004 שופר: 48 start 14 ok, כשלים timeout 38 no_code 21 cancel 15 save 2, הצלחה 17% ל-29%, cancel נמדד בנפרד עכשיו. H-006 הממצא הגדול ולא ברשימת ההמלצות: wap_webhook_events 568MB 272499 שורות 84552 seq_scan שקראו 6.27 מיליארד שורות. שורש מ-pg_stat_statements: claim_wap_webhook_events 383138 קריאות, ה-WHERE הוא OR בין status=pending/available_at ל-status=processing/lease_until, ושני האינדקסים החלקיים מכסים כל אחד צד אחר, ולכן הפלאנר בוחר seq scan. המלצה לנתיב הוואטסאפ: אינדקס על (status, available_at, received_at, id) או פיצול ל-2 שאילתות. לא נגעתי, זו הטבלה שלהם לפי המנדט. H-007: הגיבוי קורא את כל הטבלה, select * עם offset, 546 קריאות ב-474ms ו-681 ב-265ms, כי wap_webhook_events בשורה 121 של lychee-backup-contract.mjs. תוקן: work_items_touch search_path נעוץ (linter 0011), PR #385 מוזג 2d924f4, verify עבר 4:32, הדומיין החי מחזיר אותו קומיט, proconfig=search_path="", טריגר הוכח יורה בטרנזקציה שגולגלה לאחור, work_items נשארה 13 שורות ו-0 נגעו. לא נגעתי בכוונה: הרחבות pg_trgm ו-moddatetime (3 אינדקסי trgm ו-11 טריגרים תלויים, דורש מיגרציה מתוכננת), 90 טבלאות RLS ללא policies (בכוונה לפי AGENTS.md, deny מכוון, אסור לתקן), 40 FK בלי אינדקס (מויינו לפי גודל וסריקות, אף אחד לא שווה, הטבלאות זעירות או כבר משורתות), 35 אינדקסים לא בשימוש (לא נמחקו, רבים שייכים לפיצ׳רים חדשים), Auth connections 10 (הגדרה, לבוקר). תיקון תיעוד: CI-001 ו-PROJECT-STATE אומרים שהאקשנס חסום מאז 22.09, זה לא נכון יותר. מצב ב-business-brain/projects/lychee-health-runs.md
deployכשחיבור Make לליצ'י נכשל בגלל מפתח, Make מציג עכשיו מה הבעיה ומה לעשות, במקום שגיאה כללית.
PR #380 (dbaf0f6) was merged earlier but Vercel built no deploy for it; it went live with #382 (6ef88ab). Verified: fake key lyc_live_00000000_not_a_real_key on /api/wap/make-channels returns 'מפתח ה-API לא נמצא בליצ׳י. ייתכן שהועתק חלקית...' instead of 'נדרשת התחברות'.
fixמי שכתב פעם 'הסר' ופונה שוב מקבל עכשיו תשובה מלאה מהבוט, והודעות שאנחנו יוזמים עדיין לא נשלחות אליו. נוספה גם אפשרות להמשיך כשלקוח לא ענה על כפתורים בזמן.
PR #382 merged 6ef88ab, live on /api/wap/version. contactInitiated on RunNodeArgs (message trigger, followAnswer, resolveTextAnswer) -> purpose service; otherwise marketing. send_buttons now gated by optedOut. Step detail: "לא נשלח: איש הקשר ביקש להפסיק לקבל הודעות (כתב '...')". TIMEOUT_PORT on send_buttons/send_template with buttons, answer_timeout_seconds, question_timeout row, conditional claim in followAnswer. Canvas exit row ps-8 pe-3.5. tests/optout-in-flows.test.ts 18 (16 fail on old code); npm test 3617/3617. No migration, no sends, Noga opted_out_at untouched.
buildהבקשה לאישור של מטא הוגשה: אינסטגרם, Messenger ולידים, יחד עם חידוש הוואטסאפ. מטא אומרת שרוב הבדיקות נגמרות תוך 20 יום
Submission 1766306414625917 submitted 10.10.2026 ~21:25 IL; status 'Review in progress'. 10 new: pages_manage_ads, business_management, instagram_business_manage_comments, instagram_business_basic, instagram_business_manage_messages, pages_show_list, pages_manage_metadata, pages_read_engagement, leads_retrieval, pages_messaging; renewal: whatsapp_business_messaging, public_profile, whatsapp_business_management. 6 captioned videos (Page+forms, business_management, Messenger, IG messages, IG comments, IG basic). Proofs on prod 10.10: Messenger in+out (thread b4055f2b), IG DM reply to matanbic, IG comment webhook (first ever) + public reply + private reply, keyword rule LYCHEE-TEST on reel 17981054336969695 (active, for the reviewer). Data handling: added OpenAI as processor (AI agents on WhatsApp). Reviewer instructions: Messenger is self-serve (reviewer connects own Page); test Page Lychee App Review currently disconnected from all accounts. Known weak spot: IG basic video has no consent-screen frame (IG login needed password).
deployתיקון לוח הבקרה והכניסה עם גוגל עלו לאוויר ועובדים כבר עכשיו בלי להתקין כלום. תיקון המקלדת דורש גרסה חדשה של האפליקציה, אז בניתי והעליתי אותה לגוגל והיא בבדיקה. בנוסף סיכמנו עם סשה שמעכשיו שינוי קוד רגיל שעבר בדיקות אני מעלה לבד, ורק דברים שאי אפשר לבטל נשארים באישור שלו.
PR 343 merged to master as 540a541 and deployed: /api/wap/version returns 540a541, /wa/login 200, /api/wap/auth 200, /wa/dashboard 307 without a session. Dashboard mobile fix and the earlier Google-sign-in-hidden-in-webview fix are live for every phone immediately, since the Capacitor shell loads server.url rather than bundled assets. KEYBOARD FIX IS NATIVE and could not travel that way: built versionCode 3 (versionName 1.0, minSdk 24, targetSdk 36, windowSoftInputMode=adjustResize confirmed in the merged manifest, signing cert SHA-256 95:A9:81:38:... matching the upload keystore), uploaded to Alpha closed-testing track 4699507504444821997 and submitted for Google review. Play device table: 12,345 phones supported, ZERO devices losing support versus version 2. Zero blocking errors; one non-blocking deobfuscation warning as before. POLICY: Sasha asked why merges waited on him when CI was green; recorded a decision in AGENTS.md House rules - code-only changes with green CI are merged by the agent and reported after, while migrations, anything that sends to a real person, and provider state (Meta/Cardcom/Make/Play) still require explicit approval every time. Rationale recorded as reversibility, not QA confidence. PR 378 open with the version bump and the policy.
checkלראשונה הודעת Messenger לדף הגיעה לליצ'י וגם נענתה משם בהצלחה, וצולם עליה סרטון להגשה למטא
Sasha messaged test Page Lychee App Review (1357487447445381). 2 inbound events processed in ~1s (thread b4055f2b). Reply sent from Lychee console 10:58Z: wap_social_messages status=sent with mid. Video 3-pages_messaging.mp4 uploaded; pages_messaging now complete in submission 1766306414625917 (7/10 new permissions complete).
buildדף הבדיקה של מטא נותק מחשבון ליצ'י כדי לעבור לחשבון של הבודק, וחשבון הבודק קיבל את אפשרות הלידים
Disconnected Lychee App Review page from account c257dd3f (removed_at 11:02Z; history kept). META_LEADS_ADS_ACCOUNTS += 6fe6131f (Meta App Review) so its Facebook login uses pilot config 1453837333282070 with leads_retrieval. Redeployed current prod dpl_8jC134CXB9rkSobdvcCn1FGX8MGf (540a541, same code) to load env. Live probes 12/12. Next: Sasha logs into Meta App Review account; connect page there + Messenger on.
bugfixתיקנתי שני דברים שסשה דיווח עליהם באפליקציה: שורת הכתיבה שהייתה מתחבאת מתחת למקלדת ולא אפשרה לראות מה כותבים, ולוח הבקרה שלא היה מותאם למסך טלפון והמספרים בו נשברו לשתי שורות. בדקתי גם את שאר המסכים ולא מצאתי בעיות נוספות. התיקון עדיין לא עלה לאוויר, הוא ממתין לאישור מיזוג.
Two bugs reported from a real Android install. (1) KEYBOARD: MainActivity.keepContentOutFromUnderTheSystemBars() requested only systemBars()|displayCutout() insets and returned WindowInsetsCompat.CONSUMED. Type.ime() was never requested and CONSUMED stopped insets propagating, so the window never shrank and window.visualViewport.height never changed. The existing iOS-oriented visualViewport handler in wa-client.tsx (drives --wa-viewport-height, used by the shell at line ~943) therefore never fired on Android. Fix: bottom padding = max(bars.bottom, ime.bottom); plus android:windowSoftInputMode=adjustResize on MainActivity for API 24-29 where ime() insets are unreported. No double-shrink since visualViewport measures the already-resized WebView. (2) DASHBOARD: both stat grids used min-[360px]:grid-cols-2, giving ~90px text column at 375px. Counters now grid-cols-2 with whitespace-nowrap value, text-[25px] and w-10 icon below sm; the four service cards now grid-cols-1 below sm so their explanatory note survives. Desktop (sm/xl breakpoints) unchanged, re-verified at 1024px. VERIFICATION: both grids reproduced at 375px from exact shipped markup in an isolated harness, measured before/after - zero clipped elements, zero horizontal overflow, all values/labels/notes single-line. Android assembleRelease OK, tsc clean, 3579 tests pass, next build OK. Static sweep of all src/app/wa/*.tsx for phone-breaking layout: 35 candidates, all triaged as safe (behind md:, inside overflow-x-auto, or small-button grids). Public pages audited at 375px in real mobile emulation: /wa/login clean (0 overflow, 0 small targets, 0 em dashes); /wa/signup has 1 touch target under 44px (Google rendered button). UNRESOLVED: horizontal scrollbar seen in the report - not the grids, not the shell (main has min-w-0 + overflow-hidden); could not reproduce because Chrome would not apply mobile emulation to an authenticated page. Branch lane/mobile rebased onto master, commit 705d208, PR 343 open and NOT merged - so neither fix, nor the earlier Google-sign-in fix, is live yet.
featureהודעה עם כפתורים באוטומציות מקבלת עכשיו עד 10 אפשרויות: עד 3 נשלחות ככפתורים, ומעל 3 כרשימה שנפתחת מכפתור אחד.
PR #377 merged adb97bc, verify success on head ed2a38c, live via /api/wap/version. Meta docs 09.10: reply buttons max 3 title 20; list max 10 rows, row title 24, opener 20, section title 24 required. New src/lib/wap-reply-options.ts (replyInteractive, replyShape, limits; one option length 20). cloudSendButtons sends button<=3 / list 4-10, id=title=option text so list_reply routes by label. FlowNode.list_button (opener, default בחירת אפשרות), normalizeButtons caps 10, lint for >10 and opener>20, flowForSave trims opener. Editor: up to 10 boxes, opener field above 3, ReplyOptionsPreview. Palette hint, public API doc, AUTOMATION-STUDIO.md updated. Scanned numbers still run no automations (wap-channel-caps). Tests: reply-options.test.ts (4 fail on old code), automation-draft-api test updated for the 3-cap; 3579 pass, tsc, build. No real messages sent. Builder screenshot not taken: app session in Chrome logged out.
featureבתבניות בליצ׳י אפשר עכשיו עד 10 כפתורים. מעל 3 כפתורים וואטסאפ מציג שניים ועוד "הצגת כל האפשרויות" שפותח את כולם כרשימה, והתצוגה המקדימה מראה בדיוק את זה.
PR #376 merged 810d952, verify success on head 9c5ded8, live via /api/wap/version. Meta components doc checked 09.10: 10 quick replies, 25 chars, >3 shows 2 + See all options, 4+ not rendered on WhatsApp desktop. New src/lib/wap-template-buttons.ts (limits, templateButtonsAsShown, templateButtonProblems) used by wap-template-submit.ts (was 3 buttons/20 chars) and both editors in wa-client.tsx (TemplateButtonsPreview, BUTTONS_HINT). Public API doc string updated (importless catalogue, literal numbers). In-window interactive buttons (wap.ts:1123, wap-flow.ts:685) untouched at 3. Tests: template-ten-buttons.test.ts (limits, fold, 10 builder ports, button 7 routes to step 7, unwired 10th named) + template-submit-contract updated; 4 fail on old code; 3566 pass, tsc, build. Live UI check on app.lychee-ltd.com templates editor: 5 buttons -> 2 + fold + note; 11 -> warning and submit disabled; form cancelled, nothing submitted to Meta, no messages sent.
buildההגשה למטא התקדמה: חמש הרשאות מוכנות לגמרי עם סרטון, ההוראות לבודק נכתבו, וליאור הוזמנה כבודקת
Submission 1766306414625917. Fully green: business_management, pages_show_list, pages_manage_metadata, pages_read_engagement, leads_retrieval. pages_manage_ads: all but the API-call counter (24h lag; calls made). Missing screencasts: pages_messaging, instagram_business_basic/messages/comments (need Sasha: Messenger PIN blocks sending from this Mac; Instagram login needs password; 2nd IG account for DM/comment). Videos built from screenshots + Pillow captions + blur of client names (scratchpad/videos/1-facebook-page-and-lead-forms.mp4, 2-business_management.mp4). Reviewer instructions: merged old WhatsApp text (2 stale lines fixed: review account has 0 channels) + new IG/Messenger/Leads part; Facebook Login = Yes. Lior Nimni invited as Tester (pending). PR #374 merged (c10087b) and live; live probes 12/12. Test Page Lychee App Review: Messenger on (leadgen, messages, message_echoes); disconnected and reconnected during recording, state restored.
buildכל ההסברים בטופס ההגשה למטא מולאו, לכל עשר ההרשאות. נשארו הסרטונים, פרטי הכניסה לבודק והוראות לבודק
Submission 1766306414625917: descriptions + allowed-usage agreements saved for pages_manage_ads, business_management, instagram_business_manage_comments, instagram_business_basic (incl. how-to-test), instagram_business_manage_messages (incl. how-to-test), pages_show_list, pages_manage_metadata, pages_read_engagement, leads_retrieval, pages_messaging (page Lychee App Review + 6 reproduction steps). Texts adapted from docs/meta-app-review/permissions.md to the combined IG+Messenger+Leads round; claims re-checked in code (comment rule limits, no AI on social messages, WhatsApp status panel fields). Still missing: 9 screencasts, comments post link + keyword, reviewer instructions text, test credentials (Sasha), pages_manage_ads counter (24h lag).
fixתוקן מצב שבו מי שחוזר מפייסבוק אחרי חיבור דף מקבל הודעת 'נדרשת התחברות' במקום שהחיבור יושלם. התיקון מחכה לבדיקות ואז לעלייה לאוויר
PR #374 claude/meta-callback-bounce: proxy answers a cookie-less first arrival at /api/wap/meta-leads/callback or /api/wap/instagram/callback with an HTML page that location.replace()s the same URL + lychee_bounce=1 (same-origin, carries the Lax cookie); second cookie-less arrival -> /wa/login. Route auth unchanged (requireCaller + signed state). Tests 6/6 new, 3551/3551 full, tsc 0, local curl 5 cases + browser bounce verified. Not yet proven on production.
checkליד בדיקה מפייסבוק הגיע לליצ'י תוך שנייה עם השם, הטלפון והמייל, בלי ליצור איש קשר ובלי לשלוח הודעה
Test Page Lychee App Review (1357487447445381), account c257dd3f (ליצ'י). Created lead form 1912920616783282 via Graph API (POST /{page}/leadgen_forms, page token, pages_manage_ads). POST /{form}/test_leads -> leadgen 1805224214010765. wap_leads row status=fetched at 11:25:55Z, contact_action=none, last_error null. Proves leadgen webhook + GET /{leadgen-id} (leads_retrieval) on production.
buildהתקדמנו בהגשה למטא: בוצעו הבדיקות שמטא דורשת לפרסום ולידים, והסעיף של הלידים בטופס ההגשה מולא
Graph API Explorer (app Builders 1713744276548798): new user token with ads_management + instagram_manage_comments (grant narrowed: 2 pages, 1 business, IG sasha_di only, WABA unchanged). GET me/adaccounts OK (ads_management). GET 1357487447445381/leadgen_forms OK (pages_manage_ads). IG comments call failed: instagram_basic not offered in explorer; not in the submission list anyway. Submission 1766306414625917: leads_retrieval description + agreement saved (green). API test calls green for all except pages_manage_ads (counter lag). Remaining: 9 descriptions, 9 screencasts, pages_messaging repro steps, reviewer instructions + test credentials.
buildהחשבון של אבי נמני בליצ'י מוכן לחבר דף פייסבוק ולקבל ממנו לידים. נשאר להוסיף את מי שמנהל את החשבון כבודק באפליקציה.
PR #371 merged c8706c7 (pinned 7df0f4b, CI success): leadsConfigFor(accountId) -> META_LEADS_ADS_CONFIG_ID for accounts in META_LEADS_ADS_ACCOUNTS, else META_LEADS_LOGIN_CONFIG_ID; harness moved to PostgREST v13.0.4 (v12.2.3 answered PGRST200 for the missing reseller table with embed, which managedCustomer does not tolerate; production answers PGRST205, checked read-only). npm test 3541/3541, tsc 0, round trip 194/194. Meta: new FB Login for Business configuration 'lychee leads pilot' 1453837333282070 (General, user token; business_management, leads_retrieval, pages_manage_ads, pages_manage_metadata, pages_messaging, pages_read_engagement, pages_show_list); Page webhook now leadgen + messages + message_echoes. Vercel production: META_LEADS_ADS_CONFIG_ID, META_LEADS_ADS_ACCOUNTS=b807d946-5570-4744-aac2-55ef588ab367 (אבי נמני הנדסה ובניין, trial), META_SOCIAL_ACCOUNTS += that account; deployment 12:31:21 after env; check-meta-social-live 12/12. Also found: reseller tables (#363) are not in production; code tolerates it there. Pending: Avi's person as Facebook Tester (needs developer account), then connect page, forms, mapping; verify with Lead Ads Testing Tool.
reviewבדקתי את התיקון שסשן אחר הכין לרשימה הנפתחת של האוטומציות ב-Make. התיקון נכון, אבל הוא עוד לא מוזג, כלומר התקלה עדיין חיה אצל לקוחות. מצאתי גם חור קטן בבדיקה שנוספה שם, שלא מכסה כתובת אחת.
Independent verification of PR #370 (branch fix/make-automations-dropdown-401), which is OPEN and NOT merged as of 2026-10-08T14:30Z, so the 401 is still live. Confirmed the diagnosis against origin/master: make/lychee/rpcs/channelAutomations/communication.jsonc calls /make-automations; the route DOES implement it (route.ts line 1176) but the path is in neither the proxy PUBLIC list nor EXTERNAL_ACTIONS. Audited all 14 URLs the Make app calls: make-automations is the only one missing from both. Tenancy on that handler is correct and needs no OWNED_BY_ID line: it scopes via callerChannelIds plus eq(account_id) and the requested channel_id only filters within the allowed set; pure read. PR diff reviewed and is correct: MAKE_DROPDOWN_READS is kept out of PUBLIC_ACTIONS so it does not become an MCP tool, scope is conversations:read, and it is excluded from EXTERNAL_MUTATING_ACTIONS. REVIEW FINDING: the new test in tests/make-app.test.ts globs only communication.jsonc, but the webhook attach and detach URLs live in make/lychee/webhooks/incoming-message/attach.jsonc and detach.jsonc, and that webhook own communication.jsonc carries no url at all. Measured: the test collects 14 actions and misses exactly make-incoming-message-trigger. It passes today only because that action is already registered, so it would not catch the same bug class in a future webhook. One-word fix: glob *.jsonc. Not posted to the PR and not pushed, since it is another agent branch. ALSO: my last_used_at fix from 22.09 (commit 383aaee) has been working for two weeks, 27 of 45 unrevoked keys now carry a value, most recent written one minute before this check. GitHub Actions billing block from 22.09 is resolved, master runs today are green. CORRECTION to the 22.09 assumption that the Make incoming-message trigger would not be used: wap_make_webhooks now holds one subscription attached 2026-09-26, with 21 deliveries all status delivered and zero dead, newest 2026-10-01.
fixאלדד ראה בטלפון הודעות חדשות מאילן ולא ראה אותן בליצ׳י. ההודעות נקלטו ונשמרו כל הזמן, אבל כל שיחה עם יותר מ-300 הודעות נפתחה על ההודעות הישנות ביותר ולא הראתה את האחרונות. תיקנתי, וזה עלה לאוויר. זה תיקן גם 20 שיחות ארוכות אצל לקוחות אחרים.
lycheelychee-whatsapp-sessionוואטסאפ 15:03· לפני 3 ימים
PR #367 (aaa4cce). Account cf8e3a52, official channel cdec5eb1 (054-915-4720, coexistence, paired scanned 9b0b3d46). Conversation with 972546223180 held 323 messages; inbound messages were stored (latest 2026-10-08 08:38 UTC, also 07.10 13:24, 07:17, 04:38). The messages action opened a thread with order(ts ascending).limit(300), the OLDEST 300, ending 06.10 11:00 UTC, exactly the last bubble in Eldad's photo. The rule dates from 0d23ecc on 22.07.2026. 20 official-number conversations were over 300 (longest 2,606); the Groups screen reads the same action. Fix: readThread in src/lib/wap-thread.ts asks newest first with the same limit and returns oldest first; since-poll unchanged. Proof against the live DB, read only: 300 rows ending 08.10 08:38, ordered, 24 previously hidden messages present. Restoring the old rule fails the new test. 3,479 tests, CI green on exact SHA 143aecc, production serves aaa4cce. Limitation: threads over 300 still cannot scroll back past the window. Eldad needs to reopen the conversation (no reload of data needed).
diagnoseכפתור הבדיקה אישר אצל סשה שהדפדפן כן הציג את ההתראה. זה אומר שכל המערכת עובדת עד המחשב שלו, ומה שמסתיר את החלונית הוא הגדרות ההתראות של ה-Mac עבור Chrome או מצב ריכוז. שלחתי לו הוראות בדיקה.
After PR #361 (6387eb7), Sasha reloaded and pressed the Settings test button. Its result read: the browser displayed the notification. That text is shown only when the worker posts lychee-test-shown, which it does after registration.showNotification resolves. So the full path is proven on his machine: server, VAPID signing, FCM accepted, his Chrome woke the worker, the worker displayed. The remaining cause is outside the product: macOS System Settings > Notifications > Google Chrome (and Google Chrome Helper (Alerts) on newer Chrome), alert style None, or Focus/Do Not Disturb. Chrome site permission is not the cause, since showNotification would reject without it. No code change. Changing OS settings is the user action, not ours.
fixסשה רענן ולחץ על כפתור הבדיקה וקיבל שההתראה נשלחה אבל לא קפצה חלונית. הסיבה הסבירה: הדפדפן ממשיך להריץ את מנגנון ההתראות הישן עד יממה גם אחרי רענון. תיקנתי כך שהקונסול מחליף אותו בכל טעינה, והכפתור אומר עכשיו אם הדפדפן הציג את ההתראה או לא. שחזרתי את התקלה והוכחתי את התיקון בדפדפן אמיתי.
PR #361 (6387eb7), records #362. The screenshot showed the Settings test button reporting sent, which means the push service returned 2xx, and no popup. Hypothesis: a browser re-checks a service worker on navigation at most once per 24h, so the reload kept the OLD worker (registered under an hour earlier); the old worker saw a focused console, suppressed, and did not know test payloads. The code never called registration.update(). Fix: refreshWorker() runs update() at the start of syncPushOwner on every console load, before the permission check. The worker posts lychee-test-shown to open windows after displaying a test; the Settings button listens for 6s before sending and words the result: displayed means the computer notification settings or Do Not Disturb; accepted but not displayed means an old worker, refresh and retry. Verification: 3,474 tests; three deliberate breakages each fail tests; CI green on exact SHA d3b7a89; production serves 6387eb7 and the live worker contains lychee-test-shown. Real Google Chrome: the OLD worker script (88741ee) was served at the production address to reproduce: console in front and focused plus a test push gave no popup (reproduced); after registration.update() the deployed worker replaced it, the same push displayed, and the page received the confirmation. NOT proven: that this was the cause on Sasha machine specifically (his browser cannot be inspected); the computer notification settings remain a second possible cause, which the button now distinguishes.
fixסשה שלח הודעה אחרי שהפעיל התראות במחשב ולא קפצה חלונית. מצאתי למה: כשהקונסול היה פתוח על מסך שאינו התיבה, ההתראה הושתקה בטעות. תיקנתי כך שהיא קופצת בכל מסך חוץ מהתיבה, והוספתי כפתור בדיקה בהגדרות. הוכחתי בדפדפן אמיתי, ועוד צריך שסשה ירענן את הקונסול ויבדוק שוב.
PR #359 (bc995e4) + records PR #360. Diagnosis before the fix, read only: the Lychee inbound message was stored at 10:01:02 UTC and the webhook event processed; account not blocked (billing_status none, not partner, no trial end); contact unassigned, multi_agent false; recipientsForMessage returned 2 people; 1 browser subscription filed under them (09:59:48 UTC, fcm.googleapis.com), so the server decided to notify. Root cause: lychee-sw.js suppressed the popup for any visible+focused console window, assuming the page chimes by itself; the page only chimes while the Inbox screen is open (notify() is called from inbox.tsx polling), so a person on Settings got neither popup nor sound. This violated the brief (works from another console screen) and the first tests encoded the same wrong assumption. Fix: the worker asks each visible+focused window over a MessageChannel whether it is showing the inbox and is silenced only by yes; no answer in 600ms = no; test payloads always show. Page: answerPresence/usePresenceAnswer, watching = view chats in a visible focused window. New web-push-test action + Settings button: sends a fixed notification to the caller own browsers only and reports push service statuses; refused sends now log status only. Verification: 3,461 tests; four deliberate breakages of the worker each fail tests; CI green on exact SHA 50941d0; production serves bc995e4 and the live worker contains the presence question; real Google Chrome against the DEPLOYED worker with focus confirmed throughout each case: another screen shows a popup, inbox shows none, test shows over inbox, a page that never answers shows one. Pushes were delivered straight to the worker via CDP so Googles push service was not part of this run. NOT confirmed: whether the first real failure was this bug or the computers own notification settings (sends were not logged); a signed-in session; the Settings test button. Sasha must reload the console once so the browser loads the new worker and page.
featureהוספתי התראות במחשב גם על קבוצות במספר סרוק, רק לאנשים שיש להם את מסך הקבוצות, ותיקנתי באפליקציה בעיה שהייתה עלולה להציג לנציג את הטקסט של שיחות שאינן שלו על מסך הנעילה. קבוצה פעילה לא מצלצלת על כל הודעה אלא בתחילת כל רצף, כדי שלא תציף. עוד לא ראינו התראה על קבוצה אמיתית, וצריך שמישהו יכתוב בקבוצה שלך כדי לבדוק.
PR #357 (e92b3dc) and records PR #358. Scanned numbers: the Groups screen lists is_group=true only (kind=groups), so a group is the only scanned-number conversation openable from a notification; my earlier proposal of one-to-one chats only was wrong and is recorded as such. processEvoEvent now rings for an incoming group message to exactly the people who may open it (groupChannelAllowed via providerChannelAllowed, plus assigneeMaySee as the guard enforces on every channel). Newness asked before the upsert (upsert cannot tell a repeat from a first delivery). Quiet-gap rule: a group that wrote in the last 5 minutes does not ring again; measured on the 10 scanned numbers over 7 days: 5,450 inbound group messages = 779 popups a day unthrottled, 202 a day with the rule across all ten. Click opens Groups on the right number and group, and is not armed for a person who cannot see Groups. Android FCM (mobile lane file, authorised by Sasha: do what is needed): devicesForChannel replaced by devicesForMessage using recipientsForMessage; previously an agent in an assigning account got message text for threads the console refuses to open, notifications-off was ignored, hide_text ignored. All 3 registered devices are admins today so nothing leaked. Now carries contact_id and the app opens the conversation (the console never read ?channel=). Verification: 3,441 tests, tsc and build clean, CI green on the exact amended SHA 21adb4e; 11 new tests drive the real Evolution intake (none existed), 5 deliberate breakages of it each fail tests, removing the assignment check fails 3 phone tests. Live: every column the rule reads exists in the real schema (checked because these functions swallow errors and a wrong column name would silence all notifications); real rule against real DB returned the registered phone owner among recipients in both testable accounts, read only, nothing sent; since deploy 37 Evolution messages saved, 0 errors, 20 unknown-instance events are other clients instances on the shared server, dropped by design. NOT proven: a ring on a real scanned number, the click into Groups in a signed-in session, FCM delivery to a real phone (never proven live). Known quirk not changed: processEvoEvent names a brand new group contact after the sender, so a first-seen group would be titled with a person name until a sync corrects it.
featureבניתי התראות במחשב: כשלקוח כותב, מי שעובד בחשבון מקבל חלונית קופצת גם כשהקונסול סגור, ולחיצה עליה פותחת את השיחה. ההתראה מגיעה רק למי שמותר לו לפתוח את השיחה, ובדקתי בדפדפן אמיתי שהיא קופצת. עדיין לא הפעלתי אותה אצל אף לקוח, וצריך שסשה יפעיל אצלו וינסה עם הודעה אמיתית אחת.
PR #355 (a77c3bd) and #356 (ca9cb36), verify green on the exact SHAs, production serves ca9cb36. Web Push with VAPID via web-push 3.6.7 (MPL-2.0). New table wap_web_push_subscriptions applied to shxsdijepxzybjjhxxjz after ref check: RLS enabled and forced, 0 policies, no anon grants, unique endpoint, cascade from wap_users; real register/move/forget/refuse-http round trip run and left 0 rows; anon key refused on read and write; generated types equal the hand-written block exactly. VAPID keys set in Vercel Production only (Preview not set); local copy of the private key deleted. Who is told: wap-notify-recipients.ts calls providerChannelAllowed and assigneeMaySee (extracted from conversationVisibleTo, parity test over every user/assignment/multi_agent combination). Notification starts before runAutomations/autopilotReply and is awaited after. 15 minute staleness cap so a queue replay cannot light every screen. Endpoint allowlist (fcm.googleapis.com, push.services.mozilla.com, push.apple.com, notify.windows.com) on a dot boundary against SSRF. Proof in real Google Chrome (throwaway non-incognito profile; incognito refuses push): subscribed through fcm.googleapis.com against the deployed /lychee-sw.js, real sender returned sent 1 failed 0, a NEW popup appeared with console closed, a second message replaced it, a focused window suppressed it. Synthetic data and a stub database, no customer touched. 75 new tests, 7 deliberate breakages each failed tests. NOT proven: offer card and settings switch in a signed-in session, click opening the conversation, a real Meta webhook. Decisions that deviate from the brief: offered as a small dismissible card, not a banner strip (team removed strips on 22.09, regression test guards it); scanned Evolution numbers deliberately not connected (owner personal phone, inbox cannot open them, one instance holds a 30,000 message group), guarded by a wiring test. Findings handed over, not fixed: mobile FCM devicesForChannel ignores assignment and Groups (2 of 29 multi-agent accounts have agents, all 3 registered devices are admins today); app deep link ?channel= is never read by the console; npm audit reports next, sharp, brace-expansion, fast-uri, all pre-existing.
פקודהביקשתי מסשן הקונסול של ליצ׳י לעבור לענן ולבנות במסך הכניסה אפשרות של שכחתי סיסמה.
Dispatched to 'ליצ׳י · קונסול, אתר ודוקס' (message dd76f3c4): commit+push then move_to_cloud (carry the open calendar thread), then build forgot-password. Findings: no self-service reset (admin user-password exists, own change needs current password); lychee has no email provider; 67 users, 39 with email usernames; wap_users has no phone, wap_accounts.phone is the owner's. Recommended: WhatsApp OTP (authentication template on the Lychee channel) for account owners, 'ask your admin' for team users, Google sign-in hint, generic response, hashed code 10 min, rate limit, sessions revoked. Email needs a provider (Sasha's call).
bugfixכפתור הכניסה עם גוגל באפליקציה לא עובד, וזו מגבלה של גוגל ולא תקלה אצלנו: היא חוסמת התחברות מתוך אפליקציה שמציגה אתר בתוכה. הסתרתי את הכפתור באפליקציה כדי שאנשים לא ילחצו על משהו מת, ובדפדפן שום דבר לא השתנה. כניסה עם מייל וסיסמה עובדת כרגיל.
Reported by Sasha from a real install. Two independent blockers, either sufficient on its own: (1) the GSI button uses ux_mode popup, and Android WebView opens no popups without setSupportMultipleWindows plus a WebChromeClient onCreateWindow handler, which Capacitor default lacks; (2) Google blocks sign-in from embedded WebViews by policy (disallowed_useragent). Mitigation in src/app/wa/google-sign-in.tsx: new useInsideTheApp() hook lazily imports @capacitor/core and checks isNativePlatform(); GoogleCredentialButton returns null and skips loading the GSI script entirely; GoogleAccountAccess (settings link card) also returns null, because otherwise it accepts a current password and then renders nothing where the button belongs. null state treated as do-not-show so the app never flashes a dead button. Browser unaffected. Affects three surfaces: /wa/login, /wa/signup, settings. Verified typecheck, 3181 tests, production build. NOT verified on a real device. Proper fix is native Google Sign-In via Play Services, requiring an Android OAuth client keyed to the Play App Signing certificate SHA-1. Commit a936da6 on lane/mobile, PR 343, NOT merged.
fixכשלקוח לוחץ על כפתור והמשך השיחה נתקע, זה נרשם עכשיו בהיסטוריה, והעורך מזהיר מראש על מעבר בין אוטומציות שלא יעבוד
PR #346 (claude/call-automation-chain-visibility, eef5895). runResumedBranch in wap-flow-run.ts records a failed wap_automation_runs row when a continuation resumed from wap_flow_waits throws or fails (e.g. call_automation into a chained target); still rethrows. automationTransferChainIssues in wap-flow.ts: blocker for transfer into a target that transfers again, warning for adding a transfer to an automation an active one calls; wired into automationValidationReport (editor + list). tsc clean, npm test 3327/3327, build ok with CI env, 7 new tests. Not merged, not deployed, no live rows changed. Live read-only evidence: channel ff5765e6 'שרה 3' runs 02.10 done with only remove_tag+send_buttons.
fixבבדיקה חיה של הבוט של שרה נמצא מסלול אחד שנתקע: לקוחה עם צבע רגיל שכבר עשתה החלקה לא קיבלה את השאלה הבאה. תוקן, ושאר המסלולים עברו בבדיקה חיה.
Live E2E via WhatsApp Web + manual runs, contact f6c49e6b (972526059554). Passed live: Sara2 3m-1y -> root yes -> organic -> offer -> 'כן אשמח' silent handoff (tags מעוניינת בתור + בטיפול מנהלת); Sara3 highlights with החליקה_בעבר=לא -> typed date saved to גוונים_מתי -> silent handoff; Sara3 highlights with =כן -> before/after -> 'לפני' -> root line, organic, offer -> 'לא עכשיו' -> 'אין בעיה, אני כאן לכל שאלה'; release node removes בטיפול מנהלת at each manual run start. FAILED live: Sara3 regular colour + החליקה_בעבר=כן -> call_automation to Sara2 refused by engine rule in wap-flow-run.ts (target contains call_automation -> chain blocked) because Sara2 called Sara4. Error left no trace in wap_automation_runs. Fix: Sara2 (298857c7) live steps/edges patched, call to Sara4 replaced by inline copy of Sara4 offer nodes (offer, offer_wants, mgr_offer_to_manager, offer_to_manager, offer_not_now, offer_done; else -> mgr_unclear). 19 nodes, zero call_automation. Backup of previous row in scratchpad sara2-before-inline.json. Re-verified: walker 33/33 incl. new chain-rule check, lintFlow 0 issues all six, dry-run simulator 0 blocked. Live re-run of the fixed path NOT done (browser click denied by permission classifier). Test contact field החליקה_בעבר set to כן for the test.
buildאינסטגרם, Messenger והלידים עברו למקום משלהם במחליף שבראש המסך, ליד וואטסאפ ווובינרים, כמו שסשה ביקש.
PR #344 merged 4f80c58 (pinned f14df84, CI success), live, check-meta-social-live 12/12. wa-client.tsx: third module 'social' ('רשתות חברתיות', tagline 'הודעות, תגובות ולידים', violet #7C3AED, AtSign) with views instagram, messenger, leads, removed from console views and CONSOLE_NAV_SECTIONS; modules gain licence (social -> console) used for BRAND/user module filtering; non-console section label from module navLabel. Browser QA 48/48, 136 shots (new switcher checks + gate-closed check). npm test 3320/3320, tsc 0. Verified live in Sasha's Chrome on account ליצ׳י: header shows the social module with Instagram, Messenger, leads. Also recorded SOCIAL-004 in TASKS: Facebook lead as a WhatsApp automation trigger for the Lead Ads round, with consent/template/caps conditions.
checkהודעה אמיתית מאינסטגרם הגיעה לליצ'י ונשמרה. הדרך מאינסטגרם לליצ'י עובדת מקצה לקצה.
First live Instagram webhook: wap_meta_social_events instagram/message status done, received 2026-10-02 18:58:10 UTC; signature verified (so INSTAGRAM_APP_SECRET is the right value); thread created (account ליצ׳י, sender username present, name null since the profile read is best effort), 1 inbound message, unread 1, 24h reply window open; wap_ig_accounts.last_webhook_at 18:58:10. Sender had no role on the app, so Meta delivers Instagram DMs to a tester account from anyone. Next: Sasha replies from Lychee (instagram_business_manage_messages call).
משימות פתוחות (100)
[עומרי [business]] לתאם שיחת טלפון בעניין התנהלות חשבונות - הוא בשעות הערב זמין
לפני 2 שע׳
[Eyal Barash [personal]] לבדוק הוספת מספר וואטסאפ נוסף לחשבון (בעיה טכנית עם Meta)
לפני 2 שע׳
[Gilad Ashkenazi [business]] לבדוק מודול של עדכון משתנים בליצי - לא עובד כשצריך לשמור משתנה מהודעה
לפני 2 שע׳
[Shani Berger Arad [business]] לעשות שיחה טלפונית קצרה (5 דקות) לפתרון בעיה של הקטגוריות/סטטוס בפולואפ
לפני 2 שע׳
[Sasha Dibka [personal]] לאשר/תיאום פגישה עם רון היום ב-13:00
לפני 2 שע׳
[Adi [business]] לעבור על המידע של matchme.co.il (5-10 דקות לפני הפגישה)
לפני 2 שע׳
[Shiri Sharon [business]] לקבוע מחדש פגישה ב-15:30 או בשלישי (לא הצליח להגיע בשל פגישה אחרת)
לפני 2 שע׳
[כפיר [personal]] לעזור לכפיר בחיבור מחדש של הוואטסאפ - הוא לא מוצא איפה עושים את זה
לפני 2 שע׳
[Sasha Dibka [business]] להעביר לחשבון שלו את כל ההודעות והמודולים של גרין + משיכה של כל הלקוחות ממטא
לפני 2 שע׳
[Sasha Dibka [business]] לבדוק את הסנריו של הסליקה ב-Make שלא שלח הודעה על ההסכם
לפני 2 שע׳
[Sasha Dibka [business]] לשלוח דף סליקה עם המודול של Make
לפני 2 שע׳
[Sasha Dibka [business]] לעשות מודול ב-Make שמחבר את הוואטסאפ ישירות לאוטומציות - עם התקנה והוראות
לפני 2 שע׳
[Sasha Dibka [business]] להתחבר לגרין API - לקחת מפתחות API וכל מה שצריך
לפני 2 שע׳
[אלפי הפקות] רכישת חבילת אופרציות נוספת ב-Make - אזלו ל-5%
לפני 4 שע׳
[י.איך כן] י.איך כן - לרכוש חבילת אופרציות נוספת ב-Make (אופרציות אפסו, תרחישים תקועים)
לפני 7 שע׳
[Sasha Dibka [personal]] סשה הבטיח לנשיר את ליצי השבוע (להשיק)
לפני 10 שע׳
[Shani Berger Arad [business]] סשה הבטיח לגשת למטא ולעשות את ההגדרות בשביל Shani
לפני 10 שע׳
[Sasha Dibka [business]] הם שאלו לגבי 'משהו אחר' בתרחיש שלא עובד - סשה בודק את זה
לפני 10 שע׳
[Sasha Dibka [business]] סשה הבטיח לתת מערכת CRM עם לידים/כניסות לוובינר/משפכים/ליצ׳י בתוך 2-3 שעות
לפני 10 שע׳
[Eyal Mendel [business]] לבדוק אפשרות ליצירת תגיות צבעוניות באוטומציה בליצ'י (כמו בביזנס) - הבחין שמודול התגים לא עונה על הצורך
לפני 22 שע׳
[120363411880682032@g.us [business]] דף נחיתה שלא עובד + בדיקה האם הדומיין הוחזר - צריך לבדוק מה הבעיה
אתמול
[120363411880682032@g.us [business]] דברים מחר על הבוקר וחיבור טופס - נחבר לו את הטופס
אתמול
[Ofek [personal]] תיאום שיחת זום של לקיחת גישות ותיאום ציפיות עם הצד השני - טעון תיאום (עדיף אחרי שלישי)
אתמול
[Sasha Dibka [business]] תשובה לשאלה 'מתי להגיע' - חסר מידע על זמן ההגעה
אתמול
[120363427283820483@g.us] צור קשר עם מתאמנות ללא תקשורת: קרין איטקין, שרה, נוגה לוי, ליאור צוקר, Shoham Journo
אתמול
[120363427283820483@g.us] דבור עם ארבל בן חמו על המשך הליווי - מסיימת בעוד 7 ימים (17/10/26)
אתמול
לרכוש חבילת אופרציות נוספת ב-Make (תקציב חודשי כמעט נגמר)
אתמול
[Maxim Baskin] החלטה על סופ״ש עם מקס - שישי או שבת, ואם רוצה ריבר
אתמול
[נועם נקדי שיווק דיגיטלי] אישור או דחיית פגישה בחמישי ב11:00
אתמול
[ליאור נמני [personal]] שלח את גרסה מעודכנת של הטריגר הראשון לפנייה (הווילות בכפר ס)
אתמול
[אישי] לקחת את אדי בשישי בערב - שטיפה אוטומטית של אוטו
אתמול
[Sasha Dibka [personal]] הפוך את החשבון לריסלר ובנה חשבונות ריסלר
אתמול
[120363405400636827@g.us [business]] בדוק באג - אנשים קובעים שיחות בלי שאלון או השאלון לא נכנס לפייברי
אתמול
[120363405400636827@g.us [business]] #59 סיבת שורש + תיקון לכך שההכשרה/החוזה לא נשלחו אחרי חתימת טק
אתמול
[120363405400636827@g.us [business]] #21 חזור לדניאל עם רשימה של כל התרחישים והמערכות שמשתמשים באותו שרת חיצוני או מפתח
אתמול
[Eyal Mendel [business]] הוסיף אופציה להודעה רגילה (ללא תבנית) לתפריט שיישלח ללקוחות חדשים
אתמול
[Sasha Dibka] Sasha ביקשה הצעת מחיר וממליץ לבדוק אפליקציות מותאמות - צריך להשלים שיחה עם נועם קודם
לפני 2 ימים
[Sasha Dibka] הבטיח להתכנס עם Sasha בברטאן ביום ראשון בשעה 15:00
לפני 2 ימים
[Adi] קבוע פגישה ביום ראשון 09/10 בשעה 16:00 - צריך להכין פיץ' ותשובות לשתי השאלות
לפני 2 ימים
[120363405400636827@g.us] הבטיח להתכנן שיחת חפיפה למחר עם כולם (אני, ג'וני, ניב) לעבור על כל המערכות והאוטומציות
לפני 2 ימים
[Sasha Dibka [business]] שיחה קטנה עם סשה על לינה (500 שקל בחודש)
לפני 2 ימים
[יובל צרפתי רדי אקשן [personal]] לדבר עם יובל 15 דקות על משימות פתוחות ומערכת (מועד: 10:20)
לפני 2 ימים
[. [business]] להעביר ארנונה על שם סשה (הגיש טופס, צריך לעקוב שתוקבל
לפני 2 ימים
[. [business]] להתקשר בראשון לטורנדו (מזגן) ולבדוק סטטוס ארנונה
לפני 2 ימים
[אוטומציות רדי אקשן [business]] לתאם פגישה ליום ראשון לעבור על המערכת
לפני 2 ימים
[Sasha Dibka [business]] לדבר עם נועם על הצעת מחיר לשירותי הודעות למתאמנים וליד-לידים
לפני 2 ימים
[שירה ברקו [business]] לשלוח את סקיל ה-AI ל-OpenAI (שירה ביקשה שסשה יעביר לאדם שעשה את הסקיל)
לפני 2 ימים
[שירה ברקו [business]] לתאם זום קצר עם שירה לדיון על AI skills ו-landing page design
לפני 2 ימים
[אישי] לבדוק אם יש מקום לקורספיט ב-20
לפני 2 ימים
[נראות כספים סשה דיבקה] לשלוח דוח תזרים ודוח תנועות מפורט
לפני 2 ימים
[אוטומציות רדי אקשן] לפתור את בעיית הכפילויות ביומן
לפני 2 ימים
[נועם נקדי שיווק דיגיטלי לבעלי עסקים בתחום הכושר] לקבוע פגישה כמו שצריך כדי להבין את העלויות
לפני 2 ימים
[עמית ועקנין [business]] לחבר דפים למערכת
לפני 2 ימים
[Sasha Dibka [business]] לנתח את הנתונים מהטופס לידים.
לפני 2 ימים
[Sasha Dibka [business]] לעדכן את מישקה על הפרויקט שלך.
לפני 2 ימים
[עומרי [business]] למצוא לקוחות בשביל הסוכן הקולי.
לפני 2 ימים
[Sasha Dibka [business]] להתעדכן במצגת שהזכרת.
לפני 2 ימים
[Sasha Dibka [personal]] לשלוח הכל לנעם
לפני 2 ימים
[🌆✨היוצרים 42 אשקלון✨🌆] לזרוק קרטונים תקועים בפיר
לפני 2 ימים
[אישי] שיחת טלפון להתחייבות על העדכונים בדשבורד
לפני 3 ימים
[Sasha Dibka] לרכוש 5000 קרדיטים ב175 שקל לפיירברי
לפני 3 ימים
[Gilad Ashkenazi] לשלוח תמונה או דוגמאות להדגמה
לפני 3 ימים
[אוטומציות | דניאל] לשחרר את המשתמש הנחסם
לפני 3 ימים
[אישי] שיחת טלפון למחר
לפני 3 ימים
[צליל נוימן] להעביר צליל את האיפיון של הפרויקט
לפני 3 ימים
[ניב אזולאי] דרוש קוד שקיבל
לפני 3 ימים
[Nadav Friedman [personal]] לספק מספר לקוחה קיימת
לפני 3 ימים
[Sasha Dibka [business]] לעדכן על מנת שהעניין יהיה מוכן
לפני 3 ימים
[נכה כספים סשה דיבקה [business]] להעביר מידע הכספים הנדרשים.
לפני 3 ימים
[יריד החשמל [business]] לברר מה הפלאפונים שאנחנו מעבירים
לפני 3 ימים
[Ofek [personal]] לעזור עם השיחה לגבי open finance
לפני 3 ימים
[Shiri Sharon [business]] לתאם פגישת זום
לפני 3 ימים
[120363408992870215@g.us [business]] לשלוח קישור לישיבה בזום
לפני 3 ימים
[אישי] מתי אח יקר
לפני 3 ימים
[Adi] תאשר את הפגישה בשישי.
לפני 3 ימים
[Genius Flow - הטמעת מערכת CRM] ודא שהכל תקין עם הלידים.
לפני 3 ימים
[Evyatar Twito] תתאם פגישה לראשון.
לפני 3 ימים
[Zlil Shilo] תקבע פגישה עם זליל לאחר 5.
לפני 3 ימים
[Sasha Dibka] תעדכן את עדי בבריאות הגדרות המערכת.
לפני 3 ימים
[Yonatan] ודא שהכל תקין עם המגה סנד.
לפני 3 ימים
[אישי] שלח לי את הלינק למערכת לומן.
לפני 3 ימים
[אישי] צריך לברר מה הפלאפונים שמעבירים.
לפני 3 ימים
[נ/logistics] תבדוק עם יואב לגבי העברת הכסף.
לפני 3 ימים
[נ/logistics] שתף את הדוח תזרים.
לפני 3 ימים
[אישי] להכין תוכניות לעליה ב-18:10.
לפני 3 ימים
[אישי] לבדוק לגבי וובהוק של מהטופס.
לפני 3 ימים
[Sasha Dibka] לא נשלח זימון ל-Zoom למחר.
לפני 3 ימים
[Saar Orus] דרוש גישה ללומן ל-API.
לפני 3 ימים
[Sasha Dibka] סגור אחי, תעשה זימון ל-Zoom.
לפני 3 ימים
[Sasha Dibka] תעדכן מה יקרה בקשר ללקוח שאתה מתקשר אליו.
לפני 4 ימים
[120363408992870215@g.us] תאשר את הזימון ל-10 בבוקר.
לפני 4 ימים
[matanel levy] לטפל באוטומטיזציה של העסק שלך.
לפני 4 ימים
[Dror Uzi] תשאיר לי תכנון שבועי.
לפני 4 ימים
[Sasha Dibka] תשלח לי משתמש וסיסמה לפינבוט שלך.
לפני 4 ימים
[Sasha Dibka] אל תשכח את השיחה ב-14:00.
לפני 4 ימים
[Assaf Buskila] איש יקר, תן לי זמנים לפגישה עם רועי השותף שלך.
לפני 4 ימים
[Sasha Dibka [business]] שלח לי אסמכתא עם פרטים לחשבונית
לפני 4 ימים
[Genius Flow - הטמעת מערכת CRM] בדוק שהאוטומציה של טופס הלידים של רחלה מחוברת לקבוצה
לפני 4 ימים
[120363408992870215@g.us] קבע זום עם הצוות למחר ב-10:30
לפני 4 ימים
[Sasha Dibka [business]] שלח לי endpoints
לפני 4 ימים