گلوگاه تک-آیکون

صفحه نمایش خود را در طول یک جلسه کدنویسی سنگین تصور کنید. در یک تب ترمینال، Claude Code در حال بازنویسی (refactoring) یک کامپوننت React است. در تب دیگری، Codex در حال بازنویسی یک ماژول Python است. عامل (agent) سوم در حال تولید تست‌های واحد (unit tests) است، چهارمی منتظر یک کلید API است و پنجم تازه یک مرحله بررسی لینتر (linter) را در پس‌زمینه تمام کرده است. نوار منوی شما — یا هر سیستم تری (system tray) دیگری که استفاده می‌کنید — دقیقاً برای یک آیکون وضعیت جا دارد. قرار است یک نقطه یا برچسب کوچک، کل این گروه (swarm) را نشان دهد. سوال اینجاست که کدام جلسه (session) شایسته آن جایگاه است.

پاسخ تنبلانه این است که آخرین جلسه‌ای که تغییر کرده را نشان دهید. این کار منطقی به نظر می‌رسد. اتفاقی افتاده، پس به سطح بالا می‌آید. اما این غریزه اشتباه است و برای شما هزینه خواهد داشت. آپدیت شدن یک برچسب زمانی توسط یک فایل‌واچر (file watcher) در پس‌زمینه، فریاد کمک نیست. در همین حال، جلسه‌ای که ده دقیقه پیش با یک خطای مجوز (permission error) مواجه شده، می‌تواند نامرئی بماند و منتظر بماند تا شما عبارت "yes" را تایپ کنید یا یک مسیر (path) را اصلاح کنید. اگر بر اساس تازگی (recency) رتبه‌بندی کنید، دقیقاً همان چیزی را که به ذهن شما نیاز دارد، پنهان می‌کنید. شما باید بر اساس «قابلیت اقدام» (actionability) رتبه‌بندی کنید.

چرا تازگی (Recency) شکست می‌خورد

برنامه‌نویسان به سراغ برچسب‌های زمانی (timestamps) می‌روند چون کار با آن‌ها آسان است. هر سیستمی آن‌ها را تولید می‌کند، هر پایگاه داده‌ای آن‌ها را ایندکس می‌کند و مرتب‌سازی آن‌ها تنها یک خط کد است. اما به محض اینکه شروع به مدیریت چندین کارگر (worker) مستقل کنید، «آسان بودن» دیگر مفید نخواهد بود.

در اینجا یک حالت شکست ملموس وجود دارد. جلسه پنجم فقط یک خط لاگ را اضافه کرده است، چون ابزار مشاهده وابستگی (dependency watcher) آن متوجه تغییر فایلی در node_modules شده است. برچسب زمانی آن به زمان حال به‌روز شده است. با این حال، جلسه دوم سه دقیقه پیش از شما سوالی پرسیده است: "آیا باید این بسته را نصب کنم؟ (y/n)". شما هنوز پاسخ نداده‌اید. اگر نوار منوی شما جدیدترین جلسه را نشان دهد، جلسه پنجم درخشش سبز می‌گیرد و جلسه دوم در لیست ناپدید می‌شود. هیچ‌چیز خراب به نظر نمی‌رسد. با این حال، یکی از عامل‌های شما در انتظار تصمیم شما متوقف شده است، در حالی که شما مشغول نظارت بر لینتری هستید که نیازی به شما ندارد.

تازگی، حرکت را می‌سنجد. فوریت، معنا می‌طلبد. یک نوشتن فایل، معنای ذاتی ندارد مگر اینکه وظیفه‌ای برای شما ایجاد کند. از سوی دیگر، یک درخواست منتظر (waiting prompt)، صرفاً قابلیت اقدام است. شما نمی‌توانید با تماشای تغییرات در پس‌زمینه، کد را عرضه (ship) کنید. شما با رفع موانع (blockers) آن را عرضه می‌کنید. اولین تغییر در طرز فکر ساده است: با برچسب زمانی مانند یک تعیین‌کننده در صورت تساوی (tiebreaker) برخورد کنید، نه هرگز به عنوان سیگنال اصلی.

