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

انحراف الافتراضات
بالنظر إلى تواريخ متطابقة، لن يعيد الوكيل دائماً اشتقاق خطط متطابقة. فالعيّنات، واقتطاع السياق، وتغيّرات إصدار النموذج، كلها تُزيح التوزيع. الاستئناف الذي يعيد تشغيل التاريخ ويطلب من النموذج المتابعة سينتج خطة معقولة بالنظر إلى التاريخ لكنها ليست الخطة التي كانت قيد التنفيذ. انحراف الافتراضات هو النسخة الصامتة من فشل الهدف البائد: لم يتغير أي إعداد، بل إعادة البناء فقط. يبدو التشغيل سليماً وينحرف.
عقد نقطة استئناف قابل للعمل
الحل هو معاملة نقطة الاستئناف كتسلسل للقصد، مع حالة التنفيذ كحقل من عدة حقول. نقطة الاستئناف التي يمكن استئنافها بأمان ينبغي أن تحمل، معاً وبشكل ذرّي:
- الهدف، بالصيغة التي التزم بها التشغيل حالياً، لا بالصيغة التي أُطلق بها.
- القيود المقبولة، كل منها مع النقطة في التشغيل التي قُبل عندها والمصدر الذي أكّده.
- نتائج الأدوات، مفهرسة بمفتاح idempotency لا بترتيب الاستدعاء.
- الالتزامات غير المحلولة: ما وعد التشغيل بفعله ولم يفعله بعد.
- إصدار المخطط، حتى تُعرَف نقطة الاستئناف المكتوبة ببيئة تشغيل أقدم على أنها كذلك.
الآلية التي تجعل هذا يعمل عملياً هي مفتاح idempotency محصور بنطاق التشغيل، مشتق من مدخلات مستقرة لا من الساعة الجدارية أو التسلسل:
key = hash(run_id, step_name, canonical_args)
كل استدعاء أداة ذي أثر جانبي يحمل هذا المفتاح. يسجّل النظام اللاحق، أو محوّل رفيع أمامه، المفاتيح التي نفّذها بالفعل ويعيد النتيجة السابقة عند إعادة التشغيل بدلاً من تنفيذ الأثر مرة أخرى. يجب أن يكون المفتاح مستقراً عبر إعادات المحاولة وفريداً عبر القصود المتمايزة؛ واشتقاقه من اسم الخطوة والوسائط المُقنَّنة بدلاً من عدّاد هو ما يجعل إعادة التشغيل آمنة بعد إعادة تشغيل تعيد ترتيب الخطوات أو تتخطاها.
الآلية الثانية هي الرفض. تحمل نقطة الاستئناف إصدار مخطط، وترفض بيئة التشغيل الاستئناف عبر إصدارات غير متوافقة بدلاً من محاولة ترحيل بأفضل جهد. ترحيل القصد هو إعادة تخطيط، وإعادة التخطيط ينبغي أن تكون عملية صري