Release: promote development → master (old Android WebView support + unsupported-engine telemetry) #178
Reference in New Issue
Block a user
Delete Branch "development"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Release: promote
development→masterTwo features, both already merged to
development, CI-green and verified on the test contour:#176 — Old Android in-app WebView support. The Telegram/VK in-app WebView showed a white screen on an old frozen Chromium (≈66). Fixed:
build.targetes2022→es2019 (esbuild down-levels the syntax); a conditional core-js loader (only old engines downloadpolyfills.js, modern payload/size-budget untouched); a boardcqw→vminglyph fallback (Chrome <105). Below the hard floor (Chrome 67 — BigInt/Proxy are unpolyfillable) a permanent ES5 boot guard shows a friendly "your device's OS/browser can't run the app" screen (with the web-version link inside a Mini App) + a Diagnostic view — instead of a white screen.#177 — Unsupported-engine telemetry. The boot guard beacons
POST /telemetry/unsupported(deduped in localStorage), the gateway folds it intounsupported_engine_total{reason, chromium}(cardinality-bounded, UA logged not labelled), surfaced on the Scrabble — Users Grafana dashboard beside app opens.Diff: 14 files, +575/-5 (
git diff origin/master..origin/development). No unrelated changes.After merge (separate, owner-driven)
A PR into
masteris test-only — this does NOT deploy to production. The prod rollout is the manualprod-deploy.yaml(confirm=deploy). Per the runbook: tagvX.Y.Zonmaster(last release was v1.8.0 — this is a feature release), then trigger the prod deploy. I'd run /deploy-check first (the telemetry adds a gateway endpoint + a Caddy route — deploy-touching).The index.html boot guard now fires a fire-and-forget beacon (POST /telemetry/unsupported) when it turns a client away on the unsupported-engine screen, so the owner can see — on the Users dashboard beside "app opens" — how many real clients hit it and on which engines. - Client: navigator.sendBeacon (fetch fallback) with a localStorage dedup keyed by app version + reason + Chromium, so a user reopening the app is one report, not ten. - Gateway: a new unauthenticated POST /telemetry/unsupported handler (the client never booted, so it carries no session), per-IP public-limited and body-capped, mirroring the export-download route. It folds the beacon into the OTel counter unsupported_engine_total {reason = no_bigint/no_proxy/boot_error/other, chromium}, with reason allow-listed and the Chromium major reduced to a bounded range (normalizeUnsupported) so a spoofed beacon cannot inflate the metric cardinality; the full user agent is logged, not labelled. - Caddy: /telemetry/* added to the @gateway matcher (else it falls to the landing catch-all). - Grafana: two panels on the Scrabble — Users dashboard (by reason, by Chromium major). - Docs: ARCHITECTURE.md §11. Tests: recordUnsupportedEngine (metric split), normalizeUnsupported (cardinality bounding), and the handler route end to end (204 / 405 / counter). go build+vet+test and gofmt clean; ui check/build/e2e green; the client beacon + dedup verified against a forced hard-gate (BigInt removed) — one POST, deduped on reopen, correct reason/chromium/version labels.