meshai/work/meshai
malice 351f13ca64
fix(satpass): persist consolidation schedule — survive reboot (4b) (#38)
Satpass consolidations were scheduled with in-memory asyncio timers
(_pending_satpass_timers) lost on restart, orphaning satpass_pending rows
that never consolidated/broadcast. Persist a durable due_at and rebuild
timers on startup.

- v22.sql: satpass_pending.due_at INTEGER; SCHEMA_VERSION 21->22
- due_at = received_at + CONSOLIDATION_DELAY(5); the live +N*60 stagger is
  in-memory only (meaningless across restart) so not persisted — live
  call_later path unchanged, due_at is a pure reboot backstop
- consumer._sweep_pending_satpass() at start(): past-due rows fire (orphans
  recovered), future rows re-armed for the remaining wait; skips cids the
  live drain path already owns (no double-schedule); per-row try/except
- reuses _satpass_consolidation_fire so emit logic is identical

Non-reboot behavior byte-identical. 6 new tests; suite at 10-failure baseline.

Co-authored-by: Matt Johnson <mj@k7zvx.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 01:52:00 -06:00
..
adapter_config feat(broadcast): fit all mesh message formats to the packet budget (#8) 2026-07-02 16:49:33 -06:00
backends refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
central fix(satpass): persist consolidation schedule — survive reboot (4b) (#38) 2026-07-05 01:52:00 -06:00
cli refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
commands feat(phase4a): peak_compass end-to-end + repair stale satpass test suite (#35) 2026-07-05 01:06:29 -06:00
dashboard fix(meshcore): deliver DM replies (flood/ACK), save meshcore_context, test-llm, inbound logging (#21) 2026-07-03 19:54:16 -06:00
data refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
env feat(wzdx): native FHWA WZDx work-zone adapter (standalone work_zone source) (#37) 2026-07-05 01:36:52 -06:00
notifications refactor(phase3c): migrate FIRMS fusion broadcasts to formatter+decider (#34) 2026-07-04 23:18:51 -06:00
persistence fix(satpass): persist consolidation schedule — survive reboot (4b) (#38) 2026-07-05 01:52:00 -06:00
scripts refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
sources refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
transport fix(meshcore): reply to DMs via discovered DIRECT route, not flood (#23) 2026-07-03 22:25:40 -06:00
__init__.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
__main__.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
alert_engine.py Phase A — 4-section nav; move Scheduled Broadcasts + Danger Zones off Routing (#15) 2026-07-03 14:57:24 -06:00
central_normalizer.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
chunker.py feat(reply): cap interactive LLM replies to 3 mesh packets (#7) 2026-07-02 16:49:10 -06:00
config.py feat(wzdx): native FHWA WZDx work-zone adapter (standalone work_zone source) (#37) 2026-07-05 01:36:52 -06:00
config_loader.py fix(meshcore): deliver DM replies (flood/ACK), save meshcore_context, test-llm, inbound logging (#21) 2026-07-03 19:54:16 -06:00
connector.py feat(dashboard): MeshCore transport + per-family routing GUI controls (#10) 2026-07-02 16:49:59 -06:00
context.py feat(context): GUI control for chat-context retention (days) + live apply (#20) 2026-07-03 19:03:37 -06:00
geo.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
history.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
knowledge.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
main.py fix(central): don't crash boot when Central is unreachable at startup (#26) 2026-07-04 01:13:50 -06:00
memory.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
mesh_data_store.py refactor(danger-zones): drop min_severity + position_max_age; table snow (grayed/inert) 2026-06-21 06:56:22 +00:00
mesh_health.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
mesh_models.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
mesh_reporter.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
mesh_sources.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
meshmonitor.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
responder.py feat(transport): CompositeTransport for dual Meshtastic+MeshCore (Phase 4) (#6) 2026-07-02 12:33:17 -06:00
router.py feat(meshcore): decouple per-mesh LLM DM gate + mesh-scoped chat context (#19) 2026-07-03 18:39:26 -06:00