fix(bandplan): correct ARRL US plan license-class accuracy (10m Tech + 80/40/15m Tech CW + 80m CW edge + 60m channels)#3518
Conversation
…/15m Tech CW, 80m General CW edge, 60m channels) Fixes aethersdr#3506. Verified against 47 CFR 97.301/97.303 and the ARRL band plan. - 10m: Technician privileges end at 28.500 — split PHONE at 28.500 and remove T above it; add T to 28.000-28.500 segments including the 28.225-28.300 beacon segment - 80/40/15m: add Technician to CW/data segments within 3.525-3.600, 7.025-7.125, 21.025-21.200 (Tech CW privileges, 200 W) - 80m: General CW starts at 3.525, not 3.510 — 3.510-3.525 is Extra-only - 60m: remove nonexistent 5351.5 kHz channel; US channels are the five dial frequencies 5330.5/5346.5/5357.0/5371.5/5403.5 kHz Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Codex <noreply@openai.com>
There was a problem hiding this comment.
Reviewed the diff against 47 CFR §97.301/§97.303 and how the file is consumed (BandPlanManager::loadPlanFromJson and the #2649 license-class filter in the ATU pre-tune dialog). The data checks out — nice, careful pass. Verified specifically:
- 10m: T on everything 28.000–28.500 (including the 28.225–28.300 beacon segment #3507 missed) and removed above 28.500 — matches §97.301(e). The 28.300/28.500 PHONE split is contiguous with no gap/overlap.
- 80/40/15m Tech CW: 3.525–3.600, 7.025–7.125, 21.025–21.200 all match §97.301(e).
- 80m General edge: 3.510–3.525 Extra-only split is correct (General CW starts at 3.525 since the 2006 omnibus).
- 60m: the removed 5351.5 dial was indeed never a §97.303(h) channel; the five remaining segments match the US dial frequencies (center − 1.5 kHz).
- Parser-wise the format is fine:
licenseis a comma-split string match, segments only needlow < highand a valid color, and"version"isn't read by anything, so no bump needed.
Two non-blocking notes:
-
Stale duplicate band plan in
src/models/BandPlan.h— the compiled-inkBandPlan[]/kBandSpots[]tables still carry the old, now-known-wrong data (including a// Tech privileges start at 28.300comment). They're dead code (nothing includes the header;BandPlanManager.hnotes it was replaced in #425), so this PR doesn't need to touch it, but it's now two corrections out of date. Worth a small follow-up to delete the header so it can't be reintroduced as a "reference." -
T on DATA-labeled segments (3.570–3.600, 7.040–7.125, 21.070–21.150) — this is the right call for the file's semantics: the license field drives the ATU pre-tune class filter (#2649), where it means "this class may transmit in this range," and CW is authorized anywhere a class holds privileges. Just flagging the inherent display caveat: a Technician reading the panadapter could infer data-mode privileges on those segments, which §97.301(e) doesn't grant (CW only there). The format can't express per-mode class limits, so nothing to change here — only worth remembering if segment tooltips ever grow license detail.
Behavioral side effect worth having on the radar for QA: a Technician-filtered ATU pre-tune will now generate tune centers on the 80/40/15m CW/data ranges and 28.0–28.5, where it previously skipped them. That's correct (Techs hold transmit privileges there), but it does change where the carrier lands for that filter setting.
Thanks @jensenpat — this is a much more complete fix than #3507, and the verification notes in the description made it straightforward to check.
🤖 aethersdr-agent · cost: $15.6746 · model: claude-fable-5
The kBandPlan[]/kBandSpots[] constexpr tables were replaced by the JSON-driven BandPlanManager in aethersdr#425 and nothing includes the header. The stale data (pre-aethersdr#3506 10m Technician edges, old 60m channels) is now two corrections behind resources/bandplans/arrl-us.json; remove it so it can't be reintroduced as a reference. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Codex <noreply@openai.com>
The plan previously ended at 6m, leaving VHF/UHF panadapters (and transverter use) with no band plan data. Adds the ARRL band plan segments for 144-148 MHz and 420-450 MHz per arrl.org/band-plan (all license classes have full privileges on both bands), plus calling-frequency spots (144.200, 146.52, 432.100, 446.000, 2m FT8/ MSK144/WSPR). The overlapping 438-444 ATV / 442-445 repeater local-option segments are rendered non-overlapping by splitting at 442. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Codex <noreply@openai.com>
Summary
Fixes #3506. Supersedes #3507 with a full-file accuracy pass verified against 47 CFR §97.301/§97.303 and the ARRL band plan (arrl.org/band-plan), plus new VHF/UHF coverage and dead-code removal.
Changes
10m (the #3506 report): Technician privileges end at 28.500 MHz.
Tto all segments in 28.000–28.500, including the 28.225–28.300 beacon segment that fix(bandplan): correct 10m Technician privileges in ARRL US plan (#3506). Principle IV. #3507 missedTfrom everything above (28.5–29.0 PHONE, AM, SAT, repeater in/out, FM call)80/40/15m Technician CW privileges (same class of bug, previously missing entirely):
Tto segments within 3.525–3.600, 7.025–7.125, and 21.025–21.200 (§97.301(e), CW only, 200 W PEP)80m General CW lower edge:
60m:
2m and 70cm (new — plan previously ended at 6m, so VHF/UHF panadapters and transverter use had no band plan data):
E,G,T— every license class has full 2m/70cm privilegesDead code removal (per review):
src/models/BandPlan.h— the compiled-inkBandPlan[]/kBandSpots[]tables replaced by the JSON-drivenBandPlanManagerin Customizable Band Plan Overlay #425. Nothing includes the header; its stale data was now multiple corrections behind this fileVerification
python3 -m json.toolBandPlan.hdeletion verified: no#includereferences, no build-system references, no symbol uses outside the deleted file💻 Generated with Claude Code (Fable 5.0) with architecture by @jensenpat