22 أغسطس 2026
لماذا يقرأ Barkan الشاشة، لا الوثائق
التوثيق يصف المنتج بوجه عام. أما شجرة DOM فتصفه لهذا المستخدم، في هذه اللحظة. نظرة من الداخل على الطريقة التي يحوّل بها Barkan صفحة حية إلى شيء يستطيع النموذج أن يتصرّف بناءً عليه.

حين بدأنا بناء Barkan، كانت البنية البديهية هي تلك التي أطلقها الجميع: تحويل وثائق المنتج إلى تضمينات متجهية، واسترجاع المقاطع ذات الصلة بالسؤال، وترك النموذج يكتب الإجابة. وبنينا ذلك أولًا. نجح بما يكفي لنستعرضه في العروض التوضيحية، وأخفق بما يكفي لنعجز عن إطلاقه، وكان نمط الإخفاق دائمًا واحدًا: الإجابة صحيحة بشأن المنتج وخاطئة بشأن المستخدم. تتناول هذه التدوينة القرار الذي تلا ذلك: أن نبني كل إجابة على الواجهة الحية كما تُعرض، وما يتطلبه ذلك فعلًا.
الإخفاق الذي غيّر البنية
السؤال الذي أسقط النسخة المدرَّبة على الوثائق كان عاديًا. سأل أحد المختبِرين: «كيف أضيف مقعدًا ثانيًا؟»، فحصل على إجابة مرتبة من ست خطوات منقولة مباشرة من مركز المساعدة. تقول الخطوة الرابعة: انقر إضافة عضو. وعلى شاشة المختبِر، كان ذلك الزر رماديًا معطّلًا، مع تلميح يوضح أن باقة Launch محدودة بمقعد واحد.
لم تكن الإجابة هلوسة. كانت صحيحة بوجه عام، وعديمة الفائدة في هذه الحالة بالذات. لم يكن لدى النموذج أي فكرة أن الزر معطّل، لأنه ما من شيء في الوثائق كان يمكن أن يخبره كيف تبدو شاشة هذا الحساب الآن.
هذا هو القيد الجوهري لأي مساعد تأتي معرفته من نصوص تتحدث عن المنتج: إنه يعرف المنتج كما صُمّم، لا المنتج كما يُعرض لهذا المستخدم. والفجوة بين الاثنين هي بالضبط حيث يتعثّر المستخدمون.
إن كانت الإجابة تعتمد على شيء يستطيع المستخدم رؤيته، فيجب أن يستطيع النموذج رؤيته أيضًا. يحقّ للتوثيق أن يشرح لماذا؛ أما أين فلا يحقّ أن تقوله إلا الواجهة الحية.
ماذا تعني «قراءة الشاشة»
لا تعني لقطات الشاشة، ولا تعني إلقاء HTML كاملًا في موجّه النموذج. كلاهما مغرٍ، وكلاهما يفشل: لقطات الشاشة تُفقد البنية التي يحتاج إليها النموذج ليتصرّف، وHTML الخام في أي تطبيق حديث مئات الكيلوبايتات من ضجيج أطر العمل، والإشارة المفيدة مدفونة فيه.
بدلًا من ذلك، حين يسأل المستخدم عن شيء، يلتقط شريط Barkan لقطة مُثراة من المستند المعروض، ويرسلها مع السؤال إلى واجهة API. وتتضمن اللقطة تقريبًا ما يلي:
الطبقة · ما تحمله · لماذا تهم
العناصر التفاعلية · الأزرار والروابط وحقول الإدخال، مع مرجع ثابت وتسمية إتاحة · ليستطيع النموذج أن يشير إلى عنصر تحكم بعينه وأن يتصرّف فيه
العلاقات · أي تسمية تخصّ أي حقل إدخال، وأي زر ينتمي إلى أي نموذج · تحوّل «حقل البريد الإلكتروني» إلى عنصر محدد
حقائق الواجهة · الحالات المعطّلة، والتبويبات المحددة، والشارات، والأعداد، وأخطاء التحقق · معلومة «رمادي معطّل في باقة Launch» التي لم تكن في الوثائق قط
كتل المحتوى · العناوين والنصوص الظاهرة، بعد إزالة التكرار والاقتطاع · سياق يكفي لفهم الصفحة، لا الصفحة كلها
ملخصات النماذج · ما امتلأ، وما بقي فارغًا، وما هو غير صالح · تتيح للنموذج استئناف سير عمل لم يكتمل
الأسطح النشطة وحالة التمرير · النوافذ المنبثقة المفتوحة، والأدراج الجانبية، ومنطقة العرض الحالية · تميّز بين «ليس على الشاشة» و«غير موجود»
بيانات الصفحة الوصفية · المسار، والعنوان، وسمات data المسموح بها · وسيلة قليلة الكلفة وموثوقة لتحديد الموقع
صُمّم كل ذلك ليكون صغيرًا وثابتًا وصادقًا. صغيرًا ليتّسع في ميزانية السياق مع مساحة للتفكير. وثابتًا ليحصل العنصر نفسه على المرجع نفسه من دور إلى آخر في المحادثة، وهذا ما يجعل الإشارة والإجراءات متعددة الخطوات ممكنة. وصادقًا حتى لا يرى النموذج أبدًا عنصر تحكم لا يراه المستخدم.
ثلاث مشكلات هندسية تنتج عن ذلك
الارتكاز على DOM يحلّ مشكلة «خاطئة بشأن المستخدم»، لكنه يخلق فورًا ثلاث مشكلات أخرى. كلها تستحق العناء، لكنها حقيقية.
1. الواجهة تتحرك
فهرس الوثائق يتغيّر حين يعدّل أحدهم مستندًا. أما DOM فيتغيّر مع أي شيء يحدث: قائمة منسدلة تُفتح، أو إشعار منبثق يظهر، أو قائمة يكتمل تحميلها. واللقطة التي تُؤخذ قبل أوانها بثانية تصف صفحة لم تعد موجودة.
نتعامل مع ذلك بطريقتين. تُلتقط اللقطة بعد أن تستقر الصفحة: ننتظر حتى يهدأ نشاط الشبكة الجاري وإعادة التخطيط، مع حدّ أقصى حتى لا تعطّل صفحةٌ صاخبة الإجابةَ إلى ما لا نهاية. وفي وضع التنفيذ، يعقب كلَّ إجراء التقاطٌ صامت جديد قبل تقرير الخطوة التالية، فيتصرّف النموذج دائمًا على الصفحة كما هي، لا كما كانت.

