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

تبدو آلة الحالات الدنيا هكذا:
requested -> draining -> reconciling -> terminated
\-> aborting -> reconciling -> terminated
ترفض draining نداءات الأدوات الجديدة وتدع النداءات المعلّقة تنتهي ضمن نافذة محدودة. تلغي aborting تلك النداءات وتتطلب إقرارًا من طبقة الأدوات بكل إلغاء. تكتب reconciling السجل الموصوف أدناه. وعندها فقط يمكن الوصول إلى terminated. الانتقال من requested يبدأه سلطان خارج عبء العمل، لا الوكيل نفسه.
قواعد الانتشار. يجب أن يكون امتياز الابن قابلاً للإبطال من أي سلف في سلسلة التفويض، لا من المكوّن الذي أصدره فقط. إذا كان لا يمكن إبطال بيانات اعتماد حفيد إلا بواسطة أبيه المباشر، وكان الأب المباشر هو ما فشل، فإن بيانات الاعتماد تصبح دائمة فعليًا. يجب أن تتدفق سلطة الإبطال نزولاً عبر السلسلة وأن تكون قابلة للممارسة من الجذر، أو من مستوى تحكم يعمل نيابة عن الجذر. هذه خاصية نظام قدرات، لا خاصية وكيل: كل منحة تحمل مجموعة الأطراف المخوّلة بسحبها، وتشمل تلك المجموعة الأسلاف المفوّضين.
سجل مصالحة يُكتب قبل الخروج. يجب ألا يعتمد تشريح ما بعد الحادث على سجلات الوكيل نفسه. فالوكيل الذي يجري إنهاؤه — خصوصًا إذا كان مسيئًا — هو أقل الرواة موثوقية لأفعاله الأخيرة. يُكتب سجل المصالحة بواسطة المشرف أو مستوى التحكم، من الخارج، ويبيّن: أي نداءات أدوات كانت جارية، وكيف حُلّ كل منها، وأي امتيازات أُبطلت وأيها انتهت، وأي الأبناء تأكد إنهاؤهم وأيها غير محسوب. الأبناء غير المحسوبين هم الحقل المهم. بروتوكول لا يستطيع تعدادهم لا يستطيع ادعاء أن السرب متوقف.
هذه التزامات عادية في الأنظمة الموزعة. وهي غير براقة، وهي الفرق بين ضابط وإيماءة.
أين يتوقف تأطير قواعد الإيقاف

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