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

هذه هي مشكلة التخزين ويجب حلها أولا. أنت بحاجة إلى طبقة حالة حيث يمكن لكل وكيل كتابة الملاحظات ويمكن لكل وكيل الاستعلام عن السياق. يجب أن تستمر الحقائق عبر الجلسات والأدوات والآلات. يجب أن تتم عملية الاسترداد بغض النظر عن الوكيل الذي كتب البيانات أو متى. [Neotoma](/posts/truth-layer-agent-memory) موجود لحل هذه المشكلة: ركيزة غير محددة للمخطط تقوم بتخزين الحقيقة وخدمتها وتتيح لك الاستعلام عن الحقيقة عبر مجموعة الوكيل بأكملها.

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

هذه ليست مشكلة استرجاع. البيانات هناك. إنها مشكلة تنسيق في طبقة البنية التحتية، وكل نظام ذاكرة منزلي رأيته يتعامل معها بنفس الطريقة: لا يفعل ذلك.

##سقف التنسيق

للتنسيق القائم على الاقتراع ثلاث تكاليف تتفاقم مع الحجم.

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

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

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

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

## ماذا تعني الإشارة

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

يعد هذا أمرًا بدائيًا قياسيًا في الأنظمة التي تتعامل مع الحالة على نطاق واسع. يقوم PostgreSQL بإصدار إدخالات WAL ويدعم الاستماع/الإخطار. لا أحد يدعي أن PostgreSQL "تتصرف" عندما تفعل ذلك. إنه يوفر إمكانية الملاحظة في تحولات الحالة الخاصة به. يقوم وسيط الرسائل مثل كافكا بنفس الشيء ولكن على نطاق مختلف. نظام الدولة يبلغ بما حدث. يقوم المستهلكون النهائيون بالتصفية وتحديد الأولويات والتصرف. طبقة التقارير لا تفكر في الأحداث. يشتعل وينسى.

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

## الخط الذي يجب أن يبقى

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

هذا الخط يجب أن يبقى.

ما هي الإشارة:

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

ما هي الإشارات ليست:

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

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

## الحدود المكررة

الحدود القديمة: الركيزة تخزن الحقيقة وتخدمها.

الحدود الجديدة: الركيزة تخزن الحقيقة وتخدمها وتشير إليها. عندما تتغير الحقيقة، تقوم الركيزة بالإبلاغ عن التغيير. ما يحدث بعد ذلك هو مسؤولية المستهلك.

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

المصطلحات مهمة. "إشارة" و"إرسال" بدلاً من "إعلام" أو "تنبيه". الإخطار يعني الحكم على الأهمية. التنبيه يعني تقييم الاستعجال. الإشارة محايدة. إشارات الركيزة. المستهلك يفسر.

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

## من الذاكرة إلى الجهاز العصبي

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

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

يضيف الجهاز العصبي طبقة النقل. فهو يشمل كل ما تفعله الذاكرة، والتخزين والاسترجاع، ولكنه يمتد من مسؤولية الركيزة لتشمل الإشارات. طبقة الدولة لا تحمل الحقيقة فقط. إنه ينشر التغييرات في الحقيقة للمستهلكين المسجلين في الوقت الفعلي.

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

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

## ما يفتح هذا

إذا كنت تقوم بتشغيل مكدس متعدد الوكلاء مقابل الحالة المشتركة، ففكر في ما يصبح ممكنًا عندما تشير طبقة الحالة إلى الكتابة.

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

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

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

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

## أبعد من وكلائك

حتى الآن يبدو هذا كما لو أن جميع العملاء ينتمون إليك. إنهم موجودون في المحرر الخاص بك، ووظائف cron، والكمبيوتر المحمول الخاص بك. تلك هي الحالة السهلة. إنها ليست الصورة الكاملة.

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

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

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

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

## ما أقوم ببنائه

أقوم بإضافة هذه الإمكانات إلى [Neotoma](/posts/truth-layer-agent-memory) بالتسلسل، كل منها يعتمد على السابق.

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

**الاشتراك والتسليم عبر الرد التلقائي على الويب.** يسجل الوكلاء الاهتمام بالنطاق ويوفرون نقطة نهاية للتسليم. تحافظ الركيزة على السجل وتقدم الأحداث عبر عمليات رد الاتصال عبر الويب وSSE. يحافظ المستهلك على المنطق. تأتي Webhooks في المقام الأول لأنها تعمل مع الوكلاء البعيدين على البنية الأساسية لـ VPS، والبرامج الخفية المحلية على الكمبيوتر المحمول الخاص بك، والمزامنة عبر المثيلات بين النظراء. تعد إشعارات الدفع SSE وMCP إضافية.

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

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

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

القيد هو الميزة. طبقة الحالة التي ترسل الإشارات ولكنها لا تقرر هي طبقة حالة لا يزال بإمكانك التفكير فيها. أضف منطق الطبقة التشغيلية إلى مسار الإشارة، وستفقد الخاصية التي جعلت الركيزة مفيدة في المقام الأول: يتم تحديد سلوك الركيزة بالكامل من خلال الكتابة، وليس من خلال السياسة.