# Sprint 3 — مصادقة الباحث والشركة + نفاذ stub

> اسبرينت مرتّب بالاعتماديات، يجمّع ملفات الخطط أدناه. **قابل للتنفيذ مباشرةً:** شدّ المساعد على هذا الملف ينفّذ الاسبرينت كله.

## ▶ تنفيذ الاسبرينت (في Cursor)
افتح هذا الملف وقل للمساعد:
```
نفّذ هذا الاسبرينت بالكامل (sprints/3.md): اقرأ كل ملف خطة في «النطاق» ونفّذه عبر docs/build/* ثم احفظ.
```

> 📋 **لوحة الكانبان (`/kanban`):** كل خطوة تحت تظهر **لايف** على اللوحة. لو التاسكات لسه مش ظاهرة، شغّل `php artisan board:sync` مرة.

**عقد التنفيذ للمساعد:**
0. **اقرا `docs/project/CONTEXT.md` الأول** (الخريطة + اللي اتعمل + الملفات اللي تحاكيها) — اشتغل منه ومن ملفات الخطط؛ **متعملش re-scan للريبو**. حدّث §B فيه بعد الـ DoD.
1. **بوابة الاسبرينت (مرة واحدة):** اعرض «فكّر-الأول» + أي **design pattern** مقترح، واطلب موافقة المطوّر (نعم/لا). لا تطبّق أي pattern قبل الموافقة.
   - بعد الموافقة **وقبل أول خطة**، علّم الاسبرينت **قيد التنفيذ**: `php artisan board:set --sprint=3 --status=in_progress` (وسيب `/kanban` مفتوح قدامك).
2. **نفّذ الخطط واحدة-واحدة بالترتيب — خطة تخلص بالكامل قبل ما تبدأ اللي بعدها.**
   > 🚫 **ممنوع تمامًا:** تبني أكتر من خطة مع بعض، أو تكتب كود كل الخطط الأول وتعلّم حالاتهم دفعة في الآخر. كارت **واحد** بس بيبقى «قيد التنفيذ» في المرة.

   **loop لكل خطة، بالترتيب — مايبدأش الدور اللي بعده غير لما اللي قبله يخلص:**
   - **(أ)** `php artisan board:set --sprint=3 --plan=<plan-path> --status=in_progress` — قبل ما تبدأها.
   - **(ب) ابنِ الخطة دي بالكامل:** **API** → [`../build/build-api.md`](../../build/build-api.md) · **CRUD** → [`../build/build-dashboard-crud.md`](../../build/build-dashboard-crud.md) ثم [`build-tests`](../../build/build-tests.md) **لنفس الخطة**.
   - **(ج)** `php artisan board:set --sprint=3 --plan=<plan-path> --status=done` — بعد ما تعدّي.
   - **(د)** انتقل للخطة اللي بعدها.
3. **بوابة الإنجاز (DoD)** [`verify.md`](../../build/verify.md) §B: `migrate:fresh --seed` · `pint` · `dump-autoload -o` · `schema:check` · `php artisan test` · smoke (ar+en).
4. [`build-postman`](../../build/build-postman-collection.md) — أضف requests من أقسام Postman في ملفات الخطط.
5. **حدّث الوثائق ثم commit:** CONTEXT §B · prepend CHANGELOG · README المتأثر · commit checkpoint.

> اتبع development-workflow + قواعد [`../build/README.md`](../../build/README.md). **لا تتجاوز ما هو مذكور في الخطط.**
## النطاق (ملفات الخطط في هذا الاسبرينت)
- shared lookups: `docs/project/api/shared/lookups/cities.md` · `docs/project/api/shared/lookups/countries.md`
- shared content: `docs/project/api/shared/content/page.md` · `docs/project/api/shared/content/faqs.md`
- shared settings: `docs/project/api/shared/settings/locale.md`
- user auth: `docs/project/api/user/auth/request-code.md` · `docs/project/api/user/auth/verify-otp.md` · `docs/project/api/user/auth/register.md` · `docs/project/api/user/auth/login.md` · `docs/project/api/user/auth/activate.md` · `docs/project/api/user/auth/nafath-start.md` · `docs/project/api/user/auth/nafath-callback.md` · `docs/project/api/user/auth/me.md` · `docs/project/api/user/auth/logout.md` · `docs/project/api/user/auth/delete-account.md`
- provider auth: `docs/project/api/provider/auth/register.md` · `docs/project/api/provider/auth/login.md` · `docs/project/api/provider/auth/request-code.md` · `docs/project/api/provider/auth/verify-otp.md` · `docs/project/api/provider/auth/me.md` · `docs/project/api/provider/auth/update.md` · `docs/project/api/provider/auth/logout.md` · `docs/project/api/provider/auth/delete-account.md`

## الاعتماديات
- يعتمد على: — (طبقة DB + guards `user`/`provider` موجودة. سبرنت 1–2 أمان الحساب/نسيت كلمة السر للباحث — منفصلة).

## فكّر-الأول (think-first)
- **الكيانات:** `users` (ALTER) · `providers` · `otps` morph · `cities`/`countries`/`pages`/`faqs` reuse.
- **لبنات Laravel:** Sanctum multi-guard (`auth:user` / `auth:provider`) · `OtpService` · focused controllers تحت `Api/V1/User/Auth/` و `Api/V1/Provider/Auth/` · Resources فيها التوكن · Form Requests `BaseApiRequest`.
- **نفاذ:** stub فقط (`nafath_id` / `nafath_raw`) — لا HTTP لنفاذ الحقيقي.
- **الحالات الحدية:** محظور/غير نشط · هاتف مكرر soft-delete-aware · لا guest skip · لا `terms=>accepted` على السيرفر.
- **side effects:** إشعار ترحيب اختياري عبر `SendNotificationJob` بعد register — لا تُكدّس في الكنترولر.

## design pattern (فقط لو يستحق)
- **مش محتاج pattern جديد** — mirror `Api/V1/Auth/*` + `docs/build/build-auth-audience.md`. الافتراضي: أنماط الـ base.
## نتيجة الإنجاز (DoD) — تُملأ بعد التنفيذ
```
migrate:fresh --seed:  ⏭ polluted local DB (same as sprint 1)
pint:                  ✅
dump-autoload -o:      ✅
schema:check:          ⚠️ hiring green · pre-existing empty cms + polluted extra tables
php artisan test:      ✅  23 Feature/Api (98 assertions)
smoke (ar+en):         ✅ via Feature/Api tests
commit:                1a86bbe
```