Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ an issue, lead with "Fixes #N" or "Closes #N". -->

<!-- Cite the principle by Roman numeral when relevant. E.g.
"Principle V — new feature uses nested-JSON persistence."
"Principle IIMeterSmoother used for the new meter widget."
"Principle IVcode is clean-room, not derived from decompiled sources."
See CONSTITUTION.md for the full list. -->

## Test plan
Expand All @@ -36,6 +36,8 @@ See CONSTITUTION.md for the full list. -->
- [ ] Commits are signed (`docs/COMMIT-SIGNING.md`)
- [ ] No new flat-key `AppSettings` calls — use nested-JSON-under-one-key
(Principle V)
- [ ] All meter UI uses `MeterSmoother` (Principle II)
- [ ] Code is clean-room — not decompiled, disassembled, or
reverse-engineered from a proprietary binary (Principle IV)
- [ ] All meter UI uses `MeterSmoother` (AGENTS.md convention)
- [ ] Documentation updated if user-visible behavior changed
- [ ] Security-sensitive changes reference a GHSA if applicable
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ priority must-knows that fit in Copilot's chat context window.
stores `{"enabled": true, "mode": "auto"}` under `AppSettings["MyFeature"]`,
not `MyFeatureEnabled` + `MyFeatureMode` as flat keys.

5. **All meter UI uses `MeterSmoother`** (Principle II). Do not
5. **All meter UI uses `MeterSmoother`** (AGENTS.md convention). Do not
suggest envelope followers, `std::pow`/`exp` smoothing, or
asymmetric `kAlpha` blenders for new meter widgets.

Expand Down
260 changes: 158 additions & 102 deletions .specify/memory/constitution.md

Large diffs are not rendered by default.

47 changes: 40 additions & 7 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,11 @@ When helping with AetherSDR:
- **Read the AetherSDR Constitution before writing or reviewing code.**
Canonical source: `.specify/memory/constitution.md`. Byte-identical
mirror at `CONSTITUTION.md` in repo root for discoverability. 14
principles total: 7 AetherSDR-domain conventions (FlexLib authority,
MeterSmoother, UI labels, BandPlanManager, nested-JSON config, CHAIN
widget, auto-generated Contributors) + 7 defensive engineering
principles adopted from Cisco's
principles total (constitution v2.0.0): 7 AetherSDR-domain governance
principles (FlexLib authority, radio-authoritative live state,
radio-persistable settings, clean-room contributions, per-feature
config ownership, transmit-on-intent, boundary input validation) + 7
defensive engineering principles adopted from Cisco's
[Foundry Constitution](https://github.com/CiscoDevNet/foundry-security-spec/blob/main/constitution.md)
(Evidence Over Assertion, Surface Only What Survives, Claims Are
Atomic And Mortal, Fixes Are Demonstrated, Sandbox By Infrastructure,
Expand Down Expand Up @@ -367,9 +368,10 @@ Run once at app or feature startup, not on every access.

### Radio-Authoritative Settings Policy

**The radio is always authoritative for any setting it stores.** AetherSDR
must never save, recall, or override radio-side settings from client-side
persistence. Only save client-side settings for things the radio does NOT save.
**The radio is always authoritative for any setting it stores** (Constitution
Principles II & III). AetherSDR must never save, recall, or override radio-side
settings from client-side persistence. Only save client-side settings for things
the radio does NOT save.

**Radio-authoritative (do NOT persist):** frequency, mode, filter, step size,
AGC, squelch, DSP flags, antennas, TX power, panadapter *count* and per-pan
Expand Down Expand Up @@ -406,6 +408,37 @@ value through `MeterSmoother` (`src/gui/MeterSmoother.h`). Don't write
new envelope-follower code or copy smoothing logic from other widgets
— `MeterSmoother`'s header has the API and a usage example.

### User-facing names match the on-screen UI labels

In prose (issue comments, README, What's-New strings, error toasts, support
requests) call a control by the label the user sees, not the C++ class name —
e.g. the **DIGI applet** (class `CatApplet`), and the Help → Support logging
toggles **Discovery / Commands / Status** (not backend names like
`radio.connection`). The on-screen label wins for prose, so users can find the
control you're naming.

### Region-aware band data — read from BandPlanManager, not BandDefs.h

Anything needing band edges, segment sizes, or per-band metadata reads the
active plan via `BandPlanManager` (`AppSettings["BandPlanName"]` + the JSON in
`resources/bandplans/`). `src/models/BandDefs.h::kBands[]` is ARRL/US-only and
not region-aware — don't source new features from it; AetherSDR's users span
IARU regions 1/2/3.

### TX DSP stages integrate with the CHAIN widget

The TX DSP chain is stage-per-applet and the visual **CHAIN** widget is the
primary entry point. New TX DSP stages must be ordered, toggleable, and
inspectable through the CHAIN widget rather than adding a parallel UI entry —
it's the user's mental model for the TX signal path.

### The About-dialog Contributors list is auto-generated

The Contributors list in the About dialog is built at runtime from the GitHub
API; manual edits are overwritten on the next build. If someone is missing, fix
the GitHub-side attribution (commit authorship / `Co-Authored-By` trailer),
don't patch the dialog string.

---

## Multi-Panadapter Support
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2218,7 +2218,7 @@ add_executable(perf_telemetry_test
tests/perf_telemetry_test.cpp
src/core/PerfTelemetry.cpp
# LogManager.cpp owns the lcPerf Q_LOGGING_CATEGORY definition (per
# Principle III consolidation, #2770); LogManager has AsyncLogWriter
# the Q_LOGGING_CATEGORY consolidation in #2770); LogManager has AsyncLogWriter
# as a member which transitively needs AppSettings, so all three .cpp
# files come along to satisfy the ctor/dtor chain at link time.
src/core/LogManager.cpp
Expand Down
Loading
Loading