# ممیزی سخت‌گیرانه‌ی پروژه الفباز — وضعیت، درصد پیشرفت و نقشه‌ی توسعه

**تاریخ:** 1404/07/04 (2026-09-26) · **نسخه‌ی ممیزی‌شده:** 1.10.0 · **روش:** بازرسی مستقیم کد/داده/سرور + اجرای مجدد تست‌ها + اندازه‌گیری (نه فقط ادعای مستندات)

---

## ۱. تصویر لحظه‌ای (اندازه‌گیری مستقیم)

| محور | عدد |
|---|---|
| کد کلاینت | ۵۹ ماژول · ۷,۷۹۲ خط (بدون build-step، ESM خالص) |
| سرور | ۲۴ فایل · ۲,۶۴۲ خط (Express + better-sqlite3) |
| داده‌ی آموزشی | ۱۰,۵۷۸ خط — ۱۴۱ حرف در ۵ پک · **۳۰۹ واژه** · ۳۴ داستان · ۲۵۵ کلید i18n ×۵ |
| تست | ۱۸۹ واحد (۱۲ سوئیت) + ۲۴ e2e اپ + ۶ پک + ۱۵ ادمین = **۲۳۴ بررسی خودکار** |
| وابستگی پروداکشن | فقط ۵ بسته (express, better-sqlite3, bcryptjs, jsonwebtoken, compression) — `npm audit`: **۰ آسیب‌پذیری** |
| بدهی فنی آشکار | **۰** مورد TODO/FIXME/HACK · فقط ۶ console.log سروری (بوت/خطا) |
| Lighthouse | کارایی ۸۵-۸۶ · a11y/BP/SEO ۱۰۰ (میانه‌ی ۳ اجرا، در CI) |
| زیرساخت | **بدون git · بدون Docker · بدون HTTPS · بدون پایش · بدون بکاپ خودکار** |

## ۲. آنچه واقعاً قوی است (با شواهد، نه تعارف)

۱. **نظم معماری**: مرز «ماژول خالص / رندر / سرویس» واقعاً اجرا شده — منطق قضاوت (speechMatch، wordText، stories، reportModel، masteryTracker) بدون DOM است و به همین دلیل در Node تست می‌شود. این بافت برای پروژه‌ای در این مقیاس کمیاب است.
۲. **تست‌پذیری به‌مثابه فرهنگ**: هر فاز با تست بسته شده؛ تست‌ها باگ واقعی گرفته‌اند (۱۴ مورد مستند در docs ۲۱-۲۵)، نه اینکه فقط سبز بمانند. درس‌ها (TDZ، isFinal، context ایزوله، کش پروکسی) ثبت و دوباره تکرار نشده‌اند.
۳. **امنیت پایه‌ی درست**: bcrypt 12، prepared statements همه‌جا، RBAC که **همیشه از DB می‌خواند** (نه JWT)، چرخش refresh با تشخیص replay، audit کامل، rate-limit، پیام‌های عمومی ضد enumeration. برای این مقیاس، فراتر از انتظار.
۴. **خودکفایی داده**: ۵ زبان با داده‌ی واقعی (نه lorem)، فونت آفلاین (woff2)، PWA کامل با آیکون‌ها، ماسک ایموجی/حرکت‌های عربی-فارسی، ترکی‌آگاهی ı/i.
۵. **مستندسازی**: ۲۸ سند شامل ADR، گزارش فاز، پروتکل تست UX و قاعده‌ی «یافته → اصلاح». برای توسعه‌دهنده‌ی بعدی، ارزش واقعی.

## ۳. آسیب‌شناسی سخت‌گیرانه

شدت: 🔴 بحرانی برای عرضه · 🟠 مهم · 🟡 متوسط

### 🔴 ۳.۱ — فرایند مهندسی: پروژه **git ندارد**
هیچ version control، هیچ tag، هیچ تاریخچه‌ی commit، هیچ مسیر rollback. یک اشتباه در ویرایش فایل = از دست رفتن بی‌بازگشت کار. برای هر سرمایه‌گذار/همکار این نخستین سیگنال خطر است. (LICENSE و CHANGELOG هم نیست — مانع توزیع رسمی.)
**اصلاح:** `git init` + اولین tag `v1.10.0` + قاعده‌ی شاخه/PR — ۱ ساعت.

