منصة حمدان التعليمية مخطط المعمارية وتدفق البيانات — SNAP-20260710-2052 · P2 W0/W1

كل عقدة وكل سلك مستخرجان آلياً من الكود عبر tools/extract_features.py — الأسلاك الباهتة مفترَضة (اتجاه غير مثبت بفعل صريح)، والمتقطعة الحمراء مسار خطر مسجَّل في سجل المخاطر، والمنقّطة الرمادية ميتة/معطّلة معروضة ليُقرَّر فيها.

ثلاثة تطبيقات، قاعدة حقيقة واحدة

المنصة ثلاثة مستودعات مستقلة تتشارك مشروع Supabase واحداً (oikxumknibvcyxbtvqmq) كمصدر الحقيقة الوحيد. هذه الصفحة تعرض المعمارية الحيّة وتدفق البيانات — مبنية على تدقيق ساكن كامل (63 ميزة، 28 مصدراً، 17 نواة).

3مستودعات + Supabase
17نواة قانونية موثقة
28مصدر بيانات
16نوع حدث/إشعار
53RPC/Edge خارجية
15خطر مسجَّل
الطالب (SPA) البوت (Python) الأدمن (Panel) Supabase (الحقيقة) خدمات خارجية مسار خطر
القاعدة الحاكمة: localStorage للطالب والأدمن = كاش/جلسة عرض فقط. كل قرار أمني (حدود الأجهزة، حالة الفاتورة، اعتماد القوالب) يُتَّخذ خادمياً في Supabase — الواجهة عرضٌ للقرار لا مصدره.

النوى القانونية الـ17 — الكتّاب الوحيدون لكل مورد

كل مورد له «نواة» واحدة تمر منها كل كتابة. الدليل الكامل في contracts/.

◆ البوت

sender_engine

المسار الوحيد لكل إرسال طلابي: بوابة + معدّل + هوية Business + سجل.

template_gate

بوابة الاعتماد fail-closed (مثبت تجريبياً).

automation_worker

المستهلك الوحيد لطابور tg_event_queue كل 30ث.

request_notification_service

نموذج الليدجر الدائم المرجعي (يُعمَّم في W2).

broadcast_engine

البث بليدجر مستلمين دائم + استئناف keyset.

◆ Supabase — SQL/Edge

billing_recompute_invoice_state

الكاتب الوحيد لحالة الفاتورة (تُشتق من الدفعات، قفل صف).

‎_ilc_/iron_/admin_bulk_

التحكم الإداري + token bump للطرد ≤10ث.

content-catalog + ‎_cc_sync_

فهرسة موحّدة + تريجرات توافق عكسية.

record_watch_progress ×2

الكاتبان الوحيدان لتقدم المشاهدة.

tg_template_set_review

اعتماد ذرّي — jsonb ok:false لا استثناء.

fingerprint-verify + policy

القرار الجهازي الخادمي الوحيد.

◆ العميل

establishStudentSession

البوابة الوحيدة لجلسة الطالب.

honest-ui-core

كاشف رفض RLS الصامت (ZERO_ROWS) — إلزامي لكل كتابة أدمن.

billing-bridge-core

جسر الفوترة الموحّد (rollback مفحوص).

enroll-engine

الأمر القانوني للالتحاق (6 مصادر).

content-catalog + عقد MV

عرض محتوى الطالب عبر مهايئ موحّد.

registerHomeTile + StatsHub

مربعات الرئيسية + القارئ الإحصائي للطالب.

تدفقات البيانات الخمسة الحرجة

اقرأ كل تدفق من اليمين لليسار (اتجاه الأسهم). اللون العلوي = المكوّن المسؤول.

① دخول الطالب

القرار الجهازي خادمي بالكامل قبل أي مفتاح جلسة.
1
المتصفح
handleLogin()
2
تحقق الهوية
rpc verify_password
3
البوابة الموحّدة
establishStudentSession
4
قرار الجهاز
fingerprint-verify → verify_student_device_limit
5
كتابة الجلسة
h_token · showApp

② الدفع (Moyasar)

الحالة تُشتق من الدفعات عبر النواة — لا كتابة paid مباشرة.
1
صفحة الدفع
pay-share.html
2
بدء الدفع
Edge billing-start-payment
3
بوابة الدفع
Moyasar
4
تحقق + دفعة
verify-moyasar → billing_payments
5
إعادة الحساب
trigger → billing_invoices.status
6
تحديث حي
Realtime → الطالب

③ إشعار تلجرام

