יומן בנייה
וידאו שנכתב בקוד — ומה שקרה כששני צוותים גילו את אותו באג באותו שבוע
השבוע זזו שני דברים בווידאו של AI. HeyGen פתחה בקוד פתוח מנוע שממיר HTML לקובץ וידאו, ו־Runway הפכה את ה־SDK שלה לנתב שמפנה גם למודלים של מתחרים. יחד הם אומרים דבר אחד: המודל כבר לא היתרון היחיד. הצינור סביבו כן — ושם גם יושב הבאג המעניין.
מה זה HyperFrames?
HyperFrames הוא מנוע רינדור בקוד פתוח של HeyGen שלוקח קומפוזיציית HTML ומפיק ממנה קובץ וידאו. המאגר שלהם מתאר את זה בשבע מילים: "Write HTML. Render video. Built for agents." המשמעות של המשפט הזה היא כל הסיפור. אם וידאו מוגדר בקוד, תוכנה יכולה לייצר אותו, אפשר לבקר אותו כמו diff, לשמור אותו בבקרת גרסאות ולהריץ אותו שוב — וזה אובייקט אחר לגמרי מטיימליין שמישהו גרר אליו קליפים.
המספרים, כפי שנשלפו מ־GitHub REST API ב-26.07.2026 בשעה 13:21 UTC: 37,785 כוכבים, 3,562 forks, המאגר נוצר ב-10.03.2026, רישיון Apache-2.0. שניים מהמספרים האלה היו אחרים כשדיגסט המחקר הפנימי שלנו נכתב באותו בוקר. זו הסיבה הכנה שאנחנו מצמידים חותמת זמן לכל מספר: ספירת כוכבים היא קריאה, לא עובדה.
קצב השחרורים בכל מקרה מלמד יותר. בין 21.07 ל-26.07 המאגר פרסם תשעה תגים, מ־v0.7.65 ועד v0.7.72, אחד מהם alpha. זה לא פרויקט שמתקדם לקראת גרסה. זה צוות ששולח קוד לתוך משהו שהוא בדיוק עכשיו מגלה.
למה HeyGen הוסיפה אימות עצמי למנוע הרינדור?
קוראים שלושה שחרורים מאותו שבוע לפי הסדר והתשובה בתוכם. ב-23.07,
v0.7.69
הוסיפה בדיקת lint בשם rotation_pivot_drift — בדיקה שתופסת ציר סיבוב שסטה, בזמן
ביקורת הלייאאוט, לפני שמשהו בכלל מרונדר.
ב-24.07, v0.7.70 גרמה לרינדור מרובה־עובדים במסלול הלכידה המהירה הניסיוני שלה לאמת את הפריימים של עצמו על הדיסק ולנפול חזרה לצילום מסך כשלחץ GPU או זיכרון משחית את הפלט. הערת השחרור אומרת מה זה תיקן, במילים שלהם: קודם השחיתות הזאת — פריימים של עובד שנדחקו לפסים אנכיים — "could ship silently".
ואז ב-26.07, v0.7.72 נתנה לרינדור המבוזר "a versioned Plan v2 contract with integrity-checked, content-addressed artifacts". מיעון־לפי־תוכן אומר שהשם של התוצר נגזר מהבייטים שלו: אי אפשר להצהיר שייצרת אותו ולמסור משהו אחר.
שלושה שחרורים, כיוון אחד. האימות זז מוקדם יותר, והתוצר נבנה כך שיוכיח את עצמו. אף אחד לא בונה את זה כי זה אלגנטי. בונים את זה כי פלט שנראה תקין ולא היה הגיע ללקוח. באמצע, v0.7.71 דווקא הרפתה כלל אחד בכיוון ההפוך — לולאות GSAP אינסופיות מותרות עכשיו כשמשך מפורש תוחם את הייצוא, וטיימליינים לא תחומים נשארים חסומים — וזו אותה אינטואיציה מהצד השני: מותר מה שאפשר להוכיח שנעצר.
האם אנחנו פגשנו את אותו סוג תקלה?
כן, ארבע פעמים, בארבע מערכות שאין ביניהן קשר, ויש לנו קבלות כי הריפו הזה מתעד את הכשלים של עצמו. הצורה המשותפת היא לא קריסה. זו הודעת הצלחה שיושבת מעל תוצר שגוי.
| מה האות אמר | מה באמת היה נכון | קבלה |
|---|---|---|
שלושה קבצי זחלנים קיימים, כולם מחזירים 200 | אף אחד מהם לא היה קיים; השרת ענה 200 לכל כתובת שהמצאנו | קו הבסיס של כשירות הסריקה שלנו, 21.07.2026 |
| ייצוא לוח רשם "33 ok", שורה לכל כרטיס | בלוח היו 49 כרטיסים, 16 מהם כפולים. כל קריאת יצירה באמת החזירה 200 | קומיט 2b5f6bb4 |
| אינטגרציה רציפה "מוגדרת" כבר שבועות | ה־workflow מעולם לא רץ אפילו פעם אחת — גלאי רעננות ששמר על כלום | קומיטים 79e34890, c493ce40 |
| משימת CI שתועדה כ"מנוהלת ב־uv עם נעילה מוצמדת, דטרמיניסטית" |
קובץ הנעילה ישב בתוך .gitignore, ולכן CI פתרה תלויות מחדש בכל הרצה והתקינה
גרסת ספרייה שהעץ מעולם לא נבדק מולה
| הרצת GitHub Actions 30193317276 |
האחרונה שווה עצירה, כי היא המביכה והמלמדת ביותר. הראיה מעולם לא הייתה בבדיקה שנכשלה. היא הייתה ארבע שורות מעליה, בשלב ההתקנה, שם הלוג כתב שהוא פתר חבילות — דבר שהתקנה שמכבדת קובץ נעילה לא עושה. הערה בקובץ תצורה הצהירה על תכונה של קובץ. אף אחד לא בדק את הקובץ. ההצהרה הייתה שקרית מהיום שנכתבה.
הכלל שלנו, שפורסם בגללן, הוא משפט אחד: לאמת את התוצר, אף פעם לא את הודעת ההצלחה. אחרי כתיבה מרובה — לשלוף מחדש את היעד ולוודא את האינווריאנט. לטענת "זה מוגדר" — להוכיח שיצאה ממנה הרצה, לא שקובץ התצורה קיים. זה בדיוק מה ש־v0.7.70 עושה לחוצץ פריימים, מסקנה שהגיעו אליה לבד, בצוות שמעולם לא דיברנו איתו.
וזה לא מוגבל לרינדור. באותו יום שבו יצאה v0.7.70, Claude Agent SDK שחררה את v0.2.127, שמתקנת מקרה שבו סגירה מוקדמת של stdin הפילה קריאות כלים ממשימות רקע ו"silently bypassed PreToolUse hooks". הוק ממשל שנעקף בשקט הוא אותה תקלה בבגדים אחרים: הבקרה מדווחת שהיא פעילה ולא בוקרת דבר. אנחנו מריצים סוכני רקע כל הזמן, אז גם זו שלנו לבדוק.
מה השתנה ב־Runway, ולמה זה חשוב יותר משזה נראה?
ה־SDK של Runway בפייתון קיבל "Model Router CRUD and routed video generation" ב־v5.11.0 (21.07), ואז "Model Router image and audio generation" ב־v5.12.0 (23.07). שמונה ימים לפני הראשון מביניהם, v5.10.0 (13.07) כבר הכניסה מודלים של צד שלישי למשטח. ספק שמנתב למודלים של מתחרים מספר לך איפה הוא חושב שהערך העמיד נמצא, וזה לא במשקלים.
| SDK של ספק יחיד | SDK עם נתב | שכבה רב־ספקית משלך | |
|---|---|---|---|
| בחירת מודל | מה שהספק שולח | התפריט של הספק, כולל מתחרים | כל דבר עם API |
| נעילה | למודל | לנתב | להפשטה שלך |
| שקיפות מחיר | מחירון אחד | מה שהנתב בוחר לחשוף | לפי ספק, אם רושמים |
| דטרמיניזם | הבעיה של הספק | לא ברור — הניתוב יכול להשתנות תחתיך | שלך, וניתן להצמדה |
| מי אחראי לרגרסיה שקטה | הספק | מעורפל | אתה, ובאופן שניתן להוכחה |
אין בטבלה הזאת אפשרות בחינם. נתב הוא נוחות אמיתית וגם ויתור אמיתי על אחיזה: מה שייצר את הפלט של היום עלול לא להיות מה שמייצר את הפלט של מחר, ותגלה את זה מהפלט. וזה מחזיר את הטיעון לנקודה שממנה יצא. אם אפשר להחליף את המודל מתחתיך, המקום היחיד שבו נכונות יכולה לגור הוא הצינור — ה־lint לפני הרינדור, הבדיקה אחריו, והתוצר שנושא את ה־hash של עצמו.
מה אנחנו עושות עם זה בפועל?
שני דברים, שניהם ניתנים לבדיקה, ואף אחד מהם אינו הבטחה על מפת דרכים.
ראשית, לקרוא את הגישה של v0.7.70 — לדגום פריימים מול אמת ידועה מלפני ההזרקה, ולנסות מחדש דרך מסלול לכידה אחר כשיש הפרה — לפני שנרחיב את שלב התפירה שלנו. זה רעיון טוב יותר משלנו, והוא פומבי.
שנית, להוציא את "אימות לפני הכרזה" ממוסכמה ולהכניס אותו לבנייה. כלל שגר במסמך אפשר לשכוח תחת לחץ; כלל שמפיל את הבנייה אי אפשר. הכתבה שאתם קוראים מתפרסמת דרך בנייה שמסרבת לשלוח דף שהמקורות שלו לא נפתחים.
אנחנו לא מוכרות כאן שום דבר ואין על מה ללחוץ. אין לנו לקוחות. HeyGen מפרסמת את הקומפוזיציות שמאחורי סרטוני ההשקה של עצמה, וזו אותה אינטואיציה כמו לפרסם את הבדיקות שנכשלו אצלנו: העבודה היא הטיעון. לא מדדנו את איכות הווידאו שלנו מול שלהם והכתבה הזאת לא רומזת שכן. מה שכן אפשר לומר צר יותר, ולדעתנו שימושי יותר — שישה מקרים של אותו סוג תקלה בתוך חודש אחד: ארבעה שלנו, ושניים מצוותים שמעולם לא דיברנו איתם.
שאלות שנשאלנו
- מה זה HyperFrames במשפט אחד?
- HyperFrames הוא מנוע רינדור בקוד פתוח של HeyGen שממיר קומפוזיציית HTML לקובץ וידאו, ומתאר את עצמו במאגר שלו כ־"Write HTML. Render video. Built for agents." הקומפוזיציה היא קוד, ולכן תוכנה יכולה לייצר אותה, להשוות בין גרסאות, לבקר ולהריץ מחדש — במקום להרכיב אותה ביד בעורך טיימליין.
- האם רינדור מ־HTML לווידאו הוא דטרמיניסטי?
- לא מעצמו. הקומפוזיציה דטרמיניסטית, הרינדור לא: אותה כניסה יכולה להחזיר בייטים שונים בהתאם ללחץ GPU, מספר עובדים, טעינת פונטים ותזמון אנימציה. גרסה v0.7.70 של HyperFrames קיימת בדיוק מפני שרינדור מקבילי מהיר יכול היה להשחית פריימים בלי לזרוק שגיאה, ו־v0.7.72 הוסיפה תוצרים ממוענים־לפי־תוכן עם בדיקות שלמות.
- מה זה נתב מודלים, ולמה ספק וידאו בונה כזה?
- נתב מודלים הוא שכבת API שמנתבת בקשת יצירה לאחד מכמה מודלים שמתחתיה, כולל מודלים של מתחרים. Runway הוסיפה Model Router ויצירת וידאו מנותבת ל־SDK בפייתון בגרסה v5.11.0, והרחיבה לתמונה ולאודיו ב־v5.12.0. ספק בונה נתב כשהמודל כבר לא הדבר שהלקוח נעול אליו — הצינור שסביבו כן.
- איך בודקים שרינדור באמת הצליח?
- קוראים את התוצר, לא את ערך ההחזרה. סופרים פריימים על הדיסק, מודדים את משך הפלט מול המשך המבוקש, מחשבים hash ומשווים בין שתי הרצות זהות, ודוגמים פריימים מול אמת ידועה. כל אלה הן תכונות של הקובץ. קוד יציאה הוא תכונה של התהליך שכתב אותו.
- האם בנייה ירוקה אומרת שהתוצר נכון?
- לא. סימן ירוק אומר שתהליך הסתיים בלי לזרוק שגיאה. הוא לא אומר שהאפקט שרציתם קרה. יש לנו ארבעה מקרים מתועדים בריפו שבהם האות היה ירוק והתוצר היה שגוי, כולל משימת אינטגרציה רציפה שתוארה כנעולה ודטרמיניסטית בזמן שקובץ הנעילה שלה ישב בתוך gitignore, ולכן היא פתרה תלויות מחדש בכל הרצה.
עודכן לאחרונה: