# أين وصلت صَقِل فعلياً؟ تاريخ المراجعة: 2026-09-09. نقطة الكود: `432ca50`. المراجعة قراءة للكود والتوثيق والملفات المحلية؛ ليست اختبار تشغيل للإنتاج، ولا اتصالاً بقاعدة بيانات السيرفر أو R2 أو البنك. لم تتغير التطبيقات أو الخادم في هذه المهمة. ## الحكم التنفيذي هناك أساس برمجي واسع: أربعة تطبيقات Flutter، مسارات هوية وأدوار، شجرة منهج، رفع وتشغيل فيديو، امتحانات ودفتر أخطاء، لوحات معلم ومؤسسات. لكن وجود هذه الأجزاء لا يثبت اكتمال حلقة التعلم أو صحة المال. الحالة المناسبة: **منتج قيد التكامل والتحقق، يحتاج إثباتاً محدوداً على الصف العاشر قبل إطلاق تجاري**. لا نعتمد نسبة جاهزية أو TRL من عدد الشاشات. التوثيق السابق بالغ في وصف إزالة الديمو، شمول فحص الفيديو، اكتمال المحتوى، وصحة العمليات المالية. الجدول التالي يصحح ذلك في حدود المسارات التي قرئت. ## الأدلة والفجوات المسارات أدناه نسبية إلى جذر المشروع، وأسماء الدوال أدلة مستقرة للبحث حتى عند تغير أرقام الأسطر. | ID | المجال | ما يظهر في الكود | الأثر والعمل المتبقي | |---|---|---|---| | A01 | التطبيقات والهوية | أربعة مجلدات تطبيقات، وMiddlewares للأدوار في `backend/app/Middlewares/`، ومجموعات routes في `backend/public/index.php` | أساس موجود؛ نجاح العزل بين مدرسة وأخرى وبين الأدوار يحتاج اختبارات تكامل فعلية. التدقيق الحالي لا يعيد إثبات نتائج الاختبارات القديمة. | | A02 | بوابة رفع الفيديو | `AiVideoAnalyzerService::auditUploadBeforeStorage` يفحص MIME والصوت/الصورة والمدة ثم يرسل **صورة واحدة** عند ثلث الفيديو للنموذج | هذا فحص أولي، لا فحص للحصة كاملة ولا مطابقة للكتاب أو الصوت. الحد الحالي 25 دقيقة قرار برمجي، وليس معياراً علمياً عاماً موثقاً. | | A03 | الأسئلة السقراطية | `generateAnalysis` يستقبل العنوان والمدة و`core_topics`؛ الطلب للنموذج نص فقط، بأمثلة توقيتات 180 و360 ثانية | لا تفريغ زمني ولا Markdown كامل ولا فيديو في هذا الطلب. عبارة «اسأل عما سبق» وحدها لا تجعل السؤال مستنداً للحصة. | | A04 | سياق المنهج | `CurriculumService::getCurriculumContext` يطابق عنوان الدرس في الشجرة ويرجع `lesson_file` وoutcomes؛ لا يقرأ الملف هنا، ولا يستخدم `courseId` لتقييد المطابقة | احتمال اختيار درس متشابه الاسم. يجب جلب نسخة المحتوى بهوية ثابتة وتمريرها كاملة لمسار التدقيق. | | A05 | نجاح بديل مصطنع | `buildGroundedCurriculumAnalysis` يولد أسئلة وتوقيتات ثابتة/نسبية عند تعذر AI | المحتوى قد يكون صحيحاً علمياً لكنه غير مثبت في الفيديو. بعض الخيارات العامة يمكن أن تتكرر إذا كان موضوع واحد فقط. يمنع نشره بوصفه فحصاً للحصة. | | A06 | تقييم الجودة | `evaluatePedagogicalQuality` يطلب درجات باستخدام العنوان والمواضيع والمدة، مع مثال 97/95 وحالة `approved_official` | لا دليل لتقييم وضوح الشرح أو ادعاء اعتماد رسمي. درجات النموذج لا تكون تصريح نشر ولا اعتماداً من الوزارة. | | A07 | تغييرات أثناء القراءة | `VideoController::getPlaybackData` قد يحذف أسئلة بناء على كلمات، ثم يعيد توليدها عند فتح الفيديو | طلب القراءة يغير المحتوى، وقد يغيّر مرجع محاولات الطالب. التوليد والتنقيح يجب أن يكونا وظائف إصدار قبل النشر. | | A08 | نسخ المعلمين | `uploadDirect` ينشئ سجلاً جديداً في `lessons`؛ لا يظهر فيه قيد منع حصة ثانية لنفس المعلم والدرس أو استبدال ذري | مطلوب فصل الدرس المنهجي عن حصة المعلم وإصدار الفيديو وقفل/قيد قاعدة بيانات ضد التزامن. | | A09 | ربط المبحث | اختيار الدورة تلقائياً في `uploadDirect` يبحث بمعلم وصف فقط، دون تقييد المبحث في استعلام الدورة الموجودة | قد ترتبط مادة ثانية بدورة المادة الأولى للمعلم نفسه. هذه فجوة يجب إصلاحها مع الهوية المنهجية. | | A10 | اختيار معلم الحصة | `_showLessonVideoSelector` في `subject_hub_screen.dart` يفتح المشغل مباشرة باسم منصة عام؛ `getPlaybackData` يبحث بـLIKE والعنوان ويرجح أول فيديو، بحدود بحث `LIMIT 5` | سياسة صفر/واحد/متعدد حسب الحصص المسموحة غير منفذة. يلزم endpoint قائمة محدد للدرس ومرتب بالتقييم، ثم تشغيل `video_version_id` المختار بالضبط. | | A11 | الإيصال | `CliqPaymentService::verifyPaymentReceipt` يصنع بيانات استخراج من الطلب نفسه، وقد يولد رقم حركة عشوائياً، ثم يضع `verified` ويفعّل تصريح الطالب | **P0 مالي:** ليست مصادقة بنكية ولا OCR موثوقاً. لا يُستخدم لتفعيل شراء حقيقي قبل إصلاحه. | | A12 | السحب | `requestTeacherPayout` يتحقق من الحد الأدنى والمعرّف؛ `processPayoutQueue` يضع `completed` مع مرجع عشوائي دون استدعاء تحويل ظاهر في الدالة | **P0 مالي:** لا حجز رصيد محاسبي ظاهر، ولا دليل تسوية بنكية. واجهة طلب السحب لا تثبت إرسال المال. | | A13 | دخل المعلم | `TeacherController::getMonetizationDashboard` يجمع الطلاب والإيصالات المعتمدة على مستوى المنصة، ثم يحسب 55%/15%/30%؛ `teacher_monetization_cubit.dart` يحتوي بديلاً `paidCount * 20.0` | **P0 محاسبي/نطاق:** القيم ليست دخل المعلم بحسب دقائق حصصه، وتوجد قيمة تقديرية غير معنونة. النسب القديمة ليست قرار المستخدم الجديد. | | A14 | دقائق المشاهدة | `VideoController::saveProgress` يستقبل `watched_seconds`/position من العميل ويحفظ أعلى قيمة | يصلح كبداية لتقدم المشاهدة، ولا يصلح دفتر استحقاق مالي. لا توجد في المسارات المقروءة سلسلة أحداث ماليّة موثوقة تمنع replay أو التداخل. | | A15 | البصمة | البحث عن `local_auth` وbiometric/Face ID/passkey في التطبيقات والخدمات لم يظهر تدفقاً للدفع والسحب | ميزة مطلوبة لاحقاً، ليست منفذة بناءً على هذه المراجعة. نجاح البصمة لن يعوض غياب تكامل دفع. | | A16 | التقييمات | `TeacherRatingService` لديه أوزان وكشف تقييمات سلبية متجمعة؛ وزن الطالب يعتمد على امتحاناته عموماً، والتحديث مفتاحه معلم+طالب | لا يثبت أنه شاهد هذه الحصة، ولا يعالج التلاعب الإيجابي بشكل مكافئ. مطلوب تقييم موثق للحصة وعدالة للمعلم الجديد وعدم معاقبة نقد صادق. | | A17 | مستند خاطئ بدل المفقود | `CurriculumController::getDocumentContent` قد يختار أول ملف للمادة، ويتجاوز PDF، أو يرجع مستنداً ثابتاً مع success | لا يمكن اعتبار هذا إثباتاً لعرض كتاب/ورقة العمل المطلوبة. الملف المفقود يجب أن يبقى مفقوداً مع بدائل مسماة بوضوح. | | A18 | محتوى محلي بديل | `curriculum_document_viewer_screen.dart::_loadDocumentContent` يرجع إلى `CurriculumBakedData` بعد فشل الطلب/مهلة 3 ثوان؛ يوجد استعمال أيضاً في `subject_hub_screen.dart` | إزالة هذا المسار تختلف عن حذف cache لملف حقيقي. يجب الاحتفاظ فقط بنسخة منشورة مثبتة الهوية والإصدار. | | A19 | الإنجليزية | `english_interactive_lab_view.dart` يعرف وحدات وقواعد ثابتة؛ درس الوحدة الأولى في Markdown يعرض Present Simple/Continuous بينما تنظيم المختبر يحيل للمضارع التام/الماضي البسيط | ازدحام المحتوى ومطابقة غير سليمة بين المختبر والدرس. يجب اشتقاق الشاشة من حزمة الدرس، لا قائمة موازية. | | A20 | القاموس والصوت | `EnglishReadingService::_generateDynamicEntry` يصنع معنى عاماً وIPA بصيغة `/$clean/`؛ الصوت من TTS الجهاز واختيار الاسم، ومشغل آخر يستخدم FlutterTts مستقلاً | **P0 دقة تعليمية:** يمنع تقديم تخمين كنطق موثق. الصوت الحالي غير موحد الجودة، وقد تتزاحم المشغلات. | | A21 | الصفوف المتاحة | `CurriculumRepository::getAvailableGrades` يعيد كل الصفوف عند غياب نتيجة متاحة | يخلق انطباع محتوى جاهز دون حزمة منشورة. غياب الخادم/المحتوى يحتاج حالة صريحة. | | A22 | بقايا إضافية | أمثلة ثابتة في مختبر العربية، `VideoService` يحتوي فرع `is_mock` في مسار Bunny القديم، و`StudentPortal.php` فيه `triggerCheckpointDemo` | مطلوب تتبع قابلية الوصول لكل مسار قبل الحذف. لا يعني وجود كلمة sample أن كل مثال تعليمي وهمي. الواجهات الويب ضمن مراجعة الديمو أيضاً. | | A23 | تخزين المحتوى | `saveLessonContent` و`AiLessonEnhancerService` يكتبان نصوصاً/ملخصات في `lessons`، مع ملفات محلية وR2 في مسارات أخرى | سياسة «metadata فقط في SQL» ما زالت هدف ترحيل، وليست حقيقة مكتملة. يلزم توحيد المصدر دون فقد المحتوى الحقيقي. | | A24 | الاختبارات | توجد اختبارات Widget لكل تطبيق وبعض سكربتات PHP. `test_notebooklm_prompt.php` يرسل `hello` إلى API، و`composer.json` لا يعرّف PHPUnit، ولم يظهر `artisan` | هذا السكربت اختبار اتصال، لا اختبار جودة للبرومبت. أمر `php artisan test` في README ليس مساراً مثبتاً لهذا المستودع. يلزم harness تكامل واختبارات قبول حقيقية. | ## جرد المحتوى المحلي الجرد آلي للملفات في `backend/storage/curriculum`، وليس شهادة بأصالتها أو اكتمال الكتب: | المبحث | عدد ملفات Markdown للصف العاشر | |---|---:| | الرياضيات | 26 | | الفيزياء | 11 | | الإنجليزية | 16 | | العربية | 1 | | التربية الإسلامية | 1 | | التاريخ | 1 | | الإجمالي | 56 | بعض الملفات مقدمات واختبارات وإثراء، لذلك العدد لا يساوي عدد الدروس. يحتوي manifest على 58 إشارة ملفات؛ اثنتان غير موجودتين محلياً: كتاب طالب الفيزياء PDF وكتاب الأنشطة PDF. عدد PDF المحلي في هذا المجلد صفر. لا يستنتج من ذلك غياب الملفات عن السيرفر البعيد؛ لم يُفحص في هذه المهمة. لم تظهر منظومة أصول صور منشورة لخريطة كل درس ووحدة في الجرد المقروء. توجد 5 وحدات إنجليزية في الملفات، لكن اسم الكتاب/طبعته ومرجعية نصوصه يحتاجان مطابقة مع PDF الرسمي؛ تسمية `Action Pack 10` في التعليقات لا تكفي للإثبات. في التجربة نبدأ بالرياضيات والفيزياء والإنجليزية، وننشر فقط الدروس التي اكتملت مراجعتها. ## ما بقي من التوثيق السابق ولم يُثبت اكتماله هنا - تشغيل migrations وتجربة MySQL وRedis وNabeh وR2 على staging حقيقي. - إكمال موافقة الطالب على ربط ولي الأمر، الواجبات المتصلة، والاختبار العلاجي الذي يسجل نتيجة خادم. - استكمال إزالة Runtime DDL، التدقيق الأمني، إلغاء الجلسات وتدوير المفاتيح. - رفع الصوت الفعلي، مراجعة المختبرات، ومؤشرات التكاليف والمراقبة من مصادر حقيقية. - التحقق من الصلاحيات لجميع قنوات الرفع والاستيراد والقراءة؛ لا يكفي إصلاح route واحد وترك worker أو واجهة ويب تتجاوز السياسة. هذه قائمة عمل تحتاج إعادة تحقق وقت التنفيذ، وليست نتائج اختبارات أجريت اليوم. ## تعارضات التوثيق التي لا تُورّث للنموذج القادم 1. «إزالة جميع بيانات الديمو» لا تتفق مع A05 وA11–A13 وA17–A22. 2. «المنهج مكتمل وأصيل 100%» لا تثبته الملفات المحلية أو provenance؛ المطلوب مراجعة إصدار ومصدر. 3. «المنافسون فيديو سلبي فقط» غير صحيح كادعاء عام: جو أكاديمي يصف دورات فيها أسئلة أثناء الحصة في [موقعه الرسمي](https://www.joacademy.com/). 4. تقديرات الأرباح وحجم السوق ورسوم/إعفاءات الترخيص وأهلية المدرسين والمنح والشراكات في الملفات القديمة لم تُحقق في هذه المهمة؛ لا تُستخدم كحقائق أو إعفاء تلقائي عند التنفيذ التجاري. 5. ادعاءات 120fps أو زمن 0ms أو تكلفة هامشية صفر تحتاج قياساً؛ R2 بلا رسوم egress لا يعني أن الفيديو وAI والتشغيل بلا تكلفة. مرجع القرارات الجديدة: [مواصفات المرحلة القادمة](NEXT_PHASE_MASTER_SPEC.md). ترتيب الإصلاح والقبول: [قائمة التنفيذ](NEXT_PHASE_EXECUTION_BACKLOG.md).