تريجر → طابور → عامل → بوابة → محرك → هوية Business → تلجرام.
1
تريجر الفاتورة
invoice.auto_created
2
الطابور
tg_enqueue → tg_event_queue
3
العامل
automation_worker (30ث)
4
البوابة
template_gate
5
المحرك
sender_engine · biz_kwargs()
6
تلجرام
Bot API → الطالب

④ تتبّع المشاهدة

RPC واحدة هي الكاتب الوحيد؛ الإحصائيات من نفس المصدر.
1
تشغيل الفيديو
openVideo (3 لفافات)
2
المتتبّع
watch-tracker.js
3
كتابة ذرّية
rpc record_watch_progress
4
التجميع
course_watches · watch_daily_stats
5
القراءة
StatsHub

⑤ التحكم بالجهاز (طرد إداري)

قرار الأدمن يرفع التوكن خادمياً، وإعادة فحص الطالب تنفّذ الطرد.
1
إجراء الأدمن
iron_ / admin_bulk_
2
النواة
_ilc_ (معاملة واحدة)
3
رفع التوكن
token_version + 1
4
إعادة الفحص
ironRecheck كل 90ث
5
الطرد
forceLogoutClient (≤90ث)

ناقل الأحداث — 16 نوعاً

من يُنتج كل حدث، وهل يمر بطابور/ليدجر دائم أم يُرسل مباشرة. الليدجر الدائم (4 مسارات) هو النمط الآمن ضد التكرار.

الحدثالمُنتِجالطابور / الليدجرمحلّل الجمهور
invoice.auto_createdتريجر الفاتورةtg_event_queuestudent من الفاتورة
invoice.daftra_createddaftra pollertg_event_queuestudent من metadata
smart.new_videosmart_schedulertg_event_queuetg_resolve_playlist_audience
smart.daily_encouragementsmart_scheduler 16:00tg_event_queueجمهور نشط
smart.weekly_reportsmart_scheduler الخميسtg_event_queueجمهور
request.notificationrequest_notification_serviceليدجر دائمstudent من الطلب
fingerprint.alertfingerprint/serviceليدجر دائمtg_fp_admin_targets
broadcast.campaignbroadcast_handlersليدجر دائمtg_resolve_audience
wafeq.batch_invoicewafeq_send_batchليدجر ذرّيقائمة الدفعة
auth.login_otpweb_serverمباشرstudent
auth.password_resetweb_serverمباشرstudent
exam.announceexam_endpointsمباشر · بلا بوابةجمهور مباشر
quick.custom_sendquick_send_endpointsمباشرstudent محدد
keyword.replyhandlersمباشرالمرسِل
owner.exec_reportdaily/exec/briefingمباشرOWNER_USER_ID

مصادر الحقيقة — 28 مصدراً

Supabase مصدر الحقيقة الوحيد. SQLite بالبوت طبقة مستقلة لثلاثة جداول. localStorage/SWR كاش عرض لا قرار.

👤 students

الطلاب + الهوية + token_version.

🎬 course_watches

كاتب وحيد record_watch_progress.

🧾 billing_invoices

الحالة مشتقة لا تُكتب مباشرة.

💳 billing_payments

مصدر اشتقاق حالة الفاتورة.

📱 student_devices

قرار الحد عبر verify_student_device_limit.

📨 tg_event_queue

tg_dequeue_pending (خارجي).

📋 tg_message_templates

تولد موقوفة.

🗂 content_catalogs

+ تريجرات توافق عكسية.

📊 content_watch_progress

مشاهدة المواد التطويرية.

🔗 telegram_links

ربط telegram_user_id ↔ الطالب.

💬 tg_conversation_log

+ tg_student_health + tg_crisis_alerts.

📈 stats_* RPCs

بعضها مفتوح لـanon (خطر).

📝 request_notification_events

الليدجر المرجعي.

🛡 fp_notification_events

ليدجر تنبيهات البصمة.

📢 tg_broadcast_*

حملات + مستلمون (ليدجر).

🗃 SQLite (بوت)

replies · admin_config · message_log.

أعلى 12 خطراً مسجَّلاً (بالأولوية)

النموذج: reachability × severity × likelihood × blast_radius. بنود P0/P1 = رقعة أمنية مستقلة بموافقة منفصلة.

