A product title containing & < > " ' silently breaks VK purchases: VK
HTML-escapes the character in its order_status_change payment-callback echo
(e.g. " -> ") but signs the notification over a different form, so the
gateway's signature check no longer matches ("vk callback: bad signature")
and the purchase never confirms — while get_item (whose request carries no
title) still passes.
validateProduct now rejects those characters at the admin catalog editor —
the single write path for CreateProduct/UpdateProduct/SetProductActive — so a
title can't reintroduce the break. Reject, not transform: the operator retypes
a clean title (« » guillemets, not straight quotes), so the stored value stays
identical everywhere (storefront, wallet, VK box).
Docs: docs/PAYMENTS.md §7 + agent field notes; Go Doc on validateProduct.
Test: validateProduct HTML-special-char cases. No wire/schema change.
VK moderation follow-ups.
1. Settings (theme, language, board style, reduce-motion, zoom, first-run
coachmark flags) were lost between reloads in VK's desktop iframe: Firefox
partitions/blocks IndexedDB and localStorage in a cross-origin iframe, so the
browser-local store is empty on every reload (a plain tab / PWA keeps them —
first-party storage — and Telegram has its own CloudStorage sync). Mirror the
prefs (plus the locale, which has no other durable client home on VK) and the
coachmark flags to VK Bridge storage (VKWebAppStorageSet/Get), which travels
over postMessage to vk.com and survives; reconcile them on the VK launch
before the first paint. The VK identity re-derives from the signed launch
params each load, so the values reload onto the same account.
2. Inside a proprietary Mini App host (VK or Telegram) the profile now surfaces
only email linking — both the Telegram and VK link/unlink entries are hidden
(signInProvidersVisible), so a competing sign-in is never advertised (a
platform ToS requirement; VK forbids showing a Telegram login, mirrored in
Telegram for VK). A provider linked earlier on the web stays attached and is
managed from the web; web/native builds show both.
Tests: vkprefs codec + signInProvidersVisible unit tests. Docs: ARCHITECTURE,
FUNCTIONAL (+_ru). No schema/wire change.
Design/continuity doc for the from-scratch SwiftUI iPhone+iPad app: Mac
build model, engineering decisions (min iOS 18, apple/ dir, XcodeGen+SPM,
@Observable, Swift 6 strict concurrency, SF Symbols, runtime-vector tiles),
the five determining optimizations, storage/audio/testing/crash choices,
region-aware payment seam with tracked App Store risks, and the full A-L
+ game-screen UX inventory. Delivery staged; several items tracked for
follow-up sessions.