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>
NF0T
left a comment
There was a problem hiding this comment.
Data-file-only correction; independently verified all changes against 47 CFR §97.301/§97.303 and the ARRL band plan:
10m (28 MHz): Technician privileges correctly bounded at 28.500 MHz per §97.301(e). The prior plan omitted T from the 28.300–28.500 phone segment and extended it above 28.500 — both wrong. The beacon sub-range split (28.225–28.300 inside the broader CW/DATA range) is handled correctly with T on both sides of the split within the 28.000–28.500 boundary.
80m: General CW lower edge correctly moved to 3.525 MHz; the old single 3.510–3.570 segment implied General could operate in Extra-only space. Technician CW/data on 3.525–3.600 per §97.301(e) correctly added.
40m / 15m: Technician CW privileges (7.025–7.125 / 21.025–21.200) per §97.301(e) correctly added; these were entirely absent.
60m: The removed 5.3515–5.3543 MHz segment corresponds to 5351.5 kHz, which is the WRC-15 international secondary allocation lower edge, not one of the five FCC Part 97 §97.303(h) authorized channels (5330.5/5346.5/5357.0/5371.5/5403.5 kHz). Removal is correct.
2m/70cm: Both bands were absent from the plan; the new segments accurately reflect the ARRL band plan including calling frequencies, beacon sub-bands, OSCAR SAT windows, FM repeater pairs, and digital mode watering holes. Spot entries for 144.200, 146.520, 432.100, 446.000, FT8/MSK144/WSPR are correct.
src/models/BandPlan.h deletion: Safe. Nothing in the tree includes this header — BandPlanManager (PR #425) made the compiled-in constexpr tables dead code. No CMakeLists.txt change needed (header-only, no separate TU).
No MainWindow, RadioSession, or GUI files touched. CI 6/6 green. Approved.
…#3518) Full accuracy pass on the ARRL US band plan, verified against 47 CFR 97.301/97.303 and the ARRL band plan. Fixes aethersdr#3506; supersedes aethersdr#3507. - 10m: Technician privileges end at 28.500 MHz — added T to all 28.000-28.500 segments (including the 28.225-28.300 beacon segment) and removed T above 28.500 - 80/40/15m: added Technician CW privileges (3.525-3.600, 7.025-7.125, 21.025-21.200) - 80m: General CW lower edge corrected to 3.525 (3.510-3.525 is Extra-only) - 60m: removed nonexistent 5351.5 kHz channel; the five US dial frequencies remain Squashed-from: aethersdr#3518 Co-Authored-By: Claude Fable 5 <noreply@anthropic.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