#المعرّفالخطرالشدّةالأولوية
1R-BOT-OWNERربط البوت كـBusiness يضيف مالكاً كاملاً بلا allowlistP0
75.0
2R-SEC-IDENTITYهوية bearer-UUID قابلة للانتحال عبر anonP0
67.5
3R-BOT-PASSWORDكلمة مرور لوحة البوت مضمّنة بالكودP0
64.0
4R-BOT-WEBHOOKسرّ webhook واحد + CORS يعكس أي OriginP0
60.0
5R-BOT-EXAM-RAWexam_announce بثّ خام + فحص سرّه fail-openP1
54.0
6R-EDGE-UUIDحدود Edge حسّاسة تصادق بترويسة UUID خامP1
40.8
7R-DATA-NO-BASELINEلا schema baseline: جداول النواة + 40 RPC بلا CREATEP1
36.0
8R-STU-REG-BYPASSمسار التسجيل يتجاوز البصمة ويكتب الجلسة مباشرةP2
27.0
9R-SEC-EXEC-ANON14 دالة قيادة مفتوحة لـanon تُرجع إيراد/ذممP2
25.6
10R-STU-SDL-SWALLOWغلاف SDL يبتلع الطرد القسري لطلاب multi-deviceP2
25.2
11R-BOT-GATE-FAILOPENأغلفة استدعاء البوابة fail-open عند الاستثناءP2
24.3
12R-UIPERF-RT-XLEAKقنوات الطالب المالية بلا فلتر خادمي (UNKNOWN حي)P2
16.0

فرص التطوير — اربط ما هو موجود لتحصل على ميزة جبّارة

كلها تربط مكوّنات موجودة فعلاً (جداول/نوى/أحداث) لتنتج قيمة أكبر. مرتّبة بنسبة القيمة إلى الجهد.

🚨 نظام إنذار مبكر للتعثّر

قيمة عالية · جهد متوسط
course_watches+billing_invoices+tg_crisis_alerts
حدث جديد student.at_risk عبر النواة القائمة
دالة مجدولة تدمج: هبوط المشاهدة + فاتورة متأخرة + كلمة أزمة ⇒ قالب تدخّلي موقوف للمراجعة. كل القطع موجودة.
يبني على: automation_workerمخاطر: لا مسار إرسال جديد

📤 مركز الرسائل الموحّد (Outbox)

أساسي · W2
request_notification_eventssender_engine
تعميم نمط الليدجر claim/finalize على كل الإرسال
اليوم 4 مسارات فقط بليدجر دائم؛ البقية نافذة ذاكرة تسقط عند إعادة التشغيل. التعميم يعطي منع تكرار مضموناً + استرداد العالق. حجر أساس لكل ما بعده.
يبني على: النموذج موثق في contracts/يفتحه: عقد tg_dequeue_pending

🎯 توصية المحتوى الذكية

قيمة عالية · جهد متوسط
content_watch_progress+content_catalogs
بطاقة «التالي لك» + عرض ترقية موقوت
أنهى 92% من مادة ⇒ اقتراح التالية عبر legacy_ref؛ أنهى مجانية ⇒ عرض المدفوع ذي الصلة. بلا أي جدول جديد.
يبني على: عقد MVواجهة: registerHomeTile

🛡 لوحة أمان للمالك

قيمة متوسطة · جهد منخفض
fp_notification_events+admin_activity_log
تقرير أمني يومي واحد (نمط exec_report)
تنبيهات البصمة ونشاط الأدمن مسجَّلة. تقرير يومي يعيد استخدام مسار owner.exec_report. رؤية أمنية بلا بنية جديدة.
يبني على: daily_command_reportيعالج جزئياً: R-SEC-EXEC-ANON

⏰ تذكير اختبارات مربوط بالمشاهدة

قيمة عالية · جهد منخفض
exam_schedules+course_watches
«اختبارك بعد 3 أيام وشاهدت 40٪ فقط»
ربط التذكير بنسبة المشاهدة يحوّله من إشعار عام لنصيحة شخصية — قالب واحد بمتغيّرات ذكية موجودة.
يبني على: smart_variablesمخاطر: صفر

🔐 توحيد الهوية (JWT حقيقي)

أساسي · رقعة أمنية
Supabase Authx-admin-id/x-student-id
استبدال bearer-UUID بجلسة موقّعة
أخطر 3 بنود (R-SEC-IDENTITY/R-EDGE-UUID/R-BOT-OWNER) جذرها واحد. JWT حقيقي يغلقها ويفعّل RLS. الأثقل لكنه يرفع سقف الأمان — رقعة مستقلة بموافقة صريحة.
يعالج: 3 من أعلى 6 مخاطريتطلب: DDL + قرار مالك
الترتيب المقترح: ابدأ بـ«مركز الرسائل الموحّد» (يفتح كل الإشعار الذكي) → «الإنذار المبكر» و«تذكير الاختبارات» → «التوصية الذكية» → وبالتوازي «توحيد الهوية» كرقعة أمنية منفصلة. كل ذلك يمر بالنوى القائمة بلا كاتب جديد.