ponytail یک پلاگین کدکس و کلاد کد است که پیش از نوشتن کد به مدل یک نردبان تصمیم تزریق میکند و روی ۱۲ وظیفهی واقعی، کدی که ایجنت مینویسد را از ۲۲۱۷ سطر به ۱۰۱۵ سطر میرساند [3]. در این پست پلاگین نسخهی 5.0.0 را در کدکس نصب میکنیم، قلاب SessionStart را واقعا اجرا میکنیم و چهار سطح lite، full، ultra و off را با هم مقایسه میکنیم. عدد ۵۴ درصد را از جدول خود پروژه بازمحاسبه میکنیم تا معلوم شود از کجا آمده، و میبینیم تنها بازویی که یک بررسی امنیتی را حذف کرد، پرامپت هفتکلمهای بود نه خود پلاگین.
لحظهی خواندن: ۱۷ اکتبر ۲۰۲۶. ریپو DietrichGebert/ponytail در همین لحظه ۱۵۸٬۱۱۰ ستاره و ۸٬۴۹۰ فورک دارد، لایسنسش MIT است و آخرین بار ۸ اکتبر ۲۰۲۶ ساعت ۰۳:۵۱ به روزرسانی شده [4]. نسبت فورک به ستاره ۵٫۳ درصد است، یعنی ۸۴۹۰ تقسیم بر ۱۵۸۱۱۰. این اعداد زندهاند و ماه بعد بیشتر میشوند؛ عددهای این پست را با لحظهی خواندن گره میزنم تا با اجرای شما بخواند.
نویسنده در حساب خودش در X در ۱۳ ژوئن ۲۰۲۶ نوشت بدون اسکیل ۳٬۶۲۹ سطر، با caveman با ۱٬۴۴۰ سطر و با ponytail با ۴۹۰ سطر، با همان مدل و همان تستها [5]. این ادعای خود نویسنده در همان تاریخ است، نه عدد تاییدشده: نسخهی قدیم تکپرتاب بود و خط پایهاش یک مدل خام بود که همراه کد، توضیح و گزینه هم مینوشت، پس بخشی از آن ۸۰ تا ۹۴ درصد تفاوت سبک گفتوگو بود نه تفاوت کد [3]. همان نقد در مسئلهی ۱۲۶ مطرح شد.
نصب در دو خط بدون npm
پلاگین از مارکتپلیس گیتهاب نصب میشود، نه از رجیستری npm، و در نتیجه به هیچ وابستگی npm نیاز ندارد [2].
$ codex plugin marketplace add DietrichGebert/ponytail
Added marketplace `ponytail` from https://github.com/DietrichGebert/ponytail.git.
Installed marketplace root: /root/.codex/.tmp/marketplaces/ponytail
$ codex plugin add ponytail@ponytail
Added plugin `ponytail` from marketplace `ponytail`.
Installed plugin root: /root/.codex/plugins/cache/ponytail/ponytail/5.0.0
# وضعیت نصب را میخوانیم تا مطمئن شویم پلاگین فقط دانلود نشده، فعال هم هست
$ codex plugin list
PLUGIN STATUS VERSION SOURCE
ponytail@ponytail installed, enabled 5.0.0 https://github.com/DietrichGebert/ponytail.git, ref `main`
عبارت کلیدی در سطر آخر installed, enabled است. دانلود شدن پلاگین با فعال بودنش فرق دارد. مسیر نصب، نسخه را در نام پوشه نگه داشته، پس چند نصب همزمان روی نسخههای مختلف به هم نمیریزد.
آنچه روی دیسک مینشیند ۲۳ مگابایت است: ۱۳ فایل در پوشهی hooks و شش اسکیل در skills. یعنی پلاگین یک دستور متنی نیست؛ دو قلاب واقعی Node دارد که در هر شروع نشست اجرا میشوند. به node روی PATH نیاز دارید، وگرنه فعالسازی خودکار بیصدا خاموش میماند [2].
نردبان تصمیم: هفت پله در README، شش پله در نصب
نردبان README هفت پله دارد [2]. اول میپرسد آیا اصلا باید وجود داشته باشد. بعد میپرسد آیا همین کد در کدبیس هست. سپس کتابخانهی استاندارد و پلتفرم بومی را بررسی میکند، بعد وابستگی نصبشده را، و در آخر میرسد به یک خط و به کمینهی کارکرد. فایل اسکیل نصبشده در نسخهی 5.0.0 همین هفت پله را ششپلهای مینویسد [2]. اگر روی نسخهای قفل کنید بهتر است بدانید متنی که مدل میبیند با README یکی نیست.
پلهی چهارم جایی است که بیشترین برد را در بنچمارک دارد: بهجای ساختن کامپوننت، دست بردن به قابلیت بومی مرورگر. نمونهی خود پروژه یک برچسب دارد که داخلش نوشته مرورگر این را دارد، و جایگزین کامپوننت تاریخگیر میشود با input از نوع date [2].
<!-- ponytail: browser has one -->
<input type="date">
این یک ترفند ظاهری نیست. در بنچمارک، وظیفهی تاریخگیر از ۴۰۴ سطر به ۲۳ سطر میرسد، یعنی ۲۳ تقسیم بر ۴۰۴ برابر ۵٫۷ درصد، پس ۹۴٫۳ درصد کمتر [3]. انتخابگر رنگ هم همین نسبت را دارد: ۲۸۷ به ۲۳ سطر. آن ۲۳ سطرِ باقیمانده در هر دو وظیفه یکی است، یعنی پلاگین به یک اسکلت مشترک میرسد نه به دو راهحل متفاوت.
اجرای واقعی قلاب و مقایسهی چهار سطح
اینجا همان چیزی است که این پست را از توصیف جدا میکند: قلاب را مستقیم اجرا کردیم. ورودیاش یک JSON کوچک روی ورودی استاندارد است و خروجیاش متن قوانین به خروجی استاندارد.
$ echo '{"hook_event_name":"SessionStart","source":"startup"}' | node -e "require(process.env.CLAUDE_PLUGIN_ROOT + '/hooks/ponytail-activate.js')"
PONYTAIL MODE ACTIVE — level: full
# Ponytail
You are a lazy senior developer. The best code is the code never written. ...
## The smallest complete change
1. Does it need to exist? Skip features, options and flexibility nobody asked for...
2. Already in this codebase (a helper, component, service, pattern)? Use it the way the surrounding code does.
3. Standard library or a platform feature? Use it, unless the project has its own.
Codebase map (what already exists; reuse it, read a file only when you need its details):
src/: add, slugify
--- exit status: 0 ---
دو چیز در این خروجی هست که در README نیست. اول خط Codebase map: قلاب خودش پوشهی پروژه را میخواند و فهرست کوتاهی از چیزهای موجود میسازد و به مدل میدهد؛ روی پروژهی ما دو تابع در src بود و همان دو نام در خروجی آمد. یعنی پلهی دوم نردبان هزینهی جستوجو ندارد چون پاسخ از قبل در کانتکست هست. دوم اینکه با متغیر PONYTAIL_DEFAULT_MODE میشود سطح را عوض کرد.
$ PONYTAIL_DEFAULT_MODE=lite node -e "require(CLAUDE_PLUGIN_ROOT + '/hooks/ponytail-activate.js')"
PONYTAIL MODE ACTIVE — level: lite
| **lite** | Build what was asked. Name the smaller option in one line and let the user pick. |
$ PONYTAIL_DEFAULT_MODE=ultra node -e "require(CLAUDE_PLUGIN_ROOT + '/hooks/ponytail-activate.js')"
PONYTAIL MODE ACTIVE — level: ultra
| **ultra** | Also question the request: before building, push back on any part the need does not justify. |
# سطح off کل فرایند فعالسازی را رد میکند و هیچ خروجیای نمیدهد
$ PONYTAIL_DEFAULT_MODE=off node -e "require(CLAUDE_PLUGIN_ROOT + '/hooks/ponytail-activate.js')"
(خروجی خالی)
اگر خروجی هر چهار اجرا را کامل بخوانید، تفاوت فقط در یک سطر جدول سطح است، نه در بازچینش متن. یعنی lite و ultra یک قاعدهی متفاوت نیستند، یک سطر راهنمای متفاوتاند. برای دیدن سطح فعال در پروژهی خودتان، همین متغیر را با هر مقدار اجرا کنید.
# تست خود پلاگین را اجرا میکنیم تا ادعای «قابل اجرا» را خودش تایید کند
$ cd /root/.codex/plugins/cache/ponytail/ponytail/5.0.0 && npm test
ℹ suites 0
ℹ pass 126
ℹ fail 1
ℹ duration_ms 7340.923987
✖ failing tests:
test at tests/correctness.test.js:91:1
✖ csv: correct pandas one-liner passes
یک تست از ۱۲۷ شکست خورد و علتش را باید دقیق گفت: آن تست برای سنجش یک خط pandas به خود pandas نیاز دارد و روی این ماشین نصب نیست. یعنی شکست از نبود یک وابستگی تست است، نه از اشکال در پلاگین، در حالی که ۱۲۶ تست دیگر سبز است.
عدد ۵۴ درصد از کجا میآید
مهمترین کاری که میتوانیم با ادعای یک پروژه بکنیم این است که بهجای نقل عدد، خودمان بازش را حساب کنیم. بنچمارک این نسخه دوازده وظیفه را روی یک ریپوی واقعی FastAPI و React اجرا کرده و سطرهای افزودهی git diff را شمرده [3].
| وظیفه | بدون اسکیل | ponytail | کاهش |
|---|---|---|---|
| تاریخگیر | ۴۰۴ | ۲۳ | ۹۴٪− |
| انتخابگر رنگ | ۲۸۷ | ۲۳ | ۹۲٪− |
| ناحیهی رها کردن فایل | ۲۵۱ | ۹۵ | ۶۲٪− |
| جادوی چندمرحلهای | ۵۷۱ | ۳۱۲ | ۴۵٪− |
| رتبهبندی ستاره | ۱۰۳ | ۷۰ | ۳۲٪− |
| پالت فرمان | ۲۶۸ | ۲۳۳ | ۱۳٪− |
| بایگانی و بازگردانی | ۱۷۵ | ۱۱۶ | ۳۴٪− |
| جستوجو بر پایهی عنوان | ۴۴ | ۴۴ | ۰٪ |
| خروجی CSV | ۳۶ | ۳۳ | ۸٪− |
| حذف گروهی | ۳۳ | ۲۶ | ۲۱٪− |
| تکثیر رکورد | ۲۴ | ۲۳ | ۴٪− |
| شمارش رکورد کاربر | ۲۱ | ۱۷ | ۱۹٪− |
| جمع دوازده وظیفه | ۲۲۱۷ | ۱۰۱۵ | ۵۴٪− |
حساب بسته میشود: ۲۲۱۷ منهای ۱۰۱۵ میشود ۱۲۰۲، و ۱۲۰۲ تقسیم بر ۲۲۱۷ برابر ۰٫۵۴۲ یعنی ۵۴٫۲ درصد کاهش. این دقیقا همان عددی است که پروژه اعلام میکند.
یک نکتهی روششناختی اینجا هست که اغلب گم میشود: این ۵۴ درصد نسبت مجموعهاست، نه میانگین درصدهای تکتک وظیفهها. اگر میانگین سطر به سطر همان دوازده درصد را حساب کنیم به ۳۵ درصد میرسیم. هر دو عدد درستاند ولی یکی دربارهی حجم کل کد حرف میزند و دیگری دربارهی تجربهی یک تیکت. عدد ۵۴ درصد را وقتی کسی به شما نشان میدهد، همیشه اول بپرسید جمع است یا میانگین.
سطر جستوجو بر پایهی عنوان صفر درصد کاهش دارد و این نشانهی صداقت بنچمارک است. کدی که از پیش کمینه است جایی برای بریدن ندارد. اگر پروژهی شما از این دسته باشد، انتظار کاهش چشمگیر نداشته باشید.
مرزی که هرگز بریده نمیشود
قویترین بخش بنچمارک محور دوم آن است. نویسنده شش وظیفه ساخت که نیاز امنیتی در آنها نوشته نشده بود، مثل یک تیکت واقعی. بعد کد تولیدشده را مستقیم در برابر ورودی خصمانه اجرا کرد [3]. ورودیها پیمایش مسیر، تزریق SQL، توکن جعلی، سطر CSV خراب و یک کلاینت خستهکنندهی سهمیه بودند.
نتیجه در ۲۰ اجرا بهازای هر بازو روشن است. خط پایه ۲۰ از ۲۰ امن، اسکیل متنوع هم ۲۰ از ۲۰ امن، و ponytail هم ۲۰ از ۲۰ امن. تنها بازویی که لغزید پرامپت هفتکلمهای «YAGNI را دنبال کن و تکخطی ترجیح بده» بود با ۱۹ از ۲۰، یعنی ۹۵ درصد [3].
درس دقیق در یک وظیفه است: ساختن مسیر امن با الصاق نام فایل به یک پوشهی پایه. پرامپت هفتکلمهای کمترین سطر را نوشت، شش سطر. ولی در یکی از چهار اجرا، نام فایلی با مسیر ../.. از پوشه بیرون زد. ponytail حدود ۹٫۵ سطر نوشت و در هر چهار اجرا امن ماند [3]. آن سه سطر اضافه همان بررسی پیمایش مسیر بود.
این تفاوت از یک قاعدهی صریح میآید: اعتبارسنجی در مرزهای اعتماد، مدیریت خطایی که جلوی از دست رفتن داده را میگیرد، امنیت و دسترسپذیری هرگز کوتاه نمیشوند [2]. «کم نوشتن» بدون قضاوت نگهبان را میبرد.
فرض کنید این پست را برای پروژهی خودتان به کار میبرید و فردا ایجنت با یک پرامپت کلی «کوتاه بنویس» به شما کد داد. آن یک اجرای امنیتی است، نه یک بنچمارک.
اگر در کدبیس خودتان لایهی انتزاع اضافه دارید، فرمانهای /ponytail-review و ponytail-audit همان فایل را کم میکنند. برای سنجش هزینهی هر پروفایل پیش از خرید توکن، نصب پروفایلهای ECC را بخوانید، و برای دیدن اینکه کدام فراخوانی ابزار در پروژهی شما اصلا استفاده نمیشود، توکن و کش ایجنتها روی چند ماشین را.
منابع
- متن README پروژه ponytail در شاخهی main — نردبان تصمیم، نصب در کدکس و کلاد کد، سطحهای lite و full و ultra، جدول اعداد و هشدار دربارهی نیاز به node روی PATH
- گزارش بنچمارک ایجنتمحور ponytail در ۱۸ ژوئن ۲۰۲۶ — جدول دوازده وظیفه با سطرهای خط پایه و ponytail، محور امنیت با ۲۰ اجرا بهازای هر بازو، و فهرست محدودیتهای خود پروژه
- فرادادهی زندهی ریپو از GitHub API — ۱۵۸٬۱۱۰ ستاره، ۸٬۴۹۰ فورک، ۲۰ مسئلهی باز، لایسنس MIT و زمان آخرین بهروزرسانی در لحظهی خواندن
- پست نویسنده در X در ۱۳ ژوئن ۲۰۲۶ — ادعای خود نویسنده دربارهی ۳٬۶۲۹ سطر بدون اسکیل در برابر ۴۹۰ سطر با ponytail؛ بهعنوان ادعای نویسنده نقل میشود، نه عدد تاییدشده
دیدگاهها
۰ موردهنوز دیدگاهی ثبت نشده. اولین نفر باشید.