meshai/work/tests
Matt Johnson 77748ff104 fix(config): merge partial PUT bodies instead of resetting to defaults
Saving the "Auto-advert interval" dropdown on the MeshCore Companion page
took BOTH radios offline on 2026-07-17 06:46:52. One click, full outage.

The page PUT a single-key body to /api/config/connection:

    {"meshcore_advert_interval_seconds": 10800}

_dict_to_dataclass() builds kwargs only from the keys present in the body
and lets `cls(**kwargs)` default the rest, so every OMITTED field was reset
to its dataclass default and written to disk:

    type:                 tcp   -> serial            (Meshtastic offline)
    tcp_host:             192.168.1.100 -> <lost>    (LOCAL_FIELDS, see below)
    tcp_port:             4404  -> 4403              (wrong meshmonitor vnode)
    meshcore_host:        192.168.1.253 -> ''        (MeshCore off; blank = off)
    meshcore_conn_type:   serial -> tcp              (wrong transport)
    meshcore_serial_port: /dev/meshcore-rak -> ''    (RAK radio lost)

It was silent twice over. `connection` is restart-required, so the running
process kept the good in-memory config while the file sat gutted, waiting
for any restart to detonate. And save_section() writes the domain file
FIRST and local.yaml SECOND: meshtastic.yaml hit the disk already gutted,
then the local.yaml write (which owns connection.tcp_host via LOCAL_FIELDS)
died on `[Errno 13] Permission denied` -- so tcp_host landed in neither
file, and the 500 that would have named the cause was swallowed by the UI.
The operator saw nothing happen.

This was never one page's bug: PUT /api/config/{section} was destructive on
a partial payload for EVERY section. Other callers only survive because they
happen to spread the full object first.

Fixes, in depth:

* Route (the durable fix): merge the body over the CURRENT live section
  before coercing, so omitted keys keep their live values while present
  keys -- including '' / False / [] -- still apply. The base is the live
  config, the same values GET serves, so a partial PUT now lands exactly
  where a full-object PUT from that same GET would. Full-object callers are
  unaffected. Fixed at the HTTP boundary, not in _dict_to_dataclass():
  absent-key-means-default is CORRECT at config-load time, where a file
  legitimately omits fields it does not override.

* Nested semantics keyed off the dataclass schema, not "is it a dict":
  nested dataclass fields DEEP-MERGE (a partial region_routes must not drop
  sibling cells), while bare dict/list fields REPLACE at the key (cells,
  toggles, destinations, rules are dynamic maps -- deep-merging them would
  resurrect deleted keys and make deletion impossible, the mirror image of
  the bug being fixed).

* Page: send the full connection object like every other caller does.

* Errors are visible: the save handler no longer swallows the exception,
  and updateConfig() surfaces the server's `detail` rather than a bare
  "API error: 500", which is what hid Permission denied from the operator.

* Default advert interval 10800 -> 86400 (24h). 3h is far too frequent a
  default for a public mesh; the UI "(default)" label moves to match.

