# بررسی نهایی آمادگی انتشار — ۱۴۰۵/۰۵/۰۵

دامنهٔ بررسی: ۱۶۱ فایل TypeScript/TSX در `src/`، پیکربندی بیلد، محرمانگی،
مرزهای خطا و محتوای بستهٔ تحویلی.

## روش بررسی

تا پیش از این بازبینی فقط کنترل نحوی (TS1xxx) اجرا می‌شد. در این مرحله یک
ممیز ایستای اختصاصی (`docs/tools/audit.py`) نوشته شد که:

1. هر مسیر ایمپورت نسبی و هر ایمپورت `@/` را به فایل واقعی روی دیسک حل می‌کند
   (شامل `index.ts`، پسوندهای حذف‌شده و زنجیرهٔ `export * from`).
2. برای هر نامی که از یک ماژول داخلی وارد می‌شود، وجود صادرات متناظر را
   راستی‌آزمایی می‌کند.

**نتیجه: صفر ایمپورت شکسته و صفر نام واردشدهٔ بدون صادرات.** پنج هشدار باقیمانده
(تصاویر `.jfif`/`.jpg` و `styles.css?url`) ایمپورت دارایی از طریق Vite هستند و نقص
نیستند.

**محدودیت صریح:** دسترسی شبکه در محیط بررسی قطع است، پس `npm install` و
به‌تبع آن `tsc --noEmit` کامل و `vite build` واقعی اجرا نشده است. این دو دستور
پیش از انتشار باید روی ماشین دارای اینترنت اجرا شوند (چک‌لیست پایین).

## یافته‌های برطرف‌شده

### ۱) نشت کلیدهای واقعی API در بستهٔ تحویلی — بازدارندهٔ انتشار

فایل `.env` حاوی کلید زندهٔ `LLM_API_KEY` و `LLM_FALLBACK_API_KEY` در هر چهار بستهٔ
قبلی (v1 تا v4) قرار داشت — در حالی که `.gitignore` خود پروژه صریحاً آن را ممنوع
کرده بود. از نسخهٔ v5 به بعد `.env` از بسته حذف می‌شود و فقط `.env.example`
می‌ماند.

> **اقدام لازم از سمت شما:** هر دو کلید در نسخه‌های پیشین منتشر شده‌اند و باید
> در کنسول سرویس‌دهنده **ابطال و جایگزین** شوند.

### ۲) نبود مرز خطای درون‌برنامه‌ای

روتر یک `errorComponent` داشت، اما انگلیسی بود و کل صفحه را با پیام «This page
دیدن’t load» جایگزین می‌کرد. کامپوننت جدید `AppErrorBoundary` افزوده و در
`src/routes/index.tsx` دور `<App />` پیچیده شد: پیام فارسی، دکمهٔ تلاش مجدد بدون
بازگذاری صفحه، اطمینان‌دهی صریح دربارهٔ حفظ داده، و جزئیات فنی در بخش
جمع‌شونده برای پشتیبانی.

## یافته‌های باز — نیازمند تصمیم شما

### الف) بارگذاری Tailwind از CDN در زمان اجرا — جدی‌ترین ریسک باقی‌مانده

`src/routes/index.tsx` هنگام مانت شدن، اسکریپت `https://cdn.tailwindcss.com` را تزریق
می‌کند و سه فونت را از Google Fonts و jsDelivr می‌گیرد. سه پیامد:

1. Tailwind CDN رسماً فقط برای توسعه است و برای محصول توصیه نمی‌شود.
2. برای کاربر داخل ایران، این دامنه‌ها ممکن است در دسترس نباشند؛ آن‌گاه کل
   قالب‌بندی از بین می‌رود.
3. در شبکهٔ داخلی کارفرما (محیط بسته) نرم‌افزار بدون استایل بالا می‌آید.

اصلاح درست: انتقال Tailwind به خط بیلد (پلاگین `@tailwindcss/vite` از پیش در
`package.json` هست) و میزبانی محلی فونت‌ها (بستهٔ `@fontsource-variable/vazirmatn`
نیز از پیش نصب است). این تغییر بدون اجرای بیلد واقعی قابل راستی‌آزمایی نیست،
بنابراین عمداً اعمال نشد تا کورکورانه ظاهر نرم‌افزار را نشکند.

### ب) ورود با پیامک فعال نیست

`services/smsOtp.ts` یک استاب مستند است: `sendOTP` فقط در کنسول لاگ می‌کند. خوشبختانه
`Login.tsx` فقط `validatePhone` را مصرف می‌کند، پس مسیر ورود شکسته نیست — اما تا
اتصال به یک سرویس پیامک (کاوه‌نگار/فراز اس‌ام‌اس) احراز هویت دومرحله‌ای را
وعده ندهید.

### ج) دورهٔ آزمایشی باز است

`AuthContext.tsx` خط ۹۷: `isTrialActive = true` ثابت است. پیش از فروش، منطق انقضای
اشتراک باید نهایی شود. متن فعلی به کاربر صادقانه می‌گوید که دوره هنوز تعیین
نشده، پس ادعای کاذب نیست.

### د) احراز هویت و اشتراک فقط سمت کاربر

وضعیت کاربر در `localStorage` کلید `claimmanager_user` نگهداری می‌شود. کاربر فنی
می‌تواند `subscriptionTier` را دستی به طرح بالاتر تغییر دهد. برای عرضهٔ تجاری،
اعتبارسنجی طرح باید سمت سرور انجام شود.

## مواردی که بررسی شد و سالم بودند

| محور                                       | نتیجه                                      |
| ------------------------------------------ | ------------------------------------------ |
| ایمپورت‌های شکسته در ۱۶۱ فایل              | صفر                                        |
| نام واردشدهٔ بدون صادرات                   | صفر                                        |
| خطای نحوی TS1xxx                           | صفر                                        |
| `debugger` رهاشده                          | صفر                                        |
| `console.log` در کد محصول                  | ۲ مورد، هر دو عمدی (استاب OTP و لاگر سرور) |
| متغیر محرمانهٔ افشاشده به کلاینت (`VITE_`) | صفر — همهٔ کلیدها فقط سمت سرور             |
| `TODO`/`FIXME` باز                         | ۳ مورد، همگی مستند و بدون اثر بر مسیر اصلی |
| `alert()` در مسیر کاربر                    | ۵ مورد، همگی پیام خطای فارسی معتبر         |

## چک‌لیست اجباری پیش از انتشار

روی ماشینی که اینترنت دارد:

```bash
npm install
npx tsc --noEmit      # کامپایل کامل تایپ‌ها — باید بدون خطا تمام شود
npm run lint
npm run build         # بیلد تولید
npm run preview       # دود‌تست دستی
```

سپس این مسیرها را دستی بیازمایید: آپلود اسناد → تحلیل تأخیرات → تب مالی
۵۰۹۰ → دروازهٔ ضرر و زیان → پیشنهاد خودکار از اسناد → تدوین لایحه → خروجی
PDF و Word.

و در محیط میزبانی، متغیرهای `.env.example` را با کلیدهای **جدید** تنظیم کنید —
فایل `.env` دیگر در بسته نیست.
