44 lines
9.1 KiB
Markdown
44 lines
9.1 KiB
Markdown
# بازبینی کد و بکلاگ پیشنهادی
|
|
|
|
تاریخ: ۲۰۲۶/۱۰/۲۸، مبنا 751af76. بررسی: منبع همهٔ حوزههای اصلی، دادهٔ محلی، تستها، build و فایلهای انتشار. اجرای تعاملی WebGL/گوشی یا محیط production انجام نشده است. موارد زیر اصلاحشده محسوب نمیشوند. اولویتها پیشنهاد مهندسیاند، نه تسک مصوب.
|
|
|
|
## یافتههای قابل پیگیری
|
|
|
|
| شناسه | اولویت | شاهد و اثر | معیار پذیرش پیشنهادی |
|
|
|---|---|---|---|
|
|
| R01 | بالا | `swipePayment` شکست خرید را به idle برمیگرداند، ولی `swipe()` در main روی false فوراً return میکند. اگر دستگاه بین آمادهشدن و کشیدن کارت بسته شود، پنل پرداخت ممکن است باز و بدون مسیر بازیابی بماند؛ cancel در idle false است. | بازتولید عبور ساعت پایان بین begin/ready/swipe؛ بدون برداشت، پیام خطا و پنل قابل بستن/تلاش مجدد، busy خاموش؛ تست اتصال UI |
|
|
| R02 | بالا | `canAffordAnything(state,machines)` در `checkEnd` test pointهای .5 قیمت را حتی در حالت غیرواقعی میشمارد. در UI و منطق بودجه تعریف «دستگاه فعال» یکسان نیست. با این حال factory نیز ارزان و شبانهروزی است، پس صرف حذف test در همین دادهها الزاماً نتیجهٔ تابع پایان را عوض نمیکند. دسترسی جغرافیایی نیز در تابع منظور نیست. | تعریف دستگاههای قابل احتساب بر اساس mode و دسترسی؛ تست حذف نقاط test در حالت عادی و مرز پول/ساعت |
|
|
| R03 | متوسط | `buildGraph` همهٔ یالها را دوطرفه میسازد؛ oneway فقط در traffic است. خط مسیریابی ماشین ممکن است خلاف جهت راهنمایی کند. | گراف رانندگی جهتدار، پیاده طبق سیاست مطلوب؛ تست مسیر مجاز/ممنوع در دو جهت و مسیر کارخانه |
|
|
| R04 | متوسط | reset متغیرهای lines/lineTimer، timeoutهای reward/banner و stick را پاک نمیکند؛ real tracking/AR را خاموش نمیکند؛ factory.reset فقط resetArrival است و چرخهٔ کامیون ادامه دارد. | ابتدا تعریف سیاست reset؛ سپس reset وسط دیالوگ/پاداش/joystick/GPS/بارگیری بدون پیام یا ورودی عملیات قبلی؛ تست lifecycle |
|
|
| R05 | متوسط | ساعت بازی حین پرداخت ادامه دارد؛ checkEnd هر نیمثانیه خریدها را میبیند ولی پاداش مأموریت بعد از تحویل اعمال میشود. اگر آخرین خرید پول را تمام کند، پایان بودجه میتواند پیش از جایزهٔ نجاتدهنده نمایش داده شود. | تست خرید آخر با جایزهٔ نقدی، درحالتحویل پایان ندهد؛ پس از تسویهٔ پاداش وضعیت نهایی محاسبه شود |
|
|
| R06 | متوسط | شرط سرعت GPS فقط interact است. پس از بازشدن shop/آغاز payment سرعت و fix در swipe مجدداً اعتبارسنجی نمیشوند؛ paused بودن shop نیز updateReal را متوقف میکند. | سیاست اعتبار fix/سرعت/رسیدن در تأیید خرید تعریف شود؛ سناریؤ تغییر سرعت یا مکان وسط پرداخت بدون برداشت نامعتبر |
|
|
| R07 | متوسط | SW نسخه را از نام فایلها میسازد و assets بدون hash مثل buildings.bin یا portrait در cache-first میمانند. تغییر فقط محتوای public با نام ثابت لزوماً cache جدید نمیسازد؛ cache imagery هم نسخه ندارد. | build با تغییر یک asset همنام؛ نسخهٔ نصبشده فایل تازه بگیرد و tile قدیمی طبق سیاست مشخص invalidate شود |
|
|
| R08 | متوسط | main دانلود فایل optional را catch میکند، ولی decodeBuildings خارج catch است. پاسخ موفق با bin خراب یا HTML fallback میتواند bootstrap را قطع کند. | header/length/count معتبر یا خطای کنترلشده و fallback OSM؛ تست فایل کوتاه، magic غلط، truncated vertex |
|
|
| R09 | متوسط | وقتی imagery index موجود است city از satellite mode استفاده میکند، اما tile غایب/failed فقط failed علامت میخورد و دوباره تلاش نمیشود. آفلاین در منطقهٔ دیدهنشده احتمالاً زمین کامل ندارد. | آزمون index موجود+JPG 404/offline؛ fallback خوانا و سیاست retry روشن |
|
|
| R10 | متوسط | `canAffordAnything` پس از بستهشدن همهٔ دستگاههای مقرونبهصرفه به فردا نگاه نمیکند، ولی ساعت نمایش و isOpen روزانه modulo دارند. مأموریت مدرسه بدون پنجرهٔ شکست/انتظار ممکن است معطل بماند. | تصمیم محصول دربارهٔ روز دوم، شکست/تکرار مأموریت و انتظار؛ تست ۱۳:۳۰، ۲۳:۰۰ و ۰۰:۰۰ |
|
|
| R11 | پایین | `places` پایان از همهٔ خریدها و denominator از کل machines است؛ testها حتی وقتی غیرفعالاند در کل مکانها میآیند. متن «با ماشین» فقط متن است و نه شرط مأموریت. | شمارش UI با دستگاه فعال و سیاست مأموریت مطابقت داشته باشد؛ پوشش test/real و خرید پیاده |
|
|
| R12 | متوسط | bundle JS حدود ۱٫۷۹ مگابایت و main بزرگ؛ world JSON و Three.js در payload شروعاند. تست فعلی FPS/زمان شروع یا مصرف حافظه را نمیسنجد. | baseline روی گوشی ضعیف قبل refactor؛ هدف عددی زمان شروع/FPS با توافق صاحب محصول، بدون حذف قابلیت |
|
|
|
|
R01 و R05 با import مستقیم توابع فعلی در Node نیز بررسی شدند:
|
|
|
|
- R01: مدرسه در minutes=809.98 وارد پرداخت/ready شد؛ در minutes=810، swipe برابر false، phase برابر idle، busy برابر false و balance همچنان 500 بود. مسیر main پس از false پنل را نمیبندد؛ اثر بصری پنل نیازمند بازتولید مرورگر است.
|
|
- R05: خرید آب کارخانه با balance=8، پس از swipe balance=0 و busy=true و canAffordAnything=false شد؛ completeMissions سپس balance=20 و canAffordAnything=true ساخت. این اختلاف پنجرهٔ checkEnd پیش از delivery را تأیید میکند؛ ترتیب نمایش modal نیازمند تست یکپارچه است.
|
|
- R02: در ۲۳:۰۰ با balance=8، با همهٔ تعاریف و بدون testها هر دو canAffordAnything=true بودند؛ کارخانه دلیل باقیماندن نتیجه است. این مورد ناهماهنگی دامنه/سیاست است، نه ادعای اثباتشدهٔ تغییر خروجی پایان صرفاً بهخاطر testها.
|
|
|
|
passing بودن تستهای فعلی رد سناریوهای بالا نیست.
|
|
|
|
## ناهماهنگی اسناد قدیمی
|
|
|
|
- README هنوز Gitea deploy را SSH و DEPLOY_HOST توضیح میدهد؛ workflow فعلی registry + Docker socket است.
|
|
- README میگوید خیابانها یکطرفه ندارند؛ داده و traffic one-way دارند اما routing ندارد. بهجای حکم کلی این تفکیک لازم است.
|
|
- README شروع را سالن تولید نوشته؛ spawn واقعی حیاط کنار ماشین است.
|
|
- آرشیو مکالمهٔ قدیمی از روبات جای کودک و جنگل میگوید؛ وضعیت فعلی خانواده انسانی و روبات دستگاه است.
|
|
|
|
## پیشنهادهای محصول؛ نیازمند تصمیم
|
|
|
|
ذخیرهٔ پیشرفت محلی با schemaVersion و migration؛ برنامهٔ آزمون کامل موبایل؛ قواعد واقعیتر ترافیک/چراغ؛ پیشرفت مناطق و شهرها؛ مأموریت کارخانه/نقش کارکنان؛ تجربهٔ GPS با اعتبارسنجی روشن؛ accessibility و کاهش حرکت/مصرف باتری. backend و leaderboard تصمیم معماری/محصول جدا میخواهند؛ آنها را صرفاً برای رفع یک UI bug اضافه نکنید.
|
|
|
|
## ترتیب اجرایی پیشنهادی
|
|
|
|
ابتدا صحت تراکنش و reset (R01/R04/R05)، سپس منطق mode/پایان (R02/R06/R10/R11)، سپس قابلیت اطمینان offline/data (R07/R08/R09)، سپس route direction (R03) و اندازهگیری کارایی (R12). هر تغییر بهتر است تسک مستقل با تست مربوط باشد.
|