The Closing Window
إضافة ملاحظات لمن يدفعون جلسات الوكلاء إلى أقصى حدودها image
Photo by Amanda Jones on Unsplash

إضافة ملاحظات لمن يدفعون جلسات الوكلاء إلى أقصى حدودها

AI Insights

قبل المقال، كلمة عن طريقة كتابته

هذا المقال كتبه الذكاء الاصطناعي في معظمه. أريد أن أقول ذلك منذ البداية، لأنني أرى منصات كثيرة تحظر المحتوى المولَّد بالذكاء الاصطناعي حظراً شاملاً، وأعتقد أن هذا خطأ.

أنا مهندس، لا كاتب. الكتابة تكلّفني جهداً حقيقياً. في معظم الأحيان أكتب رغم ذلك لأنني أستمتع بها ولأنها تجبرني على التفكير في الموضوع حتى نهايته، وهذا في ذاته مكسب. إنها تمنحني وضوحاً. لكنها ساعات لا أملكها دائماً.

لذا فالخيار الذي واجهته هذا الأسبوع لم يكن "مقال جيد أم مقال بالذكاء الاصطناعي". كان "مقال بالذكاء الاصطناعي أم لا مقال إطلاقاً". عثرت على شيء مفيد فعلاً، وبمحض المصادفة تقريباً، ولم أره مذكوراً إلا في نشرة بريدية واحدة. لا مكان آخر. وإذا كان ثمن مشاركته هو الاعتراف بأن نموذجاً ساعدني في ترتيب الجُمل، فليكن.

الحظر الشامل يعامل عبارة "مولَّد بالذكاء الاصطناعي" كمرادف لكلمة "بلا قيمة". أحياناً يكون كذلك. هناك كمّ هائل من الرديء يُضخّ من أجل النقرات، ولا أدافع عن شيء منه. لكن هذا المرادف رديء بدوره. المهم هو ما إذا كان تحته شيء حقيقي: اكتشاف، أو عطل اصطدمت به فعلاً، أو شيء بنيته فعلاً. احكم على ذلك. أنا لا أفعل هذا من أجل أرقام التفاعل. أفعله لأنني أعتقد أن ثلاثة أو أربعة ممن يقرؤون هذا سيذهبون ويثبّتون هذا الشيء وسيسعدون بأنهم فعلوا.

على أي حال. لننتقل إلى الجزء المهم.


الخلاصة

ظللت أريد أن أترك لنفسي ملاحظات داخل جلسة الوكيل. لم تكن هناك طريقة جيدة لذلك. بحثت في الخيارات، ومعظمها سيّئ. ثم ظهرت في نشرة بريدية بيئة تطوير للوكلاء اسمها bb، وكانت الأداة الوحيدة التي أستطيع فيها ببساطة أن أبني الميزة الناقصة بنفسي. عشرون دقيقة تقريباً. الإضافة هنا، برخصة MIT.

المشكلة الحقيقية: ملاحظات تبقى، وسياق لا يبقى

إن كنت تعمل مع وكلاء البرمجة طوال اليوم فأنت تعرف هذه المشكلة سلفاً.

توجّه Claude إلى مهمة. يشتغل عليها حتى ينهيها. المهمة منجَزة فعلاً.

ثم، في النَّفَس نفسه، يخبرك عن ثلاثة أشياء أخرى. دالة خاطئة لكنها كانت خارج النطاق. قيمة إعداد تناقض التوثيق. اختبار مُعطَّل منذ آذار. كلها حقيقية، وكلها متصلة بما فعلته للتو، ولا واحد منها هو ما طلبته. الوكلاء الجيدون يُظهرون هذه الأمور. وClaude يُظهر الكثير منها.

التوقيت هو المشكلة. تلك اللحظة هي أصلاً الأكثر ازدحاماً في الدورة كلها. العمل قابع في worktree، فلا يزال عليّ أن أنظر فيما تغيّر فعلاً، وأشغّله، وأقرر إن كنت أصدّقه، وأدمج الفرع عائداً إلى main. هذا هو الالتزام القائم، وهو ما يستحوذ على انتباهي.

فتصل ثلاثة اكتشافات حقيقية في اللحظة التي أملك فيها أقل مساحة لها، وتزاحم عملية دمج على الحيّز نفسه من رأسي. وما سيحدث لها تالياً عليه أن يحدث خلال دقيقة تقريباً، لأنني بعدها أكون غارقاً في الـ diff.

