توثيق الموديولز
قواعد التحقق
الحقول المطلوبة، الصيغ، النطاقات.
مكتمل
الـ CoverageArticle تَمرّ عبر أربع طبقات تحقّق: هيكلية (الحقول المطلوبة لكل نموذج)، مرجعية (parentEventId + كل ID مذكور يُحَلَّ)، تحريرية (فحص حقائق 3-بوّابات)، وإفصاحية (sponsor-spotlight له تعريف راعٍ صريح). الطبقة المرجعية هي الأصرم — parentEventId مكسور واحد يُفشل السجلّ كلّه.
التحقّق الهيكلي
- مطلوب: id، slug، parentEventId، kind، title.en + title.ar، dek.en + dek.ar، bodyHtml.en + bodyHtml.ar، author.en + author.ar، publishedAt، readingTimeMinutes.
- slug فريد عبر مجموعة بيانات التغطية كلّها، kebab-case، ASCII فقط، ≤80 حرف.
- kind ∈ بالضبط واحد من القيم الـ 5 لـ CoverageKind. لا null، لا سلسلة حرّة.
- كل متغيّرات EN و AR لكل حقل BilingualText يجب أن تُكتَب — لا fallback إلى EN-فقط.
- readingTimeMinutes مُحتسَب من عدد كلمات bodyHtml (الجسم الإنجليزي) ومُقَرَّب لأعلى. الحقل مُخَزَّن، ليس مُحتسَب عند الرسم، لإبقاء رسم الكرت سريعاً.
التحقّق المرجعي
- parentEventId يجب أن يُحَلَّ إلى CalendarEvent موجود. لو الفعالية الوالد مَحذوفة، مقالة التغطية يُيَتَّمها — admin يجب أن يُعيد التَعيين أو الحذف.
- parentEvent.coverageEligible يجب أن يكون true في لحظة النشر. سطح المسودَّة admin يَحظر النشر لو الفعالية الوالد ليست coverageEligible.
- كل mentionedFounderId يُحَلَّ إلى مؤسّس موجود؛ نفس الشيء للشركات، الفرص، الملفات. الـ IDs البالية تُجَرَّد عند الرسم مع console.warn في التطوير.
- عند النشر، parentEvent.coverageStatus تَنقلب تلقائياً إلى 'covered' (كتابة واحدة — حتى لو عدة مقالات تغطية تَتشارك نفس الوالد، الحالة تَبقى 'covered').
فحص الحقائق التحريري — الـ 3 بوّابات
- البوّابة 1 — كل entity مُسمَّى مُتحقَّق منه: أسماء المؤسّسين، أسماء الشركات، أسماء المنظِّمين، أسماء الرعاة، أسماء الحكّام. التهجئة تُطابق السجلّ القياسي (ملف مؤسّس، صفحة شركة، إلخ).
- البوّابة 2 — كل ادّعاء كمّي مُستنَد المصدر: أعداد نتائج العرض، مبالغ الصفقات، أرقام الحضور، النسب. المصدر إمّا مرئي في الفعالية (مُسَجَّل) أو مؤكَّد كتابياً من المنظِّم.
- البوّابة 3 — كل اقتباس حرفي أو مُعاد-الصياغة مع نسبة صريحة. لا اقتباسات مُختَرعة، لا تصريحات مُركَّبة منسوبة لشخص واحد.
