AI Receptionist & Booking Platform
في الإنتاج · قيد التشغيل الفعلي منذ أكتوبر 2026 · تكليف من عميل، مهندس وحيد
الملخص
في 30 يومًا (470 إيداعًا و52 جولة بناء موثّقة) انتقل عمل خدمي صغير من مكالمات ضائعة إلى نظام يجيب عن كل مكالمة، ويجمع بيانات المتصل، ويحجز ضمن قواعد العمل، ويؤكد برسالة نصية، ويتحوّل إلى البريد الصوتي إذا تعطّل أي شيء. يشغّل نموذجًا لغويًا محليًا لتصنيف النوايا، ولا يستخدم التعرّف السحابي على الكلام إلا حيث ثبت قصور التعرّف المحلي، ويضع سقفًا للإنفاق، ويراقب نفسه، ويُطرح عبر عملية إصدار ببوابة اختبارات مع نقطة تراجع موثّقة.
المشكلة والمستفيدون
كان صاحب عمل خدمي يعمل بمفرده يخسر أعمالًا بسبب مكالمات لا يجيب عنها، ولم يكن لديه حجز عبر الإنترنت. احتاج إلى موظف استقبال يجيب في أي وقت، ويحجز فقط ضمن قواعد العمل، ولا يعد بما لا يستطيع تنفيذه، ويبقى ضمن ميزانية محددة.
صاحب العمل (الذي يتلقى الحجوزات والتنبيهات)، وعملاؤه (المتصلون وزوّار الموقع)، ومستخدم لوحة الموظفين. لا يُسمّى العميل هنا بانتظار موافقته على الذكر العلني.
دوري
المهندس الوحيد لدى العميل. كتبت عشر وثائق مواصفات مؤرّخة قبل البناء وفي أثنائه حدّدت المتطلبات وقيود البنية وقواعد الإثبات ومعايير القبول؛ وراجعت الشيفرة ونصوص المكالمات، وأجريت كل جلسة اختبار على هاتف حقيقي، ونفّذت كل إجراء في لوحات تحكم المزوّدين، واعتمدت كل نشر، واتخذت قرار الإطلاق. كان التنفيذ بمساعدة الذكاء الاصطناعي (Claude Code) تحت هذا التوجيه: معظم الشيفرة سطرًا بسطر وُلّدت وفق مواصفاتي وراجعتها بنفسي. قدّم العميل حقائق العمل واختبر على هاتفه الخاص.
البنية
ثلاث عمليات تطبيقية إضافة إلى خادم نموذج مقيم، كلها تعمل بحسابات ذات أقل الصلاحيات ولا يُوصَل إليها إلا عبر بوابة دخول آمنة. يشغّل Node 24 لغة TypeScript مباشرة دون خطوة بناء وبسبع اعتماديات وقت تشغيل. لا يُنتج النموذج أبدًا نصًا موجّهًا إلى العميل ولا حقيقة من حقائق العمل: يصنّف النية مقابل قائمة تسميات مغلقة، وتقوم الشيفرة الحتمية بالباقي.
القرارات والمفاضلات
- نموذج مقيم، لا عملية لكل عبارة. كان تشغيل النموذج لكل عبارة يكلّف نحو 4,000 مللي ثانية؛ أما الخادم المقيم بمخرجات مقيّدة بقواعد نحوية فأجاب في نحو 330 مللي ثانية في أول قياس لي (2026-09-19، نموذج أصغر و8 خيوط). وأعطى اختبار أداء لاحق لإعداد الإنتاج (2026-10-16، على 43 عبارة اختبار لا مكالمات حية) وسيطًا قدره 470 مللي ثانية. قيس لاحقًا بديل قائم على خدمة خلفية (daemon) ورُفض: اختلفت 4 نوايا من 43، وكان أبطأ بنسبة 30%، ويستهلك 4–5× من الذاكرة.
- الكلام وحده سحابي، وكل ما عداه محلي. كشفت أول مكالمة حقيقية حدًا أدنى لزمن المعالج يبلغ نحو 3 ثوانٍ لكل دور ودقة تعرّف نحو 50% للمتحدثين غير الأصليين على المنظومة المحلية. اعتُمد التعرّف السحابي على الكلام والصوت السحابي ضمن ميزانية، مع حارس قبول محلي يحجز تكلفة الحالة الأسوأ قبل قبول المكالمة. وبقي منطق المحادثة والحجز والتصنيف محليًا.
- الجدولة مفروضة في قاعدة البيانات. تمنع قيود الاستبعاد في PostgreSQL تداخل المواعيد بصرف النظر عن أخطاء التطبيق؛ وكُتبت بلغة SQL خام لأن أطر ORM لا تستطيع التعبير عنها. وأُصلح تكدّس استعصاء (deadlock) تحت دفعة من 12 طلبًا متزامنًا بقفل استشاري لكل يوم يُؤخذ قبل أي قفل على الصفوف.
- ملفات تنفيذية موقّعة فقط على مسار المكالمات. حجبت سياسة التحكم في التطبيقات على المضيف ملفًا تنفيذيًا للاستدلال غير موقّع (انقطاع قبل الإطلاق دام نحو 2 ساعة، وتحوّلت المكالمات إلى البريد الصوتي). رُفض إضعاف هذه السياسة؛ واعتُمدت نسخة موقّعة وجرى التحقق من انعدام أي اختلاف في المخرجات عبر 43 نية و10 عمليات استخراج و6 مكالمات مكتوبة مسبقًا.
- لا ترقيعات للتلقين دون تقييم مضبوط. سجّلت العبارات المضبوطة 17/17 بينما سجّلت مجموعة محجوزة لم تُمسّ 7/18، لذا أُجريت الإصلاحات بطريقة حتمية وتُحفظ مجموعة قبول منفصلة.
- الإنفاق ثلاثة أرقام لا تُخلط أبدًا. المقيس محليًا، وإجمالي المزوّد، والمسوّى بندًا بندًا. بعد تنبيه كاذب سببه جمع فئات متداخلة لدى المزوّد (مبالغة في العدّ بنحو 2.4×)، أصبحت القاعدة الثابتة: لا يجوز لأي رقم مالي محسوب أن ينبّه أحدًا قبل أن يطابق إجمالي المزوّد نفسه.
الأمن والموثوقية
- مراجعة أمنية أجراها ثلاثة مراجعين معزولين إضافة إلى فحوص يدوية للمضيف والحسابات: 15 ملاحظة (3 عالية، و5 متوسطة، و6 منخفضة، و1 إعلامية). عولجت كل الملاحظات العالية والمتوسطة بإصلاح أو تخفيف (ملاحظة عالية واحدة بتخفيف لا بإصلاح) وجرى التحقق منها على النظام الحي؛ وبقيت ملاحظة منخفضة واحدة مفتوحة وموثّقة. وتغطي اختبارات الانحدار الإصلاحات.
- كان تحديد المعدل خلف وكيل عكسي يعامل كل زائر بوصفه عميلًا واحدًا في البداية؛ أُصلح ذلك باستخدام عنوان العميل المُمرَّر من الوكيل الموثوق فقط، مع التحقق من رفض الترويسات المزوّرة.
- حالة مكالمة تنجو من إعادة التشغيل: إعادة تشغيل العملية في منتصف مكالمة تستعيد الحالة الجارية وعمليات الاستدعاء (الترحيلة 039، واختبار إعادة تنفيذ (replay)).
- بوابة النشر: شجرة عمل نظيفة ← فحص الأنواع ← الحزمة الكاملة بلا أي فشل ← تشغيل الترحيلات مرتين على قاعدة بيانات فارغة ← بيان إصدار بتجزئة SHA-256 ← إعادة التحقق على المضيف ← فحوص الصحة والحجز. تحتفظ كل عملية ترقية بالإصدار السابق أرشيفًا للتراجع، وترفض الرجوع إلى إصدار أقدم دون علامة صريحة.
- بديل مستضاف يقتصر على البريد الصوتي؛ ويفحص اختبارٌ الشيفرة المصدرية بحثًا عن أي فعل اتصال (dial) حتى لا يمكن وجود أي تحويل للمكالمات.
نتائج مُتحقَّق منها
| المقياس | النتيجة | الدليل |
|---|---|---|
| الحالة | قيد التشغيل الفعلي منذ 2026-10-18؛ الإصدار 05c7664 بتاريخ 2026-10-19 | سجل الإطلاق، الخطوات 0–6 ولكلٍّ منها دليل |
| الاختبارات في آخر بوابة إصدار | 1,845 ناجحًا، و0 فاشلًا؛ 142 ملف اختبار | سجل البوابة، 2026-10-19 (قاعدة بيانات اختبار PostgreSQL حقيقية، وساعة مثبّتة) |
| عملية لكل عبارة مقابل نموذج مقيم | نحو 4,000 مللي ثانية ← نحو 330 مللي ثانية لكل تصنيف (764 مللي ثانية عند الاستدعاء الأول)؛ نموذج أصغر بـ4 بتات و8 خيوط على خادم الإنتاج | قياسي أنا، مسجَّل في تعليق ترويسة الشيفرة 2026-09-19؛ لم يُعَد |
| اختبار أداء لإعداد الإنتاج | وسيط 470 مللي ثانية، والمئين p90 عند 583 مللي ثانية لزمن التصنيف على الخادم (أحدث ثلاث جولات: الوسيط بين 466 و477 مللي ثانية، وp90 بين 582 و595) عبر 43 عبارة اختبار (لا مكالمات حية)؛ نموذج أكبر بـ8 بتات و6 خيوط؛ أول تصنيف بعد التحميل 4.6 ثانية (عند بدء التشغيل وبعد إعادة التشغيل، ولا يصل إلى متصل أبدًا) | سجل الجولة، 2026-10-16 |
| زمن الاستجابة الذي يلمسه المتصل من البداية إلى النهاية | لم يُقَس؛ وتُظهر سجلات مكالمات الاختبار أن دورة النموذج تستغرق 0.9–2.9 ثانية | سجل الجولة، 2026-10-15 |
| المراجعة الأمنية | 15 ملاحظة؛ 3 عالية + 5 متوسطة عولجت بإصلاح أو تخفيف، 1 منخفضة مفتوحة | docs/SECURITY-REVIEW-2026-10-18 |
| الحوادث المحلولة | 10، لكلٍّ منها إيداع إصلاح، واختبار انحدار حيث ينطبق | وثائق الجولات وسجل الإيداعات |
| الاستخدام في الإنتاج | استخدام إنتاجي مبكر؛ لم تتحدد النتائج التجارية بعد | يُذكر ذلك حتى لا توحي هذه الصفحة أبدًا بحجم أو نتائج |
| زمن التوافر | لم يُقَس على نافذة زمنية محددة | سُجّل انقطاع واحد قبل الإطلاق دام نحو 2 ساعة؛ ونجحت تدريبات المراقبة |
القيود والعمل المتبقي
- هذا استخدام إنتاجي مبكر: لم تتحدد النتائج التجارية بعد ولا يوجد رقم لزمن التوافر بعد؛ وسجل توافر وحجوزات على مدى 90 يومًا هو الدليل التالي الذي يستحق الجمع.
- ما تزال ملاحظة أمنية منخفضة الخطورة واحدة مفتوحة وموثّقة في سجلات المشروع؛ وحالة مبكرة واحدة لم يعمل فيها البديل الاحتياطي ليس لها سبب مؤكَّد.
- التعرّف على الأسماء عبر الهاتف ضعيف مع بعض الأسماء؛ ومتانة التعامل مع اللكنات مثبتة فقط على مكالمات المختبِرين.