یک diff نشان میدهد وصله ادعا میکند چه کاری انجام میدهد. نشان نمیدهد که آیا باگ واقعاً از بین رفته، آیا شاخه جدید یک if اصلاً اجرا میشود، یا آیا ارتقای یک وابستگی import را در نصب تمیز خراب میکند. بازبینها این را میدانند و برای همین بسیاری از بازبینیها با «LGTM، به شرطی که تستها قبول شوند» تمام میشود.
با وصلههایی که هوش مصنوعی مینویسد این شکاف بزرگتر میشود. مدل بهسرعت کدی تولید میکند که معقول به نظر میرسد، و کد معقولنما دقیقاً همان است که از چشم بازبین خسته میگذرد. راهحل ارزان این است که تغییر را پیش از آنکه کسی تأییدش کند اجرا کنید — جایی که نتواند به چیزی آسیب بزند.
بررسی: base، head، تستها
قانعکنندهترین شاهدی که یک وصله میتواند ارائه دهد، بازتولیدی است که روی کد قدیم شکست میخورد و روی کد جدید قبول میشود. سندباکس این را به یک اسکریپت 20 خطی تبدیل میکند. سندباکس یک Firecracker microVM با Python 3.12، Node.js 22، git و curl است که در حدود یک ثانیه بالا میآید:
import os
from eqvps import Sandbox
REPO, BASE, HEAD = os.environ["REPO_URL"], os.environ["BASE_SHA"], os.environ["HEAD_SHA"]
def repro(sb, ref):
sb.exec(f"cd /root/app && git checkout -q {ref}", timeout=55)
return sb.exec("cd /root/app && python3 /root/repro.py", timeout=55).exit_code
with Sandbox.create(tariff="standard", ttl=1800) as sb:
sb.exec(f"git clone -q {REPO} /root/app", timeout=55)
sb.exec("cd /root/app && pip install -q -r requirements.txt", timeout=55)
sb.upload("/root/repro.py", open("repro.py").read())
before, after = repro(sb, BASE), repro(sb, HEAD)
tests = sb.exec("cd /root/app && python3 -m pytest -q", background=True).wait()
print(f"repro on base: {before}, on head: {after}; tests: {tests.state}, exit {tests.exit_code}")
فایل repro.py همان تکه کدِ گزارش باگ است. اگر روی base با کدی غیر از صفر و روی head با صفر تمام شود، وصله همان چیزی را درست میکند که ادعا دارد. این خط را همراه خلاصه تستها بهعنوان نظر روی pull request بگذارید تا بازبین از واقعیتها شروع کند.
مجموعه تست بهصورت کار پسزمینه اجرا میشود، چون یک فرمان همزمان در ثانیه 55 متوقف میشود. TTL سیدقیقهای سقف مدتی را تعیین میکند که یک اجرای گیرکرده میتواند هزینه بسازد.
عاملهای بازبینی که کد اجرا میکنند
همین ایده برای بازبین هوش مصنوعی هم کار میکند. عاملی که از طریق سرور MCP وصل شده ابزارهای سندباکس دارد: ساخت سندباکس، اجرای فرمان، بارگذاری و دریافت فایل. به جای اینکه بنویسد «این ممکن است سازگاری با Python 3.8 را خراب کند»، شاخه را دریافت میکند، کد را اجرا میکند و traceback را نقل میکند — یا گزارش میدهد که همهچیز درست است.
به چنین عاملی یک سقف هزینه و توکن فقطخواندنی بدهید و تعیین کنید کدام ابزارها را میتواند بدون پرسیدن فراخوانی کند. محافظهای MCP همه ابزارها را بر اساس میزان ریسک فهرست کرده است.
کدام تعرفه
| مخزن | تعرفه | دور معمول | هزینه تقریبی |
|---|---|---|---|
| کتابخانه کوچک، پایتون یا JS خالص | small (0.5 vCPU, 1 GB) | 2 دقیقه | $0.0011 |
| برنامه وب با مجموعه تست | standard (1 vCPU, 2 GB) | 5 دقیقه | $0.0055 |
| افزونههای بومی، وابستگیهایی که کامپایل میشوند | plus (2 vCPU, 4 GB) | 15 دقیقه | $0.033 |
سندباکسهای موقت ثانیهای با حداقل 60 ثانیه محاسبه میشوند. اگر بازبین میخواهد طی چند روز به همان محیط برگردد، آن را بهصورت persistent بسازید: دیسکش را تا 30 روز نگه میدارد و برای هر ساعتِ شروعشده محاسبه میشود، پس یک سندباکس standard که برای بازبینی دوروزه نگه داشته شود حدود 3.17 دلار هزینه دارد. وقتی pull request ادغام شد، آن را حذف کنید.
محدودیتهایی که باید بدانید
- دو فرمان همزمان برای هر حساب. برای بازبینیهایی که پشت سر هم انجام میشوند کاملاً کافی است. اگر دهها pull request را یکجا بررسی کنید، در صف میمانند.
- بدون پورت ورودی. نمیتوانید برنامه را در مرورگر باز کنید. آن را داخل اجرا کنید و از فرمان دوم با
curl localhostتستش کنید. - بدون Docker در داخل. تستهایی که کانتینر راه میاندازند جایشان روی runner در VPS است.
- اینترنت خروجی باز است. همین است که
pip installرا به کار میاندازد. چیزی را که به نویسنده وصله نمیدادید در سندباکس نگذارید.
شروع کار
حسابهای جدید 1 دلار زمان سندباکس میگیرند که روی تعرفه standard برای بیش از صد دور بازبینی کافی است. صفحه سندباکسها تعرفهها را دارد، مرجع SDK همه متدهای بهکاررفته در بالا را، و SDK پایتون در 5 دقیقه راهاندازی را.
مرتبط: اجرای ایزوله تستهای CI برای کل خط لوله، و سندباکس برای عاملهای هوش مصنوعی برای عاملهایی که اصلاً کد را مینویسند.
نظرات
هنوز نظری نیست. اولین نفر باشید.