Motoshub · Delivery Plan · Backend

تسک‌های تیم Backend — با جزئیات پیاده‌سازی

همه‌ی تسک‌های بک‌اند با subtask، تخمین، User Story و معیار پذیرش. مرجع رفتار: demo.shub.ir · خط لوله‌ی الزامی تحویل: فرآیند تحویل و کیفیت · تسک‌های Front

راهنمای پیاده‌سازیزمان‌بندیتصمیم‌های الزام‌آورفاز ۰فاز ۱فاز ۲فاز ۳فاز ۴فاز ۵فاز ۶دامنه‌ی کشف‌شدههم‌ترازی با دموی نهاییپیام‌رسان کاملجمع‌بندی تخمین‌هاقرارداد دامنه‌بندیمشخصات پیام‌رسانوضعیت زنده

راهنمای پیاده‌سازی تیم Backend

استک و قراردادها. Django 5 + DRF + SimpleJWT روی MariaDB (دیتابیس مشترک Oxwall به‌صورت خواندنی از طریق مدل‌های unmanaged در legacy/). قرارداد پاسخ ثابت: پاکت {data, links, meta}، خطاهای ۴۰۱/۴۰۳/۴۰۴/۴۲۲ با بدنه‌ی یکسان — مرجع: Swagger زنده‌ی PHP در motonext.shub.ir/api/v1/docs.
auth مشترک. JWT HS256 با راز OW_PASSWORD_PEPPER و claims {iat, exp, sub} — توکن صادرشده توسط PHP باید در Django معتبر باشد و برعکس (تست سازگاری متقابل در B2.4 اجباری است).
الگوی هر ماژول. Model (یا legacy-map) ← Serializer ← ViewSet + Permission ← urls ← تست pytest (سناریوی موفق + ۴۰۱/۴۰۳/۴۲۲ + یک edge + تست IDOR برای منابع مالک‌دار). هیچ endpoint بدون تست merge نمی‌شود.
سوییچ تدریجی. هر ماژول که برابری قراردادش با PHP تایید شد، مسیرش در Gateway به Django سوییچ می‌شود (B19.3)؛ تا آن روز PHP پاسخ‌گوی production است — مهاجرت strangler-fig، بدون big-bang.
Σ

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

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

