---
name: integrity-guardian
description: حارس سلامة بيانات مجدول لمنصّة SchoolApp — تدقيق يومي قراءة فقط (عزل تعدّد مستأجرين عبر نقاط attendance/grades/reports، تتبّع schoolId طرفاً لطرف، أنماط سياق عالمي/autosave قديم، أعمدة إلزامية فارغة) ينتج تقريراً يومياً، ثم لكل شذوذ يمكن إصلاحه بالكود (لا بيانات أبداً) يكتب تلقائياً فرعاً+اختبار انحدار فاشل+إصلاحاً بحلقة TDD من /gas-pipeline ويفتح PR بلا انتظار موافقة مسبقة — لكن الدمج يبقى دائماً مقيَّداً بموافقة بكلمة واحدة عبر إشعار فوري، لا دمج تلقائي أبداً. لا يرمّم بيانات إنتاج تحت أي ظرف (يبقى ذلك حصراً لـ/audit). تفعيل الجدولة الفعلية (cron) خطوة تالية منفصلة.
---

# /integrity-guardian — حارس سلامة بيانات مجدول: تدقيق → إصلاح كود تلقائي → دمج بموافقة لحظية فقط

> يستهلك `/gas-pipeline` (حلقة TDD حرفياً) ويتقاطع مع `/audit` (نفس نطاق المشكلة، فلسفة مختلفة
> عمداً: `/audit` كل شيء بموافقة بندية + نسخة احتياطية لأنه **يرمّم بيانات فعلية**؛ هذه المهارة
> **لا تلمس بيانات إنتاج أبداً**، تكتب كوداً فقط، ولذلك مؤهَّلة لأتمتة أعمق حتى نقطة الدمج).
> **حدّ صلب واحد لا يُتجاوَز مهما بدا التشخيص "صحيحاً بوضوح": لا دمج تلقائي أبداً.** السبب: دمج PR
> في هذا المستودع يُشغِّل نشراً حيّاً تلقائياً لطبقة `frontend/` عبر CI بلا بوّابة موافقة إضافية —
> فالدمج التلقائي يعني عملياً صفر عين بشرية بين تشخيص AI ونشر حيّ يمسّ بيانات مدارس وطلاب حقيقيين.
> هذا قرار مالك موثَّق (راجع محادثة تصميم هذه المهارة) — لا اجتهاد لاحق يُلغيه.

## وضع أ — التدقيق اليومي (قراءة فقط بالكامل، مؤهَّل للجدولة بلا مالك حاضر)

يعمل بلا أي `Write`/`Edit` — هذا القيد هو ما يجعله آمناً للتشغيل غير المراقَب أصلاً.

### فحوصات كود ثابتة (أسلوب `gas-reviewer` — قراءة/`grep`/`git diff` فقط)
1. **عزل تعدّد المستأجرين:** لكل دالة API مكشوفة (بلا بادئة `_`) في نقاط attendance/grades/reports
   عبر التطبيقات السبعة، تحقّق من استدعاء `_resolveTenant`/`_setActiveTenant` في مطلعها (نمط
   ملاحظة #10 بجذر `CLAUDE.md`، حادثة `getAttendanceForStudent` PR#260).
2. **تتبّع `schoolId` طرفاً لطرف:** من حمولة الطلب (`gas-bridge.js`) حتى `_setActiveTenant` —
   أي نقطة يُفقَد فيها `schoolId` أو يُستبدَل بقيمة افتراضية/ثابتة تُسجَّل كشذوذ.
3. **سياق عالمي/`autosave` قديم يكتب فوق قيمة أحدث بلا فحص طزاجة:** نمط ملاحظتَي #9 (استعادة
   جلسة `localStorage` حرفية بلا نداء تحديث) و#14 (أثر جانبي في دالة بناء مشتركة عند نقطة استدعاء
   خاطئة) — ابحث عن استدعاءات حفظ/استعادة حالة لا تتحقّق من طابع زمني/إصدار قبل الكتابة.

### فحوصات بيانات (Google Sheets MCP، أسلوب `data-auditor` القائم — قراءة فقط)
4. **أعمدة إلزامية فارغة** (مثال محدَّد: تاريخ الرد) عبر أوراق كل مدرسة.
5. أي نمط فساد صامت إضافي يطابق ملاحظات جذر `CLAUDE.md` الموثَّقة (#4 مصدر بيانات خاطئ، #13 ترميز
   بيانات مرحَّلة مختلف).

### الناتج
تقرير يومي واحد: `_docs/integrity-reports/YYYY-MM-DD.md` — قائمة شذوذ، كل بند بدليل ملموس (ملف/سطر
أو صف شيت محدَّد)، لا وصفاً عاماً. هذا التقرير هو مدخل وضع ب أدناه لكل بند قابل للإصلاح الكودي.

## وضع ب — إصلاح كود تلقائي لكل شذوذ (فرع→اختبار→إصلاح→PR بلا انتظار، دمج بموافقة لحظية فقط)