2. مراجع ثابتة على شجرة غير ثابتة
أن تقول للنموذج «انقر الزر الثالث» أمر هشّ. وأن تقول له «انقر العنصر ذا المعرّف b17» لا ينجح إلا إذا كان b17 يعني الشيء نفسه في الدور التالي. أطر العمل الحديثة تعيد الرسم بإفراط، لذا لا يمكننا الاعتماد على هوية عناصر DOM.
مراجعنا مشتقة مما يستخدمه الإنسان للتعرّف على العنصر: دوره، وتسميته، وموقعه بين العناصر الشقيقة، والمَعلم (landmark) الذي يحتويه. ونحتفظ بخريطة قصيرة العمر تربط كل مرجع بالعقدة الحية. وحين تتقادم الخريطة، يفشل الإجراء فشلًا صريحًا، ويعيد النموذج قراءة الصفحة بدل أن ينقر الشيء الخطأ. فالإجراء الفاشل الذي تراه أفضل بكثير من إجراء ناجح على العنصر الخطأ.
3. ما الذي لا نرسله
اللقطة المُثراة لمنتج حقيقي تحتوي على بيانات حقيقية: أسماء عملاء في جدول، وإجمالي فاتورة، وبريد إلكتروني في حقل نموذج. وإرسال كل ذلك إلى نموذج افتراضيًا أمر غير مقبول، وعبارة «نحتاج إليه من أجل السياق» ليست سببًا كافيًا.
تُقلَّص اللقطة إلى الحد الأدنى في المتصفح قبل أن تغادر الصفحة. يُقتطع النص الظاهر ويُزال تكراره، وتُلخَّص قيم حقول الإدخال بعبارة ممتلئ / فارغ / غير صالح بدل نسخها، ولا تُمرَّر إلا سمات data الواردة في قائمة السماح. والهدف أن يعرف النموذج أنّ هناك جدول عملاء من 48 صفًا فوقه مربع بحث، لا أن يعرف من هم العملاء.
التقليص يكلّفنا إجابة أحيانًا. فإن سأل المستخدم «لماذا إجمالي هذه الفاتورة خاطئ؟»، لا يستطيع النموذج رؤية الرقم. ونرى أن هذا هو الخيار الافتراضي الصحيح: يمكنه أن يوجّه المستخدم إلى الحقل ويشرح كيف يُحسب الإجمالي، دون أن يغادر الرقم الصفحة أبدًا.
أن تُري بدل أن تشرح
حين يرتكز النموذج على الواجهة نفسها التي ينظر إليها المستخدم، يصبح ممكنًا ما لا يستطيعه أي مساعد مدرَّب على الوثائق: أن يكفّ عن الوصف ويبدأ بالإشارة.
حين يذكر الرد عنصرًا ما، يحرّك الشريط مؤشرًا إليه على الصفحة الفعلية وينتظر. وعلى امتداد سير عمل متعدد الخطوات، يرافق ذلك المؤشر المستخدم من عنصر تحكم إلى آخر، حتى عبر الانتقال بين الصفحات، لأن اللقطة يُعاد بناؤها على المسار الجديد. فتصبح التعليمات والواجهة شيئًا واحدًا، وتختفي ببساطة خطوة الترجمة التي تجعل التوثيق مُرهقًا.
كل مساعد يستطيع أن يخبرك أين الزر. الفرق هو: هل يستطيع أن يرى أنك تنظر أصلًا إلى الصفحة الخطأ؟

