Skip to content

fix(web): unreadable synced rows drop instead of crashing; stale tabs reload onto a new build - #2340

Merged
Makisuo merged 8 commits into
mainfrom
fix/live-query-decode-resilience
Nov 7, 2026
Merged

Makisuo merged 8 commits into
mainfrom
fix/live-query-decode-resilience

Merge remote-tracking branch 'origin/main' into fix/live-query-decode…

d78026a
Select commit
Loading
Failed to load commit list.
Maple Review Bot / Maple / review succeeded Nov 7, 2026 in 3m 16s

Confidence 10/10 · No issues found

🟢 Confidence 10/10 · safe to merge. No defect in the non-throwing row decode or the reload guard; the riskiest part, the once-per-commit reload, is pinned by the new shell tests.
no findings · tests covered · risk medium · 2/2 new units observable

Synced rows this build cannot decode now drop and are reported instead of throwing out of live-query callbacks, and a stale tab probes /version.json on a chunk-load failure or dropped row, reloading a hidden tab with no unsaved work at most once per deployed commit. Safe to merge.

  • liveRowDecoder decodes a whole row to Option, dropping and reporting unreadable rows
  • rowsTo* helpers filter dropped rules, incidents and API keys at every call site
  • Chunk-load and undecodable-row signals probe /version.json in a StaleBuildProbe span
  • A hidden tab with no unsaved work reloads once per deployed commit; blocked storage falls back to the banner

Production impact

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
apps/web/src/shell/version.ts 309 GET /version.json 155/day, 0.1% err
CheckDeployedCommit 154/day, 0.0% err
Telemetry this change adds and removes (1)
  • ➕ span name StaleBuildProbe · apps/web/src/shell/version.ts:118
What was checked
  • Both sides of the commit comparison come from the same COMMIT_SHA (.github/workflows/deploy-prd-instance.yml:34), so isNewer compares like for like
  • An unheard drop is not spent: reported is only written when a listener exists (live-row.ts:40), pinned by alerts.test.ts:308
  • isBlocking reaches the probe through subscription dependencies, so opening a blocking page restarts the stream (subscription.ts:250)
Observability coverage: 2 of 2 changes observable
Change Kind Observable Evidence
Stale-build recovery stream in the web shell (staleBuildRecovery) background stream / browser probe yes StaleBuildProbe span with maple.stale_build.{trigger,detail,newer,reloading} plus a structured Effect.logWarning("Stale-build signal") (version.ts:103-124)
Dropped live row reporting (onUndecodableRow) failure path inside live-query callbacks yes Every drop reaches the shell listener, which logs and probes with maple.stale_build.* (version.ts:146-158, 152)

d78026a · Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.