لماذا لا يجد البحث «أحمد» حين تكتب «احمد»، وكيف تُصلحه؟
لأن الحرفين مختلفان عند الحاسوب: «أ» هي المحرف U+0623، و«ا» هي U+0627. وما لم يطوِهما ترتيب المقارنة (collation) أو محلِّل البحث، يرى المحرّك «أحمد» و«احمد» كلمتين مختلفتين، كما يرى «مُحَمَّد» غير «محمد»، و«٢٠٢٦» غير «2026». واسم ترتيب المقارنة لا يكفي لتعرف ذلك؛ قارن الكلمتين على نسختك أنت.
- لا تعدّل العمود الأصلي. طبّع في نسخة مشتقّة بجواره، وابحث فيها.
- طبّع بالدالّة نفسها عند الحفظ وعند البحث: NFKC، ثم حذف التطويل والمحارف الخفية، ثم التشكيل، ثم طيّ «أ إ آ ٱ» إلى «ا»، ثم توحيد الأرقام إلى 0-9.
- لا تستعمل NFD ثم تحذف العلامات: يفصل NFD «أ» إلى «ا» وعلامة همزة U+0654، وهي خارج نطاق التشكيل U+064B–U+0652؛ فإن حذفتَ هذا النطاق وحده بقيت العلامة ولم يجد «احمد» «أحمد»، وإن وسّعتَ الحذف ليشملها طويتَ كل همزة على حامل دفعةً واحدة، بلا قرار مُعلَن لكل حرف.
- طيّ «ى» و«ة» قرار لا عادة: «ة ← ه» يجعل «كتابة» و«كتابه» (كتابُه) كلمة واحدة.
مثال: «أحمد» و«احمد» ← «احمد»، و«إسلام» ← «اسلام»، و«مُحَمَّد» و«محـــمد» ← «محمد»، و«٢٠٢٦» ← «2026»؛ ونصّ البحث يمرّ بالخطوات نفسها فيلتقيان.
أمّا أي تحويل تختار لبياناتك، وبأي فهرس، وكيف تُثبت النتيجة، فهو ما أعددتُ له هذه المهارة.
لماذا لا يكفي تعبير نمطي منقول
طبقة البحث العربية تُكتب مرة واحدة ثم يُبنى عليها كل شيء، ولهذا يكون خطؤها مكلفًا: تعبير نمطي منقول من مقالة يطوي الهمزة والتاء المربوطة على عمود أسماء، فيدمج عميلين، أو يُكتب النصّ المطبَّع فوق الأصل فيضيع الإملاء المسجَّل في الوثيقة. هذه المهارة تستبدل بالتعبير النمطي قرارًا مرتَّبًا: ما الذي يُبحَث فيه، ثم أين يوضع التطبيع، ثم أي تحويل بأي ثمن، ثم إثبات.
كيف تعمل
- بوابة أولى: أسماء أم نصّ حرّ أم أكواد أم حقل مختلط؟ السلّم الآمن يختلف في الأربعة، ولا تبدأ المهارة قبل الجواب.
- سلّم التحويلات: صفٌّ لكل تحويل، ومع كل صفّ نطاقه بالرموز، وهل يغيّر الهوية، ومثال دمج خاطئ حقيقي. تعرف قبل الاختيار أن طيّ «ى» يدمج حرف الجرّ «على» باسم «علي»، وأن طيّ «آ» ثم حذف «ال» يبتلع «آل سعود».
- مسبار قبل الوصفة: اسم ترتيب المقارنة لا يخبرك بسلوكه. لكل محرّك مسبار من ثلاثة أسطر يُشغَّل على إصدارك ويجيب، قبل أي قرار — PostgreSQL، MySQL و MariaDB، Elasticsearch و OpenSearch، SQLite FTS5، MongoDB، Meilisearch، Typesense.
- الأسماء العربية: بنية النَسَب، و«بن» و«ال» ومركّبات «عبد»، ولماذا حذف كل المسافات يدمج «علي محمد» بـ«عليم حمد»، ولماذا لا يوجد في الحزمة رقم عتبة جاهز.
- الإثبات: المتجهات الـ٥٨ المرفقة، منها ١٩ متجهًا يجب ألّا يتطابق، ويجتازها التنفيذان المرفقان — Python و JavaScript — بالنتيجة نفسها.
بماذا تحصل
- مهارة واحدة (SKILL.md) بسبع خطوات وبوابتَي توقّف وعقد إخراج محدَّد.
- أربعة ملاحق: سلّم التطبيع، ووصفات سبعة محرّكات بمسابرها وفرزها، ومطابقة الأسماء العربية، ونواة سلامة النصّ العربي.
- أربعة سكربتات: دالّة SQL لـ PostgreSQL و MySQL مع العمود والفهرس، وتنفيذ Python، وتنفيذ JavaScript، وملفّ المتجهات — والثلاثة تنفّذ السلّم نفسه بالترتيب نفسه ليعمل نظام يكتب بلغة ويستعلم بأخرى، والمُثبَتان على المتجهات هما تنفيذا Python و JavaScript.
- دليل عربي كامل للتثبيت والاستخدام، وملف جاهز للرفع في Claude على الويب والتطبيق.
نموذج من مخرجات المهارة
أعطيتُ المهارة جدول عملاء تجريبيًّا من 38 صفًّا لشركة توريدات في الشارقة، بياناته في SQLite، وكل أسمائه وأرقامه مختلَقة للمثال. هذه بعض ما خرج منها:
- فحص الاستيراد: سبعة صفوف من الـ38 فيها تلوّث لا يُرى: ثلاثة أسماء من كشف PDF بأشكال العرض، وصفّ فيه مسافة غير فاصلة، وثلاثة صفوف، في الأول علامة اتجاه، وفي الثاني رابط صفريّ العرض، وفي الثالث علامة ترتيب بايتات. نظّفتها المهارة عند الاستيراد، وتطابقت بصمة الصفوف الـ31 الباقية قبل التنظيف وبعده.
- البحث: استعلام «احمد» وجد صفًّا واحدًا عبر LIKE على الخام، ووجد ستة صفوف بعد التطبيع، منها «أحمد حسن الكعبي» بكتاباته الثلاث. و«محمد سالم المنصوري» لم يجد شيئًا عبر LIKE على الخام قبل التنظيف، ثم وجد بعد التنظيف والتطبيع الصفّين 25 و28: الأول من كشف PDF والثاني فيه علامة اتجاه.
- المكرّرون: عشرة أزواج مرشّحة عُرضت بإملاءيها الأصليين لقرار إنسان، ولم يُدمج منها شيء: عدد الصفوف 38 قبل البناء وبعده. وزوج «محمد أحمد سليم» بهاتفين مختلفين صُنّف «متشابه ومؤكَّد أنه مختلف»، وأُسقط زوج «شركة الوفاء للتجارة» لأن أحدهما ذ.م.م والآخر ش.م.ع.
- الفرز: المسبار على SQLite 3.45.1 أعاد أن ICU غير مبني، فصرّحت المهارة بأن مفتاح الفرز تقريب. الترتيب الثنائي وضع «أحمد حسن الكعبي» رابعًا و«ابراهيم يوسف النعيمي» سادسًا، والمفتاح جعل «ابراهيم يوسف النعيمي» أولًا ونقل الصفّين اللاتينيين من الموضعين 1 و2 إلى 37 و38.
- الإثبات: اجتاز تنفيذا Python وJavaScript المتجهات الـ58، واجتازا معها 12 متجهًا من بيانات العيّنة نفسها، منها اثنان يجب ألّا يتطابقا.
تخرج بالبنود الثمانية نفسها على بياناتك: القرارات، والتحويلات وما لم يُطوَ عمدًا، والهجرة، والفهرس، والاستعلام، وجدول المتجهات، والفرز، وسطر إعادة البناء.
لمن هي
لمن يبني بحثًا أو مطابقة أو إزالة تكرار أو فرزًا على بيانات عربية — في قاعدة بيانات علائقية أو محرّك بحث — وسواء كان يُصلح طبقة قائمة أو يبني واحدة من الصفر.
التثبيت
ثلاث طرق مشروحة خطوة بخطوة في الملف README-AR.md داخل الحزمة: رفع الملف الجاهز في Claude على الويب والتطبيق، أو نسخ المجلد في Claude Code، أو وضعه في مجلد المهارات لأي أداة أخرى.
حدودها
- لا تكتب فوق عمودك الخام. قاعدة مطلقة؛ التطبيع في عمود مشتقّ يُعاد بناؤه عند الحاجة.
- لا تدمج مكرّرين آليًّا بأي درجة تشابه. تعرض المرشّح بالإملاءين الأصليين والحقل الثاني المؤكِّد، والقرار لإنسان.
- لا تعطيك عتبة تشابه جاهزة، بل إجراءً يُنتج عتبتك من عيّنة تصنّفها بيدك.
- لا تذكر رقم إصدار يدعم ميزة، ولا قيمة افتراضية لإعداد. تعطيك مسبارًا يُجيب عن قاعدتك.
- لا تتعامل مع التضمينات والبحث المتّجهي وأنابيب RAG، ولا اتجاه واجهة المستخدم، ولا توليد المستندات، ولا بحث الكلمات المفتاحية للتسويق.
- لا تحكم على صحة إملاء اسم شخص، ولا تستنتج جنسًا أو جنسية من الاسم.
- إن لم تُشغَّل المتجهات، تكتب «لم تُشغَّل متجهات الاختبار؛ هذه الطبقة غير مثبَتة» بدل «البحث يعمل الآن».



