# Release Candidate RC-02 — Final Release Report Date: 2026-07-26 Branch: `B2B` ## Completed 1. **Storefront localization.** Replaced remaining hardcoded English strings (rating/discount aria-labels, hero-carousel dots, product-carousel prev/next buttons, dialog close button, toast dismiss, QR-code alt text, bank-payment iframe title, guest checkout fallback name) with `translate` pipe/service calls, backed by new `common.*` i18n keys in en/ru/hy. Commit: `1163bfd`. 2. **Empty-store wording.** Audited every empty-collection branch across storefront, builder, and backoffice. Found and fixed one real defect: the category/subcategory empty states used "Oops!"/"Упс!" apology framing for a normal zero-results condition. Everywhere else in the codebase already correctly separates a real `error()` branch from an empty-collection branch with distinct, neutral wording (verified across catalog, product, cart, wishlist/compare, admin list pages, dashboard, media, builder). Commit: `1163bfd`. 3. **Merchant-friendly wording (Monitoring/Analytics/Reports/Diagnostics).** Analytics, Reports (moderation/reports), and Diagnostics were already clean — no raw HTTP/queue-worker strings found. Monitoring had three developer-facing spots: background queue slugs, webhook event keys, and the activity log's "api" category showing a raw `GET /api/products responded 200 in 84ms` line as the primary message. All three now show plain-language labels by default, with the raw string for API/error/warning events moved behind a collapsed "Technical details" `
`. Commit: `ca343c4`. 4. **Dialog consistency.** Replaced all 12 native `confirm()` calls and 4 native `alert()` calls across cart, media library, static-pages editor, and 5 builder components. Confirms now use a new shared `app-confirm-dialog` (composes the existing `app-dialog` + `app-button` — no new dependency), following the same local-signal pattern already used in admin-categories. Cart's alerts route through the existing `UserNotificationService` toast pipeline instead. Zero native `confirm`/`alert`/`prompt` remain in production code (verified by grep). Commit: `6c6fa00`. 5. **Images.** Found and fixed a real defect: `getMainImage()`'s no-photo fallback pointed at `/assets/images/placeholder.svg`, but that file (and the whole `assets/images/` directory) never existed — any item with zero photos rendered a browser broken-image icon. Added the asset. Also added an `(error)` handler on every dynamic `` that renders a user/admin-supplied URL (product card, cart line item, cart payment QR, product gallery main + thumbnails), so a 404'd image URL swaps to the placeholder instead of shipping broken. Commit: `3e54e88`. 6. **Legacy cleanup.** Investigated `pages/category`, `pages/search`, `pages/item-detail`, `pages/info/**`, `pages/legal/**` (40+ files) and `dynamic-renderer/`. First five were confirmed unrouted dead code (each had a live replacement already serving its traffic) — deleted outright. `dynamic-renderer/` was confirmed **active** (it's the live homepage rendering pipeline via `HomeComponent` → `WebsiteRuntimeFacade` → `PageRendererService`/`PageResolverService` → `DynamicPageLayoutComponent`) — a prior doc note calling it "unwired" was stale and has been corrected. `docs/TODO.md`, `docs/KNOWN-ISSUES.md`, `docs/FRONTEND-ROADMAP.md`, `docs/PROJECT_INDEX.md` updated accordingly. Commit: `a670ca9`. 7. **Final QA.** `npx tsc --noEmit` clean after every commit above. `ng serve` production-mode build compiles with no errors. Manually smoke-tested in-browser: home page loads with zero console errors; cart page loads with mock data; the new clear-cart confirm dialog opens with correctly translated title/message/buttons, Cancel closes it without side effects, zero console errors throughout. Backoffice route requires an authenticated admin session (existing `adminAuthGuard` behavior, unrelated to this pass) so the Monitoring page's new wording was verified by reading the compiled template/component, not by an authenticated click-through. ## Known limitations - The i18n string audit and empty-state audit were scoped to storefront/ customer-facing surfaces per the task list; backoffice/builder templates were spot-checked but not exhaustively re-audited for hardcoded strings. - `app-confirm-dialog` is a new small shared component (composes existing `app-dialog`/`app-button`, no new library). It intentionally does not cover every dialog in the codebase — only the sites that were previously using native `confirm()`/`alert()`. - Backoffice Monitoring's Technical-details fix only touches the mock local gateway (`AdminMonitoringLocalGateway`); once a real API-backed gateway exists, it will need to populate `technicalDetail` the same way to keep the "Technical details" affordance working. - No new automated tests were added for this pass (none existed for the touched components beforehand either); verification was typecheck + manual smoke test as described above. ## Deferred items - Everything already tracked in `docs/TODO.md` under "Backend — skipped, doing together" remains deferred (bootstrap real content, builder publish/validate backend, backoffice CRUD, media pipeline) — explicitly out of scope per this task's "NO BACKEND CHANGES" instruction. - Non-blocking pre-existing items from prior RC passes noted in `docs/KNOWN-ISSUES.md` (genuine brand-color contrast failures needing theme-owner sign-off, 2 large lazy chunks needing a dedicated split task, `primeng`/`primeicons` removal blocked on an unrelated `barry-cache` dependency issue) are unchanged by this pass. ## Launch recommendation **Ready to ship** from a customer-demo-polish standpoint: no native browser dialogs, no broken-image paths on the audited surfaces, no raw developer jargon in Monitoring's default view, no apology-toned empty states, and the five dead-code page directories are gone rather than lingering as demo-confusing zombies. The remaining known limitations above are scope boundaries (backend, exhaustive re-audit, test coverage) rather than found defects — recommend proceeding, with the backoffice-auth-gated smoke test as the one item worth a human doing a real authenticated click-through on before the actual demo. ## Commits (this pass) - `1163bfd` fix(storefront): replace hardcoded strings with i18n, neutral empty-state wording - `a670ca9` chore(cleanup): delete unrouted legacy pages, update docs - `6c6fa00` fix(ui): replace native confirm()/alert() with shared dialogs and toasts - `3e54e88` fix(storefront): add missing placeholder image asset and onerror fallback - `ca343c4` fix(backoffice): merchant-friendly wording in Monitoring