Motoshub · Delivery Plan · Front + Backend

برنامه‌ی تحویل: تسک‌های تیم Front و Backend

نقشه‌ی اجراییِ ساختِ محصولِ واقعی تا رسیدن به همین پروتوتایپ (demo.shub.ir). هر تسک شکسته‌شده به subtask، هر تسک و subtask دارای تخمینِ زمانی، مرتب‌شده بر اساس فاز و اولویت، با شرحِ فنیِ دقیق، User Story و معیارهای پذیرش.

مبنا: خواندنِ کاملِ سه ریپو — motoshub-prototype (هدف)، motoshub-web-client (Front/Next.js)، motoshub-new-api (Backend/Django). واحد تخمین: روزِ‌نفر (۱ روز = ۸ ساعت مفید).

راهنمای خواندن
وضعیت: انجام‌شدهکار می‌کند ناقصUI هست، داده mock نساختهاصلاً وجود ندارد
اولویت: P1پایه/بحرانی P2مهم P3تکمیلی تخمین:۳ روزمجموعِ subtaskها
شناسه‌گذاری ساختار را رمزگذاری می‌کند: F=Front، B=Backend، عدد اول = ترتیب اجرا. subtaskها با .1 .2 .3. تخمین‌ها برای یک توسعه‌دهنده‌ی میان‌ردهٔ آشنا با استک.
به‌روزرسانی ۱۴۰۵/۰۴/۳۱: (۱) بخش جدید «پایپ‌لاین تحویل و کیفیت» اضافه شد — عبور از آن برای هر تسکِ هر دو تیم الزامی است. (۲) جدول «سناریوهای اندازه‌ی تیم» به خلاصه اضافه شد. (۳) پروتوتایپِ هدف (demo.shub.ir) برای پوششِ کاملِ ماژول‌های motoshub-web گسترش یافت: صفحات جدید دوستان و دنبال‌کردن (friends/follow)، نظرسنجی و آزمون (iisquestions/iispors)، مسابقات و چالش‌ها (iiscompetition/iischallenge) و تیکت پشتیبانی (iisticketing) — این‌ها UIِ مرجعِ تسک‌های F18/B15/B17/B18 هستند؛ تخمین‌ها همان‌اند.
خلاصه‌ی زمان‌بندی و فازها تصمیم‌های معماریِ الزام‌آور فاز ۰ — پایه و زیرساخت فاز ۱ — احراز هویت، پوسته، لایه‌ی داده فاز ۲ — هسته‌ی محتوا فاز ۳ — فضاهای اجتماعی فاز ۴ — ارتباط و همکاری فاز ۵ — ماژول‌های سازمانی فاز ۶ — راهبری، جستجو، پولیش و تحویل پایپ‌لاین تحویل و کیفیت منابع فنی
Σ

خلاصه‌ی زمان‌بندی و فازها

دو مسیرِ موازی. چون PHP api/v1 همین حالا هر ۲۹۳ عملیات را پاسخ می‌دهد، تیم Front از فاز ۱ به‌بعد به آن وصل می‌شود و منتظرِ Django نمی‌ماند؛ Backend به‌موازات همان قرارداد را در Django بازمی‌سازد و Gateway هر مسیرِ آماده را سوییچ می‌کند.

فازمحتواFrontBackendموازی
۰پایه: axios/design-system · REST-infra/auth-JWT/deploy/data-model۵.۵ روز۱۲ روز~۱۲ روز
۱احراز هویت، پوسته و ناوبری، لایه‌ی داده · endpointهای auth + مدل‌ها۹.۵ روز۶ روز~۱۰ روز
۲هسته: داشبورد، تازه‌ها، بلاگ، کاربران/پروفایل۱۷ روز۱۶ روز~۱۷ روز
۳اجتماعی: گروه‌ها، اخبار، رویدادها، رسانه، فروم۲۴ روز۲۵ روز~۲۵ روز
۴ارتباط: چت، دانش، پروژه · پیام‌رسان، دوستان/اعلان، دانش/پروژه۱۶ روز۱۶ روز~۱۶ روز
۵سازمانی: قرارداد/صندوق/پژوهش/آموزش · نظرسنجی/مسابقات۸ روز۱۳ روز~۱۳ روز
۶راهبری، ظاهر، گزارش، اعلان، جستجو، راهنما، دستیار، پولیش، تست۱۶ روز۴ روز~۱۶ روز
مجموع (تک‌نفره، بدون همپوشانی)~۹۶ روز~۹۲ روز~۱۰۹ روز
تفسیرِ زمان. با ۲ توسعه‌دهنده‌ی Front + ۲ Backend و اجرای موازیِ فازها، بازه‌ی واقع‌بینانه‌ی رسیدن به پروتوتایپِ کامل حدود ۱۳ تا ۱۶ هفته‌ی کاری است. «حداقلِ محصولِ قابل‌نمایش» (فاز ۰ تا ۲) در حدود ۵ تا ۶ هفته به‌دست می‌آید. این اعداد تخمینی‌اند و باید در Planningِ هر Sprint دوباره کالیبره شوند.

سناریوهای اندازه‌ی تیم

ترکیب تیمMVP (فاز ۰-۲)پروتوتایپ کاململاحظات
۱ Front + ۱ Backend~۹-۱۰ هفته~۲۲-۲۶ هفتهارزان‌ترین؛ ریسک گلوگاه تک‌نفره و ریزش. توصیه نمی‌شود.
۲ Front + ۲ Backend (خط پایه)۵-۶ هفته۱۳-۱۶ هفتهترکیب فعلی. هر فاز دو workstream موازی؛ review متقابل ممکن است.
۲F + ۲B + ۱ نفر QA/تست‌خودکار۵-۶ هفته۱۲-۱۴ هفتهزمان زیاد کم نمی‌شود اما دوباره‌کاری و باگِ برگشتی به‌شدت کم می‌شود؛ پیشنهاد PO.
۳ Front + ۳ Backend + QA۴-۵ هفته۹-۱۱ هفتهبازده نزولی: مسیر بحرانی (auth→چت realtime→گزارش) کوتاه‌تر از این نمی‌شود.
تیم واقعی: ۴F + ۳B + ۱QA + ۱DevOps~۴ هفته~۹-۱۱ هفتهترکیب فعلی ما. DevOps تسک‌های B3/استقرار/CI را برمی‌دارد و Backend خالص فیچر می‌زند؛ QA از هفته‌ی ۱ گیت‌های ۸ و ۹ پایپ‌لاین را مالک است.
مسیر بحرانی مستقل از تعداد نفرات: فاز ۰ (زیرساخت) ← auth ← لایه‌ی داده ← ماژول‌های وابسته به فایل/اعلان ← چتِ بی‌درنگ ← پولیش. حداقل تقویمیِ عبوری از این زنجیره ~۹ هفته است؛ نفرِ اضافه فقط پهنای موازی را زیاد می‌کند، نه عمق زنجیره را. با تیم ۹ نفره، گلوگاه = Backend (۳ نفر / ~۸۰ روزنفرِ باقی‌مانده پس از واگذاری استقرار به DevOps).

تقسیم کار پیشنهادی تیم واقعی (workstreamهای پایدار — هر نفر مالک یک رشته)

