# چک‌لیست — تسک ۱۰ (فرم ساخت قانون و محیط آزمایش) **وضعیت کلی:** ⏳ شروع نشده · **آخرین بازبینی:** — قواعد: [_shared/definition-of-done.md](../_shared/definition-of-done.md) · [red-lines.md](../_shared/red-lines.md) · [ui-conventions.md](../_shared/ui-conventions.md) --- ## ۰. خط سرخ | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۰.۱ | `--group=slot-mode-frozen` سبز | ⏳ | | | ۰.۲ | شبیه‌سازی **هیچ ردیفی** نمی‌نویسد (جز `policy_simulation_runs`) | ⏳ | ⭐⭐ با شمارش ردیف اثبات شود | | ۰.۳ | نوبت‌های واقعی بیماران در شبیه‌سازی تغییر نکردند | ⏳ | | ## ۱. بک‌اند — شبیه‌ساز | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۱.۱ | `PolicySimulator` · `SimulationSampler` · `PolicySimulationRun` | ⏳ | | | ۱.۲ | سه لایهٔ تضمین: DTO · تراکنش با rollback در `finally` · تست شمارش | ⏳ | ⭐ | | ۱.۳ | `$this->em->clear()` بعد از rollback | ⏳ | ⭐ وگرنه entity کثیف در identity map | | ۱.۴ | `PolicySimulationRun` **بعد از** rollback و در تراکنش جدا ثبت می‌شود | ⏳ | | | ۱.۵ | `evaluateIsolated()` — فقط همان قانون، بدون `Resolver` و `Combiner` | ⏳ | | | ۱.۶ | فیلتر شعبه و سرویس از **خودِ شرط قانون** استخراج می‌شود | ⏳ | وگرنه «۰٪ تحت تأثیر» گمراه‌کننده | | ۱.۷ | سقف نمونه ۵۰؛ درخواست بیشتر → ۴۲۲ | ⏳ | | | ۱.۸ | `PolicyTemplateRegistry` با پنج الگو | ⏳ | | | ۱.۹ | `activate` شرط `simulate` **همان نسخه** را می‌سنجد | ⏳ | ⭐ نسخهٔ ۱ اجازهٔ نسخهٔ ۲ نمی‌دهد | | ۱.۱۰ | محیط بدون نوبت → `simulate` خالی موفق، `activate` مجاز | ⏳ | ⭐ کلینیک جدید قفل نشود | | ۱.۱۱ | چهار سطح شدت با آستانه‌های مستند | ⏳ | | | ۱.۱۲ | دو endpoint | ⏳ | | | ۱.۱۳ | `app:policy:prune-simulations` — آخرین اجرا per (policy, version) هرگز حذف نمی‌شود | ⏳ | `activate` به آن وابسته است | ## ۲. دیتابیس | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۲.۱ | `policy_simulation_runs` با جفت tenant | ⏳ | | | ۲.۲ | `report` سقف ۵۰ ردیف | ⏳ | | | ۲.۳ | `TenantSchemaCoverageTest` سبز | ⏳ | | ## ۳. UI | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۳.۱ | `PoliciesPage` · `PolicyFormPage` · `PolicySimulationPage` | ⏳ | | | ۳.۲ | `PolicyConditionBuilder` **از `GET /policy-schema`** ساخته می‌شود | ⏳ | ⭐ هیچ فیلد hard-code | | ۳.۳ | عملگرها per فیلد **فیلتر** می‌شوند، نه همه | ⏳ | ⭐ وگرنه ۴۲۲ بی‌توضیح | | ۳.۴ | نوع ورودی مقدار از `schema.fields[f].type` | ⏳ | | | ۳.۵ | همهٔ select ها `SearchableSelect`؛ هیچ `