Get started
Mantis
Mantis شواهد بصری CI و یک دیدگاه PR برای رفتار OpenClaw منتشر میکند. سناریوهای زندهٔ انتقال، یک خط مبنای مشخصاً معیوب را با یک ref نامزد مقایسه میکنند؛ در عوض، مسیرهای متمرکز مرورگر ممکن است یک نامزد را در برابر یک انتقال شبیهسازیشدهٔ قطعی اثبات کنند. Discord نخست با احراز هویت واقعی ربات، کانالهای guild، واکنشها، threadها و یک شاهد مرورگری عرضه شد. مسیرهای Slack، Telegram و چت متمرکز Control UI نیز وجود دارند؛ WhatsApp و Matrix پیادهسازی نشدهاند.
مالکیت
- OpenClaw (
extensions/qa-lab/src/mantis/*): زماناجرای سناریو،pnpm openclaw qa mantis <command>CLI، طرحوارهٔ شواهد. - آزمایشگاه QA (
extensions/qa-lab/src/live-transports/*): چارچوب انتقال زنده، رباتهای راهانداز/SUT، نویسندههای گزارش/شواهد. - Crabbox (
openclaw/crabbox): ماشینهای Linux آماده، اجارهها، VNC،crabbox media preview. - GitHub Actions (
.github/workflows/mantis-*.yml): نقاط ورود راهدور، نگهداری artifactها. - ClawSweeper: فرمانهای PR نگهدارنده را تجزیه میکند، گردشکارها را اجرا میکند و دیدگاه نهایی PR را ارسال میکند.
فرمانهای CLI
همهٔ فرمانها pnpm openclaw qa mantis <command> هستند که در
extensions/qa-lab/src/mantis/cli.ts تعریف شدهاند. در زمان ساخت/اجرا به OPENCLAW_ENABLE_PRIVATE_QA_CLI=1
نیاز دارد (گردشکارهای همراه، پیش از ساخت OPENCLAW_BUILD_PRIVATE_QA=1 و
OPENCLAW_ENABLE_PRIVATE_QA_CLI=1 را تنظیم میکنند).
| فرمان | هدف |
|---|---|
discord-smoke |
تأیید میکند که ربات Discord متعلق به Mantis میتواند guild/channel را ببیند، پیام ارسال کند و واکنش نشان دهد. |
run |
یک سناریوی قبل/بعد را در برابر refهای خط مبنا و نامزد اجرا میکند (فقط Discord). |
desktop-browser-smoke |
یک دسکتاپ Crabbox را اجاره میکند/دوباره بهکار میگیرد، مرورگری قابلمشاهده باز میکند و تصویر صفحه + ویدئو میگیرد. |
slack-desktop-smoke |
یک دسکتاپ Crabbox را اجاره میکند/دوباره بهکار میگیرد، Slack QA را درون آن اجرا میکند، Slack Web را باز میکند و شواهد میگیرد. |
telegram-desktop-builder |
یک دسکتاپ Crabbox را اجاره میکند/دوباره بهکار میگیرد، Telegram Desktop را نصب میکند و در صورت تمایل یک Gateway متعلق به OpenClaw را پیکربندی میکند. |
visual-task / visual-driver |
ثبت عمومی دسکتاپ Crabbox با ارزیابیهای اختیاری درک تصویر؛ visual-driver نیمهٔ راهانداز است که زیر crabbox record --while اجرا میشود. |
همهٔ فرمانها --repo-root <path> و --output-dir <path> را میپذیرند؛ فرمانهای Crabbox
همچنین --crabbox-bin، --provider، --machine-class/--class،
--lease-id، --idle-timeout، --ttl و --keep-lease را میپذیرند. پیشفرضهای CLI محلی
برای ارائهدهنده/رده، مگر آنکه خلافش ذکر شود، hetzner/beast هستند؛ گردشکارهای CI
معمولاً هر دو را بازنویسی میکنند.
discord-smoke
pnpm openclaw qa mantis discord-smoke \ --output-dir .artifacts/qa-e2e/mantis/discord-smokeبرای دریافت کاربر ربات، guild، کانالهای guild و کانال هدف، API REST مربوط به Discord
(https://discord.com/api/v10) را فراخوانی میکند، تأیید میکند که کانال
به guild تعلق دارد، سپس (مگر با --skip-post) یک پیام ارسال میکند و
واکنش 👀 را اضافه میکند. mantis-discord-smoke-summary.json و
mantis-discord-smoke-report.md را مینویسد.
ترتیب تفکیک توکن: مقدار --token-file، سپس OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN
(بازنویسی با --token-env) و پس از آن فایلی با نام تعیینشده توسط OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN_FILE
(بازنویسی با --token-file-env). شناسههای guild/channel از
OPENCLAW_QA_DISCORD_GUILD_ID / OPENCLAW_QA_DISCORD_CHANNEL_ID میآیند (بازنویسی با
--guild-id / --channel-id) و باید snowflakeهای 17 تا 20 رقمی Discord باشند. برای
جایگزینی شناسهها و نامهای ربات/guild/channel/پیام
با <redacted> در خلاصه و گزارش منتشرشده، OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 را تنظیم کنید.
run
pnpm openclaw qa mantis run \ --transport discord \ --scenario discord-status-reactions-tool-only \ --baseline origin/main \ --candidate HEAD \ --output-dir .artifacts/qa-e2e/mantis/local-discord-status-reactions--transport در حال حاضر فقط discord را میپذیرد. --scenario یکی از دو
شناسهٔ داخلی است که هرکدام ref خط مبنا و برچسبهای مورد انتظار قبل/بعد
خود را دارند (extensions/qa-lab/src/mantis/run.runtime.ts):
| سناریو | خط مبنای پیشفرض | انتظار از خط مبنا | انتظار از نامزد |
|---|---|---|---|
discord-status-reactions-tool-only |
0bf06e953fdda290799fc9fb9244a8f67fdae593 |
queued-only |
queued -> thinking -> done |
discord-thread-reply-filepath-attachment |
81349cdc2a9d5143fd0991ed858b739e7d96e05c |
پاسخ thread پیوست filePath را حذف میکند |
پاسخ thread آن را شامل میشود |
پیشفرض --candidate برابر HEAD است. پرچمهای دیگر: --credential-source
(پیشفرض convex)، --credential-role (پیشفرض ci)، --provider-mode
(پیشفرض live-frontier)، --fast (بهطور پیشفرض روشن)، --skip-install، --skip-build.
اجراکننده برای خط مبنا و نامزد، checkoutهای جداشدهٔ git worktree را
زیر <output-dir>/worktrees/ ایجاد میکند، در هرکدام pnpm install/pnpm build را
اجرا میکند (مگر اینکه رد شوند)، سپس
pnpm openclaw qa discord --scenario <id> --model openai/gpt-5.4 --alt-model openai/gpt-5.4 --allow-failures را
در برابر هر worktree اجرا میکند. هر مسیر discord-qa-reaction-timelines.json
را بههمراه یک جفت <scenario-id>-timeline.html/.png مینویسد؛ اجراکننده این
شواهد را زیر baseline//candidate/ کپی میکند، comparison.json،
mantis-report.md و mantis-evidence.json را در دایرکتوری خروجی مینویسد و
اگر مقایسه موفق نباشد، با کد غیرصفر خارج میشود (خط مبنا fail و نامزد
pass).
سناریوی دوم Discord (discord-thread-reply-filepath-attachment)
با ربات راهانداز یک پیام والد ارسال میکند، یک thread واقعی میسازد، کنش message.thread-reply
مربوط به SUT را با یک filePath محلی مخزن فراخوانی میکند، سپس برای
پاسخ و نام فایل پیوست، thread را بهطور دورهای بررسی میکند. انتظار دارد پیوستی
با نام mantis-thread-report.md وجود داشته باشد.
desktop-browser-smoke
pnpm openclaw qa mantis desktop-browser-smoke \ --output-dir .artifacts/qa-e2e/mantis/desktop-browserیک دسکتاپ Crabbox را اجاره میکند یا دوباره بهکار میگیرد، درون نشست VNC مرورگری
را با نشانی --browser-url (پیشفرض https://openclaw.ai) یا یک
--html-file رندرشده اجرا میکند، منتظر میماند، با scrot تصویر صفحه میگیرد، در صورت تمایل با
ffmpeg یک MP4 ضبط میکند و desktop-browser-smoke.png / .mp4 / remote-metadata.json
را با rsync به --output-dir بازمیگرداند.
پرچمها:
--lease-id <cbx_...>بهجای ایجاد دسکتاپ جدید، یک دسکتاپ آماده را دوباره بهکار میگیرد.--browser-profile-dir <remote-path>یک user-data-dir راهدور Chrome را دوباره بهکار میگیرد تا دسکتاپ پایدار بین اجراها واردشده باقی بماند (برای پروفایل نمایشگر بلندمدت Discord Web استفاده میشود).--browser-profile-archive-env <name>پیش از اجرا، آرشیو پروفایل Chrome با قالب base64 از نوع.tgzرا از آن متغیر محیطی بازیابی میکند (پیشفرضOPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64)؛ برای شاهدهای واردشده مانند Discord Web استفاده میشود.--video-duration <seconds>مدت ثبت MP4 را کنترل میکند (پیشفرض 10s).--keep-lease(یاOPENCLAW_MANTIS_KEEP_VM=1) اجارهای را که این اجرا ایجاد کرده برای بازرسی VNC باز نگه میدارد؛ اجراهای ناموفقی که اجاره ایجاد کردهاند نیز بهطور پیشفرض آن را نگه میدارند.
برای شواهد Discord Web، Mantis از یک حساب نمایشگر اختصاصی استفاده میکند، نه توکن
ربات. اوراکل REST متعلق به Discord (از طریق qa discord) همچنان مرجع معتبر است؛ وقتی
OPENCLAW_QA_DISCORD_CAPTURE_UI_METADATA=1 تنظیم شده باشد، سناریو همچنین یک
artifact نشانی Discord Web مینویسد و OPENCLAW_QA_DISCORD_KEEP_THREADS=1
thread را بهاندازهٔ کافی باز نگه میدارد تا مرورگر آن را باز کند.
گردشکار GitHub یک پروفایل نمایشگر پایدار را از طریق
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR ترجیح میدهد (آرشیو کامل پروفایل ممکن است از
محدودیت اندازهٔ secret در GitHub بزرگتر شود)؛ برای پروفایلهای کوچک/راهانداز میتواند بهجای آن یک
.tgz با قالب base64 را از MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 بازیابی کند. اگر
هیچیک از منابع پیکربندی نشده باشند، گردشکار همچنان تصاویر صفحهٔ قطعی
خط مبنا/نامزد را منتشر میکند و ثبت میکند که شاهد واردشده
رد شده است.
slack-desktop-smoke
pnpm openclaw qa mantis slack-desktop-smoke \ --output-dir .artifacts/qa-e2e/mantis/slack-desktop \ --gateway-setup \ --scenario slack-canary \ --keep-leaseیک دسکتاپ Crabbox را اجاره میکند یا دوباره بهکار میگیرد، checkout را در VM همگام میکند،
pnpm openclaw qa slack را درون آن اجرا میکند، Slack Web را در مرورگر VNC باز میکند،
از دسکتاپ تصویر میگیرد و هم artifactهای Slack QA (slack-qa/) و هم
تصویر صفحه/ویدئوی VNC را به محیط محلی کپی میکند. این تنها شکل Mantis است که در آن
Gateway مربوط به SUT و مرورگر، هر دو در یک VM اجرا میشوند.
با --gateway-setup، فرمان یک home پایدار و یکبارمصرف OpenClaw
در $HOME/.openclaw-mantis/slack-openclaw داخل VM ایجاد میکند، پیکربندی Slack
Socket Mode را برای کانال هدف وصله میکند،
openclaw gateway run --dev --allow-unconfigured --port 38973 را اجرا میکند و
Chrome را در نشست VNC باز نگه میدارد؛ حذف --gateway-setup در عوض مسیر عادی
Slack QA رباتبهربات را اجرا میکند.
متغیرهای محیطی لازم برای --credential-source env (پیشفرض محلی env است؛
پیشفرض نقش maintainer است):
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKENOPENCLAW_LIVE_OPENAI_KEYبرای مسیر مدل راهدور (اگر فقطOPENAI_API_KEYبهصورت محلی تنظیم شده باشد، Mantis پیش از فراخوانی Crabbox آن را درOPENCLAW_LIVE_OPENAI_KEYکپی میکند)
با --credential-source convex، Mantis پیش از ایجاد VM، اطلاعات اعتبارنامهٔ SUT متعلق به Slack را از
مخزن مشترک اجاره میکند و شناسهٔ کانال، توکن برنامه و
توکن ربات را بهعنوان متغیرهای محیطی OPENCLAW_MANTIS_SLACK_* به VM ارسال میکند، بنابراین گردشکارهای GitHub
فقط به secret کارگزار Convex نیاز دارند، نه توکنهای خام Slack.
پرچمهای دیگر: --slack-url <url> یک نشانی مشخص را باز میکند (در غیر این صورت Mantis
https://app.slack.com/client/<team>/<channel> را از auth.test استخراج میکند)؛
--slack-channel-id <id> کانال فهرست مجاز Gateway را تنظیم میکند؛
OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIR پروفایل پایدار Chrome را
داخل VM کنترل میکند (پیشفرض $HOME/.config/openclaw-mantis/slack-chrome-profile)؛
--approval-checkpoints سناریوهای بومی تأیید Slack
(slack-approval-exec-native، slack-approval-plugin-native) را اجرا میکند و
بهجای راهاندازی Gateway، تصاویر صفحهٔ نقاط وارسی در انتظار/حلشده را رندر میکند (با
--gateway-setup ناسازگار است)؛ --hydrate-mode source|prehydrated،
--provider-mode، --model، --alt-model و --fast به مسیر زندهٔ
Slack منتقل میشوند.
تصاویر صفحهٔ نقاط وارسی تأیید از پیام API متعلق به Slack که
سناریو مشاهده کرده رندر میشوند، نه از رابط زندهٔ Slack؛ slack-desktop-smoke.png تنها زمانی
اثبات خود Slack Web است که پروفایل مرورگر اجاره از قبل وارد شده باشد.
telegram-desktop-builder
pnpm openclaw qa mantis telegram-desktop-builder \ --credential-source convex \ --credential-role maintainer \ --keep-leaseیک دسکتاپ Crabbox را اجاره میکند یا دوباره بهکار میگیرد، Telegram Desktop بومی Linux را نصب میکند،
در صورت تمایل آرشیو نشست کاربر را بازیابی میکند، OpenClaw را با
توکن ربات SUT اجارهشدهٔ Telegram پیکربندی میکند،
openclaw gateway run --dev --allow-unconfigured --port 38974 را اجرا میکند، یک
پیام آمادگی ربات راهانداز را به گروه خصوصی اجارهشده ارسال میکند و سپس یک
تصویر صفحه و MP4 ثبت میکند. توکن ربات فقط OpenClaw را پیکربندی میکند؛ هرگز
Telegram Desktop را وارد حساب نمیکند. نمایشگر دسکتاپ یک نشست کاربری جداگانهٔ Telegram است
که از --telegram-profile-archive-env <name> بازیابی میشود یا بهصورت دستی
از طریق VNC وارد میشود و با --keep-lease زنده نگه داشته میشود.
پرچمها: --lease-id <cbx_...> اجرا را در برابر VMای که از قبل وارد
Telegram Desktop شده تکرار میکند؛ --telegram-profile-archive-env <name> پیش از اجرا یک آرشیو پروفایل
.tgz با قالب base64 را بازیابی میکند؛ --telegram-profile-dir <remote-path>
دایرکتوری پروفایل راهدور را تنظیم میکند (پیشفرض $HOME/.local/share/TelegramDesktop)؛
--no-gateway-setup فقط Telegram Desktop را نصب و باز میکند؛
پیشفرض --credential-source/--credential-role برابر convex/maintainer است.
مانیفست شواهد
هر سناریویی که در یک PR منتشر میشود، در کنار گزارش خود
mantis-evidence.json را مینویسد:
{ "schemaVersion": 1, "id": "discord-status-reactions", "title": "تضمین کیفیت واکنشهای وضعیت Discord در Mantis", "summary": "خلاصهٔ اصلی خوانا برای انسان جهت درج در نظر PR.", "scenario": "discord-status-reactions-tool-only", "comparison": { "baseline": { "sha": "...", "status": "fail", "expected": "فقط در صف" }, "candidate": { "sha": "...", "status": "pass", "expected": "در صف -> در حال فکر -> انجامشده" }, "pass": true }, "artifacts": [ { "kind": "خط زمانی", "lane": "خط مبنا", "label": "خط مبنای فقط در صف", "path": "baseline/timeline.png", "targetPath": "baseline.png", "alt": "خط زمانی خط مبنای Discord", "width": 420 } ]}path آرتیفکت نسبت به دایرکتوری مانیفست است؛ targetPath
نسبت به پیشوند پیکربندیشدهٔ آرتیفکت R2/S3 است. scripts/mantis/publish-pr-evidence.mjs
پیمایش مسیر را رد میکند و در صورت نبودن فایل، ورودیهای دارای "required": false
را نادیده میگیرد.
انواع آرتیفکت: timeline (اسکرینشات قطعی قبل/بعد)،
desktopScreenshot (اسکرینشات VNC/مرورگر)، motionPreview (GIF متحرک درونخطی
از ضبط)، motionClip (MP4 برشخورده بر اساس حرکت)، fullVideo (ضبط
کامل)، metadata (فایل جانبی JSON/لاگ)، report (گزارش Markdown).
چیدمان آرتیفکتهای روی دیسک یک اجرا:
.artifacts/qa-e2e/mantis/<run-id>/ mantis-report.md mantis-evidence.json baseline/ candidate/ comparison.jsonاسکرینشاتها مدرکاند، نه اطلاعات محرمانه، اما همچنان به رعایت اصول حذف اطلاعات حساس نیاز دارند:
ممکن است نام کانالهای خصوصی، نامهای کاربری یا محتوای پیامها دیده شود. برای بارگذاری عمومی
آرتیفکتها OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 را تنظیم کنید؛ این گزینه
بهطور پیشفرض در گردشکارهای GitHub مربوط به Discord/Slack/Telegram فعال است.
خودکارسازی GitHub
scripts/mantis/publish-pr-evidence.mjs انتشاردهندهٔ قابلاستفادهٔ مجدد است. گردشکارها
آن را با مانیفست، PR مقصد، ریشهٔ مقصد آرتیفکت، نشانگر نظر،
URL آرتیفکت، URL اجرا و منبع درخواست فراخوانی میکنند. این ابزار آرتیفکتهای اعلامشده را در
باکت R2 مربوط به Mantis بارگذاری میکند، یک نظر PR با اولویت نمایش خلاصه و شامل
تصاویر/پیشنمایشهای درونخطی و ویدئوهای پیوندشده میسازد، سپس نظر موجود دارای نشانگر را
بهروزرسانی میکند یا نظر جدیدی میسازد. متغیرهای محیطی الزامی:
MANTIS_ARTIFACT_R2_ACCESS_KEY_IDMANTIS_ARTIFACT_R2_SECRET_ACCESS_KEYMANTIS_ARTIFACT_R2_BUCKET(گردشکارهاopenclaw-crabbox-artifactsرا تنظیم میکنند)MANTIS_ARTIFACT_R2_ENDPOINTMANTIS_ARTIFACT_R2_REGION(گردشکارهاautoرا تنظیم میکنند)MANTIS_ARTIFACT_R2_PUBLIC_BASE_URL(گردشکارهاhttps://artifacts.openclaw.aiرا تنظیم میکنند)
نظرها از طریق GitHub App مربوط به Mantis (MANTIS_GITHUB_APP_ID /
MANTIS_GITHUB_APP_PRIVATE_KEY) ارسال میشوند، نه github-actions[bot]، و یک
نظر نشانگر مخفی بهعنوان کلید درج یا بهروزرسانی استفاده میشود.
| گردشکار | محرک | کاری که انجام میدهد |
|---|---|---|
Mantis Discord Smoke |
اجرای دستی | discord-smoke را روی یک ref انتخابشده اجرا میکند. |
Mantis Discord Status Reactions |
نظر PR یا اجرای دستی | worktreeهای جداگانهٔ خط مبنا/نامزد را میسازد، discord-status-reactions-tool-only را روی هرکدام اجرا میکند، خط زمانی هر مسیر را در مرورگر دسکتاپ Crabbox رندر میکند، با crabbox media preview پیشنمایشهای GIF/MP4 برشخورده بر اساس حرکت میسازد، آرتیفکتها را بارگذاری میکند و مدارک درونخطی را در PR میفرستد. |
Mantis Scenario |
اجرای دستی | توزیعکنندهٔ عمومی: scenario_id (discord-status-reactions-tool-only، discord-thread-reply-filepath-attachment، slack-desktop-smoke، telegram-live، telegram-desktop-proof، web-ui-chat-proof)، baseline_ref، candidate_ref و pr_number را میگیرد و به گردشکار سناریوی متناظر ارسال میکند. |
Mantis Slack Desktop Smoke |
اجرای دستی | یک دسکتاپ لینوکس Crabbox اجاره میکند (پیشفرض aws، با امکان انتخاب hetzner)، slack-desktop-smoke --gateway-setup را روی نامزد اجرا میکند، دسکتاپ را ضبط میکند، یک پیشنمایش حرکتی میسازد، آرتیفکتها را بارگذاری میکند و در صورت ارائهٔ شمارهٔ PR، مدارک را در PR میفرستد. |
Mantis Telegram Live |
نظر PR یا اجرای دستی | مسیر تضمین کیفیت زندهٔ Telegram مبتنی بر API ربات (openclaw qa telegram) را اجرا میکند، mantis-evidence.json را از خلاصهٔ تضمین کیفیت مینویسد، HTML مدارک حذفشده از اطلاعات حساس را از طریق مرورگر دسکتاپ Crabbox رندر میکند، یک GIF حرکتی میسازد و مدارک را در PR میفرستد. برای این مسیر، ورود به Telegram Web لازم نیست. |
Mantis Telegram Desktop Proof |
برچسب PR نگهدارنده (mantis: telegram-visible-proof) بههمراه نظر PR، یا اجرای دستی |
مدرک عاملمحور و بومی قبل/بعد در Telegram Desktop. PR، refهای خط مبنا/نامزد و دستورالعملهای نگهدارنده را به Codex میسپارد؛ Codex مسیر اثبات Telegram Desktop با کاربر واقعی در Crabbox را برای هر دو ref اجرا میکند و یک جدول مدارک ۲ ستونی در PR میفرستد. |
Mantis Web UI Chat Proof |
نظر PR یا اجرای دستی | اثبات متمرکز گفتوگوی Playwright در رابط کنترل OpenClaw را روی نامزد اجرا میکند، تأیید میکند که مرورگر از طریق Gateway شبیهسازیشده ارسال میکند، آرتیفکتهای اسکرینشات/ویدئو را ثبت میکند و مدارک را در PR میفرستد. این مسیر فقط اثبات گفتوگوی وب است، نه اثبات WinUI/برنامهٔ بومی یا هر نوع اثبات بصری دلخواه. |
Mantis Discord Status Reactions و Mantis Telegram Live هر دو
baseline_ref/candidate_ref (یا baseline=/candidate= در یک نظر PR)
را میپذیرند و پیش از اجرا با اعتبارنامههای حاوی اطلاعات محرمانه، اعتبارسنجی میکنند که SHA حلشده
یا یکی از اجداد origin/main، یا یک تگ انتشار (v*) یا سرشاخهٔ یک PR باز باشد.
محرکهای نظر، از یک PR با دسترسی نوشتن/نگهداری/مدیریت:
@openclaw-mantis discord status reactions@openclaw-mantis discord status reactions baseline=origin/main candidate=HEAD@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,channel-canary@openclaw-mantis web ui chat@openclaw-mantis web-ui-chat candidate=HEADمحرکهای نظر Telegram بهطور پیشفرض SHA سرشاخهٔ PR را بهعنوان نامزد و
telegram-status-command را بهعنوان سناریو در نظر میگیرند؛ آنها provider=aws|hetzner و
lease=<cbx_...> را برای هدفگیری یک ارائهدهندهٔ مشخص Crabbox یا یک
دسکتاپ ازپیشگرمشده میپذیرند. Mantis Telegram Desktop Proof فقط زمانی به نظر PR پاسخ میدهد که
PR از قبل برچسب mantis: telegram-visible-proof را داشته باشد.
محرکهای نظر گفتوگوی رابط وب بهطور پیشفرض SHA سرشاخهٔ PR را بهعنوان نامزد در نظر میگیرند. آنها اثبات گفتوگوی رابط کنترل با Gateway شبیهسازیشده را اجرا و آرتیفکتهای مرورگر را منتشر میکنند؛ برای دیگر صفحات وب و سطوح برنامهٔ بومی از اثبات معمول Playwright/مرورگر، اسکرینشاتهای نگهدارنده، Crabbox یا آرتیفکتهای محلی استفاده کنید.
ClawSweeper همچنین میتواند یک سناریو را مستقیماً اجرا کند:
@clawsweeper mantis discord discord-status-reactions-tool-onlyماشینها و اطلاعات محرمانه
پیشفرضهای Crabbox در CLI محلی --provider hetzner --class beast هستند؛ با
--provider، --class/--machine-class یا
OPENCLAW_MANTIS_CRABBOX_PROVIDER / OPENCLAW_MANTIS_CRABBOX_CLASS آنها را بازنویسی کنید. گردشکارهای
GitHub معمولاً هر دو را بازنویسی میکنند (برای مثال --class standard و ورودی انتخاب
ارائهدهندهٔ aws/hetzner در گردشکار Slack). اگر یک ارائهدهنده بیشازحد
کند یا دردسترسنباشد، آن را پشت همان رابط Crabbox اضافه کنید، نه اینکه یک مسیر جایگزین را
بهصورت ثابت در کد بنویسید.
خط مبنای ماشین مجازی: لینوکس با Chrome/Chromium دارای قابلیت دسکتاپ، دسترسی CDP، VNC/ noVNC، Node 22.22.3+، 24.15+ یا 25.9+ و pnpm، یک checkout از OpenClaw و دسترسی خروجی به بستر انتقال مقصد، GitHub، ارائهدهندگان مدل و کارگزار اعتبارنامه.
نام اعتبارنامهها و محیطهای استفادهشده در فرمانها و گردشکارهای Mantis:
OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKENOPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_IDqa mantis run --credential-source envمحلی همچنین بهOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN،OPENCLAW_QA_DISCORD_SUT_BOT_TOKENوOPENCLAW_QA_DISCORD_SUT_APPLICATION_IDنیاز دارد. گردشکارهای GitHub معمولاً بهجای توکنهای خام ربات Discord از--credential-source convexو اعتبارنامههای کارگزار زیر استفاده میکنند.OPENCLAW_QA_REDACT_PUBLIC_METADATA=1برای بارگذاری عمومی آرتیفکتهاOPENCLAW_QA_CONVEX_SITE_URL،OPENCLAW_QA_CONVEX_SECRET_CIOPENAI_API_KEY(یاOPENCLAW_MANTIS_AGENT_OPENAI_API_KEYمخصوص اثبات Telegram Desktop)CRABBOX_COORDINATOR/CRABBOX_COORDINATOR_TOKEN(گردشکارها همچنینOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR/_TOKENرا بهعنوان مسیر جایگزین میپذیرند و پیش از فراخوانی Crabbox آنها را به نامهای ساده نگاشت میکنند)CRABBOX_ACCESS_CLIENT_ID،CRABBOX_ACCESS_CLIENT_SECRETMANTIS_GITHUB_APP_ID،MANTIS_GITHUB_APP_PRIVATE_KEY
اجراکنندهٔ Mantis هرگز نباید توکنهای ربات Discord/Slack/Telegram، کلیدهای API ارائهدهنده، کوکیهای مرورگر، محتوای پروفایل احراز هویت، گذرواژههای VNC یا بارهای خام اعتبارنامه را چاپ کند. اگر توکنی در یک مسئله، PR، گفتوگو یا لاگ افشا شد، پس از ذخیرهشدن اطلاعات محرمانهٔ جایگزین، آن را تعویض کنید.
نتایج اجرا
سناریوهای انتقال قبل/بعد میان این نتایج تمایز قائل میشوند تا یک محیط ناپایدار بهعنوان پسرفت محصول برداشت نشود:
- بازتولید اشکال: خط مبنا به همان روشی که سناریو انتظار دارد ناموفق شد.
- خرابی چارچوب آزمون: راهاندازی محیط، اعتبارنامهها، API بستر انتقال، مرورگر یا ارائهدهنده پیش از معنادارشدن معیار ارزیابی ناموفق شد.
اثبات مرورگر فقط برای نامزد گزارش میکند که آیا نامزد از Gateway شبیهسازیشده و ادعاهای قابلمشاهدهٔ رابط کاربری عبور کرده است یا نه؛ این اثبات ادعای بازتولید خط مبنا ندارد.
افزودن یک سناریو
سناریوهای انتقال زنده برای هر بستر انتقال با TypeScript تعریف میشوند (برای
شکل قبل/بعد Discord، به MANTIS_SCENARIO_CONFIGS در extensions/qa-lab/src/mantis/run.runtime.ts
مراجعه کنید)، نه با یک قالب فایل اعلانی مستقل.
هر سناریو به این موارد نیاز دارد: شناسه و عنوان، بستر انتقال، اعتبارنامههای الزامی، سیاست
ref خط مبنا، سیاست ref نامزد، وصلهٔ پیکربندی OpenClaw، مراحل راهاندازی/محرک،
معیار ارزیابی مورد انتظار خط مبنا و نامزد، اهداف ثبت بصری، بودجهٔ
مهلت زمانی و مراحل پاکسازی.
اثبات متمرکز مرورگر فقط برای نامزد میتواند از یک آزمون قطعی E2E و گردشکار اختصاصی استفاده کند. دامنهٔ آن را صریح نگه دارید، پیش از اجرا ref نامزد را اعتبارسنجی کنید، انتشار متکی بر اطلاعات محرمانه را ایزوله کنید و همان قرارداد مانیفست مدارک را تولید کنید.
معیارهای ارزیابی کوچک و نوعدار را بر بررسیهای بصری ترجیح دهید: وضعیت واکنش Discord یا
ارجاعات پیام، وضعیت API واکنش/ts رشتهٔ Slack، شناسههای پیام ایمیل
و سرایندها. زمانی از اسکرینشاتهای مرورگر استفاده کنید که رابط کاربری تنها مشاهدهپذیر قابلاعتماد باشد،
و در صورت وجود معیار ارزیابی مبتنی بر API پلتفرم، بررسیهای بصری را مکمل آن نگه دارید.
پس از Discord، Slack و Telegram، همین ساختار اجراکننده به WhatsApp (ورود با QR، شناسایی مجدد، تحویل، رسانه، واکنشها) و Matrix (اتاقهای رمزنگاریشده، روابط رشته/پاسخ، ادامه پس از راهاندازی مجدد) گسترش مییابد؛ هنوز هیچکدام پیادهسازی نشدهاند.
پرسشهای باز
- هنگام استفادهٔ مجدد از بات موجود Mantis، کدام بات Discord باید راهانداز و کدامیک SUT باشد؟
- GitHub باید مصنوعات Mantis مربوط به PRها را چه مدت نگه دارد؟
- ClawSweeper چه زمانی باید بهجای انتظار برای فرمان نگهدارنده، بهطور خودکار یک سناریوی Mantis را پیشنهاد کند؟
- آیا پیش از بارگذاری اسکرینشاتها برای PRهای عمومی، باید اطلاعات حساس آنها پوشانده شود یا برش داده شوند؟