### 🔴 ۳.۲ — زیرساخت عرضه صفر است
سرور فقط با دستِ دستور env دار روی یک پورت HTTP بالا می‌آید: **بدون HTTPS/TLS** (توکن‌ها و رمزها روی شبکه‌ی خام)، بدون HSTS، بدون CSP (فقط nosniff و no-referrer)، بدون reverse proxy، بدون process manager، بدون staging. `X-Frame-Options` هم عمداً حذف شده (پیش‌نمایش iframe) — تصمیم درست برای توسعه، اشتباه برای تولید.
**اصلاح:** Docker + Caddy/Traefik (TLS خودکار) + CSP با `frame-ancestors` سفارشی + هدرهای helmet — ۱-۲ روز.

### 🔴 ۳.۳ — صفر بکاپ خودکار سرور
والد «خروجی داده» دارد، اما خود سرور نه: هیچ cron ای روی `alphabet.db` (حتی `.backup` امن WAL) و پوشه‌ی `audio/` نیست. از دست رفتن دیسک = از دست رفتن حساب‌ها.
**اصلاح:** cron روزانه `sqlite3 .backup` + rsync پوشه‌ی داده + تست بازیابی — نیم روز.

### 🔴 ۳.۴ — اعتبارسنجی با کاربر واقعی: **۰ از ۵ جلسه**
تمام طراحی UX بر فرض‌های بزرگسالانه بنا شده. پروتکل، کیت XLSX و پیش‌اجرا آماده است — اما تا آخرین جلسه‌ی کودک اجرا نشود، «کارایی آموزشی» و «قابل‌استفاده بودن» ادعای اثبات‌نشده است. این **بزرگ‌ترین ریسک محصول** است، نه کد.
**اصلاح:** ۵ جلسه طبق سند ۲۳ (هر کدام ۳۰ دقیقه انسانی) + تبدیل یافته‌ها.

### 🟠 ۳.۵ — عمق محتوا نازک است (اندازه‌گیری شد)
از ۳۲ حرف فارسی، **۱۹ حرف کمتر از ۳ واژه‌ی شروع‌شونده دارند** (کمینه: ۱). انگلیسی: ۱۳ از ۲۶. واژه‌سنجی/بچین‌و‌بخوان با تنوع محدود می‌سوزند و تکرار سریع می‌آید. داستان‌ها هم عمدتاً روی حروف ابتدای نردبان‌اند — انتهای مسیر (حروف ۱۶-۳۲) محتوا ندارد. ابزار درج ادمین هست؛ **لایه‌ی تألیف** نیست.
**اصلاح:** اسپرینت محتوا: حداقل ۵ واژه/حرف ×۱۴۱ (~۴۰۰ واژه) + ۲ داستان برای هر یک‌چهارمِ پایانی نردبان — ۳-۵ روز تألیف + اعتبارسنجی.

### 🟠 ۳.۶ — بازیابی حساب والد وجود ندارد
فراموشی رمز والد = مرگ حساب (فقط حذف توسط ادمین). ایمیل تأیید هم نیست. برای محصول عمومی این یعنی بار پشتیبانی و ریزش کاربر.
**اصلاح:** سرویس ایمیل + جریان reset با توکن یک‌مصرفی (الگوی refresh token موجود است) — ۱-۲ روز.

### 🟠 ۳.۷ — پایش و رصد خطا صفر است
Diagnostics فقط محلیِ مرورگر است؛ خطای تولید (500، خرابی DB، خطای تشخیص گفتار) هیچ‌جا تجمیع نمی‌شود. نخستین شب عرضه = ناشنیدن کامل.
**اصلاح:** Sentry/GlitchTip سلف‌هاستد + لاگ ساختاریافته + آلارم سلامت — ۱ روز.

### 🟠 ۳.۸ — مقیاس‌پذیری تک‌نمونه‌ای و بدون سقف داده
better-sqlite3 تک‌فرایند است (تا چند صد کاربر همزمان کافی؛ بعدش نه)، rate-limit ها در حافظه‌اند (ری‌استارت = پاک شدن پنجره‌ی brute-force)، و `session_events` **بدون سیاست نگهداشت/بایگانی** رشد بی‌انتها دارد. توکن کودک ۳۰ روزه قابل ابطال از سمت والد نیست (UI حذف دستگاه نیست).
**اصلاح:** retention ۹۰ روزه + UI ابطال دستگاه (۱ روز) · مسیر مهاجرت Postgres فقط وقتی داده‌ی کاربر توجیهش کند (مستند شود، اجرا نشود).

