استكشاف الأخطاء: الأمان والتصنيف
حظر الكتابة للأسفل
"Write-down blocked"
هذا أكثر أخطاء الأمان شيوعاً. يعني أن البيانات تحاول التدفق من مستوى تصنيف أعلى إلى أدنى.
مثال: وصلت جلستك إلى بيانات CONFIDENTIAL (قرأت ملفاً مصنّفاً، استعلمت من قاعدة بيانات مصنّفة). تلوث الجلسة الآن CONFIDENTIAL. ثم حاولت إرسال الاستجابة إلى قناة WebChat عامة PUBLIC. يحظر محرك السياسات هذا لأن بيانات CONFIDENTIAL لا يمكن أن تتدفق إلى وجهات PUBLIC.
Write-down blocked: CONFIDENTIAL cannot flow to PUBLICكيفية الحل:
- ابدأ جلسة جديدة. تبدأ الجلسة الجديدة بتلوث PUBLIC. استخدم محادثة جديدة.
- استخدم قناة أعلى تصنيفاً. أرسل الاستجابة عبر قناة مصنّفة بـ CONFIDENTIAL أو أعلى.
- افهم ما سبّب التلوث. تحقق من السجلات بحثاً عن إدخالات "Taint escalation" لمعرفة أي استدعاء أداة رفع تصنيف الجلسة.
"Session taint cannot flow to channel"
مثل الكتابة للأسفل، لكن خاصة بتصنيف القناة:
Write-down blocked: your session taint is CONFIDENTIAL, but channel "webchat" is classified as PUBLIC.
Data cannot flow from CONFIDENTIAL to PUBLIC."Integration write-down blocked"
استدعاءات الأدوات للتكاملات المصنّفة تُطبّق أيضاً حظر الكتابة للأسفل:
Session taint CONFIDENTIAL cannot flow to tool_name (classified INTERNAL)انتظر، هذا يبدو معكوساً. تلوث الجلسة أعلى من تصنيف الأداة. هذا يعني أن الجلسة ملوثة جداً لاستخدام أداة أقل تصنيفاً. القلق هو أن استدعاء الأداة قد يُسرّب سياقاً مصنّفاً في نظام أقل أماناً.
"Workspace write-down blocked"
مساحات عمل الوكيل لها تصنيف لكل مجلد. الكتابة في مجلد أقل تصنيفاً من جلسة أعلى تلوثاً محظورة:
Write-down: CONFIDENTIAL session cannot write to INTERNAL directoryتصعيد التلوث
"Taint escalation"
هذا إعلامي وليس خطأ. يعني أن مستوى تصنيف الجلسة ارتفع للتو لأن الوكيل وصل إلى بيانات مصنّفة.
Taint escalation: PUBLIC → INTERNAL (accessed internal_tool)التلوث يرتفع فقط ولا ينخفض أبداً. بمجرد تلويث جلسة بـ CONFIDENTIAL، تبقى كذلك لبقية الجلسة.
"Resource-based taint escalation firing"
وصل استدعاء أداة إلى مورد بتصنيف أعلى من تلوث الجلسة الحالي. يُصعَّد تلوث الجلسة تلقائياً ليطابق.
"Non-owner taint applied"
قد تُلوَّث جلسات المستخدمين غير المالكين بناءً على تصنيف القناة أو أذونات المستخدم. هذا منفصل عن التلوث القائم على الموارد.
SSRF (تزوير الطلبات من جانب الخادم)
"SSRF blocked: hostname resolves to private IP"
جميع طلبات HTTP الصادرة (web_fetch، التنقل في المتصفح، اتصالات MCP SSE) تمر عبر حماية SSRF. إذا حُلّ اسم المضيف المستهدف إلى عنوان IP خاص، يُحظر الطلب.
النطاقات المحظورة:
127.0.0.0/8(الاسترجاع)10.0.0.0/8(خاص)172.16.0.0/12(خاص)192.168.0.0/16(خاص)169.254.0.0/16(الربط المحلي)0.0.0.0/8(غير محدد)::1(استرجاع IPv6)fc00::/7(IPv6 ULA)fe80::/10(ربط محلي IPv6)
هذه الحماية مُثبّتة في الكود ولا يمكن تعطيلها أو تكوينها. تمنع عامل الذكاء الاصطناعي من خداعه للوصول إلى الخدمات الداخلية.
IPv4 المعيّن على IPv6: العناوين مثل ::ffff:127.0.0.1 تُكتشف وتُحظر.
"SSRF check blocked outbound request"
مثل أعلاه، لكن مسجَّل من أداة web_fetch بدلاً من وحدة SSRF.
فشل حل DNS
DNS resolution failed for hostname
No DNS records found for hostnameلم يمكن حل اسم المضيف. تحقق من:
- العنوان URL مكتوب بشكل صحيح
- خادم DNS الخاص بك قابل للوصول
- النطاق موجود فعلاً
محرك السياسات
"Hook evaluation failed, defaulting to BLOCK"
رمى خطاف سياسة استثناءً أثناء التقييم. عندما يحدث هذا، الإجراء الافتراضي هو BLOCK (رفض). هذا الإجراء الافتراضي الآمن.
تحقق من السجلات للاستثناء الكامل. من المرجح أنه يشير إلى خلل في قاعدة سياسة مخصصة.
"Policy rule blocked action"
رفضت قاعدة سياسة صراحة الإجراء. يتضمن إدخال السجل أي قاعدة أُطلقت ولماذا. تحقق من قسم policy.rules في تكوينك لمعرفة القواعد المحددة.
"Tool floor violation"
استُدعيت أداة تتطلب مستوى تصنيف أدنى، لكن الجلسة أقل من ذلك المستوى.
مثال: أداة الفحص الصحي تتطلب كحد أدنى تصنيف INTERNAL (لأنها تكشف عن تفاصيل النظام الداخلية). إذا حاولت جلسة PUBLIC استخدامها، يُحظر الاستدعاء.
أمان الإضافات والمهارات
"Plugin network access blocked"
تعمل الإضافات في بيئة معزولة مع وصول شبكة مقيّد. يمكنها الوصول فقط إلى عناوين URL على نطاق نقطة النهاية المُعلنة.
Plugin network access blocked: invalid URL
Plugin SSRF blockedحاولت الإضافة الوصول إلى عنوان URL ليس في نقاط النهاية المُعلنة، أو حُلّ العنوان إلى IP خاص.
"Skill activation blocked by classification ceiling"
تُعلن المهارات عن classification_ceiling في مقدمة SKILL.md. إذا كان السقف أقل من مستوى تلوث الجلسة، لا يمكن تنشيط المهارة:
Cannot activate skill below session taint (write-down risk).
INTERNAL ceiling but session taint is CONFIDENTIAL.يمنع هذا مهارة أقل تصنيفاً من التعرض لبيانات أعلى تصنيفاً.
"Skill content integrity check failed"
بعد التثبيت، يُجزّئ Triggerfish محتوى المهارة. إذا تغيّرت التجزئة (عُدّلت المهارة بعد التثبيت)، يفشل فحص النزاهة:
Skill content hash mismatch detectedقد يشير هذا إلى تلاعب. أعد تثبيت المهارة من مصدر موثوق.
"Skill install rejected by scanner"
وجد الماسح الأمني محتوى مشبوهاً في المهارة. يتحقق الماسح من أنماط قد تشير إلى سلوك ضار. التحذيرات المحددة مضمّنة في رسالة الخطأ.
أمان الجلسة
"Session not found"
Session not found: <session-id>الجلسة المطلوبة غير موجودة في مدير الجلسات. ربما تم تنظيفها أو معرّف الجلسة غير صالح.
"Session status access denied: taint exceeds caller"
حاولت عرض حالة جلسة لها مستوى تلوث أعلى من جلستك الحالية. يمنع هذا الجلسات الأقل تصنيفاً من معرفة العمليات الأعلى تصنيفاً.
"Session history access denied"
نفس المفهوم أعلاه، لكن لعرض سجل المحادثة.
فرق الوكلاء
"Team message delivery denied: team status is ..."
الفريق ليس في حالة running. يحدث هذا عندما:
- حُلّ الفريق (يدوياً أو بواسطة مراقب دورة الحياة)
- أُوقف الفريق مؤقتاً بسبب فشل جلسة القائد
- انتهت مهلة الفريق بعد تجاوز حد عمره
تحقق من حالة الفريق الحالية بـ team_status. إذا أُوقف الفريق بسبب فشل القائد، يمكنك حلّه بـ team_disband وإنشاء واحد جديد.
"Team member not found" / "Team member ... is not active"
العضو المستهدف إما غير موجود (اسم دور خاطئ) أو تم إنهاؤه. يُنهى الأعضاء عندما:
- يتجاوزون مهلة الخمول (2x
idle_timeout_seconds) - يُحل الفريق
- تتعطّل جلستهم ويكتشف مراقب دورة الحياة ذلك
استخدم team_status لرؤية جميع الأعضاء وحالتهم الحالية.
"Team disband denied: only the lead or creating session can disband"
جلستان فقط يمكنهما حل فريق:
- الجلسة التي استدعت
team_createأصلاً - جلسة العضو القائد
إذا كنت تحصل على هذا الخطأ من داخل الفريق، فالعضو المستدعي ليس القائد. إذا كنت تحصل عليه من خارج الفريق، فأنت لست الجلسة التي أنشأته.
فشل قائد الفريق فوراً بعد الإنشاء
لم تستطع جلسة وكيل القائد إكمال دورتها الأولى. الأسباب الشائعة:
- خطأ مزود LLM: أرجع المزود خطأ (حد معدل، فشل مصادقة، نموذج غير موجود). تحقق من
triggerfish logsلأخطاء المزود. - سقف التصنيف منخفض جداً: إذا احتاج القائد أدوات مصنّفة فوق سقفه، قد تفشل الجلسة عند أول استدعاء أداة.
- أدوات مفقودة: قد يحتاج القائد أدوات محددة لتقسيم العمل. تأكد من تكوين ملفات الأدوات بشكل صحيح.
أعضاء الفريق خاملون ولا ينتجون مخرجات
ينتظر الأعضاء أن يرسل لهم القائد عملاً عبر sessions_send. إذا لم يقسّم القائد المهمة:
- قد لا يفهم نموذج القائد تنسيق الفريق. جرّب نموذجاً أكثر قدرة لدور القائد.
- قد يكون وصف
taskغامضاً جداً ليقسّمه القائد إلى مهام فرعية. - تحقق من
team_statusلمعرفة ما إذا كان القائدactiveولديه نشاط حديث.
"Write-down blocked" بين أعضاء الفريق
يتبع أعضاء الفريق نفس قواعد التصنيف كجميع الجلسات. إذا تلوّث أحد الأعضاء بـ CONFIDENTIAL وحاول إرسال بيانات إلى عضو بمستوى PUBLIC، يحظر فحص الكتابة للأسفل ذلك. هذا سلوك متوقع — لا يمكن للبيانات المصنّفة التدفق إلى جلسات أقل تصنيفاً، حتى داخل الفريق.
التفويض وتعدد الوكلاء
"Delegation certificate signature invalid"
يستخدم تفويض الوكيل شهادات تشفيرية. إذا فشل فحص التوقيع، يُرفض التفويض. يمنع هذا سلاسل التفويض المزوّرة.
"Delegation certificate expired"
شهادة التفويض لها مدة صلاحية. إذا انتهت، لم يعد بإمكان الوكيل المفوَّض التصرف نيابة عن المفوِّض.
"Delegation chain linkage broken"
في التفويضات متعددة القفزات (A يفوّض B، B يفوّض C)، يجب أن يكون كل رابط في السلسلة صالحاً. إذا كُسر أي رابط، تُرفض السلسلة بأكملها.
Webhooks
"Webhook HMAC verification failed"
تتطلب Webhooks الواردة توقيعات HMAC للمصادقة. إذا كان التوقيع مفقوداً أو مشوّهاً أو لا يتطابق:
Webhook HMAC verification failed: missing secret or body
Webhook HMAC verification failed: signature parse error
Webhook signature verification failed: length mismatch
Webhook signature verification failed: signature mismatchتحقق من أن:
- مصدر webhook يرسل رأس توقيع HMAC الصحيح
- السر المشترك في تكوينك يطابق سر المصدر
- تنسيق التوقيع يتطابق (HMAC-SHA256 مشفّر بالنظام السداسي العشري)
"Webhook replay detected"
يتضمن Triggerfish حماية من إعادة التشغيل. إذا استُقبلت حمولة webhook مرة ثانية (نفس التوقيع)، تُرفض.
"Webhook rate limit exceeded"
Webhook rate limit exceeded: source=<sourceId>عدد كبير جداً من طلبات webhook من نفس المصدر في فترة قصيرة. يحمي هذا من فيضانات webhook. انتظر وحاول مرة أخرى.
نزاهة التدقيق
"previousHash mismatch"
يستخدم سجل التدقيق تسلسل التجزئة. يتضمن كل إدخال تجزئة الإدخال السابق. إذا كُسرت السلسلة، يعني هذا أن سجل التدقيق تم التلاعب به أو تلف.
"HMAC mismatch"
لا يتطابق توقيع HMAC لإدخال التدقيق. قد يكون الإدخال عُدّل بعد إنشائه.
