المعمارية English

arc42 §11 — المخاطر والدين التقني

الحالة: Draft v0.1 · التاريخ: 2026-07-20 المنهجية: الخطورة = الأثر × الاحتمالية، مع ترجيح عدم قابلية العكس. المخاطرة التي يسهل إصلاحها لاحقًا بتكلفة زهيدة تأتي في مرتبة أدنى من المخاطرة التي تُغلق الخيارات.


الملخص التنفيذي — الأمور الخمسة التي تهم#

# المخاطرة سبب تصدّرها
R-01 ترخيص SAMA لحيازة الأموال وصرفها عائق حاسم قانوني محتمل. قد يُبطل تصميم المدفوعات بالكامل. ليست مشكلة هندسية.
R-02 الفوترة الإلكترونية ZATCA — مسار عمل غير مخطط له وقيد معماري في آن واحد تسلسل تجزئة الفواتير (hash chaining) ذو حالة ومرتَّب بصرامة — يتعارض مباشرة مع التوسّع الأفقي
R-03 تسريب بيانات عبر المستأجرين وجودي. واجب الإبلاغ بموجب PDPL. نمط فشل صامت.
R-04 قرار تسجيل الفيديو سؤال منتج واحد بلا إجابة (OQ-08) يُرجِّح تكلفة الفيديو بنحو 80 %
R-05 جودة البحث العربي وملفات PDF كلاهما قرار غير قابل للتراجع تُخفَّف مخاطره الآن بثمن زهيد، ويُصلَح لاحقًا بثمن باهظ

الفئة A — التنظيمي والقانوني (أعلى خطورة، وأقل تحكّم هندسي)#

R-01 — قد يكون ترخيص SAMA مطلوبًا لحيازة الأموال وصرفها 🔴 حرج — عائق حاسم محتمل#

المخاطرة. يصف SRC-BRD §9.4 تدفق الإيرادات على النحو العميل ← منصة Qwizin ← المزوّد/المستشار. إذا حصّلت Qwizin أموال المشترين في حسابها الخاص وصرفتها للمستشارين والمزوّدين، فقد يشكّل ذلك خدمة مدفوعات خاضعة للتنظيم تستلزم تصريحًا من SAMA في المملكة العربية السعودية.

الأثر. ليست تفصيلة تصميمية — بل مُدخل يحدّد المضي أو التوقف (go/no-go). اكتشاف الحاجة إلى ترخيص في منتصف البناء هو الاتجاه المكلف؛ والعكس ليس كذلك.

الحالة.غير مُتحقَّق منه. لم يتمكن البحث من تأكيد النظام المعمول به في المملكة. هذا يتطلب استشارة قانونية سعودية متخصصة في الخدمات المالية، لا مزيدًا من البحث.

التخفيف — صمّم الوضع الأقل خطرًا بصرف النظر عن الإجابة القانونية:

النموذج الوصف التعرّض
A — Qwizin تلمس المال المشتري يدفع إلى حساب Qwizin؛ وQwizin تحتفظ بالرصيد وتصرفه يُفعِّل عادةً ترخيص مؤسسة مدفوعات / نقود إلكترونية
B — Qwizin لا تلمس المال إطلاقًا مزوّد خدمة دفع (PSP) مرخّص من SAMA يقوم بـ onboarding للمستشارين بصفتهم تجارًا فرعيين (sub-merchants) تحت ترخيصه. تتدفق الأموال: الدافع ← PSP ← المستشار. وتُرسل Qwizin تعليمات التقسيم وتأخذ عمولتها كمعاملة تاجر منفصلة. مزوّد تقنية، لا مزوّد مدفوعات

القرار: صمّم على أساس النموذج B. فهو النمط الذي وُجدت من أجله مزوّدات الدفع الخاصة بالـ marketplace، وإذا أكّد المستشار القانوني لاحقًا أن النموذج A جائز، فالانتقال إليه سهل. لا تبنِ سجلًا محاسبيًا بأرصدة مملوكة للمستخدمين حتى يُحسم هذا الأمر.

أسئلة للمستشار القانوني: هل يوجد استثناء للوكيل التجاري؟ هل «مُيسِّر المدفوعات / المجمِّع (payment facilitator / aggregator)» فئة ترخيص معترف بها في المملكة؟ ما التزامات AML/KYC التي تقع على Qwizin عند onboarding مستلمي الـ payout، حتى في ظل النموذج B؟


R-02 — الفوترة الإلكترونية ZATCA: مسار عمل غير مخطط له وقيد على التوسّع 🔴 مرتفع#

المخاطرة. تفرض المملكة العربية السعودية الفوترة الإلكترونية. والكيان السعودي المسجَّل في ضريبة القيمة المضافة الذي يصدر فواتير ضريبية لمنشآت داخل المملكة يقع في النطاق على الأرجح البالغ. لا تذكر أي وثيقة مصدرية هذا الأمر.

