---
name: restructure-step
description: SchoolApp GAS — خطوة واحدة من برنامج إعادة الهيكلة (نقل كود خالص). شغّلها لكل PR ينقل دوالاً بين ملفات GAS أو ينقل كتل <script>/<style> إلى أجزاء include. تفرض ثابتة "صفر تغيير سلوكي" عبر تجزئة أجسام الدوال + ماسح الرموز + مرساة تكافؤ الواجهة، ثم تُسلّم لـ/gas-pipeline. تمنع إعادة اشتقاق نفس القائمة في ~25 PR متتالية.
---

# /restructure-step — خطوة نقل كود خالص

غلاف مُقنَّن لخطوة واحدة من برنامج التوحيد على منصة المعلمين (تقسيم `TeacherCore.js` 12k سطر، وتقسيم `Teacher Dashboard.html` 27.6k سطر).

**الثابتة الحاكمة:** هذا PR **نقل**، لا تعديل. أي فرق سلوكي — مهما صغر — خطأ لا تحسين. إن اكتشفتَ أثناء النقل خللاً يستحق الإصلاح، **سجّله كمتابعة ولا تُصلحه هنا** (يفسد إثبات الحياد).

## الخطوة 0 — عقد النطاق (إلزامي، لا استثناء)

قبل أي `Edit`/`Write`، اعرض:
- **الوحدة المنقولة بالضبط**: أسماء الدوال أو نطاق الأسطر، من أي ملف إلى أي ملف.
- **الحجم**: كم دالّة، كم سطراً.
- **الوضع**: `نقل خالص` (كتلة كاملة ⇒ مخرَج مطابق) أم `تجزئة كتلة` (⇒ المرساة ستتغيّر حتماً).
- **ما هو خارج النطاق صراحةً**.

ثم **توقّف بانتظار موافقة بكلمة واحدة**. (نفس آلية `/scope-lock`.)

## الخطوة 1 — التقاط خطّ الأساس *قبل* أي تعديل

```bash
node _build/symbol-map.js --check          # يجب أن يكون 0 جديد قبل أن تبدأ
node _build/check-frontend-equivalence.js  # يجب أن يمرّ قبل أن تبدأ
```

إن فشل أيٌّ منهما **الآن**، فالمستودع ليس نظيفاً وأنت على وشك خلط خللك بخلل قائم — أصلِح أولاً أو اختر خطوة أخرى.

احفظ نسخة ما قبل النقل للمقارنة:
```bash
git show origin/main:<الملف> > /tmp/before-<اسم>.js
```

## الخطوة 2 — النقل

قواعد صلبة:
- **لا تقطع داخل دالّة أبداً.** حدود القطع عند العمق 0 حصراً (`node _build/symbol-map.js --app <app> --list` يعطيك العمق المقيس).
- **لا تُعِد ترتيب أي شيء.** الترتيب في الملف الجديد = الترتيب في الأصل. العبارات على المستوى الأعلى (`App = {…}`, `addEventListener`) حسّاسة لترتيب التنفيذ.
- **لا تُعِد تسمية، لا تُنسّق، لا تُصلح مسافات.** أي لمسة تجميلية تُفسد تجزئة الجسم وتُخفي التغييرات الحقيقية وسط الضجيج.
- **الثوابت تبقى مكانها** — خصوصاً أي `var` عام قيمته استدعاء دالّة (يعتمد ترتيب تحميل الملفات).
- **أسماء المُشغِّلات تبقى عامّة وبنفس الاسم** (مربوطة بالاسم على مستوى مشروع GAS).

## الخطوة 3 — البوّابة السداسية

```bash
npm run gate
```
(= `build` · `test` · `guards` · `endpoints --check` · `symbols:check` · `frontend:check`)

## الخطوة 4 — إثبات الحياد

شغّل وكيل **`split-verifier`** على التغيير. لا تتابع قبل حكم **✅ نقل خالص مؤكَّد** أو **⚠️ اختلافات مبرَّرة** مع تبرير مُثبَت لكل اختلاف.

حكم **❌** يعني: لا تدمج. عُد وأصلح النقل.

## الخطوة 5 — المراجعة المعمارية

شغّل وكيل **`gas-reviewer`** (ES5، denylist، عزل المستأجرين، سلامة النشر). بند 63 يوثّق أنه كان **الوحيد** الذي التقط خطأين حرجين في نقل مماثل — لا تتخطَّه لأن التجزئة مرّت.

## الخطوة 6 — التسليم

سلِّم لـ`/gas-pipeline` لإتمام: فرع → PR → دمج → نشر `clasp` → تحقّق حيّ.

**تحقّق النشر (بند 64):** لا تكتفِ بمطابقة وصف النسخة — `clasp deploy` قد يلتقط محتوى ما قبل الدفع ووصفه يطابق ما نشرتَه. أغلِق بتحقّق **سلوكي** على دالّة متغيّرة تحديداً؛ وعند نتيجة مخالفة للتوقّع قارن بسلوك دالّة قديمة معروفة في نفس التطبيق لتمييز "النشر لم يصل" عن "المنطق خاطئ".

## الخطوة 7 — تحديث الدَّين

إن أصلحت خطوتُك بنداً في `_build/symbol-map-baseline.json`، شطّبه:
```bash
node _build/symbol-map.js --update-baseline
```
الأداة تفشل عمداً إن أُصلح بند ولم يُشطَب — القائمة يجب أن **تنكمش**، لا تتعفّن.