### 🟡 ۳.۹ — کیفیت تست: عمق خوب، ابزار ساده
پوشش % اندازه‌گیری نمی‌شود (c8 نصب نیست)، فریم‌ورک تست دست‌ساز است (برای این پروژه قابل‌دفاع اما استخدام نیروی جدید را سخت می‌کند)، تست بصری/بارگزاری نیست، Lighthouse فقط صفحه‌ی اول را می‌سنجد.
**اصلاح:** c8 + آستانه‌ی ۷۰٪ روی ماژول‌های core + یک تست بار سبک (autocannon) — نیم روز.

### 🟡 ۳.۱۰ — ریزمورد‌های امنیتی باقی‌مانده
JWT secret فایل‌محور بدون چرخش · توکن در query string (?cs=) به‌عنوان fallback (سطح نشت کوچک اما واقعی — با لاگ‌نکردن کوئری مهار شده) · بدون 2FA برای superadmin · بدون اسکن وابستگی در CI · بدون اسکن AV روی آپلودها (محدود به mime/اندازه — ریسک پایین).
**اصلاح:** چرخش secret + dependabot/audit در CI + اختیاری TOTP برای superadmin — ۱ روز.

### 🟡 ۳.۱۱ — محصول نیمه‌کاره‌های کوچک
پنل ادمین فقط فارسی است (اپ ۵ زبانه) · بدون وضعیت آنلاین/آفلاین صریح در UI کودک · بدون ردیاب «چند دقیقه امروز» برای والد (playtime هست، گزارش لحظه‌ای نیست) · GSAP کامل ۲۲۸KB لود می‌شود (باندل/درخت‌تکان دادن نیست) · تشخیص گفتار وابسته به سرویس ابری Chrome (آفلاین ندارد، حریم خصوصی مستند شده اما جایگزین محلی ندارد).

## ۴. درصد پیشرفت — با تعریف صریح مبنای سنجش

«درصد» بدون مبدا بی‌معناست؛ سه مبنا می‌گذارم:

| مبنای سنجش | درصد | توضیح |
|---|---|---|
| **MVP تعریف‌شده‌ی داخلی (فازهای ۱-۱۵)** | **~۹۵٪** | همه‌ی فازها کامل، تست‌سبز، مستند. باقی‌مانده: اجرای واقعی جلسات UX (معیار باز سند ۲۳) |
| **آمادگی برای پایلوت با ۱۰-۲۰ خانواده‌ی واقعی** | **~۸۰٪** | مانده: HTTPS+بکاپ (🔴۳.۲/۳.۳) + reset رمز + پایش خطا — حدود یک هفته کار |
| **آمادگی عرضه‌ی عمومی/تجاری به هر خانواده‌ای** | **~۶۰٪** | همه‌ی 🔴ها + عمق محتوا + اعتبارسنجی کاربر + فرایند (git) + پایداری عملیاتی |

تفکیک وزنی برای «عرضه‌ی عمومی» (وزن × امتیاز):

| بُعد | وزن | امتیاز | سهم |
|---|---|---|---|
| محصول و ویژگی‌ها | ۲۵٪ | ۸۵ | ۲۱.۳ |
| کیفیت مهندسی و تست | ۱۵٪ | ۷۵ | ۱۱.۳ |
| امنیت | ۲۰٪ | ۶۰ | ۱۲.۰ |
| زیرساخت و استقرار | ۱۵٪ | ۳۰ | ۴.۵ |
| محتوا و چندزبانه | ۱۰٪ | ۶۵ | ۶.۵ |
| اعتبارسنجی با کاربر واقعی | ۱۵٪ | ۲۵ | ۳.۸ |
| **جمع** | | | **~۵۹٪ → ۶۰٪** |

نکته‌ی صادقانه: قوی‌ترین محور (محصول ۸۵٪) و ضعیف‌ترین محورها (زیرساخت ۳۰٪، اعتبارسنجی ۲۵٪) **هیچ‌کدام کدنویسی بیشتر نمی‌خواهند** — عملیات و انسان می‌خواهند. یعنی نزدیک‌ترین مسیر به +۲۰٪ پیشرفت، یک هفته‌ی عملیاتی + ۵ جلسه‌ی کودک است، نه فاز ۱۶ برنامه‌نویسی.

## ۵. نقشه‌ی توسعه — سه موج (به‌ترتیب ارزش/زحمت)

