# خط سرخ‌ها — قواعدی که هیچ تسکی نمی‌تواند نقض کند

این فایل بالای هر تسک حاکم است. اگر تسکی با این‌ها تناقض داشت، **این فایل برنده است** و
تسک باید اصلاح شود، نه این فایل.

---

## ۱. ⛔ نوبت‌دهی اسلاتی به هیچ عنوان دست‌کاری نمی‌شود

`booking_mode = 'slot'` منطق تولیدیِ زنده است. در **هیچ تسکی از این فاز** نه رفتارش،
نه امضایش، نه خروجی‌اش تغییر نمی‌کند.

### فایل‌ها و مسیرهای قفل‌شده

| فایل / مسیر | چه چیزی قفل است |
|---|---|
| `src/Appointment/Service/SlotCalculatorService.php` | متدهای `getAvailableSlots`، `getAllSlotsWithAvailability`، `hasAnyAvailability`، `findNextAvailableStart`، `buildSessionSlots`، `buildAllSessions`، `filterBookedSlots`، `isWithinBookingWindow` — **هیچ‌کدام** ویرایش نمی‌شوند |
| `GET /api/v1/appointment-slots` | قرارداد request/response |
| `GET /api/v1/appointment-settings/month-availability/{doctorUuid}` | قرارداد |
| `Appointment::active_slot_key` و `refreshActiveSlotKey()` | مکانیزم یکتایی موجود |
| `AppointmentRepository::isSlotTaken` | امضا و معنا |
| `WeeklySchedule::MODE_SLOT` و `DEFAULT_META['booking_mode']` | مقدار پیش‌فرض `slot` می‌ماند |

### چه چیزی مجاز است

- **افزودن** متد جدید به `SlotCalculatorService` — بدون تغییر متدهای موجود
- **افزودن** کلاس/سرویس موازی (مثل `AvailabilityEngine` تسک ۰۶)
- **افزودن** کلید جدید به `WeeklySchedule.meta` — با حفظ پیش‌فرض‌های موجود
- **افزودن** ستون تهی‌پذیر به `appointments`

### چه چیزی ممنوع است

- تغییر امضای هر متد موجود در `SlotCalculatorService`
- تغییر شکل خروجی `appointment-slots` (حتی افزودن فیلد، اگر ترتیب/نوع فیلدهای موجود عوض شود)
- «یکدست‌سازی» یا refactor مسیر اسلاتی
- حذف `active_slot_key` یا `is_reserve`
- اعمال قوانین جدید (تسک ۰۹) روی حالت `slot` — حتی اگر منطقی به نظر برسد

### اجبار خودکار

هر تسک باید این تست را سبز نگه دارد:

```bash
ddev exec php bin/phpunit --group=slot-mode-frozen
```

و در `tests/Appointment/SlotModeFrozenTest.php`:

```php
/** @group slot-mode-frozen */
public function testSlotModeContractUnchanged(): void
{
    // snapshot خروجی appointment-slots برای یک برنامهٔ ثابت
    // هر تغییری در شکل پاسخ، این تست را قرمز می‌کند
    self::assertJsonStringEqualsJsonFile(
        __DIR__ . '/fixtures/slot-mode-contract.json',
        $this->client->getResponse()->getContent()
    );
}
```

fixture در تسک ۰۰ ساخته می‌شود و **هیچ تسکی اجازهٔ به‌روزرسانی‌اش را ندارد**.

---

## ۲. ✅ نوبت‌دهی سرویسی در همین فاز کامل می‌شود

`booking_mode = 'service'` نیمه‌کاره است: در مسیر رزرو (سایت و درawer پنل) کار می‌کند، ولی
در ویرایش نوبت، نوبت رزرو، و بخشی از پنل بیمار غایب است.

تکمیلش **پیش‌نیاز** بقیهٔ فاز است، نه موازی با آن:

```
تسک ۰۰  تکمیل نوبت‌دهی سرویسی در clinicpro
تسک ۰۰ب سازگارسازی nobat724_front با وضعیت فعلی
        ↓
تسک ۰۱ به بعد (موتور چندمنبعی)
```

دلیل ترتیب: اگر حالت `resource` (تسک ۰۶) روی حالت `service` نیمه‌کاره ساخته شود، هر باگ
موجود سرویسی به موتور جدید ارث می‌رسد و تشخیص منبعش غیرممکن می‌شود.

---

## ۳. 🎨 هر صفحه یا بخش جدید، عیناً با دیزاین‌سیستم موجود

هیچ طراحی جدید، هیچ کامپوننت موازی، هیچ رنگ hard-code.
جزئیات کامل و چک‌لیست: [ui-conventions.md](ui-conventions.md)

---

## ۴. ☑️ هیچ تسکی بدون تکمیل چک‌لیستش تمام نیست

هر تسک یک `checklist.md` دارد. پیش از اعلام پایان، **همهٔ** ردیف‌ها باید وضعیت نهایی
داشته باشند و هیچ ردیفی در `🔄` یا `⏳` نماند.
قالب و قواعد: [definition-of-done.md](definition-of-done.md)