فور اكتشاف شذوذ في وضع أ **قابل للإصلاح بالكود** (راجع "معيار الإصلاح الآمن" أدناه)، تابع مباشرة
بلا انتظار موافقة مسبقة على كل بند (قرار مالك موثَّق):

1. **فرع مخصّص** لكل شذوذ على حدة (`fix/integrity-<وصف-قصير>`) — لا دفع مباشر لـ`main`، ولا دمج
   عدّة شذوذ في فرع/PR واحد (مراجعة أنظف، عزل خطر أوضح).
2. **حلقة TDD الحالية لـ`/gas-pipeline` حرفياً:** اكتب اختباراً يُعيد إنتاج الشذوذ ويفشل فعلاً
   أولاً (`_build/test-regression-guards.js` لثبات/مصدر بيانات، `_build/test-offline.js` لمنطق
   offline/sync) → نفّذ الإصلاح → حلقة تكرار حتى ينجح الاختبار الجديد تحديداً.
   **حدّ تكرار صلب: 5 محاولات لكل شذوذ.** إن لم تتقارب الحلقة خلالها، توقّف — لا فرض إصلاح غير
   مؤكَّد، ولا حلقة لا نهائية. سجّل هذا البند في تقرير اليوم كـ"محاولة إصلاح تلقائي لم تتقارب — يحتاج
   مراجعة يدوية" واستمرّ لبقية الشذوذ.
3. **البوّابة الكاملة** (`npm run gate` — تعريفها في `package.json`، وتشمل حرّاس التراجع) +
   مراجعة وكيل `gas-reviewer` — أي ملاحظة حاسمة تُصلَح ضمن نفس حدّ المحاولات، لا تُتجاوَز.
4. **فتح PR** يتضمّن إلزامياً ثلاثة أقسام: إعادة إنتاج الشذوذ (دليل الاختبار الفاشل قبل الإصلاح)،
   تحليل السبب الجذري، وخطة نشر مقترحة (أي تطبيق GAS متأثّر، هل يمسّ `oauthScopes`).
5. **الاختبار الجديد يبقى في المستودع دائماً** — حارس تراجع دائم لهذا الشذوذ.

### إشعار فوري لموافقة دمج بكلمة واحدة (الحدّ الصلب — لا استثناء)
بمجرد جاهزية PR: أرسل إشعاراً فورياً (أداة `PushNotification` أو ما يكافئها) بملخّص تنفيذي بسطر
واحد — السبب الجذري، الملف، دليل الاختبار — واطلب كلمة موافقة واحدة للدمج. **لا دمج بلا هذه
الموافقة الصريحة لكل PR على حدة، بصرف النظر عن وضوح التشخيص الظاهري.** هذا يحقّق الهدف من "بلا
انتظار": الاحتكاك ينتقل لآخر الأنبوب لا أوّله، لكنه لا يُلغى بالكامل — نقطة عين بشرية واحدة تبقى
قبل أي أثر حيّ.

### معيار "الشذوذ غير قابل للإصلاح الآمن تلقائياً" — يُصعَّد في التقرير بدل محاولة PR
- يتطلّب **ترميم بيانات فعلية** (تصحيح صف/قيمة في شيت) لا كوداً — خارج نطاق هذه المهارة كلياً،
  يُحال لـ`/audit` (نسخة احتياطية + موافقة بندية).
- تشخيص متناقض (مثال: نمطان مختلفان من وضع أ يشيران لسببين متعارضين لنفس العرَض).
- حلقة TDD لم تتقارب خلال 5 محاولات (البند 2 أعلاه).
- يمسّ `oauthScopes` في `appsscript.json` — بوّابة إعادة التفويض تحتاج تأكيداً يدوياً من المالك
  دوماً (حادثة متكرّرة 3 مرات موثَّقة بجذر `CLAUDE.md`)، لا يمكن أتمتتها.

## قواعد ملزمة (بلا استثناء)

- **لا دمج تلقائي أبداً** — الموافقة اللحظية بكلمة واحدة لكل PR إلزامية بلا استثناء، مهما بدا
  التشخيص واضحاً. هذا الحدّ الأهم في هذه المهارة كلها.
- **لا ترميم بيانات إنتاج تحت أي ظرف** — إصلاح كود فقط دوماً؛ أي شذوذ يحتاج تصحيح بيانات فعلية
  يُصعَّد لـ`/audit`، لا يُحاوَل هنا.
- **فرع منفصل + PR منفصل لكل شذوذ** — لا تجميع إصلاحات متعدّدة في تسليم واحد.
- **حدّ 5 محاولات TDD لكل شذوذ** — تجاوزه يعني تصعيداً في التقرير، لا حلقة مستمرّة ولا إصلاح
  مفروض غير مؤكَّد.
- **تفعيل الجدولة الفعلية (`CronCreate`/`schedule`) قرار منفصل بعد هذا الملف** — غير مشمول بإنشائه.
- **لا يعدِّل `/audit`/`/gas-pipeline`/`data-auditor` القائمين** — يستهلكها كما هي.
