From b03ae95bf8c786fdf7d8c42e74fac306c0618256 Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Mon, 3 Aug 2026 11:44:54 +0330 Subject: [PATCH] docs(prompt): record what actually happened in the resource-first task MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The prompt was wrong three times and the file now says so up front: the doctor-less appointment path was built and fully reverted, the getDoctor() blast radius was overstated, and the booking engine it asked to build already existed. Also records two tooling traps found on the way — phpstan runs at level 5 here so it never checks nullability, and migrations:diff missed the nullable change. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/prompt/resource-first-appointments.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/.claude/prompt/resource-first-appointments.md b/.claude/prompt/resource-first-appointments.md index eaf95149..e839c04e 100644 --- a/.claude/prompt/resource-first-appointments.md +++ b/.claude/prompt/resource-first-appointments.md @@ -1,5 +1,49 @@ # نوبت‌دهی منبع‌محور در صفحهٔ نوبت‌ها — تب هر منبع + رزرو سرویسی + حذف تایم‌لاین منابع +> **وضعیت: انجام شد (۱۴۰۵/۰۵/۱۲).** کامیت‌ها: `3e3a2482` (تب منابع + فیلتر)، +> `fd27ceef` (مودال رزرو + حذف تایم‌لاین). +> +> ## این پرامپت در اجرا سه‌بار غلط از آب درآمد — چیزی که واقعاً شد: +> +> **۱. «نوبت بدون پزشک» پیاده شد و بعد کاملاً برگردانده شد.** `doctor` تهی‌پذیر شد و +> migration اجرا شد، ولی وسط کار معلوم شد مدل مجوز منشی روی سه‌تایی +> `(منشی، کلینیک، پزشک)` بنا شده و `DoctorSecretary.doctor` تهی‌پذیر نیست — یعنی برای +> نوبتِ بدون پزشک **هیچ ردیف مجوزی وجود ندارد**. تصمیم کاربر: منبع پزشکِ مسئول داشته +> باشد. migration رول‌بک و کد `git checkout` شد. +> +> **۲. «۷۳ فراخوانی getDoctor()» بیش‌برآورد بود.** بیشترشان روی entityهای دیگرند +> (`WeeklySchedule`، `Holiday`، `Rate`، `DoctorAddress`). عدد واقعی روی `Appointment` +> حدود ۲۵ بود، و diff سطح ۸ دقیقاً **۳۳ نقطهٔ جدید در ۱۶ فایل** داد. +> +> **۳. مهم‌ترین: کل موتور از قبل ساخته شده بود و این پرامپت از وجودش بی‌خبر بود.** +> `POST /api/v1/appointment-availability` (با `assignment` per اسلات)، `appointment-hold`، +> `appointment-confirm`، هوک `useResourceBooking.ts`، و حتی یک صفحهٔ کامل +> `ResourceBookingPage.tsx` روی `/admin/resource-booking`. `confirm` هم از قبل +> `doctor_uuid` می‌گیرد. پس **هیچ تغییر بک‌اندی برای رزرو لازم نبود** و تنها افزودنی +> بک‌اند، فیلتر `resource_uuid` روی فهرست نوبت‌ها شد. +> +> ## دو تلهٔ ابزاری که باید بدانی +> +> - **`phpstan` این پروژه تهی‌پذیری را چک نمی‌کند.** بررسی «صدا زدن متد روی تهی» سطح ۸ +> است و `phpstan.neon` روی سطح ۵. با یک خطای عمدی تست شد: `[OK] No errors`. برای این +> جنس تغییر، گیت واقعی PHPUnit است، نه phpstan. +> - **`doctrine:migrations:diff` تغییر nullable را ندید** و به‌جایش یک migration بی‌ربط +> `messenger_messages` ساخت. migration دستی نوشته شد. +> +> ## معماری‌ای که ماند +> +> - رزرو منبع از `hold → confirm` می‌رود، نه `POST /api/v1/appointment`. دلیلش حیاتی است: +> فقط `HoldService` رکورد `resource_occupancy_buckets` می‌نویسد و قید یکتای +> `uniq_bucket_resource_seat` تداخل را غیرممکن می‌کند. `book()` هیچ occupancy نمی‌نویسد، +> پس رزرو منبع از آن مسیر بی‌گارد است. +> - موتور خدمت‌محور جواب می‌دهد؛ مودال نتیجه را به اسلات‌هایی تنگ می‌کند که `assignment`شان +> همین منبع را دارد و آن نقش را به منبع قفل می‌کند. +> +> بقیهٔ این فایل متن اولیهٔ پرامپت است و برای تاریخچه نگه داشته شده — **به‌عنوان دستورالعمل +> اجرا معتبر نیست.** + +--- + ## زمینه صفحهٔ `/admin/appointments` امروز کاملاً پزشک‌محور است: تب‌ها فقط پزشک‌اند