فازمحتواFrontBackendموازی
۰پایه: axios/design-system · REST-infra/auth-JWT/deploy/data-model۵.۵ روز۹ روز~۹ روز
۱احراز هویت، پوسته و ناوبری، لایه‌ی داده · endpointهای auth + مدل‌ها۹.۵ روز۶ روز~۱۰ روز
۲هسته: داشبورد، تازه‌ها، بلاگ، کاربران/پروفایل۱۷ روز۱۳ روز~۱۷ روز
۳اجتماعی: گروه‌ها، اخبار، رویدادها، رسانه، فروم۱۸.۵ روز۲۵ روز~۲۵ روز
۴ارتباط: چت، دانش، پروژه · پیام‌رسان، دوستان/اعلان، دانش/پروژه۱۵.۵ روز۱۶ روز~۱۶ روز
۵سازمانی: قرارداد/صندوق/پژوهش/آموزش · نظرسنجی/مسابقات۸ روز۱۳ روز~۱۳ روز
۶راهبری، ظاهر، گزارش، اعلان، جستجو، راهنما، دستیار، پولیش، تست۱۶ روز۴ روز~۱۶ روز
مجموع (تک‌نفره، بدون همپوشانی)~۹۰ روز~۸۶ روز~۱۰۶ روز
اصلاحِ جمع‌بندی (۱۴۰۵/۰۵/۱۱). جمعِ ستون‌های این جدول با مجموعِ تخمینِ تک‌تکِ تسک‌ها هم‌خوان نبود (Front ~۹۶ در برابر ۹۰ واقعی، Backend ~۹۲ در برابر ۸۶). اعدادِ جدول با مجموعِ واقعی هم‌خوان شد. هیچ تخمینی در هیچ تسکی تغییر نکرده است — فقط خطای جمع رفع شد. برآوردهای هفتگی و سناریوهای اندازه‌ی تیم نیز دست‌نخورده مانده‌اند، چون آن‌ها بر پایه‌ی مسیر بحرانی محاسبه شده‌اند نه جمعِ ساده.
تفسیرِ زمان. با ۲ توسعه‌دهنده‌ی 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 و بدنه‌ی یکسان. مرجعِ فیلدها: Swagger روی motonext.shub.ir/api/v1/docs/index — که در راستی‌آزماییِ ۱۴۰۵/۰۵/۱۱ پاسخِ ۴۰۴ داد و باید بازگردانده شود (جزئیات). تا آن زمان مرجعِ فیلدها = کنترلرها و Resourceهای ow_plugins/*/src/Http در برنچ API..
۴) دامنه‌بندی الزام‌آور است (الحاقیه ۱۴۰۵/۰۵/۱۴). هر موجودیت محتوایی سه فیلد scope/holdingId/companyId دارد؛ دامنه‌ی دید از عضویتِ کاربر محاسبه می‌شود نه از انتخاب او؛ و فیلتر/اعتبارسنجی باید سمت سرور باشد. مشخصات کامل و سناریوهای پذیرش: قرارداد دامنه‌بندی و دسترسی.
۰

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

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

◆ تیم 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 مبنا۵ ساعت
تعریف انجام (DoD)
  • پاکت پاسخ {data,links,meta}، صفحه‌بندی، بدنهٔ خطای یکسان (۴۰۱/۴۰۳/۴۰۴/۴۲۲)، CORS و آپلود مشترک — همگی با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: ندارد (نقطه‌ی شروعِ 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 ۴۰۱ برگردد.
تعریف انجام (DoD)
  • JWT HS256 با راز مشترک OW_PASSWORD_PEPPER؛ توکن PHP در Django معتبر و برعکس، با تست سازگاری متقابل.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: 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۵ ساعت
تعریف انجام (DoD)
  • production.py کامل، Dockerfile سالم و بیلد‌پذیر، CI هر دو ریپو سبز، محیط staging بالا.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: مستقل؛ موازیِ B1/B2.
۱

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

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

◆ تیم 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۳ ساعت
تعریف انجام (DoD)
  • endpointهای auth/login·me·refresh·logout·change-password با تست موفق + خطاها.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B1، B2.
الحاقیه‌ی ۱۴۰۵/۰۵/۱۴ (این تسک را تغییر نمی‌دهد): در نسخه‌ی نهایی، auth/me باید عضویت‌ها، تخصیص نقش و مجوزهای مؤثر را هم برگرداند ← B21.3.
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، تستِ اتصال۴ ساعت
تعریف انجام (DoD)
  • تصمیم داده نهایی؛ مدل‌های legacy پایه (unmanaged، بدون ستون‌های حساس) با DB router.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B1. پیش‌نیازِ همه‌ی منابعِ 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۴ ساعت
تعریف انجام (DoD)
  • منبع کاربران/پروفایل: /users با جستجو/صفحه‌بندی، ویرایش خود، آواتار — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B4، B5.
B7منبعِ تازه‌ها (فید) + دسته‌بندیِ انتشارP1نساخته۶ روز

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

Subtaskها
#کارجزئیات فنیتخمین
B7.1مدل‌های فیدنگاشتِ ow_newsfeed_*، اکشن/آیتم/محتوا۶ ساعت
B7.2list فیدGET /feed با scope (feed/site/user)، صفحه‌بندی۶ ساعت
B7.3create + attachmentPOST /feed، پیوستِ PDF/Word/عکس۸ ساعت
B7.4لایک/نظر/فورواردendpointهای تعامل منطبق بر PHP۸ ساعت
B7.5دسته‌بندیِ انتشارمنبعِ دسته‌ی درختی + فیلترِ فیدِ عمومی بر اساس دسته۸ ساعت
B7.6تستانتشار/تعامل/فیلترِ دسته۴ ساعت
تعریف انجام (DoD)
  • منبع فید: /feed با scope و پیوست؛ لایک/نظر/فوروارد — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: 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 + دسترسی۴ ساعت
تعریف انجام (DoD)
  • منبع بلاگ: CRUD /blogs با مجوز — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5.
۳

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

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

◆ تیم Backend
B9منبعِ اخبارP2نساخته۳ روز
#کارجزئیات فنیتخمین
B9.1Model + Serializerنگاشتِ منبعِ خبر و دسته/رسانه۴ ساعت
B9.2CRUD + listGET/POST/PATCH /news، /news/:id۸ ساعت
B9.3مجوزِ انتشارمحدودسازیِ انتشار به نقشِ مدیرِ محتوا۴ ساعت
B9.4تستlifecycle + دسترسی۴ ساعت
تعریف انجام (DoD)
  • منبع اخبار: CRUD /news + دسته‌بندی/scope انتشار — با تست lifecycle و دسترسی.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5.
الحاقیه‌ی ۱۴۰۵/۰۵/۱۴ (این تسک را تغییر نمی‌دهد): فیلد topic خبر (۵ مقدار) + فیلتر ?topic=B24.
B10منبعِ گروه‌هاP2نساخته۶ روز
#کارجزئیات فنیتخمین
B10.1مدل‌هاگروه/عضویت/نقش/دعوت، نگاشتِ جداولِ اکسوال۶ ساعت
B10.2CRUD گروهGET/POST/PATCH/DELETE /groups، /groups/:id۸ ساعت
B10.3اعضا/عضویت/members، /join، /invites، نقش/مجوز۸ ساعت
B10.4دیوار/فایلفیدِ گروه، /files آپلود/دانلود۸ ساعت
B10.5تستعضویت/مجوز/فایل۴ ساعت
تعریف انجام (DoD)
  • منبع گروه‌ها: CRUD + عضویت + نقش ناظم — با تست IDOR.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5، B7 (الگوی فید).
الحاقیه‌ی ۱۴۰۵/۰۵/۱۴ (این تسک را تغییر نمی‌دهد): قواعد «ناظم گروه» سمت سرور (فقط گروه خودش) ← B22.4.
B11منبعِ رویدادهاP2آماده در PHP۵ روز

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

#کارجزئیات فنیتخمین
B11.1مدل‌هارویداد/دعوت/شرکت‌کننده/فایل۶ ساعت
B11.2CRUDGET/POST/PATCH/DELETE /events، اعتبارسنجیِ زمان۸ ساعت
B11.3دعوت/RSVP/invites، حضور، سطحِ دید/دعوت۸ ساعت
B11.4تست معادلِ Pestپورتِ سناریوهای EventControllerTest به pytest۴ ساعت
تعریف انجام (DoD)
  • منبع رویدادها با دعوت/حضور — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5.
الحاقیه‌ی ۱۴۰۵/۰۵/۱۴ (این تسک را تغییر نمی‌دهد): فیلدهای category و capacity رویداد ← B24.
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عدمِ دسترسیِ غیرمالک به ویرایش/حذف۴ ساعت
تعریف انجام (DoD)
  • منبع رسانه (عکس/آلبوم/ویدیو) با حریم خصوصی — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5، B1.5 (آپلود).
الحاقیه‌ی ۱۴۰۵/۰۵/۱۴ (این تسک را تغییر نمی‌دهد): فیلد duration ویدیو ← B24.
B13منبعِ فرومP2نساخته۵ روز
#کارجزئیات فنیتخمین
B13.1مدل‌هابخش/موضوع/پست، نگاشتِ ow_forum_*۶ ساعت
B13.2موضوع‌هاGET/POST /forum/topics، دسته‌بندی۸ ساعت
B13.3پست‌ها/topics/:id/posts، پاسخ/نقل‌قول۸ ساعت
B13.4مدیریت + تستقفل/پین/انتقال با مجوز؛ تست۴ ساعت
تعریف انجام (DoD)
  • منبع فروم: بخش/موضوع/پست، قفل/پین/انتقال با مجوز — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5.
۴

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

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

◆ تیم Backend
B14منبعِ پیام‌رسانP3نساخته۶ روز
#کارجزئیات فنیتخمین
B14.1مدل‌هاگفتگو/پیام/عضو/وضعیتِ خوانده، نگاشتِ ow_mailbox_*۶ ساعت
B14.2گفتگوهاGET /conversations، ساخت، شمارشِ نخوانده۶ ساعت
B14.3پیام‌ها/messages ارسال/فهرست، صفحه‌بندیِ تاریخچه۸ ساعت
B14.4بی‌درنگChannels/WebSocket یا long-poll؛ پیوست۱۰ ساعت
B14.5تستارسال/خواندن/دسترسیِ عضو۴ ساعت
تعریف انجام (DoD)
  • منبع پیام‌رسان در سطح فعلی: کانال/پیام/رشته/reaction روی WebSocket — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5. (WebSocket نیازمندِ ASGI؛ مرتبط با B3.)
الحاقیه‌ی ۱۴۰۵/۰۵/۱۴ (این تسک را تغییر نمی‌دهد): کانال‌ها دامنه‌دارند — فیلتر فهرست کانال بر اساس نشست ← B21.2 و B22.1.
الحاقیه‌ی ۱۴۰۵/۰۵/۱۴ (این تسک را تغییر نمی‌دهد): ادامه‌ی این تسک برای هم‌ترازی کامل با تلگرام: B25–B28 — مرجع: مشخصات پیام‌رسان.
B15منبعِ دوستان و اعلان‌هاP2نساخته۴ روز
#کارجزئیات فنیتخمین
B15.1دوستان/friends: درخواست/تأیید/حذف، نگاشتِ ow_friends_*۸ ساعت
B15.2اعلان‌هاGET /notifications، علامتِ خوانده، شمارش۸ ساعت
B15.3تولیدِ اعلانhookهای رویداد (لایک/نظر/دعوت) → اعلان۶ ساعت
B15.4تستچرخه‌ی دوستی/اعلان۴ ساعت
تعریف انجام (DoD)
  • منبع دوستان و اعلان: درخواست/تأیید، تولید اعلان از رویدادها، شمارش خوانده‌نشده — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5.
B16منبعِ دانش و پروژهP3نساخته۶ روز
#کارجزئیات فنیتخمین
B16.1دانش/knowledge/documents CRUD + دسته + آپلود۸ ساعت
B16.2پروژه/projects CRUD + اعضا + وضعیت۸ ساعت
B16.3وظیفه/کانبانستون/کارت/ترتیب، endpointِ جابه‌جایی و تخصیص۸ ساعت
B16.4تستCRUD + persistِ ترتیب۴ ساعت
تعریف انجام (DoD)
  • منبع دانش و پروژه: آپلود/نسخه سند، بورد/تسک/گانت — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5. (اگر پروژه در اکسوال منبع ندارد، مدلِ جدید در motoshub_new.)
۵

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

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

◆ تیم Backend
B17منبعِ ماژول‌های سازمانیP3نساخته۸ روز
#کارجزئیات فنیتخمین
B17.1قراردادها/تیکت/tickets و منبعِ قرارداد، گردش‌کارِ وضعیت۱۲ ساعت
B17.2صندوق/cfps، /grants: فراخوان/درخواست/داوری۱۲ ساعت
B17.3پژوهش/فناوری/technologies، /journal-*۱۲ ساعت
B17.4آموزشدوره/ثبت‌نام/پیشرفت۱۲ ساعت
B17.5تستCRUD + گردش‌کار۴ ساعت
تعریف انجام (DoD)
  • منبع ماژول‌های سازمانی: قرارداد/تیکت/صندوق/پژوهش/آموزش با گردش‌کار وضعیت — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5.
B18منبعِ نظرسنجی، مسابقات و ارزیابیP3نساخته۵ روز
#کارجزئیات فنیتخمین
B18.1نظرسنجی/polls: ساخت/رأی/نتیجه۸ ساعت
B18.2مسابقات/competitions: ثبت/داوری۸ ساعت
B18.3ارزیابی/evaluations۶ ساعت
B18.4تسترأی/نتیجه/دسترسی۴ ساعت
تعریف انجام (DoD)
  • منبع نظرسنجی/مسابقه/ارزیابی با رأی و امتیازدهی — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B5.
۶

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

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

◆ تیم Backend
B19منبعِ جستجو + یکپارچه‌سازی و تحویلP3نساخته۴ روز
#کارجزئیات فنیتخمین
B19.1جستجوی سراسریGET /search چنددسته (کاربر/بلاگ/فروم/...)، صفحه‌بندی۸ ساعت
B19.2برابریِ قراردادتستِ diffِ پاسخِ Django با PHP روی endpointهای کلیدی۶ ساعت
B19.3سوییچِ Gatewayمستندِ گذارِ مسیر‌به‌مسیر از PHP به Django بدونِ downtime۶ ساعت
B19.4OpenAPI + تحویلهم‌ترازیِ drf-spectacular با قراردادِ v1، انتشارِ داکِ نهایی۶ ساعت
تعریف انجام (DoD)
  • منبع جستجو (/search)، برابری قرارداد Django↔PHP، سوییچ Gateway مستند و OpenAPI هم‌تراز.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: همه‌ی منابعِ Backend.
+

دامنه‌ی کشف‌شده — افزوده‌ی ۱۴۰۵/۰۵/۱۱

تطبیقِ صفحه‌های demo.shub.ir با فهرستِ B1–B19 نشان داد ماژولِ تیکت در هیچ‌کدام از دو تیم تسک نداشت، با این‌که در PHP آماده است. مانندِ سمتِ Front، این تسک با شماره‌ی تازه آمده و در جمعِ فازهای ۰ تا ۶ حساب نشده است.

◆ تیم Backend
B20منبعِ تیکت پشتیبانیP3آماده در PHP۲ روز

۱۲ عملیاتِ آماده در برنچ API (/tickets، /tickets/{id}، /ticket-categories، /ticket-orders) که هنوز روی production مستقر نشده‌اند. کارِ Backend اینجا = استقرارِ همان‌ها و سپس بازسازی در Django طبقِ همان قرارداد.

Subtaskها
#کارجزئیات فنیتخمین
B20.1استقرارِ مسیرهای PHPفعال‌سازیِ iisticketing در استقرارِ production و تاییدِ پاسخ‌ها۴ ساعت
B20.2مدل و فهرستتیکت/دسته/پاسخ، GET /tickets با فیلترِ وضعیت و صفحه‌بندی۵ ساعت
B20.3ایجاد و گردشِ وضعیتPOST /tickets، تغییرِ وضعیت، مجوزِ مالک/پشتیبان (IDOR)۵ ساعت
B20.4تستسناریوی موفق + ۴۰۱/۴۰۳/۴۲۲ + دسترسیِ کاربرِ دیگر۲ ساعت
تعریف انجام (DoD)
  • منبع تیکت (/tickets، دسته، سفارش) مستقر و بازسازی‌شده در Django با مجوز مالک/پشتیبان (IDOR) — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B1، B4. مصرف‌کننده: F24.
نکته‌ی مکمل برای B4. در راستی‌آزماییِ ۱۴۰۵/۰۵/۱۱ مشخص شد api/v1 فقط auth/login، auth/me و auth/permissions دارد — refresh، logout، register و change-password در PHP وجود ندارند. چون F3 (فاز ۱، P1) به هر چهارِ این‌ها وابسته است، B4 عملاً روی مسیرِ بحرانیِ کلِ برنامه قرار می‌گیرد. جزئیات: وضعیت زنده.

هم‌ترازی با نسخه‌ی نهایی demo.shub.ir — الحاقیه ۱۴۰۵/۰۵/۱۴

نسخه‌ی نهایی دمو، دامنه‌بندی «سیستم ← هلدینگ ← شرکت»، دسترسی نقش‌محور و چند فیلد محتوایی تازه دارد که در هیچ‌کدام از دو بک‌اند وجود ندارد (راستی‌آزمایی: جستجوی holding/company/scope در هر دو Swagger صفر نتیجه). این‌ها تسک‌های تازه‌اند؛ B1–B20 دست‌نخورده‌اند. مرجع فنی کامل و معیارهای پذیرش: قرارداد الزام‌آور دامنه‌بندی.

◆ تیم Backend
B21مدل داده‌ی دامنه‌بندی و عضویتP1نساخته۶ روز

موجودیت‌های Holding، Company، عضویت کاربر (companyIds)، تخصیص نقش {roleId, level, holdingId?, companyId?, groupId?} و افزودن سه فیلد scope/holdingId/companyId به همه‌ی موجودیت‌های محتوایی (فهرست کامل در قرارداد، بخش ۱). مهاجرت: رکوردهای موجود = «سراسری».

Subtaskها
#کارجزئیات فنیتخمین
B21.1جدول‌های ساختارholdings، companies، user_company_memberships، role_grants + ایندکس‌ها۸ ساعت
B21.2فیلدهای scope روی محتوامهاجرتِ افزودن سه ستون به همه‌ی جدول‌های محتوایی + پیش‌فرض سراسری۱۰ ساعت
B21.3auth/me توسعه‌یافتهبرگرداندن عضویت‌ها، تخصیص نقش و مجوزهای مؤثر (قرارداد، بخش ۴٫۱)۶ ساعت
B21.4seed پذیرشبازتولید پنج سناریوی مرجع (u1/u3/u4/u7/u12) در داده‌ی تست۴ ساعت
B21.5تستpytest/Pest برای مدل و auth/me۸ ساعت
تعریف انجام (DoD)
  • جدول‌های holding/company/عضویت/تخصیص + سه ستون scope روی همهٔ محتواها (مهاجرت = سراسری)؛ auth/me عضویت+نقش+مجوز مؤثر برمی‌گرداند؛ پنج سناریوی پذیرش seed — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B2، B5. مصرف‌کننده: F25.
B22اجرای دامنه سمت سرور (خواندن + نوشتن)P1نساخته۵ روز

حیاتی‌ترین تسک امنیتی الحاقیه. فیلتر فرانت کافی نیست — داده‌ای که به مرورگر برسد نشت کرده است. یک لایه/میدل‌ور مشترک، قانون دیده‌شدن را روی همه‌ی خواندن‌ها و «دامنه‌های مجاز انتشار» را روی همه‌ی نوشتن‌ها اعمال می‌کند.

Subtaskها
#کارجزئیات فنیتخمین
B22.1میدل‌ور/کوئری‌ست دامنهاعمال خودکار قانون بخش ۲ قرارداد بر اساس نشستِ توکن — یک‌بار، برای همه‌ی ماژول‌ها۱۰ ساعت
B22.2خارج از دامنه = ۴۰۴جزئیاتِ آیتم غیرمجاز ۴۰۴ برمی‌گرداند نه ۴۰۳ (عدم افشای وجود)۴ ساعت
B22.3اعتبارسنجی نوشتنscope ارسالی ⊆ دامنه‌های مجاز نشست؛ تخلف = ۴۲۲؛ پیش‌فرض = دامنه‌ی نشست۸ ساعت
B22.4گارد admin و ناظم گروهمسیرهای مدیریتی: مجوز مؤثر؛ اکشن‌های گروه: canModerateGroup سمت سرور۶ ساعت
B22.5تست نفوذ دامنهبرای هر ماژول: کاربر شرکت A نتواند آیتم شرکت B را بخواند/بسازد/ویرایش کند (IDOR بین‌دامنه‌ای)۱۲ ساعت
تعریف انجام (DoD)
  • یک لایه/میدل‌ور دامنه روی همهٔ خواندن‌ها؛ آیتم خارج از دامنه = ۴۰۴؛ انتشار نامجاز = ۴۲۲؛ گارد admin و ناظم گروه؛ تست نفوذ بین‌دامنه‌ای (IDOR) برای هر ماژول سبز.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B21. مصرف‌کننده: F25، F26.
B23هویت نصب، SSO و APIهای زنجیره‌ی واگذاریP2نساخته۴ روز

پشتیبان بخش «سیستم و ورود یکپارچه» و «هلدینگ‌ها و شرکت‌ها» در پنل راهبری دمو (F28).

Subtaskها
#کارجزئیات فنیتخمین
B23.1هویت سیستمGET/PATCH /system/identity — نام/دامنه/برند + پیکربندی SSO (بدون افشای secret در GET)۶ ساعت
B23.2CRUD ساختارهلدینگ/شرکت + فعال/غیرفعال — با قواعد واگذاری (مدیر هلدینگ فقط زیرمجموعه‌ی خودش)۸ ساعت
B23.3عضویت و تخصیصافزودن/حذف عضویت شرکت؛ ثبت/تغییر RoleGrant — هر دو محدود به دامنه‌ی مدیر۸ ساعت
B23.4تست اتصال SSOPOST /system/sso/test — اعتبارسنجی endpoint بدون ذخیره۴ ساعت
تعریف انجام (DoD)
  • /system/identity (بدون افشای secret در GET)؛ CRUD هلدینگ/شرکت با قواعد واگذاری؛ عضویت و RoleGrant؛ /system/sso/test — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B21، B22. مصرف‌کننده: F28.
B24فیلدهای محتوایی جدید در مدل و قراردادP2نساخته۲ روز

مطابق قرارداد، بخش ۵: event.category (۵ مقدار) + event.capacity، news.topic (۵ مقدار)، media.duration. مهاجرت nullable + افزودن به Serializer/Resource و Swagger + پارامتر فیلترِ فهرست (?category=، ?topic=).

تعریف انجام (DoD)
  • فیلدهای event.category+capacity، news.topic، media.duration در مدل/Serializer/Swagger + پارامتر فیلتر (?category=،?topic=) — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B9، B11، B12 (گسترش تحویل‌شده‌ی همان‌ها — بازکاری نیست). مصرف‌کننده: F27.
جمعِ الحاقیه‌ی Backend: ~۱۷ روز (B21–B24) — جدا از جمع فازهای ۰ تا ۶. ترتیب پیشنهادی: B21 ← B22 (مسیر بحرانی الحاقیه) ← B23/B24 موازی.

پیام‌رسان کامل — هم‌ترازی با تلگرام (الحاقیه ۱۴۰۵/۰۵/۱۴)

پشتوانه‌ی سرویسِ چهار تسک Front (F29–F32). فهرست الزام‌آور قابلیت‌ها: مشخصات کامل پیام‌رسان. B14 دست‌نخورده است — این تسک‌ها روی خروجی آن سوارند. یادآوری معماری: real-time روی WebSocket (تصمیم B14.4) و کانال‌ها دامنه‌دار (B21/B22).

◆ تیم Backend
B25مدل کامل پیام (چرخه‌ی حیات تلگرامی)P1نساخته۶ روز
Subtaskها (مرجع: مشخصات، بخش ۱ و ۲)
#کارجزئیات فنیتخمین
B25.1چرخه‌ی پیامویرایش با پنجره + تاریخچه‌ی نسخه‌ها؛ حذف برای من/همه (tombstone برای انطباق)؛ پنجره‌ها از تنظیمات راهبر۱۰ ساعت
B25.2پاسخ/نقل‌قول/فورواردreply با quote جزئی (offsetهای متن)؛ فورواردِ چندمقصدی با ثبت مبدأ؛ گاردِ مرز دامنه۸ ساعت
B25.3زمان‌بندی و پیش‌نویسصف پیام‌های زمان‌بندی‌شده (Celery/صف موجود) + CRUD؛ draft per-چت per-کاربر۸ ساعت
B25.4واکنش و پینواکنش‌های چندگانه با فهرست کاربران؛ پین چندتایی مرتب؛ مجموعه‌ی واکنش مجاز از راهبری۶ ساعت
B25.5موجودیت‌های متنذخیره‌ی entities قالب‌بندی (نه HTML خام)؛ اعتبارسنجی؛ رندر امن۶ ساعت
B25.6تستپنجره‌ها، حذف دوطرفه، فوروارد بین‌دامنه‌ای (باید ۴۲۲ شود)۱۰ ساعت
تعریف انجام (DoD)
  • ویرایش با پنجره و تاریخچهٔ نسخه؛ حذف دوطرفه با tombstone؛ فورواردِ چندمقصدی با گارد دامنه؛ زمان‌بندی؛ ذخیرهٔ entities قالب‌بندی (نه HTML خام) — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B14، B21. مصرف‌کننده: F29.
B26بلادرنگ، رسیدها، جستجو و syncP1نساخته۶ روز
Subtaskها (مرجع: مشخصات، بخش ۵ و ۶)
#کارجزئیات فنیتخمین
B26.1پروتکل WSرویدادهای typed: پیام/ویرایش/حذف/واکنش/تایپ/حضور/رسید — نسخه‌دار و مستند۸ ساعت
B26.2رسید تحویل/خواندنcursor خواندن per-عضو per-چت؛ seen-by گروه کوچک؛ به‌روزرسانی جمعی بهینه۸ ساعت
B26.3sync چنددستگاهیوضعیت خوانده/پیش‌نویس بین نشست‌ها؛ بازیابی event از offset پس از قطعی (آفلاین)۱۰ ساعت
B26.4جستجوی پیامایندکس Elasticsearch موجود: سراسری + درون‌چت + فیلتر نوع/فرستنده/تاریخ — با احترام به دامنه۱۰ ساعت
B26.5اعلان per-چتترجیحات بی‌صدا/مدت/فقط‌منشن per-کاربر per-چت + شمارنده‌های تفکیکی۶ ساعت
تعریف انجام (DoD)
  • پروتکل WS نسخه‌دار و مستند؛ رسید تحویل/خواندن + seen-by؛ sync چنددستگاهی و بازیابی offset پس از قطعی؛ جستجوی Elasticsearch دامنه‌محور — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B14، B25. مصرف‌کننده: F29، F32.
B27رسانه، فایل و صوتP2نساخته۵ روز
Subtaskها (مرجع: مشخصات، بخش ۳)
#کارجزئیات فنیتخمین
B27.1آپلود مقاومآپلود قطعه‌قطعه با ازسرگیری؛ سقف حجم/نوع از تنظیمات؛ اسکن ضدویروس موجود۱۰ ساعت
B27.2پردازش رسانهبندانگشتی، ابعاد، مدت و شکل موج صوت (استخراج سمت سرور)؛ آلبوم گروه‌شده۸ ساعت
B27.3گالری چتendpointهای رسانه/فایل/لینک/صوت per-چت با صفحه‌بندی۶ ساعت
B27.4پیش‌نمایش لینکunfurl سمت سرور با کش و allowlist؛ کارت اختصاصی لینک‌های داخلی۶ ساعت
B27.5دسترسی فایلURLهای امضاشده با انقضا — دانلود فقط برای اعضای همان چت/دامنه۶ ساعت
تعریف انجام (DoD)
  • آپلود قطعه‌قطعه با ازسرگیری و اسکن ضدویروس؛ استخراج بندانگشتی/مدت/شکل‌موج؛ گالری چت؛ unfurl امن؛ URL امضاشدهٔ دانلود per-دامنه — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B25. مصرف‌کننده: F30.
B28گروه/کانال پیشرفته، مدیریت و انطباقP2نساخته۶ روز
Subtaskها (مرجع: مشخصات، بخش ۴ و ۶)
#کارجزئیات فنیتخمین
B28.1تاپیک‌هاموجودیت topic ذیل گروه؛ شمارنده/اعلان per-تاپیک۸ ساعت
B28.2ناظمان ریزدانهماتریس مجوز per-ناظم؛ محدودسازی/بن با مدت؛ Slow Mode؛ اجرای سمت سرور۱۰ ساعت
B28.3دعوت و عضویتلینک با انقضا/سقف/QR؛ صف Join Request با تایید؛ حساب مهمان با انقضا۸ ساعت
B28.4کانال کاملامضا، شمارش بازدید، اتصال گروه بحث برای نظرات پست۶ ساعت
B28.5Poll، auto-delete، بلاک/گزارشنظرسنجی/آزمون درون‌چت؛ زمان‌بند حذف خودکار؛ بلاک DM و صف گزارش تخلف برای راهبر۸ ساعت
B28.6انطباقAdmin Log دائمی متصل به Audit؛ Compliance Export با تاریخچه‌ی ویرایش/حذف — فقط نقش انطباق۸ ساعت
تعریف انجام (DoD)
  • تاپیک؛ مجوز ریزدانهٔ ناظم و Slow Mode؛ لینک دعوت/Join Request/مهمان؛ کانال با امضا/بازدید/نظر؛ Poll/auto-delete/بلاک-گزارش؛ Admin Log دائمی + Compliance Export — با تست.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: B25، B22 (گارد دامنه). مصرف‌کننده: F31.
B29زیرساخت تماس/جلسه‌ی زندهP3اختیاری — منتظر تصمیم PO≈۷ روز*

استقرار و ادغام SDK انتخابی (Jitsi/LiveKit) پشت SSO و دامنه‌بندی؛ توکن اتاق، ضبط، سیاست نگه‌داری.

تخمین مشروط (*به‌فرض SDK آماده)
#کارتخمین
B29.1استقرار self-host + TLS + TURN/STUN پشت شبکه‌ی سازمان۱۲ ساعت
B29.2اتصال هویت: توکن اتاق امضاشده از نشست ما (JWT) — بدون لاگین دوم۱۰ ساعت
B29.3گارد دامنه: اتاقِ کانال فقط برای اعضای همان کانال/دامنه۶ ساعت
B29.4ضبط جلسه + ذخیره در استوریج + سیاست نگه‌داری/دسترسی۱۲ ساعت
B29.5رویدادهای چت (شروع/پایان/مدت) + تست بار ۲۰ شرکت‌کننده۱۰ ساعت
تعریف انجام (DoD)
  • استقرار self-host SDK پشت SSO و دامنه؛ توکن اتاق از JWT ما؛ گارد دامنهٔ اتاق کانال؛ ضبط با سیاست نگه‌داری؛ تست بار ۲۰ شرکت‌کننده.
  • عبور از خط لولهٔ تحویل: تست واحد + تست قرارداد علیه OpenAPI + CI سبز + پذیرش PO روی staging (کالکشن Postman) — فرآیند.
وابستگی: تصمیم PO. مصرف‌کننده: F33. خارج از جمع الحاقیه.
جمعِ الحاقیه‌ی پیام‌رسان (Backend): ~۲۳ روز (B25–B28) — جدا از همه‌ی جمع‌های قبلی. مسیر بحرانی: B25 ← B26؛ B27/B28 موازی پس از B25.
Σ+

جمع‌بندی تخمین‌ها — همه‌ی بلوک‌ها (الحاقیه ۱۴۰۵/۰۵/۱۴)

جمعِ روزنفرِ تک‌تک تسک‌ها، به تفکیک بلوک. اعداد روز-نفر (person-day) اند و مستقل از تعداد تیم؛ تبدیل به تقویم در انتهای جدول.

بلوکتسک‌هاFront (روزنفر)Backend (روزنفر)وضعیت
هسته‌ی قرارداد (فاز ۰–۶)F1–F20 · B1–B19۹۰۸۶در حال اجرا
دامنه‌ی کشف‌شدهF21–F24 · B20۱۳۲منتظر تصمیم PO
هم‌ترازی دامنه‌بندیF25–F28 · B21–B24۱۲۱۷الحاقیه — الزام‌آور
پیام‌رسان کامل (تلگرام)F29–F32 · B25–B28۲۸۲۳الحاقیه — خواسته‌ی محصول
مجموع الزامی (بدون تماس)۱۴۳۱۲۸۲۷۱ روزنفر
تماس صوتی/تصویری (اختیاری — F33/B29)پس از تصمیم PO
مجموع با تماس۱۴۹۱۳۵۲۸۴ روزنفر
تبدیل به تقویم (ترکیب فعلی: ۴F + ۳B + QA + DevOps، اجرای موازی دو رشته). با بهره‌وریِ واقع‌بینانه‌ی ~۸۰٪ (جلسه/ریویو/رگرسیون):
سناریوFrontBackendپروژه (موازی)
فقط هسته (فاز ۰–۶) — خط پایه‌ی قبلی~۹ هفته~۹ هفته~۹–۱۱ هفته
الزامی کامل (هسته + دامنه‌بندی + پیام‌رسان)~۹ هفته~۱۱ هفته~۱۱–۱۳ هفته
+ دامنه‌ی کشف‌شده (F21–F24/B20)+~۱ هفته~۱۲–۱۴ هفته
+ تماس (F33/B29)+~۰.۵ هفته+~۰.۵ هفته~۱۳–۱۵ هفته
گلوگاه = Backend (۱۲۸ روزنفر ÷ ۳ نفر). تسک‌های الزام‌آورِ مسیر بحرانی: B21→B22 (دامنه) و B25→B26 (بلادرنگ چت). اعداد تخمینی‌اند و در Planning هر Sprint دوباره کالیبره می‌شوند.
§

مرجع الزام‌آور — قرارداد دامنه‌بندی و دسترسی (سیستم ← هلدینگ ← شرکت)

مشخصات دقیقِ مدل چندسطحی، همان‌طور که در نسخه‌ی نهایی demo.shub.ir پیاده و راستی‌آزمایی شده. مبنای الزام‌آورِ تسک‌های F25–F28 / B21–B24. مرجع کد: src/data/tenancy.ts و src/context/TenancyContext.tsx در مخزن پروتوتایپ.

مهم‌ترین قاعده: فیلتر باید سمت سرور باشد. در پروتوتایپ فیلتر در فرانت انجام می‌شود چون داده mock است؛ در محصول واقعی اگر فیلتر فقط در فرانت باشد یعنی داده‌ی شرکت‌های دیگر واقعاً به مرورگر کاربر رسیده و فقط نمایش داده نشده — این نشتی داده است. سرور موظف است بر اساس نشستِ برآمده از توکن، هم «خواندن» را فیلتر و هم «نوشتن» را اعتبارسنجی کند.
۱

موجودیت‌ها

موجودیتفیلدهاتوضیح
SystemIdentityname, shortName, domain, color, ssoProvider, ssoEndpoint, ssoDomainHint, autoProvision, allowLocalLoginهر نصب = یک مشتری. ssoProvider ∈ {بدون SSO, LDAP/AD, SAML 2.0, OIDC, OTP موبایل}
Holdingid, name, color, lead?, activen هلدینگ زیر هر نصب
Companyid, name, holdingId, field?, users, activen شرکت زیر هر هلدینگ
UserProfile (افزوده)companyIds?: string[]عضویت — کاربر خودش انتخاب نمی‌کند؛ مدیر شرکت او را اضافه می‌کند
RoleGrantroleId, level ∈ {سیستم, هلدینگ, شرکت, گروه}, holdingId?, companyId?, groupId?تخصیص نقش = (کاربر، نقش، دامنه). groupId فقط برای سطح «گروه» (ناظم گروه)
Scoped (میکس‌این همه‌ی محتواها)scope? ∈ {سراسری, هلدینگ, شرکت}, holdingId?, companyId?روی همه‌ی موجودیت‌های محتوایی/کاری. نبودِ scope = «سراسری» (سازگاری با داده‌ی قدیمی)
پوشش Scoped — الزامی روی این موجودیت‌ها: خبر، بلاگ، رویداد، رسانه، انجمن (موضوع)، گروه، سند دانش، کانال گفتگو، پروژه، قالب فرآیند*، قرارداد، پروپوزال/طرح صندوق (هر دو نوع)، فراخوان پژوهشی، دوره‌ی آموزشی، تیکت، نظرسنجی، آزمون، مسابقه، چالش. (* قالب فرآیند و «جایزه نوآوری» سراسری‌اند — جایزه ذاتاً رویداد سطح بنیاد است.) پیام مستقیم (DM) دامنه‌بندی نمی‌شود — عضویت‌محور است.
۲

نشست (Session) — دامنه از «کاربر» محاسبه می‌شود، نه از انتخاب او

در لحظه‌ی ورود، سرور از روی عضویت‌ها و تخصیصِ نقش، نشست را می‌سازد. کاربر هیچ سوالی درباره‌ی هلدینگ/شرکتش نمی‌بیند.

سطح نشستچه می‌بیندسوییچر هدردامنه‌های مجاز انتشار
سیستم (بدون عضویت + نقش سیستمی)همه‌چیز«مشاهده به‌عنوان» — همه‌ی دامنه‌هاسراسری، هلدینگ، شرکت
هلدینگ (نقش سطح هلدینگ)سراسری + کل هلدینگ خودشکل هلدینگ + شرکت‌های همان هلدینگهلدینگ، شرکت
شرکت — عضو ۱ شرکتسراسری + همان شرکتندارد — فقط برچسب خواندنیفقط شرکت (بدون گزینه: «منتشر می‌شود برای: X»)
شرکت — عضو چند شرکتسراسری + شرکت‌های عضوفقط همان شرکت‌های عضوفقط شرکت (بین عضویت‌ها)
قانون دیده‌شدن (مرجع: isVisibleForSession) — آیتم دیده می‌شود اگر: scope=سراسری (همیشه) · scope=هلدینگ و هلدینگ آیتم ∈ هلدینگ‌های کاربر · scope=شرکت و شرکت آیتم ∈ شرکت‌های عضو. وقتی کاربر روی یک دامنه‌ی مشخص ایستاده (سوییچر)، همان تنگ‌تر اعمال می‌شود. نشستِ سطح سیستم بدون دامنه‌ی فعال، همه‌چیز را می‌بیند.
۳

زنجیره‌ی واگذاری اختیار

نقشمی‌تواندنمی‌تواند
مدیر سیستمساخت/حذف هلدینگ؛ انتصاب مدیر هلدینگ؛ همه‌چیز
مدیر هلدینگساخت/مدیریت شرکت‌های هلدینگ خودش؛ انتصاب مدیر شرکتحذف هلدینگ؛ هر کاری بیرون از هلدینگ خودش
مدیر شرکتافزودن/حذف کاربرانِ شرکت خودش؛ تخصیص نقش در دامنه‌ی خودشهر کاری بیرون از شرکت خودش
ناظم گروه (level=گروه + groupId)ویرایش/حذف گروهِ خودش؛ اخراج عضو همان گروهمدیریت هر گروه دیگر؛ پنل راهبری
عضو عادیمصرف و تولید محتوا در دامنه‌ی عضویتشپنل راهبری (منو پنهان و مسیر گارد‌شده)؛ انتشار خارج از شرکتش
دسترسی مؤثر از نقشِ تخصیص‌یافته محاسبه می‌شود (کاربر بدون تخصیص = «عضو عادی» r4). دسترسی راهبری = سطح سیستم/هلدینگ، یا نقشی که یکی از مجوزهای users.create / users.edit / roles.edit / settings.system را دارد. گاردِ سمت سرور برای مسیرهای admin الزامی است — پنهان‌کردن منو کافی نیست.
۴

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

#الزامجزئیات
۱نشست در توکن/پاسخ auth/mememberCompanyIds[]، grant {roleId, level, holdingId?, companyId?, groupId?} و مجوزهای مؤثر باید از auth/me برگردد؛ فرانت هیچ‌چیز را خودش استنتاج نمی‌کند.
۲فیلتر خواندنهمه‌ی endpointهای فهرست/جزئیات، قانون دیده‌شدن بخش ۲ را روی داده اعمال می‌کنند. آیتم خارج از دامنه = 404 (نه 403، تا وجودش لو نرود).
۳اعتبارسنجی نوشتنscope/holdingId/companyIdی ارسالی باید داخل «دامنه‌های مجاز انتشار» نشست باشد؛ در غیر این صورت 422. مقدار پیش‌فرض = دامنه‌ی فعال نشست.
۴زنجیره‌ی واگذاریAPIهای مدیریت هلدینگ/شرکت/عضویت/تخصیص نقش، قواعد بخش ۳ را سمت سرور اجرا می‌کنند.
۵سازگاری داده‌ی قدیمیرکوردهای بدون scope = «سراسری». مهاجرت اولیه می‌تواند همه را سراسری بگذارد و به‌تدریج دامنه‌دار شود.
۵

فیلدهای محتوایی جدید (قرارداد داده)

این فیلدها در نسخه‌ی نهایی دمو وجود دارند و باید در مدل و قرارداد هر دو بک‌اند بیایند (تسک B24).

موجودیتفیلدنوع/مقادیرمصرف در UI
رویدادcategoryجلسه | کارگاه | وبینار | همایش | آموزشچیپ فیلتر + نشان روی ردیف (عمومی و داشبورد)
رویدادcapacitynumber«X از Y ظرفیت» + وضعیت «در حال ثبت‌نام»
خبرtopicاقتصادی | اجتماعی | فرهنگی | عمرانی | سازمانیچیپ فیلتر + تگ روی هیرو/کارت/ردیف
رسانهduration"mm:ss" — فقط ویدیونشان روی بندانگشتی
کاربرcompanyIdsstring[]مبنای کل نشست — بخش ۲
۶

سناریوهای مرجع پذیرش (داده‌ی seed دمو)

این پنج سناریو معیار پذیرش پیاده‌سازی بک‌اند است — با «ورود به‌عنوان» در demo.shub.ir قابل مشاهده‌اند.

کاربرعضویت / نقشرفتار مورد انتظار
u1 — پایگاه اطلاع‌رسانیبدون عضویت + r1 (سیستم)همه‌چیز؛ سوییچر ۱۷ گزینه؛ هر سه دامنه‌ی انتشار؛ پنل راهبری کامل
u3 — عضو ۱ شرکت (بهنوش)[c-behnoush]سوییچر ندارد؛ فقط سراسری+بهنوش؛ فرم انتشار بدون گزینه («منتشر می‌شود برای: بهنوش»)؛ بدون پنل راهبری
u4 — عضو ۲ شرکت + r2 هلدینگ فردوس[c-dashtnaz, c-ferdows-agri]سوییچر: کل هلدینگ + ۲ شرکت؛ انتشار هلدینگ/شرکت؛ راهبریِ محدود به هلدینگ خودش
u7 — ناظم گروه g1[c-ferdows-agri] + r3/گروه/g1دکمه‌های مدیریتی فقط در گروه g1؛ در g2 هیچ اکشن مدیریتی ندارد
u12 — عضو ۳ شرکت[c-pak, c-behnoush, c-zamzam]سوییچر دقیقاً همین ۳ شرکت؛ محتوای فهرست‌ها با سوییچ واقعاً عوض می‌شود

مرجع الزام‌آور — مشخصات کامل پیام‌رسان (هم‌ترازی با تلگرام)

پیام‌رسانِ موتوشاب باید تمام قابلیت‌های تلگرام (به‌جز موارد حذف عمدی) به‌علاوه‌ی قابلیت‌های سازمانی را داشته باشد. مبنای الزام‌آورِ تسک‌های F29–F33 / B25–B29. برای هر قابلیت: جزئیات، وضعیت فعلی در دمو، و تسک متناظر.

سه قاعده‌ی برش (Scope Cut): (۱) هر قابلیت تلگرام که به «هویت شخصی/شبکه‌ی عمومی» گره خورده (شماره‌تلفن عمومی، People Nearby، استوری، Premium) در بستر سازمانی حذف عمدی است و در جدول با «—حذف» مشخص شده. (۲) استیکر/GIF به‌صورت «مجموعه‌ی سازمانیِ مدیریت‌شده» می‌آید نه فروشگاه باز. (۳) تماس صوتی/تصویری طبق تصمیم معماری موجود (برون‌سپاری/ادغام، نه ساخت از صفر) تسک اختیاریِ جداست (F33/B29).
۱

پیام‌رسانی پایه

قابلیتجزئیات الزام‌آوردر دموتسک
ارسال متنارسال با Enter، خط جدید با Shift+Enter، پیش‌نویس هر گفتگو جدا ذخیره و بین دستگاه‌ها sync شود✅ (بدون draft-sync)F29 · B25
ویرایش پیامپنجره‌ی ویرایش قابل‌تنظیم (پیش‌فرض ۴۸ ساعت)، برچسب «ویرایش‌شده»، تاریخچه‌ی ویرایش برای انطباق✅ (بدون پنجره/تاریخچه)F29 · B25
حذف پیام«حذف برای من» / «حذف برای همه» (پنجره‌ی قابل‌تنظیم)؛ در کانال: فقط ناظمنیمه (حذف ساده)F29 · B25
پاسخ (Reply)نقل‌قول پیام با پرش به اصل؛ نقل‌قول بخشی از متن (Quote انتخابی — تلگرام ۲۰۲۳)✅ reply · ❌ quote انتخابیF29
رشته‌ی پاسخ (Thread)پنل رشته کنار گفتگو، شمارنده‌ی «N پاسخ در رشته»، دنبال‌کردن رشته
فورواردتکی و چندتایی، با/بدون نامِ فرستنده، به چند مقصد هم‌زمان؛ احترام به مرز دامنه (فوروارد به کانالِ خارج از دامنه ممنوع)✅ تکیF29 · B25
انتخاب چندتاییانتخاب چند پیام → فوروارد/حذف/کپی گروهیF29
پیام زمان‌بندی‌شدهارسال در زمان معین + «ارسال بی‌صدا» (بدون نوتیف گیرنده)F29 · B25
واکنش (Reaction)چند واکنش روی هر پیام، شمارنده + فهرست واکنش‌دهنده‌ها؛ مجموعه‌ی مجاز توسط راهبر✅ پایهF29 · B25
پین پیامچند پین هم‌زمان با نوار پیمایش بین پین‌ها (مثل تلگرام)، پین با/بدون اعلان✅ تک‌پینF29
ذخیره‌شده‌هاSaved Messages شخصی + ذخیره از هر گفتگو
رسید خواندنتیک ✓ (رسیده) / ✓✓ (خوانده)؛ در گروه‌های کوچک «چه کسانی خواندند»✅ تیک‌ها · ❌ seen-byF32 · B26
در حال تایپ…نشانگر تایپ per-چت؛ در گروه با نام افراد✅ در DMB26
جداکننده‌ی خوانده‌نشدهخط «پیام‌های خوانده‌نشده» هنگام بازکردن چت + اسکرول به همان‌جاF32
تایمر حذف خودکارAuto-delete per-چت (۱ روز/۱ هفته/۱ ماه/سفارشی) — برای گفتگوهای حساس سازمانیF31 · B28
۲

قالب‌بندی و محتوای غنی

قابلیتجزئیات الزام‌آوردر دموتسک
قالب‌بندی متنپررنگ، مورب، زیرخط، خط‌خورده، مونو/کد، بلوک کد، نقل‌قول، اسپویلر (متن پنهان تا لمس)، لینک با متن دلخواه — با میانبر کیبورد و منوی انتخاب متنF29
پیش‌نمایش لینککارت پیش‌نمایش (عنوان/تصویر/توضیح) + امکان حذف پیش‌نمایش قبل از ارسال؛ لینک‌های داخلی سامانه کارت اختصاصی (خبر/سند/رویداد)F29 · B27
منشن@نام با پیشنهاد خودکار، هایلایت و شمارنده‌ی منشن روی چت؛ @all/@here فقط ناظم✅ پایهF29
هشتگکلیک‌پذیر → جستجوی همان برچسب در گفتگوF32
ایموجیپیکر ایموجی با جستجو و پرکاربردها؛ ایموجی تکی بزرگ‌نمایی شود✅ پایهF29
استیکر سازمانیمجموعه‌های استیکرِ تأییدشده توسط راهبر (برند سازمان)؛ بدون فروشگاه باز❌ (اختیاری)F30 · B27
نظرسنجی درون‌چتPoll تلگرامی: چندگزینه‌ای، ناشناس/آشکار، چندانتخابی، حالت آزمون (Quiz) — جدا از ماژول نظرسنجی سازمانیF31 · B28
۳

رسانه، فایل و صوت

قابلیتجزئیات الزام‌آوردر دموتسک
عکس و ویدیوارسال با کپشن، چندتایی به‌صورت آلبوم گروه‌شده، فشرده/اصل، ویرایشگر ساده (برش/چرخش/قلم)نیمه (تک‌عکس)F30 · B27
نمایشگر رسانهتمام‌صفحه با ورق‌زدن بین رسانه‌های همان چت، زوم، ذخیره، نمایش فرستنده/زمانF30
پیام صوتیضبط با نگه‌داشتن + قفل ضبط، شکل موج، پخش با سرعت ۱×/۱.۵×/۲×، ادامه‌ی پخش هنگام جابه‌جایی بین چت‌ها✅ ضبط پایهF30 · B27
پیام ویدیویی (دایره‌ای)ضبط ویدیوی کوتاه دایره‌ای (video message تلگرام)❌ (اختیاری)F30
فایل/سندهر نوع فایل تا سقف تنظیم‌شده‌ی راهبر، نوار پیشرفت آپلود/دانلود قابل‌لغو، ازسرگیری آپلود قطع‌شدهنیمه (UI پیوست)F30 · B27
گالری اشتراکی چتتب‌های «رسانه / فایل / لینک / صوت» در پروفایل هر چت — مثل Shared Media تلگرام✅ رسانه (پایه)F30 · B27
تنظیم دانلود خودکارper-نوع و per-شبکه (داده/وای‌فای) — برای کاربر موبایلF32
اشتراک مخاطب/موقعیتاشتراک کارت کاربر سازمانی؛ موقعیت زنده «—حذف» (کاربرد سازمانی ندارد، ریسک حریم خصوصی)❌ / —حذفF30
۴

گروه‌ها، کانال‌ها و تاپیک‌ها

قابلیتجزئیات الزام‌آوردر دموتسک
کانال (Broadcast)فقط ناظم‌ها می‌نویسند؛ امضای نویسنده، شمارنده‌ی بازدید هر پست، نظرات ذیل پست از طریق گروه بحث متصلنیمه (کانال ساده)F31 · B28
گروهاعضا، توضیحات، قوانین پین‌شده؛ ظرفیت بالا✅ پایهB28
تاپیک‌ها (Forum Groups)گروه‌های تاپیک‌دار تلگرام: هر گروه چند تاپیک مجزا با فهرست، آیکن و اعلان جدا — برای گروه‌های بزرگ سازمانی حیاتیF31 · B28
مجوزهای ریزدانه‌ی ناظممثل تلگرام: تفکیک حق حذف پیام / بن / دعوت / پین / تغییر اطلاعات / افزودن ناظم — per-ناظم❌ (ناظم واحد)F31 · B28
محدودیت اعضامحدودکردن عضو خاص (فقط‌خواندن، بدون رسانه) با مدت؛ بن با پاک‌سازی پیام‌هاF31 · B28
لینک دعوتلینک + QR، با انقضا/سقف استفاده، درخواست عضویت با تایید ناظم (Join Request)F31 · B28
حالت آهسته (Slow Mode)فاصله‌ی اجباری بین پیام‌های هر عضو (۱۰ث تا ۱س)F31 · B28
گزارش اقدامات ناظمانAdmin Log ۴۸ساعته‌ی تلگرام → در نسخه‌ی سازمانی: دائمی و متصل به Audit Log انطباقB28
دامنه‌بندی کانالکانال‌ها Scoped‌اند (سراسری/هلدینگ/شرکت) — قرارداد دامنه‌بندیB21
۵

سازماندهی، جستجو و اعلان

قابلیتجزئیات الزام‌آوردر دموتسک
پوشه‌های چتChat Folders تلگرام: پوشه‌های سفارشی با قواعد شمول/استثنا + شمارنده‌ی خوانده‌نشده per-پوشه؛ پوشه‌های پیش‌ساخته‌ی سازمانی (هلدینگ من/شرکت من)نیمه (۳ دسته‌ی ثابت)F31
آرشیوآرشیو چت با سوایپ، خروج خودکار از آرشیو با پیام جدید (قابل‌تنظیم)✅ پایهF31
پین چت / علامت خوانده‌نشدهسنجاق گفتگو بالای فهرست؛ mark-as-unread دستی✅ علاقه‌مندی · ❌ unread دستیF31
جستجوی سراسری چتروی همه‌ی گفتگوها + پرش به پیام در بستر خودش؛ فیلتر بر اساس نوع (رسانه/فایل/لینک/صوت) و فرستنده✅ فیلتر نام چتF32 · B26
جستجوی درون‌چت + پرش به تاریخجستجو داخل یک گفتگو، پیمایش بین نتایج، Jump to Date با تقویم شمسیF32 · B26
اعلان per-چتبی‌صدا با مدت (۱س/۸س/۲روز/همیشه)، استثناها، پیش‌نمایش روشن/خاموش، «فقط منشن‌ها» برای کانال شلوغ✅ بی‌صدا سادهF32 · B26
شمارنده‌هاBadge خوانده‌نشده per-چت/پوشه/کل؛ تفکیک منشن (@) از پیام عادی✅ پایهF32
۶

همگام‌سازی، حریم خصوصی و سازمانی

قابلیتجزئیات الزام‌آوردر دموتسک
چنددستگاهیوضعیت خوانده/پیش‌نویس/ارسال بین تب‌ها و دستگاه‌ها sync؛ فهرست نشست‌ها و خروج از راه دور (به «امنیت و نشست‌ها»ی موجود وصل می‌شود)❌ syncB26
آفلاینصف ارسال آفلاین با retry، کش تاریخچه، حالت optimistic با برگشت در خطانیمه (optimistic)F32 · B26
حضور (Presence)چهار وضعیت (آنلاین/غایب/مزاحم نشوید/نامرئی) + «آخرین بازدید» با سطوح حریم خصوصی تلگرامی (همه/اعضای سازمان/هیچ‌کس)✅ چهار وضعیتB26
مسدودسازی/گزارشبلاک کاربر در DM؛ گزارش پیام/کاربر به راهبر با دسته‌ی تخلفF31 · B28
بات و وب‌هوکحساب بات با ارسال از API، وب‌هوک ورودی/خروجی، دکمه‌های اینلاین زیر پیامِ بات (inline keyboard)✅ تعریف در راهبریB28
دستور اسلش/command با منوی پیشنهاد و پارامتر — اجرا از طریق همان بات‌ها
حساب مهماندسترسی محدود به کانال‌های مشخص با انقضا (پیمانکاران)✅ تعریف در راهبریB28
خروجی انطباقCompliance Export گفتگوها با فیلتر بازه/کاربر/کانال + تاریخچه‌ی ویرایش/حذف — فقط نقش انطباق✅ UI در راهبریB28
—حذف عمدیاستوری، People Nearby، شماره‌تلفن عمومی، Premium/هدیه، کیف پول — در بستر سازمانی بی‌معنا
۷

تماس صوتی/تصویری و جلسات زنده (اختیاری — تصمیم PO)

طبق تصمیم معماری موجود، ساخت موتور تماس از صفر ممنوع است؛ گزینه‌ها: ادغام SDK آماده (Jitsi/LiveKit self-host) پشت همان هویت. دامنه‌ی هدف: تماس ۱:۱ صوتی/تصویری، گفتگوی صوتی گروهی (Voice Chat تلگرام) روی کانال/گروه با دست‌بلندکردن و ضبط جلسه، اشتراک صفحه. تسک‌های F33/B29 فقط پس از تایید PO فعال می‌شوند و در جمع الحاقیه حساب نشده‌اند.