أثران متمايزان:

  1. مسار عمل خلفي غير مخطط له. UBL 2.1 XML، وتوليد CSR وonboarding الـ CSID، والختم التشفيري بـ ECDSA، وتواقيع XAdES، ورموز QR بصيغة TLV، وتدفقات API للتصديق (clearance) في B2B مقابل الإبلاغ (reporting) في B2C، والأرشفة.
  2. ⚠️ قيد معماري يتعارض مع التوسّع الأفقي. يشترط ZATCA تسلسل تجزئة الفواتير (invoice hash chaining) (كل فاتورة تتضمن تجزئة الفاتورة السابقة) إضافة إلى عدّاد تصاعدي (monotonic counter). هذا ذو حالة ومرتَّب بصرامة — ولا يمكن إنتاجه بالتوازي من عدة API pods. التنفيذ الساذج عبر 3 نسخ أو أكثر يُنتج سلسلة مكسورة وفواتير مرفوضة.

التخفيف:

  • صمّم نقطة تسلسل واحدة لكل متتالية فواتير — طابور مخصّص بمستهلك واحد مع قفل موزّع، لا مسار كود متوسّع أفقيًا. إثارة هذا الآن رخيصة؛ أما إقحام الترتيب لاحقًا في تصميم متزامن فليس كذلك.
  • تكامَل مع مزوّد حلول ZATCA معتمد بدلًا من تنفيذ المكدس التشفيري داخليًا. بالنسبة لفريق صغير هذا شبه مؤكد أنه القرار الصحيح.
  • سؤال فرعي غير محسوم وله ثقل قانوني: في الـ marketplace، من هو المورّد المسجَّل (supplier of record) لخدمة المستشار، وهل تقوم Qwizin بالفوترة الذاتية (self-billing) نيابة عنه؟ يتقاطع مع R-01 — وهو ذات النقاش مع المستشار القانوني.

الحالة. ❌ غير مُتحقَّق منه. يتطلب مستشارًا ضريبيًا سعوديًا إضافة إلى مراجعة الإرشادات التقنية التفصيلية من ZATCA. متتبَّع تحت OQ-11.


R-03 — PDPL: المقدمة القانونية محل منازعة 🟠 مرتفع#

المخاطرة. انطلق هذا العمل من مقدمة مفادها أن إقامة البيانات (data residency) داخل المملكة إلزامية قانونًا. والبحث يتحدى هذه المقدمة تحديًا جوهريًا. تشير تعليقات مستشارين متخصصين إلى أن PDPL يُجيز النقل عبر الحدود بموجب المادة 29 (البنود التعاقدية القياسية SCCs، أو القواعد المشتركة المُلزِمة، أو شهادة اعتماد، إضافة إلى تقييم موثَّق لمخاطر النقل). في المقابل يؤكد مصدر استشاري تجاري أمريكي القراءة الأشد تشددًا القائلة بالتوطين. وهذان متعارضان.

الأثر. القرار (الاستضافة داخل المملكة، ADR-0001) لا يتغير — فهو يبقى صحيحًا لأنه يُلغي مسار عمل الامتثال للنقل بأكمله ويستوفي مسبقًا قاعدة CST الخاصة بالبيانات الحكومية. لكن المبرر يتغير من «مطلوب قانونًا» إلى «إلغاء للمخاطر ولمسار عمل كامل»، وهو ما يهم إذا دفع ضغط التكلفة لاحقًا إلى إعادة النظر.

غير مُتحقَّق منه بشكل منفصل — وأكثر إلحاحًا تشغيليًا: الواجبات التشغيلية في PDPL. عتبات ومواعيد الإبلاغ عن الاختراق، ومواعيد الاستجابة لحقوق أصحاب البيانات، وعتبة تعيين مسؤول حماية البيانات (DPO)، وحدود الاحتفاظ، وحالة تسجيل جهة التحكم — تعذّر التحقق منها جميعًا. وهذه بالضبط هي الأرقام التي تُدوَّن في كتيبات التشغيل واتفاقيات مستوى الخدمة، ولذلك لم تُملأ من الذاكرة.

الإنفاذ قائم فعلًا: ورد أن هناك 48 قرار مخالفة صادرًا عن SDAIA خلال 2025–2026؛ وتصل العقوبات إلى 3 ملايين ريال سعودي و/أو السجن سنتين (المادة 35) و5 ملايين ريال سعودي عن كل مخالفة (المادة 36).

