פתרון בעיות: תהליכי עבודה
"Workflow not found or not accessible"
תהליך העבודה קיים אך שמור ברמת סיווג גבוהה יותר מרמת ה-taint הנוכחית של הסשן שלך.
תהליכי עבודה שנשמרו במהלך סשן CONFIDENTIAL אינם נראים לסשנים ברמת PUBLIC או INTERNAL. המאגר משתמש בבדיקות canFlowTo בכל טעינה, ומחזיר null (מוצג כ-"not found") כאשר סיווג תהליך העבודה חורג מ-taint הסשן.
פתרון: הסלם את taint הסשן שלך על ידי גישה לנתונים מסווגים תחילה, או שמור מחדש את תהליך העבודה מסשן בסיווג נמוך יותר אם התוכן מאפשר זאת.
אימות: הרץ workflow_list כדי לראות אילו תהליכי עבודה נראים ברמת הסיווג הנוכחית שלך. אם תהליך העבודה שאתה מצפה לו חסר, הוא נשמר ברמה גבוהה יותר.
"Workflow classification ceiling breached"
רמת ה-taint של הסשן חורגת מ-classification_ceiling של תהליך העבודה. בדיקה זו רצה לפני כל משימה, כך שהיא יכולה להופעל באמצע ההרצה אם משימה קודמת הסלימה את taint הסשן.
לדוגמה, תהליך עבודה עם classification_ceiling: INTERNAL ייעצר אם קריאת triggerfish:memory שולפת נתוני CONFIDENTIAL שמסלימים את taint הסשן.
פתרון:
- העלה את
classification_ceilingשל תהליך העבודה כך שיתאים לרגישות הנתונים הצפויה. - או ארגן מחדש את תהליך העבודה כך שלא ניגשים לנתונים מסווגים. השתמש בפרמטרי קלט במקום קריאת זיכרון מסווג.
שגיאות ניתוח YAML
"YAML parse error: ..."
טעויות תחביר YAML נפוצות:
הזחה. YAML רגיש לרווחים. השתמש ברווחים, לא בטאבים. כל רמת קינון צריכה להיות בדיוק 2 רווחים.
yaml
# שגוי — טאבים או הזחה לא עקבית
do:
- fetch:
call: http
# נכון
do:
- fetch:
call: httpחוסר מרכאות סביב ביטויים. מחרוזות ביטוי עם ${ } חייבות להיות במרכאות, אחרת YAML מפרש { כמיפוי מוטבע.
yaml
# שגוי — שגיאת ניתוח YAML
endpoint: ${ .config.url }
# נכון
endpoint: "${ .config.url }"חוסר בלוק document. כל תהליך עבודה חייב לכלול שדה document עם dsl, namespace ו-name:
yaml
document:
dsl: "1.0"
namespace: my-workflows
name: my-workflow"Workflow YAML must be an object"
ה-YAML נותח בהצלחה אך התוצאה היא סקלר או מערך, לא אובייקט. בדוק של-YAML שלך יש מפתחות ברמה עליונה (document, do).
"Task has no recognized type"
כל רשומת משימה חייבת לכלול בדיוק מפתח סוג אחד: call, run, set, switch, for, raise, emit או wait. אם המנתח לא מוצא אף אחד ממפתחות אלה, הוא מדווח על סוג לא מזוהה.
סיבה נפוצה: שגיאת כתיב בשם סוג המשימה (למשל, calls במקום call).
כשלי הערכת ביטויים
ערכים שגויים או ריקים
ביטויים משתמשים בתחביר ${ .path.to.value }. הנקודה המובילה נדרשת -- היא מעגנת את הנתיב בשורש הקשר הנתונים של תהליך העבודה.
yaml
# שגוי — חוסר נקודה מובילה
value: "${ result.name }"
# נכון
value: "${ .result.name }""undefined" בפלט
ה-dot-path לא התפרש לכלום. סיבות נפוצות:
- שם משימה שגוי. כל משימה שומרת את תוצאתה תחת שמה. אם המשימה שלך נקראת
fetch_data, הפנה לתוצאתה כ-${ .fetch_data }, לא${ .data }או${ .result }. - קינון שגוי. אם הקריאה HTTP מחזירה
{"data": {"items": [...]}}, הפריטים נמצאים ב-${ .fetch_data.data.items }. - הוספת אינדקס למערך. השתמש בתחביר סוגריים:
${ .items[0].name }. נתיבי נקודה בלבד אינם תומכים באינדקסים מספריים.
תנאים בוליאניים לא עובדים
השוואות ביטויים הן מחמירות (===). ודא שהסוגים תואמים:
yaml
# זה ייכשל אם .count הוא מחרוזת "0"
if: "${ .count == 0 }"
# עובד כש-.count הוא מספר
if: "${ .count == 0 }"בדוק אם משימות upstream מחזירות מחרוזות או מספרים. תגובות HTTP לעיתים קרובות מחזירות ערכי מחרוזת שלא צריכים המרה להשוואה -- פשוט השווה מול צורת המחרוזת.
כשלי קריאות HTTP
Timeouts
קריאות HTTP עוברות דרך כלי web_fetch. אם שרת היעד איטי, הבקשה עלולה לפוג. אין עקיפת timeout למשימה בודדת עבור קריאות HTTP ב-workflow DSL -- ה-timeout ברירת המחדל של כלי web_fetch חל.
חסימות SSRF
כל HTTP יוצא ב-Triggerfish מפרש DNS תחילה ובודק את ה-IP המפורש מול רשימת חסימה מקודדת. טווחי IP פרטיים ושמורים חסומים תמיד.
אם תהליך העבודה שלך קורא לשירות פנימי בכתובת IP פרטית (למשל, http://192.168.1.100/api), הוא ייחסם על ידי מניעת SSRF. זה בכוונה ולא ניתן להגדרה.
פתרון: השתמש בשם מארח ציבורי שמתפרש ל-IP ציבורי, או השתמש ב- triggerfish:mcp כדי לנתב דרך שרת MCP שיש לו גישה ישירה.
כותרות חסרות
סוג הקריאה http ממפה את with.headers ישירות לכותרות הבקשה. אם ה-API שלך דורש אימות, כלול את הכותרת:
yaml
- fetch:
call: http
with:
endpoint: "https://api.example.com/data"
headers:
Authorization: "Bearer ${ .api_token }"ודא שערך הטוקן מסופק בקלט תהליך העבודה או מוגדר על ידי משימה קודמת.
מגבלת רקורסיה של תת-תהליכי עבודה
"Workflow recursion depth exceeded maximum of 5"
תת-תהליכי עבודה יכולים להיות מקוננים עד 5 רמות עומק. מגבלה זו מונעת רקורסיה אינסופית כאשר תהליך עבודה A קורא לתהליך עבודה B שקורא לתהליך עבודה A.
פתרון:
- שטח את שרשרת תהליכי העבודה. שלב שלבים לפחות תהליכי עבודה.
- בדוק הפניות מעגליות שבהן שני תהליכי עבודה קוראים זה לזה.
הרצת Shell מושבתת
"Shell execution failed" או תוצאה ריקה ממשימות run
דגל allowShellExecution בהקשר כלי תהליך העבודה שולט האם משימות run עם יעדי shell או script מותרות. כאשר מושבת, משימות אלה נכשלות.
פתרון: בדוק האם הרצת shell מופעלת בהגדרות Triggerfish שלך. בסביבות ייצור, הרצת shell עשויה להיות מושבתת בכוונה מטעמי אבטחה.
תהליך העבודה רץ אך מייצר פלט שגוי
ניפוי באגים עם workflow_history
השתמש ב-workflow_history כדי לבדוק הרצות קודמות:
workflow_history with workflow_name: "my-workflow" and limit: "5"כל רשומת היסטוריה כוללת:
- status --
completedאוfailed - error -- הודעת שגיאה אם נכשל
- taskCount -- מספר המשימות בתהליך העבודה
- startedAt / completedAt -- מידע תזמון
בדיקת זרימת הקשר
כל משימה שומרת את תוצאתה בהקשר הנתונים תחת שם המשימה. אם לתהליך העבודה שלך יש משימות בשם fetch, transform ו-save, הקשר הנתונים לאחר שלוש המשימות נראה כך:
json
{
"fetch": { "...http response..." },
"transform": { "...transformed data..." },
"save": { "...save result..." }
}טעויות נפוצות:
- דריסת הקשר. משימת
setשמקצה למפתח שכבר קיים תחליף את הערך הקודם. - הפניה למשימה שגויה. הפניה ל-
${ .step1 }כשהמשימה נקראתstep_1. - טרנספורמציית קלט שמחליפה הקשר. הנחיית
input.fromמחליפה את הקשר הקלט של המשימה כולו. אם אתה משתמש ב-input.from: "${ .config }", המשימה רואה רק את אובייקט ה-config, לא את ההקשר המלא.
פלט חסר
אם תהליך העבודה מסתיים אך מחזיר פלט ריק, בדוק האם תוצאת המשימה האחרונה היא מה שאתה מצפה. פלט תהליך העבודה הוא הקשר הנתונים המלא בהשלמה, עם מפתחות פנימיים מסוננים.
"Permission denied" ב-workflow_delete
כלי workflow_delete טוען את תהליך העבודה תחילה באמצעות רמת ה-taint הנוכחית של הסשן. אם תהליך העבודה נשמר ברמת סיווג שחורגת מ-taint הסשן שלך, הטעינה מחזירה null ו-workflow_delete מדווח "not found" במקום "permission denied."
זה מכוון -- קיומם של תהליכי עבודה מסווגים אינו נחשף לסשנים בסיווג נמוך יותר.
פתרון: הסלם את taint הסשן שלך כך שיתאים או יעלה על רמת הסיווג של תהליך העבודה לפני מחיקתו. או מחק אותו מאותו סוג סשן שבו נשמר במקור.
ריפוי עצמי
"Step metadata missing on task 'X': self-healing requires description, expects, produces"
כאשר self_healing.enabled הוא true, כל משימה חייבת לכלול את כל שלושת שדות המטא-נתונים. המנתח דוחה את תהליך העבודה בזמן השמירה אם חסר כל אחד מהם.
פתרון: הוסף description, expects ו-produces לבלוק metadata של כל משימה:
yaml
- my-task:
call: http
with:
endpoint: "https://example.com/api"
metadata:
description: "What this step does and why"
expects: "What this step needs as input"
produces: "What this step outputs""Self-healing config mutation rejected in version proposal"
סוכן הריפוי הציע גרסה חדשה של תהליך העבודה שמשנה את בלוק התצורה של self_healing. זה אסור -- הסוכן אינו יכול לשנות את תצורת הריפוי שלו עצמו.
זה עובד כמתוכנן. רק בני אדם יכולים לשנות את תצורת self_healing על ידי שמירת גרסה חדשה של תהליך העבודה ישירות דרך workflow_save.
סוכן הריפוי לא נוצר
תהליך העבודה רץ אך סוכן ריפוי לא מופיע. בדוק:
enabledהואtrueב-metadata.triggerfish.self_healing.- התצורה במיקום הנכון -- חייבת להיות מקוננת תחת
metadata.triggerfish.self_healing, לא ברמה העליונה. - לכל השלבים יש מטא-נתונים -- אם האימות נכשל בזמן השמירה, תהליך העבודה נשמר ללא הפעלת ריפוי עצמי.
תיקונים מוצעים תקועים בהמתנה
אם approval_required הוא true (ברירת המחדל), גרסאות מוצעות ממתינות לסקירה אנושית. השתמש ב-workflow_version_list כדי לראות הצעות ממתינות וב-workflow_version_approve או workflow_version_reject כדי לפעול עליהן.
"Retry budget exhausted" / הסלמה בלתי ניתנת לפתרון
סוכן הריפוי השתמש בכל ניסיונות ההתערבות שלו (ברירת מחדל 3) מבלי לפתור את הבעיה. הוא מסלים כ-unresolvable ומפסיק לנסות לתקן.
פתרון:
- בדוק את
workflow_healing_statusכדי לראות אילו התערבויות נוסו. - סקור ותקן את הבעיה הבסיסית ידנית.
- כדי לאפשר ניסיונות נוספים, הגדל את
retry_budgetבתצורת הריפוי העצמי ושמור מחדש את תהליך העבודה.