### موج ۱ — پایدارسازی برای عرضه (≈ ۱ هفته‌ی مهندسی)
| # | کار | زحمت | ریسک اگر نباشد |
|---|---|---|---|
| ۱ | ✅ git + LICENSE (MIT/CC-BY برای محتوا) + CHANGELOG + tag v1.10.0 — انجام ۲۰۲۶-۰۹-۲۶ | S | بازگشت‌ناپذیری |
| ۲ | ✅ Docker + Caddy (TLS خودکار) + CSP صفر-inline + هدرها — سند ۲۸ | M | رمز روی شبکه‌ی خام |
| ۳ | ✅ بکاپ خودکار DB+فایل‌ها + **تست بازیابی** — ۱۰ تست، بازیابی عملی | S | از دست رفتن داده |
| ۴ | ✅ پایش خطا (Sentry/GlitchTip با پروتکل Envelope) + لاگ JSON-line — ۲۰۲۶-۰۹-۲۶ | S | کوری عملیاتی |
| ۵ | ✅ reset رمز والد از کانال ادمین (رمز موقت AP- بدون جدول توکن) — ایمیل → موج ۲ | M | ریزش کاربر |
| ۶ | ✅ retention شبانه (۱۸۰ روز) + «خروج از همه دستگاه‌ها» برای والد | S | رشد بی‌انتها/نشست سرقت |
| ۷ | ✅ c8 (خطوط ۸۷٪ واقعی · آستانه ۷۵) + dependabot هفتگی گروهی | S | رگرسیون بی‌صدا |

### موج ۲ — اعتبارسنجی و عمق (پایلوت واقعی، ۴-۶ هفته)
| # | کار | زحمت | چرا |
|---|---|---|---|
| ۸ | **۵ جلسه‌ی UX سند ۲۳** + اعمال یافته‌ها | انسانی | بزرگ‌ترین ریسک محصول |
| ۹ | اسپرینت محتوا: ≥۵ واژه/حرف ×۱۴۱ + داستان برای یک‌چهارم‌های پایانی | M (تألیف) | تکرار/ملال |
| ۱۰ | پایلوت ۱۰-۲۰ خانواده با سنجه‌ی یادگیری (پیش/پس از تشخیص حرف) | M | اثبات ارزش آموزشی |
| ۱۱ | ممیزی دسترس‌پذیری واقعی (هدف لمس، کنتراست بازی‌ها، اسکرین‌ریدر) | S | Lighthouse a11y=100 فقط صفحه‌ی اول است |
| ۱۲ | i18n پنل ادمین (en) + نشانگر آنلاین/آفلاین کودک | S | کمال‌گرایی |

### موج ۳ — رشد پلتفرم (فقط بعد از موج ۲ که داده توجیه کرد)
- **حالت کلاس/معلم**: فهرست دانش‌آموزان، تکالیف حرف، داشبورد کلاس (طبیعی‌ترین مدل درآمدی B2B)
- **تشخیص گفتار محلی** (Whisper small روی سرور یا WASM) → آفلاین + حریم خصوصی کامل
- **تحلیل یادگیری**: قیف افت، پیش‌بینی حروف در خطر، گزارش هفتگی والدین
- **بسته‌بندی اپ‌استور** (Capacitor) و نصب PWA از استورها
- **باندل esbuild** (بدون تغییر معماری) → حذف ~۳۰٪ وزن بوت
- **مهاجرت Postgres + object storage** فقط با داده‌ی مقیاس
- زبان‌های جدید (ur/de) — زیرساخت داده آماده است، زحمت = تألیف
- مدل تطبیقی داده‌محور (وزن‌های selector الان دستی‌تنظیم‌اند)

## ۶. حکم نهایی

پروژه از نظر **مهندسی محصول در سطح بالاتر از نمونه‌های هم‌مقیاس** است — معماری تمیز، ۲۳۴ تست خودکارِ واقعاً شکست‌جو، امنیت پایه‌ی درست، مستندسازی کم‌نظیر. اما از نظر **آمادگی عرضه‌ی عمومی ~۶۰٪** است، چون سه بحرانیِ غیرکدی باز است: git نیست، زیرساخت تولید (TLS/بکاپ/پایش) صفر است، و مهم‌تر از همه **هیچ کودکی هنوز با آن بازی نکرده**. مسیر ۶۰→۸۵٪ یک هفته عملیات + ۵ جلسه‌ی کودک است؛ ۸۵→۱۰۰٪ داده‌ی پایلوت و محتوای عمیق‌تر می‌خواهد، نه کد بیشتر.
