Fundamentals
نظرة عامة على ضمان الجودة
تختبر حزمة ضمان الجودة الخاصة OpenClaw بطريقة واقعية تحاكي القنوات، وهو ما لا يستطيع اختبار الوحدة فعله.
المكوّنات:
extensions/qa-channel: قناة رسائل اصطناعية بواجهات للرسائل المباشرة والقنوات وسلاسل المحادثات والتفاعلات والتعديل والحذف.extensions/qa-lab: واجهة مستخدم لتصحيح الأخطاء، وناقل ضمان الجودة، وملفات تعريف للسيناريوهات، ومحوّلات نقل حية لمراقبة النص المنسوخ، وحقن الرسائل الواردة، وتصدير تقرير Markdown.qa/: أصول أولية مدعومة بالمستودع لمهمة البدء وسيناريوهات ضمان الجودة الأساسية.- Mantis: تحقق حي قبل/بعد للأخطاء التي تتطلب وسائل نقل حقيقية، ولقطات شاشة للمتصفح، وحالة آلة افتراضية، وأدلة طلب السحب.
واجهة الأوامر
يعمل كل تدفق لضمان الجودة ضمن pnpm openclaw qa <subcommand>. وللكثير منها أسماء مستعارة
للبرامج النصية ضمن pnpm qa:*؛ ويعمل كلا الشكلين.
| الأمر | الغرض |
|---|---|
qa run |
فحص ذاتي مضمن لضمان الجودة من دون --qa-profile؛ مشغّل ملفات تعريف النضج المدعوم بالتصنيف باستخدام --qa-profile smoke-ci أو --qa-profile release أو --qa-profile all. |
qa suite |
تشغيل السيناريوهات المدعومة بالمستودع مقابل مسار Gateway لضمان الجودة. يستخدم --runner multipass آلة Linux افتراضية مؤقتة بدلًا من المضيف. |
qa coverage |
طباعة مخزون تغطية السيناريوهات بصيغة YAML (--json للمخرجات الآلية؛ و--match <query> للعثور على سيناريوهات لسلوك جرى تعديله؛ و--tools لتغطية تجهيزات أدوات وقت التشغيل). |
qa parity-report |
مقارنة ملفي qa-suite-summary.json لبوابة تكافؤ على محور النموذج، أو استخدام --runtime-axis --token-efficiency لكتابة تقارير تكافؤ وقت التشغيل وكفاءة الرموز بين Codex وOpenClaw. |
qa confidence-report |
تصنيف عناصر إثبات ضمان الجودة مقابل بيان لإنتاج تقرير ثقة خالٍ من العناصر المجهولة. |
qa confidence-self-test |
كتابة مؤشرات ضبط سلبية أولية تثبت أن بوابة الثقة تكتشف الانحراف. |
qa jsonl-replay |
إعادة تشغيل نصوص JSONL المنسقة عبر مسخّر إعادة تشغيل تكافؤ وقت التشغيل. |
qa character-eval |
تشغيل سيناريو ضمان جودة الشخصية عبر عدة نماذج حية مع تقرير خاضع للتقييم. راجع إعداد التقارير. |
qa manual |
تشغيل مطالبة لمرة واحدة مقابل مسار المزوّد/النموذج المحدد. |
qa ui |
بدء واجهة مستخدم تصحيح أخطاء ضمان الجودة وناقل ضمان الجودة المحلي (الاسم المستعار: pnpm qa:lab:ui). |
qa docker-build-image |
بناء صورة Docker المجهزة مسبقًا لضمان الجودة. |
qa docker-scaffold |
كتابة هيكل docker-compose للوحة معلومات ضمان الجودة مع مسار Gateway. |
qa up |
بناء موقع ضمان الجودة، وبدء الحزمة المدعومة بـ Docker، وطباعة عنوان URL (الاسم المستعار: pnpm qa:lab:up؛ ويضيف متغير :fast الخيار --use-prebuilt-image --bind-ui-dist --skip-ui-build). |
qa aimock |
بدء خادم مزوّد AIMock فقط. |
qa mock-openai |
بدء خادم المزوّد mock-openai المدرك للسيناريوهات فقط. |
qa credentials doctor / add / list / remove |
إدارة تجمّع بيانات اعتماد Convex المشترك. |
qa discord |
مسار نقل حي مقابل قناة حقيقية في خادم Discord خاص. |
qa matrix |
ملفات تعريف Matrix في مختبر ضمان الجودة مقابل خادم Tuwunel منزلي مؤقت. راجع مسارات اختبار Matrix الأولية. |
qa slack |
مسار نقل حي مقابل قناة Slack خاصة حقيقية. |
qa telegram |
مسار نقل حي مقابل مجموعة Telegram خاصة حقيقية. |
qa whatsapp |
مسار نقل حي مقابل حسابات WhatsApp Web حقيقية. |
qa mantis |
مشغّل تحقق قبل/بعد لأخطاء النقل الحي، مع دليل تفاعلات الحالة في Discord، واختبار Crabbox الأولي لسطح المكتب/المتصفح، واختبار Slack الأولي ضمن VNC. راجع Mantis ودليل تشغيل Mantis لسطح مكتب Slack. |
qa run المدعوم بملفات التعريف
يقرأ qa run المدعوم بملفات التعريف العضوية من taxonomy.yaml، ثم يرسل
السيناريوهات المحلولة عبر qa suite. يرشّح --surface و--category
ملف التعريف المحدد بدلًا من تعريف مسارات منفصلة. يتضمن
qa-evidence.json الناتج ملخص بطاقة أداء لملف التعريف مع أعداد الفئات المحددة
ومعرّفات التغطية المفقودة؛ وتبقى إدخالات الأدلة الفردية
مصدر الحقيقة للاختبارات وأدوار التغطية والنتائج. معرّفات تغطية ميزات
التصنيف هي أهداف إثبات دقيقة وليست أسماء مستعارة: تحقق تغطية السيناريو الأساسية
المعرّفات المطابقة، بينما تبقى التغطية الثانوية استشارية. تستخدم معرّفات التغطية
صيغة namespace.behavior المنقطة مع مقاطع من أحرف أبجدية رقمية صغيرة/شرطات؛
وقد تظل معرّفات ملف التعريف والسطح والفئة تستخدم معرّفات
التصنيف الحالية ذات الشرطات أو النقاط.
تحذف الأدلة الموجزة execution لكل إدخال وتضبط evidenceMode: "slim"؛
يستخدم smoke-ci الوضع الموجز افتراضيًا، ويستعيد --evidence-mode full الإدخالات الكاملة:
pnpm openclaw qa run \ --qa-profile smoke-ci \ --category channel-framework.conversation-routing-and-delivery \ --provider-mode mock-openai \ --output-dir .artifacts/qa-e2e/smoke-ci-profile-dispatchاستخدم smoke-ci لإثبات حتمي لملف التعريف باستخدام مزوّدي نماذج وهميين وخوادم
مزوّد Crabline المحلية. استخدم release لإثبات Stable/LTS مقابل
القنوات الحية. استخدم all فقط لتشغيل أدلة التصنيف الكامل صراحةً؛ فهو
يحدد كل فئة نضج نشطة ويمكن إرساله عبر سير عمل GitHub Actions QA Profile Evidence باستخدام qa_profile=all. عندما يحتاج
أمر أيضًا إلى ملف تعريف جذري لـ OpenClaw، ضع ملف التعريف الجذري قبل
أمر ضمان الجودة:
pnpm openclaw --profile work qa run --qa-profile smoke-ciتدفق المشغّل
تدفق مشغّل ضمان الجودة الحالي هو موقع ضمان جودة ذو لوحتين:
- اليسار: لوحة معلومات Gateway (واجهة التحكم) مع الوكيل.
- اليمين: مختبر ضمان الجودة، ويعرض النص المنسوخ المشابه لـ Slack وخطة السيناريو.
شغّله باستخدام:
pnpm qa:lab:upيبني ذلك موقع ضمان الجودة، ويبدأ مسار Gateway المدعوم بـ Docker، ويعرض صفحة مختبر ضمان الجودة حيث يمكن لمشغّل أو حلقة أتمتة إسناد مهمة ضمان جودة إلى الوكيل، ومراقبة سلوك القناة الحقيقي، وتسجيل ما نجح أو فشل أو ظل محظورًا.
لتكرار أسرع لواجهة مستخدم مختبر ضمان الجودة دون إعادة بناء صورة Docker في كل مرة، ابدأ الحزمة باستخدام حزمة مختبر ضمان الجودة موصولة عبر ربط:
pnpm openclaw qa docker-build-imagepnpm qa:lab:buildpnpm qa:lab:up:fastpnpm qa:lab:watchيبقي qa:lab:up:fast خدمات Docker على صورة مبنية مسبقًا
ويربط extensions/qa-lab/web/dist داخل حاوية qa-lab.
يعيد qa:lab:watch بناء تلك الحزمة عند التغيير، ويُعاد تحميل المتصفح تلقائيًا
عند تغيّر تجزئة أصل مختبر ضمان الجودة.
اختبارات قابلية المراقبة الأولية
| الاسم المستعار | ما الذي يشغّله |
|---|---|
pnpm qa:otel:smoke |
مستقبِل OpenTelemetry محلي بالإضافة إلى سيناريو otel-trace-smoke مع تمكين diagnostics-otel. |
pnpm qa:otel:collector-smoke |
المسار نفسه خلف حاوية Docker فعلية لـ OpenTelemetry Collector. استخدمه عند تغيير توصيل نقاط النهاية أو توافق المجمّع/OTLP. |
pnpm qa:prometheus:smoke |
سيناريو docker-prometheus-smoke مع تمكين diagnostics-prometheus. |
pnpm qa:observability:smoke |
qa:otel:smoke متبوعًا بـ qa:prometheus:smoke. |
pnpm qa:observability:collector-smoke |
qa:otel:collector-smoke متبوعًا بـ qa:prometheus:smoke. |
يبدأ qa:otel:smoke مستقبِل OTLP/HTTP محليًا، ويشغّل دورة وكيل
مصغّرة لقناة QA، ثم يتحقق من تصدير التتبعات والمقاييس والسجلات. ويفك ترميز
امتدادات التتبع المصدّرة بتنسيق protobuf ويتحقق من البنية الحرجة للإصدار:
يجب أن تكون openclaw.run وopenclaw.harness.run وامتداد استدعاء نموذج
وفق أحدث اصطلاح دلالي لـ GenAI وopenclaw.context.assembled وopenclaw.message.delivery
كلها موجودة. يفرض اختبار الدخان
OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental، لذا يجب أن يستخدم امتداد استدعاء
النموذج الاسم {gen_ai.operation.name} {gen_ai.request.model}؛ ويجب ألا تصدّر
استدعاءات النموذج StreamAbandoned في الدورات الناجحة؛ كما يجب أن تظل معرّفات
التشخيص الخام وسمات openclaw.content.* خارج التتبع. تطلب مطالبة السيناريو
من النموذج الرد بعلامة ثابتة وحجب سلسلة
سرية ثابتة؛ ويجب ألا تحتوي حمولات OTLP الخام على أيٍّ منهما، ولا على مفتاح جلسة
QA المشتق من معرّف السيناريو. ويكتب otel-smoke-summary.json
بجوار عناصر مجموعة QA.
يتحقق qa:prometheus:smoke من رفض عمليات الاستخلاص غير المصادق عليها، ثم
يتحقق من أن الاستخلاص المصادق عليه يتضمن عائلات المقاييس الحرجة للإصدار
من دون محتوى المطالبة أو محتوى الاستجابة أو معرّفات التشخيص الخام أو رموز
المصادقة أو المسارات المحلية.
مسارات اختبار الدخان لـ Matrix
لتشغيل مسار اختبار دخان فعلي للنقل في Matrix لا يتطلب بيانات اعتماد موفّر النموذج، شغّل ملف تعريف الإصدار باستخدام موفّر OpenAI الحتمي الوهمي:
pnpm openclaw qa matrix --provider-mode mock-openai --profile releaseبالنسبة إلى مسار الموفّر الحدودي المباشر، قدّم بيانات اعتماد متوافقة مع OpenAI صراحةً:
OPENCLAW_LIVE_OPENAI_KEY="${OPENAI_API_KEY}" \ pnpm openclaw qa matrix --provider-mode live-frontier --profile releaseيشغّل pnpm openclaw qa matrix العادي ملف تعريف all الكامل ويواصل بعد
إخفاقات السيناريوهات. استخدم --fail-fast لدورة ملاحظات أقصر، أو كرّر
--scenario <id> لتحديد سيناريوهات فردية؛ وتكون لمعرّفات السيناريوهات الصريحة
الأولوية على --profile.
| ملف التعريف | السيناريوهات | الغرض |
|---|---|---|
all |
93 | الكتالوج الكامل (الافتراضي). |
release |
2 | خط الأساس للقناة الحرج للإصدار وإعادة تحميل قائمة السماح مباشرةً. |
fast |
12 | تغطية مركّزة للمحادثات المتفرعة والتفاعلات والموافقات والسياسات وتقييد الروبوتات والردود المشفّرة. |
transport |
50 | المحادثات المتفرعة، وتوجيه الرسائل المباشرة/الغرف، والانضمام التلقائي، والموافقات، والتفاعلات، وإعادات التشغيل، وسياسة الإشارات/قائمة السماح، والتعديلات، وترتيب الجهات الفاعلة المتعددة. |
media |
7 | تغطية الصور والصور المولّدة والصوت والمرفقات والوسائط غير المدعومة والوسائط المشفّرة. |
e2ee-smoke |
8 | الحد الأدنى لتغطية الرد المشفّر والمحادثات المتفرعة والتمهيد والاسترداد وإعادة التشغيل والتنقيح والإخفاقات. |
e2ee-deep |
18 | فقدان الحالة والنسخ الاحتياطي واسترداد المفاتيح وسلامة الأجهزة والتحقق عبر SAS/QR/الرسائل المباشرة. |
e2ee-cli |
9 | أوامر openclaw matrix encryption setup ومفتاح الاسترداد والحسابات المتعددة ورحلة Gateway ذهابًا وإيابًا والتحقق الذاتي عبر الحاضنة. |
توجد عضوية ملفات التعريف ومتطلبات القناة مع سيناريوهات Matrix التصريحية
ضمن qa/scenarios/channels/. يختار التشغيل برنامج تشغيل القناة.
وتوجد تطبيقاتها المباشرة ضمن
extensions/qa-lab/src/live-transports/matrix/scenarios/.
يوفّر المحوّل خادمًا منزليًا مؤقتًا من Tuwunel في Docker (الصورة الافتراضية
ghcr.io/matrix-construct/tuwunel:v1.5.1، واسم الخادم matrix-qa.test،
والمنفذ 28008)، ويسجّل مستخدمين مؤقتين لبرنامج التشغيل والنظام قيد الاختبار والمراقب، ويجهّز
الغرف المطلوبة، ويسجّل حدود الطلب/الاستجابة المنقّحة. ثم
يشغّل Plugin Matrix الفعلي داخل Gateway QA فرعي مقيّد بذلك النقل
(من دون qa-channel) ويفكك البيئة.
الخيارات الشائعة:
| العلامة | القيمة الافتراضية | الغرض |
|---|---|---|
--profile <profile> |
all |
تحديد أحد ملفات التعريف أعلاه. |
--scenario <id> |
- | تحديد سيناريو واحد؛ قابل للتكرار. |
--fail-fast |
معطّل | التوقف بعد أول عملية تحقق أو سيناريو فاشل. |
--allow-failures |
معطّل | كتابة العناصر من دون إرجاع رمز خروج فاشل عند إخفاق السيناريوهات. |
--provider-mode <mode> |
live-frontier |
استخدام mock-openai للإرسال الحتمي أو live-frontier لموفّر مباشر. |
--model <ref> |
افتراضي الموفّر | تعيين مرجع provider/model الأساسي. |
--alt-model <ref> |
افتراضي الموفّر | تعيين النموذج البديل الذي تستخدمه السيناريوهات التي تبدّل النماذج. |
--fast |
معطّل | تمكين الوضع السريع للموفّر حيثما يكون مدعومًا. |
--output-dir <path> |
مولّد | اختيار دليل التقرير؛ تُحل المسارات النسبية استنادًا إلى --repo-root. |
--repo-root <path> |
الدليل الحالي | التشغيل من دليل عمل محايد. |
--sut-account <id> |
sut |
تحديد معرّف حساب Matrix في إعدادات Gateway الفرعي. |
لا تستأجر QA الخاصة بـ Matrix بيانات اعتماد Matrix مشتركة: ينشئ المحوّل
مستخدمين مؤقتين محليًا، لذا لا يقبل --credential-source أو
--credential-role. تجاوز صورة الخادم المنزلي باستخدام
OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE؛ واضبط عمليات التحقق السلبية من عدم الرد باستخدام
OPENCLAW_QA_MATRIX_NO_REPLY_WINDOW_MS (القيمة الافتراضية 8000، وتُقيّد بمهلة
السيناريو النشط). عادةً ما يفرض الأمر أحادي التشغيل خروجًا نظيفًا بعد
تفريغ العناصر، لأن مقابض تشفير Matrix الأصلية قد تبقى بعد التنظيف؛ عيّن
OPENCLAW_QA_MATRIX_DISABLE_FORCE_EXIT=1 فقط لحاضنة اختبار مباشرة
تحتاج إلى أن يعود الأمر بدلًا من ذلك.
يكتب كل تشغيل عناصر QA Lab العادية ضمن دليل الإخراج
المحدد: qa-suite-report.md وqa-suite-summary.json وqa-evidence.json
وبيان matrix-harness-*/matrix-qa-harness.json منقّح. إذا فشل
التنظيف، فشغّل أمر الاسترداد docker compose ... down --remove-orphans
المطبوع. على المشغّلات البطيئة، زِد نافذة عدم الرد؛ وفي CI السريع، يمكن لنافذة
أصغر تقصير عمليات التحقق السلبية.
تغطي السيناريوهات سلوك النقل الذي لا تستطيع اختبارات الوحدات إثباته من
البداية إلى النهاية: تقييد الإشارات، وسياسات السماح للروبوتات، وقوائم السماح، والردود
عالية المستوى والمتفرعة، وتوجيه الرسائل المباشرة، ومعالجة التفاعلات، ومنع
التعديلات الواردة، وإزالة تكرار إعادة التشغيل، والتعافي من انقطاع الخادم المنزلي،
وتسليم بيانات الموافقة الوصفية، ومعالجة الوسائط، وتدفقات تمهيد/استرداد/تحقق E2EE في Matrix. كما
يقود ملف تعريف CLI الخاص بـ E2EE أوامر openclaw matrix encryption setup
والتحقق عبر الخادم المنزلي المؤقت نفسه قبل التحقق من
ردود Gateway.
يظل matrix-room-block-streaming وsubagent-thread-spawn متاحين عبر
تحديد --scenario صراحةً، لكنهما يبقيان خارج ملف تعريف all الافتراضي.
يستخدم CI سطح الأوامر نفسه في
.github/workflows/qa-live-transports-convex.yml. تنفّذ عمليات التشغيل المجدولة وعمليات الإصدار
سيناريوهات الإصدار. توزّع عمليات إرسال matrix_profile=all اليدوية
ملفات التعريف transport وmedia وe2ee-smoke وe2ee-deep وe2ee-cli؛
وتحدد عمليات الإرسال المركّزة fast أو release أو transport في مهمة واحدة.
سيناريوهات Mantis في Discord
يتضمن Discord أيضًا سيناريوهات اشتراك اختيارية خاصة بـ Mantis لإعادة إنتاج الأخطاء. استخدم
--scenario discord-status-reactions-tool-only للمخطط الزمني الصريح
لتفاعلات الحالة، أو --scenario discord-thread-reply-filepath-attachment
لإنشاء محادثة متفرعة فعلية في Discord والتحقق من أن message.thread-reply
يحافظ على مرفق filePath. تظل هذه السيناريوهات خارج مسار
Discord المباشر الافتراضي لأنها مجسّات إعادة إنتاج قبل/بعد وليست
تغطية اختبار دخان واسعة. يمكن لسير عمل Mantis الخاص بمرفقات المحادثة المتفرعة أيضًا إضافة
فيديو شاهد من Discord Web مسجّل الدخول عندما يكون
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR أو
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 مضبوطًا في بيئة QA.
ملف تعريف العارض هذا مخصص للالتقاط المرئي فقط؛ ويظل قرار النجاح/الفشل
صادرًا عن مرجع Discord REST.
بالنسبة إلى مسارات اختبار الدخان الفعلية الأخرى للنقل:
pnpm openclaw qa discordpnpm openclaw qa slackpnpm openclaw qa telegrampnpm openclaw qa whatsappتستهدف هذه المسارات قناة فعلية موجودة مسبقًا تضم روبوتين أو حسابين (برنامج التشغيل + النظام قيد الاختبار). متغيرات البيئة المطلوبة وقوائم السيناريوهات وعناصر الإخراج ومجموعة بيانات اعتماد Convex لوسائل النقل الأربع هذه موثّقة في مرجع QA لـ Discord وSlack وTelegram وWhatsApp أدناه.
مشغّلات سطح مكتب Slack والمهام المرئية في Mantis
لتشغيل كامل لآلة Slack المكتبية الافتراضية مع إنقاذ VNC، شغّل:
pnpm openclaw qa mantis slack-desktop-smoke \ --gateway-setup \ --scenario slack-canary \ --keep-leaseيستأجر هذا الأمر جهاز سطح مكتب/متصفح من Crabbox، ويشغّل مسار Slack المباشر
داخل الجهاز الافتراضي، ويفتح Slack Web في متصفح VNC، ويلتقط سطح المكتب،
وينسخ slack-qa/ وslack-desktop-smoke.png و
slack-desktop-smoke.mp4 (عند توفر التقاط الفيديو) إلى
دليل عناصر Mantis. توفر عمليات استئجار سطح المكتب/المتصفح من Crabbox أدوات الالتقاط
وحزم المساعدة للمتصفح/البناء الأصلي مسبقًا، لذا ينبغي للسيناريو
تثبيت البدائل الاحتياطية فقط في عمليات الاستئجار الأقدم. يعرض Mantis التوقيتات الإجمالية
وتوقيتات كل مرحلة في mantis-slack-desktop-smoke-report.md لكي توضّح عمليات التشغيل البطيئة
ما إذا كان الوقت قد استُهلك في تهيئة عملية الاستئجار، أو الحصول على بيانات الاعتماد، أو الإعداد البعيد، أو
نسخ العناصر. أعد استخدام --lease-id <cbx_...> بعد تسجيل الدخول إلى Slack Web
يدويًا عبر VNC؛ كما تُبقي عمليات الاستئجار المعاد استخدامها ذاكرة التخزين المؤقت لمخزن pnpm في Crabbox
مهيّأة. يتحقق الإعداد الافتراضي --hydrate-mode source من نسخة عمل للمصدر
ويشغّل التثبيت/البناء داخل الجهاز الافتراضي. استخدم --hydrate-mode prehydrated فقط عندما
تحتوي مساحة العمل البعيدة المعاد استخدامها مسبقًا على node_modules ونسخة مبنية من dist/؛
يتجاوز هذا الوضع خطوة التثبيت/البناء المكلفة ويتوقف بأمان عند عدم
جاهزية مساحة العمل. عند استخدام --gateway-setup، يترك Mantis
Gateway دائمًا لـ OpenClaw Slack قيد التشغيل داخل الجهاز الافتراضي على المنفذ 38973؛ ومن دونه،
يشغّل الأمر مسار ضمان الجودة العادي من روبوت إلى روبوت في Slack ويخرج بعد التقاط
العناصر.
لإثبات واجهة مستخدم الموافقة الأصلية في Slack بأدلة من سطح المكتب، شغّل وضع نقاط تحقق الموافقة في Mantis:
pnpm openclaw qa mantis slack-desktop-smoke \ --approval-checkpoints \ --credential-source convex \ --credential-role maintainerيتنافى هذا الوضع مع --gateway-setup. فهو يشغّل سيناريوهات
الموافقة في Slack، ويرفض معرّفات السيناريوهات غير المتعلقة بالموافقة، وينتظر عند كل حالة موافقة
معلّقة ومحسومة، ويصيّر رسالة Slack API المرصودة إلى
approval-checkpoints/<scenario>-pending.png و
approval-checkpoints/<scenario>-resolved.png، ثم يفشل إذا كانت أي نقطة تحقق،
أو دليل رسالة، أو إقرار، أو لقطة شاشة مصيّرة مفقودة أو
فارغة. قد تستمر عمليات استئجار CI الباردة في إظهار تسجيل الدخول إلى Slack في
slack-desktop-smoke.png؛ وتمثل صور نقاط تحقق الموافقة الدليل
المرئي لهذا المسار.
يحتفظ تشغيل نقاط التحقق الافتراضي بسيناريوهَي الموافقة القياسيين في Slack.
لالتقاط أي من مسارَي الموافقة الاختياريين في Codex، حدده صراحةً باستخدام
--scenario slack-codex-approval-exec-native أو
--scenario slack-codex-approval-plugin-native؛ يقبل Mantis كليهما وينتج
زوج لقطات الشاشة نفسه للحالتين المعلّقة والمحسومة. يوسّع المشغّل المهل الزمنية لنقاط التحقق
والأوامر البعيدة لكل مسار Codex محدد حتى يكتمل
تسلسل الموافقة بالكامل، وإكمال الوكيل، وتحديث الحالة المحسومة.
توجد قائمة تحقق المشغّل، وأمر تشغيل سير عمل GitHub، وعقد تعليق الأدلة، وجدول قرار وضع التزويد، وتفسير التوقيت، وخطوات معالجة الفشل في دليل تشغيل Mantis لسطح مكتب Slack.
لمهمة سطح مكتب بأسلوب الوكيل/الرؤية الحاسوبية، شغّل:
pnpm openclaw qa mantis visual-task \ --browser-url https://example.net \ --expect-text "Example Domain" \ --vision-model openai/gpt-5.6-lunaيستأجر visual-task جهاز سطح مكتب/متصفح من Crabbox أو يعيد استخدامه، ويبدأ
crabbox record --while، ويتحكم في المتصفح المرئي عبر
visual-driver متداخل، ويلتقط visual-task.png، ويشغّل openclaw infer image describe على لقطة الشاشة عند تحديد --vision-mode image-describe،
ويكتب visual-task.mp4 وmantis-visual-task-summary.json و
mantis-visual-task-driver-result.json و
mantis-visual-task-report.md. عند تعيين --expect-text، تطلب مطالبة الرؤية
حكمًا منظمًا بصيغة JSON (visible وevidence وreason)
ولا تنجح إلا عندما يبلغ النموذج عن visible: true مع دليل
يستشهد بالنص المتوقع؛ وتظل استجابة visible: false التي تقتبس
النص المستهدف فحسب غير ناجحة في التحقق. استخدم --vision-mode metadata لاختبار
دخان بلا نموذج يثبت عمل سطح المكتب والمتصفح ولقطة الشاشة والفيديو
من دون استدعاء موفر لفهم الصور. التسجيل عنصر
مطلوب لـ visual-task؛ وإذا لم يسجل Crabbox ملف
visual-task.mp4 غير فارغ، تفشل المهمة حتى لو نجح برنامج التشغيل المرئي. عند
الفشل، يحتفظ Mantis بعملية الاستئجار لـ VNC ما لم تكن المهمة قد نجحت بالفعل
ولم يُعيّن --keep-lease.
فحص سلامة مجموعة بيانات الاعتماد
قبل استخدام بيانات الاعتماد المباشرة المجمعة، شغّل:
pnpm openclaw qa credentials doctorيفحص الطبيب متغيرات بيئة وسيط Convex (OPENCLAW_QA_CONVEX_SITE_URL،
OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX)، ويتحقق من إعدادات نقطة النهاية، ويبلغ
فقط عن حالة التعيين/الفقدان لـ OPENCLAW_QA_CONVEX_SECRET_CI و
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER، ويتحقق من إمكانية الوصول إلى الإدارة/القائمة
عند توفر سر المشرف.
تغطية السيناريوهات القياسية
يحدد الملف الجذري taxonomy.yaml معرّفات التغطية الدلالية. تربط ملفات YAML للسيناريوهات
ضمن qa/scenarios/ كل سيناريو بهذه المعرّفات وتمتلك بيانات
التنفيذ الوصفية: channel هو متطلب القناة الوحيد، وتصرّح profiles
بعضوية عمليات التشغيل المسماة. برنامج تشغيل القناة خيار تنفيذ قابل للتبديل
على مستوى التشغيل. تستعلم مشغّلات TypeScript
عن هذا الكتالوج؛ ولا تحتفظ بقوائم موازية للسيناريوهات أو التغطية.
يعرض ناتج qa coverage الثابت ربط التصنيف بالسيناريوهات. يأتي
الإثبات الفعلي من qa-evidence.json، الذي يسجل السيناريو المنفذ،
ومعرّفات التغطية، والقناة، وبرنامج التشغيل المستخدم فعليًا، والنتيجة. القناة وبرنامج التشغيل
بُعدان للتقرير، وليسا مفردات إضافية لمعرّفات التغطية أو محاور
لتحديد أهلية السيناريو.
لمسار جهاز Linux افتراضي مؤقت من دون إدخال Docker في مسار ضمان الجودة، شغّل:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baselineيُقلع هذا ضيف Multipass جديدًا، ويثبت التبعيات، ويبني OpenClaw
داخل الضيف، ويشغّل qa suite، ثم ينسخ تقرير ضمان الجودة المعتاد
والملخص إلى .artifacts/qa-e2e/... على المضيف. ويعيد استخدام سلوك
اختيار السيناريو نفسه المستخدم في qa suite على المضيف.
تنفذ عمليات تشغيل الحزمة على المضيف وMultipass عدة سيناريوهات محددة
بالتوازي باستخدام عمال Gateway معزولين افتراضيًا. تكون قيمة qa-channel الافتراضية
تزامنًا مقداره 4، بحد أقصى يساوي عدد السيناريوهات المحددة. استخدم --concurrency <count> لضبط عدد العمال، أو --concurrency 1 للتنفيذ التسلسلي.
استخدم --pack personal-agent لتشغيل حزمة معايير المساعد الشخصي (10
سيناريوهات). مُحدِّد الحزمة تراكمي مع علامات --scenario المتكررة:
تُشغّل السيناريوهات الصريحة أولًا، ثم تُشغّل سيناريوهات الحزمة وفق ترتيبها
مع إزالة التكرارات. استخدم --pack observability لتحديد
السيناريوهين otel-trace-smoke وdocker-prometheus-smoke معًا عندما يكون
مشغّل ضمان جودة مخصص قد وفّر مسبقًا إعداد جامع OpenTelemetry.
يخرج الأمر برمز غير صفري عند فشل أي سيناريو. استخدم --allow-failures
عندما تريد العناصر من دون رمز خروج يدل على الفشل.
تمرر عمليات التشغيل المباشر مدخلات مصادقة ضمان الجودة المدعومة والعملية
للضيف: مفاتيح الموفر المستندة إلى متغيرات البيئة، ومسار إعدادات موفر ضمان الجودة المباشر،
وCODEX_HOME عند توفره. احتفظ بـ --output-dir ضمن جذر المستودع حتى
يتمكن الضيف من إعادة الكتابة عبر مساحة العمل المثبتة.
مرجع ضمان الجودة لـ Discord وSlack وTelegram وWhatsApp
يستخدم محول Matrix المسار المؤقت المعتمد على Docker والموثق أعلاه. تعمل Discord وSlack وTelegram وWhatsApp مقابل وسائل نقل حقيقية موجودة مسبقًا، لذلك يوجد مرجعها هنا.
علامات CLI المشتركة
تُسجّل هذه المسارات عبر
extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts
وتقبل العلامات نفسها:
| العلامة | القيمة الافتراضية | الوصف |
|---|---|---|
--scenario <id> |
- | شغّل هذا السيناريو فقط. قابلة للتكرار. |
--output-dir <path> |
<repo>/.artifacts/qa-e2e/<transport>-<timestamp> |
موضع كتابة التقارير والملخصات والأدلة والعناصر الخاصة بوسيلة النقل وسجل المخرجات. تُحل المسارات النسبية بالنسبة إلى --repo-root. |
--repo-root <path> |
process.cwd() |
جذر المستودع عند الاستدعاء من دليل عمل محايد. |
--sut-account <id> |
sut |
معرّف الحساب المؤقت داخل إعدادات Gateway لضمان الجودة. |
--provider-mode <mode> |
live-frontier |
mock-openai أو aimock أو live-frontier. |
--model <ref> / --alt-model <ref> |
الإعداد الافتراضي للموفر | مراجع النموذج الأساسي/البديل. |
--fast |
متوقف | الوضع السريع للموفر حيثما كان مدعومًا. |
--credential-source <env|convex> |
env |
راجع مجموعة بيانات اعتماد Convex. |
--credential-role <maintainer|ci> |
ci في CI، وmaintainer في غير ذلك |
الدور المستخدم عند --credential-source convex. |
--allow-failures |
متوقف | اكتب العناصر من دون إرجاع رمز خروج يدل على الفشل عند فشل السيناريوهات. |
يخرج كل مسار برمز غير صفري عند فشل أي سيناريو. يكتب --allow-failures
العناصر من دون تعيين رمز خروج يدل على الفشل. يقبل Telegram أيضًا
--list-scenarios لطباعة معرّفات السيناريوهات المتاحة والخروج؛ ولا تعرض المسارات الأخرى
هذه العلامة.
ضمان الجودة لـ Telegram
pnpm openclaw qa telegramيستهدف مجموعة Telegram خاصة حقيقية واحدة تضم روبوتين متميزين (برنامج التشغيل +
النظام قيد الاختبار). يجب أن يكون لروبوت النظام قيد الاختبار اسم مستخدم في Telegram؛ وتعمل المراقبة من روبوت إلى روبوت
بأفضل صورة عند تمكين Bot-to-Bot Communication Mode لكلا
الروبوتين في @BotFather.
متغيرات البيئة المطلوبة عند --credential-source env:
OPENCLAW_QA_TELEGRAM_GROUP_ID- معرّف المحادثة الرقمي (سلسلة نصية).OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN
يحدد ملف التعريف release سيناريوهات Telegram بصيغة YAML التي تخضع للصيانة؛ ويضيف all
اختبارات ضغط اختيارية للجلسة والاستخدام وسلسلة الردود والبث. تتجاوز قيم
--scenario الصريحة ملف التعريف.
channel-canarychannel-mention-gatingtelegram-help-commandtelegram-commands-commandtelegram-tools-compact-commandtelegram-whoami-commandtelegram-status-commandtelegram-repeated-command-authorizationtelegram-other-bot-command-gatingtelegram-context-commandtelegram-current-session-status-tooltelegram-tool-only-usage-footertelegram-reply-chain-exact-markertelegram-stream-final-single-messagetelegram-long-final-reuses-previewtelegram-long-final-three-chunks
يغطي ملف تعريف release دائمًا اختبار الكناري، وتقييد الإشارات، وردود الأوامر الأصلية،
وتوجيه الأوامر، وردود المجموعات من بوت إلى بوت. يتضمن mock-openai
أيضًا فحص المعاينة الحتمي للرد النهائي الطويل.
يظل telegram-current-session-status-tool و
telegram-tool-only-usage-footer اختياريين: الأول لا يكون مستقرًا إلا
عند تنفيذه مباشرةً بعد اختبار الكناري، والثاني إثبات عبر Telegram حقيقي
لتذييل /usage في الردود التي تقتصر على الأدوات. استخدم pnpm openclaw qa telegram --list-scenarios --provider-mode mock-openai لطباعة التقسيم الحالي
بين الافتراضي والاختياري مع مراجع اختبارات الانحدار. استخدم --profile all لكل
سيناريو لمحوّل Telegram المباشر.
عناصر الإخراج:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json- إدخالات أدلة لفحوصات النقل المباشر، بما يشمل حقول ملف التعريف، والتغطية، والموفّر، والقناة، والعناصر، والنتيجة، وزمن RTT.
تستخدم عمليات تشغيل حزمة Telegram عقد بيانات اعتماد Telegram نفسه. يُعد قياس RTT
المتكرر جزءًا من مسار Telegram المباشر المعتاد للحزمة؛ ويُدمج توزيع RTT
في qa-evidence.json ضمن result.timing لفحص RTT
المحدد.
OPENCLAW_QA_CREDENTIAL_SOURCE=convex \pnpm test:docker:npm-telegram-liveعند تعيين OPENCLAW_QA_CREDENTIAL_SOURCE=convex، يستأجر مغلّف التشغيل المباشر للحزمة
بيانات اعتماد kind: "telegram"، ويصدّر متغيرات بيئة المجموعة/برنامج التشغيل/بوت النظام قيد الاختبار المستأجرة
إلى تشغيل الحزمة المثبتة، ويرسل Heartbeat للإيجار، ويحرره
عند الإيقاف. يستخدم مغلّف الحزمة افتراضيًا 20 فحص RTT بقيمة
channel-canary، ومهلة RTT قدرها 30s، ودور Convex
maintainer خارج CI عند تحديد Convex. تجاوز
OPENCLAW_NPM_TELEGRAM_RTT_SAMPLES أو OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MS
أو OPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURES لضبط قياس RTT دون
إنشاء أمر RTT منفصل أو تنسيق ملخص خاص بـ Telegram.
ضمان جودة Discord
pnpm openclaw qa discordيستهدف قناة واحدة حقيقية خاصة ضمن خادم Discord باستخدام بوتين: بوت برنامج تشغيل
تتحكم فيه عُدّة الاختبار، وبوت للنظام قيد الاختبار يبدأه Gateway الفرعي لـ OpenClaw
من خلال Plugin Discord المضمّن. يتحقق من معالجة إشارات القناة، ومن
أن بوت النظام قيد الاختبار سجّل الأمر الأصلي /help لدى Discord، ومن
سيناريوهات أدلة Mantis الاختيارية.
متغيرات البيئة المطلوبة عند --credential-source env:
OPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_IDOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_APPLICATION_ID- يجب أن يطابق معرّف مستخدم بوت النظام قيد الاختبار الذي يعيده Discord (وإلا يفشل المسار فورًا).
اختياري:
OPENCLAW_QA_DISCORD_VOICE_CHANNEL_IDيحدد قناة الصوت/المنصة من أجلdiscord-voice-autojoin؛ وبدونه، يختار السيناريو أول قناة صوت/منصة مرئية لبوت النظام قيد الاختبار.
سيناريوهات وحدة YAML لـ Discord (qa/scenarios/channels/discord-*.yaml):
discord-canarydiscord-mention-gatingdiscord-native-help-command-registrationdiscord-voice-autojoin- سيناريو صوتي اختياري. يعمل منفردًا، ويفعّلchannels.discord.voice.autoJoin، ويتحقق من أن حالة الصوت الحالية لبوت النظام قيد الاختبار في Discord هي قناة الصوت/المنصة المستهدفة. قد تتضمن بيانات اعتماد Discord في Convex القيمة الاختياريةvoiceChannelId؛ وإلا يكتشف محوّل برنامج التشغيل أول قناة صوت/منصة مرئية في الخادم.discord-status-reactions-tool-only- سيناريو Mantis اختياري. يعمل منفردًا لأنه يحوّل النظام قيد الاختبار إلى ردود دائمة في الخادم تقتصر على الأدوات باستخدامmessages.statusReactions.enabled=true، ثم يلتقط مخططًا زمنيًا لتفاعلات REST مع عناصر مرئية بصيغتي HTML/PNG. تحتفظ تقارير Mantis لما قبل التنفيذ وما بعده أيضًا بعناصر MP4 التي يوفرها السيناريو باسمَيbaseline.mp4وcandidate.mp4.discord-thread-reply-filepath-attachment- سيناريو Mantis اختياري؛ راجع سيناريوهات Mantis في Discord.
شغّل سيناريو الانضمام التلقائي إلى صوت Discord صراحةً:
pnpm openclaw qa discord \ --scenario discord-voice-autojoin \ --provider-mode mock-openaiشغّل سيناريو تفاعلات حالة Mantis صراحةً:
pnpm openclaw qa discord \ --scenario discord-status-reactions-tool-only \ --provider-mode live-frontier \ --model openai/gpt-5.6-luna \ --alt-model openai/gpt-5.6-luna \ --fastعناصر الإخراج:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json- إدخالات أدلة لفحوصات النقل المباشر.discord-qa-reaction-timelines.jsonوdiscord-status-reactions-tool-only-timeline.pngعند تشغيل سيناريو تفاعلات الحالة.
ضمان جودة Slack
pnpm openclaw qa slackيستهدف قناة Slack حقيقية خاصة واحدة باستخدام بوتين منفصلين: بوت برنامج تشغيل تتحكم فيه عُدّة الاختبار، وبوت للنظام قيد الاختبار يبدأه Gateway الفرعي لـ OpenClaw من خلال Plugin Slack المضمّن.
متغيرات البيئة المطلوبة عند --credential-source env:
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKEN
اختياري:
OPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_DIRيفعّل نقاط تحقق مرئية للموافقة في Mantis. يكتب المحوّل<scenario>.pending.jsonو<scenario>.resolved.json، ثم ينتظر ملفات.ack.jsonالمطابقة.OPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_TIMEOUT_MSيتجاوز مهلة الإقرار بنقطة التحقق. القيمة الافتراضية هي120000.
سيناريوهات YAML القياسية المتاحة عبر محوّل Slack المباشر:
thread-follow-upthread-isolation
سيناريوهات وحدة YAML لـ Slack (qa/scenarios/channels/slack-*.yaml):
slack-canaryslack-mention-gatingslack-allowlist-blockslack-channel-disabled-warning- فحص Slack حقيقي اختياري يؤكد أن قناة معطّلة ومضبوطة تُصدر تحذيرًا منظّمًا دون إرسال رد.slack-top-level-reply-shapeslack-restart-resumeslack-progress-commentary-true، وslack-progress-commentary-false، وslack-progress-commentary-omitted، وslack-progress-commentary-verbose-dedupe- فحوصات Slack حقيقية اختيارية لعناصر التحكم المستقلة في التعليقات/تقدم الأدوات، والقيمة الافتراضية القديمة عند حذف المفتاح، وسلوك التسليم لمرة واحدة عند تفعيل التقدم المطوّل الدائم.slack-reaction-glyph-native- سيناريو مباشر اختياري لتفاعل أداة الرسائل. يوجّه الوكيل إلى تمرير الرمز✅نفسه، ويؤكد أن Slack خزّنwhite_check_markلبوت النظام قيد الاختبار على الرسالة المستهدفة.slack-chart-presentation-native- سيناريو مخطط محمول اختياري يتحقق من كتلةdata_visualizationالأصلية والنص الدقيق الميسّر.slack-table-presentation-native- سيناريو جدول محمول اختياري يتحقق من كتلةdata_tableالأصلية، والصفوف الدقيقة، والنص الميسّر.slack-table-invalid-blocks-fallback- سيناريو نقل مباشر اختياري يرسل جدولًا خامًا يتجاوز الحد ويمكن قراءته بنيويًا، ويحتوي على 101 صف بيانات بالإضافة إلى رأسه، عبر مسار إرسال Slack الإنتاجي، ويثبت أن Slack نفسه يعيدinvalid_blocks، ويتحقق من أن البديل المخزّن مع تعطيل التنسيق مكتمل ولا يحتوي على كتلة بيانات أصلية. لا تحتفظ تفاصيل السيناريو إلا بأدلة آمنة لرمز الخطأ والعدد والقيم المنطقية.slack-approval-exec-native- سيناريو موافقة أصلي اختياري لتنفيذ Slack. يطلب موافقة على التنفيذ عبر Gateway، ويتحقق من أن رسالة Slack تحتوي على أزرار موافقة أصلية، ويحسمها، ثم يتحقق من تحديث Slack بعد الحسم.slack-approval-plugin-native- سيناريو موافقة أصلي اختياري على Plugin في Slack. يفعّل إعادة توجيه موافقات التنفيذ وPlugin معًا كي لا تُحجب أحداث Plugin بسبب توجيه موافقات التنفيذ، ثم يتحقق من مسار واجهة Slack الأصلية نفسه في حالتي الانتظار والحسم.slack-codex-approval-exec-native- سيناريو موافقة اختياري على أوامر Codex Guardian. يفعّل Plugin Codex في وضع Guardian، ويوجّه دورة وكيل Gateway ناشئة من Slack عبر عُدّة خادم تطبيق Codex، وينتظر مطالبة الموافقة الأصلية على Plugin في Slack من أجلopenclaw-codex-app-server، ويحسمها، ويتحقق من أن دورة Codex تنتهي بعلامات خرج الأمر والمساعد المتوقعة.slack-codex-approval-plugin-native- سيناريو موافقة اختياري على ملفات Codex. يستخدم تعليمةapply_patchخارج مساحة العمل كي يصدر Codex مسار موافقة خادم التطبيق على تغيير الملف، ثم يتحقق من مسار موافقة Slack الأصلي نفسه في حالتي الانتظار والحسم، وعلامة المساعد النهائية، ومحتويات الملف الدقيقة قبل التنظيف.
تتطلب سيناريوهات موافقة Codex قيمة openai/* أو codex/* من --model،
وبيانات اعتماد النموذج المباشر المعتادة، ومصادقة Codex أو مصادقة مفتاح API يقبلها Plugin Codex.
تتضمن تفاصيل السيناريو أسلوب خادم تطبيق Codex، ومفتاح نموذج Codex
المحدد، والحالة النهائية لدورة Codex، والتحقق من علامة العملية إلى جانب
بيانات موافقة Slack المنقحة.
عناصر الإخراج:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json- إدخالات أدلة لفحوصات النقل المباشر.approval-checkpoints/- فقط عندما يعيّن MantisOPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_DIR؛ ويحتوي على JSON لنقطة التحقق، وJSON للإقرار، ولقطات شاشة لحالتي الانتظار والحسم.
إعداد مساحة عمل Slack
يحتاج المسار إلى تطبيقي Slack منفصلين في مساحة عمل واحدة، بالإضافة إلى قناة يشترك فيها البوتان:
channelId- معرّفCxxxxxxxxxxلقناة دُعي إليها البوتان. استخدم قناة مخصصة؛ إذ ينشر المسار في كل تشغيل.driverBotToken- رمز البوت (xoxb-...) لتطبيق برنامج التشغيل.sutBotToken- رمز البوت (xoxb-...) لتطبيق النظام قيد الاختبار، الذي يجب أن يكون تطبيق Slack منفصلًا عن برنامج التشغيل كي يكون معرّف مستخدم البوت الخاص به مختلفًا.sutAppToken- رمز على مستوى التطبيق (xapp-...) لتطبيق النظام قيد الاختبار معconnections:write، ويستخدمه Socket Mode كي يتمكن تطبيق النظام قيد الاختبار من استقبال الأحداث.
يُفضّل استخدام مساحة عمل Slack مخصصة لضمان الجودة بدلًا من إعادة استخدام مساحة عمل إنتاجية.
يضيّق بيان النظام قيد الاختبار أدناه عن قصد نطاق تثبيت Plugin Slack المضمّن
في بيئة الإنتاج (extensions/slack/src/setup-shared.ts:12) ليقتصر على
الأذونات والأحداث التي تغطيها مجموعة ضمان جودة Slack المباشرة. للاطلاع على
إعداد قناة الإنتاج كما يراه المستخدمون، راجع
الإعداد السريع لقناة Slack؛ ويكون زوج برنامج التشغيل/النظام قيد الاختبار
لضمان الجودة منفصلًا عن قصد لأن المسار يحتاج إلى معرّفي مستخدم بوت مختلفين
في مساحة عمل واحدة.
1. إنشاء تطبيق برنامج التشغيل
انتقل إلى api.slack.com/apps → Create New App ← From a manifest ← اختر مساحة عمل ضمان الجودة، والصق البيان التالي، ثم اختر Install to Workspace:
{ "display_information": { "name": "برنامج تشغيل ضمان جودة OpenClaw", "description": "بوت برنامج تشغيل اختباري لمسار ضمان جودة Slack المباشر في OpenClaw" }, "features": { "bot_user": { "display_name": "برنامج تشغيل ضمان جودة OpenClaw", "always_online": true } }, "oauth_config": { "scopes": { "bot": ["chat:write", "channels:history", "groups:history", "users:read"] } }, "settings": { "socket_mode_enabled": false }}انسخ Bot User OAuth Token (xoxb-...) - وسيصبح
driverBotToken. لا يحتاج برنامج التشغيل إلا إلى نشر الرسائل والتعريف
بنفسه؛ ولا يحتاج إلى أحداث أو Socket Mode.
2. إنشاء تطبيق النظام قيد الاختبار
كرر Create New App → From a manifest في مساحة العمل نفسها. يستخدم تطبيق ضمان الجودة هذا
عن قصد إصدارًا أضيق نطاقًا من بيان الإنتاج الخاص بـ Plugin Slack المضمّن
(extensions/slack/src/setup-shared.ts:12): حُذفت نطاقات التفاعلات
وأحداثها لأن مجموعة ضمان جودة Slack المباشرة لا تغطي
معالجة التفاعلات حتى الآن.
{ "display_information": { "name": "OpenClaw QA SUT", "description": "موصل OpenClaw QA SUT لـ OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw QA SUT", "always_online": true }, "app_home": { "home_tab_enabled": true, "messages_tab_enabled": true, "messages_tab_read_only_enabled": false } }, "oauth_config": { "scopes": { "bot": [ "app_mentions:read", "assistant:write", "channels:history", "channels:read", "chat:write", "commands", "emoji:read", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "im:write", "mpim:history", "mpim:read", "mpim:write", "pins:read", "pins:write", "usergroups:read", "users:read" ] } }, "settings": { "socket_mode_enabled": true, "event_subscriptions": { "bot_events": [ "app_home_opened", "app_mention", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed" ] } }}بعد أن ينشئ Slack التطبيق، نفّذ أمرين في صفحة إعداداته:
- Install to Workspace → انسخ Bot User OAuth Token → ليصبح
sutBotToken. - Basic Information → App-Level Tokens → Generate Token and Scopes → أضف
النطاق
connections:write→ احفظ → انسخ قيمةxapp-...→ لتصبحsutAppToken.
تحقق من أن للبوتين معرّفي مستخدم مختلفين باستدعاء auth.test لكل
رمز مميز. تميّز بيئة التشغيل بين برنامج التشغيل والنظام قيد الاختبار حسب معرّف المستخدم؛ وستفشل بوابة الإشارات فورًا عند إعادة استخدام تطبيق واحد
لكليهما.
3. إنشاء القناة
في مساحة عمل ضمان الجودة، أنشئ قناة (مثل #openclaw-qa) وادعُ كلا
البوتين من داخل القناة:
/invite @OpenClaw QA Driver/invite @OpenClaw QA SUTانسخ معرّف Cxxxxxxxxxx من channel info → About → Channel ID - ليصبح
channelId. يمكن استخدام قناة عامة؛ وإذا استخدمت قناة خاصة،
فإن كلا التطبيقين يمتلكان بالفعل groups:history، لذلك ستظل قراءات السجل الخاصة بأداة الاختبار
ناجحة.
4. تسجيل بيانات الاعتماد
يتوفر خياران. استخدم متغيرات البيئة لتصحيح الأخطاء على جهاز واحد (عيّن متغيرات
OPENCLAW_QA_SLACK_* الأربعة ومرّر --credential-source env)، أو املأ
مجموعة Convex المشتركة حتى تتمكن بيئة CI والمشرفون الآخرون من استئجارها.
بالنسبة إلى مجموعة Convex، اكتب الحقول الأربعة في ملف JSON:
{ "channelId": "Cxxxxxxxxxx", "driverBotToken": "xoxb-...", "sutBotToken": "xoxb-...", "sutAppToken": "xapp-..."}بعد تصدير OPENCLAW_QA_CONVEX_SITE_URL وOPENCLAW_QA_CONVEX_SECRET_MAINTAINER
في الصدفة، سجّل وتحقق:
pnpm openclaw qa credentials add \ --kind slack \ --payload-file slack-creds.json \ --note "بذرة مجموعة Slack لضمان الجودة" pnpm openclaw qa credentials list --kind slack --status all --jsonتوقّع count: 1 وstatus: "active"، ومن دون حقل lease.
5. التحقق الشامل
شغّل المسار محليًا للتأكد من قدرة كلا البوتين على التواصل أحدهما مع الآخر عبر الوسيط:
pnpm openclaw qa slack \ --credential-source convex \ --credential-role maintainer \ --output-dir .artifacts/qa-e2e/slack-localيكتمل التشغيل الناجح في أقل بكثير من 30 ثانية، ويعرض qa-suite-report.md
كلاً من slack-canary وslack-mention-gating بالحالة pass. إذا ظل
المسار معلقًا لمدة تقارب 90 ثانية ثم خرج مع Convex credential pool exhausted for kind "slack"، فإما أن المجموعة فارغة أو أن كل صفوفها مستأجرة - وسيبيّن qa credentials list --kind slack --status all --json أيهما السبب.
ضمان جودة WhatsApp
pnpm openclaw qa whatsappيستهدف حسابين مخصصين في WhatsApp Web: حساب برنامج تشغيل تتحكم فيه أداة الاختبار، وحساب نظام قيد الاختبار يبدأه Gateway الفرعي لـ OpenClaw عبر Plugin WhatsApp المضمّن.
متغيرات البيئة المطلوبة عند --credential-source env:
OPENCLAW_QA_WHATSAPP_DRIVER_PHONE_E164OPENCLAW_QA_WHATSAPP_SUT_PHONE_E164OPENCLAW_QA_WHATSAPP_DRIVER_AUTH_ARCHIVE_BASE64OPENCLAW_QA_WHATSAPP_SUT_AUTH_ARCHIVE_BASE64
اختياري:
OPENCLAW_QA_WHATSAPP_GROUP_JIDيفعّل سيناريوهات المجموعات مثلwhatsapp-mention-gatingوwhatsapp-group-pending-history-contextوwhatsapp-broadcast-group-fanoutوwhatsapp-group-activation-alwaysوwhatsapp-group-reply-to-bot-triggers، وسيناريوهات إجراءات المجموعات والوسائط والاستطلاعات، وwhatsapp-group-allowlist-block.
سيناريوهات WhatsApp بتنسيق YAML (qa/scenarios/channels/whatsapp-*.yaml):
- خط الأساس وبوابة المجموعات:
whatsapp-canaryوwhatsapp-pairing-blockوwhatsapp-mention-gatingوwhatsapp-group-pending-history-contextوwhatsapp-group-activation-alwaysوwhatsapp-group-reply-to-bot-triggersوwhatsapp-top-level-reply-shapeوwhatsapp-restart-resumeوwhatsapp-group-allowlist-block. - الأوامر الأصلية:
whatsapp-help-commandوwhatsapp-status-commandوwhatsapp-commands-commandوwhatsapp-tools-compact-commandوwhatsapp-whoami-commandوwhatsapp-context-commandوwhatsapp-native-new-command. - سلوك الرد والمخرجات النهائية:
whatsapp-tool-only-usage-footerوwhatsapp-reply-to-messageوwhatsapp-group-reply-to-messageوwhatsapp-reply-to-mode-batchedوwhatsapp-reply-context-isolationوwhatsapp-reply-delivery-shapeوwhatsapp-stream-final-message-accounting. - إجراءات الرسائل في مسار المستخدم: يبدأ
whatsapp-agent-message-action-reactمن رسالة خاصة حقيقية لبرنامج التشغيل، ويسمح للنموذج باستدعاء أداةmessage، ويراقب تفاعل WhatsApp الأصلي. يستخدمwhatsapp-agent-message-action-upload-fileالنهج نفسه معmessage(action=upload-file)ويراقب وسائط WhatsApp الأصلية. يثبتwhatsapp-group-agent-message-action-reactوwhatsapp-group-agent-message-action-upload-fileالإجراءات نفسها المرئية للمستخدم في مجموعة WhatsApp حقيقية. - توزيع المجموعة: يبدأ
whatsapp-broadcast-group-fanoutمن رسالة واحدة في مجموعة WhatsApp تتضمن إشارة، ويتحقق من ظهور ردود مميزة منmainوqa-second. - تنشيط المجموعة: يغيّر
whatsapp-group-activation-alwaysجلسة مجموعة حقيقية إلى/activation always، ويثبت أن رسالة مجموعة بلا إشارة توقظ الوكيل، ثم يستعيد/activation mention. ينشئwhatsapp-group-reply-to-bot-triggersردًا أوليًا من البوت، ويرسل إليه رد اقتباس أصليًا من دون إشارة صريحة، ويتحقق من أن الوكيل يستيقظ من سياق ذلك الرد. - الوسائط الواردة والرسائل المنظمة:
whatsapp-inbound-image-captionوwhatsapp-audio-preflightوwhatsapp-inbound-structured-messagesوwhatsapp-group-audio-gatingوwhatsapp-inbound-reaction-no-trigger. ترسل هذه أحداث صور وصوت ومستندات ومواقع وجهات اتصال وملصقات وتفاعلات حقيقية في WhatsApp عبر برنامج التشغيل. - اختبارات عقد Gateway المباشرة:
whatsapp-outbound-media-matrixوwhatsapp-outbound-document-preserves-filenameوwhatsapp-outbound-pollوwhatsapp-outbound-send-serializationوwhatsapp-group-outbound-mediaوwhatsapp-group-outbound-pollوwhatsapp-message-actionsوwhatsapp-reply-context-isolationوwhatsapp-reply-delivery-shape. تتجاوز هذه مطالبة النموذج عمدًا وتثبت عقودsendوpollوmessage.actionالحتمية في Gateway/القناة. - تغطية التحكم في الوصول:
whatsapp-access-control-dm-openوwhatsapp-access-control-dm-disabledوwhatsapp-access-control-group-openوwhatsapp-access-control-group-disabledوwhatsapp-group-allowlist-block. - الموافقات الأصلية:
whatsapp-approval-exec-deny-nativeوwhatsapp-approval-exec-nativeوwhatsapp-approval-exec-reaction-nativeوwhatsapp-approval-exec-group-reaction-nativeوwhatsapp-approval-plugin-native. - تفاعلات الحالة:
whatsapp-status-reactionsوwhatsapp-status-reaction-lifecycle.
يحتوي الكتالوج حاليًا على 52 سيناريو. يظل مسار live-frontier الافتراضي
صغيرًا عند 8 سيناريوهات لتوفير تغطية تحقق أولي سريعة. يشغّل مسار mock-openai
الافتراضي 39 سيناريو بصورة حتمية عبر نقل WhatsApp الحقيقي،
مع محاكاة مخرجات النموذج فقط؛ وتظل سيناريوهات الموافقة وبعض
عمليات التحقق الأثقل أو الحاجبة صريحة حسب معرّف السيناريو.
يراقب برنامج تشغيل ضمان جودة WhatsApp أحداثًا حية منظمة (text وmedia
وlocation وreaction وpoll)، ويمكنه إرسال الوسائط والاستطلاعات
وجهات الاتصال والمواقع والملصقات بفاعلية. يستورد مختبر ضمان الجودة برنامج التشغيل هذا عبر
سطح الحزمة @openclaw/whatsapp/api.js بدلًا من الوصول إلى ملفات
بيئة تشغيل WhatsApp الخاصة. بالنسبة إلى مراقبات المجموعات، يمثّل fromJid معرّف JID للمجموعة،
بينما يحدّد participantJid وfromPhoneE164 المرسل المشارك.
يُحجب محتوى الرسالة افتراضيًا. تُعد اختبارات Gateway المباشرة للاستطلاع وتحميل الملف
والوسائط واستطلاع المجموعة ووسائط المجموعة وشكل الرد عمليات تحقق لعقد
النقل/API؛ ولا تُعد دليلًا على أن مطالبة مستخدم جعلت
الوكيل يختار الإجراء نفسه. يأتي إثبات الإجراءات عبر مسار المستخدم من سيناريوهات
مثل whatsapp-agent-message-action-react و
whatsapp-group-agent-message-action-react، حيث يرسل برنامج التشغيل رسالة
WhatsApp عادية ويراقب مختبر ضمان الجودة عنصر WhatsApp الأصلي الناتج.
تتضمن تفاصيل سيناريو WhatsApp نهج كل سيناريو (user-path
أو direct-gateway أو native-approval) حتى لا يُساء فهم الأدلة على أنها تثبت
عقدًا أقوى مما تثبته بالفعل.
عناصر المخرجات:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json- إدخالات الأدلة لعمليات تحقق النقل المباشر.
مجموعة بيانات اعتماد Convex
يمكن لمسارات Discord وSlack وTelegram وWhatsApp استئجار بيانات اعتماد من
مجموعة Convex مشتركة بدلًا من قراءة متغيرات البيئة أعلاه. مرّر
--credential-source convex (أو عيّن OPENCLAW_QA_CREDENTIAL_SOURCE=convex)؛
يحصل مختبر ضمان الجودة على عقد إيجار حصري، ويرسل Heartbeat طوال مدة
التشغيل، ويحرره عند الإغلاق. أنواع المجموعة هي "discord" و"slack"
و"telegram" و"whatsapp".
أشكال الحمولة التي يتحقق منها الوسيط عند admin/add:
- Discord (
kind: "discord"): { guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }. - Telegram (
kind: "telegram"): { groupId: string, driverToken: string, sutToken: string }- يجب أن تكونgroupIdسلسلة معرّف دردشة رقمية. - مستخدم Telegram حقيقي (
kind: "telegram-user"): { groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }- لإثبات Mantis عبر Telegram Desktop فقط. يجب ألا تحصل مسارات مختبر ضمان الجودة العامة على هذا النوع. - WhatsApp (
kind: "whatsapp"): { driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }- يجب أن تكون أرقام الهواتف سلاسل E.164 مميزة.
يحتفظ سير عمل إثبات Mantis عبر Telegram Desktop بعقد إيجار Convex حصري واحد
من النوع telegram-user لكل من برنامج تشغيل TDLib CLI وشاهد Telegram Desktop،
ثم يحرره بعد نشر الإثبات.
عندما يحتاج طلب سحب إلى فرق مرئي حتمي، يمكن لـ Mantis استخدام رد النموذج الوهمي
نفسه على main وعلى رأس طلب السحب أثناء تغيّر منسّق Telegram أو
طبقة التسليم. ضُبطت إعدادات الالتقاط الافتراضية لتعليقات طلبات السحب: فئة
Crabbox قياسية، وتسجيل سطح مكتب بسرعة 24fps، وصورة GIF متحركة بسرعة 24fps، وعرض معاينة
1920px. ينبغي أن تنشر تعليقات ما قبل/بعد حزمة نظيفة لا تحتوي
إلا على صور GIF المقصودة.
يمكن لمسارات Slack أيضًا استخدام المجموعة. توجد عمليات التحقق من شكل حمولة Slack حاليًا
في مشغّل ضمان جودة Slack بدلًا من الوسيط؛ استخدم { channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }، مع
معرّف قناة Slack مثل Cxxxxxxxxxx. راجع
إعداد مساحة عمل Slack لتوفير التطبيق
والنطاقات.
توجد متغيرات البيئة التشغيلية وعقد نقطة نهاية وسيط Convex في الاختبار ← بيانات اعتماد Telegram المشتركة عبر Convex (اسم القسم أقدم من المجموعة متعددة القنوات؛ ودلالات عقد الإيجار مشتركة بين الأنواع).
البذور المدعومة من المستودع
توجد أصول البذور في qa/:
qa/scenarios/index.yamlqa/scenarios/<theme>/*.yaml
توجد هذه في git عمدًا حتى تكون خطة ضمان الجودة مرئية للبشر وللوكيل.
يظل qa-lab مشغّل سيناريوهات YAML عامًا. يمثّل كل ملف YAML للسيناريو
مصدر الحقيقة لتشغيل اختبار واحد، وينبغي أن يعرّف:
titleفي المستوى الأعلى- بيانات
scenarioالوصفية - بيانات وصفية اختيارية للفئة والقدرة والمسار والمخاطر في
scenario - مراجع الوثائق والشيفرة في
scenario - متطلبات Plugin الاختيارية في
scenario - تصحيحًا اختياريًا لإعدادات Gateway في
scenario flowقابلًا للتنفيذ في المستوى الأعلى لسيناريوهات التدفق، أوscenario.execution.kind/scenario.execution.pathلسيناريوهات Vitest و Playwright
يبقى سطح وقت التشغيل القابل لإعادة الاستخدام الذي يدعم flow عامًا
وشاملًا لعدة جوانب. على سبيل المثال، يمكن لسيناريوهات YAML دمج مساعدات جانب النقل
مع مساعدات جانب المتصفح التي تتحكم في واجهة Control UI المضمّنة عبر
واجهة browser.request في Gateway من دون إضافة مشغّل لحالة خاصة.
ينبغي تجميع ملفات السيناريو حسب قدرة المنتج بدلًا من مجلد شجرة
المصدر. أبقِ معرّفات السيناريو ثابتة عند نقل الملفات؛ واستخدم docsRefs و
codeRefs لإمكانية تتبّع التنفيذ.
ينبغي أن تظل القائمة الأساسية واسعة بما يكفي لتغطية:
- الرسائل المباشرة ودردشة القنوات
- سلوك سلاسل المحادثات
- دورة حياة إجراءات الرسائل
- استدعاءات Cron
- استرجاع الذاكرة
- تبديل النموذج
- تسليم المهمة إلى الوكيل الفرعي
- قراءة المستودع وقراءة الوثائق
- مهمة بناء صغيرة واحدة مثل Lobster Invaders
مسارات محاكاة المزوّد
يحتوي qa suite على مسارين محليين لمحاكاة المزوّد:
mock-openaiهو محاكي OpenClaw المدرك للسيناريوهات. ويظل مسار المحاكاة الحتمي الافتراضي لضمان الجودة المدعوم بالمستودع وبوابات التكافؤ.- يشغّل
aimockخادم مزوّد مدعومًا بـ AIMock لتغطية البروتوكول التجريبي والتركيبات والتسجيل/إعادة التشغيل والفوضى. وهو تكميلي ولا يستبدل موزّع سيناريوهاتmock-openai.
يوجد تنفيذ مسار المزوّد ضمن extensions/qa-lab/src/providers/.
يمتلك كل مزوّد إعداداته الافتراضية، وبدء تشغيل خادمه المحلي، وتهيئة نموذج Gateway،
واحتياجات إعداد ملف تعريف المصادقة، وعلامات إمكانات التشغيل الفعلي/المحاكاة. تمرّر الشيفرة المشتركة للحزمة
ولـ Gateway العمل عبر سجل المزوّدين بدلًا من التفريع بناءً على
أسماء المزوّدين.
محوّلات النقل
يمتلك qa-lab واجهة نقل عامة لسيناريوهات ضمان الجودة في YAML. ويمثّل qa-channel
الخيار الاصطناعي الافتراضي. يشغّل crabline خوادم محلية تحاكي المزوّدين
ويشغّل Plugins القنوات العادية في OpenClaw عليها. أما live فهو محجوز
لبيانات اعتماد المزوّدين الحقيقية والقنوات الخارجية.
على مستوى البنية، يكون التقسيم كالتالي:
- يمتلك
qa-labتنفيذ السيناريو العام، وتزامن العمال، وكتابة العناصر، وإعداد التقارير. - يمتلك محوّل النقل تهيئة Gateway، والتحقق من الجاهزية، ومراقبة الوارد والصادر، وإجراءات النقل، وحالة النقل الموحّدة.
- تحدّد ملفات سيناريو YAML ضمن
qa/scenarios/تشغيل الاختبار؛ ويوفّرqa-labسطح وقت التشغيل القابل لإعادة الاستخدام الذي ينفّذها.
إضافة قناة
تتطلب إضافة قناة إلى نظام ضمان الجودة في YAML تنفيذ القناة
إضافةً إلى حزمة سيناريوهات تختبر عقد القناة. ولتغطية CI
التمهيدية، أضف خادم المزوّد المحلي المطابق في Crabline وأتحه
من خلال برنامج تشغيل crabline.
لا تضف جذر أمر جديدًا من المستوى الأعلى لضمان الجودة عندما يستطيع مضيف qa-lab المشترك
امتلاك التدفق.
يمتلك qa-lab آليات المضيف المشتركة:
- جذر الأمر
openclaw qa - بدء تشغيل الحزمة وإنهاؤها
- تزامن العمال
- كتابة العناصر
- إنشاء التقارير
- تنفيذ السيناريو
- أسماء التوافق البديلة لسيناريوهات
qa-channelالأقدم
تمتلك Plugins المشغّل عقد النقل:
- كيفية تركيب
openclaw qa <runner>تحت جذرqaالمشترك - كيفية تهيئة Gateway لذلك النقل
- كيفية التحقق من الجاهزية
- كيفية حقن الأحداث الواردة
- كيفية مراقبة الرسائل الصادرة
- كيفية إتاحة النصوص المنسوخة وحالة النقل الموحّدة
- كيفية تنفيذ الإجراءات المدعومة بالنقل
- كيفية معالجة إعادة الضبط أو التنظيف الخاصين بالنقل
الحد الأدنى لاعتماد قناة جديدة:
- أبقِ
qa-labمالكًا لجذرqaالمشترك. - نفّذ مشغّل النقل على واجهة مضيف
qa-labالمشتركة. - أبقِ الآليات الخاصة بالنقل داخل Plugin المشغّل أو إطار اختبار القناة.
- ركّب المشغّل بصفته
openclaw qa <runner>بدلًا من تسجيل أمر جذري منافس. ينبغي أن تعلن Plugins المشغّل عنqaRunnersفيopenclaw.plugin.jsonوأن تصدّر مصفوفةqaRunnerCliRegistrationsمطابقة منruntime-api.ts. أبقِruntime-api.tsخفيفًا؛ وينبغي أن يظل تنفيذ CLI الكسول وتنفيذ المشغّل خلف نقاط دخول منفصلة. يتيحadapterFactoryاختياري النقل للسيناريوهات المشتركة من دون تغيير كتالوج السيناريوهات الحالي للأمر. - أنشئ أو عدّل سيناريوهات YAML ضمن أدلة
qa/scenarios/ذات السمات. - استخدم مساعدات السيناريو العامة للسيناريوهات الجديدة.
- أبقِ أسماء التوافق البديلة الحالية عاملة ما لم يكن المستودع يجري ترحيلًا مقصودًا.
قاعدة القرار صارمة:
- إذا أمكن التعبير عن السلوك مرة واحدة في
qa-lab، فضعه فيqa-lab. - إذا كان السلوك يعتمد على نقل قناة واحدة، فأبقِه في Plugin المشغّل أو إطار اختبار Plugin الخاص بها.
- إذا احتاج سيناريو إلى قدرة جديدة يمكن لأكثر من قناة استخدامها،
فأضف مساعدًا عامًا بدلًا من فرع خاص بقناة في
suite.ts. - إذا كان السلوك ذا معنى لنوع نقل واحد فقط، فأبقِ السيناريو خاصًا بالنقل واجعل ذلك صريحًا في عقد السيناريو.
أسماء مساعدات السيناريو
المساعدات العامة المفضلة للسيناريوهات الجديدة:
waitForTransportReadywaitForChannelReadyinjectInboundMessageinjectOutboundMessagewaitForTransportOutboundMessagewaitForChannelOutboundMessagewaitForNoTransportOutboundgetTransportSnapshotreadTransportMessagereadTransportTranscriptformatTransportTranscriptresetTransport
تظل أسماء التوافق البديلة متاحة للسيناريوهات الحالية -
waitForQaChannelReady، وwaitForOutboundMessage، وwaitForNoOutbound،
وformatConversationTranscript، وresetBus - لكن ينبغي عند إنشاء سيناريوهات جديدة
استخدام الأسماء العامة. توجد الأسماء البديلة لتجنب
ترحيل شامل دفعة واحدة، لا باعتبارها النموذج المعتمد مستقبلًا.
إعداد التقارير
يصدّر qa-lab تقرير بروتوكول بتنسيق Markdown من المخطط الزمني المرصود لناقل الأحداث.
ينبغي أن يجيب التقرير عن:
- ما الذي نجح
- ما الذي فشل
- ما الذي ظل محظورًا
- ما سيناريوهات المتابعة الجديرة بالإضافة
للحصول على قائمة السيناريوهات المتاحة - وهي مفيدة عند تقدير حجم عمل المتابعة
أو توصيل نقل جديد - شغّل pnpm openclaw qa coverage (وأضف --json
لإخراج قابل للقراءة آليًا). عند اختيار إثبات مركّز لسلوك
أو مسار ملف جرى لمسه، شغّل pnpm openclaw qa coverage --match <query>. يبحث
تقرير المطابقة في بيانات السيناريو الوصفية، ومراجع الوثائق، ومراجع الشيفرة، ومعرّفات التغطية،
وPlugins، ومتطلبات المزوّدين، ثم يطبع أهداف qa suite --scenario ... المطابقة.
يكتب كل تشغيل لـ qa suite العناصر ذات المستوى الأعلى qa-evidence.json،
وqa-suite-summary.json، وqa-suite-report.md لمجموعة
السيناريوهات المحددة. تشغّل السيناريوهات التي تعلن execution.kind: vitest أو
execution.kind: playwright مسار الاختبار المطابق وتكتب أيضًا
سجلات خاصة بكل سيناريو. وتشغّل السيناريوهات التي تعلن execution.kind: script
منتج الأدلة في execution.path عبر node --import tsx (مع
توسيع ${outputDir} و${scenarioId} في execution.args)؛ ويكتب
المنتج ملف qa-evidence.json الخاص به، وتُستورد إدخالاته إلى
مخرجات الحزمة، وتُحل مسارات عناصره نسبةً إلى
qa-evidence.json الخاص بذلك المنتج. وعند الوصول إلى qa suite عبر qa run --qa-profile، يتضمن qa-evidence.json نفسه أيضًا ملخص
بطاقة أداء ملف التعريف لفئات التصنيف المحددة.
تعامل مع مخرجات التغطية بوصفها أداة مساعدة للاكتشاف، لا بديلًا عن البوابة؛ فلا يزال السيناريو المحدد يحتاج إلى وضع المزوّد المناسب أو النقل الفعلي أو Multipass أو Testbox أو مسار الإصدار المناسب للسلوك الخاضع للاختبار. للاطلاع على سياق بطاقة الأداء، راجع بطاقة أداء النضج.
لفحوص الشخصية والأسلوب، شغّل السيناريو نفسه عبر عدة مراجع نماذج فعلية واكتب تقرير Markdown مُقيّمًا:
pnpm openclaw qa character-eval \ --model openai/gpt-5.6-luna,thinking=medium,fast \ --model openai/gpt-5.2,thinking=xhigh \ --model openai/gpt-5,thinking=xhigh \ --model anthropic/claude-opus-4-8,thinking=high \ --model anthropic/claude-sonnet-4-6,thinking=high \ --model zai/glm-5.1,thinking=high \ --model moonshot/kimi-k2.5,thinking=high \ --model google/gemini-3.1-pro-preview,thinking=high \ --judge-model openai/gpt-5.6-sol,thinking=xhigh,fast \ --judge-model anthropic/claude-opus-4-8,thinking=high \ --blind-judge-models \ --concurrency 16 \ --judge-concurrency 16يشغّل الأمر عمليات فرعية محلية لـ Gateway ضمان الجودة، وليس Docker. ينبغي
أن تضبط سيناريوهات تقييم الشخصية الهوية عبر SOUL.md، ثم تشغّل أدوار
مستخدم عادية مثل الدردشة، والمساعدة في مساحة العمل، ومهام الملفات الصغيرة. ينبغي ألا
يُخبَر النموذج المرشح بأنه قيد التقييم. يحتفظ الأمر
بالنص المنسوخ الكامل لكل تشغيل، ويسجل إحصاءات التشغيل الأساسية، ثم يطلب من نماذج التحكيم في
الوضع السريع مع استدلال xhigh حيثما كان مدعومًا ترتيب عمليات التشغيل حسب
الطبيعية، والطابع العام، والفكاهة. استخدم --blind-judge-models عند مقارنة
المزوّدين: تظل مطالبة المحكّم تتلقى كل نص منسوخ وحالة تشغيل، لكن
تُستبدل مراجع المرشحين بتسميات محايدة مثل candidate-01؛ ويعيد
التقرير ربط الترتيبات بالمراجع الحقيقية بعد التحليل.
تستخدم عمليات تشغيل المرشحين افتراضيًا نمط التفكير high، مع medium لـ GPT-5.6 Luna و
xhigh لمراجع تقييم OpenAI الأقدم التي تدعمه. تجاوز إعداد مرشح محدد
ضمن السطر باستخدام --model provider/model,thinking=<level>؛ وتدعم
الخيارات المضمّنة أيضًا fast، وno-fast، وfast=<bool>. لا يزال --thinking <level> يضبط قيمة احتياطية عامة، ويُحتفظ بصيغة --model-thinking <provider/model=level> الأقدم للتوافق. تستخدم مراجع مرشحي OpenAI
الوضع السريع افتراضيًا بحيث تُستخدم المعالجة ذات الأولوية عندما يدعمها المزوّد.
مرّر --fast فقط عندما تريد فرض تشغيل الوضع السريع
لكل نموذج مرشح. تُسجّل مدد المرشحين والمحكّمين في
التقرير لتحليل المعايير المرجعية، لكن مطالبات المحكّمين تنص صراحةً على عدم الترتيب
حسب السرعة. تستخدم عمليات تشغيل نماذج المرشحين والمحكّمين تزامنًا افتراضيًا قدره 16.
خفّض --concurrency أو --judge-concurrency عندما تجعل حدود المزوّد أو ضغط
Gateway المحلي التشغيل كثير التشويش.
عندما لا يُمرّر --model للمرشح، يستخدم تقييم الشخصية افتراضيًا
openai/gpt-5.6-luna، وopenai/gpt-5.2، وopenai/gpt-5،
وanthropic/claude-opus-4-8، وanthropic/claude-sonnet-4-6، وzai/glm-5.1،
وmoonshot/kimi-k2.5، وgoogle/gemini-3.1-pro-preview. وعندما لا
يُمرّر --judge-model، يستخدم المحكّمون افتراضيًا
openai/gpt-5.6-sol,thinking=xhigh,fast و
anthropic/claude-opus-4-8,thinking=high.