This release rolls up everything since v0.3.8: an FDMA multi-block trunking (MBT) broadcast parser, a much wider catalog of TIA-102.AABC-B trunking fields, and two field-reported fixes from the RR forum thread.
FDMA MBT broadcasts. Multi-block trunking PDUs carrying RFSS_STS_BCST (0x3a), NET_STS_BCST (0x3b), and ADJ_STS_BCST (0x3c) are now parsed (bit layouts ported from boatbod op25's decode_mbt_data). This recovers neighbor sites and secondary control channels on VHF/UHF systems that advertise them as MBT — closing the WISCOM De Pere case where 10 advertised neighbors and 2 SCCBs were being dropped on the floor.
Site & neighbor status flags. RFSS_STS_BCST "A" bit (active RFSS network connection; false ⇒ failsoft/site-trunking), ADJ_STS_BCST conventional/failure/stale/network-active flags, and the IDEN_UP_VU receiver bandwidth field (6.25 / 12.5 kHz) now appear in the text report and the RR submission markdown.
More trunking broadcasts decoded. SYS_SRV_BCST (0x38) services-available/supported bitmaps, Location Registration Area (LRA) on the status broadcasts, TIME_DATE_ANN (0x35) signed UTC offset, and P_PARM_BCST (0x3e) — whose presence flags an encrypted control channel (algid surfaced). None of these are decoded by op25; they're net-new, derived from the spec octet maps.
RR Premium expiry parsing fix. getUserData renders the expiry as MM-DD-YYYY, but the startup guard only matched ISO YYYY-MM-DD, so an expired account slipped through and every premium lookup AUTH-faulted — mislabeling documented sites as "NEW SYS (not in RR)". Expired accounts now hit the renew refusal up front.
FDMA vs TDMA classification. A channel is treated as TDMA only with ≥2 slots/carrier; systems advertising an all-FDMA band plan via IDEN_UP_TDMA (0x33) no longer render as "TDMA x1".
--step grid lists. --step accepts a comma-separated list (e.g. 5,6.25,7.5,12.5) so VHF/UHF scans that mix channel spacings catch every control channel. One PSD per chunk; each peak snaps to the nearest grid, so Phase 1 capture cost is unchanged.
All new record fields default to None/empty and round-trip through the survey JSON; older files load unchanged.