Files
ukmesh/docs/performance-budgets.md

4.8 KiB

Frontend performance and resource budgets

Status: approved release guardrail

Baseline date: 2026-07-29

Baseline revision: b9b2ecdbfaa9688a79a62ccee38d6b406f14deaa

These limits turn the Phase 0/6 performance requirements into release gates. They are ceilings, not allocation targets. A change that needs a higher limit requires a measured before/after result and explicit review; the default tolerated regression is 10%.

Browser resources

Resource Limit Enforcement
Decoded terrain tiles 16 entries and 32 MiB TerrainTileCache; closes every evicted bitmap
Service-worker tile cache 6,000 responses and 96 MiB estimated body bytes persisted metadata and amortized pruning
General scoped browser caches 128 MiB combined estimated bytes per-cache TTL/LRU/byte limits; debug snapshots
Map/terrain soak less than 10% retained-heap growth after warm-up over 30 minutes Playwright/DevTools staging soak
Map construction one main map and one owner map per mounted page browser construction-count regression

Requests and jobs

Work Limit
Common same-origin API concurrency 8
Terrain image decode concurrency 4
Feed selected-path concurrency 1
Link-quality sparkline concurrency 2, with a 16-item queue
Repeater detail concurrency 4
HopReach metadata/progress polling 3 seconds while the RF feature is enabled
HopReach compatibility page 500 nodes, 100,000 maximum offset
HopReach bulk evidence request 5,000 keys and 250,000 result rows
Ordinary API deadline 15 seconds

Requests are scope-fenced by network, observer, privacy generation, and owner session where applicable. Hidden pages schedule no polling and perform one refresh when visible again.

Rendering

Work Limit
Topology representative fixture 600 nodes / 1,200 links
Topology React snapshots at most one every 66 ms while visible
Representative topology frame time p95 below 16.7 ms after simulation warm-up
Expandable list details outside fixed-height virtual rows; no overlap at 375, 768, or 1,280 CSS px
Coarse-pointer controls 44 CSS px where layout permits; otherwise WCAG target spacing applies

Production frontend assets

All byte limits below use the output of vite build. “Raw” means minified bytes and “gzip” is computed with Node's default gzip settings.

Asset group Raw limit Gzip limit
Main App-* chunk 900 KiB 260 KiB
maplibre-gl-* chunk 820 KiB 225 KiB
Recharts categorical chunk 400 KiB 110 KiB
All JavaScript 2,900 KiB 850 KiB
All CSS 230 KiB 42 KiB

Run npm run budget after npm run build. CSS has a separate structural gate: no duplicate selector in the same at-rule/cascade context and no dashboard/page selector in styles/globals.css. Responsive declarations in a distinct media query are intentional and are not counted as duplicates.

HopReach RF calculator

The indexed CPU path must match the executable upstream v0.1.32 oracle within 1e-5 dB. Conservative-superset tests cover exhaustive and randomized geography, poles, the antimeridian, borders, dense/empty areas, chunk edges, and maximum-range paths.

Measure Release limit 2026-08-02 local result
UK-4,600 Standard raster-time ratio no more than 0.70 of upstream 0.602
UK-4,600 Precision-tile time ratio no more than 0.70 of upstream 0.594
Standard peak terrain working-set ratio no more than 0.70 of upstream 0.453
Precision peak terrain working-set ratio no more than 0.70 of upstream 0.135
Maximum reference parity error 0.00001 dB within tolerance

The measured times are three-run means with identical dimensions and GOMAXPROCS=4. The working-set gate includes unchanged 100 km range padding around publication tiles and uses the exact float32 Web-Mercator DEM tile accounting from demgrid.Load. scripts/benchmark-hopreach.sh captures allocation output, independent CPU/heap profiles, and a progressive completion trace. Full evidence and raw-value interpretation are in rf-coverage/BENCHMARKS.md and docs/rf-coverage-rollout.md.

Rollout evidence

Before a browser-cache, map, topology, or chart release:

  1. Record the production asset output and npm run budget result.
  2. Run desktop/mobile Playwright plus axe.
  3. Run SOAK_BASE_URL=https://test.ukmesh.com npm run soak:production for the 30-minute terrain/map soak. The harness records post-GC heap, cache/storage snapshots, long tasks, request failures, and MapLibre construction count as signed deployment evidence.
  4. Roll back on privacy drift, cross-scope state, reload loops, cache quota overflow, or a limit above. Retain the prior service-worker namespace for seven days.