Skip to content

fix(bandplan): correct ARRL US plan license-class accuracy (10m Tech + 80/40/15m Tech CW + 80m CW edge + 60m channels)#3518

Open
jensenpat wants to merge 3 commits into
aethersdr:mainfrom
jensenpat:fix/bandplan-arrl-accuracy
Open

fix(bandplan): correct ARRL US plan license-class accuracy (10m Tech + 80/40/15m Tech CW + 80m CW edge + 60m channels)#3518
jensenpat wants to merge 3 commits into
aethersdr:mainfrom
jensenpat:fix/bandplan-arrl-accuracy

Conversation

@jensenpat

@jensenpat jensenpat commented Jun 10, 2026

Copy link
Copy Markdown
Collaborator

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.

80/40/15m Technician CW privileges (same class of bug, previously missing entirely):

  • Added T to 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:

  • General CW starts at 3.525, not 3.510 — split the old 3.510–3.570 segment so 3.510–3.525 shows Extra-only

60m:

  • Removed the nonexistent 5351.5 kHz channel (a stray from the WRC-15 international allocation the FCC has not implemented). The five US USB dial frequencies remain: 5330.5 / 5346.5 / 5357.0 / 5371.5 / 5403.5 kHz

2m and 70cm (new — plan previously ended at 6m, so VHF/UHF panadapters and transverter use had no band plan data):

  • 144–148 MHz: EME, CW/weak-signal, SSB, 144.275–144.300 beacons, both OSCAR satellite sub-bands, linear translator in/out, FM repeater input/output pairs, simplex windows, 145.50–145.80 experimental
  • 420–450 MHz: ATV, 432 MHz EME/CW/weak-signal with 432.3–432.4 beacons, 433–435 aux links, 435–438 satellite-only, repeater/simplex local-option segments (overlapping 438–444 ATV vs 442–445 repeater rendered non-overlapping by splitting at 442)
  • New spots: 144.200 SSB calling, 146.52 / 446.00 national FM simplex, 432.100 SSB/CW calling, 2m FT8 / MSK144 / WSPR
  • All segments E,G,T — every license class has full 2m/70cm privileges

Dead code removal (per review):

  • Deleted src/models/BandPlan.h — the compiled-in kBandPlan[]/kBandSpots[] tables replaced by the JSON-driven BandPlanManager in Customizable Band Plan Overlay #425. Nothing includes the header; its stale data was now multiple corrections behind this file

Verification

  • JSON validated with python3 -m json.tool
  • HF segment edges cross-checked against §97.301 (license classes) and §97.303(h) (60m)
  • 2m/70cm segments cross-checked against arrl.org/band-plan
  • BandPlan.h deletion verified: no #include references, no build-system references, no symbol uses outside the deleted file

💻 Generated with Claude Code (Fable 5.0) with architecture by @jensenpat

…/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>
@jensenpat jensenpat marked this pull request as ready for review June 10, 2026 23:39
@jensenpat jensenpat requested a review from a team as a code owner June 10, 2026 23:39
@jensenpat jensenpat enabled auto-merge (squash) June 10, 2026 23:40

@aethersdr-agent aethersdr-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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: license is a comma-split string match, segments only need low < high and a valid color, and "version" isn't read by anything, so no bump needed.

Two non-blocking notes:

  1. Stale duplicate band plan in src/models/BandPlan.h — the compiled-in kBandPlan[]/kBandSpots[] tables still carry the old, now-known-wrong data (including a // Tech privileges start at 28.300 comment). They're dead code (nothing includes the header; BandPlanManager.h notes 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."

  2. 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

jensenpat and others added 2 commits June 10, 2026 20:34
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Possible band Plan ARRL (US) Error - 10 meter band privileges

1 participant