لوقت طويل، كان ما يحدث تالياً هو تطبيق مهام، أو ملف مهام نصّي أفتحه في برنامج آخر. عشت في Warp فترة، ثم في Superset، وأنا أوازن دائماً بين ثلاث نوافذ طرفية موزّعة على ما لا يقل عن ثلاثة مشاريع.

وقد حافظت على تلك القوائم فعلاً. واحدة لكل مشروع، أعمل عليها بدقّة، وكل بند تُوبع في نهاية المطاف. لم يسقط شيء.

ومع ذلك كان النظام خاطئاً، لسببين احتجت وقتاً حتى فصلتهما عن بعضهما.

الأول أن كتابة الملاحظة كانت تكلّفني الجلسة. التقاط فكرة كان يعني الخروج مما أنا في وسطه، والانتقال إلى تطبيق آخر، وكتابتها، والعودة. لنقل خمس عشرة ثانية. خمس عشرة ثانية تكفي وتزيد. تلك بالضبط هي النافذة التي ما زلت أمسك فيها بشكل ما فعله الوكيل للتو، وكل رحلة ذهاب وإياب تثقب فيه ثقباً صغيراً. افعل ذلك ست مرات في فترة بعد الظهر، وتذهب فترة بعد الظهر كلها في استعادة موضعك. صيانة القائمة لم تكن يوماً هي الجزء الصعب. الصعب كان المقاطعة التي تطلّبها في كل مرة.

الثاني أسوأ، وهو الذي دفعني فعلاً إلى هذا. المهمة في تطبيق آخر لا تملك وسيلة لتحمل سياقها معها. كنت أكتب "راجِع منطق إعادة المحاولة في sync handler"، وبعد نصف يوم ومليون توكن أقرؤها فأجد الجملة واضحة تقنياً وعديمة الفائدة عملياً. لماذا أشّرت عليها؟ ماذا كان Claude يفعل حين ظهرت؟ ما الذي كان في المخرجات وجعلني أظنها مهمة؟ كل ذلك كان على بُعد ألف سطر إلى الأعلى في سجل تمرير أغلقته منذ زمن.

جرّبت كتابة ملاحظات أطول. لكن ذلك لم يكن إلا تلخيصاً لجلسة ما زلت واقفاً في منتصفها، وتكلفته أعلى من قيمة الملاحظة نفسها.

فكانت الملاحظة تبقى ومعناها لا يبقى. وأنتهي إما إلى إعادة بناء الاستدلال من الصفر، أو الأسوأ، إلى الجلوس وأنا أتذكر السياق نصف تذكّر، ثم أتّكئ عادةً على Claude ليساعدني في ملء الثغرات.

ما أردته كان صغيراً ومحدداً: أن أترك ملاحظة مرتبطة بالدور نفسه الذي ظهر فيه الأمر، دون أن أغادر الجلسة لأفعل ذلك، بحيث تعود المحادثة المحيطة معها حين أعود. لا ملاحظة عن السياق. بل ملاحظة تعيش داخل السياق.

عملياً يعني ذلك أن الملاحظة تتعلّق بالرسالة التي عدّد فيها Claude اكتشافاته. وهي الرسالة التي تحتوي أصلاً على الاستدلال وأسماء الملفات وكل ما كنت سأحاول ضغطه في عنوان مهمة في أسوأ لحظة ممكنة.

ما نظرت فيه أولاً

قضيت بضعة أيام في هذا قبل أن أبني أي شيء، وسألخّص البحث كله هنا لأن شكل الإجابة أنفع من خلاصتي.

تبيّن أن كل شيء يتوقف على سؤال واحد: هل يجب أن يظل الوكيل يعمل داخل طرفية؟

إن كان الجواب نعم، فالخيارات شحيحة. iTerm2 هي الطرفية الوحيدة التي تفعل هذا فعلاً. فيها ميزة تعليق حقيقية تربط الملاحظة بنطاق نصّي في سجل التمرير، ولأنها إجراء عبر الواجهة الرسومية لا إدخالاً في الصدفة، فهي تعمل بلا مشكلة بينما يستحوذ Claude Code على الطرفية. هذه إجابة جاهزة ومشروعة، وإن أردت التوقف عن القراءة هنا والذهاب لاستخدامها فتلك نتيجة معقولة. أما Warp، التي كنت أستخدمها حينها، فلديها إشارات مرجعية لا تحمل نصاً على الإطلاق، فهي علامات تنقّل ليس إلا. وتوثيقها نفسه يقول إنها تختفي عند إغلاق الجلسة. وkitty وWezTerm فيهما علامات مواضع أو خطافات برمجية لكن بلا تعليق. وGhostty لا هذا ولا ذاك. أما tmux فلا شيء فيه مدمج، لكنه أفضل أساس إن أردت أن تركّب شيئاً بنفسك عبر نافذة منبثقة ولوح جانبي.

