تعدد اللاعبين — الهوية والعضوية والحضور
يعمل Control Center مع مشغّل واحد، لكن النموذج تحته متعدد الفاعلين منذ البداية. يراسل البشر والوكلاء في المساحات نفسها، ويحرّرون التذاكر نفسها، ويظهرون في الكشف نفسه. جعل ذلك آمنًا ومفهومًا يقوم على ثلاثة قرارات: من يُعدّ فاعلًا، وما الذي يضبط الوصول، وأي حالة تُشارَك بشكل دائم وأيها يُبَث حيًا فحسب.
الأطراف: المستخدمون والوكلاء فاعلون متكافئون
قسم بعنوان “الأطراف: المستخدمون والوكلاء فاعلون متكافئون”كل ما يسجّل «من فعل هذا»، من الرسائل والتذاكر والمراجعات والخطط وسجلات
التشغيل وإدخالات التدقيق، يُحسم عبر Principal، وهو نوع مختوم من
UserPrincipal وAgentPrincipal بصيغة موجزة على السلك
(user:<id> / agent:<id>). لا يُدمج الإسناد N من البشر (أو N من الوكلاء)
في حساب واحد بديل، فتبقى المراجعة التي يتركها وكيل والمراجعة التي يتركها شخص
قابلتين للتمييز أينما ظهرتا.
ولأن الطرف هو وحدة الهوية، فهو أيضًا وحدة الاحتواء:
- حدود المعدّل لكل طرف، لا لكل جلسة. يحاسب حد الإغراق على استدعاءات الأدوات البعيدة حسب المستخدم لا حسب الاتصال: أجهزة العضو كلها تستهلك من نافذة منزلقة واحدة (120 استدعاءً في الدقيقة، منها 30 على الأكثر للتعديل)، ففتح ثلاثة أجهزة لا يضرب حصة أحد في ثلاثة، ولا يستطيع عضو مزعج أن يستنفد حصة البقية.
- التراجع لكل طرف. يقتصر سجل إجراءات كل عميل على التعديلات التي أجراها طرفه. تستطيع التراجع بـ ⌘Z عن تحرير تذكرتك، ولا تستطيع التراجع عن تحرير زميلك: حين تراه يكون المسار الدائم قد حسمه أصلًا (انظر أدناه).
العضوية حد الوصول، لا مفتاح الاقتران
قسم بعنوان “العضوية حد الوصول، لا مفتاح الاقتران”تجيب بيانات اعتماد منفصلة عن سؤالين منفصلين. مفتاح الاقتران (انظر التحكم عن بُعد والجوال) يصادق جهازًا لدى الخادم. العضوية تأذن لمستخدم ذلك الجهاز أن يتصرف داخل مساحة عمل. الجهاز المقترن الذي لا يحمل مستخدمه عضوية في مساحة عمل لا يستطيع قراءتها ولا تعديلها.
العضوية صف واحد لكل (مساحة عمل، مستخدم)، يُخزَّن في ملف قاعدة بيانات مساحة العمل نفسها. فسؤال «من في مساحة العمل هذه؟» قراءة عادية ضمن النطاق، أما السؤال العكسي «في أي مساحات عمل أنا؟» فيمتد بالضرورة عبر الملفات، وهو من القليل المسموح به من الأسئلة التي تعبر مساحات العمل. هذا ما يشغّله منتقي مساحة العمل قبل أن تُختار أي مساحة.
يحمل كل صف دورًا من سلّم بخمسة مستويات مرتبة حسب الرتبة:
| الدور | يجوز له |
|---|---|
owner |
تحكم كامل، بما فيه حذف مساحة العمل؛ مالك واحد بالضبط لكل مساحة عمل |
admin |
إدارة الأعضاء والدعوات والإعدادات والعمليات التدميرية |
member |
قراءة وكتابة يومية: الرسائل والتذاكر وتشغيلات الوكلاء |
viewer |
قراءة فقط عبر مساحة العمل؛ تخفي أنماط glob لاستبعاد الأسرار المسارات المطابقة على الأسطح التي تعرض الشفرة |
guest |
حد القراءة فقط نفسه الذي للمشاهد، في أدنى رتبة من السلّم |
كل قرار وصول يُختزل في «هل دور المستدعي على الأقل X». يُشتق الحد الأدنى من
نوع العملية ما لم تصرّح بحد صراحة: القراءة تحتاج guest، والتعديل يحتاج
member، والعملية التدميرية تحتاج admin. قوائم التحكم في الوصول لكل كائن،
فوق المنح لكل مستودع أدناه، خارج النطاق عن قصد.
الدعوات هي طريق منح العضوية، من الإعدادات ← مساحة العمل ← الأعضاء. يصدر
المسؤول رمزًا يُستخدم مرة واحدة (رابطًا أو رمز QR) تنتهي صلاحيته بعد 7 أيام
افتراضيًا. لا يخزّن الخادم إلا تجزئة SHA-256 للرمز، ويُعرض الرمز نفسه مرة
واحدة بالضبط. استرداده يوفّر المستخدم فورًا، ويسجّل العضوية بدور الدعوة (ولا
يكون owner أبدًا، فالملكية تُنقَل صراحة ولا تُمنَح بدعوة)، ثم يسلّم إلى
اقتران الجهاز. بيانات اعتماد الجهاز التي تُصدَر بعد الاقتران محدودة بـ 30
يومًا، فالاقتران ليس مفتاحًا دائمًا.
المنح لكل مستودع تقع تحت العضوية. لأن الخادم يحتفظ بنسخ العمل الكاملة،
لا يجوز لعضوية مساحة العمل وحدها أن تمنح صلاحيات أوسع من مضيف الشفرة: كل
سطح يعرض الشفرة، من الملفات والفروق ومراجعة طلب السحب والبحث في الشفرة،
يفحص منح العضو على ذلك المستودع. المنح لكل (مساحة عمل، مستخدم، مستودع)،
ومرتبة none → read → review → write، ويعني write قيادة تشغيلات
وكيل تكتب في المستودع. غياب الصف يعني none. المالك والمسؤول يحملان
write ضمنيًا على كل مستودع مربوط، ولا صفوف لهما أصلًا.
مساران لحالة التعاون
قسم بعنوان “مساران لحالة التعاون”يقسم Control Center الحالة المشتركة إلى مسارين بقواعد ديمومة متعاكسة، لأن نوعي الحالة يفشلان على نحو متعاكس.
مسار الحضور العابر
قسم بعنوان “مسار الحضور العابر”الحضور، من المتصل وأين هو وماذا يكتب وماذا يفعل الوكيل الآن، يفقد قيمته في
اللحظة التي يقدُم فيها. لو حُفظ، لوجب على كل إعادة اتصال أن توفّق «تقول قاعدة
البيانات إن سام يحرّر هذه التذكرة» مع الواقع. لذلك لا يُكتَب الحضور إلى
قاعدة البيانات أبدًا. يعيش في محور حضور مقيم في ذاكرة الخادم: ينشر
العملاء بـ presence.update، ويشترك الأقران بـ presence.watch، وتنقضي
الإدخالات تلقائيًا بعد ثلاث نبضات فائتة (تجري النبضات كل 10 ثوانٍ، ويكنس
المحور كل 5 ثوانٍ). ليس هناك ما يُوفَّق، بل ما يُترَك حتى يسقط.
خاصيتان تبقيان المسار أهلًا للثقة:
- الهوية من الجلسة، لا من وسائط العميل أبدًا. يربط الخادم جهاز الاتصال
المصادَق عليه بمعرّف مستخدم، ولا يستطيع العميل تحديث إلا حضوره، فلا ينتحل
أحد حالة مشارك آخر ولا موقعه. تحديث
offlineصريح (قطع الاتصال أو مفتاح وضع عدم الإزعاج) يزيل الإدخال فورًا. - الكشف يمر بمحور الخادم. لا يتبادل الأقران الحضور مباشرة، فيرى كل مشارك الكشف نفسه مهما كان شكل الشبكة. ليس للوكلاء عميل، فيركّب الخادم إدخالاتهم من حالة التشغيل الحي: يفكّر، ويعمل، ومحجوب بانتظار موافقة، وانتهى. تشغيل واحد ممثل يحسم حالة الوكيل وموقعه، حتى لا تجعل التشغيلات المتزامنة الكشف يتذبذب.
البث متدرّج حسب المستهلك: الحاسوب والويب على الطبقة الكاملة (إصدار واحد للكشف كل 100 مللي ثانية على الأكثر)، والهاتف على طبقة الملخص (كل 500 مللي ثانية)، حتى لا تغرق تحديثات إيقاع المؤشر تطبيق الويب التقدّمي.
موقع المشارك، أي أين هو الآن حتى العنصر، نوع مختوم: Space وFile
(مستودع + مسار + سطر اختياري) وPr وTicket وPlanNode. ليس لكل موقع وجهة
يُقفز إليها: لا مسار لعارض الملفات، فيُعرض موقع File تسمية لا وجهة. ويحمل
المسار أيضًا مطالبات ليّنة («سام يحرّر هذه التذكرة»، «وكيل يحتفظ بشجرة
العمل هذه»): إظهار للتعارض، لا أقفال. أنواع الموقع غير المعروفة تُفسَّر
null، فالعميل الأقدم لا يعرض ما لا يفهمه.
المسار المشترك الدائم
قسم بعنوان “المسار المشترك الدائم”السجلات التي يجب أن تبقى، كالتذاكر ومستند الملاحظات المشترك في المساحة والرسائل، تسلك الطريق المعاكس: مرجعية، ومرتبة، ومحفوظة. تُحسم التحريرات المتزامنة بـفوز آخر كتابة حسب ترتيب الاستلام على الخادم، لا بساعات العملاء. الحسم دقيق عن قصد: تحرير التذكرة لكل عمود، فيستقر تحرير شخصين لحقلين مختلفين من التذكرة نفسها ولا يطمس أحدهما الآخر (أما انتقالات سير العمل فتُبقي القفل المتفائل). ومستند الملاحظات في المساحة عمود واحد، فالمستند كله فوز آخر كتابة، والمطالبات الليّنة على مسار الحضور تجعل التحرير المتزامن مرئيًا بدل أن يُقفَل. وهذا ليس CRDT عن قصد. عبء الإثبات يقع على CRDT، وفوز آخر كتابة حسب ترتيب الاستلام مع المطالبات المرئية يغطي أنماط التعاون الفعلية.
«آخر كاتب» يعني ترتيب الاستلام على الخادم، لا ساعة العميل. حاسوب محمول بساعة منحرفة لا يفوز بتحرير سبق أن خسره. خلف المسار الدائم تقف تغذية المزامنة: تُلحِق محفّزات SQLite كل تعديل بسجل تغيير لكل مساحة عمل داخل معاملة الكتابة، وتخصّص رقم تسلسل رتيبًا لكل مساحة عمل في المعاملة نفسها التي يجري فيها التعديل. تتابع خدمة على الخادم ذلك السجل إلى إطارات فروق ذات إصدار، بترتيب التسلسل. ينتقل العملاء من اللقطات الكاملة إلى الفروق، وفجوة في التسلسل تعيد ذلك المخزن إلى وضع اللقطة بدل تطبيق الإطارات على نحو خاطئ.
المتابعة والتوجيه والتولّي وإعادة التسليم
قسم بعنوان “المتابعة والتوجيه والتولّي وإعادة التسليم”مسار الحضور ليس كشفًا فحسب، فهو ما يحرّك أفعال التعاون:
- وضع المتابعة. انقر مشاركًا فيركب عميلك موقعه، وينتقل كلما انتقل. المتابعة تبقى «حتى تتصرف أنت»: لحظة تنتقل من تلقاء نفسك تنفصل. لافتة يمكن إغلاقها تعلن حين يعرض مشارك آخر مساحة أنت فيها.
- التوجيه. الرسالة إلى وكيل قيد التشغيل تُوضَع في قائمة انتظار التوجيه، ويعيد الوكيل قراءتها قبل استئناف جولته التالية، فتستطيع دفع التشغيل وهو جارٍ من غير أن تُنهيه.
- التولّي. تولّي المحادثة يوقف كل تشغيل نشط عند حد جولته النظيف التالي، ويُوقِف تشغيل Claude Code لأنه بلا حد آمن، وذلك بعد لقطة git لكل جولة حتى يبقى التولّي قابلًا للعكس. علامة دائمة تمنع الإرسالات الجديدة إلى المساحة وتبقى بعد إعادة تشغيل الخادم، فلا يستأنف الخادم تلقائيًا داخل تحرير إنسان لم يكتمل. محرّر حي واحد لكل شجرة عمل هو مطالبة ليّنة: التولّي الثاني ظاهر ويُرفَض، ولا يُدمَج في صمت.
- إعادة التسليم. إعادة التحكم تنشر في المساحة ملخص فروق منظّمًا لشجرة العمل، وتضعه في قائمة انتظار التوجيه للتشغيلات المتوقفة، ثم تستأنفها وتمسح العلامة.
مؤشر الاستقلالية
قسم بعنوان “مؤشر الاستقلالية”التوجيه والتولّي إجراءان بعد وقوع الأمر. مؤشر الاستقلالية هو الإعداد الدائم: لكل مساحة ولكل وكيل، يُضبط من ترويسة المساحة، ويقرّر ما يحدث حين يبلغ الوكيل إجراءً محكومًا.
| المستوى | القيمة على السلك | الأثر في استدعاء أداة محكوم |
|---|---|---|
| اقتراح فقط | proposeOnly |
يُرفَض فورًا، مع سبب يُطلَب من الوكيل إبلاغه: يستطيع وصف الإجراء ولا يستطيع اتخاذه |
| التصرف بموافقة | actWithApproval |
بوابة الموافقة التي تفشل مغلقة: يظهر تأكيد واحد لمشغّل متصل، وغياب المعتمِد يعني الرفض |
| التصرف بحرية | actFreely |
موافَق عليه مسبقًا، إلا حيث تنطبق قاعدة deny صارمة من الضوابط، وقاعدة الرفض تفوز دائمًا |
| (غير معيّن) | null |
مثل التصرف بموافقة: هذا افتراضي الخادم |
أمران يقعان خارج المؤشر، من الجهتين. فعل المخرجات الخاص بالوضع مثبّت ولا
يُرفَض مهما قال المؤشر. كان وضع التنسيق، بنيويًا، عاجزًا عن إصدار تسليمه
الوحيد، لأن إعدادًا مسبقًا رفض فئة الإجراء التي يصرّح بها ذلك الفعل. وقاعدة
deny الصارمة من ضوابط الإجراء لا يلغيها actFreely.
صفر تراجع للمستخدم المنفرد
قسم بعنوان “صفر تراجع للمستخدم المنفرد”كل هذا إضافة. سير عمل المشغّل المنفرد لا يتغيّر: مع إنسان واحد ومن غير وكلاء لا يجد محور الحضور ما يبثّه، فيُصدر المسار لقطته الأولى ثم يخمل بلا حركة. آلية فوز آخر كتابة والمزامنة هي مسار الكاتب الواحد الذي كانت عليه دائمًا، ويبقى مفتاح الاقتران بيانات اعتماد الجهاز كما كان دائمًا. العضوية حد الوصول أصلًا: مع إنسان واحد يوجد صف مالك واحد، ولا تظهر واجهة الكشف.
مفاهيم ذات صلة
قسم بعنوان “مفاهيم ذات صلة”- مساحات العمل والعزل: الحد الذي تفرضه العضوية
- التحكم عن بُعد والجوال: جانب مفتاح الاقتران وبيانات اعتماد الجهاز في الهوية
- نموذج الوكيل: نصف الوكيل في النوع المختوم للطرف
- دورة حياة إرسال الوكيل: التشغيلات التي يعلّقها التوجيه والتولّي ثم يستأنفانها
- الضوابط: سياسة فئات الإجراء التي يتركّب معها مؤشر الاستقلالية
- أحداث النطاق: الناقل الذي تسير عليه التحديثات الحيّة