الاختبار
يحتوي OpenClaw على ثلاثة أجنحة Vitest (unit/integration وe2e وlive) ومجموعة صغيرة من مشغلات Docker. هذه الوثيقة هي دليل “كيف نختبر”:- ما الذي يغطيه كل جناح (وما الذي لا يغطيه عمدًا)
- ما الأوامر التي يجب تشغيلها لسيناريوهات العمل الشائعة (محليًا، قبل push، التصحيح)
- كيف تكتشف الاختبارات الحية بيانات الاعتماد وتختار النماذج/المزوّدين
- كيفية إضافة حالات تراجع لمشكلات النماذج/المزوّدين في العالم الحقيقي
بدء سريع
في معظم الأيام:- البوابة الكاملة (المتوقعة قبل push):
pnpm build && pnpm check && pnpm test - تشغيل محلي أسرع للمجموعة الكاملة على جهاز واسع الموارد:
pnpm test:max - حلقة watch مباشرة لـ Vitest (إعداد modern projects):
pnpm test:watch - استهداف ملف مباشر يوجّه الآن أيضًا مسارات extension/channel:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts
- بوابة التغطية:
pnpm test:coverage - جناح E2E:
pnpm test:e2e
- الجناح live (النماذج + فحوصات أدوات/صور gateway):
pnpm test:live - استهداف ملف live واحد بهدوء:
pnpm test:live -- src/agents/models.profiles.live.test.ts
أجنحة الاختبار (ما الذي يعمل وأين)
فكّر في الأجنحة على أنها “زيادة في الواقعية” (وزيادة في عدم الاستقرار/التكلفة):Unit / integration (الافتراضي)
- الأمر:
pnpm test - الإعداد:
projectsأصلية في Vitest عبرvitest.config.ts - الملفات: قوائم الجرد الأساسية لـ core/unit تحت
src/**/*.test.tsوpackages/**/*.test.tsوtest/**/*.test.tsواختباراتuiلعقدة node المدرجة في القائمة البيضاء والمشمولة بواسطةvitest.unit.config.ts - النطاق:
- اختبارات unit خالصة
- اختبارات integration داخل العملية (مصادقة gateway، والتوجيه، والأدوات، والتحليل، والإعدادات)
- حالات تراجع حتمية للأخطاء المعروفة
- التوقعات:
- تعمل في CI
- لا تتطلب مفاتيح حقيقية
- يجب أن تكون سريعة ومستقرة
- ملاحظة projects:
- تستخدم الآن
pnpm testوpnpm test:watchوpnpm test:changedإعدادprojectsنفسه من جذر Vitest. - يوجّه ترشيح الملفات المباشر أصلًا عبر رسم المشاريع في الجذر، لذا يعمل
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsمن دون wrapper مخصص.
- تستخدم الآن
- ملاحظة المشغّل المضمّن:
- عندما تغيّر مدخلات اكتشاف أداة الرسائل أو سياق وقت تشغيل compaction، حافظ على مستويي التغطية معًا.
- أضف حالات تراجع مركّزة للمساعد لحدود التوجيه/التطبيع الخالصة.
- وحافظ أيضًا على صحة أجنحة integration الخاصة بالمشغّل المضمّن:
src/agents/pi-embedded-runner/compact.hooks.test.ts, وsrc/agents/pi-embedded-runner/run.overflow-compaction.test.ts، وsrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - تتحقق هذه الأجنحة من أن المعرّفات المحددة وسلوك compaction لا يزالان يتدفقان
عبر المسارات الحقيقية
run.ts/compact.ts؛ واختبارات المساعد فقط ليست بديلًا كافيًا عن مسارات integration هذه.
- ملاحظة pool:
- أصبح إعداد Vitest الأساسي الآن يستخدم
threadsافتراضيًا. - كما يثبت إعداد Vitest المشترك الآن
isolate: falseويستخدم المشغّل غير المعزول عبر مشاريع الجذر وتهيئات e2e وlive. - يحتفظ مسار UI في الجذر بإعداد
jsdomوالمُحسّن الخاص به، لكنه يعمل الآن أيضًا على المشغّل غير المعزول المشترك. - يرث
pnpm testالقيم الافتراضية نفسهاthreads+isolate: falseمن إعداد المشاريع فيvitest.config.tsفي الجذر. - يضيف المشغّل المشترك
scripts/run-vitest.mjsالآن أيضًا الخيار--no-maglevافتراضيًا لعمليات Node الفرعية الخاصة بـ Vitest لتقليل تبدل تجميع V8 أثناء التشغيلات المحلية الكبيرة. اضبطOPENCLAW_VITEST_ENABLE_MAGLEV=1إذا كنت تحتاج إلى المقارنة مع سلوك V8 الافتراضي.
- أصبح إعداد Vitest الأساسي الآن يستخدم
- ملاحظة التكرار المحلي السريع:
- يشغّل
pnpm test:changedإعداد المشاريع الأصلي مع--changed origin/main. - يحتفظ
pnpm test:maxوpnpm test:changed:maxبإعداد المشاريع الأصلي نفسه، لكن مع حد أعلى للعاملين. - أصبح التحجيم التلقائي للعاملين محليًا محافظًا عمدًا الآن ويتراجع أيضًا عندما يكون متوسط حمل المضيف مرتفعًا بالفعل، بحيث تتسبب تشغيلات Vitest المتزامنة المتعددة بضرر أقل افتراضيًا.
- يعلّم إعداد Vitest الأساسي ملفات المشاريع/الإعدادات على أنها
forceRerunTriggersحتى تبقى إعادة التشغيل في وضع changed صحيحة عندما تتغير أسلاك الاختبار. - يُبقي الإعداد
OPENCLAW_VITEST_FS_MODULE_CACHEمفعّلًا على المضيفين المدعومين؛ اضبطOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathإذا كنت تريد موقع cache صريحًا واحدًا لأغراض التحليل المباشر.
- يشغّل
- ملاحظة تصحيح الأداء:
- يفعّل
pnpm test:perf:importsتقارير مدة الاستيراد في Vitest بالإضافة إلى خرج تفصيلي للاستيراد. - يحصر
pnpm test:perf:imports:changedعرض التحليل نفسه في الملفات التي تغيرت منذorigin/main. - يكتب
pnpm test:perf:profile:mainملف CPU profile للخيط الرئيسي لتكاليف بدء التشغيل والتحويل في Vitest/Vite. - يكتب
pnpm test:perf:profile:runnerملفات CPU+heap profile للمشغّل لجناح unit مع تعطيل توازي الملفات.
- يفعّل
E2E (اختبار smoke للـ gateway)
- الأمر:
pnpm test:e2e - الإعداد:
vitest.e2e.config.ts - الملفات:
src/**/*.e2e.test.ts، وtest/**/*.e2e.test.ts - القيم الافتراضية لوقت التشغيل:
- يستخدم Vitest
threadsمعisolate: false، بما يطابق بقية المستودع. - يستخدم عاملين تكيفيين (في CI: حتى 2، ومحليًا: 1 افتراضيًا).
- يعمل في الوضع الصامت افتراضيًا لتقليل تكلفة الإدخال/الإخراج إلى console.
- يستخدم Vitest
- تجاوزات مفيدة:
OPENCLAW_E2E_WORKERS=<n>لفرض عدد العاملين (بحد أقصى 16).OPENCLAW_E2E_VERBOSE=1لإعادة تمكين خرج console المفصل.
- النطاق:
- سلوك gateway من طرف إلى طرف متعدد النسخ
- أسطح WebSocket/HTTP، واقتران العقد، والشبكات الأثقل
- التوقعات:
- يعمل في CI (عند تمكينه في المسار)
- لا يتطلب مفاتيح حقيقية
- يحتوي على أجزاء متحركة أكثر من اختبارات unit (وقد يكون أبطأ)
E2E: اختبار smoke لخلفية OpenShell
- الأمر:
pnpm test:e2e:openshell - الملف:
test/openshell-sandbox.e2e.test.ts - النطاق:
- يبدأ OpenShell gateway معزولًا على المضيف عبر Docker
- ينشئ sandbox من Dockerfile محلي مؤقت
- يختبر خلفية OpenShell في OpenClaw عبر
sandbox ssh-config+ تنفيذ SSH الحقيقي - يتحقق من سلوك نظام الملفات المرجعي البعيد عبر جسر نظام ملفات sandbox
- التوقعات:
- اشتراك اختياري فقط؛ ليس جزءًا من التشغيل الافتراضي لـ
pnpm test:e2e - يتطلب CLI محليًا لـ
openshellبالإضافة إلى daemon Docker عامل - يستخدم
HOME/XDG_CONFIG_HOMEمعزولين، ثم يدمّر gateway وsandbox الخاصين بالاختبار
- اشتراك اختياري فقط؛ ليس جزءًا من التشغيل الافتراضي لـ
- تجاوزات مفيدة:
OPENCLAW_E2E_OPENSHELL=1لتمكين الاختبار عند تشغيل جناح e2e الأوسع يدويًاOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellللإشارة إلى ملف CLI تنفيذي غير افتراضي أو wrapper script
Live (مزوّدون حقيقيون + نماذج حقيقية)
- الأمر:
pnpm test:live - الإعداد:
vitest.live.config.ts - الملفات:
src/**/*.live.test.ts - الافتراضي: مفعّل بواسطة
pnpm test:live(يضبطOPENCLAW_LIVE_TEST=1) - النطاق:
- “هل يعمل هذا المزوّد/النموذج فعلًا اليوم ببيانات اعتماد حقيقية؟”
- التقاط تغييرات تنسيق المزوّد، وخصائص استدعاء الأدوات، ومشكلات المصادقة، وسلوك حدود المعدل
- التوقعات:
- غير مستقرة بطبيعتها في CI (شبكات حقيقية، وسياسات مزوّدين حقيقية، وحصص، وانقطاعات)
- تكلف مالًا / تستخدم حدود المعدل
- يُفضّل تشغيل مجموعات فرعية ضيقة بدلًا من “كل شيء”
- تستورد تشغيلات live الملف
~/.profileلالتقاط مفاتيح API المفقودة. - افتراضيًا، لا تزال تشغيلات live تعزل
HOMEوتنسخ مواد الإعدادات/المصادقة إلى home اختبار مؤقت بحيث لا تتمكن تجهيزات unit من تعديل~/.openclawالحقيقي لديك. - اضبط
OPENCLAW_LIVE_USE_REAL_HOME=1فقط عندما تحتاج عمدًا إلى أن تستخدم اختبارات live دليل home الحقيقي لديك. - يستخدم
pnpm test:liveالآن افتراضيًا وضعًا أكثر هدوءًا: فهو يبقي خرج التقدم[live] ...، لكنه يخفي إشعار~/.profileالإضافي ويكتم سجلات تمهيد gateway وضجيج Bonjour. اضبطOPENCLAW_LIVE_TEST_QUIET=0إذا كنت تريد سجلات بدء التشغيل الكاملة مجددًا. - تدوير مفاتيح API (خاص بكل مزوّد): اضبط
*_API_KEYSبتنسيق الفواصل/الفواصل المنقوطة أو*_API_KEY_1و*_API_KEY_2(مثلOPENAI_API_KEYSوANTHROPIC_API_KEYSوGEMINI_API_KEYS) أو تجاوزًا خاصًا بـ live عبرOPENCLAW_LIVE_*_KEY؛ وتحاول الاختبارات مجددًا عند استجابات حدود المعدل. - خرج التقدم/heartbeat:
- تصدر أجنحة live الآن أسطر التقدم إلى stderr بحيث تظهر استدعاءات المزوّد الطويلة على أنها نشطة بصريًا حتى عندما يكون التقاط console في Vitest هادئًا.
- يعطل
vitest.live.config.tsاعتراض console في Vitest بحيث تتدفق أسطر تقدم المزوّد/gateway فورًا أثناء تشغيلات live. - اضبط heartbeat للنموذج المباشر باستخدام
OPENCLAW_LIVE_HEARTBEAT_MS. - اضبط heartbeat للـ gateway/probe باستخدام
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
أي جناح يجب أن أشغّله؟
استخدم جدول القرار هذا:- تعديل المنطق/الاختبارات: شغّل
pnpm test(وpnpm test:coverageإذا كنت قد غيّرت كثيرًا) - لمس شبكات gateway / بروتوكول WS / الاقتران: أضف
pnpm test:e2e - تصحيح “البوت متوقف” / أعطال خاصة بالمزوّد / استدعاء الأدوات: شغّل
pnpm test:liveمضيقًا
Live: مسح قدرات عقدة Android
- الاختبار:
src/gateway/android-node.capabilities.live.test.ts - البرنامج النصي:
pnpm android:test:integration - الهدف: استدعاء كل أمر معلن حاليًا بواسطة عقدة Android متصلة والتحقق من سلوك عقد الأمر.
- النطاق:
- إعداد مسبق/يدوي (لا يقوم الجناح بتثبيت التطبيق أو تشغيله أو إقرانه).
- تحقق
node.invokeفي gateway لكل أمر بالنسبة إلى عقدة Android المحددة.
- الإعداد المسبق المطلوب:
- تطبيق Android متصل بالفعل ومقترن بـ gateway.
- إبقاء التطبيق في الواجهة الأمامية.
- منح الأذونات/موافقة الالتقاط للقدرات التي تتوقع نجاحها.
- تجاوزات الهدف الاختيارية:
OPENCLAW_ANDROID_NODE_IDأوOPENCLAW_ANDROID_NODE_NAME.OPENCLAW_ANDROID_GATEWAY_URL/OPENCLAW_ANDROID_GATEWAY_TOKEN/OPENCLAW_ANDROID_GATEWAY_PASSWORD.
- تفاصيل إعداد Android الكاملة: تطبيق Android
Live: اختبار smoke للنموذج (مفاتيح profile)
تنقسم اختبارات live إلى طبقتين حتى نتمكن من عزل الإخفاقات:- “النموذج المباشر” يخبرنا هل يستطيع المزوّد/النموذج الرد أصلًا باستخدام المفتاح المعطى.
- “اختبار smoke للـ Gateway” يخبرنا هل يعمل خط أنابيب gateway+agent الكامل مع هذا النموذج (الجلسات، والسجل، والأدوات، وسياسة sandbox، إلخ).
الطبقة 1: إكمال النموذج المباشر (بدون gateway)
- الاختبار:
src/agents/models.profiles.live.test.ts - الهدف:
- تعداد النماذج المكتشفة
- استخدام
getApiKeyForModelلتحديد النماذج التي لديك بيانات اعتماد لها - تشغيل إكمال صغير لكل نموذج (وحالات تراجع مستهدفة عند الحاجة)
- كيفية التمكين:
pnpm test:live(أوOPENCLAW_LIVE_TEST=1إذا كنت تستدعي Vitest مباشرة)
- اضبط
OPENCLAW_LIVE_MODELS=modern(أوall، وهو اسم بديل لـ modern) لتشغيل هذا الجناح فعلًا؛ وإلا يتم تخطيه للحفاظ على تركيزpnpm test:liveعلى اختبار smoke للـ gateway - كيفية اختيار النماذج:
OPENCLAW_LIVE_MODELS=modernلتشغيل قائمة السماح الحديثة (Opus/Sonnet 4.6+، وGPT-5.x + Codex، وGemini 3، وGLM 4.7، وMiniMax M2.7، وGrok 4)OPENCLAW_LIVE_MODELS=allهو اسم بديل لقائمة السماح الحديثة- أو
OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."(قائمة سماح مفصولة بفواصل)
- كيفية اختيار المزوّدين:
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(قائمة سماح مفصولة بفواصل)
- من أين تأتي المفاتيح:
- افتراضيًا: من مخزن profile والتراجعات البيئية
- اضبط
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1لفرض مخزن profile فقط
- لماذا يوجد هذا:
- يفصل بين “واجهة API للمزوّد معطلة / المفتاح غير صالح” و“خط أنابيب وكيل gateway معطل”
- يحتوي على حالات تراجع صغيرة ومعزولة (مثال: إعادة تشغيل reasoning replay + تدفقات استدعاء الأدوات في OpenAI Responses/Codex Responses)
الطبقة 2: Gateway + اختبار smoke لوكيل dev (ما الذي يفعله “@openclaw” فعليًا)
- الاختبار:
src/gateway/gateway-models.profiles.live.test.ts - الهدف:
- تشغيل gateway داخل العملية
- إنشاء/ترقيع جلسة
agent:dev:*(مع تجاوز النموذج لكل تشغيل) - التكرار عبر النماذج التي تملك مفاتيح والتحقق من:
- استجابة “ذات معنى” (بدون أدوات)
- أن استدعاء أداة حقيقية يعمل (
readprobe) - فحوصات أدوات إضافية اختيارية (
exec+readprobe) - أن مسارات التراجع في OpenAI (استدعاء أداة فقط → متابعة) تظل تعمل
- تفاصيل probe (حتى تتمكن من شرح الأعطال بسرعة):
- probe
read: يكتب الاختبار ملف nonce في مساحة العمل ويطلب من الوكيلreadله وإرجاع الـ nonce. - probe
exec+read: يطلب الاختبار من الوكيل كتابة nonce إلى ملف مؤقت عبرexec، ثمreadله مجددًا. - probe الصورة: يرفق الاختبار PNG مُنشأً (قط + رمز عشوائي) ويتوقع من النموذج إرجاع
cat <CODE>. - مرجع التنفيذ:
src/gateway/gateway-models.profiles.live.test.tsوsrc/gateway/live-image-probe.ts.
- probe
- كيفية التمكين:
pnpm test:live(أوOPENCLAW_LIVE_TEST=1إذا كنت تستدعي Vitest مباشرة)
- كيفية اختيار النماذج:
- الافتراضي: قائمة السماح الحديثة (Opus/Sonnet 4.6+، وGPT-5.x + Codex، وGemini 3، وGLM 4.7، وMiniMax M2.7، وGrok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=allهو اسم بديل لقائمة السماح الحديثة- أو اضبط
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(أو قائمة مفصولة بفواصل) للتضييق
- كيفية اختيار المزوّدين (لتجنب “كل شيء عبر OpenRouter”):
OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"(قائمة سماح مفصولة بفواصل)
- تكون فحوصات الأدوات + الصور مفعّلة دائمًا في اختبار live هذا:
- probe
read+ probe exec+read(ضغط أدوات) - يعمل probe الصورة عندما يعلن النموذج دعم إدخال الصور
- التدفق (على مستوى عالٍ):
- يولّد الاختبار PNG صغيرًا مع “CAT” + رمز عشوائي (
src/gateway/live-image-probe.ts) - يرسله عبر
agentمعattachments: [{ mimeType: "image/png", content: "<base64>" }] - يحلل Gateway المرفقات إلى
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - يمرر الوكيل المضمّن رسالة مستخدم متعددة الوسائط إلى النموذج
- التحقق: يحتوي الرد على
cat+ الرمز (سماحية OCR: يسمح بأخطاء طفيفة)
- يولّد الاختبار PNG صغيرًا مع “CAT” + رمز عشوائي (
- probe
provider/model الدقيقة)، شغّل:
Live: اختبار smoke للخلفية CLI (Claude CLI أو CLIs محلية أخرى)
- الاختبار:
src/gateway/gateway-cli-backend.live.test.ts - الهدف: التحقق من خط أنابيب Gateway + agent باستخدام خلفية CLI محلية، من دون لمس إعداداتك الافتراضية.
- التمكين:
pnpm test:live(أوOPENCLAW_LIVE_TEST=1إذا كنت تستدعي Vitest مباشرة)OPENCLAW_LIVE_CLI_BACKEND=1
- الافتراضيات:
- النموذج:
claude-cli/claude-sonnet-4-6 - الأمر:
claude - الوسائط:
["-p","--output-format","stream-json","--include-partial-messages","--verbose","--permission-mode","bypassPermissions"]
- النموذج:
- التجاوزات (اختيارية):
OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-opus-4-6"OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/claude"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["-p","--output-format","stream-json","--include-partial-messages","--verbose","--permission-mode","bypassPermissions"]'OPENCLAW_LIVE_CLI_BACKEND_CLEAR_ENV='["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_OLD"]'OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1لإرسال مرفق صورة حقيقي (يتم حقن المسارات في prompt).OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"لتمرير مسارات ملفات الصور كوسائط CLI بدلًا من حقنها في prompt.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(أو"list") للتحكم في كيفية تمرير وسائط الصور عند ضبطIMAGE_ARG.OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1لإرسال دورة ثانية والتحقق من تدفق الاستئناف.
OPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG=0للإبقاء على إعداد MCP في Claude CLI مفعّلًا (يقوم الافتراضي بحقن--mcp-configمؤقت وصارم وفارغ حتى تبقى خوادم MCP المحيطة/العالمية معطلة أثناء اختبار smoke).
- يوجد مشغّل Docker في
scripts/test-live-cli-backend-docker.sh. - يشغّل اختبار smoke للخلفية CLI الحي داخل صورة Docker الخاصة بالمستودع كمستخدم
nodeغير الجذر، لأن Claude CLI يرفضbypassPermissionsعندما يتم استدعاؤه كجذر. - بالنسبة إلى
claude-cli، يثبّت الحزمة Linux @anthropic-ai/claude-codeفي بادئة قابلة للكتابة ومخزنة مؤقتًا فيOPENCLAW_DOCKER_CLI_TOOLS_DIR(الافتراضي:~/.cache/openclaw/docker-cli-tools). - بالنسبة إلى
claude-cli، يحقن اختبار smoke الحي إعداد MCP صارمًا وفارغًا ما لم تضبطOPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG=0. - ينسخ
~/.claudeإلى الحاوية عند توفره، ولكن على الأجهزة التي تكون فيها مصادقة Claude مدعومة بـANTHROPIC_API_KEY، فإنه يحتفظ أيضًا بالقيمتينANTHROPIC_API_KEY/ANTHROPIC_API_KEY_OLDلـ Claude CLI الفرعي عبرOPENCLAW_LIVE_CLI_BACKEND_PRESERVE_ENV.
Live: اختبار smoke لارتباط ACP (/acp spawn ... --bind here)
- الاختبار:
src/gateway/gateway-acp-bind.live.test.ts - الهدف: التحقق من تدفق ارتباط المحادثة الحقيقي في ACP مع وكيل ACP حي:
- إرسال
/acp spawn <agent> --bind here - ربط محادثة قناة رسائل اصطناعية في مكانها
- إرسال متابعة عادية على المحادثة نفسها
- التحقق من وصول المتابعة إلى السجل النصي لجلسة ACP المرتبطة
- إرسال
- التمكين:
pnpm test:live src/gateway/gateway-acp-bind.live.test.tsOPENCLAW_LIVE_ACP_BIND=1
- الافتراضيات:
- وكيل ACP:
claude - قناة اصطناعية: سياق محادثة على نمط Slack DM
- خلفية ACP:
acpx
- وكيل ACP:
- التجاوزات:
OPENCLAW_LIVE_ACP_BIND_AGENT=claudeOPENCLAW_LIVE_ACP_BIND_AGENT=codexOPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=/full/path/to/acpx
- ملاحظات:
- يستخدم هذا المسار سطح
chat.sendفي gateway مع حقول مسار أصل اصطناعي خاصة بالمشرف فقط بحيث يمكن للاختبارات إرفاق سياق قناة الرسالة من دون التظاهر بالتسليم خارجيًا. - عندما لا يتم ضبط
OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND، يستخدم الاختبار أمر acpx المهيأ/المضمّن. وإذا كانت مصادقة الحزمة لديك تعتمد على متغيرات env من~/.profile، فافضّل أمرacpxمخصصًا يحافظ على env الخاصة بالمزوّد.
- يستخدم هذا المسار سطح
- يوجد مشغّل Docker في
scripts/test-live-acp-bind-docker.sh. - يقوم بتحميل
~/.profile، وينسخ home المطابقة لمصادقة CLI (~/.claudeأو~/.codex) إلى الحاوية، ويثبتacpxفي بادئة npm قابلة للكتابة، ثم يثبت CLI الحية المطلوبة (@anthropic-ai/claude-codeأو@openai/codex) إذا كانت مفقودة. - داخل Docker، يضبط المشغّل
OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpxحتى يبقي acpx متغيرات env الخاصة بالمزوّد والمتاحة من profile المحمّل متاحة لـ CLI الحزمة الفرعية.
وصفات live الموصى بها
تكون قوائم السماح الضيقة والصريحة الأسرع والأقل عرضة لعدم الاستقرار:-
نموذج واحد، مباشر (بدون gateway):
OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts
-
نموذج واحد، اختبار smoke للـ gateway:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
استدعاء الأدوات عبر عدة مزوّدين:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
التركيز على Google (مفتاح Gemini API + Antigravity):
- Gemini (مفتاح API):
OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts - Antigravity (OAuth):
OPENCLAW_LIVE_GATEWAY_MODELS="google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
- Gemini (مفتاح API):
- يستخدم
google/...واجهة Gemini API (مفتاح API). - يستخدم
google-antigravity/...جسر Antigravity OAuth (نقطة نهاية وكيل على نمط Cloud Code Assist). - يستخدم
google-gemini-cli/...Gemini CLI المحلي على جهازك (مع مصادقة مستقلة وخصائص أدوات مختلفة). - Gemini API مقابل Gemini CLI:
- API: يستدعي OpenClaw واجهة Gemini API المستضافة من Google عبر HTTP (مفتاح API / مصادقة profile)؛ وهذا ما يقصده معظم المستخدمين عندما يقولون “Gemini”.
- CLI: ينفذ OpenClaw الملف الثنائي المحلي
gemini؛ وله مصادقة خاصة به وقد يتصرف بشكل مختلف (دعم البث/الأدوات/اختلاف الإصدار).
Live: مصفوفة النماذج (ما الذي نغطيه)
لا توجد “قائمة نماذج CI” ثابتة (live اختياري)، ولكن هذه هي النماذج الموصى بها للتغطية بانتظام على جهاز مطور يملك مفاتيح.مجموعة smoke الحديثة (استدعاء الأدوات + الصورة)
هذا هو تشغيل “النماذج الشائعة” الذي نتوقع أن يبقى عاملًا:- OpenAI (غير Codex):
openai/gpt-5.4(اختياري:openai/gpt-5.4-mini) - OpenAI Codex:
openai-codex/gpt-5.4 - Anthropic:
anthropic/claude-opus-4-6(أوanthropic/claude-sonnet-4-6) - Google (Gemini API):
google/gemini-3.1-pro-previewوgoogle/gemini-3-flash-preview(تجنب نماذج Gemini 2.x الأقدم) - Google (Antigravity):
google-antigravity/claude-opus-4-6-thinkingوgoogle-antigravity/gemini-3-flash - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/MiniMax-M2.7
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
الأساس: استدعاء الأدوات (Read + Exec اختياري)
اختر واحدًا على الأقل من كل عائلة مزوّدين:- OpenAI:
openai/gpt-5.4(أوopenai/gpt-5.4-mini) - Anthropic:
anthropic/claude-opus-4-6(أوanthropic/claude-sonnet-4-6) - Google:
google/gemini-3-flash-preview(أوgoogle/gemini-3.1-pro-preview) - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/MiniMax-M2.7
- xAI:
xai/grok-4(أو أحدث إصدار متاح) - Mistral:
mistral/… (اختر نموذجًا واحدًا قادرًا على الأدوات وممكّنًا لديك) - Cerebras:
cerebras/… (إذا كان لديك وصول) - LM Studio:
lmstudio/… (محلي؛ يعتمد استدعاء الأدوات على وضع API)
الرؤية: إرسال الصور (مرفق → رسالة متعددة الوسائط)
ضمّن نموذجًا واحدًا على الأقل قادرًا على الصور فيOPENCLAW_LIVE_GATEWAY_MODELS (متغيرات Claude/Gemini/OpenAI القادرة على الرؤية، إلخ) لاختبار probe الصورة.
المجمّعات / البوابات البديلة
إذا كانت لديك مفاتيح مفعلة، فنحن ندعم أيضًا الاختبار عبر:- OpenRouter:
openrouter/...(مئات النماذج؛ استخدمopenclaw models scanللعثور على مرشحين يدعمون الأدوات+الصور) - OpenCode:
opencode/...لـ Zen وopencode-go/...لـ Go (المصادقة عبرOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
- مضمنة:
openai،openai-codex،anthropic،google،google-vertex،google-antigravity،google-gemini-cli،zai،openrouter،opencode،opencode-go،xai،groq،cerebras،mistral،github-copilot - عبر
models.providers(نقاط نهاية مخصصة):minimax(سحابي/API)، بالإضافة إلى أي proxy متوافق مع OpenAI/Anthropic (مثل LM Studio، وvLLM، وLiteLLM، إلخ)
discoverModels(...) على جهازك + ما هي المفاتيح المتاحة.
بيانات الاعتماد (لا تلتزم بها أبدًا)
تكتشف اختبارات live بيانات الاعتماد بالطريقة نفسها التي يعمل بها CLI. والآثار العملية:- إذا كان CLI يعمل، فيجب أن تعثر اختبارات live على المفاتيح نفسها.
-
إذا قال اختبار live “لا توجد بيانات اعتماد”، فقم بالتصحيح بالطريقة نفسها التي كنت ستصحح بها
openclaw models list/ اختيار النموذج. -
ملفات مصادقة per-agent:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(وهذا هو المقصود بـ “profile keys” في اختبارات live) -
الإعدادات:
~/.openclaw/openclaw.json(أوOPENCLAW_CONFIG_PATH) -
دليل الحالة القديم:
~/.openclaw/credentials/(يُنسخ إلى home staged للاختبارات الحية عند وجوده، لكنه ليس مخزن profile keys الرئيسي) -
تقوم تشغيلات live المحلية افتراضيًا بنسخ الإعدادات النشطة وملفات
auth-profiles.jsonلكل وكيل وcredentials/القديمة وأدلة مصادقة CLI الخارجية المدعومة إلى home اختبار مؤقت؛ ويتم نزع تجاوزات المساراتagents.*.workspace/agentDirمن تلك الإعدادات staged حتى تبقى probes بعيدة عن مساحة العمل الحقيقية على المضيف.
~/.profile)، فشغّل الاختبارات المحلية بعد source ~/.profile، أو استخدم مشغلات Docker أدناه (يمكنها تحميل ~/.profile إلى الحاوية).
Deepgram live (نسخ الصوت)
- الاختبار:
src/media-understanding/providers/deepgram/audio.live.test.ts - التمكين:
DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts
خطة برمجة BytePlus live
- الاختبار:
src/agents/byteplus.live.test.ts - التمكين:
BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts - تجاوز النموذج الاختياري:
BYTEPLUS_CODING_MODEL=ark-code-latest
توليد الصور live
- الاختبار:
src/image-generation/runtime.live.test.ts - الأمر:
pnpm test:live src/image-generation/runtime.live.test.ts - النطاق:
- يعدّد كل plugin مزوّد لتوليد الصور مسجل
- يحمّل متغيرات env المفقودة الخاصة بالمزوّد من shell تسجيل الدخول (
~/.profile) قبل الفحص - يستخدم مفاتيح API الحية/البيئية قبل ملفات المصادقة المخزنة افتراضيًا، حتى لا تحجب مفاتيح الاختبار القديمة في
auth-profiles.jsonبيانات اعتماد shell الحقيقية - يتخطى المزوّدين الذين ليس لديهم مصادقة/ملف/نموذج صالح
- يشغّل متغيرات توليد الصور القياسية عبر قدرة وقت التشغيل المشتركة:
google:flash-generategoogle:pro-generategoogle:pro-editopenai:default-generate
- المزوّدون المضمنون المغطّون حاليًا:
openaigoogle
- التضييق الاختياري:
OPENCLAW_LIVE_IMAGE_GENERATION_PROVIDERS="openai,google"OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-1,google/gemini-3.1-flash-image-preview"OPENCLAW_LIVE_IMAGE_GENERATION_CASES="google:flash-generate,google:pro-edit"
- سلوك المصادقة الاختياري:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1لفرض مصادقة مخزن profile وتجاهل تجاوزات env فقط
مشغلات Docker (اختبارات اختيارية من نوع “يعمل على Linux”)
تنقسم مشغلات Docker هذه إلى مجموعتين:- مشغلات live-models: يشغّل كل من
test:docker:live-modelsوtest:docker:live-gatewayفقط ملف live المطابق لمفاتيح profile داخل صورة Docker الخاصة بالمستودع (src/agents/models.profiles.live.test.tsوsrc/gateway/gateway-models.profiles.live.test.ts)، مع تحميل دليل الإعدادات المحلي ومساحة العمل (ومصدر~/.profileإذا تم تحميله). ونقاط الإدخال المحلية المطابقة هيtest:live:models-profilesوtest:live:gateway-profiles. - تستخدم مشغلات Docker الحية افتراضيًا حد smoke أصغر بحيث يظل المسح الكامل في Docker عمليًا:
يضبط
test:docker:live-modelsافتراضيًاOPENCLAW_LIVE_MAX_MODELS=12، ويضبطtest:docker:live-gatewayافتراضيًاOPENCLAW_LIVE_GATEWAY_SMOKE=1، وOPENCLAW_LIVE_GATEWAY_MAX_MODELS=8، وOPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000، وOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. تجاوز متغيرات البيئة هذه عندما تريد عمدًا المسح الأكبر والأشمل. - يقوم
test:docker:allببناء صورة Docker الحية مرة واحدة عبرtest:docker:live-build، ثم يعيد استخدامها لمساري Docker الحيين. - مشغلات smoke للحاويات: تشغّل
test:docker:openwebuiوtest:docker:onboardوtest:docker:gateway-networkوtest:docker:mcp-channelsوtest:docker:pluginsحاوية أو أكثر حقيقية وتتحقق من مسارات integration أعلى مستوى.
- النماذج المباشرة:
pnpm test:docker:live-models(البرنامج النصي:scripts/test-live-models-docker.sh) - اختبار smoke لارتباط ACP:
pnpm test:docker:live-acp-bind(البرنامج النصي:scripts/test-live-acp-bind-docker.sh) - اختبار smoke للخلفية CLI:
pnpm test:docker:live-cli-backend(البرنامج النصي:scripts/test-live-cli-backend-docker.sh) - Gateway + وكيل dev:
pnpm test:docker:live-gateway(البرنامج النصي:scripts/test-live-gateway-models-docker.sh) - اختبار smoke حي لـ Open WebUI:
pnpm test:docker:openwebui(البرنامج النصي:scripts/e2e/openwebui-docker.sh) - معالج onboarding (TTY، تهيئة كاملة):
pnpm test:docker:onboard(البرنامج النصي:scripts/e2e/onboard-docker.sh) - شبكات Gateway (حاويتان، مصادقة WS + الصحة):
pnpm test:docker:gateway-network(البرنامج النصي:scripts/e2e/gateway-network-docker.sh) - جسر قناة MCP (Gateway مُهيّأ + stdio bridge + اختبار smoke خام لإطار إشعارات Claude):
pnpm test:docker:mcp-channels(البرنامج النصي:scripts/e2e/mcp-channels-docker.sh) - Plugins (اختبار smoke للتثبيت + الاسم البديل
/plugin+ دلالات إعادة التشغيل لحزمة Claude): pnpm test:docker:plugins(البرنامج النصي:scripts/e2e/plugins-docker.sh)
OPENCLAW_SKIP_CHANNELS=1 حتى لا تبدأ probes الحية في gateway
عمّال قنوات Telegram/Discord/إلخ الحقيقيين داخل الحاوية.
ولا يزال test:docker:live-models يشغّل pnpm test:live، لذا مرّر
OPENCLAW_LIVE_GATEWAY_* أيضًا عندما تحتاج إلى تضييق أو استبعاد تغطية gateway
الحية من هذا المسار في Docker.
ويُعد test:docker:openwebui اختبار توافق smoke أعلى مستوى: فهو يشغّل
حاوية OpenClaw gateway مع تمكين نقاط نهاية HTTP المتوافقة مع OpenAI،
ثم يشغّل حاوية Open WebUI مثبتة مقابل ذلك gateway، ويسجّل الدخول عبر
Open WebUI، ويتحقق من أن /api/models يكشف openclaw/default، ثم يرسل
طلب دردشة حقيقيًا عبر وكيل /api/chat/completions في Open WebUI.
قد يكون التشغيل الأول أبطأ بشكل ملحوظ لأن Docker قد يحتاج إلى سحب
صورة Open WebUI ولأن Open WebUI قد يحتاج إلى إكمال إعداد البدء البارد الخاص به.
ويتوقع هذا المسار وجود مفتاح نموذج حي صالح، ويُعد OPENCLAW_PROFILE_FILE
(~/.profile افتراضيًا) الطريقة الأساسية لتوفيره في تشغيلات Docker.
وتطبع التشغيلات الناجحة حمولة JSON صغيرة مثل { "ok": true, "model": "openclaw/default", ... }.
أما test:docker:mcp-channels فهو حتمي عمدًا ولا يحتاج إلى
حساب Telegram أو Discord أو iMessage حقيقي. فهو يشغّل حاوية Gateway
مهيأة، ثم يبدأ حاوية ثانية تشغّل openclaw mcp serve، ثم
يتحقق من اكتشاف المحادثات الموجّهة، وقراءات السجل النصي، وبيانات تعريف المرفقات،
وسلوك طابور الأحداث الحية، وتوجيه الإرسال الصادر، وإشعارات القنوات + الأذونات
على نمط Claude عبر جسر stdio MCP الحقيقي. ويتحقق فحص الإشعارات
من إطارات stdio MCP الخام مباشرة، بحيث يختبر smoke ما يصدره الجسر
فعليًا، وليس فقط ما قد تُظهره مجموعة أدوات عميل محددة.
اختبار smoke يدوي لسلسلة ACP بلغة طبيعية (ليس في CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- احتفظ بهذا البرنامج النصي لسير عمل التراجع/التصحيح. فقد تكون هناك حاجة إليه مجددًا للتحقق من توجيه سلاسل ACP، لذلك لا تحذفه.
OPENCLAW_CONFIG_DIR=...(الافتراضي:~/.openclaw) ويُحمّل إلى/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(الافتراضي:~/.openclaw/workspace) ويُحمّل إلى/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(الافتراضي:~/.profile) ويُحمّل إلى/home/node/.profileويتم مصدرته قبل تشغيل الاختباراتOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(الافتراضي:~/.cache/openclaw/docker-cli-tools) ويُحمّل إلى/home/node/.npm-globalلتخزين تثبيتات CLI داخل Docker- تُحمّل أدلة مصادقة CLI الخارجية تحت
$HOMEللقراءة فقط ضمن/host-auth/...، ثم تُنسخ إلى/home/node/...قبل بدء الاختبارات- الافتراضي: تحميل جميع الأدلة المدعومة (
.codexو.claudeو.minimax) - التشغيلات المضيقة حسب المزوّد تحمل فقط الأدلة المطلوبة المستنتجة من
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - التجاوز اليدوي عبر
OPENCLAW_DOCKER_AUTH_DIRS=allأوOPENCLAW_DOCKER_AUTH_DIRS=noneأو قائمة مفصولة بفواصل مثلOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- الافتراضي: تحميل جميع الأدلة المدعومة (
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...لتضييق التشغيلOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...لتصفية المزوّدين داخل الحاويةOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1لضمان أن تأتي بيانات الاعتماد من مخزن profile (وليس env)OPENCLAW_OPENWEBUI_MODEL=...لاختيار النموذج الذي يكشفه gateway لاختبار smoke الخاص بـ Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...لتجاوز prompt فحص nonce المستخدمة بواسطة اختبار smoke لـ Open WebUIOPENWEBUI_IMAGE=...لتجاوز وسم صورة Open WebUI المثبتة
التحقق من الوثائق
شغّل فحوصات الوثائق بعد تعديلها:pnpm check:docs.
وشغّل التحقق الكامل من روابط/مراسي Mintlify عندما تحتاج أيضًا إلى فحص العناوين داخل الصفحة: pnpm docs:check-links:anchors.
التراجع دون اتصال (آمن لـ CI)
هذه حالات تراجع “لخط الأنابيب الحقيقي” من دون مزوّدين حقيقيين:- استدعاء أدوات Gateway (محاكاة OpenAI، مع gateway حقيقي + حلقة agent):
src/gateway/gateway.test.ts(الحالة: “runs a mock OpenAI tool call end-to-end via gateway agent loop”) - معالج Gateway (WS
wizard.start/wizard.next، يكتب الإعدادات + يفرض المصادقة): src/gateway/gateway.test.ts(الحالة: “runs wizard over ws and writes auth token config”)
تقييمات موثوقية الوكيل (Skills)
لدينا بالفعل بعض الاختبارات الآمنة لـ CI التي تتصرف مثل “تقييمات موثوقية الوكيل”:- استدعاء أدوات وهمي عبر الـ gateway الحقيقي + حلقة agent (
src/gateway/gateway.test.ts). - تدفقات معالج كاملة من طرف إلى طرف تتحقق من ربط الجلسة وتأثيرات الإعدادات (
src/gateway/gateway.test.ts).
- اتخاذ القرار: عندما تُدرج Skills في prompt، هل يختار الوكيل Skill الصحيحة (أو يتجنب غير ذات الصلة)؟
- الامتثال: هل يقرأ الوكيل
SKILL.mdقبل الاستخدام ويتبع الخطوات/الوسائط المطلوبة؟ - عقود سير العمل: سيناريوهات متعددة الأدوار تؤكد ترتيب الأدوات، واستمرار سجل الجلسة، وحدود sandbox.
- مشغّل سيناريوهات يستخدم مزوّدين وهميين لتأكيد استدعاءات الأدوات + ترتيبها، وقراءات ملفات Skill، وربط الجلسات.
- مجموعة صغيرة من السيناريوهات المركزة على Skills (استخدم مقابل تجنب، والبوابات، وحقن prompt).
- تقييمات live اختيارية (opt-in، ومحمية بـ env) فقط بعد اكتمال الجناح الآمن لـ CI.
اختبارات العقود (شكل plugin والقناة)
تتحقق اختبارات العقود من أن كل plugin وقناة مسجلين يطابقان عقد الواجهة الخاصة بهما. وهي تكرر عبر جميع plugins المكتشفة وتشغّل مجموعة من تأكيدات الشكل والسلوك. ويتعمد مسار unit الافتراضيpnpm test
تخطي هذه الملفات المشتركة الخاصة بالوصلات وملفات smoke؛ شغّل أوامر العقود صراحة
عندما تلمس أسطح القنوات أو المزوّدين المشتركة.
الأوامر
- جميع العقود:
pnpm test:contracts - عقود القنوات فقط:
pnpm test:contracts:channels - عقود المزوّدين فقط:
pnpm test:contracts:plugins
عقود القنوات
تقع فيsrc/channels/plugins/contracts/*.contract.test.ts:
- plugin - الشكل الأساسي لـ plugin (id، الاسم، القدرات)
- setup - عقد معالج الإعداد
- session-binding - سلوك ربط الجلسة
- outbound-payload - بنية حمولة الرسالة
- inbound - التعامل مع الرسائل الواردة
- actions - معالجات إجراءات القناة
- threading - التعامل مع معرّف السلسلة
- directory - API الدليل/قائمة الأعضاء
- group-policy - فرض سياسة المجموعة
عقود حالة المزوّدين
تقع فيsrc/plugins/contracts/*.contract.test.ts.
- status - فحوصات حالة القنوات
- registry - شكل سجل plugin
عقود المزوّدين
تقع فيsrc/plugins/contracts/*.contract.test.ts:
- auth - عقد تدفق المصادقة
- auth-choice - اختيار/تحديد المصادقة
- catalog - API فهرس النماذج
- discovery - اكتشاف plugin
- loader - تحميل plugin
- runtime - وقت تشغيل المزوّد
- shape - شكل/واجهة plugin
- wizard - معالج الإعداد
متى يجب تشغيلها
- بعد تغيير صادرات plugin-sdk أو المسارات الفرعية
- بعد إضافة أو تعديل plugin لقناة أو مزوّد
- بعد إعادة هيكلة تسجيل plugin أو الاكتشاف
إضافة حالات تراجع (إرشادات)
عندما تصلح مشكلة في مزوّد/نموذج تم اكتشافها في live:- أضف حالة تراجع آمنة لـ CI إن أمكن (مزود وهمي/Stub، أو التقاط التحويل الدقيق لشكل الطلب)
- إذا كانت المشكلة بطبيعتها live فقط (حدود المعدل، سياسات المصادقة)، فأبقِ اختبار live ضيقًا ومفعلًا اختياريًا عبر متغيرات env
- افضّل استهداف أصغر طبقة تلتقط الخطأ:
- خطأ في تحويل/إعادة تشغيل طلب المزوّد → اختبار نماذج مباشر
- خطأ في خط أنابيب جلسة/سجل/أداة gateway → اختبار smoke حي للـ gateway أو اختبار محاكاة gateway آمن لـ CI
- حاجز حماية لاجتياز SecretRef:
- يستنتج
src/secrets/exec-secret-ref-id-parity.test.tsهدفًا نموذجيًا واحدًا لكل فئة SecretRef من بيانات وصفية السجل (listSecretTargetRegistryEntries())، ثم يؤكد رفض معرّفات exec الخاصة بمقاطع الاجتياز. - إذا أضفت عائلة هدف SecretRef جديدة من نوع
includeInPlanفيsrc/secrets/target-registry-data.ts، فحدّثclassifyTargetClassفي ذلك الاختبار. ويفشل الاختبار عمدًا مع المعرّفات غير المصنفة حتى لا يمكن تخطي الفئات الجديدة بصمت.
- يستنتج