نقشمالکیت (رشته‌ی کاری ثابت)تسک‌ها به ترتیب
Front ۱ (لید)زیرساخت فرانت، auth، لایه‌ی داده، سپس چتF1 → F3 → F5 → F15 → F20.5
Front ۲پوسته/ناوبری + هسته‌ی محتواF2 → F4 → F6 → F7 → F8
Front ۳فضاهای اجتماعیF9 → F10 → F11 → F12 → F13 → F14
Front ۴دانش/پروژه + ماژول‌های سازمانی + راهبریF16 → F17 → F18 → F19 → F20.1-3
Backend ۱ (لید)زیرساخت REST + auth مشترک + پیام‌رسانB1 → B2 → B4 → B5 → B14
Backend ۲هسته‌ی محتوا: کاربران/فید/بلاگ/اخبارB6 → B7 → B8 → B9 → B15
Backend ۳اجتماعی + سازمانی: گروه/رویداد/رسانه/فروم → دانش/پروژه → سازمانیB10 → B11 → B12 → B13 → B16 → B17 → B18
QAمالک گیت‌های ۸-۹ پایپ‌لاین: کالکشن Postman هر ماژول، تست قرارداد، E2E (Playwright) مسیرهای حیاتی، رگرسیون هفتگیاز هفته ۱ موازی با همه؛ B19.2 و F20.6 با اوست
DevOpsB3 کامل + CI enforcement + staging دو سرویس + مانیتورینگ/لاگ + بکاپ + سوییچ GatewayB3 → CI هر دو ریپو → B19.3 → پایداری production
ریسک برنامه و پادزهر: (۱) Front چهارنفره زودتر از Backend تمام می‌کند (~هفته ۷) — از آن نقطه Front ۳ و ۴ به E2E/پولیش/دواپسِ فرانت شیفت می‌شوند، نه فیچرِ جدید. (۲) وابستگی همه به فاز ۰: هفته‌ی اول همه‌ی تمرکز دو لید + DevOps روی B1/B2/B3/F1/F2 است؛ بقیه در همان هفته کالکشن تست و شناخت قرارداد API را آماده می‌کنند. (۳) هر workstream مالک ثابت دارد تا context-switching حذف شود؛ جابه‌جایی فقط با تصمیم PO.
!

تصمیم‌های معماریِ الزام‌آور

پیش‌فرض‌هایی که هر دو تیم باید رعایت کنند تا کارها به هم برسند.

۱) مبدأ داده‌ی Front مستقل از پیاده‌ساز است. Front فقط با قراردادِ api/v1 کار می‌کند؛ نباید بداند پاسخ از PHP می‌آید یا Django. همه‌ی مسیرها از libs/axios.ts با baseURL=/api/v1 و rewrite در next.config.ts.
۲) auth واحد. استانداردِ توکن = JWT HS256 با رازِ مشترک OW_PASSWORD_PEPPER و claims {iat, exp, sub:userId}. Django باید همین را verify (و در فاز بعد صادر) کند، نه صرفاً خواندنِ ow_base_user_auth_token.
۳) قراردادِ پاسخ ثابت است. فهرست‌ها همیشه پاکتِ {data, links, meta} با meta.current_page/per_page/total؛ خطاها با کدهای 401/403/404/422 و بدنه‌ی یکسان. مرجعِ فیلدها: مرجع API و Swagger.
۰

پایه و زیرساخت

پیش‌نیازِ هر چیزِ دیگر. بدون این‌ها هر تسکِ بعدی روی شن ساخته می‌شود. دو تیم موازی کار می‌کنند.

◆ تیم Front
F1یکپارچه‌سازی HTTP client و پاک‌سازی بدهیِ فنیP1ناقص۱.۵ روز

دو client موازی هست: libs/axios.ts (زنده) و services/apiClient.ts (مرده). باید یکی بماند، منبعِ همه‌ی درخواست‌ها شود و کدهای بلااستفاده حذف شوند.

