# Validation

The final combined regression run passed **88 tests**: 34 admin core, 13 finance, 12 operations, and all 29 existing customer tests. The public TypeScript declaration passes declaration-only validation. No production service is called by these tests. The final output is saved in `output/playwright/admin-api-tests.txt`.

Browser validation used the real static app and API on port 8765. Primary mobile width: 360 px; additional checks at 390 px and 1280 px. Current modules were explicitly reloaded after changes.

The final fresh-world review checked 21 principal routes at 360 px with no page or console errors and no horizontal overflow. It also verified all four deletion warnings, search focus retention, both themes and the desktop navigation rail.

| Area | Exercised behavior |
| --- | --- |
| Core navigation | All 15 customer/catalog/revenue routes rendered; phone layouts stayed within viewport; light and dark themes; native dialog dismissal and focus restoration |
| Identity | Non-admin refusal, expired authentication, missing Telegram launch, recovery to admin using demo controls |
| Customers | Wallet 20 increase by 150,000 with reason, exact balance update, insufficient decrease refusal, Persian required-field errors |
| Subscriptions | +10 days / −5 GB live projection and application, recorded support reason, disable/enable, missing-on-panel adjustment suppression and confirmed deletion |
| Catalog | Plan with 1.5GB, visibility toggle, category creation, panel/template/plan links, strategy 8, partner-only wallet warning, commitment, 45-day deletion setting and selling toggle |
| Revenue | Today’s hourly buckets, complete custom range requirement, actionable 400-month refusal, comparison, metric/bar/cumulative choices retaining report generation time, keyboard point selection and table |
| Health | On-demand per-panel checking and resolution, three online and one offline |
| Finance | Cards and period limits; countdown and actual 20-second rotation refresh; old audit history retained; reasons and cap refusals; wallet overrides; cashback; Tronado/NOWPayments masking; nested rules, tester and gating warnings |
| Operations | Broadcast test-first flow; warnings/channels/tutorials/ads/referral; reports and backup; frozen bulk previews, pause/resume/cancel/delete, item pagination and discard on leave |
| Fresh setup | All seven steps through the actual mobile UI, including report code registration, category, panel, template, payment prerequisites, plan, connections and access sync; final 7/7 and dashboard completion |

The financial detail report is in `output/playwright/admin-finance-QA.md`. Browser drivers and screenshots use the `output/playwright/admin-` prefix. Tests cover additional rollback, permission, stale state and boundary cases that are more reliable to assert at the API boundary.

Two source-brief contradictions are recorded in `README.md`: the formal 400-month revenue limit and the 29 explicitly enumerated NOWPayments settings.

## Startup regression

Reproduced the initial loading screen hanging when the external Telegram SDK request never completed: its former deferred script blocked execution of the app module. Telegram now loads asynchronously; the local startup entry imports the app independently and offers a Persian retry state on an import failure or a 12-second startup timeout. A delayed SDK attaches host theme and back navigation after the dashboard is already usable.

Browser coverage in `output/playwright/admin-startup-flows.js`: held SDK request, failed SDK request, late host theme/back integration, failed app module and successful retry. The stalled-app timeout and retry were also exercised. No shared-world reset or stored-data changes are part of this fix.
