# حالة تنفيذ منصة صَقِل وخريطة الإطلاق آخر تدقيق: 2026-09-08 ## القرار التنفيذي - الصف العاشر هو بيئة الإثبات الشاملة للمنظومة، وليس منتجاً منفصلاً. - لا توجد أدوار مؤجلة: الطالب وولي الأمر والمعلم ومدير المدرسة والمشرف ومدير المديرية والسوبر أدمن ضمن المعمارية الحالية. - لا تُعرض بيانات تجريبية على أنها تشغيلية. غياب بيانات الخادم ينتج حالة فارغة أو خطأ واضحاً. - بعد اجتياز بوابة جودة الصف العاشر، تُضاف بقية الصفوف بنفس خط الاستيراد والتحليل والاختبار، لا بإعادة بناء التطبيقات. - مسار مؤسسة التدريب المهني جزء من المنتج. يبدأ بعرض إثبات قوي، ثم تُضاف التخصصات واحداً تلو الآخر من نموذج بيانات قابل للتوسع. ## منفذ ومتحقق منه في الكود - أربعة تطبيقات Flutter: الطالب/ولي الأمر، المعلم، الإدارة، والسوبر أدمن. - بوابات OTP فعلية للتطبيقات الأربعة، مع حسابات إدارية منشأة مسبقاً فقط. - JWT يتضمن الهوية والدور والمدرسة والمديرية وإصدار التوكن وبصمة الجهاز. - Middleware منفصل للأدوار، وإغلاق مسارات المناهج والفيديو والامتحانات والمدفوعات والإدارة حسب الصلاحية. - جلسة Redis إلزامية؛ لا يوجد تجاوز عند غياب Redis أو مفاتيح التشفير. - تخزين JWT في Keychain/Keystore فقط في التطبيقات المتأثرة. - تشفير الرقم الوطني AES-256-GCM والبحث عبر HMAC blind index، مع سكربت ترحيل للبيانات الموجودة. - ربط ولي الأمر بالأبناء عبر طلب وموافقة، دون الربط التلقائي بأي طالب. - لوحات الإدارة والسوبر أدمن تقرأ قاعدة البيانات ولا تستخدم أرقام مدارس أو طلاب أو دفعات ثابتة. - رفع فيديو المعلم والحصة الميدانية والعينة البانورامية كملف حقيقي إلى R2. - تشغيل الطالب يرفض الدرس الذي لا يملك فيديو حقيقياً؛ أزيل فيديو الاختبار العام. - تقديم الامتحان وتصحيحه ودفتر الأخطاء والتقارير الشهرية تتم من الخادم فقط. - المحادثة تستخدم `auth_identity_id` وتسمح فقط بعلاقة طالب/معلم لها تصريح دورة فعلي. - مبدأ تخزين المحتوى التعليمي المعتمد: قاعدة البيانات تحفظ الفهرس والبيانات الوصفية والحالة والصلاحيات فقط، ولا تحفظ نصوص الكتب أو ملفات HTML أو الفيديو داخلها. - ملفات الكتب بعد استخراجها ومراجعتها (Markdown)، وأوراق العمل، وملفات HTML للتجارب تُحفظ كـ versioned objects في تخزين الملفات الأصلي (R2 أو مساحة تخزين خاصة مكافئة)، وتُستدعى بروابط موقعة ومحددة الصلاحية. - الفيديوهات تُرفع إلى R2 وتُحوّل إلى HLS؛ قاعدة البيانات تحفظ `object_key` و`hls_url` وحالة المعالجة والنسخة فقط. - Redis ليس مخزناً دائماً للمحتوى: يستخدم للجلسات وOTP وrate limits، ولـ cache قصير العمر لشجرة المنهج أو Markdown المتكرر، مع TTL وإمكانية إعادة البناء من R2. - كل درس/وحدة/ورقة عمل/تجربة لها سجل إصدار ومصدر ومراجع وحالة (`draft`, `review`, `published`, `archived`) لمنع عرض ملف غير معتمد. - اختبارات Smoke للتطبيقات الأربعة ناجحة، وتحليل Flutter لا يحتوي أخطاء compile. - فحص syntax لجميع ملفات PHP ناجح و`git diff --check` نظيف. ## المطلوب قبل نشر هذه الدفعة على السيرفر 1. أخذ نسخة احتياطية مشفرة من قاعدة البيانات. 2. تطبيق `backend/migrations/20260908_secure_identity_and_staff.sql` في نافذة صيانة. 3. تطبيق `backend/migrations/20260908_runtime_schema_consolidation.sql` قبل تعطيل Runtime DDL. 4. تشغيل `backend/scripts/backfill_national_id_hash.php` مرة واحدة بمفاتيح الإنتاج الأصلية. 5. إنشاء أول حساب `super_admin` يدوياً بإجراء تشغيل موثّق، ثم إنشاء بقية حسابات الطاقم من السوبر أدمن. 6. ضبط `JWT_SECRET` و`ENCRYPTION_KEY` و`HMAC_SALT` وRedis وNabeh وR2 من مدير أسرار؛ لا توجد قيم افتراضية في الكود. 7. ترحيل جدول المحادثات القديم—إن كان السيرفر ما زال يستخدم `sender_id/receiver_id`—إلى `sender_identity_id/receiver_identity_id` قبل تشغيل المحادثة. 8. اختبار تكاملي على نسخة staging متصلة فعلياً بـMySQL وRedis وNabeh وR2؛ الفحوص المحلية الحالية لا تثبت اتصال خدمات الإنتاج. ## بوابة إثبات الصف العاشر لا يُفتح التوسع لباقي الصفوف حتى ينجح سيناريو حقيقي واحد على الأقل لكل بند: - استيراد كتاب رسمي وربطه بالوحدات والدروس دون خلط صف أو مبحث. - مراجعة بشرية للمحتوى المستخرج قبل النشر. - توليد أسئلة سقراطية مرتبطة بهدف تعلم ومقطع زمني حقيقي. - رفع فيديو R2، تجهيز HLS، تشغيله على جهاز فعلي، وحفظ التقدم. - تقديم امتحان على الخادم، إنشاء محاولة، تحديث الجاهزية، وتسجيل الخطأ. - توليد مسار علاجي حقيقي ثم اعتماد الإتقان من نتيجة خادم، لا من زر في التطبيق. - ظهور النتيجة الصحيحة في لوحة المعلم وولي الأمر والمدرسة والمديرية والسوبر أدمن. - اختبار صلاحيات IDOR: لا يرى أي دور طالباً أو مدرسة أو دفعة خارج نطاقه. - اختبار انقطاع MySQL وRedis وR2 وNabeh والتأكد أن النظام لا يسجل نجاحاً وهمياً. ## العمل المتبقي، بالترتيب ### P0 — جاهزية staging والأمان - إكمال migrations لكل الجداول التي تنشئها الخدمات حالياً وقت التشغيل، وإلغاء Runtime DDL. - إضافة سجل تدقيق أمني immutable وتدوير المفاتيح وإلغاء الجلسات من السوبر أدمن. - إضافة اختبارات API تكاملية للأدوار والنطاق المدرسي والمديرية وربط ولي الأمر. - إضافة رفع صوت حقيقي للمعلم؛ الواجهة الحالية لا تدّعي إرسال صوت إذا لم يوجد ملف. ### P1 — إكمال حلقة الصف العاشر - استكمال واجهة موافقة الطالب على طلب ربط ولي الأمر. - بناء وحفظ الواجبات بدلاً من الواجهة غير المتصلة حالياً. - بناء توليد وتسليم وتصحيح الاختبار العلاجي؛ المسار يرفض حالياً اعتماد إتقان غير موثّق. - مراجعة كل مختبر تفاعلي وإزالة أي أمثلة ثابتة لا تأتي من حزمة درس معتمدة. - ربط مؤشرات Cloudflare Billing ومراقبة uptime؛ اللوحة تعرض صفراً مع ملاحظة عند غياب المصدر. ### P2 — التوسع المنهجي - تحويل إدخال الصف العاشر إلى قالب إصدار: مصدر، نسخة، مراجعة، نشر، rollback. - إدخال الصفوف الأخرى على دفعات، مع نفس اختبارات القبول لكل مبحث. - عدم إظهار صف أو مبحث في التطبيق قبل وجود حزمة منشورة حقيقية له. ### P3 — مؤسسة التدريب المهني - تدقيق التخصصات مع المصدر الرسمي للمؤسسة وعدم تثبيت رقم تخصصات غير موثق. - تجهيز عرض تجريبي واحد متكامل: تخصص، وحدة كفاية، بطاقة عمل، مختبر، تقييم، ولوحة مشرف. - بعد الموافقة، إضافة التخصصات من CMS/ingestion schema موحد دون تعديل بنية التطبيق لكل تخصص. ## تعريف الإنجاز وجود الشاشة أو الـendpoint ليس إنجازاً منفرداً. الميزة منجزة فقط عندما يكون لها مصدر بيانات حقيقي، صلاحية صحيحة، حالة فشل صريحة، اختبار، وسجل يمكن تتبعه من التطبيق حتى قاعدة البيانات أو R2.