التخفيف. اطلب رأيًا قانونيًا سعوديًا في الخصوصية يغطي: الأسس النظامية للمعالجة (لا تفترض تطابقًا مع GDPR — فقد لا تكون المصلحة المشروعة موجودة كأساس أصلًا)، ومواعيد طلبات أصحاب البيانات، وجداول الإبلاغ عن الاختراق، وعتبة الـ DPO، والتعارض بين حدود الاحتفاظ واحتفاظ سجل التدقيق، وتقييمات النقل عبر الحدود للمعالِجين الفرعيين (الفيديو، الرسائل النصية، تتبع الأخطاء)، والأساس النظامي لـ وصول صاحب العمل إلى سجلات تدريب الموظف — وهو سؤال متمايز أوجده نموذج ACT-CO/ACT-EMP.


R-04 — قد تشكّل الاستشارات المسجَّلة بيانات صحية حساسة 🟠 مرتفع#

المخاطرة. إذا كانت الاستشارات تُسجَّل (OQ-08، غير محسوم)، فإن التسجيلات هي بلا لبس بيانات شخصية مخزَّنة، وقد تُفصح الاستشارة عرضًا عن معلومات صحية. هذا هو التصنيف الذي يغفل عنه المعماريون، لأن pipeline الفيديو يُصمَّم بوصفه مشكلة وسائط لا مشكلة بيانات حساسة.

الأثر. تصنيف البيانات الحساسة يرفع سقف PDPL (المادة 35 تحمل مسؤولية جنائية)، ويجعل تخزين التسجيلات داخل المملكة أمرًا غير قابل للتفاوض عمليًا، ويضيف التزامات الموافقة والاحتفاظ والمحو.

التخفيف. يجب أن تستقر التسجيلات وبيانات الجلسة الوصفية في تخزين داخل المملكة بصرف النظر عن مسار ترحيل الوسائط. شفّرها على مستوى التطبيق. التقط موافقة صريحة من الطرفين. حدّد مدة احتفاظ مع حذف آلي. وإذا لم يكن التسجيل مطلوبًا في MVP، فإن عدم التسجيل أرخص جوهريًا وأقل خطرًا — انظر R-06.


الفئة B — الأمن وسلامة البيانات#

R-05 — تسريب بيانات عبر المستأجرين 🔴 حرج#

المخاطرة. نطاق مستأجر مفقود يكشف سجلات موظفي شركة أو مستنداتها أو نتائج تقييماتها لشركة أخرى. التخويل المكسور على مستوى الكائن هو أكثر الثغرات الخطيرة شيوعًا في SaaS متعدد المستأجرين، وهو يفشل بصمت — لا خطأ، ولا انهيار، فقط بيانات خاطئة تُعاد.

لماذا لا يكفي التخفيف البديهي. نطاق Eloquent العام يُتجاوَز عبر withoutGlobalScopes() والاستعلامات الخام وDB::table()، وعبر أي مطوّر لا يعلم بوجوده أصلًا. إنه شبكة أمان، لا آلية تحكم.

التخفيف — خمس طبقات (بالتفصيل في arc42/06-runtime-view.md التدفق 6):

  1. أمان مستوى الصفوف (RLS) في PostgreSQL مع FORCE ROW LEVEL SECURITY — الطبقة الوحيدة التي تطبّق الرفض عند الشك بصرف النظر عن أخطاء التطبيق
  2. TenantContext يرمي استثناءً عند عدم ضبطه، ولا يتراجع أبدًا إلى «بلا فلترة»
  3. نطاق Eloquent العام — للراحة واستخدام الفهارس، لا بوصفه حدًا أمنيًا
  4. اختبار معماري يتحقق من أن كل جدول يحوي company_id يستخدم trait النطاق
  5. حزمة CI عدائية — مستأجران مزروعان، وكل endpoint يُطلب بمعرّفات الآخر، والبناء يفشل عند أي تسريب

⚠️ نمطا فشل في RLS يجب التصميم لهما الآن: إعادة استخدام الاتصال في ظل تجميع الاتصالات (pooling) أو العمال الدائمين قد تنقل متغير الجلسة عبر الطلبات؛ والمهام المُدرجة في الطوابير لا سياق طلب لها، لذا يجب على كل مهمة مقيَّدة بمستأجر أن تعيد تأسيسه من حمولتها وأن ترمي استثناءً عند غيابه.

دلالة تصميمية مقبولة: هذا سبب رئيسي لتأجيل Laravel Octane (ADR قيد الإعداد). العمال الدائمون في Octane يجعلون نمط فشل إعادة استخدام الاتصال أرجح بكثير، مقايضين سمة الجودة الأعلى أولوية بأداء لا يتطلبه حجم الإطلاق.

R-06 — سلامة التقييم وتزوير الشهادات 🟠 مرتفع#

المخاطرة. ثلاثة إخفاقات متمايزة: (أ) تسرّب مفتاح الإجابات إلى العميل؛ (ب) العبث بالدرجة؛ (ج) تزوير شهادة في محرر رسوميات.