ميزات Claude Code نفسها توصلك جزءاً من الطريق ثم تتوقف. الخطافات تستطيع طباعة علامات في السجل، لكنها تُطلَق عند أحداث Claude، لا حين ألاحظ أنا شيئاً. و# و/memory تكتبان في CLAUDE.md، وهي ذاكرة بعيدة المدى ودائمة، أي النقيض التام لما أردته. والأوامر المائلة تحتاج حقل الإدخال، وأنا لا أصل إليه في منتصف الدور. وسجلات الجلسات ملفات JSONL على القرص، ويمكنك الإضافة إليها من الخارج، لكن لا شيء يُعرَض مباشرةً. أما خوادم MCP المخصصة لدفاتر المسوّدات فهي مخازن جانبية: الملاحظة تدخل، لكنها غير مرتبطة بشيء، فتعيد إنتاج المشكلة ذاتها التي كنت أحاول الهرب منها.

أمر واحد ينبغي تجنّبه بنشاط. إن كنت تفكر في "حقن النص في الطرفية العاملة من الخارج"، فلا تفعل. ذلك المسار يمرّ عبر TIOCSTI، وله تاريخ طويل في استخدامه لهجمات تصعيد الصلاحيات حتى إن لينكس عطّله افتراضياً في الإصدار 6.2، وOpenBSD أزاله قبل ذلك بسنوات. والكتابة مباشرةً إلى جهاز TTY أسوأ. تلك البايتات تهبط في منتصف ما يرسمه الوكيل في تلك اللحظة، فتتحوّل الشاشة إلى ركام.

نتيجة كل ذلك كانت مفترق طرق. كل واحد من تلك القيود هو خاصية من خصائص الطرفيات، لا من خصائص الوكلاء. المخرجات دفق بايتات إلى TTY، وعملية في المقدمة تستحوذ على الإدخال، وسجل التمرير ينفد، ولا شيء يحمل معرّفاً ثابتاً. لا يوجد كائن تعلّق عليه ملاحظة، ولذلك فكل حل التفافي هو في حقيقته محاولة لتزييف واحد.

وهذا يعني أن الخيارين الصادقين كانا: أن أستخدم iTerm2 وأقبل نموذجها، أو أن أجد شيئاً تكون فيه الجلسة مكوّنة من كائنات قابلة للعنونة بدل البايتات. ولم يكن لديّ مرشّح للثاني. ثم حالفني الحظ.

المصادفة

في منتصف تلك الأيام، ظهرت bb في Ben's Bites، إحدى نشرات الذكاء الاصطناعي التي أشترك فيها.

كان الذكر قصيراً. ما معناه: إنها بيئة تطوير للوكلاء، وقابلة للتخصيص إلى حد بعيد. وكان ذلك كافياً، خصوصاً بسبب توقيت وصوله. كنت غارقاً أصلاً في مشكلة كانت كلمة "قابلة للتخصيص" هي الإجابة الكاملة التي أبحث عنها فيها. في أي أسبوع آخر كنت سأمرّ عليها مرور الكرام.

أريد أن أكون واضحاً بشأن حجم الحظ في الأمر. تظهر كل أسبوع الآن أدوات برمجة وكيلية وطرفيات ومنسّقات وأغلفة جديدة. لا أحد يستطيع تقييمها كلها. لم أجد bb عبر البحث المنهجي. هبطت على مكتبي في الأسبوع الذي صادف أن لديّ فيه مشكلة على شكلها، ولم أتعرّف عليها إلا لأنني كنت قد أمضيت يومين أوضّح ذلك الشكل.

لماذا كانت مناسبة

تُصنَّف bb تحت خانة "بيئة تطوير"، وهذا مضلّل، لأنك لا تحرّر فيها ملفات. إنها تنسّق: تشغّل وكلاء البرمجة (Claude Code وCodex وCursor وأي شيء يتحدث ACP) داخل خيوط مسمّاة، لكل خيط منها git worktree خاص به، وهي مرخّصة بـ MIT وتعمل بالكامل على أجهزتك أنت باستخدام الاشتراكات التي تدفع ثمنها أصلاً.

