Testing
آزمایش
OpenClaw سه مجموعه Vitest دارد (واحد/یکپارچهسازی، e2e، زنده) و مجموعهای کوچک از اجراکنندههای Docker. این سند راهنمای «ما چگونه تست میکنیم» است:
- هر مجموعه چه چیزهایی را پوشش میدهد (و عمداً چه چیزهایی را پوشش نمیدهد).
- برای گردشکارهای رایج (محلی، پیش از push، اشکالزدایی) کدام فرمانها را اجرا کنید.
- تستهای زنده چگونه اعتبارنامهها را کشف میکنند و مدلها/ارائهدهندهها را انتخاب میکنند.
- چگونه برای مشکلات واقعی مدل/ارائهدهنده، رگرسیون اضافه کنید.
شروع سریع
در بیشتر روزها:
- دروازه کامل (پیش از push انتظار میرود):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - اجرای سریعتر مجموعه کامل محلی روی دستگاهی با فضای کافی:
pnpm test:max - حلقه مستقیم watch در Vitest:
pnpm test:watch - هدفگیری مستقیم فایل اکنون مسیرهای افزونه/کانال را هم مسیریابی میکند:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - وقتی روی یک شکست منفرد تکرار میکنید، ابتدا اجراهای هدفمند را ترجیح دهید.
- سایت QA مبتنی بر Docker:
pnpm qa:lab:up - مسیر QA مبتنی بر VM لینوکس:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
وقتی تستها را لمس میکنید یا اطمینان بیشتری میخواهید:
- دروازه پوشش:
pnpm test:coverage - مجموعه E2E:
pnpm test:e2e
دایرکتوریهای موقت تست
برای دایرکتوریهای موقت متعلق به تست، helperهای مشترک در test/helpers/temp-dir.ts
را ترجیح دهید. آنها مالکیت را صریح میکنند و پاکسازی را در همان چرخه عمر
تست نگه میدارند:
const tempDirs = useAutoCleanupTempDirTracker(afterEach); it("uses a temp workspace", () => { const workspace = tempDirs.make("openclaw-example-"); // use workspace});useAutoCleanupTempDirTracker(afterEach) عمداً هیچ روش پاکسازی دستیای ارائه نمیکند؛ Vitest
پس از هر تست مالک پاکسازی است. helperهای سطح پایین موجود برای تستهایی که
هنوز منتقل نشدهاند باقی میمانند، اما تستهای جدید و منتقلشده باید از tracker
پاکسازی خودکار استفاده کنند. از کاربرد جدید makeTempDir، cleanupTempDirs یا
createTempDirTracker دستی و نیز از فراخوانیهای خام fs.mkdtemp* در تستها پرهیز کنید،
مگر اینکه موردی صراحتاً رفتار خام temp-dir را راستیآزمایی کند. وقتی یک تست عمداً به یک دایرکتوری موقت خام نیاز دارد، یک کامنت allow قابل ممیزی
با دلیل مشخص اضافه کنید:
// openclaw-temp-dir: allow verifies raw fs cleanup behaviorconst workspace = fs.mkdtempSync(prefix);برای شفافیت مهاجرت، node scripts/report-test-temp-creations.mjs ایجاد temp-dir خام جدید
و کاربرد جدید helper مشترک دستی را در خطوط افزودهشده diff گزارش میکند،
بدون اینکه سبکهای پاکسازی موجود را مسدود کند. دامنه فایل آن عمداً همان
طبقهبندی مسیر تست را دنبال میکند که scripts/changed-lanes.mjs استفاده میکند،
بهجای نگهداری یک heuristic جداگانه برای نام فایل helper تست، و همزمان
خود پیادهسازی helper مشترک را نادیده میگیرد. check:changed این گزارش را برای
مسیرهای تست تغییرکرده بهعنوان سیگنال CI فقط هشدار اجرا میکند؛ یافتهها annotationهای هشدار GitHub
هستند، نه شکست.
هنگام اشکالزدایی ارائهدهندهها/مدلهای واقعی (نیازمند اعتبارنامههای واقعی):
- مجموعه زنده (مدلها + probeهای ابزار/تصویر Gateway):
pnpm test:live - هدفگیری بیسروصدای یک فایل زنده:
pnpm test:live -- src/agents/models.profiles.live.test.ts - گزارشهای کارایی runtime:
OpenClaw Performanceرا باlive_openai_candidate=trueبرای یک نوبت عامل واقعیopenai/gpt-5.5یاdeep_profile=trueبرای artifactهای CPU/heap/trace مربوط به Kova dispatch کنید. اجراهای زمانبندیشده روزانه وقتیCLAWGRIT_REPORTS_TOKENپیکربندی شده باشد، artifactهای مسیر mock-provider، deep-profile و GPT 5.5 را درopenclaw/clawgrit-reportsمنتشر میکنند. گزارش mock-provider همچنین شامل اعداد boot سطح منبع Gateway، حافظه، plugin-pressure، hello-loop تکراری fake-model و startup در CLI است. - sweep مدل زنده Docker:
pnpm test:docker:live-models- هر مدل انتخابشده اکنون یک نوبت متنی بهعلاوه یک probe کوچک شبیه فایلخوانی اجرا میکند.
مدلهایی که metadata آنها ورودی
imageرا اعلام میکند، یک نوبت تصویر کوچک نیز اجرا میکنند. هنگام جداسازی شکستهای ارائهدهنده، probeهای اضافه را باOPENCLAW_LIVE_MODEL_FILE_PROBE=0یاOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0غیرفعال کنید. - پوشش CI:
OpenClaw Scheduled Live And E2E Checksروزانه وOpenClaw Release Checksدستی هر دو workflow قابل استفاده مجدد زنده/E2E را باinclude_live_suites: trueفراخوانی میکنند، که شامل jobهای ماتریسی جداگانه مدل زنده Docker است که بر اساس ارائهدهنده shard شدهاند. - برای اجرای دوباره متمرکز CI،
OpenClaw Live And E2E Checks (Reusable)را باinclude_live_suites: trueوlive_models_only: truedispatch کنید. - secretهای جدید و پرسیگنال ارائهدهنده را به
scripts/ci-hydrate-live-auth.shبهعلاوه.github/workflows/openclaw-live-and-e2e-checks-reusable.ymlو فراخوانهای زمانبندیشده/انتشار آن اضافه کنید.
- هر مدل انتخابشده اکنون یک نوبت متنی بهعلاوه یک probe کوچک شبیه فایلخوانی اجرا میکند.
مدلهایی که metadata آنها ورودی
- smoke گفتوگوی bound بومی Codex:
pnpm test:docker:live-codex-bind- یک مسیر زنده Docker را روی مسیر app-server در Codex اجرا میکند، یک DM مصنوعی
Slack را با
/codex bindbind میکند،/codex fastو/codex permissionsرا تمرین میکند، سپس یک پاسخ ساده و یک پیوست تصویر را از طریق binding بومی Plugin بهجای ACP راستیآزمایی میکند.
- یک مسیر زنده Docker را روی مسیر app-server در Codex اجرا میکند، یک DM مصنوعی
Slack را با
- smoke harness app-server در Codex:
pnpm test:docker:live-codex-harness- نوبتهای عامل Gateway را از طریق harness app-server متعلق به Plugin در Codex اجرا میکند،
/codex statusو/codex modelsرا راستیآزمایی میکند و بهصورت پیشفرض probeهای تصویر، cron MCP، sub-agent و Guardian را تمرین میکند. هنگام جداسازی سایر شکستهای app-server در Codex، probe sub-agent را باOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0غیرفعال کنید. برای بررسی متمرکز sub-agent، probeهای دیگر را غیرفعال کنید:OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness. این پس از probe sub-agent خارج میشود مگر اینکهOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0تنظیم شده باشد.
- نوبتهای عامل Gateway را از طریق harness app-server متعلق به Plugin در Codex اجرا میکند،
- smoke نصب درخواستی Codex:
pnpm test:docker:codex-on-demand- tarball بستهبندیشده OpenClaw را در Docker نصب میکند، onboarding کلید API
OpenAI را اجرا میکند، و راستیآزمایی میکند که Plugin مربوط به Codex بههمراه وابستگی
@openai/codexدر صورت نیاز در ریشه پروژه npm مدیریتشده دانلود شدهاند.
- tarball بستهبندیشده OpenClaw را در Docker نصب میکند، onboarding کلید API
OpenAI را اجرا میکند، و راستیآزمایی میکند که Plugin مربوط به Codex بههمراه وابستگی
- smoke وابستگی ابزار Plugin زنده:
pnpm test:docker:live-plugin-tool- یک Plugin fixture با وابستگی واقعی
slugifyرا بستهبندی میکند، آن را از طریقnpm-pack:نصب میکند، وابستگی را زیر ریشه پروژه npm مدیریتشده راستیآزمایی میکند، سپس از یک مدل زنده OpenAI میخواهد ابزار Plugin را فراخوانی کند و slug پنهان را برگرداند.
- یک Plugin fixture با وابستگی واقعی
- smoke فرمان نجات Crestodian:
pnpm test:live:crestodian-rescue-channel- بررسی opt-in کمربند و بند اضافه برای سطح فرمان نجات message-channel.
/crestodian statusرا تمرین میکند، یک تغییر مدل پایدار را در صف قرار میدهد، به/crestodian yesپاسخ میدهد و مسیر نوشتن audit/config را راستیآزمایی میکند.
- بررسی opt-in کمربند و بند اضافه برای سطح فرمان نجات message-channel.
- smoke برنامهریز Docker در Crestodian:
pnpm test:docker:crestodian-planner- Crestodian را در یک container بدون config با یک CLI جعلی Claude روی
PATHاجرا میکند و راستیآزمایی میکند که fallback برنامهریز fuzzy به یک نوشتن config typed ممیزیشده ترجمه میشود.
- Crestodian را در یک container بدون config با یک CLI جعلی Claude روی
- smoke اجرای نخست Docker در Crestodian:
pnpm test:docker:crestodian-first-run- از یک دایرکتوری state خالی OpenClaw شروع میکند، entrypoint مدرن onboard
Crestodian را راستیآزمایی میکند، نوشتنهای setup/model/agent/Plugin Discord + SecretRef
را اعمال میکند، config را اعتبارسنجی میکند و entryهای audit را راستیآزمایی میکند. همان مسیر setup در Ring 0
در QA Lab نیز با
pnpm openclaw qa suite --scenario crestodian-ring-zero-setupپوشش داده شده است.
- از یک دایرکتوری state خالی OpenClaw شروع میکند، entrypoint مدرن onboard
Crestodian را راستیآزمایی میکند، نوشتنهای setup/model/agent/Plugin Discord + SecretRef
را اعمال میکند، config را اعتبارسنجی میکند و entryهای audit را راستیآزمایی میکند. همان مسیر setup در Ring 0
در QA Lab نیز با
- smoke هزینه Moonshot/Kimi: با تنظیم
MOONSHOT_API_KEY، اجرا کنیدopenclaw models list --provider moonshot --json، سپس یک اجرای ایزولهopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonرا رویmoonshot/kimi-k2.6اجرا کنید. راستیآزمایی کنید که JSON، Moonshot/K2.6 را گزارش میکند و transcript دستیار مقدار normalizeشدهusage.costرا ذخیره میکند.
اجراکنندههای اختصاصی QA
این فرمانها زمانی کنار مجموعههای تست اصلی قرار میگیرند که به واقعگرایی QA-lab نیاز دارید:
CI، QA Lab را در workflowهای اختصاصی اجرا میکند. همترازی عاملمحور زیر
QA-Lab - All Lanes و اعتبارسنجی انتشار nest شده است، نه یک workflow مستقل PR.
اعتبارسنجی گسترده باید از Full Release Validation با
rerun_group=qa-parity یا گروه QA در release-checks استفاده کند. بررسیهای انتشار stable/default
soak جامع زنده/Docker را پشت run_release_soak=true نگه میدارند؛
profile full، soak را اجباری میکند. QA-Lab - All Lanes
هر شب روی main و از dispatch دستی با مسیر همترازی mock، مسیر زنده
Matrix، مسیر زنده Telegram مدیریتشده با Convex و مسیر زنده Discord
مدیریتشده با Convex بهعنوان jobهای موازی اجرا میشود. QA زمانبندیشده و بررسیهای انتشار، Matrix
--profile fast را صراحتاً پاس میدهند، در حالی که ورودی workflow دستی و پیشفرض CLI ماتریس
همچنان all باقی میمانند؛ dispatch دستی میتواند all را به jobهای transport،
media، e2ee-smoke، e2ee-deep و e2ee-cli shard کند. OpenClaw Release Checks پیش از approval انتشار، همترازی بهعلاوه مسیرهای سریع Matrix و Telegram را اجرا میکند
و برای بررسیهای انتقال انتشار از mock-openai/gpt-5.5 استفاده میکند تا
deterministic بمانند و از startup معمول provider-plugin پرهیز کنند. این Gatewayهای انتقال زنده
جستوجوی حافظه را غیرفعال میکنند؛ رفتار حافظه همچنان توسط مجموعههای همترازی QA
پوشش داده میشود.
shardهای رسانه زنده انتشار کامل از
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04 استفاده میکنند که از قبل
ffmpeg و ffprobe دارد. shardهای مدل/backend زنده Docker از تصویر مشترک
ghcr.io/openclaw/openclaw-live-test:<sha> استفاده میکنند که یکبار برای commit انتخابشده
ساخته میشود، سپس بهجای بازسازی درون هر shard، آن را با OPENCLAW_SKIP_DOCKER_BUILD=1
pull میکنند.
pnpm openclaw qa suite- سناریوهای QA پشتیبانیشده توسط مخزن را مستقیماً روی میزبان اجرا میکند.
- artifactهای سطح بالای
qa-evidence.json،qa-suite-summary.jsonوqa-suite-report.mdرا برای مجموعه سناریوی انتخابشده مینویسد، از جمله انتخابهای سناریوی جریان ترکیبی، Vitest و Playwright. - وقتی با
pnpm openclaw qa run --qa-profile <profile>dispatch شود، scorecard پروفایل taxonomy انتخابشده را در همانqa-evidence.jsonجاسازی میکند.smoke-ciشواهد کمحجم مینویسد کهevidenceMode: "slim"را تنظیم میکند وexecutionهر ورودی را حذف میکند.releaseبخش گزینششده آمادگی انتشار را پوشش میدهد؛allهمه دستههای maturity فعال را انتخاب میکند و برای dispatchهای صریح گردشکار QA Profile Evidence در زمانی در نظر گرفته شده است که artifact کامل scorecard لازم باشد. - بهطور پیشفرض چند سناریوی انتخابشده را بهصورت موازی با workerهای ایزوله
gateway اجرا میکند.
qa-channelبهطور پیشفرض concurrency برابر 4 دارد (محدود به تعداد سناریوهای انتخابشده). از--concurrency <count>برای تنظیم تعداد workerها، یا از--concurrency 1برای lane سریال قدیمیتر استفاده کنید. - اگر هر سناریویی شکست بخورد با کد غیرصفر خارج میشود. وقتی artifactها را بدون
کد خروج شکستخورده میخواهید، از
--allow-failuresاستفاده کنید. - از حالتهای provider یعنی
live-frontier،mock-openaiوaimockپشتیبانی میکند.aimockیک سرور provider محلی پشتیبانیشده با AIMock را برای پوشش آزمایشی fixture و protocol-mock راهاندازی میکند، بدون اینکه lane آگاه از سناریویmock-openaiرا جایگزین کند.
pnpm openclaw qa coverage --match <query>- شناسههای سناریو، عنوانها، surfaceها، شناسههای پوشش، ارجاعهای docs، ارجاعهای code، Pluginها و نیازمندیهای provider را جستوجو میکند، سپس targetهای suite منطبق را چاپ میکند.
- وقتی رفتار یا مسیر فایل لمسشده را میدانید اما کوچکترین سناریو را نمیدانید، قبل از اجرای QA Lab از این استفاده کنید. این فقط جنبه راهنمایی دارد؛ همچنان proof mock، live، Multipass، Matrix یا transport را بر اساس رفتاری که تغییر میکند انتخاب کنید.
pnpm test:plugins:kitchen-sink-live- gauntlet زنده Plugin OpenAI Kitchen Sink را از طریق QA Lab اجرا میکند. این کار
بسته خارجی Kitchen Sink را نصب میکند، inventory سطح Plugin SDK را تأیید میکند،
/healthzو/readyzرا probe میکند، شواهد CPU/RSS Gateway را ثبت میکند، یک نوبت زنده OpenAI را اجرا میکند و diagnostics خصمانه را بررسی میکند. به auth زنده OpenAI مانندOPENAI_API_KEYنیاز دارد. در sessionهای hydrated Testbox وقتی helper با نامopenclaw-testbox-envحاضر باشد، بهطور خودکار پروفایل live-auth مربوط به Testbox را source میکند.
- gauntlet زنده Plugin OpenAI Kitchen Sink را از طریق QA Lab اجرا میکند. این کار
بسته خارجی Kitchen Sink را نصب میکند، inventory سطح Plugin SDK را تأیید میکند،
pnpm test:gateway:cpu-scenarios- bench راهاندازی gateway را بههمراه یک بسته کوچک سناریوی mock QA Lab
(
channel-chat-baseline،memory-failure-fallback،gateway-restart-inflight-run) اجرا میکند و خلاصه ترکیبی مشاهده CPU را زیر.artifacts/gateway-cpu-scenarios/مینویسد. - بهطور پیشفرض فقط مشاهدات CPU داغ و پایدار را flag میکند (
--cpu-core-warnبهعلاوه--hot-wall-warn-ms)، بنابراین burstهای کوتاه راهاندازی بهعنوان metric ثبت میشوند بدون اینکه شبیه رگرسیون چنددقیقهای peg شدن gateway به نظر برسند. - از artifactهای ساختهشده
distاستفاده میکند؛ وقتی checkout از قبل خروجی runtime تازه ندارد، ابتدا build را اجرا کنید.
- bench راهاندازی gateway را بههمراه یک بسته کوچک سناریوی mock QA Lab
(
pnpm openclaw qa suite --runner multipass- همان suite مربوط به QA را داخل یک VM یکبارمصرف Linux با Multipass اجرا میکند.
- همان رفتار انتخاب سناریو را مانند
qa suiteروی میزبان حفظ میکند. - همان flagهای انتخاب provider/model را مانند
qa suiteدوباره استفاده میکند. - اجراهای live ورودیهای auth پشتیبانیشده QA را که برای guest عملی هستند forward میکنند:
کلیدهای provider مبتنی بر env، مسیر config مربوط به QA live provider، و
CODEX_HOMEوقتی حاضر باشد. - دایرکتوریهای خروجی باید زیر root مخزن بمانند تا guest بتواند از طریق workspace mountشده بنویسد.
- گزارش و خلاصه عادی QA بهعلاوه logهای Multipass را زیر
.artifacts/qa-e2e/...مینویسد.
pnpm qa:lab:up- سایت QA پشتیبانیشده با Docker را برای کار QA به سبک operator راهاندازی میکند.
pnpm test:docker:npm-onboard-channel-agent- از checkout فعلی یک tarball مربوط به npm میسازد، آن را بهصورت global در Docker نصب میکند، onboarding غیرتعاملی OpenAI API-key را اجرا میکند، بهطور پیشفرض Telegram را پیکربندی میکند، تأیید میکند runtime بستهبندیشده Plugin بدون تعمیر وابستگی راهاندازی load میشود، doctor را اجرا میکند، و یک نوبت agent محلی را در برابر endpoint شبیهسازیشده OpenAI اجرا میکند.
- برای اجرای همان lane نصب بستهبندیشده با Discord از
OPENCLAW_NPM_ONBOARD_CHANNEL=discordاستفاده کنید.
pnpm test:docker:session-runtime-context- یک smoke قطعی Docker برای app ساختهشده درباره transcriptهای context تعبیهشده runtime
اجرا میکند. تأیید میکند context پنهان runtime مربوط به OpenClaw بهعنوان یک پیام
custom غیرنمایشی persist میشود، نه اینکه به نوبت قابلمشاهده کاربر leak شود؛ سپس یک
session JSONL خرابِ affected را seed میکند و تأیید میکند
openclaw doctor --fixآن را با یک backup به branch فعال بازنویسی میکند.
- یک smoke قطعی Docker برای app ساختهشده درباره transcriptهای context تعبیهشده runtime
اجرا میکند. تأیید میکند context پنهان runtime مربوط به OpenClaw بهعنوان یک پیام
custom غیرنمایشی persist میشود، نه اینکه به نوبت قابلمشاهده کاربر leak شود؛ سپس یک
session JSONL خرابِ affected را seed میکند و تأیید میکند
pnpm test:docker:npm-telegram-live- یک package candidate مربوط به OpenClaw را در Docker نصب میکند، onboarding بسته نصبشده را اجرا میکند، Telegram را از طریق CLI نصبشده پیکربندی میکند، سپس lane زنده QA برای Telegram را با همان بسته نصبشده بهعنوان SUT Gateway دوباره استفاده میکند.
- wrapper فقط منبع harness مربوط به
qa-labرا از checkout mount میکند؛ بسته نصبشده مالکdist،openclaw/plugin-sdkو runtime Pluginهای bundled است تا lane، Pluginهای checkout فعلی را با بسته تحت آزمون ترکیب نکند. - مقدار پیشفرض
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@betaاست؛ برای آزمودن یک tarball محلی resolveشده بهجای نصب از registry،OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzیاOPENCLAW_CURRENT_PACKAGE_TGZرا تنظیم کنید. - بهطور پیشفرض timing تکرارشونده RTT را با
OPENCLAW_NPM_TELEGRAM_RTT_SAMPLES=20درqa-evidence.jsonمنتشر میکند. برای تنظیم اجرای RTT،OPENCLAW_NPM_TELEGRAM_RTT_SAMPLES،OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MSیاOPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURESرا override کنید.OPENCLAW_NPM_TELEGRAM_RTT_CHECKSفهرستی جداشده با کاما از شناسههای check مربوط به Telegram QA را برای نمونهبرداری میپذیرد؛ وقتی تنظیم نشده باشد، check پیشفرض دارای قابلیت RTT برابرtelegram-mentioned-message-replyاست. - از همان credentialهای env مربوط به Telegram یا منبع credential مربوط به Convex مانند
pnpm openclaw qa telegramاستفاده میکند. برای automation مربوط به CI/release،OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexرا بههمراهOPENCLAW_QA_CONVEX_SITE_URLو یک role secret تنظیم کنید. اگرOPENCLAW_QA_CONVEX_SITE_URLو یک Convex role secret در CI حاضر باشند، wrapper مربوط به Docker بهطور خودکار Convex را انتخاب میکند. - wrapper، env مربوط به credentialهای Telegram یا Convex را پیش از کار build/install
در Docker روی میزبان validate میکند.
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1را فقط وقتی تنظیم کنید که عمداً setup پیش از credential را debug میکنید. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerمقدار sharedOPENCLAW_QA_CREDENTIAL_ROLEرا فقط برای این lane override میکند. وقتی credentialهای Convex انتخاب شدهاند و هیچ roleای تنظیم نشده است، wrapper در CI ازciو خارج از CI ازmaintainerاستفاده میکند.- GitHub Actions این lane را بهعنوان گردشکار دستی maintainer با نام
NPM Telegram Beta E2Eارائه میکند. روی merge اجرا نمیشود. این گردشکار از محیطqa-live-sharedو leaseهای credential مربوط به Convex CI استفاده میکند.
- GitHub Actions همچنین
Package Acceptanceرا برای proof محصول در side-run در برابر یک بسته candidate ارائه میکند. این گردشکار یک ref مورداعتماد، spec منتشرشده npm، URL مربوط به tarball با HTTPS بههمراه SHA-256، یا artifact مربوط به tarball از اجرای دیگر را میپذیرد،openclaw-current.tgzنرمالشده را بهعنوانpackage-under-testupload میکند، سپس scheduler موجود Docker E2E را با profileهای lane شامل smoke، package، product، full یا custom اجرا میکند. برای اجرای گردشکار Telegram QA در برابر همان artifactpackage-under-test،telegram_mode=mock-openaiیاlive-frontierرا تنظیم کنید.- proof محصول برای آخرین beta:
gh workflow run package-acceptance.yml --ref main \ -f source=npm \ -f package_spec=openclaw@beta \ -f suite_profile=product \ -f telegram_mode=mock-openai- proof مربوط به URL دقیق tarball به digest نیاز دارد و از سیاست ایمنی URL عمومی استفاده میکند:
gh workflow run package-acceptance.yml --ref main \ -f source=url \ -f package_url=https://registry.npmjs.org/openclaw/-/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=package- mirrorهای enterprise/private tarball از سیاست صریح trusted-source استفاده میکنند:
gh workflow run package-acceptance.yml --ref main \ -f source=trusted-url \ -f trusted_source_id=enterprise-artifactory \ -f package_url=https://packages.example.internal:8443/artifactory/openclaw/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=packagesource=trusted-url فایل .github/package-trusted-sources.json را از ref مورداعتماد گردشکار میخواند و credentialهای URL یا bypass شبکه خصوصی بهصورت workflow-input را نمیپذیرد. اگر policy نامگذاریشده bearer auth را declare کند، secret ثابت OPENCLAW_TRUSTED_PACKAGE_TOKEN را پیکربندی کنید.
- proof مربوط به artifact یک artifact از نوع tarball را از اجرای دیگر Actions دانلود میکند:
gh workflow run package-acceptance.yml --ref main \ -f source=artifact \ -f artifact_run_id=<run-id> \ -f artifact_name=<artifact-name> \ -f suite_profile=smoke-
pnpm test:docker:plugins- build فعلی OpenClaw را در Docker pack و نصب میکند، Gateway را با OpenAI پیکربندیشده راهاندازی میکند، سپس channel/Pluginهای bundled را از طریق ویرایشهای config فعال میکند.
- تأیید میکند discovery مربوط به setup، Pluginهای قابلدانلودِ پیکربندینشده را غایب باقی میگذارد، نخستین repair پیکربندیشده doctor هر Plugin قابلدانلود مفقود را صراحتاً نصب میکند، و restart دوم repair پنهان dependency را اجرا نمیکند.
- همچنین یک baseline قدیمیتر و شناختهشده npm را نصب میکند، Telegram را پیش از اجرای
openclaw update --tag <candidate>فعال میکند، و تأیید میکند doctor پس از update مربوط به candidate، debris وابستگی Plugin legacy را بدون repair postinstall در سمت harness پاک میکند.
-
pnpm test:parallels:npm-update-
smoke مربوط به update نصب بستهبندیشده native را در guestهای Parallels اجرا میکند. هر platform انتخابشده ابتدا بسته baseline درخواستشده را نصب میکند، سپس command نصبشده
openclaw updateرا در همان guest اجرا میکند و نسخه نصبشده، وضعیت update، آمادگی gateway و یک نوبت agent محلی را تأیید میکند. -
هنگام iterate روی یک guest از
--platform macos،--platform windowsیا--platform linuxاستفاده کنید. برای مسیر artifact خلاصه و وضعیت هر lane از--jsonاستفاده کنید. -
lane مربوط به OpenAI بهطور پیشفرض از
openai/gpt-5.5برای proof نوبت agent زنده استفاده میکند. وقتی عمداً model دیگری از OpenAI را validate میکنید،--model <provider/model>را pass کنید یاOPENCLAW_PARALLELS_OPENAI_MODELرا تنظیم کنید. -
اجراهای محلی طولانی را در timeout میزبان wrap کنید تا stallهای transport مربوط به Parallels نتوانند باقی پنجره testing را مصرف کنند:
bash timeout --foreground 150m pnpm test:parallels:npm-update -- --jsontimeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
script logهای تو در توی lane را زیر
/tmp/openclaw-parallels-npm-update.*مینویسد. پیش از اینکه فرض کنید wrapper بیرونی hang شده است،windows-update.log،macos-update.logیاlinux-update.logرا بررسی کنید. -
update در Windows میتواند روی guest سرد 10 تا 15 دقیقه را در doctor پس از update و کار update package صرف کند؛ وقتی log تو در توی debug مربوط به npm در حال پیشروی است، این وضعیت همچنان سالم است.
-
این wrapper تجمیعی را همزمان با laneهای smoke جداگانه Parallels برای macOS، Windows یا Linux اجرا نکنید. آنها state مربوط به VM را share میکنند و ممکن است در restore snapshot، سرو کردن package یا state مربوط به gateway در guest با هم collision داشته باشند.
-
proof پس از update سطح عادی Pluginهای bundled را اجرا میکند، چون facadeهای capability مانند speech، image generation و media understanding از طریق APIهای runtime bundled load میشوند، حتی وقتی خود نوبت agent فقط یک پاسخ متنی ساده را بررسی میکند.
-
-
pnpm openclaw qa aimock- فقط سرور ارائهدهنده محلی AIMock را برای آزمون دود مستقیم پروتکل راهاندازی میکند.
-
pnpm openclaw qa matrix- مسیر QA زنده Matrix را در برابر یک homeserver یکبارمصرف Tuwunel با پشتوانه Docker اجرا میکند. فقط برای checkout سورس - نصبهای بستهبندیشده
qa-labرا ارائه نمیکنند. - CLI کامل، کاتالوگ پروفایل/سناریو، متغیرهای محیطی، و چیدمان آرتیفکت: QA ماتریکس.
- مسیر QA زنده Matrix را در برابر یک homeserver یکبارمصرف Tuwunel با پشتوانه Docker اجرا میکند. فقط برای checkout سورس - نصبهای بستهبندیشده
-
pnpm openclaw qa telegram- مسیر QA زنده Telegram را با استفاده از توکنهای ربات درایور و ربات SUT از محیط، در برابر یک گروه خصوصی واقعی اجرا میکند.
- به
OPENCLAW_QA_TELEGRAM_GROUP_ID،OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN، وOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKENنیاز دارد. شناسه گروه باید شناسه عددی چت Telegram باشد. - از
--credential-source convexبرای اعتبارنامههای اشتراکی تجمیعشده پشتیبانی میکند. بهصورت پیشفرض از حالت محیط استفاده کنید، یاOPENCLAW_QA_CREDENTIAL_SOURCE=convexرا تنظیم کنید تا به اجارههای تجمیعشده وارد شوید. - پیشفرضها canary، دروازهگذاری mention، آدرسدهی فرمان،
/status، پاسخهای mentionشده رباتبهربات، و پاسخهای فرمان بومی هسته را پوشش میدهند. پیشفرضهایmock-openaiهمچنین رگرسیونهای قطعی زنجیره پاسخ و استریم پیام نهایی Telegram را پوشش میدهند. برای probeهای اختیاری مانندsession_statusاز--list-scenariosاستفاده کنید. - وقتی هر سناریویی شکست بخورد با کد غیرصفر خارج میشود. وقتی آرتیفکتها را بدون کد خروج شکستخورده میخواهید از
--allow-failuresاستفاده کنید. - به دو ربات متمایز در همان گروه خصوصی نیاز دارد، بهطوریکه ربات SUT نام کاربری Telegram داشته باشد.
- برای مشاهده پایدار رباتبهربات، Bot-to-Bot Communication Mode را در
@BotFatherبرای هر دو ربات فعال کنید و مطمئن شوید ربات درایور میتواند ترافیک رباتهای گروه را مشاهده کند. - گزارش QA Telegram، خلاصه، و
qa-evidence.jsonرا زیر.artifacts/qa-e2e/...مینویسد. سناریوهای پاسخدهنده شامل RTT از درخواست ارسال درایور تا پاسخ مشاهدهشده SUT هستند.
Mantis Telegram Live پوشش شواهد PR پیرامون این مسیر است. این پوشش ref نامزد را با اعتبارنامههای Telegram اجارهشده از Convex اجرا میکند، بسته گزارش/شواهد QA ویرایششده را در مرورگر دسکتاپ Crabbox رندر میکند، شواهد MP4 ضبط میکند، یک GIF کوتاهشده بر اساس حرکت تولید میکند، بسته آرتیفکت را آپلود میکند، و وقتی pr_number تنظیم شده باشد شواهد درونخطی PR را از طریق Mantis GitHub App ارسال میکند. نگهدارندگان میتوانند آن را از رابط کاربری Actions از طریق Mantis Scenario (scenario_id: telegram-live) یا مستقیماً از یک نظر pull request شروع کنند:
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-replyMantis Telegram Desktop Proof پوشش agentic بومی Telegram Desktop برای اثبات تصویری قبل/بعد PR است. آن را از رابط کاربری Actions با instructions آزاد، از طریق Mantis Scenario (scenario_id: telegram-desktop-proof)، یا از یک نظر PR شروع کنید:
@openclaw-mantis telegram desktop proofعامل Mantis، PR را میخواند، تصمیم میگیرد چه رفتار قابلمشاهدهای در Telegram تغییر را اثبات میکند، مسیر اثبات Crabbox Telegram Desktop کاربر واقعی را روی refهای مبنا و نامزد اجرا میکند، تا زمانی که GIFهای بومی مفید شوند تکرار میکند، یک manifest جفتشده motionPreview مینویسد، و وقتی pr_number تنظیم شده باشد همان جدول GIF دوستونه را از طریق Mantis GitHub App ارسال میکند.
pnpm openclaw qa mantis telegram-desktop-builder- یک دسکتاپ لینوکس Crabbox را اجاره یا بازاستفاده میکند، Telegram Desktop بومی را نصب میکند، OpenClaw را با توکن ربات SUT Telegram اجارهشده پیکربندی میکند، Gateway را راهاندازی میکند، و شواهد اسکرینشات/MP4 را از دسکتاپ VNC قابلمشاهده ضبط میکند.
- بهصورت پیشفرض از
--credential-source convexاستفاده میکند تا workflowها فقط به secret کارگزار Convex نیاز داشته باشند. برای استفاده از متغیرهایOPENCLAW_QA_TELEGRAM_*مشابهpnpm openclaw qa telegram، از--credential-source envاستفاده کنید. - Telegram Desktop همچنان به login/profile کاربر نیاز دارد. توکن ربات فقط OpenClaw را پیکربندی میکند. برای یک آرشیو پروفایل
.tgzبا base64 از--telegram-profile-archive-env <name>استفاده کنید، یا از--keep-leaseاستفاده کنید و یکبار بهصورت دستی از طریق VNC وارد شوید. mantis-telegram-desktop-builder-report.md،mantis-telegram-desktop-builder-summary.json،telegram-desktop-builder.png، وtelegram-desktop-builder.mp4را زیر دایرکتوری خروجی مینویسد.
مسیرهای انتقال زنده یک قرارداد استاندارد مشترک دارند تا انتقالهای جدید از هم فاصله نگیرند؛ ماتریس پوشش هر مسیر در نمای کلی QA → پوشش انتقال زنده قرار دارد. qa-channel مجموعه مصنوعی گسترده است و بخشی از آن ماتریس نیست.
اعتبارنامههای مشترک Telegram از طریق Convex (v1)
وقتی --credential-source convex (یا OPENCLAW_QA_CREDENTIAL_SOURCE=convex) برای QA انتقال زنده فعال باشد، QA lab یک اجاره انحصاری از pool با پشتوانه Convex میگیرد، در زمان اجرای مسیر برای آن اجاره Heartbeat میفرستد، و هنگام خاموشی اجاره را آزاد میکند. نام این بخش پیش از پشتیبانی Discord، Slack، و WhatsApp ایجاد شده است؛ قرارداد اجاره در همه kindها مشترک است.
اسکلت پروژه مرجع Convex:
qa/convex-credential-broker/
متغیرهای محیطی الزامی:
OPENCLAW_QA_CONVEX_SITE_URL(برای مثالhttps://your-deployment.convex.site)- یک secret برای نقش انتخابشده:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERبرایmaintainerOPENCLAW_QA_CONVEX_SECRET_CIبرایci
- انتخاب نقش اعتبارنامه:
- CLI:
--credential-role maintainer|ci - پیشفرض محیط:
OPENCLAW_QA_CREDENTIAL_ROLE(در CI بهصورت پیشفرضci، و در غیر این صورتmaintainer)
- CLI:
متغیرهای محیطی اختیاری:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(پیشفرض1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(پیشفرض30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(پیشفرض90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(پیشفرض15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(پیشفرض/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(شناسه trace اختیاری)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1به URLهای Convex باhttp://لوپبک برای توسعه صرفاً محلی اجازه میدهد.
OPENCLAW_QA_CONVEX_SITE_URL در عملیات عادی باید از https:// استفاده کند.
فرمانهای مدیریتی نگهدارنده (افزودن/حذف/فهرست pool) بهطور مشخص به OPENCLAW_QA_CONVEX_SECRET_MAINTAINER نیاز دارند.
کمککنندههای CLI برای نگهدارندگان:
pnpm openclaw qa credentials doctorpnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.jsonpnpm openclaw qa credentials list --kind telegrampnpm openclaw qa credentials remove --credential-id <credential-id>پیش از اجراهای زنده از doctor استفاده کنید تا URL سایت Convex، secretهای کارگزار، پیشوند endpoint، timeout HTTP، و دسترسی admin/list را بدون چاپ مقدار secret بررسی کنید. برای خروجی قابلخواندن توسط ماشین در اسکریپتها و ابزارهای CI از --json استفاده کنید.
قرارداد endpoint پیشفرض (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- درخواست:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - موفقیت:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - تمامشده/قابلتلاشمجدد:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- درخواست:
POST /payload-chunk- درخواست:
{ kind, ownerId, actorRole, credentialId, leaseToken, index } - موفقیت:
{ status: "ok", index, data }
- درخواست:
POST /heartbeat- درخواست:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - موفقیت:
{ status: "ok" }(یا2xxخالی)
- درخواست:
POST /release- درخواست:
{ kind, ownerId, actorRole, credentialId, leaseToken } - موفقیت:
{ status: "ok" }(یا2xxخالی)
- درخواست:
POST /admin/add(فقط secret نگهدارنده)- درخواست:
{ kind, actorId, payload, note?, status? } - موفقیت:
{ status: "ok", credential }
- درخواست:
POST /admin/remove(فقط secret نگهدارنده)- درخواست:
{ credentialId, actorId } - موفقیت:
{ status: "ok", changed, credential } - محافظ اجاره فعال:
{ status: "error", code: "LEASE_ACTIVE", ... }
- درخواست:
POST /admin/list(فقط secret نگهدارنده)- درخواست:
{ kind?, status?, includePayload?, limit? } - موفقیت:
{ status: "ok", credentials, count }
- درخواست:
شکل payload برای kind مربوط به Telegram:
{ groupId: string, driverToken: string, sutToken: string }groupIdباید رشته شناسه عددی چت Telegram باشد.admin/addاین شکل را برایkind: "telegram"اعتبارسنجی میکند و payloadهای بدشکل را رد میکند.
شکل payload برای kind مربوط به کاربر واقعی Telegram:
{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }groupId،testerUserId، وtelegramApiIdباید رشتههای عددی باشند.tdlibArchiveSha256وdesktopTdataArchiveSha256باید رشتههای hex مربوط به SHA-256 باشند.kind: "telegram-user"برای workflow اثبات Mantis Telegram Desktop رزرو شده است. مسیرهای عمومی QA Lab نباید آن را acquire کنند.
payloadهای چندکاناله اعتبارسنجیشده توسط کارگزار:
- Discord:
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp:
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
مسیرهای Slack نیز میتوانند از pool اجاره بگیرند، اما اعتبارسنجی payload Slack در حال حاضر بهجای کارگزار در runner QA Slack قرار دارد. برای ردیفهای Slack از { channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string } استفاده کنید.
افزودن یک کانال به QA
معماری و نامهای کمککننده سناریو برای adapterهای کانال جدید در نمای کلی QA → افزودن یک کانال قرار دارد. حداقل سطح لازم: runner انتقال را روی seam میزبان مشترک qa-lab پیادهسازی کنید، qaRunners را در manifest Plugin اعلام کنید، آن را بهصورت openclaw qa <runner> mount کنید، و سناریوها را زیر qa/scenarios/ بنویسید.
مجموعههای آزمون (چه چیزی کجا اجرا میشود)
مجموعهها را بهصورت «واقعگرایی افزایشی» در نظر بگیرید (و flakiness/هزینه افزایشی):
واحد / یکپارچهسازی (پیشفرض)
- فرمان:
pnpm test - پیکربندی: اجراهای بدون هدف از مجموعه shard مربوط به
vitest.full-*.config.tsاستفاده میکنند و ممکن است shardهای چندپروژهای را برای زمانبندی موازی به configهای هر پروژه گسترش دهند - فایلها: inventoryهای core/unit زیر
src/**/*.test.ts،packages/**/*.test.ts، وtest/**/*.test.ts؛ آزمونهای واحد UI در shard اختصاصیunit-uiاجرا میشوند - دامنه:
- آزمونهای واحد خالص
- آزمونهای یکپارچهسازی درونفرایندی (احراز هویت Gateway، routing، tooling، parsing، config)
- رگرسیونهای قطعی برای bugهای شناختهشده
- انتظارات:
- در CI اجرا میشود
- به کلیدهای واقعی نیاز ندارد
- باید سریع و پایدار باشد
- آزمونهای resolver و loader سطح عمومی باید رفتار fallback گسترده
api.jsوruntime-api.jsرا با fixtureهای Plugin کوچک تولیدشده اثبات کنند، نه با APIهای سورس Pluginهای bundled واقعی. بارگذاریهای API واقعی Plugin باید در مجموعههای contract/integration متعلق به Plugin باشند.
سیاست وابستگی بومی:
- نصبهای آزمون پیشفرض buildهای opus بومی اختیاری Discord را رد میکنند. صدای Discord از
libopus-wasmbundled استفاده میکند، و@discordjs/opusدرallowBuildsغیرفعال میماند تا آزمونهای محلی و مسیرهای Testbox افزونه بومی را کامپایل نکنند. - کارایی opus بومی را در مخزن benchmark مربوط به
libopus-wasmمقایسه کنید، نه در حلقههای نصب/آزمون پیشفرض OpenClaw.@discordjs/opusرا درallowBuildsپیشفرض رویtrueتنظیم نکنید؛ این کار باعث میشود حلقههای نامرتبط نصب/آزمون، کد بومی را کامپایل کنند.
Projects, shards, and scoped lanes
- اجرای بدون هدف
pnpm testبهجای یک فرایند غولآسای بومی برای root-project، دوازده پیکربندی shard کوچکتر (core-unit-fast،core-unit-src،core-unit-security،core-unit-ui،core-unit-support،core-support-boundary،core-contracts،core-bundled،core-runtime،agentic،auto-reply،extensions) را اجرا میکند. این کار اوج RSS را روی ماشینهای پربار کاهش میدهد و مانع میشود کارهای auto-reply/extension باعث محروم شدن مجموعههای نامرتبط شوند. pnpm test --watchهمچنان از گراف پروژه بومی root درvitest.config.tsاستفاده میکند، چون حلقه watch چند-shard عملی نیست.pnpm test،pnpm test:watch، وpnpm test:perf:importsابتدا هدفهای صریح فایل/دایرکتوری را از مسیر laneهای scoped عبور میدهند، بنابراینpnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsهزینه کامل راهاندازی پروژه root را نمیپردازد.pnpm test:changedبهطور پیشفرض مسیرهای git تغییریافته را به laneهای scoped ارزان گسترش میدهد: ویرایش مستقیم تستها، فایلهای همجوار*.test.ts، نگاشتهای صریح source، و وابستههای محلی import-graph. ویرایشهای config/setup/package تستها را بهصورت گسترده اجرا نمیکنند مگر اینکه صریحاً ازOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedاستفاده کنید.pnpm check:changedدروازه معمول بررسی محلی هوشمند برای کارهای محدود است. diff را به core، تستهای core، extensions، تستهای extension، apps، docs، release metadata، ابزارهای live Docker، و tooling طبقهبندی میکند، سپس فرمانهای typecheck، lint، و guard مطابق را اجرا میکند. تستهای Vitest را اجرا نمیکند؛ برای اثبات تست،pnpm test:changedیاpnpm test <target>صریح را اجرا کنید. افزایش نسخههایی که فقط release metadata هستند، بررسیهای هدفمند version/config/root-dependency را اجرا میکنند، همراه با guardای که تغییرات package خارج از فیلد نسخه سطح بالا را رد میکند.- ویرایشهای live Docker ACP harness بررسیهای متمرکز اجرا میکنند: نحو shell برای اسکریپتهای احراز هویت live Docker و dry-run زمانبند live Docker. تغییرات
package.jsonفقط وقتی شامل میشوند که diff بهscripts["test:docker:live-*"]محدود باشد؛ ویرایشهای dependency، export، version، و سایر سطحهای package همچنان از guardهای گستردهتر استفاده میکنند. - تستهای واحد سبک از نظر import از agents، commands، plugins، helperهای auto-reply،
plugin-sdk، و ناحیههای ابزار pure مشابه از مسیر laneunit-fastعبور میکنند، کهtest/setup-openclaw-runtime.tsرا رد میکند؛ فایلهای stateful/runtime-heavy روی laneهای موجود میمانند. - فایلهای source کمکی منتخب
plugin-sdkوcommandsنیز اجراهای changed-mode را به تستهای همجوار صریح در همان laneهای سبک نگاشت میکنند، بنابراین ویرایش helperها از اجرای دوباره کل مجموعه سنگین آن دایرکتوری اجتناب میکند. auto-replybucketهای اختصاصی برای helperهای core سطح بالا، تستهای integration سطح بالایreply.*، و زیردرختsrc/auto-reply/reply/**دارد. CI زیردرخت reply را بیشتر به shardهای agent-runner، dispatch، و commands/state-routing تقسیم میکند تا یک bucket سنگین از نظر import مالک کل دنباله Node نباشد.- CI معمول PR/main عمداً batch sweep مربوط به extension و shard فقط مخصوص release با نام
agentic-pluginsرا رد میکند. Full Release Validation برای آن مجموعههای سنگین plugin/extension روی release candidateها، workflow فرزند جداگانهPlugin Prereleaseرا dispatch میکند.
پوشش runner توکار
- وقتی inputهای کشف message-tool یا context زمان اجرای compaction را تغییر میدهید، هر دو سطح پوشش را حفظ کنید.
- برای مرزهای pure routing و normalization، regressionهای helper متمرکز اضافه کنید.
- مجموعههای integration runner توکار را سالم نگه دارید:
src/agents/embedded-agent-runner/compact.hooks.test.ts،src/agents/embedded-agent-runner/run.overflow-compaction.test.ts، وsrc/agents/embedded-agent-runner/run.overflow-compaction.loop.test.ts. - آن مجموعهها تأیید میکنند که شناسههای scoped و رفتار compaction همچنان از مسیرهای واقعی
run.ts/compact.tsعبور میکنند؛ تستهای فقط helper جایگزین کافی برای آن مسیرهای integration نیستند.
پیشفرضهای pool و isolation در Vitest
- پیکربندی پایه Vitest بهطور پیشفرض از
threadsاستفاده میکند. - پیکربندی مشترک Vitest مقدار
isolate: falseرا ثابت میکند و از runner غیرایزوله در پروژههای root، پیکربندیهای e2e، و live استفاده میکند. - lane ریشه UI تنظیمات و optimizer مربوط به
jsdomخود را نگه میدارد، اما آن هم روی runner غیرایزوله مشترک اجرا میشود. - هر shard در
pnpm testهمان پیشفرضهایthreads+isolate: falseرا از پیکربندی مشترک Vitest به ارث میبرد. scripts/run-vitest.mjsبهطور پیشفرض برای فرایندهای فرزند Node در Vitest گزینه--no-maglevرا اضافه میکند تا آشفتگی compile در V8 هنگام اجراهای محلی بزرگ کاهش یابد. برای مقایسه با رفتار V8 استاندارد،OPENCLAW_VITEST_ENABLE_MAGLEV=1را تنظیم کنید.scripts/run-vitest.mjsاجراهای صریح غیر-watch در Vitest را پس از ۵ دقیقه بدون خروجی stdout یا stderr خاتمه میدهد. برای غیرفعال کردن watchdog در یک بررسی عمداً بیصدا،OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=0را تنظیم کنید.
تکرار سریع محلی
pnpm changed:lanesنشان میدهد یک diff کدام laneهای معماری را فعال میکند.- hook پیش از commit فقط formatting انجام میدهد. فایلهای formatشده را دوباره stage میکند و lint، typecheck، یا تستها را اجرا نمیکند.
- وقتی به دروازه بررسی محلی هوشمند نیاز دارید، پیش از handoff یا push،
pnpm check:changedرا صریحاً اجرا کنید. pnpm test:changedبهطور پیشفرض از مسیر laneهای scoped ارزان عبور میکند. فقط وقتی agent تصمیم میگیرد یک ویرایش harness، config، package، یا contract واقعاً به پوشش گستردهتر Vitest نیاز دارد، ازOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedاستفاده کنید.pnpm test:maxوpnpm test:changed:maxهمان رفتار routing را نگه میدارند، فقط با سقف worker بالاتر.- auto-scaling worker محلی عمداً محافظهکار است و وقتی میانگین بار host از قبل بالا باشد عقبنشینی میکند، بنابراین چند اجرای همزمان Vitest بهطور پیشفرض آسیب کمتری میزنند.
- پیکربندی پایه Vitest پروژهها/فایلهای config را بهعنوان
forceRerunTriggersعلامتگذاری میکند تا rerunهای changed-mode هنگام تغییر wiring تستها درست بمانند. - config مقدار
OPENCLAW_VITEST_FS_MODULE_CACHEرا روی hostهای پشتیبانیشده فعال نگه میدارد؛ اگر برای profiling مستقیم یک مکان cache صریح میخواهید،OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathرا تنظیم کنید.
اشکالزدایی کارایی
pnpm test:perf:importsگزارش مدت import در Vitest بهعلاوه خروجی import-breakdown را فعال میکند.pnpm test:perf:imports:changedهمان نمای profiling را به فایلهای تغییریافته از زمانorigin/mainمحدود میکند.- داده زمانبندی shard در
.artifacts/vitest-shard-timings.jsonنوشته میشود. اجراهای whole-config مسیر config را بهعنوان کلید استفاده میکنند؛ shardهای CI با include-pattern نام shard را اضافه میکنند تا shardهای فیلترشده جداگانه قابل ردیابی باشند. - وقتی یک تست داغ همچنان بیشتر زمان خود را در importهای startup صرف میکند، dependencyهای سنگین را پشت یک مرز محلی باریک
*.runtime.tsنگه دارید و همان مرز را مستقیماً mock کنید، بهجای اینکه helperهای runtime را فقط برای عبور دادن ازvi.mock(...)بهصورت deep-import وارد کنید. pnpm test:perf:changed:bench -- --ref <git-ref>مسیر routed درtest:changedرا برای آن diff کامیتشده با مسیر بومی root-project مقایسه میکند و wall time بهعلاوه max RSS در macOS را چاپ میکند.pnpm test:perf:changed:bench -- --worktreeدرخت dirty فعلی را با عبور دادن فهرست فایلهای تغییریافته ازscripts/test-projects.mjsو پیکربندی root Vitest benchmark میکند.pnpm test:perf:profile:mainیک profile CPU برای thread اصلی درباره startup و transform overhead در Vitest/Vite مینویسد.pnpm test:perf:profile:runnerبرای مجموعه unit با file parallelism غیرفعال، profileهای CPU+heap مربوط به runner را مینویسد.
پایداری (gateway)
- فرمان:
pnpm test:stability:gateway - پیکربندی:
vitest.gateway.config.ts، مجبور به یک worker - دامنه:
- یک Gateway واقعی loopback را با diagnostics فعال بهصورت پیشفرض راهاندازی میکند
- چرخه synthetic gateway message، memory، و large-payload را از مسیر رویداد diagnostic عبور میدهد
diagnostics.stabilityرا از طریق Gateway WS RPC query میکند- helperهای persistence برای diagnostic stability bundle را پوشش میدهد
- assert میکند recorder محدود میماند، sampleهای synthetic RSS زیر بودجه فشار میمانند، و عمق صفهای per-session دوباره به صفر تخلیه میشود
- انتظارها:
- مناسب CI و بدون نیاز به key
- lane محدود برای پیگیری regression پایداری، نه جایگزینی برای مجموعه کامل Gateway
E2E (تجمیع repo)
- فرمان:
pnpm test:e2e - دامنه:
- lane مربوط به gateway smoke E2E را اجرا میکند
- lane مربوط به مرورگر mockشده Control UI را اجرا میکند
- انتظارها:
- مناسب CI و بدون نیاز به key
- نیازمند نصب بودن Playwright Chromium
E2E (gateway smoke)
- فرمان:
pnpm test:e2e:gateway - پیکربندی:
vitest.e2e.config.ts - فایلها:
src/**/*.e2e.test.ts،test/**/*.e2e.test.ts، و تستهای E2E مربوط به bundled-plugin زیرextensions/ - پیشفرضهای runtime:
- از Vitest
threadsباisolate: falseاستفاده میکند، مطابق با بقیه repo. - از workerهای adaptive استفاده میکند (CI: تا ۲، محلی: پیشفرض ۱).
- بهطور پیشفرض در حالت silent اجرا میشود تا overhead مربوط به console I/O کاهش یابد.
- از Vitest
- overrideهای مفید:
OPENCLAW_E2E_WORKERS=<n>برای اجبار تعداد workerها (با سقف ۱۶).OPENCLAW_E2E_VERBOSE=1برای فعالسازی دوباره خروجی verbose کنسول.
- دامنه:
- رفتار end-to-end Gateway چندنمونهای
- سطحهای WebSocket/HTTP، جفتسازی node، و networking سنگینتر
- انتظارها:
- در CI اجرا میشود (وقتی در pipeline فعال باشد)
- به key واقعی نیاز ندارد
- قطعات متحرک بیشتری نسبت به تستهای unit دارد (ممکن است کندتر باشد)
E2E (مرورگر mockشده Control UI)
- فرمان:
pnpm test:ui:e2e - پیکربندی:
test/vitest/vitest.ui-e2e.config.ts - فایلها:
ui/src/**/*.e2e.test.ts - دامنه:
- Vite Control UI را راهاندازی میکند
- یک صفحه واقعی Chromium را از طریق Playwright هدایت میکند
- Gateway WebSocket را با mockهای قطعی درون مرورگر جایگزین میکند
- انتظارها:
- بهعنوان بخشی از
pnpm test:e2eدر CI اجرا میشود - به Gateway، agents، یا keyهای provider واقعی نیاز ندارد
- dependency مرورگر باید حاضر باشد (
pnpm --dir ui exec playwright install chromium)
- بهعنوان بخشی از
E2E: OpenShell backend smoke
- فرمان:
pnpm test:e2e:openshell - فایل:
extensions/openshell/src/backend.e2e.test.ts - دامنه:
- از یک Gateway محلی فعال OpenShell دوباره استفاده میکند
- از یک Dockerfile محلی موقت یک sandbox میسازد
- backend مربوط به OpenShell در OpenClaw را از طریق
sandbox ssh-configواقعی + اجرای SSH تمرین میدهد - رفتار filesystem با canonical از راه دور را از طریق sandbox fs bridge تأیید میکند
- انتظارها:
- فقط opt-in؛ بخشی از اجرای پیشفرض
pnpm test:e2eنیست - به CLI محلی
openshellبهعلاوه daemon فعال Docker نیاز دارد - به یک Gateway محلی فعال OpenShell و منبع config آن نیاز دارد
- از
HOME/XDG_CONFIG_HOMEایزوله استفاده میکند، سپس sandbox تست را نابود میکند
- فقط opt-in؛ بخشی از اجرای پیشفرض
- overrideهای مفید:
OPENCLAW_E2E_OPENSHELL=1برای فعالسازی تست هنگام اجرای دستی مجموعه گستردهتر e2eOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellبرای اشاره به binary یا wrapper script غیرپیشفرض CLIOPENCLAW_E2E_OPENSHELL_CONFIG_HOME=/path/to/configبرای در دسترس گذاشتن config مربوط به Gateway ثبتشده برای تست ایزولهOPENCLAW_E2E_OPENSHELL_HOST_IP=172.18.0.1برای override کردن IP Gateway مربوط به Docker که fixture سیاست host استفاده میکند
Live (providerهای واقعی + modelهای واقعی)
- دستور:
pnpm test:live - پیکربندی:
vitest.live.config.ts - فایلها:
src/**/*.live.test.ts،test/**/*.live.test.ts، و آزمونهای زنده Pluginهای همراه زیرextensions/ - پیشفرض: با
pnpm test:liveفعال است (OPENCLAW_LIVE_TEST=1را تنظیم میکند) - دامنه:
- «آیا این ارائهدهنده/مدل واقعاً امروز با اعتبارنامههای واقعی کار میکند؟»
- تغییرات قالب ارائهدهنده، ویژگیهای خاص فراخوانی ابزار، مشکلات احراز هویت، و رفتار محدودیت نرخ را پیدا میکند
- انتظارات:
- از نظر طراحی برای CI پایدار نیست (شبکههای واقعی، سیاستهای واقعی ارائهدهنده، سهمیهها، قطعیها)
- هزینه دارد / از محدودیتهای نرخ استفاده میکند
- اجرای زیرمجموعههای محدودشده را به جای «همهچیز» ترجیح دهید
- اجراهای زنده از کلیدهای API از قبل صادرشده و پروفایلهای احراز هویت آماده استفاده میکنند.
- بهطور پیشفرض، اجراهای زنده همچنان
HOMEرا ایزوله میکنند و مواد پیکربندی/احراز هویت را در یک خانه آزمایشی موقت کپی میکنند تا fixtureهای واحد نتوانند~/.openclawواقعی شما را تغییر دهند. OPENCLAW_LIVE_USE_REAL_HOME=1را فقط وقتی تنظیم کنید که عمداً نیاز دارید آزمونهای زنده از پوشه خانه واقعی شما استفاده کنند.pnpm test:liveبهطور پیشفرض از حالت کمصداتری استفاده میکند: خروجی پیشرفت[live] ...را نگه میدارد و لاگهای راهاندازی 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) یا بازنویسی مخصوص هر اجرای زنده را از طریقOPENCLAW_LIVE_*_KEYانجام دهید؛ آزمونها روی پاسخهای محدودیت نرخ دوباره تلاش میکنند. - خروجی پیشرفت/Heartbeat:
- مجموعههای زنده اکنون خطوط پیشرفت را به stderr میفرستند تا فراخوانیهای طولانی ارائهدهنده حتی وقتی ضبط کنسول Vitest کمصداست، بهصورت قابل مشاهده فعال باشند.
vitest.live.config.tsرهگیری کنسول Vitest را غیرفعال میکند تا خطوط پیشرفت ارائهدهنده/Gateway بلافاصله هنگام اجراهای زنده جریان یابند.- Heartbeatهای مدل مستقیم را با
OPENCLAW_LIVE_HEARTBEAT_MSتنظیم کنید. - Heartbeatهای Gateway/پروب را با
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MSتنظیم کنید.
کدام مجموعه را باید اجرا کنم؟
از این جدول تصمیمگیری استفاده کنید:
- ویرایش منطق/آزمونها:
pnpm testرا اجرا کنید (و اگر تغییر زیادی دادهایدpnpm test:coverage) - دست زدن به شبکه Gateway / پروتکل WS / جفتسازی:
pnpm test:e2eرا اضافه کنید - اشکالزدایی «بات من از کار افتاده» / شکستهای وابسته به ارائهدهنده / فراخوانی ابزار: یک
pnpm test:liveمحدودشده اجرا کنید
آزمونهای زنده (با دسترسی به شبکه)
برای ماتریس مدل زنده، smokeهای بکاند CLI، smokeهای ACP، harness سرور برنامه Codex، و همه آزمونهای زنده ارائهدهنده رسانه (Deepgram، BytePlus، ComfyUI، تصویر، موسیقی، ویدئو، harness رسانه) - بهعلاوه مدیریت اعتبارنامه برای اجراهای زنده - آزمودن مجموعههای زنده را ببینید. برای چکلیست اختصاصی بهروزرسانی و اعتبارسنجی Plugin، آزمودن بهروزرسانیها و Pluginها را ببینید.
اجراکنندههای Docker (بررسیهای اختیاری «در Linux کار میکند»)
این اجراکنندههای Docker به دو دسته تقسیم میشوند:
- اجراکنندههای مدل زنده:
test:docker:live-modelsوtest:docker:live-gatewayفقط فایل زنده کلید پروفایل متناظر خود را داخل تصویر Docker مخزن اجرا میکنند (src/agents/models.profiles.live.test.tsوsrc/gateway/gateway-models.profiles.live.test.ts) و پوشه پیکربندی محلی، فضای کار، و فایل env پروفایل اختیاری شما را mount میکنند. نقطههای ورود محلی متناظرtest:live:models-profilesوtest:live:gateway-profilesهستند. - اجراکنندههای زنده Docker در صورت نیاز سقفهای عملی خودشان را نگه میدارند:
test:docker:live-modelsبهطور پیشفرض از مجموعه گزینششده، پشتیبانیشده و پرسیگنال استفاده میکند، و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استفاده میکند. وقتی صراحتاً سقف کوچکتر یا اسکن بزرگتر میخواهید،OPENCLAW_LIVE_MAX_MODELSیا متغیرهای env مربوط به Gateway را تنظیم کنید. test:docker:allتصویر Docker زنده را یک بار از طریقtest:docker:live-buildمیسازد، OpenClaw را یک بار بهصورت tarball npm از طریقscripts/package-openclaw-for-docker.mjsبستهبندی میکند، سپس دو تصویرscripts/e2e/Dockerfileرا میسازد/بازاستفاده میکند. تصویر خام فقط اجراکننده Node/Git برای مسیرهای نصب/بهروزرسانی/وابستگی Plugin است؛ آن مسیرها tarball از پیش ساختهشده را mount میکنند. تصویر عملکردی همان tarball را برای مسیرهای عملکرد برنامه ساختهشده در/appنصب میکند. تعریفهای مسیر Docker درscripts/lib/docker-e2e-scenarios.mjsقرار دارند؛ منطق برنامهریز درscripts/lib/docker-e2e-plan.mjsقرار دارد؛scripts/test-docker-all.mjsبرنامه انتخابشده را اجرا میکند. تجمیعکننده از یک زمانبند محلی وزندار استفاده میکند:OPENCLAW_DOCKER_ALL_PARALLELISMslotهای فرایند را کنترل میکند، در حالی که سقفهای منابع مانع میشوند مسیرهای سنگین زنده، نصب npm، و چندسرویسی همگی همزمان شروع شوند. اگر یک مسیر تنها از سقفهای فعال سنگینتر باشد، زمانبند همچنان میتواند وقتی pool خالی است آن را شروع کند و سپس تا زمانی که ظرفیت دوباره در دسترس شود آن را تنها در حال اجرا نگه میدارد. پیشفرضها 10 slot،OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9،OPENCLAW_DOCKER_ALL_NPM_LIMIT=5، وOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7هستند؛ فقط وقتی میزبان Docker ظرفیت بیشتری داردOPENCLAW_DOCKER_ALL_WEIGHT_LIMITیاOPENCLAW_DOCKER_ALL_DOCKER_LIMITرا تنظیم کنید. اجراکننده بهطور پیشفرض یک پیشبررسی Docker انجام میدهد، containerهای قدیمی OpenClaw E2E را حذف میکند، هر 30 ثانیه وضعیت را چاپ میکند، زمانبندی مسیرهای موفق را در.artifacts/docker-tests/lane-timings.jsonذخیره میکند، و در اجراهای بعدی از آن زمانبندیها برای شروع زودتر مسیرهای طولانیتر استفاده میکند. برای چاپ manifest مسیر وزندار بدون ساختن یا اجرای Docker ازOPENCLAW_DOCKER_ALL_DRY_RUN=1استفاده کنید، یا برای چاپ برنامه CI برای مسیرهای انتخابشده، نیازهای بسته/تصویر، و اعتبارنامههاnode scripts/test-docker-all.mjs --plan-jsonرا اجرا کنید.Package Acceptanceگیت بومی GitHub برای «آیا این tarball قابل نصب بهعنوان یک محصول کار میکند؟» است. یک بسته نامزد را ازsource=npm،source=ref،source=url، یاsource=artifactحل میکند، آن را بهعنوانpackage-under-testبارگذاری میکند، سپس مسیرهای قابل استفاده مجدد Docker E2E را به جای بستهبندی دوباره ref انتخابشده، روی همان tarball دقیق اجرا میکند. پروفایلها بر اساس گستردگی مرتب شدهاند:smoke،package،product، وfull. برای قرارداد بسته/بهروزرسانی/Plugin، ماتریس بازمانده ارتقای منتشرشده، پیشفرضهای انتشار، و تریاژ شکست، آزمودن بهروزرسانیها و Pluginها را ببینید.- بررسیهای ساخت و انتشار پس از tsdown،
scripts/check-cli-bootstrap-imports.mjsرا اجرا میکنند. guard گراف ساختهشده ایستا را ازdist/entry.jsوdist/cli/run-main.jsپیمایش میکند و اگر راهاندازی پیش از dispatch وابستگیهای بسته مانند Commander، رابط prompt، undici، یا logging را پیش از dispatch فرمان import کند، شکست میخورد؛ همچنین قطعه اجرای Gateway همراه را زیر بودجه نگه میدارد و importهای ایستای مسیرهای سرد شناختهشده Gateway را رد میکند. smoke مربوط به CLI بستهبندیشده همچنین راهنمای ریشه، راهنمای onboard، راهنمای doctor، status، شمای پیکربندی، و یک فرمان فهرست مدل را پوشش میدهد. - سازگاری قدیمی پذیرش بسته در
2026.4.25سقفگذاری شده است (2026.4.25-beta.*شامل میشود). تا آن حد، harness فقط شکافهای metadata مربوط به بستههای منتشرشده را تحمل میکند: ورودیهای خصوصی فهرست QA حذفشده،gateway install --wrapperموجود نیست، فایلهای patch در fixture git مشتقشده از tarball موجود نیستند،update.channelپایدارشده موجود نیست، مکانهای قدیمی رکورد نصب Plugin، پایداری رکورد نصب marketplace موجود نیست، و مهاجرت metadata پیکربندی هنگامplugins update. برای بستههای پس از2026.4.25، آن مسیرها شکست سخت هستند. - اجراکنندههای smoke container:
test:docker:openwebui،test:docker:onboard،test:docker:npm-onboard-channel-agent،test:docker:release-user-journey،test:docker:release-typed-onboarding،test:docker:release-media-memory،test:docker:release-upgrade-user-journey،test:docker:release-plugin-marketplace،test:docker:skill-install،test:docker:update-channel-switch،test:docker:upgrade-survivor،test:docker:published-upgrade-survivor،test:docker:session-runtime-context،test:docker:agents-delete-shared-workspace،test:docker:gateway-network،test:docker:browser-cdp-snapshot،test:docker:mcp-channels،test:docker:agent-bundle-mcp-tools،test:docker:cron-mcp-cleanup،test:docker:plugins،test:docker:plugin-update،test:docker:plugin-lifecycle-matrix، وtest:docker:config-reloadیک یا چند container واقعی را boot میکنند و مسیرهای یکپارچهسازی سطح بالاتر را بررسی میکنند. - مسیرهای Docker/Bash E2E که tarball بستهبندیشده OpenClaw را از طریق
scripts/lib/openclaw-e2e-instance.shنصب میکنند، برایnpm installسقفOPENCLAW_E2E_NPM_INSTALL_TIMEOUTدارند (پیشفرض600s؛ برای غیرفعال کردن wrapper هنگام اشکالزدایی،0تنظیم کنید).
اجراکنندههای Docker مدل زنده همچنین فقط خانههای احراز هویت CLI مورد نیاز را bind-mount میکنند (یا وقتی اجرا محدود نشده باشد، همه موارد پشتیبانیشده را)، سپس آنها را پیش از اجرا در خانه container کپی میکنند تا OAuth مربوط به CLI خارجی بتواند tokenها را بدون تغییر دادن انبار احراز هویت میزبان refresh کند:
-
مدلهای مستقیم:
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؛ بهطور پیشفرض Claude، Codex، و Gemini را پوشش میدهد، با پوشش سختگیرانه Droid/OpenCode از طریقpnpm test:docker:live-acp-bind:droidوpnpm test:docker:live-acp-bind:opencode) -
smoke بکاند CLI:
pnpm test:docker:live-cli-backend(اسکریپت:scripts/test-live-cli-backend-docker.sh) -
smoke harness سرور برنامه Codex:
pnpm test:docker:live-codex-harness(اسکریپت:scripts/test-live-codex-harness-docker.sh) -
Gateway + عامل توسعه:
pnpm test:docker:live-gateway(اسکریپت:scripts/test-live-gateway-models-docker.sh) -
smokeهای مشاهدهپذیری:
pnpm qa:otel:smoke،pnpm qa:prometheus:smoke، وpnpm qa:observability:smokeمسیرهای خصوصی QA در checkout منبع هستند. آنها عمداً بخشی از مسیرهای انتشار Docker بسته نیستند، زیرا tarball npm آزمایشگاه QA را حذف میکند. -
smoke زنده Open WebUI:
pnpm test:docker:openwebui(اسکریپت:scripts/e2e/openwebui-docker.sh) -
جادوگر onboarding (TTY، داربست کامل):
pnpm test:docker:onboard(اسکریپت:scripts/e2e/onboard-docker.sh) -
smoke onboarding/channel/agent با tarball npm:
pnpm test:docker:npm-onboard-channel-agenttarball بستهبندیشده OpenClaw را بهصورت سراسری در Docker نصب میکند، OpenAI را از طریق onboarding مبتنی بر env-ref بههمراه Telegram بهطور پیشفرض پیکربندی میکند، doctor را اجرا میکند، و یک نوبت عامل OpenAI شبیهسازیشده را اجرا میکند. باOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgzاز tarball از پیش ساختهشده دوباره استفاده کنید، باOPENCLAW_NPM_ONBOARD_HOST_BUILD=0بازسازی میزبان را رد کنید، یا باOPENCLAW_NPM_ONBOARD_CHANNEL=discordیاOPENCLAW_NPM_ONBOARD_CHANNEL=slackکانال را تغییر دهید. -
آزمون دود مسیر کاربر انتشار:
pnpm test:docker:release-user-journeyبسته tarball فشردهشده OpenClaw را بهصورت سراسری در یک خانه Docker تمیز نصب میکند، onboarding را اجرا میکند، یک ارائهدهنده OpenAI شبیهسازیشده را پیکربندی میکند، یک نوبت agent را اجرا میکند، Pluginهای خارجی را نصب/حذف نصب میکند، ClickClack را در برابر یک fixture محلی پیکربندی میکند، پیامرسانی خروجی/ورودی را تأیید میکند، Gateway را بازراهاندازی میکند، و doctor را اجرا میکند. -
آزمون دود onboarding نوعدار انتشار:
pnpm test:docker:release-typed-onboardingبسته tarball فشردهشده را نصب میکند،openclaw onboardرا از طریق یک TTY واقعی پیش میبرد، OpenAI را بهعنوان یک ارائهدهنده env-ref پیکربندی میکند، نبود ماندگاری کلید خام را تأیید میکند، و یک نوبت agent شبیهسازیشده را اجرا میکند. -
آزمون دود رسانه/حافظه انتشار:
pnpm test:docker:release-media-memoryبسته tarball فشردهشده را نصب میکند، درک تصویر از یک پیوست PNG، خروجی تولید تصویر سازگار با OpenAI، یادآوری جستوجوی حافظه، و بقای یادآوری در گذر از بازراهاندازی Gateway را تأیید میکند. -
آزمون دود مسیر کاربر ارتقای انتشار:
pnpm test:docker:release-upgrade-user-journeyبهطور پیشفرض جدیدترین baseline منتشرشده قدیمیتر از tarball نامزد را نصب میکند، وضعیت ارائهدهنده/Plugin/ClickClack را روی بسته منتشرشده پیکربندی میکند، به tarball نامزد ارتقا میدهد، سپس مسیر اصلی agent/Plugin/channel را دوباره اجرا میکند. اگر baseline منتشرشده قدیمیتری وجود نداشته باشد، از نسخه نامزد دوباره استفاده میکند. baseline را باOPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>بازنویسی کنید. -
آزمون دود بازارچه Plugin انتشار:
pnpm test:docker:release-plugin-marketplaceاز یک بازارچه fixture محلی نصب میکند، Plugin نصبشده را بهروزرسانی میکند، آن را حذف نصب میکند، و تأیید میکند CLI مربوط به Plugin همراه با هرس شدن فراداده نصب ناپدید میشود. -
آزمون دود نصب Skill:
pnpm test:docker:skill-installبسته tarball فشردهشده OpenClaw را بهصورت سراسری در Docker نصب میکند، نصبهای آرشیو بارگذاریشده را در پیکربندی غیرفعال میکند، slug فعلی skill زنده ClawHub را از جستوجو resolve میکند، آن را باopenclaw skills installنصب میکند، و skill نصبشده بههمراه فراداده مبدا/قفل.clawhubرا تأیید میکند. -
آزمون دود تغییر کانال بهروزرسانی:
pnpm test:docker:update-channel-switchبسته tarball فشردهشده OpenClaw را بهصورت سراسری در Docker نصب میکند، از بستهstableبه gitdevتغییر میدهد، کانال پایدارشده و کارکرد Plugin پس از بهروزرسانی را تأیید میکند، سپس به بستهstableبرمیگردد و وضعیت بهروزرسانی را بررسی میکند. -
آزمون دود بازمانده ارتقا:
pnpm test:docker:upgrade-survivorبسته tarball فشردهشده OpenClaw را روی یک fixture کاربر قدیمیِ آلوده، با agentها، پیکربندی channel، allowlistهای Plugin، وضعیت کهنه وابستگی Plugin، و فایلهای workspace/session موجود نصب میکند. بهروزرسانی بسته بههمراه doctor غیرتعاملی را بدون ارائهدهنده زنده یا کلیدهای channel اجرا میکند، سپس یک Gateway loopback را شروع میکند و حفظ پیکربندی/وضعیت بههمراه بودجههای startup/status را بررسی میکند. -
آزمون دود بازمانده ارتقای منتشرشده:
pnpm test:docker:published-upgrade-survivorبهطور پیشفرضopenclaw@latestرا نصب میکند، فایلهای واقعگرایانه کاربر موجود را seed میکند، آن baseline را با یک دستورالعمل فرمان baked پیکربندی میکند، پیکربندی حاصل را اعتبارسنجی میکند، آن نصب منتشرشده را به tarball نامزد بهروزرسانی میکند، doctor غیرتعاملی را اجرا میکند،.artifacts/upgrade-survivor/summary.jsonرا مینویسد، سپس یک Gateway loopback را شروع میکند و intentهای پیکربندیشده، حفظ وضعیت، startup،/healthz،/readyz، و بودجههای وضعیت RPC را بررسی میکند. یک baseline را باOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECبازنویسی کنید، از زمانبند تجمیعی بخواهید baselineهای دقیق محلی را باOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECSمثلopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15گسترش دهد، و fixtureهای issue-شکل را باOPENCLAW_UPGRADE_SURVIVOR_SCENARIOSمثلreported-issuesگسترش دهید؛ مجموعه reported-issues شاملconfigured-plugin-installsبرای تعمیر خودکار نصب Plugin خارجی OpenClaw است. Package Acceptance اینها را بهصورتpublished_upgrade_survivor_baseline،published_upgrade_survivor_baselines، وpublished_upgrade_survivor_scenariosآشکار میکند، tokenهای meta baseline مانندlast-stable-4یاall-since-2026.4.23را resolve میکند، و Full Release Validation دروازه بسته release-soak را بهlast-stable-4 2026.4.23 2026.5.2 2026.4.15بههمراهreported-issuesگسترش میدهد. -
آزمون دود context زمان اجرای session:
pnpm test:docker:session-runtime-contextماندگاری transcript پنهان context زمان اجرا بههمراه تعمیر doctor برای شاخههای تکراری prompt-rewrite آسیبدیده را تأیید میکند. -
آزمون دود نصب سراسری Bun:
bash scripts/e2e/bun-global-install-smoke.shدرخت فعلی را بستهبندی میکند، آن را باbun install -gدر یک خانه ایزوله نصب میکند، و تأیید میکندopenclaw infer image providers --jsonبهجای hang کردن، ارائهدهندگان تصویر bundleشده را برمیگرداند. از یک tarball ازپیشساخته باOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgzدوباره استفاده کنید، build میزبان را باOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0رد کنید، یاdist/را از یک image ساختهشده Docker باOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:localکپی کنید. -
آزمون دود Docker نصبکننده:
bash scripts/test-install-sh-docker.shیک cache واحد npm را میان containerهای root، update، و direct-npm خود بهاشتراک میگذارد. آزمون دود بهروزرسانی پیش از ارتقا به tarball نامزد، بهطور پیشفرض npmlatestرا baseline پایدار در نظر میگیرد. بهصورت محلی باOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22، یا در GitHub با ورودیupdate_baseline_versionگردشکار Install Smoke بازنویسی کنید. بررسیهای نصبکننده non-root یک cache ایزوله npm را نگه میدارند تا entryهای cache متعلق به root رفتار نصب user-local را پنهان نکنند. برای استفاده دوباره از cache root/update/direct-npm در اجرای دوباره محلی،OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cacheرا تنظیم کنید. -
Install Smoke CI بهروزرسانی سراسری تکراری direct-npm را با
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1رد میکند؛ وقتی پوشش مستقیمnpm install -gلازم است، script را بهصورت محلی بدون آن env اجرا کنید. -
آزمون دود CLI حذف workspace مشترک agentها:
pnpm test:docker:agents-delete-shared-workspace(script:scripts/e2e/agents-delete-shared-workspace-docker.sh) بهطور پیشفرض image Dockerfile ریشه را میسازد، دو agent را با یک workspace در خانه container ایزوله seed میکند،agents delete --jsonرا اجرا میکند، و JSON معتبر بههمراه رفتار حفظ workspace را تأیید میکند. از image install-smoke باOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1دوباره استفاده کنید. -
شبکهسازی Gateway (دو container، احراز هویت WS + سلامت):
pnpm test:docker:gateway-network(script:scripts/e2e/gateway-network-docker.sh) -
آزمون دود snapshot مرورگر CDP:
pnpm test:docker:browser-cdp-snapshot(script:scripts/e2e/browser-cdp-snapshot-docker.sh) image منبع E2E بههمراه یک لایه Chromium را میسازد، Chromium را با CDP خام شروع میکند،browser doctor --deepرا اجرا میکند، و تأیید میکند snapshotهای نقش CDP، URLهای link، کلیکپذیرهای cursor-promoted، ارجاعهای iframe، و فراداده frame را پوشش میدهند. -
رگرسیون حداقل reasoning برای OpenAI Responses web_search:
pnpm test:docker:openai-web-search-minimal(script:scripts/e2e/openai-web-search-minimal-docker.sh) یک سرور OpenAI شبیهسازیشده را از طریق Gateway اجرا میکند، تأیید میکندweb_searchمقدارreasoning.effortرا ازminimalبهlowافزایش میدهد، سپس رد schema ارائهدهنده را اجبار میکند و بررسی میکند detail خام در logهای Gateway ظاهر شود. -
پل channel MCP (Gateway seedشده + پل stdio + آزمون دود notification-frame خام Claude):
pnpm test:docker:mcp-channels(script:scripts/e2e/mcp-channels-docker.sh) -
ابزارهای MCP bundle OpenClaw (سرور MCP واقعی stdio + آزمون دود allow/deny پروفایل OpenClaw تعبیهشده):
pnpm test:docker:agent-bundle-mcp-tools(script:scripts/e2e/agent-bundle-mcp-tools-docker.sh) -
پاکسازی MCP برای Cron/subagent (Gateway واقعی + teardown فرزند MCP stdio پس از اجرای cron ایزوله و subagent یکباره):
pnpm test:docker:cron-mcp-cleanup(script:scripts/e2e/cron-mcp-cleanup-docker.sh) -
Pluginها (آزمون دود نصب/بهروزرسانی برای مسیر محلی،
file:، registry npm با وابستگیهای hoisted، فراداده malformed بسته npm، refهای متحرک git، kitchen-sink مربوط به ClawHub، بهروزرسانیهای marketplace، و enable/inspect بسته Claude):pnpm test:docker:plugins(script:scripts/e2e/plugins-docker.sh) برای رد کردن بلوک ClawHub،OPENCLAW_PLUGINS_E2E_CLAWHUB=0را تنظیم کنید، یا جفت package/runtime پیشفرض kitchen-sink را باOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECوOPENCLAW_PLUGINS_E2E_CLAWHUB_IDبازنویسی کنید. بدونOPENCLAW_CLAWHUB_URL/CLAWHUB_URL، آزمون از یک سرور fixture محلی hermetic برای ClawHub استفاده میکند. -
آزمون دود بهروزرسانی بدون تغییر Plugin:
pnpm test:docker:plugin-update(script:scripts/e2e/plugin-update-unchanged-docker.sh) -
آزمون دود ماتریس چرخهعمر Plugin:
pnpm test:docker:plugin-lifecycle-matrixبسته tarball فشردهشده OpenClaw را در یک container bare نصب میکند، یک Plugin npm را نصب میکند، enable/disable را تغییر وضعیت میدهد، آن را از طریق یک registry محلی npm ارتقا و تنزل میدهد، کد نصبشده را حذف میکند، سپس تأیید میکند uninstall همچنان وضعیت کهنه را حذف میکند و همزمان metricهای RSS/CPU را برای هر فاز چرخهعمر log میکند. -
آزمون دود فراداده reload پیکربندی:
pnpm test:docker:config-reload(script:scripts/e2e/config-reload-source-docker.sh) -
Pluginها:
pnpm test:docker:pluginsآزمون دود نصب/بهروزرسانی را برای مسیر محلی،file:، registry npm با وابستگیهای hoisted، refهای متحرک git، fixtureهای ClawHub، بهروزرسانیهای marketplace، و enable/inspect بسته Claude پوشش میدهد.pnpm test:docker:plugin-updateرفتار بهروزرسانی بدون تغییر را برای Pluginهای نصبشده پوشش میدهد.pnpm test:docker:plugin-lifecycle-matrixنصب، enable، disable، ارتقا، تنزل، و uninstall کدِ مفقود را برای Plugin npm با ردیابی منابع پوشش میدهد.
برای prebuild و استفاده دوباره دستی از image عملکردی مشترک:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-buildOPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channelsبازنویسیهای image مخصوص suite مانند OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE همچنان در صورت تنظیم شدن اولویت دارند. وقتی OPENCLAW_SKIP_DOCKER_BUILD=1 به یک image مشترک remote اشاره کند، scriptها اگر از قبل محلی نباشد آن را pull میکنند. آزمونهای Docker مربوط به QR و نصبکننده Dockerfileهای خودشان را نگه میدارند، چون رفتار package/install را اعتبارسنجی میکنند نه runtime برنامه ساختهشده مشترک را.
اجراکنندههای Docker مدل زنده همچنین checkout فعلی را بهصورت فقطخواندنی bind-mount میکنند و
آن را درون یک workdir موقت داخل کانتینر stage میکنند. این کار image زمان اجرا را
کمحجم نگه میدارد، در حالی که Vitest همچنان روی همان source/config دقیق محلی شما اجرا میشود.
مرحله staging از cacheهای بزرگ فقطمحلی و خروجیهای build برنامه مانند
.pnpm-store، .worktrees، __openclaw_vitest__، و دایرکتوریهای خروجی .build محلی برنامه یا
Gradle عبور میکند تا اجراهای زنده Docker چند دقیقه صرف کپی کردن
artifactهای وابسته به ماشین نکنند.
آنها همچنین OPENCLAW_SKIP_CHANNELS=1 را تنظیم میکنند تا probeهای زنده Gateway، workerهای کانال
واقعی Telegram/Discord/غیره را داخل کانتینر شروع نکنند.
test:docker:live-models همچنان pnpm test:live را اجرا میکند، بنابراین وقتی لازم است پوشش زنده Gateway
را در آن lane مربوط به Docker محدود یا حذف کنید، OPENCLAW_LIVE_GATEWAY_* را نیز عبور دهید.
test:docker:openwebui یک smoke سازگاری سطح بالاتر است: یک کانتینر Gateway متعلق به
OpenClaw را با endpointهای HTTP سازگار با OpenAI فعالشده شروع میکند،
یک کانتینر Open WebUI pin شده را در برابر آن Gateway شروع میکند، از طریق
Open WebUI وارد میشود، بررسی میکند که /api/models، openclaw/default را ارائه میدهد، سپس یک
درخواست chat واقعی را از طریق proxy مربوط به /api/chat/completions در Open WebUI ارسال میکند.
برای بررسیهای CI مسیر انتشار که باید پس از ورود به Open WebUI و کشف مدل متوقف شوند،
بدون انتظار برای تکمیل مدل زنده، OPENWEBUI_SMOKE_MODE=models را تنظیم کنید.
اجرای اول میتواند بهطور محسوسی کندتر باشد، چون Docker ممکن است لازم باشد image
Open WebUI را pull کند و Open WebUI ممکن است لازم باشد راهاندازی سرد خودش را تمام کند.
این lane انتظار یک کلید مدل زنده قابل استفاده را دارد. آن را از طریق environment فرایند،
پروفایلهای auth stage شده، یا یک OPENCLAW_PROFILE_FILE صریح ارائه کنید.
اجراهای موفق یک payload کوچک JSON مانند { "ok": true, "model": "openclaw/default", ... } چاپ میکنند.
test:docker:mcp-channels عمداً deterministic است و به حساب واقعی
Telegram، Discord، یا iMessage نیاز ندارد. یک کانتینر Gateway seeded را boot میکند،
یک کانتینر دوم را شروع میکند که openclaw mcp serve را spawn میکند، سپس
کشف مکالمه route شده، خواندن transcriptها، metadata پیوستها،
رفتار صف event زنده، routing ارسال outbound، و notificationهای channel +
permission به سبک Claude را روی پل MCP واقعی stdio بررسی میکند. بررسی notification
فریمهای خام MCP stdio را مستقیماً inspect میکند تا smoke همان چیزی را اعتبارسنجی کند که
پل واقعاً emit میکند، نه فقط چیزی که یک SDK client خاص اتفاقاً surface میکند.
test:docker:agent-bundle-mcp-tools deterministic است و به کلید مدل زنده نیاز ندارد.
image Docker repo را build میکند، یک سرور probe واقعی MCP با stdio را
داخل کانتینر شروع میکند، آن سرور را از طریق runtime داخلی bundle MCP متعلق به OpenClaw
materialize میکند، tool را اجرا میکند، سپس بررسی میکند که coding و messaging
toolهای bundle-mcp را نگه میدارند، در حالی که minimal و tools.deny: ["bundle-mcp"] آنها را filter میکنند.
test:docker:cron-mcp-cleanup deterministic است و به کلید مدل زنده نیاز ندارد.
یک Gateway seeded را با یک سرور probe واقعی MCP با stdio شروع میکند، یک turn جداگانه cron
و یک turn فرزند one-shot با sessions_spawn را اجرا میکند، سپس بررسی میکند که
فرایند فرزند MCP بعد از هر اجرا خارج میشود.
Smoke دستی thread با زبان ساده ACP (نه CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- این script را برای workflowهای regression/debug نگه دارید. ممکن است دوباره برای اعتبارسنجی routing thread در ACP لازم شود، بنابراین آن را حذف نکنید.
env varهای مفید:
OPENCLAW_CONFIG_DIR=...(پیشفرض:~/.openclaw) که روی/home/node/.openclawmount میشودOPENCLAW_WORKSPACE_DIR=...(پیشفرض:~/.openclaw/workspace) که روی/home/node/.openclaw/workspacemount میشودOPENCLAW_PROFILE_FILE=...که پیش از اجرای testها mount و source میشودOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1برای بررسی فقط env varهایی که ازOPENCLAW_PROFILE_FILEsource شدهاند، با استفاده از config/workspace dirهای موقت و بدون mountهای auth خارجی CLIOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(پیشفرض:~/.cache/openclaw/docker-cli-tools) که برای نصبهای cached CLI داخل Docker روی/home/node/.npm-globalmount میشود- دایرکتوریها/فایلهای auth خارجی CLI زیر
$HOMEبهصورت فقطخواندنی زیر/host-auth...mount میشوند، سپس پیش از شروع testها داخل/home/node/...کپی میشوند- دایرکتوریهای پیشفرض:
.minimax - فایلهای پیشفرض:
~/.codex/auth.json،~/.codex/config.toml،.claude.json،~/.claude/.credentials.json،~/.claude/settings.json،~/.claude/settings.local.json - اجراهای محدودشده provider فقط دایرکتوریها/فایلهای لازم را mount میکنند که از
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERSاستنباط شدهاند - بهصورت دستی با
OPENCLAW_DOCKER_AUTH_DIRS=all،OPENCLAW_DOCKER_AUTH_DIRS=none، یا یک فهرست comma مانندOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codexoverride کنید
- دایرکتوریهای پیشفرض:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...برای محدود کردن اجراOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...برای filter کردن providerها درون کانتینرOPENCLAW_SKIP_DOCKER_BUILD=1برای استفاده مجدد از image موجودopenclaw:local-liveدر rerunهایی که به rebuild نیاز ندارندOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1برای اطمینان از اینکه credentials از profile store میآیند (نه env)OPENCLAW_OPENWEBUI_MODEL=...برای انتخاب مدلی که Gateway برای smoke مربوط به Open WebUI ارائه میدهدOPENCLAW_OPENWEBUI_PROMPT=...برای override کردن prompt بررسی nonce که توسط smoke مربوط به Open WebUI استفاده میشودOPENWEBUI_IMAGE=...برای override کردن tag image pin شده Open WebUI
sanity مستندات
پس از ویرایش مستندات، بررسیهای مستندات را اجرا کنید: pnpm check:docs.
وقتی به بررسی headingهای درون صفحه هم نیاز دارید، اعتبارسنجی کامل anchorهای Mintlify را اجرا کنید: pnpm docs:check-links:anchors.
regression آفلاین (CI-safe)
اینها regressionهای «pipeline واقعی» بدون providerهای واقعی هستند:
- فراخوانی tool از Gateway (OpenAI mock، Gateway واقعی + حلقه agent):
src/gateway/gateway.test.ts(case: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - wizard در Gateway (WS
wizard.start/wizard.next، نوشتن config + اجرای auth):src/gateway/gateway.test.ts(case: "runs wizard over ws and writes auth token config")
evalهای قابلیت اتکای agent (Skills)
ما از قبل چند test CI-safe داریم که مانند «evalهای قابلیت اتکای agent» رفتار میکنند:
- tool-calling mock از طریق Gateway واقعی + حلقه agent (
src/gateway/gateway.test.ts). - flowهای wizard end-to-end که wiring session و اثرهای config را اعتبارسنجی میکنند (
src/gateway/gateway.test.ts).
چیزی که هنوز برای Skills کم است (ببینید Skills):
- Decisioning: وقتی skills در prompt فهرست میشوند، آیا agent skill درست را انتخاب میکند (یا از موارد نامرتبط پرهیز میکند)؟
- Compliance: آیا agent پیش از استفاده
SKILL.mdرا میخواند و گامها/args لازم را دنبال میکند؟ - Workflow contracts: سناریوهای چندنوبتی که ترتیب tool، انتقال session history، و مرزهای sandbox را assert میکنند.
evalهای آینده باید ابتدا deterministic بمانند:
- یک scenario runner با providerهای mock برای assert کردن فراخوانیهای tool + ترتیب، خواندن فایل skill، و wiring session.
- یک مجموعه کوچک از سناریوهای متمرکز بر skill (استفاده در برابر پرهیز، gating، prompt injection).
- evalهای live اختیاری (opt-in، env-gated) فقط پس از اینکه مجموعه CI-safe آماده شد.
testهای contract (شکل plugin و channel)
testهای contract بررسی میکنند که هر plugin و channel ثبتشده با
contract مربوط به interface خود منطبق باشد. آنها روی همه pluginهای کشفشده iterate میکنند و مجموعهای از
assertionهای شکل و رفتار را اجرا میکنند. lane unit پیشفرض pnpm test عمداً
این فایلهای shared seam و smoke را رد میکند؛ وقتی سطحهای shared channel یا provider را تغییر میدهید،
دستورهای contract را بهصورت صریح اجرا کنید.
دستورها
- همه contractها:
pnpm test:contracts - فقط contractهای channel:
pnpm test:contracts:channels - فقط contractهای provider:
pnpm test:contracts:plugins
contractهای channel
در src/channels/plugins/contracts/*.contract.test.ts قرار دارند:
- plugin - شکل پایه plugin (id، name، capabilities)
- setup - contract مربوط به setup wizard
- session-binding - رفتار session binding
- outbound-payload - ساختار payload پیام
- inbound - مدیریت پیام inbound
- actions - handlerهای action در channel
- threading - مدیریت Thread ID
- directory - API مربوط به directory/roster
- group-policy - اعمال group policy
contractهای status در provider
در src/plugins/contracts/*.contract.test.ts قرار دارند.
- status - probeهای status در channel
- registry - شکل registry مربوط به Plugin
contractهای provider
در src/plugins/contracts/*.contract.test.ts قرار دارند:
- auth - contract مربوط به flow در auth
- auth-choice - choice/selection مربوط به auth
- catalog - API مربوط به catalog مدل
- discovery - کشف Plugin
- loader - loading مربوط به Plugin
- runtime - runtime مربوط به provider
- shape - شکل/interface مربوط به Plugin
- wizard - setup wizard
زمان اجرا
- پس از تغییر exportها یا subpathهای plugin-sdk
- پس از افزودن یا تغییر یک channel یا provider plugin
- پس از refactor کردن registration یا discovery مربوط به plugin
testهای contract در CI اجرا میشوند و به کلیدهای واقعی API نیاز ندارند.
افزودن regressionها (راهنما)
وقتی یک issue مربوط به provider/model را که در live کشف شده fix میکنید:
- در صورت امکان یک regression CI-safe اضافه کنید (provider mock/stub، یا capture کردن transformation دقیق شکل request)
- اگر ذاتاً فقط live است (rate limitها، policyهای auth)، test زنده را محدود و opt-in از طریق env varها نگه دارید
- ترجیح دهید کوچکترین لایهای را هدف بگیرید که bug را میگیرد:
- bug در conversion/replay درخواست provider → test مستقیم models
- bug در pipeline مربوط به session/history/tool در Gateway → smoke زنده Gateway یا test mock Gateway بهصورت CI-safe
- guardrail مربوط به traversal در SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tsاز metadata registry (listSecretTargetRegistryEntries()) برای هر کلاس SecretRef یک هدف نمونه derive میکند، سپس assert میکند exec idهای دارای traversal-segment رد میشوند.- اگر یک خانواده هدف SecretRef جدید با
includeInPlanدرsrc/secrets/target-registry-data.tsاضافه میکنید،classifyTargetClassرا در آن test بهروزرسانی کنید. این test عمداً روی target idهای classبندینشده fail میشود تا کلاسهای جدید نتوانند بیسروصدا رد شوند.