لماذا يتقدّم هذا على قلق سلامة نمطي. هذه الشهادات تُثبت كفاءة في سلامة الغذاء. الشهادة المزوّرة ليست شارة تجميلية — بل تنقل خطرًا واقعيًا إلى روّاد المطاعم، وتهدم ادعاء القيمة المركزي للمنصة (SRC-MOM KPI 3).

مسارات تسريب محددة تم رصدها:

  • الإفراط في التسلسل عبر ORM — نموذج Question المُسلسَل عبر toArray() يشحن correct_option_id. استخدم موارد API صريحة بقائمة حقول مسموح بها، إضافة إلى $hidden كدفاع في العمق. هذا مسار اختراق واقعي شائع جدًا.
  • endpoint المراجعة — إظهار إجاباته الخاطئة للمتعلم بعد الإكمال أمر مشروع، وكثيرًا ما يعيد كشف المفتاح بأكمله.

التخفيف: التصحيح على الخادم حصرًا؛ لا حقل score في API التسليم؛ سجل محاولات للإضافة فقط (append-only)؛ تجميع الأسئلة في بنك مع ترتيب عشوائي للخيارات؛ ودفاع ثلاثي الطبقات للشهادة — حمولة QR موقَّعة (تتيح التحقق دون اتصال)، وendpoint تحقق عام بمعرّفات غير قابلة للتخمين وبأقل قدر من البيانات الشخصية، والإبطال (revocation) من اليوم الأول.

R-07 — رفع ملف خبيث عبر pipeline المستندات القانونية 🟠 مرتفع#

المخاطرة. يقبل onboarding الشركات والمزوّدين رفع ملفات اعتباطية من أطراف غير مُتحقَّق منها — وذلك بحكم التعريف، إذ إن التحقق هو الغاية من الرفع أصلًا. حمولة XSS مخزَّنة تُقدَّم من نفس الأصل (same-origin) ستُنفَّذ ضد جلسة المراجع المسؤول، وهي أعلى الجلسات صلاحية في النظام.

التخفيف: حاوية quarantine ← فحص ClamAV ← الترقية عند النظافة؛ التحقق من magic bytes، لا من الامتداد ولا من MIME المُرسل من العميل؛ التقديم من نطاق منفصل (لا نطاق فرعي يتشارك الكوكيز) مع Content-Disposition: attachment وX-Content-Type-Options: nosniff؛ أسماء ملفات مولَّدة من الخادم؛ signed URLs قصيرة العمر؛ وبالنسبة لملفات PDF، فكّر في توليد معاينة مسطّحة كي لا يفتح المراجعون الأصل في محرك PDF داخل المتصفح. الرفض عند الشك — عدم توفر الماسح يعني «لم يُثبت أنه نظيف بعد»، لا «افترضه نظيفًا».


الفئة C — المعماري والتقني#

R-08 — تآكل حدود الوحدات 🟠 مرتفع#

المخاطرة. يتدهور الـ modular monolith إلى كرة طين كبيرة (big ball of mud)، فيتحول الاستخراج في المرحلة الثانية الذي يعد به CONF-04 إلى إعادة كتابة بدل إعادة هيكلة.

لماذا هذا مرجّح لا افتراضي. إن سهولة Eloquent هي بالضبط ما يُذيب الحدود: $user->bookings->first()->consultant->company يمتد عبر أربع وحدات في سطر واحد، ويُصرَّف بلا مشكلة، ويُقرأ بسلاسة، وهو غير قابل للاستخراج. ونموذج User هو الفخ تحديدًا — ففي تطبيق Laravel نمطي تعلّق كل وحدة علاقاتها عليه إلى أن يستورد من كل namespace.

التخفيف:

  • فصل namespace إلى Public/ مقابل Internal/ لكل module. قاعدة واحدة — «لا يجوز لأي module أن يشير إلى Internal الخاص بـ module آخر» — تساوي أكثر من مئة صفحة من الإرشادات، لأنها لا لبس فيها وقابلة للفحص آليًا.
  • Deptrac (⚠️ ملاحظة: qossmic/deptrac مهجور؛ استخدم deptrac/deptrac) مع --fail-on-uncovered، إضافة إلى اختبارات معمارية بـ Pest. كلاهما في CI.
  • لا مفاتيح أجنبية عابرة للوحدات. لا اجتياز Eloquent عابر للوحدات. لا تمرّر نموذجًا عبر حد أبدًا — مرّر DTO.
  • صندوق الصادر المعاملاتي (outbox) + واجهة EventBus خاصة بنا من الأسبوع الأول. الحمولات قيم أولية فقط، مع حقل نسخة. هذا أعلى تأمين متاح للاستخراج من حيث العائد على الجهد — نحو يوم عمل واحد يشتري إمكانية تبديل الوسيط، وإعادة التشغيل (replay)، وسجل تدقيق.
  • قاعدة صارمة: Shared/ يحتوي فقط على كائنات القيمة والواجهات. ولحظة أن يحتوي سلوكًا يصبح هو كرة الطين الجديدة.

