چیستانآباد یک پلتفرم آموزشی نوین بر پایه سیستم تکرار فاصلهدار (Spaced Repetition) و معماری اقلیمهای یادگیری است. این مستند به عنوان منشور طراحی و توسعه، اصول بنیادین پروژه را برای جلوگیری از انحرافهای آتی تبیین میکند.
یادگیری از یک مسیر خطی به یک سفر اکتشافی تبدیل شده است. هر نشانه (حرف یا عدد) باید از ۵ اقلیم عبور کند تا به سطح «تسلط» (Mastery) برسد:
- 🏝️ اقلیم تطبیق (Phonics Intro):
- هدف: آشنایی با شکل و صدای حروف در بستر کلمه.
- مکانیزم: کودک کل کلمه را با استفاده از کیبوردی که فقط حروف همان کلمه را دارد، تایپ میکند (بازی تطبیق).
- ⛰️ اقلیم تعمیق (Missing Letter):
- هدف: تشخیص جایگاه حرف در کلمه.
- مکانیزم: کودک حرف گمشده را از بین گزینههایی شامل حروف همان کلمه و حروف یادگرفتهشده قبلی پیدا میکند.
- 🌲 اقلیم تثبیت (Spelling):
- هدف: تثبیت دیکته و افزایش سرعت عمل.
- مکانیزم: کودک کل کلمه را با کیبوردی که شامل حروف مزاحم بیشتری است، تایپ میکند.
- 🏰 اقلیم تشخیص (Word Recognition): ✅ پیادهسازیشده
- هدف: تشخیص کلمه از بین چند تصویر.
- مکانیزم: کودک کلمه را میشنود/میبیند و تصویر درست را از بین چند گزینه لمس میکند (تصاویر از نقشهٔ اموجی میآیند؛ بدون نیاز به فایل گرافیکی).
- 🏔️ اقلیم تسلط (Quick Recall): ✅ پیادهسازیشده
- هدف: مرور سریع و تثبیت در حافظه بلندمدت.
فعالیتهای مکمل (Additional Activity Types): علاوه بر ۵ اقلیم بالا، دو فعالیت دیگر هم در
ActivityTypeوجود دارد: رهگیری نشانه (TRACE_LETTER / «نقاشی حرف») با ترتیب صحیح حرکات قلم برای هر ۳۲ نشانه، و داستانگویی (STORY_TELLING).
- شتاب در گام نخست: ارتقاء از اقلیم ۱ به ۲ فقط با یک بار پاسخ صحیح انجام میشود تا کودک به سرعت وارد بازیهای چالشیتر شود.
- بازگشایی مترقی جزایر: جزیره بعدی در نقشه، بلافاصله پس از اولین موفقیت در جزیره فعلی باز میشود تا حس اکتشاف و پیشرفت حفظ شود.
- اصل ۱+ (The +1 Principle): هر کلمه جدید در مسیر اصلی یادگیری، فقط و فقط میتواند شامل یک نشانه جدید باشد و بقیه حروف آن باید از نشانههایی باشند که کودک در مراحل قبل آموخته است.
- کیبورد ایزوله: حروف «مزاحم» در کیبورد هرگز نباید شامل حروفی باشند که هنوز تدریس نشدهاند.
اسنپشات از آنچه ساخته و روی دستگاه تأیید شده است (برای ردیابی در توسعههای آتی):
- هر ۳۲ نشانهٔ الفبا با مسیر یادگیری کامل (Phonics → Missing Letter → Spelling → Word Recognition → Quick Recall) + رهگیری و داستانگویی.
- رهگیری با ترتیب حرکات قلم (Stroke-order tracing): برای هر ۳۲ نشانه مسیرِ مرکزی (centerline) بهصورت دستی نویسهگذاری و روی دستگاه کالیبره شده است. کودک باید خطوط را به ترتیب و جهت درست دنبال کند (نقطهٔ شروع سبزِ چشمکزن، «خط N از M»، پشتیبانی از لمسِ نقطهها). نویسههایِ بدون مسیرِ دستی بهصورت خودکار به روش پوششِ کانتور (Coverage) بازمیگردند. کد:
letterStrokeDataوOrderedTracingSurfaceدرLearningSessionScreen.kt.- یادداشت کیفیت: مسیر نشانههای ک گ ط ع ص «قابلتشخیص ولی تقریبی» است و جای پالایش دارد.
- واژههای نمونهٔ بیشتر (Example words): هر نشانه ۱ تا ۲ واژهٔ ملموسِ کنترلشده با اصلِ ۱+ دارد (۵۲ واژه، همگی با اموجی). اینها تمرینِ عمیقترِ بدون امتیاز هستند (سرعتِ تسلط را زیاد نمیکنند). کد:
letterExamplesدرLearningViewModel.kt. - صدای فارسیِ آفلاین با AvaCore: اپ خواهرِ AvaCore (موتور TTS مبتنی بر Piper/Sherpa-ONNX) بهعنوان موتورِ گفتارِ آفلاین استفاده میشود (با Fallback به موتور پیشفرض). (برای جزئیات به TODO.md بخش ۴ نگاه کنید — بهروز شده.)
- انگیزش: آلبوم استیکر، نوار پیشرفت/رشد گیاه، استریک روزانه، جشن موفقیت.
- پایداری: مدیریت رویدادِ مقاوم (خروج ایمن، عدم گیرکردن بین مراحل).
مرحلهٔ بعدی (در صورت ادامه): پالایش ۵ مسیر تقریبی بالا؛ تصاویر سفارشی بهجای اموجی (اولویت پایین — اموجی همان «عینیت» را میرساند). جزئیات کامل در .claude/.../memory/backlog-next-steps.md.
LearningViewModel.kt: مدیریت وضعیت کلی بازی، انتخاب نوع فعالیت (ActivityType)، تولید کیبورد تطبیقی (generateAdaptiveKeyboard)، صفِ جلسه (sessionQueue) و نقشهٔ واژههای نمونه (letterExamples).LearningRepository.kt: مدیریت پیشرفت (XP) و زمانبندی مرورها بر اساس سیستم لایتنر.IslandMapScreen.kt: نمایش نقشه و منطق بازگشایی (Unlock) جزایر.LearningSessionScreen.kt: UIِ همهٔ فعالیتها؛ شاملِ رهگیریِ ترتیبدار (letterStrokeData+OrderedTracingSurface) با Fallback بهCoverageTracingSurface، و نقشهٔ اموجیِ مشترک (getEmojiForWord).util/TtsManager.kt: صراحتاً موتورِ AvaCore را درخواست میکند (سازندهٔ ۳-آرگومانیِTextToSpeech) با Fallback به موتور پیشفرض. ترتیبِ تعریفِ property/init مهم است (رجوع به memory).
- قانون ترتیب: شناسههای محتوا (مانند
a01,a02) باید دقیقاً با ترتیب آموزشی مورد نظر منطبق باشند. پایگاه داده آیتمها را بر اساس همین شناسهها مرتب میکند.
| مشکل رایج (Symptom) | علت احتمالی (Root Cause) | راه حل استاندارد (Standard Solution) |
|---|---|---|
| پایان زودهنگام مرحله | ناهماهنگی بین targetString در ViewModel و کلمه نمایش داده شده در UI. |
targetString باید همیشه کل کلمه (item.word) باشد. سختی باید از طریق کیبورد کنترل شود، نه با تغییر هدف. |
| توقف پیشرفت در نقشه | منطق isLocked در IslandMapScreen بیش از حد سختگیرانه است. |
بازگشایی جزیره باید به محض اولین موفقیت (مثلاً lastReviewTime > 0) انجام شود. |
| نمایش حروف تدریس نشده | نقض اصل ۱+ در seedData یا منطق اشتباه در generateAdaptiveKeyboard. |
seedData را بازبینی کنید تا هر کلمه فقط یک حرف جدید داشته باشد. حروف مزاحم باید فقط از learnedLetters انتخاب شوند. |
| تمرینِ نمونه لمس را نمیگیرد / گیر میکند | دو آیتمِ متوالیِ صف، شناسهٔ (id) یکسان دارند؛ صفحهها وضعیتِ هر تمرین را با remember(item.id) نگه میدارند و isTransitioning فقط در LaunchedEffect(currentItem?.id) ریست میشود → آیتمِ دوم «تمامشده» میماند و لمس را نادیده میگیرد. |
اصل ثابت: هر آیتمِ sessionQueue باید id یکتا داشته باشد. واژههای نمونه از <mainId>_ex<i> استفاده میکنند (مشتق از id اصلی تا چکِ "p0"ِ کیبورد حفظ شود). |