Files
saqel/docs/CURRENT_STATE_AUDIT_2026-09-09.md

15 KiB
Raw Permalink Blame History

أين وصلت صَقِل فعلياً؟

تاريخ المراجعة: 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. «المنافسون فيديو سلبي فقط» غير صحيح كادعاء عام: جو أكاديمي يصف دورات فيها أسئلة أثناء الحصة في موقعه الرسمي.
  4. تقديرات الأرباح وحجم السوق ورسوم/إعفاءات الترخيص وأهلية المدرسين والمنح والشراكات في الملفات القديمة لم تُحقق في هذه المهمة؛ لا تُستخدم كحقائق أو إعفاء تلقائي عند التنفيذ التجاري.
  5. ادعاءات 120fps أو زمن 0ms أو تكلفة هامشية صفر تحتاج قياساً؛ R2 بلا رسوم egress لا يعني أن الفيديو وAI والتشغيل بلا تكلفة.

مرجع القرارات الجديدة: مواصفات المرحلة القادمة. ترتيب الإصلاح والقبول: قائمة التنفيذ.