دين مقبول: إسقاط قيود المفاتيح الأجنبية العابرة للوحدات يفقدنا التكامل المرجعي على مستوى قاعدة البيانات. ونشتريه مجددًا عبر domain events للتتالي (cascades) ومهمة تسوية (reconciliation) تبلّغ عن السجلات اليتيمة كمقياس بدلًا من إفشال عمليات الكتابة.

R-09 — العبء التشغيلي لـ Kubernetes مقابل حجم الفريق 🟠 مرتفع#

المخاطرة. يتعارض CON-15 (Kubernetes) مباشرة مع CON-01 (الميزانية) وQAS-OPS-01 (قابلية التشغيل بفريق صغير). Kubernetes يرفع الحد الأدنى التشغيلي.

الموقف. كان هذا قرارًا صريحًا من المعماري وهو محترم — لكن النتيجة مُوثَّقة بصراحة: الاستثمار في observability والأتمتة الذي يفرضه هذا القرار صار متطلبًا، لا إضافة اختيارية. اختيار Kubernetes دون دفع تلك الكلفة يحوّل خيارًا بنيويًا إلى ضريبة تشغيلية دائمة.

التخفيف: مستوى تحكم مُدار (OKE)؛ استخدام العناصر الأولية الأصلية (vanilla upstream) فقط؛ خارطة طريق التحصين المرحلية مرتَّبة حسب خفض المخاطر لكل ساعة؛ correlation IDs من طرف إلى طرف؛ التنبيه على SLOs التي يشعر بها المستخدم، لا على رسوم استهلاك المعالج؛ rollback بأمر واحد في أقل من 10 دقائق.

موقف مقصود من أمن وقت التشغيل: Falco/Tetragon هو المكان الذي تموت فيه برامج التحصين عادةً — القواعد الافتراضية تُنتج مئات التنبيهات يوميًا، ولا أحد يفرزها، فيُكتَم الـ DaemonSet. وهذا يترك أمن وقت التشغيل قائمًا على المخطط المعماري ومعدومًا في الواقع، وهو أسوأ من غيابه لأنه يخلق طمأنينة كاذبة. إن لم يكن هناك من سيفرز التنبيهات، فلا تنشره — واصرف الجهد على الضوابط البنيوية بدلًا من ذلك.

R-10 — معمارية الفيديو: قرار التسجيل يهيمن على التكلفة 🟠 مرتفع#

المخاطرة. كان المقترح الأصلي (SRC-MOM §11) هو Jitsi ذاتي الاستضافة، وقد اختير على أساس كلفة المصدر المفتوح. وهذه المقدمة لا تصمد عند الاصطدام بمتطلب التسجيل.

النتيجة، وهي قابلة للاشتقاق لا نتيجة بحث: ميزة Jitsi في التكلفة للمكالمات فرد-لفرد تأتي إلى حد كبير من وضع P2P، حيث تتجاوز الوسائط الخادم كليًا (توفير نحو 80 % من حركة الخروج). وJibri يسجّل بالانضمام إلى المؤتمر كمشارك ثالث — وهو ما يجعل المكالمة لم تعد فرد-لفرد، فتُدفع مجددًا عبر الجسر (bridge). ومن ثم فإن التسجيل الشامل يقتل التوفير الرئيسي ويضيف أغلى شريحة تكلفة. والأثران يتراكبان، وكلاهما ينبع من قرار المنتج نفسه.

النتيجة المترتبة: OQ-08 (هل تُسجَّل الاستشارات؟) ليس سؤال منتج ثانويًا — بل يُرجِّح كلفة بنية الفيديو التحتية بنحو 80 % وينبغي الإجابة عنه قبل بدء أي عمل على الفيديو.

نتائج إضافية:

  • نقطة التقاطع التي تتفوق عندها الاستضافة الذاتية على المُدارة تقع فوق 300 جلسة متزامنة، وربما فوق ذلك بكثير، بمجرد احتساب وقت المهندسين. عند حجم الإطلاق، تعني الاستضافة الذاتية دفع الكلفة الثابتة الكاملة لقدرة نادرة في تشغيل الوسائط لخدمة حركة شبه معدومة.
  • إن لزمت الاستضافة الذاتية، فإن LiveKit مفضَّل على Jitsi — autoscaling على مستوى الـ pod عبر UDP mux بدلًا من قيد Jitsi بـ hostNetwork وpod واحد لكل عقدة، إضافة إلى اقتصاديات تسجيل أفضل.
  • مستوى الإشارة (signalling) في Jitsi — أي Prosody وJicofo — هو عمليًا مفرد (singleton) — وهو خطر التوافرية الذي يغفل عنه الجميع أثناء انشغالهم بتوسيع JVB.
  • TURN إلزامي لا اختياري — فشبكات الجوال السعودية تعتمد CGNAT بكثافة، وفي استشارة مدفوعة تعني المكالمة غير القابلة للاتصال استردادًا للمبلغ إضافة إلى عميل مفقود.

التخفيف: المنفذ (port) المحايد تجاه المزوّد (SEAM-02) يجعل هذا قابلًا للعكس. وانتهاء عمر خدمة Video لدى Twilio دليل تجريبي على أن خروج المورّد من هذا السوق ليس أمرًا افتراضيًا.

R-11 — جودة البحث العربي 🟠 مرتفع — قرار غير قابل للتراجع#

المخاطرة. البحث النصي الكامل العام على العربية دون تطبيع (normalisation) يُنتج استرجاعًا شبه معدوم. والفشل صامت وكامل: المستخدم السعودي الذي يبحث بالعربية لا يحصل على شيء، فيستنتج أن الدليل فارغ.

متطلبان متمايزان، غالبًا ما يُخلط بينهما:

  1. التطبيع الإملائي — توحيد صور الألف (أ إ آ ٱ ← ا)، والتاء المربوطة (ة ← ه)، والألف المقصورة (ى ← ي)، وحذف التشكيل والتطويل. وهذا هو النصف الأعلى أثرًا.
  2. التجذير الصرفي — العربية تُلصق أداة التعريف ال واللواصق و، ف، ب، ل، ك. فكلمات المطاعم / مطاعم / للمطاعم / مطعم مفهوم واحد لدى المستخدم وأربعة رموز (tokens) لدى فهرس ساذج.

⚠️ قلق محدد تم رصده: نموذج الملاءمة في Meilisearch يتكئ على مطابقة البادئة (prefix)، والعربية تُلصق أداة التعريف بوصفها بادئة — فلا تطابق مطاعم بادئةَ المطاعم. وفي لغة أبرز خصائصها الصرفية هي البدء بلواصق، يمثل ذلك عيبًا بنيويًا. (غير مُتحقَّق منه — وهذا بالضبط ما يجب أن يقيسه الـ spike.)

التخفيف — امتلك التطبيع، وعندها يتوقف اختيار المحرك عن كونه قرارًا غير قابل للتراجع. شغّل pipeline تطبيع داخل التطبيق عند الفهرسة، وطبّق ذات الـ pipeline على الاستعلامات. نحو 150 سطرًا من معالجة النصوص جيدة الاختبار، تُقدّم النصف الأعلى أثرًا على أي محرك، وتُبقي الخبرة العربية داخل كود يمكن ضبطه من سجلات الاستعلام الحقيقية، وتجعل المحرك قابلًا للاستبدال.

ملاحظة على إقامة البيانات: خدمات البحث المُدارة (SaaS) مستبعدة على الأرجح — فقوائم الـ marketplace تحوي بيانات شخصية، ما يجعل الفهرس خارج المملكة نقلًا عبر الحدود. استضِفه ذاتيًا على العنقود.

R-12 — عرض ملفات PDF العربية 🟡 متوسط — لكنه مكلف إن اكتُشف متأخرًا#

المخاطرة. تتطلب العربية تشكيل الرسوم السياقي (contextual glyph shaping) وتخطيطًا ثنائي الاتجاه (bidi). عبارة «يدعم UTF-8» لا تعني شيئًا — فبإمكان مكتبة أن تُصدر نقاط ترميز صحيحة وتعرض عربية مفكّكة الحروف ومقلوبة وغير مقروءة. والشهادة ذات العربية المكسورة تبدو هاوية بشكل ظاهر لكل مستخدم سعودي، وغير صالحة كمؤهل.

يستبعد ذلك عدة خيارات شائعة: dompdf لا يدعم تشكيل العربية ولا bidi؛ وwkhtmltopdf/snappy مؤرشف وغير مصان (وهو أيضًا مسؤولية من ناحية الثغرات CVE).

التخفيف: مُصيِّر (renderer) قائم على محرك متصفح (تشكيل بـ HarfBuzz) بوصفه Deployment منفصلًا في Kubernetes — فذلك يُبقي Chromium خارج صورة التطبيق، ويتوسّع باستقلال عند الذُّرى، ويحتوي نطاق ضرر نفاد الذاكرة (OOM). ضمّن الخطوط داخل الصورة؛ ولا تُشِر أبدًا إلى CDN لخطوط الويب (تذبذب في العرض وأيضًا طلب عابر للحدود). الاختبار الفاصل: اعرض شهادة ثنائية اللغة حقيقية وأرِها لمتحدث بالعربية — لا لنفسك.

R-13 — لا إصدار LTS في Laravel 🟡 متوسط#

