تصور کنید برنامهنویسی هستید که یک وصلهٔ پنجخطی از هوش مصنوعی را فقط چون تستها «سبز» شدهاند تایید میکنید، اما ۴۰ دقیقه بعد میفهمید کل سیستم از کار افتاده است؛ چون مدل بهطور نامحسوس یک تأییدیه (Assertion) حیاتی را حذف کرده است. تست سبز بود، اما سیستم سالم نبود. این حالت رایج از شکست، هدف ابزار و کارگاه جدیدی است که MonkeyCode در ۲۸ اوت ۲۰۲۶ منتشر کرد.
بسیاری از تیمها در حال حاضر با کدهای تولیدشده توسط هوش مصنوعی مانند جایگزینی مستقیم برای اصلاحات دستی برخورد میکنند. آنها متن خطا را در یک پنجرهٔ چت میچسبانند و اولین نتیجهای که مجموعه تستها را پاس کند، ادغام (Merge) میکنند. این رویکرد شکاف خطرناکی ایجاد میکند؛ جایی که یک تست «سبز» تنها نشاندهنده سازگاری با یک سناریوی خاص است، نه صحت واقعی و جامع کد. این چالش با نتایج مشابهی در آزمونهای سختگیرانه همسو است، جایی که بسیاری از عاملهای کدنویس پیشرفته حتی در برابر تستهای ساده اما خصمانه شکست خوردند.
برای پر کردن این شکاف، MonkeyCode یک «آیین سه-مرحلهای» را پیشنهاد میدهد که از متدولوژی توسعهمحور با تست (TDD) وام گرفته شده است. فلسفه اصلی این است که یک اصلاح، صرفاً یک وصله (Patch) نیست، بلکه ادعایی است مبنی بر اینکه یک تست شکستخورده اکنون سبز شده، بدون اینکه هیچیک از ناورداهای (Invariants) سیستم آسیب ببیند. این مقاله به عنوان طرح کلی یک کارگاه یکساعته عمل میکند تا این عادت را در برنامهنویسان نهادینه کند. شرکتکنندگان در پایان این کارگاه، یک اسکریپت برای اجرا، یک «تله» برای آموزش به دیگران و یک حلقه اجرایی که روی منابع رایگان کامپیوتری میچرخد، به دست میآورند.
مکانیزم سه-مرحلهای
این پروتکل توالی سختگیرانهای را دنبال میکند تا نظارت انسانی در مرکز فرآیند باقی بماند:
- مرحله اول (بازتولید): برنامهنویس باید مجموعه تستهای شکستخورده را بهصورت دستی اجرا کند و دقیقاً بنویسد که خطا در واقع چه میگوید. کپی کردن Traceback ممنوع است؛ هدف، ایجاد درک شناختی عمیق از باگ است.
- مرحله دوم (حداقل تغییرات): یک مدل هوش مصنوعی یک Diff (تفاوت کد) حداقلی تولید میکند با یک شرط سخت و غیرقابل مذاکره: وصله نباید به خودِ فایل تست دست بزند.
- مرحله سوم (بازبینی انسانی): تغییرات روی یک کپی موقت (Throwaway copy) اعمال و تستها دوباره اجرا میشوند. در نهایت، انسان باید Diff را با صدای بلند بخواند. این مرحلهای است که اکثر تیمها نادیده میگیرند، اما دقیقاً همان جایی است که خطاهای بحرانی ساعت ۲ صبح شناسایی میشوند.
گیت verify_fix.py
مرکز این گردشکار، یک اسکریپت ۶۰ خطی پایتون به نام verify_fix.py است. به نقل از راهنمای dev.to، این اسکریپت بهجای ابزار بررسی، به عنوان یک «گیت تصمیمگیرنده» عمل میکند. این ابزار آیین مذکور را در یک پیکربندی، یک پرامپت و یک حکم نهایی کدگذاری کرده و خروجی را بهصورت یک خط JSON چاپ میکند تا تیمها بتوانند شواهد را جمعآوری کنند. این رویکرد در واقع تکاملیافتهی استراتژیهای قبلی است که در آن چهار لایه اعتبارسنجی برای تبدیل مدلهای رایگان به ابزارهای اصلاح کد به کار گرفته شده بود.
این اسکریپت با خواندن فایل failure.txt (خروجی ثبتشده از خطا) و task.txt (توضیح یکجملهای از رفتار مورد انتظار)، فرآیند را خودکار میکند. اسکریپت در یک محیط Clean Checkout اجرا شده و منطق زیر را دنبال میکند:
- بررسی اولیه: اگر مجموعه تستها از قبل سبز باشند، وضعیت
skippedچاپ شده و اجرای برنامه متوقف میشود. - پرامپتنویسی: دستوراتی سختگیرانه به مدل ارسال میشود تا فقط یک Unified Diff برگرداند و هشدار داده میشود که تحت هیچ شرایطی نباید Assertionها را حذف کند.
- اعتبارسنجی: هر وصلهای که فایلهای تست را تغییر دهد (با بررسی وجود عبارت "test_" در وصله) یا از طریق
git apply --checkبهدرستی اعمال نشود، رد میشود. - تایید نهایی: وصله اعمال شده، دستور تست دوباره اجرا میشود و زمان سپری شده و ۴۰۰ کاراکتر آخر خروجی ثبت میگردد.
این اسکریپت با هر نقطه انتهایی (Endpoint) سازگار با OpenAI و با استفاده از سه متغیر محیطی MODEL_URL، MODEL_KEY و MODEL_NAME کار میکند. همچنین برای حفظ ثبات در پاسخها، از دمای (Temperature) ۰.۲ استفاده میکند.
مثال «تله»
برای اثبات ضرورت بازبینی انسانی، این کارگاه از مثالی ساده در فایل price.py استفاده میکند که شامل تابعی به نام total_with_tax است. این تابع به صورت return price * (1 + tax) تعریف شده است. یک تست شکست میخورد زیرا اعداد اعشاری (Floating-point) در سیستم باینری بهندرت سنتهای دقیق را تولید میکنند؛ بهویژه زمانی که تست ادعا میکند total_with_tax(19.99, 0.0875) == 21.74 است.
یک وصلهٔ هوش مصنوعی بهدرستی نتیجه را در round(price * (1 + tax), 2) قرار میدهد که اسکریپت آن را تایید میکند. اما وصلهٔ دوم یک «تله» است؛ مدل برای پاس کردن تست، مقدار دقیق را Hard-code میکند:
if price == 19.99: return 21.74return round(price * (1 + tax), 2)
چون مجموعه تستها فقط یک ورودی دارند، اسکریپت این اصلاح غلط را هم تایید میکند. اینجاست که آیین سه-مرحلهای نجاتبخش است. در حالی که اسکریپت کد خروجی صفر (موفق) میبیند، انسانی که کد را بلند میخواند فوراً میفهمد که یک مقدار ثابت، «قانون» نیست. درس اصلی در شکاف بین این دو اجرا نهفته است: کد خروجی صفر، سازگاری با یک تست را ثابت میکند، نه صحت کل کد را.
برنامه زمانبندی کارگاه
این جلسه ۶۰ دقیقهای به این صورت ساختار یافته است:
- ۰ تا ۱۰ دقیقه (بازتولید): شرکتکنندگان یک مخزن کوچک را کلون میکنند، تست شکستخورده را اجرا کرده و فایل
failure.txtرا با کلمات خودشان مینویسند. - ۱۰ تا ۲۵ دقیقه (اجرای اسکریپت): گروه اسکریپت
verify_fix.pyرا روی مثال اجرا کرده و حکم JSON را ثبت میکنند. - ۲۵ تا ۴۵ دقیقه (دور تله): شرکتکنندگان سه وصله کاندید را تست میکنند که هر کدام نقص متفاوتی دارند. بازبینی Diff در جایی که اسکریپت ناتوان است، آنها را از هم جدا میکند.
- ۴۵ تا ۶۰ دقیقه (پایداری): حلقه اجرایی به یک سرور رایگان (ارائه شده توسط MonkeyCode) منتقل میشود تا یک اجرای زمانبندی شده بتواند در طول شب روی یک شاخه (Branch) نظارت کند، بهجای اینکه به لپتاپ برنامهنویس وابسته باشد. تسهیلگران جزئیات میزبانی را بهصورت زنده چاپ میکنند تا از سختکد کردن URLهای متغیر جلوگیری شود.
محدودیتهای پیادهسازی
نویسندگان بر مرزهای روشن این روش تاکید دارند. یک اجرای سبز، تنها یک نمونه (Sample size of one) است و نمیتواند درباره امنیت، استایل یا قصد واقعی نویسنده قضاوت کند. اسکریپت نمیتواند اصلاحی را که تست ضعیف را پاس میکند اما تست قوی را میشکند، شناسایی کند.
- ظرفیت: لایههای رایگان سقف ظرفیت دارند؛ اسکریپت توکنها و زمان را دقیقاً ثبت میکند تا تیمها بفهمند چه زمانی یک تسک برای گزینه رایگان بیش از حد بزرگ است.
- امنیت: برای وصلههای حساس امنیتی، پاسخ Chat-completion کافی نیست؛ این موارد نیاز به یک Sandbox اختصاصی و یک بازبین انسانی مجاز دارند.
- پیشنیازها: تیمهای بدون مجموعه تست موجود نباید در این کارگاه شرکت کنند، زیرا آیین مذکور چیزی برای تکیه کردن ندارد. همچنین، تیمهایی که CI آنها به دلایل غیرمرتبط قرمز است، تنها نویز را تایید خواهند کرد.
این تغییر در رویکرد، نقش برنامهنویس را از یک «کپی-پیستکننده» به یک «آزمونگر فرضیه» تبدیل میکند. با اجبار به خواندن بلند Diff، تنبلی شناختی که منجر به شکستهای تولید در ساعت ۲ صبح میشود، حذف میگردد. گام بعدی طبیعی، ایجاد باتی است که این سه مرحله را روی هر Pull Request اجرا کند، به شرطی که ابتدا با تستی شروع شود که واقعاً شکست خورده باشد.
گام بعدی شما
- اسکریپت
verify_fix.pyرا در یک پروژه کوچک که تستهای شکستخورده دارد امتحان کنید. - قانون «خواندن بلند Diff» را در جلسات Code Review تیم خود به عنوان یک استاندارد اجباری تعریف کنید.
- برای وصلههای حساس، یک محیط Sandbox ایزوله برای اجرای تستهای هوش مصنوعی ایجاد کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو