Commit Graph
209 Commits
Author SHA1 Message Date
gadgethd 4e75b1f8a9 docs(topology): record spring-clean item 11 2026-08-06 14:01:44 +00:00
gadgethd 7b6e860b57 fix(topology): keep map instance stable after load 2026-08-06 13:57:38 +00:00
gadgethd be0a68995a feat(topology): render live repeater links on UK map 2026-08-06 13:37:09 +00:00
gadgethd b2824b8833 docs: expand + fact-check spring-clean systems (decryption, node identity, pathing, operations) 2026-08-06 13:22:40 +00:00
gadgethd f5b1e2acbd docs(spring-clean): clarify health route audit 2026-08-06 13:06:09 +00:00
gadgethd ed70b55dfc docs(spring-clean): record local commit 2026-08-06 13:04:53 +00:00
gadgethd 1c3841cc52 chore(website): spring-clean public pages 2026-08-06 13:04:39 +00:00
gadgethd 2d0ee0fa36 docs(map): record spring-clean deployment verification 2026-08-06 12:45:51 +00:00
gadgethd 52820d004b fix(map): keep live feed viewport visible 2026-08-06 12:44:54 +00:00
gadgethd 45698318e5 feat(map): spring-clean live feed and repeater rendering 2026-08-06 11:47:46 +00:00
gadgethd 22dac9a839 chore(owner): remove proof-only dashboard artifact 2026-08-06 11:28:49 +00:00
gadgethd 1e5bc3b299 feat(owner): clean up spring dashboard 2026-08-06 11:25:07 +00:00
gadgethd cddc5efdff docs(feed): record history rollout 2026-08-06 05:24:27 +00:00
gadgethd f5a2a2b93a feat(feed): load historical channel messages 2026-08-06 05:13:22 +00:00
gadgethd 977ce17223 perf: materialized CTE wrapper for canonical identity views
The planner inlined the view CTEs into consumers and re-ran the links
aggregation once per candidate row (loops=13070, 24s+ for getViableLinks).
Wrapping each view body in WITH v AS MATERIALIZED forces one evaluation
per query: viable-links query 24.3s -> 3.1s, WS initial state <1s.
Also drops the dead terrain_profile_json column from node_identity_links
(no readers; frontend terrain comes from DEM tiles).
2026-08-06 04:24:45 +00:00
gadgethd df7cfbe0ed Fix canonical repeater identity projection 2026-08-06 03:53:29 +00:00
gadgethd 90d0dce603 fix: make MQTT packet ingest resilient 2026-08-06 02:13:38 +00:00
gadgethd c6a8813fc3 feat: packet_decryptions side table + feed join for historical decryption
- migration 035: append-only decryptions table (avoids TimescaleDB hypertable
  UPDATE scans which seq-scan every chunk)
- backfillDecrypt: two-phase (materialised candidates + keyset batches),
  DISTINCT ON packet_hash with upper(raw_hex) to handle case-variant copies,
  resumable/idempotent
- feed queries COALESCE(payload _summary, decryptions summary)
- 90-day type-5 coverage: 3.23M/7.0M packets decrypted (46%)
2026-08-06 01:29:32 +00:00
gadgethd 61fdcd9d11 feat: first-class MeshCore channel decryption
- channelRegistry: 39 validated channel secrets committed as the service
  default (Public + 38 community/hashtag channels recovered via the
  derivation audit); MESHCORE_CHANNEL_SECRETS env appends on top
- shared buildSummary/identifyChannel (single implementation for ingest
  and offline tools)
- tools/backfillDecrypt: keyset-paginated retroactive decryption of the
  stored raw_hex corpus (idempotent, resumable)
- feed: channel scope sidebar now lists every decrypted channel
2026-08-06 01:00:05 +00:00
gadgethd f6f8290c70 Color live paths by packet identity and extend TTL 2026-08-04 11:38:49 +01:00
gadgethd c853dd6bde fix(api): declare slow-mode path contracts 2026-08-04 11:21:45 +01:00
gadgethd ae93d2ace4 merge: deploy pathing slow mode and held refinement 2026-08-04 11:12:32 +01:00
gadgethd 5dd15d94c1 feat(pathing): add physics gates and held-path refinement 2026-08-04 11:04:04 +01:00
gadgethd 469c84ed13 feat(pathing): slow-mode packet resolution — wait out propagation window
Backend: schedule ONE final multi-observer resolution per path-bearing
packet after the propagation window closes (default 60s, calibrated on
real first->last observer spread p50 11s / p95 34s / p99 50s; median 17
observers per packet). The final runs with the COMPLETE observer set and
pushes into the resolve cache after invalidation, so the next API read
serves the full-propagation answer. mode=slow on /path-beta/resolve-multi
returns 202 {status:pending, remainingMs} while inside the window; new
/path-beta/slow-mode status endpoint; observability table
path_slow_resolutions (migration 034). Env knobs:
PATH_SLOW_MODE_ENABLED / PATH_SLOW_MODE_WINDOW_MS / PATH_SLOW_MODE_MIN_HOPS
/ PATH_SLOW_MODE_PENDING_MAX. Best-effort: restart loss is harmless.

Frontend: pinned packets resolve in slow mode (bounded 202 retry), local
path renders meanwhile, upgraded when the final lands. Live feed unchanged.

Tests: 4 new slowMode unit tests (dedupe, disable, bound, window timing).
Backend build clean, 257/258 (1 pre-existing workerPool timing flake on
base too); frontend build clean, 74/74.
2026-08-04 10:41:09 +01:00
gadgethd 7bcabcc426 fix(map): keep live path arcs above terrain 2026-08-04 03:07:37 +01:00
gadgethd 262a8a2515 fix(map): bind live paths to resolved packets 2026-08-04 02:12:16 +01:00
gadgethd d7e5b0ff92 fix(map): stream hop animation along stable arcs 2026-08-04 01:50:14 +01:00
gadgethd bcaa35fd27 fix(map): remove inferred nodes and restore historic hops 2026-08-03 22:47:50 +01:00
gadgethd 209989832e fix(map): reduce live-path line TTL to 5s 2026-08-03 22:07:33 +01:00
gadgethd a76ab1e16b fix(map): terrain-aware live paths + airborne hop marker 2026-08-03 22:00:38 +01:00
gadgethd f103029af7 fix(map): never shift the map on node selection 2026-08-03 21:39:43 +01:00
gadgethd 884e2cfa40 test(map): update TTL assertion to 15s 2026-08-03 21:13:03 +01:00
gadgethd 143bc97100 fix(map): reduce live-path line TTL to 15s 2026-08-03 21:10:06 +01:00
gadgethd 5ba192856e fix(map): retain branched live paths 2026-08-03 20:42:50 +01:00
gadgethd 2d740ec07c fix(map): one-click node info — remove center-snap, enlarge click hitbox 2026-08-03 20:14:22 +01:00
gadgethd bca8219044 chore: ignore local tokensave index 2026-08-03 15:13:18 +01:00
gadgethd 457eb77cbb fix(pathing): expose canonical path metadata in public DTOs 2026-08-03 15:13:11 +01:00
gadgethd b2c46f7103 pathing: restore champion evidence in lazy decoder 2026-08-03 15:13:04 +01:00
gadgethd 1464e94075 feat(frontend): render canonical blue paths 2026-08-03 15:12:56 +01:00
gadgethd 5766db10c3 Extend pathing accuracy baseline across resolvers 2026-08-03 15:12:46 +01:00
gadgethd 76bd31371f refactor(pathing): port beta jobs to shared decoder 2026-08-03 15:12:41 +01:00
gadgethd bc1cf1b071 refactor(pathing): extract shared Viterbi decoder 2026-08-03 15:12:35 +01:00
gadgethd c430ab5693 fix: quote node-tiles nginx regex (unquoted {24} broke config parse) 2026-08-03 15:12:18 +01:00
gadgethd 9b5d378f1a feat: add on-demand repeater RF coverage 2026-08-03 15:12:10 +01:00
gadgethd 7ccff988d4 fix: retain concurrent live paths through TTL 2026-08-03 15:12:05 +01:00
gadgethd 693b990001 fix: animate live map paths as aerial arcs 2026-08-03 15:12:05 +01:00
gadgethd 133a2eefca fix: reconnect worker DB on InterfaceError; rate-limit error logging 2026-08-03 15:12:05 +01:00
gadgethd 325f30cbc0 feat: animate live paths as 3D arcs 2026-08-03 15:12:05 +01:00
gadgethd 3c631e8704 Merge pull request #37 from gadgethd/agent/enable-rf-3d-terrain
Enable RF coverage with 3D terrain
2026-08-02 20:52:28 +01:00
gadgethd 49efd69b1e enable RF coverage with 3D terrain 2026-08-02 20:39:15 +01:00