محادثات طلبات السحب
طلب السحب هو أصلًا المكان الذي يجري فيه الحديث عن الشفرة. محادثات طلبات
السحب تجعله سطحًا على مساحة عمل في Control Center، بالطريقة نفسها التي يجعل
بها جسر الدردشة من Slack سطحًا:
الإشارة بـ @ إلى بوت تطبيق GitHub التابع للخادم على طلب السحب، أو الرد داخل
سلاسل مراجعته، أو إضافة التسمية ai-review، فيجري العمل في مساحة مراجعة
الطلب — بالإسناد والضوابط نفسها التي تحكم ما يُكتب في التطبيق. التعليق يمر
ببوابة العضوية أيضًا، أما التسمية فلا، لأنها بلا مؤلف. تعود إجابات البوت إلى
GitHub، في المسار الذي طُرح فيه السؤال.
ثلاثة قرارات تشكّل الميزة، وكل منها القرار نفسه الذي اتخذه جسر الدردشة للدردشة، وقد أُعيدت صياغته لمضيف الشفرة: أي اتجاه يسلك الاتصال، ما الذي يجيز تعليقًا يصل من الخارج، وإلى من يُنسَب كل طرف.
الاستطلاع هو النقل
قسم بعنوان “الاستطلاع هو النقل”قناة الدفع الوحيدة التي يتيحها GitHub لتطبيق هي خطاف ويب، وخطاف الويب يحتاج عنوان URL واردًا — وهو الشيء الوحيد الذي لا يطلبه هذا السطح عمدًا. فالاكتشاف مسح: كل دقيقة تقريبًا، يسأل بحث واحد بأسماء مستعارة لكل تثبيت للتطبيق GitHub عن طلبات السحب التي تذكر البوت (أو معرّفه القصير) وعن طلبات السحب المفتوحة التي تحمل تسمية المراجعة، وتُقرأ سلاسل تعليقات طلبات السحب التي لها مساحة مراجعة أصلًا، ويُحسَب الفرق بمعرّف التعليق مقابل ما شوهد في المسح السابق.
آثار هذا التصميم تستحق الذكر:
- زمن الاستجابة فاصل مسح، لا حدث. يصل إقرار 👀 خلال دقيقة تقريبًا. لا يعتمد عليه شيء عاجل.
- مرة واحدة بالضبط، لكل تعليق. معرّفات التعليقات فريدة في GitHub كله، ويُسجَّل كل منها لحظة تصنيفه مؤهلًا، قبل أن يتصرف فيه شيء. يستطيع الانهيار أن يفقد معالجة تعليق، ولا يطلقه مرتين.
- وقت التوقف يُلحَق، ولا يُعاد تشغيله. تُحفَظ مجموعة ما شُوهد، فإعادة التشغيل تسلّم ما وصل أثناء التوقف. الاستثناء الوحيد أول مسح على الإطلاق: بلا ذاكرة يُقارَن بها، يُسجَّل كل معلّق في صمت — مشغّل وضع التسمية على عشرين طلب سحب قبل وجود هذا الخادم يجب ألا يعود فيجد عشرين مراجعة تعمل.
- التسمية مجموعة، لا حدث. يبلّغ البحث عن وجود التسمية، فيُطلَق طلب السحب الموسوم مرة واحدة، وإلى الأبد. إعادة إضافة التسمية بعد إزالتها غير مرئية للمسح، والإشارة هي مسار إعادة التشغيل.
يجري البحث مرة واحدة لكل حساب تثبيت، على عميل ذلك المالك نفسه، لأن رمز التثبيت لا يرى إلا مستودعات تثبيته — وبيانات اعتماد واحدة على نطاق الخادم تُفوّت في صمت كل طلب سحب تحت تثبيتات التطبيق الأخرى.
العضوية هي التي تجيز، لا التعليق
قسم بعنوان “العضوية هي التي تجيز، لا التعليق”يصل تعليق طلب السحب ولا يحمل تقريبًا إلا اسم دخول المؤلف — هوية خارجية غير مصادَق عليها إلى أن يُثبَت صاحبها. يحلّه البوت مقابل فهرس عكسي لأعضاء مساحة العمل وحسابات GitHub المربوطة بهم، ويُعاد بناء الفهرس بعد مهلة بقاء، لأن الناس يسجّلون الدخول ويُدعَون والخادم يعمل.
يبدو الفشل المغلق سلّمًا، وكل درجة ترد في السلسلة التي رفضت فيها:
- اسم دخول غير معروف — غير مربوط، أو مربوط بمن ليس عضوًا في مساحة العمل هذه — يُطلَب منه تسجيل الدخول والتأكد من انتمائه
- عضو للقراءة فقط (
viewerأوguest) يُبلَّغ أن دوره لا يستطيع بدء العمل
حالتا اسم الدخول غير المعروف تشتركان في رد واحد: الفهرس العكسي لا يعيد إلا عضوًا في مساحة العمل هذه، فالحساب غير المربوط والحساب المربوط لغير عضو إخفاق واحد. لا يمضي أي منهما. لا يُنسَب تعليق إلى من لم يرسله، ولا تدخل كلمات غريب إلى مساحة عمل لا يستطيع رؤيتها.
تسمية ai-review بلا مؤلف يُحَل، فلا تصعد هذا السلّم. إضافتها تبدأ المراجعة
في مساحة العمل التي تربط المستودع أصلًا.
هويتان، عن قصد
قسم بعنوان “هويتان، عن قصد”يحمل كل طرف في المحادثة هوية مختلفة، والفرق هو الميزة:
- على GitHub، البوت هو الخادم. كل تعليق وتفاعل ورد ينشره الجسر يُرسَل برمز تثبيت التطبيق. لم ينقر أحد شيئًا في عميل، فلا يُستعار حساب شخص — القاعدة نفسها التي تُبقي خطافات الويب والاستطلاع خارج بيانات اعتماد البشر.
- في المساحة، السؤال لك. تُنسَب الرسالة إلى العضو الذي حُلّ إليه المؤلف، ويُنفَّذ تشغيل الوكيل نيابة عنه: تُدرجه الالتزامات مؤلفًا مشاركًا، ويُطبَّق مؤشر الاستقلالية في المساحة وضوابط الإجراءات كما يُطبَّقان على رسالة تُكتب في التطبيق. ما يُكتَب على مضيف الشفرة من التشغيل يخرج بهوية التطبيق — القاعدة نفسها في النقطة أعلاه — لا برمز العضو الشخصي.
يبقى نشر نتائج المراجعة إلى GitHub قرار إنسان، يُتَّخذ في Control Center. الإشارة تستطيع بدء مراجعة، ولا ينشرها إلا إنسان.
حارس الحلقة، والاسم القصير
قسم بعنوان “حارس الحلقة، والاسم القصير”يُسقَط كل ما كتبه حساب بوت قبل أن تعمل أي بوابة — بوتنا تحديدًا، وكل لاحقة
[bot]، حتى لا يوقظ بوت مراجعة لتطبيق آخر بوتنا أيضًا. من غير هذا تصل
إجابات البوت نفسه كتعليقات جديدة وتعيد تشغيله بلا نهاية.
لاحقة [bot] هي أيضًا سبب الصيغة القصيرة. يثبّت GitHub اسم دخول حساب
التطبيق عند <slug>[bot]، ولا يعرض له إكمالًا تلقائيًا، ولا يحل @slug إلى
التطبيق أبدًا — فقبول المعرّف المجرّد قرار المطابق لدينا، واكتشافه يحتاج
مسار بحث في نص التعليق الخام لا فهرس الإشارات لدى GitHub. تُذكَر الكلفة
ولا تُلطَّف: مستخدم بشري معرّفه مطابق لمعرّف التطبيق يخاطب البوت كلما أشار
إلى نفسه بالصيغة القصيرة. أسماء التطبيقات المميّزة تُبقي الاصطدام افتراضيًا.
ما لا يُقدَّم عمدًا
قسم بعنوان “ما لا يُقدَّم عمدًا”- لا نشر تلقائي. تستقر النتائج في مساحة المراجعة، والنشر إلى GitHub إجراء بشري منفصل
- لا هوية تقريبية. يُحَل المؤلف إلى عضو واحد بالضبط أو يُرفَض — لا إسناد بأقرب تخمين
- لا خطاف ويب لتطبيق GitHub. هذا السطح لا يسجّل واحدًا قط، فلا عنوان URL وارد يُكشَف لتعليقات طلبات السحب. خطافات الويب الأخرى في المنتج (خطوط الأنابيب، ومزامنة التذاكر) إعداد منفصل واختياري.
انظر أيضًا
قسم بعنوان “انظر أيضًا”- التحدث إلى Control Center من طلب سحب على GitHub: الدليل الإرشادي لكل هذا
- جسور الدردشة: القرارات الثلاثة نفسها، وقد اتُّخذت للدردشة
- إنشاء تطبيق GitHub: من أين تأتي هوية البوت
- تعدد اللاعبين — الهوية والعضوية والحضور: الفاعلون والأدوار التي يُحَل عبرها اسم الدخول
- الضوابط: ما يُسمح للوكيل المجيب أن يفعله
- استخدام المراجعة المدعومة بالذكاء الاصطناعي: خط الأنابيب الذي تبدأه إشارة أو تسمية