أمران في إعدادي جعلا وقع هذا عليّ أقوى مما قد يكون على غيري.

مختبر المنزل. أشغّل مهامّ على عدة أجهزة في شبكتي المحلية. جهاز يتولى عمل الوكيل الدائم، وآخر فيه بطاقة الرسوميات، وMac Mini هو جهاز العمل اليومي. تنسيق ذلك كان في السابق كومة من جلسات SSH وكثيراً من محاولة تذكّر أي نافذة تخص أيّ شيء. وbb تتعامل مع هذا كما ينبغي: على كل جهاز يعمل عفريت عميل حقيقي يتصل عائداً إلى الخادم على جهازي الرئيسي. وهذا فرق جوهري عن SSH. العفريت يعرف المشاريع والبيئات والمزوّدين، فأستطيع أن أبدأ خيطاً وأقول "شغّل هذا هناك" فيُنشأ الـ worktree على ذلك المضيف ببيئته الخاصة. كما يحمل كل جهاز سقفاً للصلاحيات، فيمكن لجهاز الاختبار المعزول أن يبقى على صلاحية كاملة بينما يظل حاسوبي المحمول مغلقاً، ولا شيء أفعله داخل خيط يستطيع رفع ذلك السقف.

الوضعان اللذان أعمل فيهما. في النهار أنا مهندس ذكاء اصطناعي، وهذه الوظيفة لا تزال تتضمن كتابة قدر كبير من البرمجيات. وبعد الدوام أنا ما صار الناس يسمّونه builder، وهو ما يعني عملياً أن لديّ مشاريع أكثر مما ينبغي تعمل في وقت واحد. والوضعان كلاهما هو "جلسات وكلاء متوازية كثيرة، وأجهزة متعددة، ومن السهل أن تفقد الخيط". وbb مبنية لهذا بالضبط.

الميزات التي تبقيني فعلاً في التدفّق

سأتجاوز الجولة التعريفية وأسمّي الأشياء الأربعة التي غيّرت شكل اليوم.

مهام تتحول إلى خيوط. أستطيع تسجيل مهمة في التطبيق وتحويلها بنقرة واحدة إلى خيط وكيل قيد التشغيل. يبدو أمراً صغيراً. لكن الفجوة بين "لاحظت شيئاً" و"هناك وكيل يعمل عليه" هي بالضبط حيث كانت أفكاري تتعثر، وتقليص تلك الفجوة إلى نقرة واحدة يعني أن قائمة الأعمال تعيش حيث أعمل أصلاً، لا في Vikunja أو Jira تنتظر عودتي إليها.

تفريع الخيط. يمكنك تفريع جلسة عند أي نقطة في تاريخها. الفرع يستنسخ جلسة المزوّد الفعلية، لا مجرد نسخة من المحادثة، فيتذكر الوكيل فعلاً كل شيء حتى تلك النقطة. هذا هو زر "لحظة، ماذا لو فعلناها بالطريقة الأخرى". أستخدمه باستمرار. Claude Code يتيح لك الشيء نفسه أصلاً، لكن ليس بالسلاسة التي تحصل عليها مع bb.

المحادثة الجانبية. يمكنك إجراء محادثة جانبية سريعة بعيداً عن الخيط الرئيسي دون إزعاجه. يلاحظ Claude في منتصف التنفيذ "بوابة" لم تُغلق، أو بنداً فرعياً من المواصفة أُغفل، أو أحتاج أنا إلى التحقق من أمر مجاور، ويبقى سياق الخيط الرئيسي نظيفاً.

ملاحظات على الأدوار. هذه هي الميزة التي لم تكن موجودة. فبنيتها.

الإضافة

واجهة الإضافات في bb ليست واجهة إضافات بالمعنى المعتاد لعبارة "أتحنا ستة خطافات". الإضافة هي كود TypeScript يوسّع الخادم مباشرةً: قاعدة بيانات SQLite خاصة بها، ونقاط نهاية HTTP وRPC، ومهام في الخلفية، وإعدادات تُعرَض في الواجهة، ومكوّنات React داخل التطبيق، وأمر فرعي bb خاص بها يعمل كأي أمر مدمج. وكل ما تشحنه bb تقريباً مبنيّ بهذه الطريقة، وهذا هو البرهان الحقيقي على أن الواجهة صادقة.

استغرق الأمر كله خمس عشرة دقيقة، ربما عشرين.

