* chore: run releases on master only, not develop
Integrate on develop without versioning; PSR and GitHub Release trigger on master push.
* fix: keep YAML SINGLE_MODE on multi-peer masters for dynamic TGs (#11)
Peer OPTIONS SINGLE=1 was overwriting system-wide SINGLE_MODE, which
forced single-TG in-band deactivation and broke multi-dynamic (SINGLE=0)
and OBP bridge legs. Per-peer SINGLE still applies to downlink.
Also coerce SINGLE_MODE booleans from YAML/OPTIONS (true/True/0/1) and
apply DEFAULT_UA_TIMER / SINGLE_MODE defaults when missing from OPTIONS.
* chore: run releases on master only, not develop
Integrate on develop without versioning; PSR and GitHub Release trigger on master push.
* fix: filter standalone DMRA downlink by TG subscription
Apply peer_should_receive_group_voice to DMRA UDP (same rules as DMRD).
Debug branch for hotspot TA leak on unrelated static TGs.
* version bump
* docs: expand server guide and add report-proxy for legacy dashboards
Document ADN-report-proxy so adn-server 2.x can feed v1 legacy monitors,
and sync EN/ES MkDocs with DATABASE, dynamic TGs, monitoring, and related topics.
* docs: add bridges vs subscriptions, performance guide, and Mermaid diagrams (#6)
Document 2.x routing model with a concrete TG 52090 example, operator-focused
performance gains (indexes, reporting, integrated proxy), and MkDocs Mermaid
support across server and monitor architecture pages.
* fix: echo TG 9990 monitor parity and UA session exclusions (#7)
Exclude 9990–9999 from SINGLE/UA locks, remap inject-only echo TX events,
resolve bridge TX peer_id for monitor display, and fix dynamic TG restore callback.
* chore: bump version to 2.0.0-rc.4
Document 2.x routing model with a concrete TG 52090 example, operator-focused
performance gains (indexes, reporting, integrated proxy), and MkDocs Mermaid
support across server and monitor architecture pages.
Document ADN-report-proxy so adn-server 2.x can feed v1 legacy monitors,
and sync EN/ES MkDocs with DATABASE, dynamic TGs, monitoring, and related topics.
* feat: persist peer dynamic TGs in MariaDB across reconnects
Add DATABASE config, async DynamicTgStore, and restore on RPTC so
SINGLE=0/1 dynamics survive hotspot disconnects and server restarts
without blocking the DMRD voice path.
* fix: ensure peer_dynamic_tgs table on server startup
Apply migration 004 idempotently at boot so the server does not depend
on adn-monitor db_bootstrap when peer_dynamic_tgs is missing.
* fix: import DynamicTgEntry for ruff F821 in subscription_table
* fix: log clear MariaDB startup failures to file and stderr
Validate DATABASE at config load and on connect; map common MySQL
errors to actionable messages so the server does not fail silently.
* fix: TG 4000 clears STATUS and bridge legs after dynamic reset
Clear RX slot state to stop RPTO re-seeding cleared sessions, run
in-band 4000 deactivation on inject-only paths, and mark downlink dirty.
* fix: complete TG 4000 reset for monitor and dynamic TG persistence
Emit INGRESS BRDG_EVENT so SINGLE=0 UA chips clear without stuck TX;
wipe all peer dynamic rows from memory and MariaDB on reset. Never store
TG 4000 as a UA session. Require DATABASE only for full peer-server configs.
When voice arrives on TS2 but the hotspot lists the TG on TS1 (or vice
versa), flip the slot bit on send_peer so duplex radios RX on the
configured timeslot.
Normalize all Python sources to the standard ADN copyright block with
complete GPLv3 notice. Add legacy attribution on routing and dmr_utils
ports; drop SemVer wording from changelog and fix an unused test import.
Narrow send_peers and REPEAT fan-out on inject-only proxies using a
precomputed OPTIONS index, cache connected peer count, and debounce
CONFIG_SND pushes to the monitor.
Match legacy routerHBP so ARS/LRRP replies to private subscribers
use pvt_call when SUB_MAP idle check fails, without marking unit data
ingress as voice-busy on the source hotspot.
Replace internal bridge terminology with routing (RoutingUseCases, AclRouter,
routing_table export). SubscriptionStore remains runtime authority with O(1)
indexes for router and downlink filters. Fix STATIC TG parity on OPTIONS/RPTO,
parrot in-band edge cases, and remove per-packet routing_table export from the
hot path that caused high CPU under multi-hotspot OBP load.
Require subscription_store in BridgeUseCases and route timer, OPTIONS,
static TG, and OBP mutations through store ops with export-only BRIDGES shim.
Fix dashboard YAML static TG fallback and sole-hotspot monitor remap for
dynamic UA when a bridge leg is active.
Move stat_trimmer, bridge_debug, bridge_reset, bridge_table (static TG,
reflectors, UA), and OBP source ensure to mutate SubscriptionStore first
and export to the BRIDGES shim; batch OPTIONS loops export once at the end.
Add InbandTriggers to Subscription with ON/OFF/RESET import/export parity.
apply_in_band_signalling mutates the store directly and exports to the
BRIDGES shim (SINGLE_MODE, TG 4000, reflector # rules unchanged).
Mutate SubscriptionStore in rule_timer_loop and export to the BRIDGES shim
without re-importing stale router state. Voice forward uses resolved ForwardLeg
list instead of scanning dict rows when the store is wired.
Subscription store and router are always active when wired at bootstrap;
drop YAML toggles and flag-off test paths. Sync router into store before
get_bridges() export and after make_static_tg mutations.
Sync subscription store after timer and in-band mutations, add optional
store authority with BRIDGES export shim, wire MeshCodecRegistry into
OBP udp_hbp paths, and extend harness parity tests.