ابتدا طبقه‌بندی کنید، سپس مرتب‌سازی کنید

یک رویکرد بهتر، یک فیلتر دو مرحله‌ای است. اول، هر جلسه را بر اساس آنچه از شما می‌خواهد برچسب‌گذاری کنید. دوم، آن برچسب‌ها را رتبه‌بندی کنید. تنها در صورتی که دو جلسه برچسب یکسانی داشته باشند، به ساعت نگاه کنید.

این کار شما را مجبور می‌کند تعریف کنید که «فوری» در جریان کاری شما واقعاً به چه معناست. یک جلسه با محدودیت نرخ (rate-limited) فوری نیست؛ بلکه در خواب است. یک جلسه در حال کار، مشغول است، اما اگر نیازی به تصمیم‌گیری نداشته باشد، می‌تواند در آرامش به محاسبات خود ادامه دهد. یک جلسه متوقف شده (stalled) فوری است، زیرا خطاها باعث از کار افتادن فرآیند می‌شوند. یک انتقال وظیفه (handoff) پاسخ‌داده‌نشده فوری است، زیرا شما رسماً مسئول مرحله بعدی هستید و عامل نمی‌تواند تا زمانی که شما اقدام نکنید، ادامه دهد.

طبقه‌بندی، نوار منوی شما را از یک فید خبری به یک لیست وظایف تبدیل می‌کند. سپس مرحله رتبه‌بندی به یک فرآیند مکانیکی تبدیل می‌شود. شما قبلاً تصمیم گرفته‌اید که یک کارگر مسدود شده (blocked) رتبه بالاتری نسبت به یک کارگر مشغول دارد. شما قبلاً تصمیم گرفته‌اید که یک سوال دیده نشده رتبه بالاتری نسبت به یک سوال دیده شده دارد. زمان تنها زمانی وارد تصویر می‌شود که دو جلسه با سطح اولویت یکسان درخواست توجه داشته باشند. آن وقت، و تنها آن وقت، قدیمی‌تر برنده می‌شود. این یک لطف کوچک برای رعایت عدالتِ «اولین ورود، اولین خدمت» است، اما هرگز نباید جایگزین خودِ وضعیت (state) شود.

یک مقیاس اولویت‌بندی کاربردی

در Agent Island نسخه 1.7.1، تیم این مفهوم را در قالب یک مقیاس پنج‌درجه‌ای رسمی کرد که هر کسی که چندین جلسه AI را اجرا می‌کند، می‌تواند از آن استفاده کند:

  • نیاز به شما (تایید نشده): ۴. جلسه چیزی را به شما بازگردانده است و شما هنوز آن را ندیده‌اید. حرکت بعدی بر عهده شماست.
  • متوقف شده (Stalled): ۳. جلسه با یک خطا، شکست در مجوز یا مانع دیگری مواجه شده است. این جلسه به چشمان شما نیاز دارد زیرا نمی‌تواند خودش را ترمیم کند.
  • در حال کار (Working): ۲. جلسه فعالانه در حال محاسبه است. منتظر شما نیست، بنابراین تنها در صورتی آیکون را دریافت می‌کند که چیز فوری‌تری وجود نداشته باشد.
  • نیاز به شما (تایید شده): ۱. شما قبلاً اعلان یا سوال را دیده‌اید اما هنوز به آن پاسخ نداده‌اید. شما از موضوع آگاه هستید، بنابراین فوریت آن یک درجه کمتر از وقفه‌های دیده نشده است.
  • بیکار یا محدود شده (Idle or rate limited): ۰. جلسه مانند یک صدای محیطی است. منتظر نوبت خود است یا صرفاً هیچ کاری انجام نمی‌دهد.

این مقیاس به خوبی با اقدامات کاربر مطابقت دارد. وقتی یک انتقال وظیفه (handoff) را انجام می‌دهید، سطح جلسه به «در حال کار» یا «بیکار» کاهش می‌یابد. وقتی یک جلسه در حال کار با خطا مواجه می‌شود، به سطح «متوقف شده» می‌پرد. وقتی برای تایید یک اعلان کلیک می‌کنید اما نیاز دارید