Skip to content

docs(arch): correct RadioSession v3 scope (#3351 / #3445)#3555

Merged
ten9876 merged 1 commit into
mainfrom
refactor/3351-session-settings
Jun 13, 2026
Merged

docs(arch): correct RadioSession v3 scope (#3351 / #3445)#3555
ten9876 merged 1 commit into
mainfrom
refactor/3351-session-settings

Conversation

@ten9876

@ten9876 ten9876 commented Jun 13, 2026

Copy link
Copy Markdown
Collaborator

Summary

Doc-only. Corrects two items the RadioSession v1 class doc (merged in #3544) listed as "v3 scope" that don't survive closer inspection. No code change — captures a finding so neither gets attempted as written.

I went to build the SessionSettings facade (the documented next step) and the investigation showed it's premature. Rather than build speculative infrastructure with no consumer — the first such thing in the 12-PR series — here's the finding, recorded in the class doc where the next contributor will see it.

Finding 1: the wire bodies can't move onto RadioSession

wireDiscovery / wireRadioModel / wirePanLifecycle are ~100 connect() calls with ~76 references to MainWindow's widgets (applet panel, title bar, pan stack, spectrum widgets, status bar). They're application-layer model→UI glue. Moving them onto a src/models/ class would invert the dependency — RadioSession would have to #include the GUI. They belong in the GUI layer (where they are now), full stop.

Finding 2: the SessionSettings facade is premature

There is no per-radio AppSettings namespace to wrap. Per-radio state today is:

Category Examples Where it lives
Global StationName, LastConnectedRadioSerial flat AppSettings (genuinely global — station is per-operator, last-serial is a reconnect pointer)
Radio-side slice/pan positions, modes FlexRadio SSDR profiles (profile global info) — see #3384
Already per-radio band-stack entries BandStackSettings::sanitizeSerial()"Radio_<serial>" keys

BandStackSettings is the one working per-radio-namespacing pattern in the codebase — it's the template multi-radio should follow when a second session creates a real consumer. A facade built now would wrap nothing and have no caller.

What this means for the series

The #3351 refactor is complete. The architecturally hard work — the 19,474→8,135-line decomposition and the by-value→session-collection extraction (937 call sites) — is merged. RadioSession owns {RadioModel, TciServer, CatPort[8], identity}; the #2385 crash class is structurally impossible. What remains for multi-radio (#3445) is feature/design work — the m_sessions.size() > 1 activation, the active-radio UI, the audio-plane decision — which is the team's call, not more refactoring.

Refs #3351 #3445 #3384

…items

The v1 class doc (merged in #3544) listed two v3 items that don't hold
up on closer inspection. Documenting why, so neither gets attempted as
written:

1. "wire bodies move onto RadioSession" — they can't. wireDiscovery /
   wireRadioModel / wirePanLifecycle are ~100 connect() calls with ~76
   references to MainWindow's widgets; they're application-layer
   model→UI glue. Moving them to a models/ class inverts the dependency
   (the model layer would have to #include the GUI). They stay in the
   GUI layer.

2. "per-session settings facade" — premature. There is no per-radio
   AppSettings namespace to wrap: per-radio state is global
   (StationName, LastConnectedRadioSerial), radio-side (slice/pan/mode
   live in SSDR profiles, #3384), or already correctly namespaced.
   BandStackSettings::sanitizeSerial() ("Radio_<serial>") is the one
   working per-radio pattern and is the template to follow when a second
   session creates a real consumer.

Doc-only; no code change. Captures the finding from the post-v2 review
of what genuinely remains for multi-radio (#3445).

Principle XI.
@ten9876 ten9876 requested a review from a team as a code owner June 13, 2026 13:08
@ten9876 ten9876 merged commit f0d9665 into main Jun 13, 2026
5 checks passed
@ten9876 ten9876 deleted the refactor/3351-session-settings branch June 13, 2026 13:36
G6PWY-Chris pushed a commit to G6PWY-Chris/AetherSDR that referenced this pull request Jun 22, 2026
…#3445) (aethersdr#3555)

## Summary

Doc-only. Corrects two items the RadioSession v1 class doc (merged in
aethersdr#3544) listed as "v3 scope" that don't survive closer inspection. No
code change — captures a finding so neither gets attempted as written.

I went to build the **SessionSettings facade** (the documented next
step) and the investigation showed it's premature. Rather than build
speculative infrastructure with no consumer — the first such thing in
the 12-PR series — here's the finding, recorded in the class doc where
the next contributor will see it.

## Finding 1: the wire bodies can't move onto RadioSession

`wireDiscovery` / `wireRadioModel` / `wirePanLifecycle` are **~100
`connect()` calls with ~76 references to MainWindow's widgets** (applet
panel, title bar, pan stack, spectrum widgets, status bar). They're
application-layer model→UI glue. Moving them onto a `src/models/` class
would invert the dependency — RadioSession would have to `#include` the
GUI. They belong in the GUI layer (where they are now), full stop.

## Finding 2: the SessionSettings facade is premature

There is no per-radio AppSettings namespace to wrap. Per-radio state
today is:

| Category | Examples | Where it lives |
|---|---|---|
| Global | `StationName`, `LastConnectedRadioSerial` | flat AppSettings
(genuinely global — station is per-operator, last-serial is a reconnect
pointer) |
| Radio-side | slice/pan positions, modes | FlexRadio SSDR profiles
(`profile global info`) — see aethersdr#3384 |
| Already per-radio | band-stack entries |
`BandStackSettings::sanitizeSerial()` → `"Radio_<serial>"` keys |

**`BandStackSettings` is the one working per-radio-namespacing pattern
in the codebase** — it's the template multi-radio should follow when a
second session creates a real consumer. A facade built now would wrap
nothing and have no caller.

## What this means for the series

The aethersdr#3351 refactor is **complete**. The architecturally hard work — the
19,474→8,135-line decomposition and the by-value→session-collection
extraction (937 call sites) — is merged. RadioSession owns `{RadioModel,
TciServer, CatPort[8], identity}`; the aethersdr#2385 crash class is structurally
impossible. What remains for multi-radio (aethersdr#3445) is feature/design work
— the `m_sessions.size() > 1` activation, the active-radio UI, the
audio-plane decision — which is the team's call, not more refactoring.

Refs aethersdr#3351 aethersdr#3445 aethersdr#3384
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.

1 participant