المخاطرة. آخر إصدار LTS من Laravel كان الإصدار 6 (2019). وجميع الإصدارات الآن تحصل على 18 شهرًا لإصلاح العلل و24 شهرًا للأمن. لا يوجد خيار «ثبّته واتركه». نافذة إصلاح علل Laravel 12 تنتهي في 2026-08-13 — بعد ثلاثة أسابيع من الآن.

التخفيف: ابدأ على Laravel 13 + PHP 8.4؛ وارصد ميزانية لترقية رئيسية سنوية بوصفها عملًا تشغيليًا روتينيًا لا مشروعًا. يركّز Laravel 13 على تقليل التغييرات الكاسرة، فارصد أيامًا لا أسابيع. الفرق التي تتخطى هذا تنتهي عالقة على إصدار منتهي الدعم في مواجهة ترحيل طارئ يفرضه الأمن.

R-14 — يجب أن تدعم بوابة الدفع authorize/capture/void 🟡 متوسط#

المخاطرة. يُحلّ CONF-02 (الدفع يسبق قبول المستشار) عبر حجز مبلغ (hold) وتحصيله فقط عند القبول، وإلغائه عند الرفض أو انتهاء المهلة. وليست كل بوابات الدفع في المملكة تدعم الفصل بين authorization وcapture، خصوصًا لـ mada.

التخفيف: صار هذا معيار اختيار صارمًا يغذّي OQ-01، إلى جانب القدرة على payout في الـ marketplace (R-01). ويجب التحقق من كليهما قبل اختيار أي بوابة.


الفئة D — المتطلبات والعمليات#

R-15 — تناقضات في الوثائق المصدرية 🟠 مرتفع#

أربعة تعارضات غير محسومة، بالتفصيل في 00-requirements-baseline.md §5:

ID التعارض يحجب
CONF-01 نطاق التدريب: BRD يستثني التعلم الإلكتروني بالفيديو ومسارات التعلم والتحليلات؛ بينما يحدد عرض Training Portal الثلاثة جميعًا إضافة إلى مقارنة الفروع OQ-04
CONF-02 تحصيل الدفع قبل موافقة المستشار OQ-05 — مُحلّ معماريًا، ويحتاج قرارًا في السياسة
CONF-03 مصفوفة الأدوار متناقضة داخليًا — المسؤول يظهر ولديه «حجز استشارة»/«إدارة التوافر»، ومزوّد الخدمة لديه «الوصول إلى التعلم». يبدو أنه أثر ناتج عن اختلال محاذاة الأعمدة. OQ-06
CONF-04 عرض المستثمرين يلتزم بـ POS/PMS وCRM والمخزون والحجوزات والتكامل الحكومي لا يحجب — لكنه يوجّه مواضع الـ seams

⚠️ CONF-03 هو الأخطر لأن §11 من BRD هو المُدخل المرجعي لنموذج التخويل. البناء من ملف PDF كما هو سيُنتج ثغرات صلاحيات حقيقية. يجب إصدار مصفوفة صلاحيات مصحّحة وقابلة للفحص آليًا قبل بدء العمل على التخويل.

R-16 — فجوات التحقق البحثي 🟡 متوسط#

المخاطرة. استنفد البحث الداعم لهذه الوثائق ميزانية البحث على الويب المتاحة للجلسة. وعدة ادعاءات جوهرية مُعلَّمة صراحةً بأنها غير مُتحقَّق منها بدلًا من ملئها من الذاكرة.

الفجوات الرئيسية:

الفجوة النتيجة المترتبة
مصفوفة خدمات OCI لكل منطقة في me-riyadh-1 (Redis المُدار، السجل (registry)، الأسرار، البث) غياب Redis مُدار يغيّر المعمارية — الفجوة رقم 1 في ADR-0001
لا تسعير لكل SKU في المملكة لعام 2026 مُتحقَّق منه التكلفة هي الحجة الأساسية لصالح Oracle؛ وهي تستند إلى ادعاء بنيوي بتجانس التسعير
فئة تسجيل Oracle لدى CST يحكم كل العمل الحكومي — وقد يعكس ADR-0001
حالة التوفر العام لـ AWS في المملكة يتعذّر حسمها من مصادر مملوكة لـ AWS من شأنها إعادة ترتيب تصنيف المزوّدين
ما إذا كان أي مزوّد CPaaS يوفّر حضورًا للوسائط في المملكة/الخليج مع إقامة بيانات تعاقدية يحكم خيار الفيديو المُدار بأكمله
دعم العربية لكل محرك (محركات البحث الأربعة جميعًا) R-11 — يُحسم بـ spike من 2–3 أيام
حالة صيانة مكتبة PDF العربية R-12 — يُحسم بـ spike ليوم واحد