Tests: tests/test_config_partial_save_merge.py reproduces the outage with
the exact payload, and pins merge semantics across connection AND
notifications, intentional clearing, deep-merge, and map-deletion.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 07:20:48 +00:00
..
fixtures feat(ipaws): add FEMA IPAWS-OPEN civil-alert adapter (disabled by default) (#138) 2026-07-16 09:05:01 -06:00
harness refactor(phase0): source-agnostic formatter/gating scaffold + harness (inert) (#28) 2026-07-04 12:55:48 -06:00
conftest.py refactor(phase0): source-agnostic formatter/gating scaffold + harness (inert) (#28) 2026-07-04 12:55:48 -06:00
test_activity_log_api.py fix(dashboard): Activity Log shows the full broadcast log (all categories, both meshes) (#75) 2026-07-06 19:36:30 -06:00
test_adapter_avalanche.py feat(broadcast): fit all mesh message formats to the packet budget (#8) 2026-07-02 16:49:33 -06:00
test_adapter_config_api.py test: fix 13 stale tests in the red suite, leave 6 real-bug failures (#124) (#129) 2026-07-14 10:36:19 -06:00
test_adapter_config_foundation.py feat(ipaws): add FEMA IPAWS-OPEN civil-alert adapter (disabled by default) (#138) 2026-07-16 09:05:01 -06:00
test_adapter_ducting.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_adapter_fires.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_adapter_firms.py fix: make TomTom + FIRMS API keys optional (keyless-capable) (#137) 2026-07-15 14:04:23 -06:00
test_adapter_ipaws.py feat(ipaws): add FEMA IPAWS-OPEN civil-alert adapter (disabled by default) (#138) 2026-07-16 09:05:01 -06:00
test_adapter_nws.py refactor(phase2): migrate nws + incident/roads to formatter+decider (tier-a) (#30) 2026-07-04 18:16:34 -06:00
test_adapter_roads511.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_adapter_swpc.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_adapter_traffic.py fix: make TomTom + FIRMS API keys optional (keyless-capable) (#137) 2026-07-15 14:04:23 -06:00
test_adapter_usgs.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_adapter_usgs_quake.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_adapter_wzdx.py feat(adapters): WZDx daily work-zone summary + FIRMS restart-safe cold-start (#108) 2026-07-09 19:13:17 -06:00
test_avalanche_refactor.py refactor(phase1): quake + swpc(Kp+flare) + avalanche, behind staged-cutover gate (#29) 2026-07-04 15:58:46 -06:00
test_avalanche_v057.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_band_conditions.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_bool_roundtrip.py fire: remove fire digest feature and drop out-of-coverage fires at ingest (#107) 2026-07-09 13:46:12 -06:00
test_budget_shim.py refactor(phase0): source-agnostic formatter/gating scaffold + harness (inert) (#28) 2026-07-04 12:55:48 -06:00
test_capture_script_importable.py refactor(phase0): source-agnostic formatter/gating scaffold + harness (inert) (#28) 2026-07-04 12:55:48 -06:00
test_central_boot_guard.py fix(central): don't crash boot when Central is unreachable at startup (#26) 2026-07-04 01:13:50 -06:00
test_central_consumer.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_central_envelope_to_wire_v057.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_central_normalizer.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_central_region_routing.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_central_sub_adapter_routing.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_channel_rendering.py feat(transport): per-radio serialized+paced outbound send queue (#93) 2026-07-08 09:38:08 -06:00
test_clock_seam.py refactor(phase0): source-agnostic formatter/gating scaffold + harness (inert) (#28) 2026-07-04 12:55:48 -06:00
test_cold_start_grace.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_composite_transport.py feat(transport): per-radio serialized+paced outbound send queue (#93) 2026-07-08 09:38:08 -06:00
test_config_loader.py feat(dashboard): MeshCore transport + per-family routing GUI controls (#10) 2026-07-02 16:49:59 -06:00
test_config_partial_save_merge.py fix(config): merge partial PUT bodies instead of resetting to defaults 2026-07-17 07:20:48 +00:00
test_config_source_field.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_configurable_feed_urls.py fix: make all native feed URLs config-driven (no hardcoded upstreams) (#136) 2026-07-15 11:34:27 -06:00
test_consumer_default_deny.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_context_hot_reload.py feat(context): GUI control for chat-context retention (days) + live apply (#20) 2026-07-03 19:03:37 -06:00
test_coverage.py fix(coverage): round derived coords to 6dp; skip roadless traffic cells (#66) 2026-07-06 11:15:56 -06:00
test_coverage_area.py fix(coverage): NWS carries its alert polygon; gate fails closed for weather (#70) 2026-07-06 12:42:27 -06:00
test_coverage_overrides.py feat(coverage): per-adapter override — exclude adapters from the coverage bbox (#64) 2026-07-06 10:11:33 -06:00
test_coverage_r3.py feat(coverage): widen adapter fetch scope to the enclosing box of coverage areas (#71) 2026-07-06 12:51:54 -06:00
test_coverage_wiring.py feat(coverage): wire quake/roads511/wzdx/avalanche to the coverage bbox (#60) 2026-07-06 08:36:25 -06:00
test_coverage_wiring_2b.py feat(coverage): wire fires/firms/ducting to the coverage bbox (#61) 2026-07-06 08:42:43 -06:00
test_coverage_wiring_2c.py fix(coverage): NWS carries its alert polygon; gate fails closed for weather (#70) 2026-07-06 12:42:27 -06:00
test_coverage_wiring_2d.py feat(coverage): wire hydro + satpass to the coverage bbox (native adapters complete) (#63) 2026-07-06 10:07:23 -06:00
test_curation.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_cutover_gate.py refactor(phase1): quake + swpc(Kp+flare) + avalanche, behind staged-cutover gate (#29) 2026-07-04 15:58:46 -06:00
test_danger_zone_correlator.py feat(transport): per-radio serialized+paced outbound send queue (#93) 2026-07-08 09:38:08 -06:00
test_dashboard_config_save.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_destinations_c1.py feat(notifications): reusable delivery destinations (additive, inline fallback) (#83) 2026-07-07 01:51:41 -06:00
test_dispatcher_persistence.py fix(activity-log): stamp source_event_table for native adapter broadcasts + UI label fallback + backfill recent orphans (#99) 2026-07-08 16:41:12 -06:00
test_dynamic_family_registry.py feat(notifications): dynamic category/family registry (generic sources routable) (#80) 2026-07-07 01:16:56 -06:00
test_env_hot_reload.py feat: hot-reload the environmental config section (no restart) (#135) 2026-07-15 01:21:12 -06:00
test_env_reporter.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_env_reporter_fire_recency.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_env_reporter_llm_gaps.py feat(persistence): make satpass/avalanche/ducting LLM-queryable (#74) 2026-07-06 16:24:26 -06:00
test_fire_age_gate.py feat(danger-zones): configurable infra-node hazard correlation + fire age-gate 2026-06-21 06:33:54 +00:00
test_fire_native_growth.py fire: remove fire digest feature and drop out-of-coverage fires at ingest (#107) 2026-07-09 13:46:12 -06:00
test_fire_point_fusion.py feat(fires): fuse WFIGS incident-point layer with perimeter layer so non-perimeter fires surface (dedup by IrwinID, cold-start silent-seed) (#98) 2026-07-08 15:58:48 -06:00
test_fire_refactor.py refactor(phase3c): migrate FIRMS fusion broadcasts to formatter+decider (#34) 2026-07-04 23:18:51 -06:00
test_fire_reminder_pacing.py fix(reminders): pace the reminder roll-call so N fires don't burst (#130) 2026-07-14 10:38:07 -06:00
test_fire_reminder_region_routing.py feat(reminders): route fire reminders through per-region fire routing (#106) 2026-07-09 12:06:45 -06:00
test_fire_tracker_phase1.py fix(firms): repair the FIRMS fire-fusion Event contract (issues #117-#119) (#120) 2026-07-11 17:41:40 -06:00
test_fire_tracker_phase2.py fix(firms): repair the FIRMS fire-fusion Event contract (issues #117-#119) (#120) 2026-07-11 17:41:40 -06:00
test_fire_tracker_phase3.py fix(firms): repair the FIRMS fire-fusion Event contract (issues #117-#119) (#120) 2026-07-11 17:41:40 -06:00
test_fire_tracker_phase4.py test: fix 13 stale tests in the red suite, leave 6 real-bug failures (#124) (#129) 2026-07-14 10:36:19 -06:00
test_fire_v057.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_firms_cluster_f3.py fix(firms): repair the FIRMS fire-fusion Event contract (issues #117-#119) (#120) 2026-07-11 17:41:40 -06:00
test_firms_fusion_event_contract.py fix(firms): repair the FIRMS fire-fusion Event contract (issues #117-#119) (#120) 2026-07-11 17:41:40 -06:00
test_firms_handler.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_firms_native_fusion.py fix(firms): repair the FIRMS fire-fusion Event contract (issues #117-#119) (#120) 2026-07-11 17:41:40 -06:00
test_firms_refactor.py fix(gating): firms decide() spotting/halt severity key, issue #121 (#126) 2026-07-14 10:37:53 -06:00
test_fix_meshcore_save_and_llm_test.py fix(meshcore): deliver DM replies (flood/ACK), save meshcore_context, test-llm, inbound logging (#21) 2026-07-03 19:54:16 -06:00
test_formatter_scaffold.py refactor(phase3b): migrate WFIGS fire to formatter+decider (tier-a) (#33) 2026-07-04 22:51:26 -06:00
test_formatters_no_clock.py refactor(phase0): source-agnostic formatter/gating scaffold + harness (inert) (#28) 2026-07-04 12:55:48 -06:00
test_generic_http.py fix(generic): browser UA default + per-source custom headers + 403 retry (#85) 2026-07-07 02:24:27 -06:00
test_harness_selftest.py refactor(phase0): source-agnostic formatter/gating scaffold + harness (inert) (#28) 2026-07-04 12:55:48 -06:00
test_hydro_refactor.py refactor(phase3a): migrate hydro/nwis to formatter+decider (tier-a) (#32) 2026-07-04 22:22:33 -06:00
test_import_smoke.py refactor(phase0): source-agnostic formatter/gating scaffold + harness (inert) (#28) 2026-07-04 12:55:48 -06:00
test_incident_handler.py feat(broadcast): fit all mesh message formats to the packet budget (#8) 2026-07-02 16:49:33 -06:00
test_incident_refactor.py refactor(phase2): migrate nws + incident/roads to formatter+decider (tier-a) (#30) 2026-07-04 18:16:34 -06:00
test_incident_workzone_suppression.py feat(adapters): WZDx daily work-zone summary + FIRMS restart-safe cold-start (#108) 2026-07-09 19:13:17 -06:00
test_include_roundtrip.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_itd_511_work_zone.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_llm_reply_cap.py feat(reply): cap interactive LLM replies to 3 mesh packets (#7) 2026-07-02 16:49:10 -06:00
test_llm_scoping.py feat(meshcore): decouple per-mesh LLM DM gate + mesh-scoped chat context (#19) 2026-07-03 18:39:26 -06:00
test_mesh_send_api.py fix(config): merge partial PUT bodies instead of resetting to defaults 2026-07-17 07:20:48 +00:00
test_meshcore_conn_type.py feat(meshcore): opt-in telemetry auto-poll on selected contacts (#92) 2026-07-08 00:54:59 -06:00
test_meshcore_context_config.py Phase A — 4-section nav; move Scheduled Broadcasts + Danger Zones off Routing (#15) 2026-07-03 14:57:24 -06:00
test_meshcore_context_filter.py feat(meshcore): decouple per-mesh LLM DM gate + mesh-scoped chat context (#19) 2026-07-03 18:39:26 -06:00
test_meshcore_dm_delivery.py feat(meshcore): opt-in telemetry auto-poll on selected contacts (#92) 2026-07-08 00:54:59 -06:00
test_meshcore_rooms.py feat(meshcore): route MeshCore cells to room servers (open rooms) (#110) 2026-07-09 22:14:42 -06:00
test_meshcore_roster.py feat(meshcore): report the true connection + add roster/channel management (#153) 2026-07-16 22:24:49 -06:00
test_meshcore_telemetry.py feat(transport): per-radio serialized+paced outbound send queue (#93) 2026-07-08 09:38:08 -06:00
test_meshcore_transport.py fix(meshcore): ACK-confirmed DM fast path (~2s), discover only on no-ACK (#77) 2026-07-06 21:41:47 -06:00
test_native_fire_pacer.py fix(fires): wire FirePacer into the native fire broadcast path (#123) 2026-07-11 21:46:13 -06:00
test_native_severity_promotion_and_floor.py fix(region-routing): independent mt/mc region-routing enable switches (#102) 2026-07-08 23:58:09 -06:00
test_no_duplicate_methods.py fix(meshcore): un-shadow _resolve_contact; restore PR #56 refetch-on-miss (#127) (#133) 2026-07-14 10:37:26 -06:00
test_notification_toggles.py feat(transport): per-radio serialized+paced outbound send queue (#93) 2026-07-08 09:38:08 -06:00
test_nwis_handler.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_nws_dedup_relaxation.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_nws_handler.py fix(nws): tighten hazard wording across all product types; kill dangling '— …' in L4 (#16) 2026-07-03 15:22:07 -06:00
test_nws_refactor.py refactor(phase2): migrate nws + incident/roads to formatter+decider (tier-a) (#30) 2026-07-04 18:16:34 -06:00
test_nws_zones.py feat(nws): resolve zone-only alerts to geometry via affectedZones (cached) so in-coverage zone alerts are placed + region-tagged instead of dropped (#91) 2026-07-07 22:23:19 -06:00
test_observer_locations.py feat(generic): config-driven REST/GeoJSON source adapter (ported from Central) (#78) 2026-07-07 00:20:02 -06:00
test_or_arch_continuous.py feat: hot-reload the environmental config section (no restart) (#135) 2026-07-15 01:21:12 -06:00
test_persistence.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_pipeline_digest.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_pipeline_grouper.py fix(pipeline): let wildfire_spotting skip the grouper (category-scoped) (#131) 2026-07-14 10:37:07 -06:00
test_pipeline_inhibitor_grouper.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_pipeline_persistence.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_pipeline_scheduler.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_pipeline_skeleton.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_pipeline_toggle_filter.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_quake_handler.py feat(broadcast): fit all mesh message formats to the packet budget (#8) 2026-07-02 16:49:33 -06:00
test_quake_refactor.py refactor(phase1): quake + swpc(Kp+flare) + avalanche, behind staged-cutover gate (#29) 2026-07-04 15:58:46 -06:00
test_region_routing_dispatcher.py fix(dispatcher): qualify region-cooldown key by channel type (#115) 2026-07-11 09:22:54 -06:00
test_reminders.py feat(reminders): route fire reminders through per-region fire routing (#106) 2026-07-09 12:06:45 -06:00
test_renderers.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_rf_v057.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_router_env_scope.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_satpass_broadcast_safety.py fix(satpass): clean broadcast format (short names, degrees, compass, friendly observers) (#76) 2026-07-06 20:44:02 -06:00
test_satpass_command.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_satpass_compass_fallback.py fix(satpass): clean broadcast format (short names, degrees, compass, friendly observers) (#76) 2026-07-06 20:44:02 -06:00
test_satpass_event_path.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_satpass_handler.py fix(satpass): clean broadcast format (short names, degrees, compass, friendly observers) (#76) 2026-07-06 20:44:02 -06:00
test_satpass_native.py fix(satpass): clean broadcast format (short names, degrees, compass, friendly observers) (#76) 2026-07-06 20:44:02 -06:00
test_satpass_persisted_timer.py feat(generic): config-driven REST/GeoJSON source adapter (ported from Central) (#78) 2026-07-07 00:20:02 -06:00
test_satpass_region_tagging.py feat(region-routing): tag satpass events by observer coordinates so they region-route; add satpass to VALID_TOGGLES (#90) 2026-07-07 21:43:49 -06:00
test_satpass_registration.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_satpass_wire_fields.py fix(satpass): clean broadcast format (short names, degrees, compass, friendly observers) (#76) 2026-07-06 20:44:02 -06:00
test_save_section_secret_preserve.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_secrets_store.py feat(secrets): GUI-managed .env secrets store — keys are config, but gitignored (#47) 2026-07-05 17:57:45 -06:00
test_seismic_v057.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_send_queue.py feat(send-queue): jittered pacing (default 2.2-2.6s) per radio instead of fixed 2.0s (#95) 2026-07-08 11:12:28 -06:00
test_serial_ports.py fix(serial): detect passed-through /dev USB-serial nodes (container GUI detect) (#53) 2026-07-05 23:01:08 -06:00
test_shadow_inert.py refactor(phase3b): migrate WFIGS fire to formatter+decider (tier-a) (#33) 2026-07-04 22:51:26 -06:00
test_store_received_delta.py fix(wzdx): persist current work zones to traffic_events via dedicated ingest (#109) 2026-07-09 20:08:13 -06:00
test_store_wzdx_persist.py fix(wzdx): persist current work zones to traffic_events via dedicated ingest (#109) 2026-07-09 20:08:13 -06:00
test_swpc_handler.py refactor(phase1): quake + swpc(Kp+flare) + avalanche, behind staged-cutover gate (#29) 2026-07-04 15:58:46 -06:00
test_swpc_refactor.py refactor(phase1): quake + swpc(Kp+flare) + avalanche, behind staged-cutover gate (#29) 2026-07-04 15:58:46 -06:00
test_tail_followups.py test: fix 13 stale tests in the red suite, leave 6 real-bug failures (#124) (#129) 2026-07-14 10:36:19 -06:00
test_tle_fetch.py feat(phase4c): native SGP4 satpass — standalone satellite passes, no Central (#39) 2026-07-05 02:25:55 -06:00
test_tombstone_broadcast.py test: fix 13 stale tests in the red suite, leave 6 real-bug failures (#124) (#129) 2026-07-14 10:36:19 -06:00
test_tracking_v057.py test: fix 13 stale tests in the red suite, leave 6 real-bug failures (#124) (#129) 2026-07-14 10:36:19 -06:00
test_traffic_v057.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_transport_abstraction.py refactor(transport): derive active transports from config, drop transport setting (#13) 2026-07-03 00:18:53 -06:00
test_uniform_sizing.py refactor(transport): derive active transports from config, drop transport setting (#13) 2026-07-03 00:18:53 -06:00
test_v052_dispatcher.py test: fix 13 stale tests in the red suite, leave 6 real-bug failures (#124) (#129) 2026-07-14 10:36:19 -06:00
test_v064_guard_commit.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_water_v057.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_weather_v057.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_wfigs_handler.py fire: remove fire digest feature and drop out-of-coverage fires at ingest (#107) 2026-07-09 13:46:12 -06:00
test_work_zone_renderer.py refactor: move source tree into work/, multi-stage Docker build, fix satpass 2026-06-16 03:40:31 +00:00
test_wzdx_coalescing.py feat(adapters): WZDx daily work-zone summary + FIRMS restart-safe cold-start (#108) 2026-07-09 19:13:17 -06:00
test_wzdx_summary_region_routing.py feat(adapters): WZDx daily work-zone summary + FIRMS restart-safe cold-start (#108) 2026-07-09 19:13:17 -06:00