schoolos-watch

> متى تُستعمل: "Use for SchoolOS operational monitoring (session «0203 · الرصد والإنذارات»): alert sources (production /health/, uptime/worker-heartbeat issues, CI on main, backups, memory, GitHub sec

SKILL.md

GitHub

متى تُستعمل: "Use for SchoolOS operational monitoring (session «0203 · الرصد والإنذارات»): alert sources (production /health/, uptime/worker-heartbeat issues, CI on main, backups, memory, GitHub security alerts, orphan worktrees by PR state), running watch_once.py, grading S1/S2/S3, whom to notify, false alarms, daily summary. Trigger on: watch_once, monitoring round, UPTIME FAILED, 500, main is red, backup failed, claude_backup, orphan tree, secret scanning, Dependabot alert, false alarm, U-01 window. استخدمها عند «هل الإنتاجُ سليم؟»، «main أحمر»، «فشل النسخ»، «الذاكرة حمراء»، «شجرةٌ يتيمة؟»، «تنبيهٌ أمنيّ»، «إنذارٌ كاذب؟»، «ما درجتُه ولمن أبلّغ؟»، «ملخّص الرصد» — ولو لم تُذكر. ليست لـ: قيادة حادثٍ مُعلن (maestro-incident)، النشر والرجوع (schoolos-deploy)، قياس المؤشّرات (schoolos-quality-guards)، رسائل المستخدمين (schoolos-feedback-intake)، أرشفة شجرة (maestro-archive-check)، N+1 (nplus1-hunter)، 8500 (schoolos-preview-8500)، الهجرات (schoolos-migration-guard)، إصلاح العطل (schoolos-debugger)."

الرصدُ والإنذارات — SchoolOS

الغرض: أن يُكتشف العطلُ قبل المستخدم، ويُصنَّف بدرجته، ويبلغ صاحبَه في زمنه — بقراءةٍ وتقاريرَ فقط. الجلسةُ «0203 · الرصد والإنذارات» عينٌ لحظيّة: لا تُصلح ولا تنشر ولا تعيد تشغيلَ الإنتاج. المصدر: ~/delivery_manager_work/docs/tab_charters.md (ميثاق 0203).

متى تُستعمل ومتى لا

  • نعم: جولةُ رصدٍ دوريّة؛ إنذارٌ من أيّ مصدر (قضيّةٌ آليّةٌ في GitHub، watch_once، فشلُ تشغيلٍ على main، رسالةُ جلسة)؛ الحكمُ على إنذارٍ أصادقٌ هو؛ تصنيفُ الدرجة والمُبلَّغ؛ الملخّصُ اليوميّ.
  • لا: قيادةُ حادثٍ أُعلن (المايسترو بـmaestro-incident)؛ تحقّقُ ما بعد نشرٍ بعينه وأوامرُ Railway (schoolos-deploy)؛ اتّجاهُ المؤشّرات والميزانيّات بعد النشر (schoolos-quality-guards — «0203 للإنذار اللحظيّ و0702 للقياس الدوريّ»)؛ رسائلُ المستخدمين (schoolos-feedback-intake)؛ أرشفةُ شجرةٍ أو إزالتُها؛ خطواتُ الفلو والدفع (schoolos-flow).

