گزارش مرحله ۲ — موتور متغیرهای متن مبنای کار: بسته SinTime-v31-Stage1-Cleaned.zip موجود در همین محیط. پوشه storage و config.json نصب زنده در بسته نبودند؛ بنابراین تست داده‌های واقعی/پیکربندی زنده انجام نشده است. تغییرات: 1) در bot.php تابع render_template به جای چندین str_replace ترتیبی، از جایگزینی یک‌مرحله‌ای با preg_replace_callback استفاده می‌کند. 2) مقدار تزریق‌شده دوباره به‌عنوان قالب پردازش نمی‌شود؛ بنابراین اگر مقدار یک متغیر خودش شامل {price} باشد، به‌صورت ناخواسته بازنویسی نمی‌شود. 3) کلید متغیرها بدون حساسیت به بزرگی/کوچکی حروف تطبیق داده می‌شود. 4) متغیر ناشناخته/غایب دست‌نخورده باقی می‌ماند؛ مقدار آرایه/شیء نادیده گرفته می‌شود تا هشدار PHP یا تبدیل ناخواسته رخ ندهد؛ مقدار null به رشته خالی تبدیل می‌شود. 5) order_template_data اطلاعات سفارش را با مقادیر پیش‌فرض امن‌تر جمع می‌کند و کلیدهای متداول متن سفارش مانند username، quantity، count، name، gift، amount، wallet، emoji، stars، sender_name، hidden، comment، discount، max_discount، final، reason و balance را در صورت موجود بودن داده فراهم می‌کند. اطلاعاتی که در رکورد سفارش موجود نیستند، حدس زده نمی‌شوند. 6) پیش‌نمایش زنده پیام‌ها در webpanel.php به‌جای زنجیره replaceAll، از یک نگاشت نمونه و جایگزینی یک‌مرحله‌ای استفاده می‌کند و متغیرهای بیشتری را پیش‌نمایش می‌دهد. 7) تست رگرسیون tests/test_template_engine.php به بسته افزوده شد. تست‌های اجراشده: - php -l bot.php: موفق - php -l webpanel.php: موفق - php -l webpanel_defaults.php: موفق - php -l install.php: موفق - php -l cron.php: موفق - tests/test_template_engine.php: ۸ از ۸ موفق - بررسی نحوی فایل‌های JS با node --check اجرا شد؛ فرمان خطایی گزارش نکرد. محدودیت‌ها: - قالب‌های ذخیره‌شده در config.json و storage نصب زنده در دسترس نبودند؛ تطبیق همه کلیدهای واقعی ذخیره‌شده هنوز تأیید نشده است. - خرید واقعی، ارسال پیام به تلگرام، HTML parse mode، سفارش‌ها و پرداخت‌ها در محیط زنده آزمایش نشده‌اند. - متغیرهای ناشناخته عمداً حذف یا با مقدار ساختگی جایگزین نمی‌شوند و به‌صورت {token} باقی می‌مانند. - در این مرحله منطق گیرنده، پرداخت، کیف پول و سفارش‌ها تغییر داده نشده است.