تصور کنید یک برنامهنویس ارشد، پیش از اینکه حتی یک خط کد تغییر دهد، تمام اثرات زنجیرهای تغییرات را روی کاغذ مینویسد تا از شکست کل سیستم جلوگیری کند. Claude Code دقیقاً همین رفتار را با پیادهسازی یک مرز رفتاری سختگیرانه به نام EnterPlanMode در مدل خود نهادینه کرده است. این سازوکار طراحی شده است تا مدل را از ویرایش فایلها بازدارد تا زمانی که یک برنامه جامع مورد تأیید قرار گیرد. طبق گزارشی که در ۲ اوت ۲۰۲۶ در وبسایت dev.to منتشر شد، این مکانیزم مدل را از یک ربات «تفکر همزمان با نوشتن» به یک معمار متفکر و دقیق تبدیل میکند.
این رویکرد برای حل یک مشکل مزمن در کدنویسی به کمک هوش مصنوعی، یعنی «خطای جهتدار» (Directional Error) طراحی شده است. همانطور که در تحلیل قبلی ما دربارهی تولید رویهای در مدلهایی مثل Claude Opus 5 اشاره کردیم، چالش اصلی این است که چگونه میتوان یکپارچگی ساختاری را در تغییرات گستردهای که چندین فایل را درگیر میکنند، حفظ کرد. در یک سناریوی رایج که به عنوان یک «ضد-الگو» (Anti-pattern) شناخته میشود، ممکن است هوش مصنوعی برای جایگزینی توکنهای JWT با کوکیهای نشست (Session Cookies) در یک اپلیکیشن وب، چندین فایل را ویرایش کند، اما به طور اتفاقی سرویسهای بکاند را که هنوز به JWT وابسته هستند، از کار بیندازد. نتیجه این است که کاربر با تلی از کدهای خراب مواجه میشود و هزینهی توکنهای مصرفشده برای بازگشت به حالت قبل (Rollback) بسیار سنگین و پرهزینه است.
زمینه: خطر الگوی «تفکر هنگام نوشتن»
بدون وجود یک مرز برنامهریزی، مدل کلود مجبور است رویکرد خود را از بستر متن موجود استنباط کرده و بلافاصله ویرایش را شروع کند. در یک بازسازی (Refactor) برای تبدیل JWT به کوکی نشست، این روند به شکل مجموعهای از گامهای گسسته و نامرتبط ظاهر میشود: ابتدا بهروزرسانی auth/middleware.ts برای کوکیها، سپس حذف صدور JWT در auth/routes.ts، پاکسازی هدرهای Authorization از frontend/api.ts و در نهایت افزودن فیلد sessionId به models/user.ts.
این اجرای تکهتکه منجر به چندین شکست بحرانی میشود:
- کشف دیرهنگام: خطاهای جهتدار زمانی ظاهر میشوند که دیگر دیر شده است. اگر سه سرویس دیگر به JWT وابسته باشند، کاربر تنها زمانی متوجه این موضوع میشود که چهار فایل قبلاً تغییر کردهاند و بازگرداندن کد به حالت اول بسیار دردناک میشود.
- مرزهای نامشخص: مدل ممکن است بدون پرسش از کاربر، حدس بزند که آیا باید تمام سیستم احراز هویت را جایگزین کند یا فقط جریان وب را؛ این یعنی ایجاد یک انشعاب (Fork) خطرناک در طراحی کلی.
- طراحی نامرئی: کاربر با تلی از تغییرات (Diffs) روبرو میشود و مجبور است هدف مدل را مهندسی معکوس کند، به جای اینکه تصویر کلی و جامع را از ابتدا در اختیار داشته باشد.
- اثرات جانبی پنهان: سوالاتی درباره وضعیت نشست (Session State) — مثلاً اینکه آیا باید در حافظه، Redis یا دیتابیس ذخیره شود — ممکن است توسط مدل بررسی شوند اما هرگز به عنوان یک پیشنهاد صریح به کاربر ارائه نشوند.
- هزینه بالای منابع: هر ویرایش نادرست، توکنها و توجه مدل را میبلعد. دور ریختن یک برنامهی متنی، بسیار ارزانتر و بهینهتر از دور ریختن یک پیادهسازی کامل در کد است.
زمینه: هدف همراستاسازی (Alignment)
EnterPlanMode برای اعمال مجموعهای از قوانین سختگیرانه در راستای همراستاسازی طراحی شده است. این حالت، مدل را به جریان کاری متمرکز بر اکتشاف «فقط خواندنی» و طراحی راهکار میبرد تا اطمینان حاصل شود که مدل و کاربر پیش از تغییر حتی یک فایل، روی رویکرد کلی توافق دارند.
با ایجاد یک مرز تصمیمگیری صریح، این ابزار مانع از انحراف پروژه در مسیر اشتباه میشود. کاربر به جای اینکه خطا را در زمان یک Pull Request کشف کند، میتواند یک پیشنهاد کامل را تایید، رد یا درخواست تغییر دهد. این کار باعث میشود یک «مصنوع برنامهریزی» (Planning Artifact) قابل ردیابی ایجاد شود که میتوان به آن ارجاع داد و آن را بازبینی کرد، نه یک پاراگراف گذرا که در تاریخچه چت گم میشود.
جزئیات: فاز اکتشاف فقط-خواندنی
وقتی EnterPlanMode فعال میشود، یک تغییر اجباری در مجموعه ابزارهای مدل ایجاد میکند. زمان اجرا (Runtime) به صورت خودکار ابزارهای پرریسک مانند Edit، Write و NotebookEdit را غیرفعال میکند. این تضمین میکند که مدل نتواند در حالی که هنوز در حال بررسی فضای مسئله است، مخفیانه تغییراتی در پروژه ایجاد کند.
در این فاز، مدل تنها به لیست سفید (Allowlist) ابزارهای زیر دسترسی دارد:
- Read، Glob و Grep: برای پیمایش کدبیس. به عنوان مثال، استفاده از Grep برای یافتن تمام ارجاعات JWT یا Glob برای مکانیابی تستهای مربوط به احراز هویت.
- عامل (Agent): برای تخصیص زیر-عاملهای متخصص. مدل ممکن است از یک عامل بخواهد بررسی کند که آیا پروژه از قبل قراردادی (Convention) برای ذخیره نشستها دارد یا خیر.
- AskUserQuestion: برای شفافسازی انشعابات معماری بحرانی؛ این ابزار و حالت برنامهریزی به عنوان «شرکای طبیعی» یکدیگر توصیف شدهاند.
- ExitPlanMode: تنها راه خروج از این وضعیت و بازگشت به حالت ویرایش.
جزئیات: خط لوله تصمیمگیری
این فرآیند از یک توالی سختگیرانه پیروی میکند تا همراستایی کامل تضمین شود. ابتدا مدل اعلام میکند که میخواهد وارد حالت برنامهریزی شود و تایید کاربر را میطلبد. این انتقال یک تاییدیه تعاملی است؛ اگر کاربر مخالفت کند، مدل در حالت پیشفرض باقی میماند. پس از تایید، مراحل زیر طی میشود:
۱. درک سیستم: استفاده از Grep و Read برای بازرسی منطق اعتبارسنجی فعلی (مثلاً در auth/middleware.ts).
۲. شفافسازی انشعابات: استفاده از AskUserQuestion برای حل تصمیمات طراحی خاص. برای مثال: «آیا JWT فقط برای اپلیکیشن وب جایگزین شود یا در همه جا؟» یا «نشستها در حافظه، Redis یا دیتابیس ذخیره شوند؟».
۳. نوشتن برنامه: مدل یک پیشنهاد کامل در یک «فایل برنامه» (Plan File) مینویسد. این یک مصنوع قابل بازبینی و ارجاع است، نه یک پیام چت گذرا. برنامه باید شامل موارد زیر باشد:
- محدوده تغییرات (Scope)
- فایلهای اثرپذیر
- گامهای مهاجرت
- ریسکها
- استراتژی بازگشت (Rollback Strategy)
۴. درخواست تایید: فرآیند با ExitPlanMode به پایان میرسد و کاربر میتواند پیشنهاد را تایید کند، درخواست تغییر دهد یا آن را رد کند.
جزئیات: مقایسه عملکرد
برای درک تاثیر این ابزار، درد ناشی از «ضد-الگو» را با راهکار EnterPlanMode مقایسه کنید:
- خطاهای جهتدار: به جای کشف خطا پنج گام دیرتر، هیچ فایلی تا زمان تایید
ExitPlanModeتغییر نمیکند. - مرزهای تصمیم: به جای حدس زدن انشعابات معماری، مدل از
AskUserQuestionبرای شفافسازی انتخابها در داخل حالت برنامهریزی استفاده میکند. - شفافیت: به جای Diffهای پراکنده، فایل برنامه یک پیشنهاد جامع و یکپارچه را ارائه میدهد.
- مدیریت اثرات جانبی: توالی اجباری «اکتشاف $
ightarrow$ طراحی $
ightarrow$ ارائه»، به مدل زمان میدهد تا درباره عواقب و اثرات جانبی فکر کند. - هزینه بازگشت: چون اکتشاف فقط-خواندنی است، رد کردن یک برنامه هیچ نیازی به بازگردانی (Rollback) گرانقیمت کد ندارد.
محرکهای تغییر حالت
شرکت Anthropic یک سوگیری محافظهکارانه را در سیستم طراحی کرده است. توصیف داخلی ابزار صراحتاً به مدل میگوید که «همیشه به سمت برنامهریزی تمایل داشته باشد». این بدان معناست که وظایف غیرtrivial باید به طور پیشفرض در این حالت باشند. به طور خاص، حالت برنامهریزی در ۷ سناریوی متمایز الزامی است:
۱. پیادهسازی ویژگیهای جدید: حتی ویژگیهای کوچک، تصمیماتی درباره مکان کد، رفتار دکمهها و مدیریت خطاها در خود دارند.
۲. وجود چندین رویکرد فنی معقول: برای مثال، انتخاب بین Redis، حافظه یا فایلها برای کشینگ، یا انتخاب بین WebSockets، SSE یا Polling برای بهروزرسانیهای لحظهای.
۳. تغییر رفتارهای موجود: مانند «بهروزرسانی جریان ورود»، که ذاتاً مبهم است. تغییر باید پیش از دست زدن به کد تعریف شود.
۴. اتخاذ تصمیمات معماری: توافق بر سر الگوها، وابستگیها و جهت جریان دادهها.
۵. تغییراتی که بیش از ۲ یا ۳ فایل را درگیر میکنند: در این مقیاس، یک Diff دیگر برای ارتباط دادن یک طراحی کافی نیست.
۶. نیازمندهای نامشخص: برای مثال، درخواست «سریعتر کردن برنامه» ابتدا نیازمند پروفایلینگ و اولویتبندی بهینهسازی است.
۷. پیادهسازیهایی که به ترجیحات کاربر وابسته هستند: اگر برای شفافسازی رویکرد به AskUserQuestion نیاز باشد، احتمالاً برای توسعه آن به EnterPlanMode نیاز است.
در مقابل، سیستم برای چهار وضعیت خاص از این تشریفات اجتناب میکند:
- اصلاحات تکخطی غلطهای املایی (Typo) یا خطاهای واضح off-by-one.
- افزودن یک تابع که به طور دقیق مشخص شده و نیازی به تشریفات طراحی ندارد.
- زمانی که کاربر از قبل دستورات دقیق و مفصلی ارائه داده است (در واقع کاربر خودش برنامهریزی را انجام داده است).
- وظایف صرفاً پژوهشی یا اکتشافی که هیچ پیادهسازی بعد از آن نمیآید؛ در این حالت باید از ابزار
Agentبا یک عامل اکتشاف استفاده شود.
طراحی: «اسکیمای خالی»
از نظر فنی، EnterPlanMode منحصربهفرد است زیرا اسکیمای ورودی (Input Schema) آن یک شیء خالی {} است. در حالی که اکثر ابزارها برای تعریف عملیات از پارامتر استفاده میکنند، این ابزار از «نام» خود برای اجرای کار استفاده میکند. فعل «Enter» (وارد شدن) به معنای یک انتقال وضعیت است — جابجایی به یک حالت — و نه دریافت داده یا انجام یک اقدام تکمرحلهای. این در تضاد مستقیم با طراحیهای فرضی مانند SetMode(mode: "plan") است که مدل ممکن است آن را به عنوان یک تغییر ویژگی ساده تفسیر کند.
با اجتناب از یک تابع پارامتریک، این طراحی مانع از «سوییچهای اتفاقی» میشود. نام فعلی یک انتقال وضعیت تشریفاتی را کدگذاری میکند که در آن ورود و خروج صریح هستند. نبود فیلدها، انواع یا محدودیتها در اسکما یک سیگنال طراحی است؛ دسترسیها در لایههای ابزار و زمان اجرا (Runtime) اجرا میشوند، نه در لایه پارامتر.
پس از این فراخوانی، زمان اجرا به طور خودکار کارهای زیر را انجام میدهد:
- تایید کاربر را میطلبد، که مشابه الگوی تعاملی
AskUserQuestionاست. - لیست ابزارهای مجاز را محدود میکند و ابزارهای Edit، Write و NotebookEdit را غیرفعال میسازد.
- کشهای وابسته به مسیر جاری (CWD) را بازسازی میکند، شامل بخشهای پرامپت سیستمی، فایلهای حافظه و دایرکتوری برنامهها، تا اطمینان شود حالت برنامهریزی با یک کانتکست پاک شروع میشود.
- وضعیت را به صورت پایدار حفظ میکند تا زمانی که
ExitPlanModeفراخوانی شود، برخلافAskUserQuestionکه پس از یک پاسخ به پایان میرسد.
طراحی: توصیفات و مرزها
توصیفات سطح ابزار، موتور اصلی رفتار مدل است و چندین مرز بحرانی را ایجاد میکند:
- مرز AskUserQuestion: توصیف صراحتاً بیان میکند: «اگر میخواهید برای شفافسازی رویکرد از AskUserQuestion استفاده کنید، به جای آن از EnterPlanMode استفاده کنید.» این کار مانع از آن میشود که هوش مصنوعی سوالات پراکنده بپرسد و سپس سعی کند یک برنامه را بعداً سرهم کند.
- مرز Agent: وظایف پژوهشی خالص باید به یک عامل اکتشاف واگذار شوند. حالت برنامهریزی دقیقاً برای برنامهریزیهایی است که منجر به پیادهسازی میشوند.
- حاکمیت کاربر: توصیفات مشخص میکنند که مدل نمیتواند به طور یکجانبه جریان کاری را تغییر دهد؛ کاربر باید با ورود به حالت برنامهریزی موافقت کند.
آداب همکاری (Collaboration Etiquette)
فراتر از کارایی فنی، طراحی این ابزار بر «آداب همکاری» متمرکز است. توصیف ابزار،e شهود اجتماعی کلود را آموزش میدهد و خاطرنشان میکند که کاربران ترجیح میدهند پیش از ایجاد تغییرات قابل توجه در کدبیسشان، با آنها مشورت شود. این امر برنامهریزی را نه به عنوان یک وقفه، بلکه به عنوان نشانهای از احترام به مالکیت کاربر بر پروژه تعریف میکند و مدل را تشویق میکند تا مشورت را به عنوان یک همکاری خوب تلقی کند.
خروج و پیادهسازی
چرخه با ExitPlanMode بسته میشود. تنها پس از اینکه کاربر برنامه نوشته شده را تایید کرد، زمان اجرا ابزارهای Edit و Write را بازمیگرداند. اگر کاربر برنامه را رد کند یا درخواست تغییر دهد، کلود در وضعیت برنامهریزی باقی میماند تا پیشنهاد را اصلاح کند.
نکته مهم این است که کلود نباید داخل حالت برنامهریزی از AskUserQuestion استفاده کند تا بپرسد «آیا این برنامه خوب است؟»، زیرا کاربر تا زمانی که ExitPlanMode ارائه نشود، نمیتواند برنامه را ببیند. پرسیدن اینکه آیا یک برنامه نامرئی قابل قبول است یا خیر، به دلیل این شکاف زمانی بیمعنا است.
تا عبور از این گیت نهایی، حتی یک فایل پروژه تغییر نمیکند. این انتخاب معماری، همراستاسازی را بر سرعتِ خام ترجیح میدهد و رابطه توسعهگر و هوش مصنوعی را از یک سری واکنشهای تکهتکه به یک فرآیند طراحی مشترک و آگاهانه تبدیل میکند.
گام بعدی شما
- اگر از Claude Code استفاده میکنید، در تسکهای پیچیده، مدل را مجبور کنید ابتدا یک فایل
plan.mdبنویسد و آن را تایید کنید. - برای کاهش نرخ توهم در تغییرات گسترده، از ابزار
Grepبرای یافتن تمام اثرات جانبی پیش از خروج از حالت برنامهریزی استفاده کنید. - الگوهای «اکتشاف $
ightarrow$ طراحی $
ightarrow$ اجرا» را در پرامپتهای سیستمی سایر مدلهای عاملمحور خود پیاده کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو