Case Studies · Parhum Khoshbakht

چطور Statnive را با Claude Code منتشر می‌کنیم، بدون سوزاندن توکن

بودجهٔ واقعی توکن یک تیم افزونهٔ وردپرس — بیش از 80 اسکیل، 24 کانکتور MCP و یک پنجرهٔ کانتکست 200 هزارتایی. چه چیزی را اندازه گرفتیم، چه چیزی را حذف کردیم و آن چهار عددی که حالا دروازهٔ هر انتشار است.

اولین باری که /context را اجرا کردیم، فقط 12% باقی مانده بود

Statnive یک تیم کوچک است که یک افزونهٔ آمار وردپرس با محوریت حریم خصوصی می‌سازد. کدبیس ما دو زیرماژول گیت دارد (افزونه و سایت بازاریابی)، بیش از 80 اسکیل Claude Code، 24 کانکتور MCP و یک دروازهٔ انتشار که پیش از انتشار هر چیزی 248 تست و 22 دروازهٔ انتشار را اجرا می‌کند.

در دو ماه اول، توسعهٔ مبتنی بر هوش مصنوعی جادویی به نظر می‌رسید. اما بعد کم‌کم گران شد. جلسات وسط کار قطع می‌شدند. مدل انگار چیزهایی را که پنج دقیقه قبل خوانده بود فراموش می‌کرد. صورت‌حساب Anthropic ما برای یک مهندس از 6 دلار در روز هم بالاتر رفت.

برای اولین بار /context را اجرا کردیم و فهمیدیم چرا. هنوز یک پرامپت هم تایپ نکرده بودیم که 88% از پنجرهٔ کانتکست را مصرف کرده بودیم. فقط دوازده درصد برای کار واقعی باقی مانده بود.

این نوشته دربارهٔ این است که چطور این سربار را حدود دو سوم کم کردیم — بدون این‌که هیچ اسکیل یا کانکتوری را کنار بگذاریم — و آن چهار عددی که حالا دروازهٔ هر انتشار است.

اعداد اصلی این‌ها هستند: حدود 54 هزار توکن سربار پایه (پایین‌آمده از حدود 175 هزار)، حدود 73% از پنجرهٔ کانتکست آزاد برای کار واقعی، و هزینهٔ روزانه که از حدود 6 دلار به حدود 2 تا 3 دلار کاهش یافت.

واقعاً چه چیزی درون آن 200 هزار توکن جا گرفته است

Claude Code به شما یک پنجرهٔ کانتکست 200 هزارتایی می‌دهد. این رقم سخاوتمندانه به نظر می‌رسد، تا وقتی بفهمید پیش از اولین پیام‌تان چه چیزی آن را می‌بلعد.

جزءچیستبهینه‌نشدههدف ما
پرامپت سیستمیدستورالعمل‌های داخلی Claude Code~3,200~3,200
ابزارهای داخلیRead، Write، Bash، Grep، Glob، Edit~11,600~11,600
فایل CLAUDE.md ریشهدستورالعمل‌های پروژه، همیشه بارگذاری‌شده+8,000≤ 1,500
فراداده اسکیلورودی‌های <available_skills>+4,000≤ 2,500
طرح‌واره ابزار MCP24 کانکتور × ابزارهای فراوان48,000–120,000≤ 3,000
بافر فشرده‌سازی خودکارفضای ذخیره‌شده32,00032,000

سه ردیف از این جدول تمام میدان نبرد هستند: CLAUDE.md همیشه‌بارگذاری‌شده، رجیستری فراداده اسکیل و دامپ طرح‌واره ابزار MCP. بقیه را خودِ harness ثابت می‌کند.

سازوکار زیربنایی افشای تدریجی است. سیستم اسکیل‌های Claude Code هنگام راه‌اندازی فقط فیلدهای name و description هر اسکیل را بارگذاری می‌کند — تقریباً 30 تا 50 توکن برای هر اسکیل — و بدنهٔ کامل SKILL.md را تا زمانی که اسکیل واقعاً فراخوانده شود به تعویق می‌اندازد. اگر تنظیمش کنید، همین ترفند برای طرح‌واره‌های ابزار MCP و مستندات مرجع هم کار می‌کند. اگر تنظیمش نکنید، هر تعریف ابزار، هر قانون و هر دستورالعمل برای همیشه در کانتکست می‌نشیند.

سربار ابزار MCP بزرگ‌ترین نشتی ما بود

اجرای /context برای اولین بار تجربه‌ای فروتنانه است. این چیزی است که پیش از دست‌زدن به هر چیزی دیدیم:

کانکتور MCPابزارهاتوکن مصرف‌شده
GitHub35~26,000
Playwright (خودکارسازی مرورگر)21~13,647
Slack11~21,000
Context7 (مستندات کتابخانه‌ها)~15~8,000
20 کانکتور دیگر~200+60,000

همین پنج ردیف به‌تنهایی، پیش از این‌که حتی یک فایل باز کنیم، حدود 60% از پنجرهٔ کانتکست را مصرف می‌کردند. مشکل از معماری است: هر طرح‌واره ابزار MCP — نام، توضیح و تعریف کامل پارامترهای JSON — به‌طور پیش‌فرض هنگام شروع جلسه به کانتکست تزریق می‌شود. سرور MCP داکر 135 ابزار عرضه می‌کند و خودش به‌تنهایی حدود 126,000 توکن مصرف می‌کند.

اصلاحی که 85% کار را برای ما انجام داد، روشن‌کردن MCP Tool Search بود. این قابلیت که در Claude Code v2.1.7 عرضه شد، یک ایندکس سبک حدوداً 5 هزارتایی از نام و توضیح ابزارها می‌سازد و طرح‌واره کامل یک ابزار را فقط زمانی بارگذاری می‌کند که Claude واقعاً آن را فراخوانی کند. آزمایش داخلی Anthropic کاهشی از 134 هزار به حدود 5 هزار توکن — یعنی 85% کاهش — نشان داد، در حالی که دقت روی ارزیابی‌های MCP حتی بالاتر رفت (Opus 4: از 49% به 74%).

فعال‌سازی به‌طور خودکار وقتی اتفاق می‌افتد که توضیحات ابزارها از حدود 10% پنجرهٔ کانتکست فراتر بروند؛ اما ما در هر جلسه با /context فعال‌بودنش را بررسی می‌کنیم و دنبال خط «tool search enabled» می‌گردیم.

دربارهٔ اعداد قبل/بعد و آن سه کانکتوری که با بارگذاری فوری نگه داشتیم، در یک نوشتهٔ اختصاصی دربارهٔ MCP Tool Search بیشتر نوشته‌ایم.

‏CLAUDE.md: 162 خط، نه 800 خط

برخلاف اسکیل‌ها و ابزارهای MCP، هر بایت از CLAUDE.md در شروع هر جلسه و بدون هیچ بارگذاری تنبل وارد کانتکست می‌شود. این شامل فایل ریشه، هر import از طریق نحو @path/to/file (به‌صورت بازگشتی تا 5 سطح) و همهٔ فایل‌های سراسری و سازمانی می‌شود.

اولین CLAUDE.md ما 820 خط بود. هر اسکیل، هر گردش‌کار، هر استاندارد کدنویسی، هر دروازهٔ انتشار و هر ظرافت پیکربندی استانداردهای کدنویسی وردپرس ما را مستند می‌کرد. کامل بود. اما در عوض، در هر جلسه حدود 12% از پنجرهٔ کانتکست را مصرف می‌کرد؛ حتی جلسه‌هایی که هیچ ربطی به بیشتر آن‌چه توصیف می‌کرد نداشتند.

آن را به 162 خط رساندیم؛ پروتکل‌ها را بیرون بردیم و جای‌شان یک جدول تریگر گذاشتیم — یک الگوی فشردهٔ جستجوی اسکیل که جای نثر طولانی به‌ازای هر اسکیل را می‌گیرد:

## Skill triggers
| Trigger keywords | Skill | Domain |
|------------------|-------|--------|
| sprint, backlog, iteration | pm-sprint-plan | PM |
| deploy, release, ship | statnive-release | Dev |
| security, audit | sec-audit-remediate | Security |

این الگو حدود 800 توکن هزینه دارد، به‌جای بیش از 3,000 توکن برای مستندسازی طولانی. پروتکل‌های مفصل در فایل‌های SKILL.md جداگانه زندگی می‌کنند و فقط وقتی Claude به سمت‌شان مسیریابی می‌کند بارگذاری می‌شوند. قانون‌های مقیددِ مسیری زیر .claude/rules/ محدودیت‌های خاص هر حوزه را (قراردادهای React، استانداردهای کدنویسی PHP، قانون‌های دروازهٔ انتشار) فقط وقتی برمی‌دارند که Claude روی فایل‌های منطبق کار می‌کند.

تمام مقایسهٔ قبل/بعد در نوشتهٔ بازطراحی CLAUDE.md ما مستند شده است؛ اما بزرگ‌ترین الگوی نادرستی که حذف کردیم، @import‌کردن فایل‌های مرجع بزرگ درون CLAUDE.md ریشه بود. هر @import فایل هدف کامل را در هر جلسه بارگذاری می‌کند — ما سه تا از این‌ها داشتیم که حدود 6,000 توکن سربار دائمی برای محتوایی اضافه می‌کردند که مدل به‌ندرت لازمش داشت.

رده‌بندی اسکیل: چهار سطل، یک قانون

ما بیش از 80 اسکیل داریم که مدیریت محصول، اسکفولد بک‌اند، QA، ممیزی امنیتی، الگوهای خاص وردپرس، بسته‌بندی انتشار و موارد دیگر را پوشش می‌دهند. اگر ساده‌انگارانه بارگذاری شوند، 80 اسکیل × حدود 50 توکن فراداده برای هرکدام می‌شود 4,000 توکن سربار دائمی. رشد به 141 اسکیل (همان‌طور که فریمورک jaan.to که رویش می‌سازیم دارد) می‌تواند این رقم را از 14,000 هم فراتر ببرد.

اصلاحش مدل رده‌بندی چهارسطلی است که سیستم اسکیل Claude Code تعریف می‌کند:

سطلفرانت‌مترهزینهٔ فرادادهچه زمانی استفاده شود
همیشه‌فعال(پیش‌فرض)~40 توکنگردش‌کارهای اصلی که مدل باید خودکار به سمت‌شان مسیریابی کند
خودکار-فراخوان(پیش‌فرض، توضیح فشرده)~40 توکناسکیل‌های حوزه‌ای با کلیدواژه‌های تریگر قوی
فقط-دستیdisable-model-invocation: true0 توکناسکیل‌های فقط-اسلش‌کامند — کمیاب یا مخرب
فورک / زیرعاملcontext: fork~40 توکنبازبینی‌ها، ممیزی‌ها و تحلیل‌های چندمرحله‌ای که نباید کانتکست اصلی را آلوده کنند

تک‌پرسش محک این است: آیا گفت‌وگوی اصلی لازم است خروجی را ببیند؟ اگر نه — اگر اسکیل خودبسنده است و یک خلاصه برمی‌گرداند — کاندیدای فورک/زیرعامل است و مصرف توکن داخلی‌اش از کانتکست اصلی ناپدید می‌شود. Anthropic مستند کرده که زیرعامل‌ها از بیش از 10,000 توکن کار داخلی، حدود 500 تا 1,000 توکن برمی‌گردانند — یعنی روی کارهای پیچیده تقریباً 37% کاهش در کانتکست اصلی.

ما حدود نیمی از اسکیل‌های‌مان را disable-model-invocation: true علامت می‌زنیم — این‌ها فقط از طریق اسلش‌کامند در دسترس‌اند. همین کار به‌تنهایی حدود 2,000 توکن فراداده پایه را صرفه‌جویی کرد، و در عمل کیفیت مسیریابی را برای بقیهٔ اسکیل‌های خودکار-فراخوان هم بهتر کرد، چون Claude دیگر مجبور نبود میان نمونه‌های تقریباً تکراری یکی را انتخاب کند.

تفکیک کامل سطل‌به‌سطل — از جمله این‌که چطور کتابخانهٔ اسکیل واقعی Statnive را دسته‌بندی می‌کنیم — در نوشتهٔ رده‌بندی اسکیل آمده است.

جداسازی زیرعامل برای کارهای سنگین

سه دستهٔ کار دیگر هرگز کانتکست اصلی ما را لمس نمی‌کنند: بازبینی کد، ممیزی امنیتی و پژوهش اکتشافی. این‌ها در زیرعامل‌ها اجرا می‌شوند — نمونه‌های جدای Claude با پنجرهٔ کانتکست 200 هزارتایی مخصوص خودشان — و یک پیام خلاصه برمی‌گردانند.

اقتصاد ماجرا ظریف است. جلسات زیرعامل بیشتر از کار درون‌خطی توکن مصرف می‌کنند: Anthropic مستند کرده که تیم‌های عامل تقریباً 7 برابر توکن بیشتری روی هم مصرف می‌کنند، چون هر عامل یک نمونهٔ جدید Claude را با بارگذاری پرامپت سیستمی و سربار راه‌اندازی ابزار مخصوص خودش ایجاد می‌کند.

اما کل مصرف توکن چیزی نیست که ما برایش بهینه می‌کنیم. ما برای این‌ها بهینه می‌کنیم:

  1. پاکیزگی کانتکست اصلی. یک ممیزی امنیتی که 40 فایل را می‌خواند و 3 مشکل پیدا می‌کند، یک خلاصهٔ 600 توکنی برمی‌گرداند. بدون جداسازی، حلقهٔ کامل خواندن 40 هزار توکن از کانتکست اصلی را می‌خورد و ما را به سمت ناحیهٔ «گم‌شده در میانه» هل می‌دهد، جایی که کیفیت بازیابی 15 تا 47% افت می‌کند.
  2. مسیریابی مدل. زیرعامل‌ها می‌توانند روی Haiku 4.5 اجرا شوند (1 دلار / 5 دلار به‌ازای هر میلیون توکن) در حالی که جلسهٔ اصلی از Sonnet یا Opus استفاده می‌کند. اکتشاف فقط‌خواندنی به مدل سطح‌بالا نیاز ندارد — مزیت 3 برابری هزینهٔ Haiku روی ممیزی‌هایی که صدها فایل را می‌خوانند، سریع روی هم انباشته می‌شود.

یک روز عادی انتشار حالا چه شکلی است

در یک روز معمول انتشار Statnive، حدود 400 تا 600 هزار توکن کار واقعی می‌سوزانیم. این‌جا می‌بینید کجا خرج می‌شوند:

کارمدلالگو
بازبینی کد صبحگاهی روی یک PR بازSonnet (اصلی) + Haiku (زیرعامل فورک)بازبینی را فورک کن، خلاصه برگردان
نوشتن یک ویژگی جدید در داشبورد ReactSonnet (اصلی)اسکیل خودکار-فراخوان frontend-scaffold، مراجع به‌محض نیاز بارگذاری می‌شوند
اجرای دروازهٔ انتشارSonnet (اصلی)اسکیل statnive-release، مبتنی بر bash — بدون کانتکست اضافی
نوشتن یکی از همین نوشته‌های وبلاگSonnet (اصلی)پیش‌نویس درون‌خطی، یک دور بازبینی را فورک کن

بقیه را کش پرامپت می‌چرخاند. Claude Code پیشوند پایدار را کش می‌کند — پرامپت سیستمی، تعریف ابزارها، فراداده اسکیل و CLAUDE.md ریشه — که هر نوبت تکرار می‌شود. خواندن از کش 0.1 برابر قیمت پایه هزینه دارد و حدود 90% کاهش هزینه روی آن پیشوند پایدار به همراه می‌آورد. مرتب‌کردن محتوا به شکل ایستا-اول و پویا-آخر، بیشترین برخورد کش را می‌دهد؛ به همین دلیل CLAUDE.md ریشه را بالای هر کانتکست پویای تزریق‌شده نگه می‌داریم.

چه چیزی را بهینه نکردیم

شفافیت دربارهٔ محدودیت‌ها، نه فقط قابلیت‌ها:

  • به سمت کانتکست سنگینِ مبتنی بر هوک نرفته‌ایم. پژوهش‌ها می‌گویند هوک‌های SessionStart می‌توانند کانتکست پویا (شاخهٔ فعلی، فایل‌های تغییریافته، سرویس‌های در حال اجرا) را تزریق کنند تا جای محتوای ایستای CLAUDE.md را بگیرند — مطالعات موردی جامعه 62% کاهش بیشتر را نشان می‌دهند. امتحانش کردیم، برگرداندیم. این خطر که exit code 2 متن خطا را در کانتکست انباشته کند، ما را ترساند. بعد از این‌که ابزارهای تشخیص هوک Claude Code پخته‌تر شد، دوباره سراغش می‌رویم.
  • هنوز برای بعضی کارهای معماری از Opus استفاده می‌کنیم. پژوهش‌ها می‌گویند برای 80% کارها Sonnet را پیش‌فرض بگیرید و Opus را برای استدلال پیچیده کنار بگذارید. ما این کار را برای ویژگی‌ها انجام می‌دهیم، اما برای انتشارها بیش از حد روی Opus تکیه می‌کنیم، چون هزینهٔ یک انتشار خراب از صورت‌حساب حاشیه‌ای Anthropic بیشتر است.
  • هنوز برای بودجهٔ توکن دروازهٔ CI نساخته‌ایم. کتابچهٔ راهنمای پژوهش — PR را رد کن اگر CLAUDE.md ریشه از حدود 1,500 توکن فراتر رفت، اگر قانون‌های نامقید از 400 فراتر رفتند، یا اگر هر SKILL.md از 500 خط بیشتر شد — جلوی پسرفت را می‌گیرد. در نقشهٔ راه است. فعلاً با بررسی‌های دستی /context در هر جلسه آن را اعمال می‌کنیم.
  • اعداد ما خوداظهاری‌اند. ما یک تیم کوچکیم. اعداد عمومی Anthropic (از 134 هزار به 5 هزار برای Tool Search، 37% برای جداسازی زیرعامل، 90% برای کش پرامپت) در اندازه‌گیری‌های ما هم تأیید می‌شوند، اما هنوز یک بنچمارک دقیق منتشر نکرده‌ایم، آن‌طور که برای عملکرد افزونهٔ آمار وردپرس کردیم.

اثر مرکب واقعی است

این چهار بهینه‌سازی — کش پرامپت، مسیریابی مدل، جداسازی زیرعامل و به‌تعویق‌انداختن ابزار MCP — ضرب‌شونده هستند، نه جمع‌شونده. هرکدام به‌تنهایی متوسط به نظر می‌رسند. اما روی هم، یک پنجرهٔ کانتکست 200 هزارتایی را از تنگ به راحت تبدیل می‌کنند، و یک عادت 6 دلاری در روز را به ابزاری 2 تا 3 دلاری در روز بدل می‌کنند. کل محاسبهٔ هزینه را گام‌به‌گام در نوشتهٔ اقتصادی آورده‌ایم.

این برای کاربران Statnive یعنی: همان تیمی که یک افزونهٔ آمار با محوریت حریم خصوصی منتشر می‌کند، می‌تواند در ابعاد یک تیم بسیار بزرگ‌تر کار کند، بدون این‌که از پوشش تست یا سخت‌گیری انطباق چیزی کم بگذارد. هر انتشار هنوز همان 248 تست و 22 دروازهٔ انتشار را پشت سر می‌گذارد. گردش‌کار هوش مصنوعی داربست است، نه میان‌بُر.

چرا این را منتشر کردیم

ما نوشته‌هایی مثل چطور سریع‌ترین ردیاب وردپرس را ساختیم و چطور Statnive را تست می‌کنیم را منتشر می‌کنیم، چون فکر می‌کنیم اکوسیستم وردپرس سزاوار روایت‌های مهندسی صادقانه‌تری است. همین دربارهٔ توسعهٔ مبتنی بر هوش مصنوعی هم صدق می‌کند: محتوای فراوانی ادعا می‌کند Claude Code تیم شما را متحول می‌کند، اما تقریباً هیچ‌کدام حساب‌وکتاب توکن را نشان نمی‌دهند.

اگر یک تیم افزونهٔ وردپرس هستید، یا هر تیم مهندسی کوچکی که Claude Code را در مقیاس اجرا می‌کند: همین امروز /context را اجرا کنید. ببینید چه چیزی پنجره‌تان را می‌خورد. آن چهار عددی که دروازهٔ هر انتشار ماست، حالا این‌ها هستند: سربار پایه زیر 30%، CLAUDE.md ریشه زیر 1,500 توکن، تأیید فعال‌بودن MCP Tool Search، و صفر @import در پیکربندی ریشه. این‌ها در یک بعدازظهر دست‌یافتنی‌اند.

Statnive را امتحان کنید

افزونهٔ آمار وردپرس با محوریت حریم خصوصی که با همین گردش‌کار ساخته شده، در WordPress.org رایگان است. سورس کامل روی GitHub — از جمله CLAUDE.md ما، اسکیل دروازهٔ انتشارمان و مجموعهٔ کامل تست‌ها. داده‌های شما روی سرور خودتان می‌ماند. داده‌های ما هم روی سرور خودمان.

Get Statnive Free