حيث تظل الوثائق مهمة
لا يعني أيٌّ من هذا أن التوثيق عديم الفائدة للنموذج، بل إن له مهمة مختلفة. فالوثائق تحمل الغاية: ما الغرض من الميزة، ومتى تُستخدم، وماذا يعني إعداد ما. أما الشاشة فتحمل الحالة. والإجابة الجيدة تحتاج غالبًا إلى الاثنين: قاعدة المعرفة تشرح أن webhooks تعيد المحاولة ثلاث مرات، والشاشة تُظهر أن آخر إرسال عبر هذا الـ webhook قد فشل.
لذا يسترجع Barkan من قاعدة المعرفة فعلًا، لكنه يسترجع بعد أن يقرأ الشاشة، والكلمة الفصل للشاشة كلما اختلف الاثنان. فإن قالت الوثائق إن هناك زر إضافة عضو، وأظهرت الشاشة أنه معطّل، فالإجابة تدور حول الزر المعطّل.
– ارتكز على الواجهة المعروضة، لا على الوثائق. «صحيح بوجه عام» هو أغلى أنواع الخطأ.
– أرسل البنية، لا البكسلات ولا HTML الخام: العناصر التفاعلية، والعلاقات، وحقائق الواجهة، والمحتوى الملخَّص.
– التقط بعد أن تستقر الصفحة، وأعد الالتقاط بعد كل إجراء؛ فشجرة DOM هدف متحرك.
– قلّص البيانات في المتصفح. ينبغي أن يعرف النموذج شكل البيانات، لا البيانات نفسها.
– أشِر، ولا تصف. متى استطعت أن ترى العنصر، استطعت أن تُريه.
التثبيت ما زال سطرًا واحدًا
ومن المخاوف المشروعة أن تعني عبارة «يقرأ الواجهة المعروضة» تكاملًا عميقًا. لكنها لا تعني ذلك. فالشريط ليس سوى وسم script واحد في القالب الذي تعرضه أصلًا؛ يُنشئ جذره الخاص داخل shadow DOM، ويراقب الصفحة من داخل المتصفح، ولا يحتاج إلى أي تعليقات توضيحية على المسارات أو أغلفة للمكوّنات.
<script async src="https://trybarkan.com/widget.js" data-barkan-site="site_your_key"></script>كل ما وصفناه أعلاه يحدث داخل ذلك الـ script. والمنتج الذي يُثبَّت عليه لا يحتاج إلى أن يعرف بوجود Barkan أصلًا.
ثبّت وسم script، وافتح تطبيقك، واسأله عن شيء لا تجيب عنه وثائقك. رصيد مجاني بقيمة $25 للبدء، دون الحاجة إلى بطاقة.
«معظم المستخدمين لا يريدون إجابة أخرى. يريدون من يدلّهم على الطريق، أو من ينجز المهمة عنهم. هذا هو المنتج كله.»
Gabriel Lancelot
شريك مؤسس في Barkan
