18 KiB
قائمة تنفيذ صَقِل — جلسات Medium قابلة للاستئناف
هذه القائمة هي سجل التشغيل العملي للمحادثات القادمة. النموذج الافتراضي لكل مهمة هو GPT-5.6 Terra على Medium. لا تفتح أكثر من مهمة تنفيذية واحدة في المحادثة الواحدة إلا إذا كانت الثانية لا تمس الملفات أو قاعدة البيانات نفسها. استخدم Sol/Astra للمراجعة النهائية للمال والأمن فقط، بعد اكتمال الاختبارات.
طريقة الاستئناف
في أي جلسة جديدة ابدأ بالنص التالي، ثم نفذ أول مهمة planned اكتملت متطلباتها:
اقرأ AGENTS.md وdocs/MEDIUM_EXECUTION_TASKS.md وملفات المهمة المحددة.
نفذ المهمة فقط، واحفظ تغييرات المستخدم. لا تنشر ولا تتصل بخدمة دفع حية.
حدّث حالة المهمة إلى implemented_unverified أو verified فقط بدليل فعلي.
| الترتيب | المهمة | النموذج/الجهد | يعتمد على | الحالة |
|---|---|---|---|---|
| 00 | تثبيت بيئة الاختبار والأوامر الفعلية | Medium | — | implemented_unverified |
| 01 | إيقاف النجاح المالي والمحتوى البديل الوهمي | Medium | 00 | verified_in_code |
| 02 | هوية المنهج والأصول المنشورة | Medium | 01 | in_progress |
| 03 | حصة المعلم والإصدار والاستبدال الذري | Medium | 02 | implemented_unverified |
| 04 | تدقيق الفيديو والأسئلة من الأدلة | Medium | 02, 03 | in_progress |
| 05 | API صفر/واحد/متعدد واختيار المعلم | Medium | 02, 04 | implemented_unverified |
| 06 | دفتر الحسابات وحجز الرصيد | Medium ثم Sol review | 00, 01 | implemented_unverified |
| 07 | جلسات المشاهدة والدقائق المؤهلة | Medium | 02, 05, 06 | implemented_unverified |
| 08 | تسوية صندوق المعلمين وكشف الحساب | Medium ثم Sol review | 06, 07 | blocked: سياسة تجارية معتمدة |
| 09 | مزود الدفع والبصمة والتحويل | Medium ثم Sol/Astra review | 06 | blocked: مزود دفع/سياسة متجر |
| 10 | الإنجليزية: حزمة الدرس والصوت الموحد | Medium | 01, 02 | in_progress |
| 11 | موارد الدرس وحلقة العلاج وولي الأمر | Medium | 02, 04, 05, 10 | in_progress |
| 12 | المؤسسات والتقييمات والتلعيب | Medium | 02, 05, 07, 11 | implemented_unverified |
| 13 | إثبات الصف العاشر وقرار الإطلاق | Medium ثم Astra review | كل ما يلزم | gate_pending |
قاعدة تحديث قاعدة البيانات
شغّل من جذر المشروع فقط: php backend/scripts/run_migrations.php --status ثم --dry-run، وبعد نسخة احتياطية وstaging نفّذ الأمر دون خيارات. يسجل المشغّل اسم كل migration وSHA-256؛ يرفض تشغيل ملف تغيّر بعد تسجيله. لا تستخدم migrate.php fresh لهذا المسار لأنه قد يحذف قاعدة البيانات.
بطاقات التسليم
00 — خط الأساس
اقرأ backend/public/index.php وbackend/cron/run_scheduled_tasks.php وbackend/composer.json وملفات الاختبار قبل تشغيل أي منها. أنشئ سجلاً لأوامر الفحص الآمنة، ولا تستخدم artisan. أنجز harness اختبارات PHP محلياً لا يحتاج قاعدة إنتاج أو Gemini.
01 — الصدق أولاً
نفذ NP-01 من NEXT_PHASE_EXECUTION_BACKLOG.md: لا تفعيل وصول من صورة إيصال، لا إكمال سحب دون مزود، لا تحويل أرقام المنصة إلى دخل معلم، ولا مستند أو IPA أو درس بديل عند فشل المصدر. أضف migration رسمية لما كان ينشأ وقت الطلب. اختبر فشل الخدمات وحالات عدم توفر الدفع.
02 — هوية المحتوى
نفذ migration لـcurriculum_lesson, content_asset, وإصدار الحزمة. اعتمد IDs ثابتة ولا تطابق بالعنوان أو LIKE. أنشئ endpoint يطلب asset ID فقط ويعيد الأصل المنشور الموافق أو خطأ. اكتب backfill dry-run مع تقرير تعارضات.
03 — نشر واستبدال الحصة
نفذ teacher_submission وvideo_version وقيد حصة أساسية واحدة لكل معلم/درس. أضف Idempotency-Key وقفل/transaction للنشر. البديلة تبقى مرشحة حتى يجتاز فحصها ولا توقف النسخة القديمة.
04 — الفحص السقراطي
طبق VIDEO_REVIEW_AND_SOCRATIC_PROMPTS.md: لا توليد في GET، ولا fallback أسئلة. job يجمع تفريغاً وأدلة وصوراً وMarkdown بإصدارات، ويخضع لـschema validation ومراجعة بشرية. ابن regression fixtures معزولة لا تستدعي AI.
05 — اختيار المعلم
اعرض حصصاً منشورة ومصرحاً بها للدرس المحدد فقط: صفر موارد صادقة، واحد تشغيل مباشر، متعدد قائمة paginated مرتبة بتقييم موثق. المشغل يعمل بـvideo_version ID وليس عنواناً.
06–08 — المال بالدقائق
لا تبدأ قبل تثبيت policy تجارية موقعة. نفذ دفتر الفلس، ثم أحداث مشاهدة غير موثوقة من العميل، ثم توزيع صندوق الفترة وإشعارات معلم تفسيرية. كل تعديل قيد عكسي، وكل سحب حجز ذري. راجع Sol قبل تشغيل أي رصيد حقيقي.
09 — الدفع والبصمة
مهمة محجوبة حتى يحدد المستخدم مزود تحصيل/تحويل حقيقي وقناة التوزيع وسياسة المتاجر. عندها نبني intents، webhooks موقعة، sandbox، تأكيد بصمة مرتبط بتحدٍ، وتسوية. لا يتم تخزين بصمة.
10–12 — تجربة الطالب والمعلم
أعد بناء الإنجليزية من الحزمة المنشورة، لا من قوائم ثابتة. وحّد الصوت ولا تولد IPA/ترجمة. أضف PDF وورقة وخريطتي صور، ثم الحلقة العلاجية، ثم تنظيم المؤسسات والتقييمات.
13 — الإطلاق
اختبر 12 درساً حقيقياً للصف العاشر على staging مع بيانات محكومة. لا توسع قبل دليل مصادر، صحة أسئلة، عودة الطالب بعد أسبوع، ومساهمة تشغيل موجبة. هذه بوابة مراجعة Astra النهائية.
قاعدة التحديث
بعد كل مهمة اكتب في آخر هذه الوثيقة: المهمة، commit/diff، الاختبارات الفعلية، ما لم يختبر، والقرار التالي. لا تحوّل blocked إلى planned دون القرار أو الخدمة المطلوبة.
سجل التنفيذ
2026-09-09 — 00 و01 (implemented_unverified)
- أضيفت
backend/migrations/20260909_payment_safety_hold.sqlلنقل تعريف جداول كليك وطابور السحب من وقت الطلب إلى migration واضحة لا تحذف أدلة مالية عند التراجع. - واجهات كليك والسحب والتسوية المجدولة تعيد حالة عدم توفر ولا تنشئ إيصالاً أو حركة أو وصولاً أو سحباً. لوحة المعلم لا تستنتج دخلاً أو رصيداً من عدد المشتركين أو أسعار الدورات.
- حذف مصدر Markdown التجريبي؛ طلب المستند يحتاج مسار Markdown دقيقاً داخل تخزين المنهج، وفشل المصدر يعرض حالة صادقة. تشغيل الفيديو أصبح للقراءة فقط ولا يولد نقاط فحص من العنوان أو المنهج العام.
- فحوص شُغلت:
php -lللملفات PHP المعدلة، وgit diff --check، وflutter analyzeللتطبيقين. لم يظهر خطأ في الملفات المعدلة؛ توجد تحذيرات قديمة غير مانعة في المشروعين. - لم تُنفذ migration على قاعدة بيانات، ولم تُشغّل اختبارات تكامل بقاعدة معزولة أو مزود دفع؛ لا تنشر هذه الدفعة قبل تنفيذ ذلك.
- الخطوة التالية: ابدأ 02 بهوية محتوى وأصول منشورة؛ بعدها فقط ابدأ 03 و04.
2026-09-09 — 02 (implemented_unverified)
- أضيفت migration
20260909_curriculum_publication_identity.sqlلجداول هوية الدرس، bundle النشر، الأصل ذي checksum، وربط الأصول بالحزمة. الاستيراد لا ينشر شيئاً تلقائياً. - أضيف
GET /api/curriculum/assets/{assetId}للطالب المصرح؛ يقبل UUID فقط ويقرأ أصلاً محلياً approved من bundle منشور فقط. لا يستقبل مسار ملف من المستخدم. - أضيف
backend/scripts/backfill_curriculum_identity.php: افتراضياً dry-run بلا اتصال DB، و--applyينشئ طابور مراجعة draft/unverified ضمن transaction فقط بعد تطبيق migration وحل التعارضات. - نتيجة dry-run المحلية: 74 سجل manifest، 55 ملفاً محلياً قابلاً لطابور المراجعة، و19 مرجعاً بلا ملف. لا يوجد تعارض هوية تلقائي؛ المراجع الناقصة مدرجة في تقرير الأمر.
- فحوص شُغلت: PHP lint للخدمة/المتحكم/route/script و
git diff --check. لم تطبق migration ولم يشغّل--apply. - الخطوة التالية: 03، بناء حصة المعلم ونسخة الفيديو والاستبدال الذري فوق
curriculum_lessons.
2026-09-09 — 03 (implemented_unverified)
- أضيفت migration
20260909_teacher_submission_versions.sql: قيد فريد للمعلم والدرس المنهجي، نسخ فيديو مرشحة مرقمة، مؤشر منفصل للنسخة المنشورة، ومفاتيح idempotency. - أضيف مسار
POST /api/teacher/submissions/preflightمعIdempotency-Key. الحصة الثانية تعيد409 existing_submission؛ الاستبدال يتطلب هدف الحصة الحالية وينشئ candidate جديداً فقط. - رفع الفيديو المباشر صار يتطلب
video_version_idمن preflight ويحجز النسخة atomically من draft إلى uploading قبل تخزين الفيديو. بعد الرفع ترتبط بالدرس القديم بوصفهاreview؛ لا تنشر ولا تستبدل النسخة الحالية تلقائياً. - فحوص شُغلت: PHP lint للخدمة والمتحكم والـroute و
git diff --check. - لم تطبق migration ولم ينفذ اختبار تزامن أو transaction على MySQL. تطبيق المعلم لا يمرر بعد
curriculum_lesson_id/video_version_idلأنه يحتاج تشغيل backfill ومراجعة/نشر هوية الدروس أولاً؛ لذلك الرفع القديم يرفض صراحة بدلاً من تجاوز القيد. - الخطوة التالية: 04، job تدقيق الفيديو من التفريغ وMarkdown وإصدار النسخة، ثم نشر ذري للنسخة التي اجتازت المراجعة.
2026-09-09 — إدارة migrations و04 (in_progress)
- أضيف
backend/scripts/run_migrations.phpكمشغل موحد للمجلدbackend/migrationsمع أوضاع status وdry-run وapply وسجل checksum. - أضيفت migration
20260909_video_review_jobs.sqlلسجل job وتقرير مراجعة بشرية؛ لا يوجد فيها نشر آلي أو توليد أسئلة تلقائي.
2026-09-09 — 04 و05 (implemented_unverified، تكامل الواجهة مؤجل)
- أضيفت
video_review_evidenceمع مسار إداريPOST /api/admin/video-review/evidence. لا ينتقل job إلى مراجعة بشرية قبل تفريغ زمني معتمد ودليل بصري معتمد وسجل تغطية متصل؛ ولا يقبل قرار الموافقة أو النشر من دون هذا السجل. - أضيفت
GET /api/curriculum/lessons/{lessonId}/videos: يعتمد UUID الدرس، يعرض النسخ المنشورة فقط، ويرشح كل صف بصلاحية الطالب قبل كشف الاسم أو التقييم أو العدد. لا يحدث هذا الاستعلام بيانات الطالب أو تصريحاته أثناء التصفح. - نقطة التشغيل الجديدة
GET /api/video-versions/{versionId}/playbackتتحقق من صلاحية النسخة المنشورة والصلاحية الدراسية قبل توقيع البث. أسئلة الفيديو تبقى فارغة إلى أن تنشر من مسار الأدلة والمراجعة. - أزيل DDL من طلبات المعلم والمنهج والامتحان؛ أصبحت hooks التوافقية no-op وتحتاج البيئة إلى
run_migrations.phpقبل الخدمة. أزيلت قيم السمعة والإنجاز الافتراضية من واجهات المعلم والطالب وولي الأمر ومن HDDL، مع migration تصحح defaults للبيئات الموجودة. - فحوص شُغلت:
php -lعلى كل PHP فيbackend/appوbackend/scriptsوbackend/cron(ناجح)، وgit diff --check(ناجح). محاولةphp backend/scripts/run_migrations.php --dry-runلم تبدأ لأن البيئة المحلية بلا.envوENCRYPTION_KEY. - لم يكتمل بعد: Flutter ما زال يستدعي
/api/lessons/playbackلأن شجرة المنهج الحالية لا تحمل UUID الدرس المنشور. لا تربطه بالـAPI الجديد إلا بعد تطبيق migrations وbackfill ومراجعة/نشر bundles حقيقية؛ عندها نفذ حالة صفر/واحد/متعدد فيsubject_hub_screen.dartثم مررvideo_version_idإلى المشغل. - الخطوة التالية: 06 بعد سياسة دخل موقعة، أو تنفيذ واجهة اختيار المعلم فور توافر UUIDs منشورة على شجرة المنهج.
2026-09-09 — 05 و07 و10 (implemented_unverified)
- شجرة المنهج تثري الدروس من قاعدة البيانات بعد migrations/backfill فقط بـ
curriculum_lesson_idوhas_videoالمنشور. لا تعيد مساراً بديلاً عندما لا تكون الهوية منشورة. - تطبيق الطالب يستخدم
/api/curriculum/lessons/{lessonId}/videosثم/api/video-versions/{versionId}/playback: حصة واحدة تفتح مباشرة، وأكثر من حصة يظهر لها اختيار معلم صريح بالتقييم الموثق وعدد التقييمات. أزيل استدعاء/api/lessons/playbackالقائم على العنوان من التطبيق. - أضيفت جلسة المشاهدة:
POST /api/video-versions/{id}/watch-sessionsثم أحداث متسلسلة. يحتسب الخادم interval متصلاً من heartbeat فقط، بمقارنة زمن الخادم وموضع العميل وحدود صارمة؛ لا ينشئ ذلك رصيداً أو تسوية أو دخل معلم. - أضيف
TeacherLedgerServiceلعرض الرصيد بالفلس وحجز السحب idempotently من رصيد دفتر قائم فقط. لا توجد واجهة حجز أو تسوية مفعلة ولا أي سياسة سعر/صندوق مختلقة. - أزيل مختبر الإنجليزية الثابت وما فيه من IPA ومفردات وصوت غير موثقين. أضيف
GET /api/curriculum/lessons/{lessonId}/english-packageالذي يقرأ حزمة إنجليزية منشورة فقط ومفرداتها وصوتها approved؛ الواجهة تعرض حالة انتظار صادقة إلى أن تُزرع الحزم المعتمدة. - فحوص شُغلت: PHP lint كامل لـ
backend/appوbackend/scriptsوbackend/cron، وgit diff --check، وFlutter analyze لملفات الطالب المعدلة؛ كلها ناجحة. - لم تُطبق migrations أو تختبر المعاملات على MySQL لأن
.envوENCRYPTION_KEYغير متاحين محلياً. كما أن 06–08 لا يجوز تفعيلها أو حساب توزيع مالي قبل سياسة دخل موقعة، و09 ما زالت محجوبة بتحديد مزود دفع/تحويل فعلي. - الخطوة التالية تلقائياً: نفذ migrations على staging مع backup، شغّل backfill dry-run ثم راجع الـ19 مرجعاً الناقصاً، وانشر bundles وحزم إنجليزية حقيقية للصف العاشر. بعدها اختبر مسارات صفر/واحد/متعدد وجلسات المشاهدة بتكامل MySQL قبل أي نشر.
2026-09-16 — تحديث شامل واعتماد دفتر المتابعة (PLATFORM_EXECUTION_LEDGER.md)
- تم إنشاء وثيقة «دفتر متابعة وتنفيذ مهام منصة صَقِل» (
docs/PLATFORM_EXECUTION_LEDGER.md) لتكون السجل الحي لمتابعة جميع المهام من NP-00 إلى NP-13. - فحص بوابة القبول
validate_grade10_candidate.php --manifest=manifest.accepted.json: اجتاز الفحص بنجاح تام (0 errors, 581 warnings). - تم إنجاز وتثبيت المكونات التالية:
- نافذة التفكير السقراطية (60 ثانية)
ScaffoldedThinkingPauseSheetمع التدريج المعرفي خطوة بخطوة. - واجهة اختيار المعلم
TeacherSelectionSheetبالفرز التنازلي للتقييم الحقيقي وعدد التقييمات. - دفتر الأخطاء الذكي والكويز العلاجي في الخادم وتطبيق الطالب.
- منظومة طلب وموافقة ولي الأمر مع حماية الرقم الوطني بالـ Blind Index.
- 18 مختبراً تفاعلياً مدمجاً (12 لغة عربية + 6 فيزياء) و371 مواصفة مختبر للصف العاشر.
- نافذة التفكير السقراطية (60 ثانية)
- الخطوة التالية: ربط Preflight في واجهة المعلم وتفعيل خوارزمية التكرار المتباعد في دفتر الأخطاء الذكي ونشر الـ 12 درساً التجريبية.