# 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"
   `<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 `<img>` 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