التخفيف. الفجوات مُعلنة بدلًا من التغطية عليها. التكلفة والوضع التنظيمي هما بالضبط الموضعان اللذان يُحدث فيهما الرقم الخاطئ ذو المظهر المعقول ضررًا، لذا لم يُقدَّم أي رقم غير مُتحقَّق منه بوصفه حقيقة. وعدة فجوات تُغلق بـ spike أرخص مما تُغلق بمزيد من البحث.


مصفوفة المخاطر#

ID المخاطرة الخطورة قابلة للعكس؟ المسؤول
R-01 ترخيص SAMA 🔴 حرج ❌ لا المستشار القانوني
R-05 تسريب عبر المستأجرين 🔴 حرج ⚠️ قبل الإطلاق فقط معماري النظام
R-02 نطاق ZATCA + التسلسل 🔴 مرتفع ⚠️ مكلف لاحقًا مستشار ضريبي + معماري النظام
R-03 واجبات PDPL التشغيلية 🟠 مرتفع ✅ نعم مستشار الخصوصية
R-04 التسجيلات كبيانات حساسة 🟠 مرتفع ⚠️ مكلف لاحقًا الراعي + المستشار القانوني
R-06 سلامة التقييم / الشهادات 🟠 مرتفع ⚠️ مكلف لاحقًا معماري النظام
R-07 الرفع الخبيث 🟠 مرتفع ✅ نعم معماري النظام
R-08 تآكل الحدود 🟠 مرتفع عمليًا لا معماري النظام + القائد التقني
R-09 العبء التشغيلي لـ K8s 🟠 مرتفع ✅ نعم معماري النظام
R-10 تكلفة الفيديو / التسجيل 🟠 مرتفع ✅ نعم (عبر الـ port) الراعي (OQ-08)
R-11 البحث العربي 🟠 مرتفع ⚠️ قرار غير قابل للتراجع معماري النظام (spike)
R-15 تناقضات المصادر 🟠 مرتفع ✅ نعم الراعي / محلل الأعمال
R-12 PDF العربية 🟡 متوسط ✅ نعم معماري النظام (spike)
R-13 لا LTS في Laravel 🟡 متوسط ✅ نعم القائد التقني
R-14 قدرات البوابة 🟡 متوسط ⚠️ مكلف لاحقًا معماري النظام (OQ-01)
R-16 فجوات التحقق 🟡 متوسط ✅ نعم معماري النظام

الإجراءات الفورية الموصى بها#

قبل كتابة أي كود:

  1. استعِن بمستشار قانوني سعودي بشأن R-01 (SAMA) وR-02 (ZATCA) وR-03 (PDPL). فهذه تحدد ما يُبنى، لا كيف يُبنى فحسب. لا تصرف جهدًا هندسيًا على المدفوعات أو الفوترة حتى يُجاب عن R-01 وR-02.
  2. احصل على مصفوفة أدوار وصلاحيات مصحّحة (CONF-03) — لا يمكن تصميم التخويل من الوثيقة الحالية.
  3. احصل على قرار بشأن OQ-08 (التسجيل). فهو يُرجِّح كلفة الفيديو بنحو 80 % ويغيّر التصنيف بموجب PDPL.
  4. احصل على قرار بشأن CONF-01 (نطاق التدريب) — فالتعلم بالفيديو يغيّر معمارية التخزين والـ CDN تغييرًا جوهريًا.

اختبارات استكشافية (spikes) زهيدة تُسقط مخاطر غير متناسبة:

  1. مقارنة أداء البحث العربي (bake-off) — 2–3 أيام، بنحو 500 قائمة حقيقية، على المحركات الأربعة جميعًا، مع pipeline التطبيع أمامها. قرار غير قابل للتراجع؛ وكل ما عداه يمضي بالتوازي.
  2. عرض PDF العربية — يوم واحد. أنتج شهادة ثنائية اللغة حقيقية واحدة وأرِها لمتحدث بالعربية.
  3. تحقّق من مصفوفة خدمات منطقة OCI ومن فئة CST — ساعات لا أيام، وهي تحكم ADR-0001.

ابنِ هذا أولًا، قبل وجود الوحدة الثانية:

  1. منظومة الإنفاذ — Deptrac + اختبارات معمارية + الحزمة العدائية بمستأجرين. إقحام الحدود لاحقًا على ست وحدات يكلّف نحو 20 ضعف تكلفة البدء بوحدتين.
  2. صندوق الصادر المعاملاتي (outbox) + واجهة EventBus — نحو يوم واحد، وهو أرخص تأمين متاح للاستخراج.
  3. سياسات RLS مع أول ترحيل (migration) مقيَّد بمستأجر — إضافة RLS إلى جدول ممتلئ تحت الحمل تتطلب نافذة صيانة.
القائد التقني · أمير هارون مسودة v0.1 · بحث وتصميم فقط