الإجراء

  1. الوقتُ من الأداة لا بالتقدير: حقلُ generated_doha في مخرج watch_once، وأوقاتُ GitHub بتوقيت UTC فأضِف 3 ساعات. المصدر: feedback_doha_time_on_windows.
  2. شغّل المراقب: python ~/delivery_manager_work/tools/watch_once.py --json (نحو 50 ثانية حيّاً؛ --no-live للذاكرة وحدها). رمزُ خروجه 0 دائماً — اقرأ مصفوفةَ alerts لا الرمز.
  3. أكمِل ما لا يغطّيه: صحّةُ الإنتاج وقضاياها، ونسخُ قاعدة الإنتاج، وحزمةُ git الليليّة، وتنبيهاتُ الأمن، وحالةُ دمج الطلبات — بأوامرَ قرائيّةٍ مجرَّبة في references/00-sources-and-commands.md.
  4. افحص كلَّ إنذارٍ قبل رفعه: أصادقٌ أم كاذبٌ معروف؟ (references/02-false-alarms.md). لا ترفع S1 بقراءةٍ واحدةٍ من مصدرٍ واحد إن أمكنت قراءةٌ ثانيةٌ مستقلّة في دقائق.
  5. صنّف: S1 أو S2 أو S3 أو «تدفّق» (ليس حادثاً) — الجدولُ والأمثلة في references/01-severity-classification.md.
  6. أبلغ بالصيغة والزمن: S1 للمايسترو والمالك خلال 15 دقيقة بسطرٍ واحد؛ S2 للمايسترو بثلاثة أسطر؛ S3 بطاقةٌ إلى «0204 · البوابة الموحّدة»؛ والكاذبُ إغلاقٌ مسبَّب، وتكرارُه بطاقةُ إصلاحٍ للأداة.
  7. سجّل كلَّ إنذارٍ وحكمَه في الملخّص اليوميّ (references/03-daily-summary.md).

