* Fix map node freshness consistency
* Harden output, ingest, caches, and WebSocket limits
* Enforce public visibility across derived data
* Harden proxy and operator deployment boundary
* Make owner grants authoritative and reconcile ACLs safely
* Bound path, spam, and statistics analysis
* Make link and coverage jobs crash-safe
* Implement strategic security remediation
* Fix production cutover configuration
* Fix disabled viewshed worker health signal
* Serve stale stats during background refresh
* Retain stale stats through refresh windows
* Bound analytics work to protect ingestion
* Prioritize summary warmup over chart scans
* Throttle path history rebuilds
* Bound path history result memory
* Stream path history aggregation
* Give bounded path rebuild one CPU
* Serve stale charts during bounded refresh
* Prioritize startup stats before chart scans
* Bound path history segment cardinality
* Pin path rebuild context to privacy generation
* Self-host original frontend fonts
* Allow bounded path rebuild to complete
* Improve live map UI and low-latency group feed
- Dock node details on the right with selection highlight and collapsible layers
- Add node legend, 24h activity sparkline, copy-link, and layout/overlap fixes
- Keep all repeaters visible during Live Path focus
- Send GroupText feed packets immediately over WebSocket (no batch delay)
- Cache expensive stats/observer activity more aggressively to protect ingest
- Remove stale local planning/audit markdown from the tree
* fix(ci): supply OPERATOR_SITE_TOKEN for compose validation
Workers/Compose CI failed because docker-compose requires
OPERATOR_SITE_TOKEN. Add CI placeholders for that and MQTT_PASSWORD.
Consolidates the stacked backend, privacy, network-intelligence, frontend, operations, mobile, and owner-cache changes after resolving main conflicts and passing the full CI suite.
RADIO_BOT_URL is a private integration — strip the default service name
from docker-compose and remove it from the README env table.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Paths (Beta): new map layer with confidence-scored packet path resolution.
Per-hop candidates filtered by 2-char node ID prefix, ranked by proximity
to the interpolated src-to-rx line. Each hop scored by ambiguity factor
(1/n_candidates) and distance factor (reachable within elevation-derived
range). Threshold slider in the filter panel (default 50%). Purple dashed
polyline, separate from the existing packet paths layer.
- Node elevation: viewshed worker now writes terrain elevation (m ASL) to
nodes.elevation_m when computing each viewshed, and backfills existing
nodes from stored radius_m on startup. Elevation shown in node popup.
- Coverage preview: "Preview coverage" button in node popup shows that
node's viewshed at lower opacity (10%) for 20 seconds then auto-dismisses.
- Beta path range uses stored radius_m from node_coverage directly instead
of bounding box estimation.
- Fix homepage Live Map button to link directly to app.teessidemesh.com.
- README Phase 3: clarify nodes must be on MQTT to be claimable.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>