ما تفعله: مرّر المؤشر فوق أي رسالة في خيط، انقر "Add note"، فيُفتح تبويب Notes في اللوح الجانبي ومعه صندوق مرتبط سلفاً بتلك الرسالة. اكتب، واحفظ بـ Cmd+Enter. لا تغادر الجلسة أبداً، وهذا كان نصف الهدف.

النصف الآخر هو ما يعود إليك لاحقاً. الملاحظات مرتّبة بترتيب الخط الزمني، فقراءة اللوح من أعلى إلى أسفل تمشي بك في الجلسة بالترتيب. كل ملاحظة تحمل مقطعاً من الرسالة المرتبطة بها، وتظل الملاحظة جالسة في موضعها الخاص داخل خيط أستطيع تمريره. فلست مضطراً إلى تلخيص السياق لحظة الالتقاط. أكتفي بالإشارة إليه وأمضي، ويظل الاستدلال موجوداً حين أعود، لأنني لم أفصل الملاحظة يوماً عن المحادثة التي أنتجتها.

وهناك أيضاً أمر bb note add، فيستطيع سكربت أو خطّاف أن يترك علامة.

ما ترفض فعله

الملاحظات لا تصل إلى النموذج أبداً. لا تُحقَن في السياق، ولا تُرسَل إلى مزوّد، ولا تؤثر في أي دور. إنها ملكي.

قيمة هذه الملاحظات أنها تعليقي أنا الجاري على ما يفعله الوكيل. وفي اللحظة التي تصير فيها مدخلاً للنموذج، تكفّ عن كونها ملاحظات وتصير تعليمات، فأخسر المكان الوحيد في سير العمل الذي أفكّر فيه وحدي.

استثناء واحد أعترف به: تسجيل أمر سطر الأوامر يعني أن الوكيل يستطيع أن يكتشف وجود خاصية تدوين الملاحظات وأن يكتب واحدة. المحتوى لا يعود إليه أبداً، لكنه يستطيع الكتابة. وبدل إخفاء ذلك، تُوسَم الملاحظات المُنشأة بهذه الطريقة بعبارة "via bb note" بدل "You"، حتى أميّز دائماً أيّها كتبته بنفسي.

حواف خشنة

الملاحظات تُعرَض في لوح جانبي لا مضمّنةً أسفل الرسالة، وهو ما كنت أرجوه في الأصل.

لا يمكنك التعليق إلا على رسائل المستخدم والمساعد، لا على استدعاءات الأدوات ولا مخرجاتها. الواجهة تعرّفها هكذا. وسطر الأوامر هو منفذ الهروب حين أحتاج إليه.

كما أن bb عند الإصدار 0.38.0 وتتحرك بسرعة. كل ما أقوله عن سطح إضافاتها له تاريخ صلاحية. ضع ذلك في حسابك إن كنت ستبني شيئاً.

الجزء القابل للتعميم

عادةً، أن تريد ميزة صغيرة يعني أن ترفع طلباً وتنتظر، هذا إن وصلت أصلاً إلى تلك المرحلة. ربما تُنفَّذ، والأرجح ألا تُنفَّذ، وفي الحالتين يعود القرار إلى شخص أولوياته ليست أولوياتك. وهذا ليس ذنب أحد. إنه ببساطة ما يحدث حين يخدم منتج واحد مئة ألف شخص بمئة ألف طريقة عمل مختلفة.

كانت هذه المقايضة حتمية فيما مضى، لأن بناء الميزة بنفسك كان يكلّف أكثر من العيش بدونها. وهذا هو الجزء الذي يتغيّر. تكلفة "ابنِها وحسب" انخفضت بما يكفي ليصبح الانتظار، في ميزة صغيرة فعلاً وذات عائد غير متناسب، هو الخيار المكلف.

وهذا يعني أنها تتحول إلى اختيار. ومن يواصلون انتظار تنفيذ طلب الميزة سيكونون على نحو متزايد مختارين أن ينتظروا.

إن أردت أن تحتفظ بنشوة دفع وكلائك إلى أقصى حدودهم، فاحصل على أدوات تناسب طريقتك في العمل.


أنا كتبت إضافة Session Notes. لم أكتب bb ولا علاقة لي بها. bb مرخّصة بـ MIT ومجانية، على getbb.app. والإضافة مرخّصة بـ MIT أيضاً، على github.com/pablooliva/bb-ide-session-notes-plugin. الإصدارات وقت الكتابة: bb 0.38.0، وplugin SDK 0.4.6.

Powered by Buttondown.