القواعد وأسبابها

  • قراءةٌ وتقاريرُ فقط. لا إصلاحَ ولا نشرَ ولا إعادةَ تشغيلٍ ولا railway بأيّ صورة؛ أوامرُ الإنتاج بيد المالك. والسبب مزدوج: الميثاقُ يحصرها، ومصنِّفُ الوضع التلقائيّ يحجب قراءةَ الإنتاج وكتابتَه عبر Railway ولو أذن المالك في المحادثة — فإن لزم أمرٌ فاكتبه نصّاً جاهزاً للمالك عبر المايسترو. المصدر: ميثاق 0203؛ feedback_auto_classifier_production_actions.
  • الشجرةُ اليتيمة تُحكم بحالة طلب فرعها لا بـgit rev-list. الدمجُ بالسحق يصنع إيداعاً جديداً في main فيبقى كلُّ إيداعٍ في الفرع «غيرَ مدموج» في rev-list وgit cherry؛ فأُعلنت أشجارٌ اندمج عملُها يتيمةً. المصدر: tools/branch_status.py (قياس 09-28: vision-footer ← #714، qcc-collectors ← #707).
  • غيابُ الإنذار لا يثبت السلامة. جدولةُ GitHub بأفضل جهد (قيس 09-25 نحو 7% من وتيرة فحص الإنتاج و4% من فحص العامل)، وwatch_once يسكت إن فشل gh run list. فالجولةُ تقرأ الصحّةَ مباشرةً ولا تكتفي بخلوّ القضايا. المصدر: .github/workflows/monitor.yml وworker-heartbeat.yml؛ watch_once.py (سطور 97–101).
  • النسخُ يُحكم عليه بعمر آخر ناتجٍ لا بنتيجة المهمّة المجدولة. نسخُ ~/.claude تعطّل صامتاً أربعةَ أشهرٍ ونصفاً والمهمّةُ تُسجَّل ناجحة. المصدر: project_claude_backup_stale_lock_2026_09_28.
  • الذاكرةُ تنبيهٌ لا مانع (D-51م): الأحمرُ يُرفع للمايسترو ليُبلغ المالكَ ويُفتح بالتتابع، ولا توقَف به جلسةٌ ولا تُؤرشف — لا أرشفةَ إلّا بأمر المالك. المصدر: decisions.md D-51م؛ thresholds.json؛ feedback_never_archive_without_order.
  • لا مضيفَ إنتاجٍ ولا سرَّ في أيّ مخرج: المستودعُ عامّ، والتقاريرُ تُنقل بين الجلسات. اذكر «نقطة /health/» بالمسار، والعنوانُ يُقرأ من السكربت وقتَ التشغيل لا يُكتب. المصدر: ميثاق 0203 («لا أسرارَ في أيّ مخرج»).
  • خاطِب الجلساتِ بأسمائها في الشريط (مثل «0601 · النشر على الإنتاج والدمج») لا بأرقام المنافذ. المصدر: feedback_address_sessions_by_name.
  • في نوافذ تشغيل الإنتاج (U-01، وU-03، والتجميد) لا يُقترح نشرٌ ولا إعادةُ تشغيلٍ في ساعتها، وأيُّ نشرٍ يُرصد فيها يُبلَّغ فوراً. التفصيلُ في المرجع 01.

فخاخ

  • خطأ: «رمزُ خروج watch_once صفرٌ إذن لا شيء» ← الصواب: الرمزُ صفرٌ ولو كانت الذاكرةُ حمراء (قيس 09-28)؛ اقرأ alerts.
  • خطأ: «git rev-list origin/main..HEAD يعطي 8 إيداعات، فالشجرةُ يتيمة» ← الصواب: احكم بحالة طلب الفرع (watch_once يفعل ذلك، وarchive_check.py لشجرةٍ واحدة)؛ وغيابُ تنبيهٍ لشجرةٍ بلا جلسةٍ مسمّاة يعني أنّ عملَها مدموجٌ أو له طلبٌ مفتوح (أشجارُ الجلسات المسمّاة لا يفحصها أصلاً).
  • خطأ: «main_red: CI مكسور» ← الصواب: اقرأ أسماءَ التشغيلات: التشغيلاتُ المجدولة (Nightly، Uptime) تُعدّ على main أيضاً، وفشلُ Uptime إشارةُ إنتاجٍ (S1 محتمل) لا CI؛ وإيداعٌ واحدٌ سيّئٌ يُسقط ثلاثَ وظائف معاً.
  • خطأ: «/health/ أخضر فالإنتاجُ سليم» ← الصواب: حادثة 2026-09-17: /health/ أخضرُ ساعتين وكلُّ صفحةٍ 500؛ فاقرأ معه auth/login/ وقضيّةَ الكنار، وقارن commit بما يُنتظر.
  • خطأ: «LastTaskResult=0 لمهمّة النسخ = نسخٌ سليم» ← الصواب: عمرُ آخر إيداعٍ في فرع scoped ≤ 36 س، وغيابُ backups/BACKUP_FAILED.txt.
  • خطأ: «أقدمُ طلبٍ عمره 73 ساعة — S1/S2» ← الصواب: هذا «تدفّق» لا حادث، وقد يكون طلباً آليّاً (dependabot) أو محجوزاً بقرار (#631 «بعد U-01»)؛ يُذكر في الملخّص ولا يُصعَّد.
  • خطأ: «سأطفئ الخادمَ الخامل / أعيد تشغيل العامل لأُسكت الإنذار» ← الصواب: خارج حدودك؛ الإنذارُ بطاقةٌ أو إبلاغ، والإصلاحُ لصاحب المكوّن.
  • خطأ: «TZ=Asia/Qatar date يعطي وقت الدوحة» ← الصواب: في Git Bash يطبع UTC صامتاً.

المراجع

الملف متى تقرؤه
references/00-sources-and-commands.md قبل كلّ جولة: المصادرُ الثمانية، وما يغطّيه watch_once وما لا يغطّيه، والأوامرُ القرائيّةُ المجرَّبة
references/01-severity-classification.md عند تصنيف أيّ إنذار: جدولُ S1/S2/S3 بأمثلة، والمُبلَّغ وزمنُه وصيغتُه، والنوافذ
references/02-false-alarms.md حين يبدو الإنذارُ غريباً أو متكرّراً، أو قبل إغلاقه، أو حين يغيب إنذارٌ متوقَّع
references/03-daily-summary.md عند كتابة الملخّص اليوميّ أو تقرير الإغلاق
references/99-test-cases.md عند تعديل المهارة أو اختبار تفعيلها