mirror of
https://github.com/zvx-echo6/meshai.git
synced 2026-08-26 17:31:34 +00:00
Foundation for making all hazard formatting+gating source-agnostic. ZERO behavior change — the formatter/decider registries are empty (get_formatter/ get_decider return None → existing precomposed/Mode-B path preserved), and the shadow comparator is off unless MESHAI_SHADOW_CATEGORIES is set. - notifications/formatters/ (registry+dispatch with family fallback), gating/ (GateResult + deferred-commit contract), both empty registries. - notifications/clock.py determinism seam; route wfigs/quake/nws gating time reads through it (identical values) so goldens can freeze time. - formatters/_budget.py = copy of central/budget.py; central/budget.py is now a re-export shim (import-smoke test guards it). - compose_mesh_message consults the registry first (verbatim, no Mode-B re-cap), falls back to legacy; _resolve_budget injects per-category budget. - notifications/shadow.py + two DRY-RUN hooks (consumer._normalize, dispatcher render): compute the new result and diff-log SHADOW_MISMATCH JSONL, but NEVER commit/emit/write tables and always broadcast the OLD result. Inert by default. - tests/harness (pinned_time/pinned_tz, byte-golden, gate-sequence) + scripts/capture_fixtures.py (ephemeral read-only NATS capture); tzdata pinned. Tests: +60 (18 scaffold + 42 harness/shadow); 0 new failures (34 baseline). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18 lines
268 B
Text
18 lines
268 B
Text
meshtastic>=2.3.0
|
|
meshcore>=2.3.7
|
|
pyyaml>=6.0
|
|
aiosqlite>=0.19.0
|
|
openai>=1.0.0
|
|
anthropic>=0.18.0
|
|
google-genai>=1.0.0
|
|
rich>=13.0.0
|
|
httpx>=0.25.0
|
|
fastembed>=0.3.0
|
|
sqlite-vec>=0.1.0
|
|
numpy
|
|
h3>=4.0
|
|
fastapi>=0.110.0
|
|
uvicorn[standard]>=0.27.0
|
|
aiomqtt>=2.0.0
|
|
sgp4>=2.22
|
|
tzdata
|