Subtaskها
#کارجزئیات فنیتخمین
F1.1حذف client مردهحذف services/apiClient.ts؛ انتقالِ ارجاع‌ها به libs/axios.ts۲ ساعت
F1.2حذف کد/وابستگیِ بلااستفادهحذف jsonwebtoken، social/homepage/*، social/menu/*، libs/routes.ts کهنه۳ ساعت
F1.3پیکربندی پایه‌ی axiosتثبیت baseURL/timeout، هدرهای پیش‌فرض، اتصالِ توکن از store در request interceptor۳ ساعت
F1.4ESLint/type-check سبزرفعِ importهای شکسته، اجرای tsc --noEmit و lint۴ ساعت
وابستگی: ندارد (نقطه‌ی شروعِ Front).
F2سیستم طراحی، توکن‌های ظاهری و تمِ روشن/تیرهP1نساخته۴ روز
User Storyبه‌عنوان کاربر، می‌خواهم رابط با ظاهرِ یکدست، فارسی/RTL و قابلِ‌تعویض بین روشن/تیره ببینم، تا تجربه‌ی حرفه‌ای و خوانا داشته باشم.

themeی Tailwind خالی است. توکن‌های طراحیِ برگرفته از پروتوتایپ (رنگ/فاصله/شعاع/سایه/تایپ) و کامپوننت‌های پایه ساخته شوند. طبقِ اصولِ طراحی: مقیاسِ تایپِ مشخص و هویتِ منطبق بر دامنه‌ی سازمانی، نه پیش‌فرضِ جنریک.

EARS: هرگاه کاربر تمِ نمایش را تغییر دهد، سامانه باید کلِ رابط را بدون بارگذاری مجدد به تمِ انتخابی درآورد و انتخاب را ماندگار کند.

Subtaskها
#کارجزئیات فنیتخمین
F2.1استخراج توکن‌هااستخراج پالت رنگ/فاصله/تایپ از پروتوتایپ → CSS variables + tailwind.config۶ ساعت
F2.2تایپوگرافی و فونتمقیاس تایپ (وزن/عرض/فاصله)، فونت IRANYekan، RTL سراسری۴ ساعت
F2.3کامپوننت‌های پایهButton/Input/Select/Modal/Card/Badge/Toast/Skeleton/Table با variantها۱۲ ساعت
F2.4تمِ روشن/تیرهmountِ next-themes، دو تم، سوییچرِ ماندگار، اجتناب از flash۶ ساعت
F2.5حالت‌های وضعیتالگوهای loading/empty/error استاندارد۴ ساعت
معیار پذیرش
  • Given تمِ تیره فعال، When صفحه رندر شود، Then همه‌ی کامپوننت‌ها رنگِ درست و کنتراستِ AA دارند.
  • Given تعویضِ تم، When رفرش شود، Then تمِ قبلی بدون پرشِ رنگ بازیابی شود.
وابستگی: F1.
◆ تیم Backend
B1زیرساختِ REST مشترک (پاکت، صفحه‌بندی، خطا، CORS، آپلود)P1نساخته۴ روز

قبل از هر منبع، لایه‌های عرضیِ DRF باید ساخته شوند تا همه‌ی endpointها دقیقاً قراردادِ PHP را بدهند. الان هیچ‌کدام وجود ندارد.

EARS: هرگاه یک درخواستِ فهرست پردازش شود، سامانه باید پاسخ را در پاکتِ {data, links, meta} با meta.current_page/per_page/total بازگرداند.

Subtaskها
#کارجزئیات فنیتخمین
B1.1Pagination classPageNumberPagination سفارشی با خروجیِ دقیقِ data/links/meta۵ ساعت
B1.2Exception handlerهندلرِ سراسری برای فرمتِ یکسانِ خطا در ۴۰۱/۴۰۳/۴۰۴/۴۲۲۵ ساعت
B1.3فیلتر/جستجو/مرتب‌سازیbackendهای مشترک با نام‌پارامترهای یکسان با PHP۶ ساعت
B1.4CORS و هدرهانصب/پیکربندی django-cors-headers (نصب نیست)، هدرهای امنیتی۳ ساعت
B1.5آپلود فایل/رسانهMultiPartParser، اعتبارسنجی نوع/اندازه، مسیرِ سازگار با اکسوال۶ ساعت
B1.6پایه‌ی تستراه‌اندازی pytest-django + factory + APIClient مبنا۵ ساعت
وابستگی: ندارد (نقطه‌ی شروعِ Backend).
B2استراتژیِ auth واحد PHP↔Django (JWT مشترک)P1نساخته۳ روز

بلوکِ SIMPLE_JWT در config/settings/base.py نیست. Django باید همان JWT HS256 با رازِ مشترک و claimهای اکسوال را verify کند تا توکنِ PHP در Django معتبر باشد و بالعکس.

Subtaskها
#کارجزئیات فنیتخمین
B2.1پیکربندی SimpleJWTHS256، SIGNING_KEY = sha256(OW_PASSWORD_PEPPER)، claim sub→userId، طولِ عمرِ منطبق۶ ساعت
B2.2Authentication classکلاسِ سفارشیِ DRF: verify JWTِ PHP و resolve کاربرِ legacy۶ ساعت
B2.3Permission mappingترجمه‌ی مجوزِ پلاگینیِ اکسوال (isAuthorized) به permissionهای DRF۶ ساعت
B2.4تستِ سازگاری متقابلتوکنِ رازِ PHP در Django بپذیرد؛ بدون‌امضا/منقضی رد شود۶ ساعت
معیار پذیرش
  • Given یک JWTِ معتبرِ PHP، When به endpointِ محافظت‌شده‌ی Django فرستاده شود، Then ۲۰۰ و همان کاربر resolve شود.
  • Given توکنِ منقضی/دست‌کاری‌شده، When فرستاده شود، Then ۴۰۱ برگردد.
وابستگی: B1. مرجع: معماری — بخش auth.
B3رفعِ خطاهای استقرار و پیکربندیِ productionP1نساخته۲ روز

production.py خالی است؛ docker/Dockerfile ENTRYPOINT اشتباه دارد (shub.asgi، Celery SharifAutoEDA — کپی از پروژه‌ی دیگر)؛ requirements فاقد gunicorn/uvicorn/pytest است.

Subtaskها
#کارجزئیات فنیتخمین
B3.1production.pyDEBUG=False، ALLOWED_HOSTS، DB از env، static/media، logging۴ ساعت
B3.2Dockerfileاصلاحِ ENTRYPOINT، حذف ارجاعِ Celery غلط، multi-stage تمیز۴ ساعت
B3.3requirements و envافزودن gunicorn/uvicorn/pytest؛ اصلاحِ .env.example برای دو DB۳ ساعت
B3.4healthcheck و اجرای محلیتأیید بالاآمدنِ کانتینر، /api/v1/health، اتصالِ دو DB۵ ساعت
وابستگی: مستقل؛ موازیِ B1/B2.
۱

احراز هویت، پوسته و لایه‌ی داده

دروازه‌ی ورود و اسکلتِ همه‌ی صفحه‌های بعدی. تا اینجا تمام نشود، هیچ صفحه‌ی محتوایی قابلِ‌اتکا نیست.

◆ تیم Front
F3جریان کاملِ احراز هویت: refresh، محافظتِ مسیر، logoutP1ناقص۳.۵ روز
User Storyبه‌عنوان عضو سازمان، می‌خواهم یک‌بار وارد شوم و نشستم بی‌آنکه مدام بیرون بیفتم حفظ شود، و مسیرهای خصوصی بدونِ ورود در دسترس نباشند، تا کارم امن و بی‌وقفه باشد.

login/register هست ولی response interceptor در libs/axios.ts no-op است، logout در useAuth.ts صرفاً stub است و هیچ middleware.tsای مسیرها را محافظت نمی‌کند.

EARS: هرگاه یک درخواستِ API با ۴۰۱ برگردد و refresh معتبر باشد، سامانه باید توکن را نو و همان درخواست را یک‌بار تکرار کند؛ در غیر این‌صورت کاربر را به ورود هدایت کند.

Subtaskها
#کارجزئیات فنیتخمین
F3.1منطق refreshinterceptor: بر ۴۰۱ فراخوانیِ POST /auth/refresh، صف‌بندیِ همزمان، retry یک‌باره، خروج بر شکست۸ ساعت
F3.2middleware مسیرmiddleware.ts گاردِ /workspace/* و /social/*؛ ریدایرکتِ مهمان به /login?next=۵ ساعت
F3.3logout واقعیابطالِ سمتِ سرور، پاک‌سازیِ store و توکن‌ها، ریدایرکت۳ ساعت
F3.4هیدریشنِ نشستبازخوانیِ کاربر از GET /auth/me در بوت، همگام‌سازی با store پایدار۴ ساعت
F3.5ثبت‌نام و خطاهااتصالِ فرمِ register، نمایشِ خطاهای ۴۲۲ فیلدی، loading۴ ساعت
F3.6تغییر رمزUIِ PATCH /auth/change-password (endpoint هست)۴ ساعت
معیار پذیرش
  • Given نشستِ منقضی، When کاربر عملی انجام دهد، Then توکن بی‌صدا نو و عمل بدونِ خروج ادامه یابد.
  • Given مهمان، When /workspace باز شود، Then به /login با پارامترِ بازگشت هدایت شود.
وابستگی: F1؛ داده: B4 (تا آماده‌شدن به PHP /auth/* وصل شود).
F4پوسته‌ی برنامه: چیدمان، سایدبار، هدر و ناوبریP1ناقص۳ روز
User Storyبه‌عنوان کاربر، می‌خواهم منوی کناریِ همه‌ی بخش‌ها، نوارِ بالا با پروفایل/اعلان/جستجو و مسیرِ فعال را ببینم، تا در ~۲۰ بخشِ محصول به‌راحتی جابه‌جا شوم.

پروتوتایپ سایدباری با ~۲۰ برچسب دارد (components/Sidebar.tsx). پوسته‌ی واکنش‌گرا با active-state، حالتِ موبایل و اسلاتِ محتوا ساخته شود تا صفحه‌های بعدی داخلش بنشینند.

Subtaskها
#کارجزئیات فنیتخمین
F4.1Layout و گریدlayoutِ سه‌بخشی (سایدبار/هدر/محتوا)، اسکرول مستقل، RTL۴ ساعت
F4.2سایدبار~۲۰ آیتم منطبق بر پروتوتایپ، گروه‌بندی، آیکن، active-state از مسیر۶ ساعت
F4.3هدرمنوی پروفایل، زنگِ اعلان (badge)، جستجوی سراسری، سوییچرِ تم۵ ساعت
F4.4ناوبریِ موبایلdrawer/بستنِ خودکار، breakpointها، focus trap۴ ساعت
F4.5Breadcrumb و عنوانعنوانِ صفحه‌ی پویا و مسیر بر اساس روت۳ ساعت
وابستگی: F2، F3.
F5لایه‌ی داده‌ی استاندارد (سرویس + hookهای Query/Mutation)P1ناقص۳ روز

الان فقط useAuth و useBlogs واقعی‌اند؛ بقیه روی آرایه‌ی mock با useState کار می‌کنند و حتی mock را mutate می‌کنند. یک الگوی تکرارپذیر (سرویس + hook) و ابزارهای مشترکِ TanStack Query ساخته شود تا هر بخشِ بعدی سریع و یکدست وصل شود.

Subtaskها
#کارجزئیات فنیتخمین
F5.1پیکربندی QueryClientdefaultها (staleTime/retry)، devtools، مرزهای خطا۳ ساعت
F5.2الگوی سرویسقالبِ services/api/<resource>.ts بر پایه‌ی blogs.ts؛ typeها از قرارداد۴ ساعت
F5.3hookهای عمومیuseList/useDetail/useCreate/useUpdate/useDelete با کلیدِ کش و invalidation۶ ساعت
F5.4ابزارِ صفحه‌بندی/فیلترهوکِ مشترکِ pagination/filter منطبق بر meta؛ infinite/صفحه‌ای۵ ساعت
F5.5مدیریت خطا و توستنگاشتِ ۴۲۲ به خطای فیلدی، توستِ سراسری، optimistic اختیاری۴ ساعت
وابستگی: F1. پیش‌نیازِ همه‌ی تسک‌های محتوایی (F6 به بعد).
◆ تیم Backend
B4endpointهای احراز هویتP1ناقص۳ روز

فقط /me و /health هست. مجموعه‌ی کاملِ auth منطبق بر قراردادِ PHP، روی مدلِ کاربرِ legacy.

Subtaskها
#کارجزئیات فنیتخمین
B4.1loginPOST /auth/login: راستیِ رمز به‌شیوه‌ی اکسوال (pepper+hash)، صدور JWT۶ ساعت
B4.2refresh + logoutPOST /auth/refresh، ابطال، چرخشِ refresh۵ ساعت
B4.3registerPOST /auth/register: اعتبارسنجی، ایجادِ کاربر در جداولِ اکسوال۶ ساعت
B4.4change-password + permissionsPATCH /auth/change-password، GET /auth/permissions۴ ساعت
B4.5تستlogin/refresh/register/۴۲۲؛ برابری با پاسخِ PHP۳ ساعت
وابستگی: B1، B2.
B5تصمیمِ داده + مدل‌های پایه‌ی legacyP1ناقص۳ روز

الان فقط ۲ جدول (ow_base_user, ow_base_user_auth_token) با managed=False نگاشت شده. سیاستِ داده تثبیت شود: خواندنِ مستقیم از ow_ در برابر مهاجرت به motoshub_new؛ و مدل‌های پایه ساخته شوند.

Subtaskها
#کارجزئیات فنیتخمین
B5.1سندِ تصمیمِ داده (ADR)کدام منابع مستقیم از ow_، کدام مهاجرت؛ روترِ DB۴ ساعت
B5.2introspect جداولinspectdb روی جداولِ کلیدی، پاک‌سازیِ مدل‌ها، managed=False۶ ساعت
B5.3مدلِ کاربر و پروفایلتکمیلِ LegacyUser، پروفایل/آواتار، رابطه‌ها۶ ساعت
B5.4سرویس‌های مشترکلایه‌ی سرویسِ پایه، تراکنش روی دو DB، تستِ اتصال۴ ساعت
وابستگی: B1. پیش‌نیازِ همه‌ی منابعِ B6 به بعد.
۲

هسته‌ی محتوا

پرتکرارترین بخش‌هایی که کاربر روزانه می‌بیند: داشبورد، تازه‌ها، بلاگ، کاربران/پروفایل. رسیدن تا اینجا = «محصولِ قابلِ‌نمایش».

◆ تیم Front
F6داشبورد فعالیت‌هاP1ناقص۴ روز
User Storyبه‌عنوان عضو، می‌خواهم در ورود، فیدِ فعالیت، رویدادهای پیشِ‌رو، اعلان‌ها و میان‌برهای کاری‌ام را یک‌جا ببینم، تا وضعیت روزم را سریع بفهمم.

/workspace و /social الان literalِ ثابت‌اند. ویجت‌های واقعی از چند endpoint ساخته شوند. مرجع: pages/Dashboard.tsx.

Subtaskها
#کارجزئیات فنیتخمین
F6.1ویجت فیدخلاصه از GET /newsfeed?scope=feed، خالی/loading۶ ساعت
F6.2ویجت رویداد/اعلانGET /events، GET /notifications۶ ساعت
F6.3ویجت آمار/میان‌برکارت‌های آمار و میان‌برهای سریع منطبق بر پروتوتایپ۵ ساعت
F6.4چیدمان واکنش‌گراگریدِ ویجت‌ها، ترتیب موبایل، اسکلتون۴ ساعت
وابستگی: F4، F5. داده: B7/B11/B15.
F7تازه‌ها / فید سازمانی (Channels)P1ناقص۶ روز
User Storyبه‌عنوان عضو، می‌خواهم مطلب (متن/عکس/فایل PDF/Word) منتشر کنم، آن را «انتشار عمومی» با یک «دسته‌بندی» بزنم و مطالبِ دیگران را لایک/نظر بدهم، تا جریانِ اطلاعاتِ سازمان زنده بماند.

/social/channels mock است. پیچیده‌ترین بخشِ فاز: کامپوزرِ انتشار با پیوست، دسته‌بندیِ انتشارِ عمومی (همان فیچرِ افزوده‌شده به پلاگین iisnewsfeedpin)، لایک/نظر/فوروارد و اسکرولِ بی‌نهایت.

EARS: هرگاه کاربر مطلبی را «انتشار عمومی» کند، سامانه باید امکانِ انتخابِ دسته‌بندیِ درختی را بدهد و مطلب را با آن دسته در فیدِ عمومی نمایش دهد.

Subtaskها
#کارجزئیات فنیتخمین
F7.1فهرست فیداسکرول بی‌نهایت از GET /newsfeed، رندرِ انواع آیتم، اسکلتون۸ ساعت
F7.2کامپوزر انتشارPOST /newsfeed: متن، منشن، پیش‌نمایشِ لینک۶ ساعت
F7.3پیوست فایلآپلودِ PDF/Word/عکس، نوار پیشرفت، اعتبارسنجیِ نوع/اندازه۶ ساعت
F7.4انتشار عمومی + دسته‌بندیfloatboxِ انتخابِ دسته‌ی درختی، اتصال به endpointِ دسته‌بندیِ انتشار۸ ساعت
F7.5تعامل‌هالایک/نظر/فوروارد با optimistic و invalidation۸ ساعت
F7.6فیلترِ دستهفیلترِ فیدِ عمومی بر اساس دسته‌بندی۴ ساعت
معیار پذیرش
  • Given فایلِ PDF پیوست، When مطلب منتشر شود، Then در فید با لینکِ دانلود نمایش داده شود.
  • Given انتشارِ عمومیِ دسته‌دار، When فیدِ عمومی با آن دسته فیلتر شود، Then فقط مطالبِ همان دسته دیده شوند.
وابستگی: F5. داده: B7.
F8بلاگ (تکمیل: جزئیات و ساخت)P2ناقص۳ روز
User Storyبه‌عنوان نویسنده، می‌خواهم پستِ بلاگ بنویسم، ویرایش/حذف کنم و پست‌ها را کامل بخوانم، تا محتوای بلندِ سازمانی تولید و مصرف شود.

فهرست به /blogs وصل است. باقی‌مانده: صفحه‌ی جزئیات، ساخت/ویرایش با ادیتور، و رفعِ تگِ ساختگیِ blogsList.tsx:30.

Subtaskها
#کارجزئیات فنیتخمین
F8.1صفحه‌ی جزئیات/social/blogs/[id] از GET /blogs/:id، نظرات، متادیتا۶ ساعت
F8.2ساخت/ویرایشPOST/PATCH /blogs با ادیتورِ غنی، پیش‌نمایش، کاور۸ ساعت
F8.3حذف و رفعِ mockDELETE /blogs/:id با تأیید؛ حذفِ تگِ ساختگیِ blogsList.tsx:30۴ ساعت
F8.4فهرست و فیلترصفحه‌بندی، جستجو، فیلترِ نویسنده/تاریخ۴ ساعت
وابستگی: F5. داده: B8 (قرارداد PHP آماده است).
F9کاربران، پروفایل و تنظیماتِ حسابP2ناقص۴ روز
User Storyبه‌عنوان کاربر، می‌خواهم پروفایلم را ببینم و ویرایش کنم، آواتار بگذارم و کاربرانِ دیگر را بیابم؛ و به‌عنوان مدیر، فهرستِ کاربران را مدیریت کنم.

جدولِ کاربران mock است و دکمه‌های Add/Edit مرده‌اند. فهرست، پروفایلِ عمومی، ویرایشِ پروفایلِ خود و آواتار ساخته شود.

Subtaskها
#کارجزئیات فنیتخمین
F9.1فهرست کاربرانGET /users با جستجو/صفحه‌بندی/فیلتر۵ ساعت
F9.2پروفایلِ عمومیصفحه‌ی پروفایل، تب‌های فعالیت/دوستان/رسانه۶ ساعت
F9.3ویرایش پروفایلPATCH /users/me، فیلدهای پویا، اعتبارسنجی۶ ساعت
F9.4آواتارآپلود/برش آواتار /users/me/avatar۵ ساعت
F9.5تنظیمات حسابیکپارچه‌سازی با تغییرِ رمز (F3.6)، حریمِ خصوصی، مسدودها۴ ساعت
وابستگی: F5. داده: B6.
◆ تیم Backend
B6منبعِ کاربران و پروفایلP1نساخته۴ روز

منبعِ پرکاربردِ همه‌ی بخش‌ها. مطابقِ endpointهای PHP: فهرست، پروفایل، ویرایش، آواتار، مسدودها و نشست‌ها.

Subtaskها
#کارجزئیات فنیتخمین
B6.1Model + Serializerنگاشتِ کاربر/پروفایل/فیلدهای پویا (ow_base_question*)۶ ساعت
B6.2list + detailGET /users، GET /users/:id با فیلتر/جستجو/صفحه‌بندی۶ ساعت
B6.3update + avatarPATCH /users/me، POST /users/me/avatar۶ ساعت
B6.4blocked + sessions/users/blocked، /sessions۴ ساعت
B6.5تست + مجوزتست‌های دسترسی/مالکیت، برابری با PHP۴ ساعت
وابستگی: B4، B5.
B7منبعِ تازه‌ها (فید) + دسته‌بندیِ انتشارP1نساخته۶ روز

پیچیده‌ترین منبعِ فاز: فید، انتشار با پیوست، لایک/نظر/فوروارد و دسته‌بندیِ انتشارِ عمومی (منطبق با فیچرِ iisnewsfeedpin).

Subtaskها
#کارجزئیات فنیتخمین
B7.1مدل‌های فیدنگاشتِ ow_newsfeed_*، اکشن/آیتم/محتوا۶ ساعت
B7.2list فیدGET /newsfeed با scope (feed/site/user)، صفحه‌بندی۶ ساعت
B7.3create + attachmentPOST /newsfeed، پیوستِ PDF/Word/عکس۸ ساعت
B7.4لایک/نظر/فورواردendpointهای تعامل منطبق بر PHP۸ ساعت
B7.5دسته‌بندیِ انتشارمنبعِ دسته‌ی درختی + فیلترِ فیدِ عمومی بر اساس دسته۸ ساعت
B7.6تستانتشار/تعامل/فیلترِ دسته۴ ساعت
وابستگی: B5، B6.
B8منبعِ بلاگP2نساخته۳ روز
Subtaskها
#کارجزئیات فنیتخمین
B8.1Model + Serializerنگاشتِ ow_blogs_post و نظرات/برچسب۴ ساعت
B8.2CRUDGET/POST/PATCH/DELETE /blogs، GET /blogs/:id۸ ساعت
B8.3مالکیت/مجوزچکِ مالکیت در ویرایش/حذف، منطبق بر منطقِ PHP۴ ساعت
B8.4تستlifecycle + دسترسی۴ ساعت
وابستگی: B5.
۳

فضاهای اجتماعی

بخش‌های تعاملیِ سازمان: گروه‌ها، اخبار، رویدادها، رسانه، فروم. الگوهای فاز ۲ اینجا تکرار و مقیاس‌پذیر می‌شوند.

◆ تیم Front
F10گروه‌های تعاملیP2ناقص۶ روز
User Storyبه‌عنوان عضو، می‌خواهم گروه بسازم/عضو شوم، در دیوارِ گروه مطلب بگذارم، فایل به اشتراک بگذارم و اعضا را ببینم، تا کارِ تیمی حولِ موضوع شکل بگیرد.

/social/groups mock با handlerهای خالی است. نیازمندِ فهرست، جزئیاتِ گروه (دیوار/اعضا/فایل)، عضویت و ساخت.

Subtaskها
#کارجزئیات فنیتخمین
F10.1فهرست + ساختGET /groups، POST /groups، فیلتر/جستجو۶ ساعت
F10.2جزئیات + دیوار/groups/:id، فیدِ اختصاصیِ گروه۸ ساعت
F10.3اعضا و عضویت/members، /join، /invites، نقش‌ها۸ ساعت
F10.4فایل‌های گروه/files با آپلود/دانلود۶ ساعت
F10.5تنظیمات گروهویرایش/حریمِ خصوصی/حذف با مجوز۴ ساعت
وابستگی: F5، F7 (الگوی دیوار). داده: B10.
F11اخبار سازمانP2نساخته۲.۵ روز
User Storyبه‌عنوان عضو، می‌خواهم اخبارِ رسمیِ سازمان را با جزئیات بخوانم؛ و به‌عنوان مدیرِ محتوا خبر منتشر کنم، تا اطلاع‌رسانیِ رسمی متمرکز باشد.

روتِ /social/news اصلاً وجود ندارد (۴۰۴). مرجع: News.tsx, NewsItemDetail.tsx.

Subtaskها
#کارجزئیات فنیتخمین
F11.1فهرست اخبارروتِ جدید، GET /news، دسته‌بندی/صفحه‌بندی۶ ساعت
F11.2جزئیات خبر/news/[id] از GET /news/:id، رسانه/گالری۵ ساعت
F11.3انتشار/ویرایشPOST/PATCH /news با مجوزِ مدیر۶ ساعت
F11.4ویجت داشبورداتصالِ آخرین اخبار به داشبورد۳ ساعت
وابستگی: F5. داده: B9.
F12رویدادها و جلساتP2نساخته۳.۵ روز
User Storyبه‌عنوان عضو، می‌خواهم رویداد بسازم، دیگران را دعوت کنم و حضورم را اعلام کنم و تقویمِ رویدادها را ببینم، تا جلساتِ سازمان هماهنگ شوند.

روتِ /social/events وجود ندارد. مرجع: Events.tsx, EventItemDetail.tsx. قراردادِ Backend از قبل تست‌شده است (Pest).

Subtaskها
#کارجزئیات فنیتخمین
F12.1فهرست/تقویمGET /events، لیست + تقویم، فیلترِ زمان۸ ساعت
F12.2ساخت/ویرایشPOST/PATCH /events با زمان/مکان/سطحِ دید۶ ساعت
F12.3دعوت و RSVP/invites، اعلامِ حضور، فهرستِ شرکت‌کنندگان۶ ساعت
F12.4جزئیات + پیوستجزئیات، فایل‌ها، حذف با مجوز۵ ساعت
وابستگی: F5. داده: B11 (آماده).
F13تصاویر و ویدیو (رسانه)P2نساخته۳.۵ روز
User Storyبه‌عنوان عضو، می‌خواهم آلبومِ عکس و ویدیو بسازم، رسانه آپلود کنم و گالریِ سازمان را مرور کنم، تا محتوای بصری به اشتراک گذاشته شود.

روتِ /social/media وجود ندارد. مرجع: Media.tsx, MediaItemDetail.tsx.

Subtaskها
#کارجزئیات فنیتخمین
F13.1گالری عکس/آلبوم/photos، /albums، لایت‌باکس، صفحه‌بندی۸ ساعت
F13.2آپلود عکسآپلودِ چندتایی، پیش‌نمایش، انتخابِ آلبوم۶ ساعت
F13.3ویدیو/videos، پخش، آپلود/embed۶ ساعت
F13.4مدیریت آلبومساخت/ویرایش/حذف، کاور، مجوزِ مالکیت۵ ساعت
وابستگی: F5. داده: B12 (آماده، با اصلاحاتِ IDOR).
F14انجمن (فروم)P2نساخته۳ روز
User Storyبه‌عنوان عضو، می‌خواهم موضوع بسازم، پاسخ بدهم و بحث‌های دسته‌بندی‌شده را دنبال کنم، تا گفتگوهای ماندگارِ سازمان شکل بگیرد.

روتِ /social/forums وجود ندارد. مرجع: Forum.tsx و نوعِ ForumTopic.

Subtaskها
#کارجزئیات فنیتخمین
F14.1دسته‌ها/بخش‌هافهرستِ بخش‌ها و موضوع‌ها GET /forum/topics۶ ساعت
F14.2موضوع + پست‌ها/topics/:id/posts، صفحه‌بندیِ پاسخ‌ها، نقل‌قول۸ ساعت
F14.3ساخت موضوع/پاسخادیتور، پیوست، اعلانِ اشتراک۶ ساعت
F14.4مدیریتقفل/پین/انتقال با مجوزِ ناظر۴ ساعت
وابستگی: F5. داده: B13.
◆ تیم Backend
B9منبعِ اخبارP2نساخته۳ روز
#کارجزئیات فنیتخمین
B9.1Model + Serializerنگاشتِ منبعِ خبر و دسته/رسانه۴ ساعت
B9.2CRUD + listGET/POST/PATCH /news، /news/:id۸ ساعت
B9.3مجوزِ انتشارمحدودسازیِ انتشار به نقشِ مدیرِ محتوا۴ ساعت
B9.4تستlifecycle + دسترسی۴ ساعت
وابستگی: B5.
B10منبعِ گروه‌هاP2نساخته۶ روز
#کارجزئیات فنیتخمین
B10.1مدل‌هاگروه/عضویت/نقش/دعوت، نگاشتِ جداولِ اکسوال۶ ساعت
B10.2CRUD گروهGET/POST/PATCH/DELETE /groups، /groups/:id۸ ساعت
B10.3اعضا/عضویت/members، /join، /invites، نقش/مجوز۸ ساعت
B10.4دیوار/فایلفیدِ گروه، /files آپلود/دانلود۸ ساعت
B10.5تستعضویت/مجوز/فایل۴ ساعت
وابستگی: B5، B7 (الگوی فید).
B11منبعِ رویدادهاP2آماده در PHP۵ روز

قراردادِ PHP و تست‌های Pest موجودند (نمونه: EventControllerTest). این تسک بازسازیِ همان در Django است.

#کارجزئیات فنیتخمین
B11.1مدل‌هارویداد/دعوت/شرکت‌کننده/فایل۶ ساعت
B11.2CRUDGET/POST/PATCH/DELETE /events، اعتبارسنجیِ زمان۸ ساعت
B11.3دعوت/RSVP/invites، حضور، سطحِ دید/دعوت۸ ساعت
B11.4تست معادلِ Pestپورتِ سناریوهای EventControllerTest به pytest۴ ساعت
وابستگی: B5.
B12منبعِ رسانه (عکس/آلبوم/ویدیو)P2آماده در PHP۶ روز

در PHP کامل و امن‌شده است (اصلاحاتِ IDOR و چکِ مالکیت در PhotoService/AlbumService). Django باید همان قرارداد و چک‌های مالکیت را بدهد.

#کارجزئیات فنیتخمین
B12.1مدل‌هاعکس/آلبوم/کاور/ویدیو، نگاشتِ ow_photo_*۶ ساعت
B12.2آلبوم CRUD/albums با چکِ مالکیت (مثلِ PHP: مالک یا ناظر)۸ ساعت
B12.3عکس CRUD + آپلود/photos، آپلود، به‌روزرسانیِ کاور، PATCH جزئی (بدون null‌کردن)۸ ساعت
B12.4ویدیو/videos CRUD + پردازش/embed۶ ساعت
B12.5تست IDORعدمِ دسترسیِ غیرمالک به ویرایش/حذف۴ ساعت
وابستگی: B5، B1.5 (آپلود).
B13منبعِ فرومP2نساخته۵ روز
#کارجزئیات فنیتخمین
B13.1مدل‌هابخش/موضوع/پست، نگاشتِ ow_forum_*۶ ساعت
B13.2موضوع‌هاGET/POST /forum/topics، دسته‌بندی۸ ساعت
B13.3پست‌ها/topics/:id/posts، پاسخ/نقل‌قول۸ ساعت
B13.4مدیریت + تستقفل/پین/انتقال با مجوز؛ تست۴ ساعت
وابستگی: B5.
۴

ارتباط و همکاری

ابزارهای کارِ روزمره: پیام‌رسان، مدیریت دانش، مدیریت پروژه (کانبان).

◆ تیم Front
F15گفتگو (پیام‌رسان)P3ناقص۶ روز
User Storyبه‌عنوان عضو، می‌خواهم گفتگوی خصوصی/گروهی داشته باشم، پیام و فایل بفرستم و پیامِ جدید را بی‌درنگ ببینم، تا هماهنگیِ سریع ممکن شود.

در پروتوتایپ و تبِ چتِ پروژه UIِ کاملِ mock هست. اتصال به پیام‌رسانِ واقعی؛ به‌روزرسانیِ بی‌درنگ (polling یا WebSocket).

#کارجزئیات فنیتخمین
F15.1فهرست گفتگوهاGET /conversations، شمارشِ نخوانده، جستجو۶ ساعت
F15.2پنجره‌ی پیام/messages، ارسال، بارگذاریِ تاریخچه (اسکرول معکوس)۸ ساعت
F15.3بی‌درنگpolling/WebSocket، وضعیتِ خوانده، تایپینگ۸ ساعت
F15.4پیوستارسالِ فایل/عکس، پیش‌نمایش۶ ساعت
وابستگی: F5. داده: B14.
F16مدیریت دانشP3نساخته۲.۵ روز
User Storyبه‌عنوان عضو، می‌خواهم اسناد و راهنماهای سازمانی را در یک کتابخانه‌ی دسته‌بندی‌شده بیابم و بخوانم، تا دانشِ سازمان حفظ و بازیابی شود.
#کارجزئیات فنیتخمین
F16.1کتابخانهGET /knowledge/documents، درختِ دسته، جستجو۶ ساعت
F16.2نمای سندنمایشگر/دانلود، متادیتا، نسخه۶ ساعت
F16.3افزودن سندآپلود/دسته‌بندی با مجوز۵ ساعت
وابستگی: F5. داده: B16.
F17مدیریت پروژه (کانبان + چت پروژه)P3ناقص۷ روز
User Storyبه‌عنوان عضوِ تیم، می‌خواهم پروژه بسازم، وظایف را روی بردِ کانبان بکشم‌و‌رها کنم، اعضا را تخصیص دهم و در چتِ پروژه گفتگو کنم، تا کارِ تیمی مدیریت شود.

/workspace/projects (فهرست/جزئیات/کانبان/چت) کامل ولی mock است. اتصالِ همه به API واقعی، از جمله drag-and-drop با persist.

#کارجزئیات فنیتخمین
F17.1فهرست/ساخت پروژهGET/POST /projects، اعضا، وضعیت۶ ساعت
F17.2بردِ کانبانستون‌ها/کارت‌ها، drag-and-drop، persistِ ترتیب/وضعیت۱۲ ساعت
F17.3وظیفهجزئیاتِ وظیفه، تخصیص، سررسید، چک‌لیست، پیوست۸ ساعت
F17.4چتِ پروژهاستفاده‌ی مجددِ کامپوننتِ چت (F15) در بستر پروژه۶ ساعت
F17.5نماهالیست/کانبان/تقویم، فیلترِ عضو/وضعیت۴ ساعت
وابستگی: F5، F15. داده: B16.
◆ تیم Backend
B14منبعِ پیام‌رسانP3نساخته۶ روز
#کارجزئیات فنیتخمین
B14.1مدل‌هاگفتگو/پیام/عضو/وضعیتِ خوانده، نگاشتِ ow_mailbox_*۶ ساعت
B14.2گفتگوهاGET /conversations، ساخت، شمارشِ نخوانده۶ ساعت
B14.3پیام‌ها/messages ارسال/فهرست، صفحه‌بندیِ تاریخچه۸ ساعت
B14.4بی‌درنگChannels/WebSocket یا long-poll؛ پیوست۱۰ ساعت
B14.5تستارسال/خواندن/دسترسیِ عضو۴ ساعت
وابستگی: B5. (WebSocket نیازمندِ ASGI؛ مرتبط با B3.)
B15منبعِ دوستان و اعلان‌هاP2نساخته۴ روز
#کارجزئیات فنیتخمین
B15.1دوستان/friends: درخواست/تأیید/حذف، نگاشتِ ow_friends_*۸ ساعت
B15.2اعلان‌هاGET /notifications، علامتِ خوانده، شمارش۸ ساعت
B15.3تولیدِ اعلانhookهای رویداد (لایک/نظر/دعوت) → اعلان۶ ساعت
B15.4تستچرخه‌ی دوستی/اعلان۴ ساعت
وابستگی: B5.
B16منبعِ دانش و پروژهP3نساخته۶ روز
#کارجزئیات فنیتخمین
B16.1دانش/knowledge/documents CRUD + دسته + آپلود۸ ساعت
B16.2پروژه/projects CRUD + اعضا + وضعیت۸ ساعت
B16.3وظیفه/کانبانستون/کارت/ترتیب، endpointِ جابه‌جایی و تخصیص۸ ساعت
B16.4تستCRUD + persistِ ترتیب۴ ساعت
وابستگی: B5. (اگر پروژه در اکسوال منبع ندارد، مدلِ جدید در motoshub_new.)
۵

ماژول‌های سازمانی

بخش‌های تخصصیِ سازمان: قراردادها، صندوقِ نوآوری، پژوهش، آموزش، نظرسنجی/مسابقات/ارزیابی.

◆ تیم Front
F18ماژول‌های سازمانی (قرارداد/صندوق/پژوهش/آموزش)P3نساخته۸ روز
User Storyبه‌عنوان کاربرِ سازمانی، می‌خواهم قراردادها، فراخوان‌های صندوقِ نوآوری، پروژه‌های پژوهشی و دوره‌های آموزشی را ببینم و در آن‌ها اقدام کنم، تا فرایندهای سازمانی دیجیتال شوند.

چهار بخشِ مجزا با روت‌های موجودنبوده. مرجع: Contracts/Funds/Research/Training. هر بخش الگوی فهرست/جزئیات/فرم دارد.

#کارجزئیات فنیتخمین
F18.1قراردادهاروت، فهرست/جزئیات، وضعیت/گردش‌کار۱۰ ساعت
F18.2صندوقِ نوآوریفراخوان‌ها /cfps، ثبتِ درخواست /grants۱۲ ساعت
F18.3پژوهشفهرست/جزئیاتِ پروژه‌های پژوهشی، فناوری‌ها۱۰ ساعت
F18.4آموزشدوره‌ها، ثبت‌نام، پیشرفت۱۰ ساعت
F18.5یکپارچه‌سازی منوافزودن به سایدبار/داشبورد، مجوزها۴ ساعت
وابستگی: F5. داده: B17.
◆ تیم Backend
B17منبعِ ماژول‌های سازمانیP3نساخته۸ روز
#کارجزئیات فنیتخمین
B17.1قراردادها/تیکت/tickets و منبعِ قرارداد، گردش‌کارِ وضعیت۱۲ ساعت
B17.2صندوق/cfps، /grants: فراخوان/درخواست/داوری۱۲ ساعت
B17.3پژوهش/فناوری/technologies، /journal-*۱۲ ساعت
B17.4آموزشدوره/ثبت‌نام/پیشرفت۱۲ ساعت
B17.5تستCRUD + گردش‌کار۴ ساعت
وابستگی: B5.
B18منبعِ نظرسنجی، مسابقات و ارزیابیP3نساخته۵ روز
#کارجزئیات فنیتخمین
B18.1نظرسنجی/polls: ساخت/رأی/نتیجه۸ ساعت
B18.2مسابقات/competitions: ثبت/داوری۸ ساعت
B18.3ارزیابی/evaluations۶ ساعت
B18.4تسترأی/نتیجه/دسترسی۴ ساعت
وابستگی: B5.
۶

راهبری، جستجو، پولیش و تحویل

بخش‌های مدیریتی و پایانی که محصول را «کامل» و آماده‌ی تحویل می‌کنند.

◆ تیم Front
F19پنل راهبری، ظاهر/برندسازی و گزارش‌گیریP3نساخته۸ روز
User Storyبه‌عنوان مدیرِ سامانه، می‌خواهم کاربران/محتوا/تنظیمات را مدیریت کنم، ظاهر و برندِ سازمان را تغییر دهم و گزارش‌های کاربری بگیرم، تا سامانه را اداره کنم.
#کارجزئیات فنیتخمین
F19.1داشبوردِ راهبریآمار کلی، مدیریتِ کاربران/نقش‌ها /admin/*۱۰ ساعت
F19.2ظاهر/برندلوگو/رنگ/نامِ سازمان (per-tenant)، پیش‌نمایشِ زنده۱۰ ساعت
F19.3گزارش‌گیریگزارش‌های کاربری/محتوایی، نمودار، خروجی۱۰ ساعت
F19.4مدیریتِ محتوا/مجوزابزارهای مدیریتِ محتوا و نقش/دسترسی۶ ساعت
وابستگی: F5، F9. داده: endpointهای admin.
F20اعلان، جستجوی سراسری، راهنما، دستیار و پولیشِ نهاییP3ناقص۸ روز
User Storyبه‌عنوان کاربر، می‌خواهم اعلان‌هایم را ببینم، در کلِ سامانه جستجو کنم، راهنما بگیرم و از دستیارِ هوشمند کمک بخواهم، و رابطی روان و بی‌نقص داشته باشم.
#کارجزئیات فنیتخمین
F20.1مرکز اعلانGET /notifications، خواندن/تنظیمات، هدرِ زنگ۶ ساعت
F20.2جستجوی سراسریGET /search، نتایجِ چنددسته، صفحه‌ی نتایج۸ ساعت
F20.3راهنما و دستیارصفحه‌ی راهنما، دستیارِ هوشمند (طبقِ پروتوتایپ)۶ ساعت
F20.4پولیشِ a11y/RTLپیمایشِ کیبورد، aria، کنتراست، بازبینیِ RTL همه‌ی صفحه‌ها۶ ساعت
F20.5عملکردcode-splitting، بهینه‌ی تصویر، بازبینیِ کش، Lighthouse۶ ساعت
F20.6تستِ E2Eسناریوهای کلیدی با Playwright۶ ساعت
وابستگی: همه‌ی تسک‌های Front.
◆ تیم Backend
B19منبعِ جستجو + یکپارچه‌سازی و تحویلP3نساخته۴ روز
#کارجزئیات فنیتخمین
B19.1جستجوی سراسریGET /search چنددسته (کاربر/بلاگ/فروم/...)، صفحه‌بندی۸ ساعت
B19.2برابریِ قراردادتستِ diffِ پاسخِ Django با PHP روی endpointهای کلیدی۶ ساعت
B19.3سوییچِ Gatewayمستندِ گذارِ مسیر‌به‌مسیر از PHP به Django بدونِ downtime۶ ساعت
B19.4OpenAPI + تحویلهم‌ترازیِ drf-spectacular با قراردادِ v1، انتشارِ داکِ نهایی۶ ساعت
وابستگی: همه‌ی منابعِ Backend.
یادداشتِ برنامه‌ریزی. ترتیبِ فازها ترتیبِ اجراست، اما درونِ هر فاز تسک‌های Front و Backend موازی‌اند. توصیه: در آغازِ هر فاز یک جلسه‌ی Planning و کالیبراسیونِ تخمین، و در پایانِ هر فاز یک Demo روی همان صفحه‌ی پروتوتایپ برای سنجشِ «چقدر به هدف رسیدیم». تخمین‌ها بدونِ زمانِ بازکاریِ ناشی از تغییرِ نیازمندی و بدونِ زمانِ استقرار محاسبه شده‌اند؛ یک بافرِ ۱۵–۲۰٪ در برنامه لحاظ شود.

پایپ‌لاین تحویل و کیفیت (الزامی برای هر دو تیم)

هیچ تسکی «انجام‌شده» نیست مگر از همه‌ی این گیت‌ها عبور کند. هدف: کارِ اضافه نه، اما هر کاری که انجام می‌شود چندبار و در چند لایه تست شده باشد. هر گیت مسئول مشخص دارد و هیچ مرحله‌ای «به عهده‌ی بعداً» نیست.

◆ مسیر عبور هر تسک (Front و Backend یکسان)
#گیتمسئولمعیار عبور (بدون ابهام)
۱آماده‌ی شروع (DoR)POتسک شماره‌ی issue دارد؛ User Story + معیارهای پذیرش در همین صفحه/ایشو مشخص است؛ وابستگی‌هایش باز نیست. تسکِ بدون معیار پذیرش شروع نمی‌شود.
۲توسعه روی برنچ ایشوDevبرنچ issue-N از main؛ کامیت‌ها با پیشوند #N. مستقیم روی main کامیت ممنوع (CI هم بلاک می‌کند).
۳تستِ لایه‌ی ۱ — واحدDevBackend: تست pytest/Pest برای هر endpoint جدید (سناریو موفق + ۴۰۱/۴۰۳/۴۲۲ + یک edge). Front: تست کامپوننت برای منطق غیربدیهی + tsc و ESLint سبز. کدِ بدون تستِ همراه، merge نمی‌شود.
۴Self-review + چک‌لیست MRDevقالب MR پر شده: «چه چیزی، چرا، چطور تست شد» + برای Front اسکرین‌شات/فیلم قبل‌وبعد (لایت و دارک، دسکتاپ و ۳۷۵px) + برای Backend نمونه‌ی curl درخواست/پاسخ.
۵CI سبز — لایه‌ی ۲خودکارlint + type-check + کل تست‌ها + build + (Backend: تستِ قرارداد علیه OpenAPI؛ Front: build بدون warning جدید). قرمز = merge غیرممکن.
۶Code review همتاDev دومحداقل ۱ تایید از غیرنویسنده؛ SLA بررسی ۲۴ ساعت کاری. تمرکز review: درستی، امنیت (IDOR/مجوز)، سازگاری با قراردادِ پاکت پاسخ.
۷Merge به main → دیپلوی staging خودکارخودکارFront: motonextfront.shub.ir · Backend: motonext staging. دیپلوی شکسته = بازگردانی فوری (revert اول، دیباگ بعد).
۸تستِ لایه‌ی ۳ — پذیرش روی stagingPO / QAاجرای معیارهای پذیرش روی staging: Front در دو مرورگر + موبایل واقعی؛ Backend با کالکشن Postman ماژول (همه‌ی حالت‌ها). فقط بعد از این تیک، وضعیت تسک «انجام‌شده» می‌شود.
۹رگرسیون هفتگیتیم (چرخشی)پایان هر هفته: چک‌لیست ۳۰ دقیقه‌ای مسیرهای حیاتی (ورود، فید، ایجاد محتوا، چت، آپلود، اعلان) روی staging. شکستِ رگرسیون = اولویت P1 هفته‌ی بعد.
◆ قواعد مکمل کیفیت
قانون باگ. هر باگی که پیدا شد، اول یک تستِ بازتولیدکننده نوشته می‌شود که قرمز شود، بعد فیکس — تا همان باگ هیچ‌وقت برنگردد.
تعریفِ «انجام‌شده» (DoD). کد merge شده + تست‌های هر سه لایه پاس + روی staging توسط PO پذیرفته + بدون TODO/console.log باقی‌مانده + مستند (endpoint جدید در Swagger / کامپوننت جدید با props مستند).
بدون کار اضافه. هر چیزی خارج از معیارهای پذیرشِ تسک = تسک جدید برای PO؛ داخل همان MR نمی‌آید. MRهای بزرگ‌تر از ~۴۰۰ خط تغییر باید شکسته شوند.
ادغام مکرر. برنچ ایشو بیش از ۳ روز کاری زنده نمی‌ماند؛ کار بزرگ‌تر از آن یعنی تسک درست شکسته نشده (برگشت به گیت ۱).
§

منابع فنی

سندکاربرد
راهنمای فرانت‌اندقرارداد، احراز هویت، صفحه‌بندی، خطاها، همه‌ی endpointها
مرجع کامل API · Swaggerامضای دقیقِ هر endpoint برای Backend (بازسازی) و Front (اتصال)
معماری سیستمGateway/دو ORM/اسکیمای ۴۰۷ جدول، استراتژیِ auth
راهنمای Opsنیازمندیِ سرور، استقرار، پایشِ منابع
Postman · openapi.jsonتستِ قرارداد و مبنای برابریِ Django با PHP
Motoshub · برنامه‌ی تحویلِ تیم Front و Backend
۳۹ تسک · ~۱۷۰ subtask · تخمینِ کلِ تک‌نفره ~۱۸۸ روزِ‌نفر · مسیرِ موازیِ ۴‌نفره ~۱۳ تا ۱۶ هفته
روش‌شناسی: Feature-Forge (User Story + EARS + Given/When/Then) و اصولِ Frontend-Design · تهیه‌شده پس از خواندنِ کاملِ سه ریپو