Skip to content

fix(tests): RTL tests follow the qualified-WFM gate and build without the RTL backend. Principle XI. - #6263

Merged
ten9876 merged 1 commit into
mainfrom
fix/main-rtl-wfm-gates
Oct 7, 2026
Merged

ten9876 merged 1 commit into
mainfrom
fix/main-rtl-wfm-gates

Conversation

@ten9876

@ten9876 ten9876 commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator

Summary

Fixes #6248, and the System Libraries Canary failure on main. Both came from #5973 (ca4e7cb).

  • Full Suite: control_receive_test. RTL WFM: opt-in DSP, native stereo applet, and bounded receive exchange #5973 turned on RtlReceivePipeline::kQualifiedWfmEnabled, so RTL now declares WFM as a third adjustable filter mode along with broadcastFmReceive. That is intended; RTL WFM: opt-in DSP, native stereo applet, and bounded receive exchange #5973's description says "RTL advertises broadcastFmReceive". The assertion was written by RTL M1: confirmed receive state, free capture browsing and finer zoom #5924 while the gate was off and still demanded exactly FM and FMN. It now follows the gate the way the other RTL tests do:
    • FM and FMN with their ±21.6 kHz edges
    • when qualified: WFM with its own ±100 kHz range, and the broadcast-FM controls
    • when not: no broadcast-FM controls
    • legacy, unqualified WFM is never offered
  • System Libraries Canary: link error. rtl_wfm_pipeline_test is registered on every build, but its opt-in DDC benchmark calls RtlSdrDdc. That class is compiled only with the RTL backend (librtlsdr plus fftw3f), which the canary image doesn't install, so the link failed with 9 undefined references. The benchmark and its header now sit behind AETHER_BACKEND_RTL, as control_receive_test's RTL block already does. The pipeline checks still run on every build, and asking for the benchmark on a build without RTL prints that it was skipped.

Test-only change: no production code moves.

Constitution principle honored

Principle XI. main's CI should re-run green on its own merge commits. This restores the two red workflows.

Test plan

  • RTL build: the full ctest suite passes, 672/672 including control_receive_test, which failed on main before this change.
  • -DENABLE_RTL=OFF (same effect as the canary, which has no librtlsdr):
    • the entire tree builds with ninja -k 0 and no link errors
    • rtl_wfm_pipeline_test reports 0 failures, and with AETHER_WFM_BENCHMARK=1 prints "benchmark skipped, this build has no RTL backend"
    • restoring main's rtl_wfm_pipeline_test.cpp in that tree reproduces the canary's 9 undefined RtlSdrDdc references
  • check_test_registration and check_ci_test_gate pass.

Checklist

  • Commits are signed
  • Test-only change, with no settings, colour or meter changes
  • No CHANGELOG entry

🤖 Generated with Claude Code

… the RTL backend. Principle XI.

Fixes the two failures on main that #5973 (ca4e7cb) introduced.

- control_receive_test (Full Suite, #6248): #5973 turned on
  RtlReceivePipeline::kQualifiedWfmEnabled, and RTL now declares WFM as a
  third adjustable filter mode with broadcastFmReceive. The assertion,
  written by #5924 while the gate was off, still demanded exactly FM and
  FMN. It now follows the gate the way the other RTL tests do: FM and FMN
  with their 21.6 kHz edges, plus WFM with its own 100 kHz range and the
  broadcast-FM controls when qualified, and neither when not. Legacy WFM is
  still never offered.
- System Libraries Canary: rtl_wfm_pipeline_test is registered on every
  build, but its opt-in DDC benchmark calls RtlSdrDdc, which is compiled
  only with the RTL backend (librtlsdr + fftw3f, absent from the canary
  image). The link failed with 9 undefined references. The benchmark (and
  the header it needs) now sit behind AETHER_BACKEND_RTL, as
  control_receive_test's RTL block does. The pipeline checks still run on
  every build, and asking for the benchmark on a build without RTL says so.

Verified: with RTL on, the full ctest suite passes (672/672, including
control_receive_test). With -DENABLE_RTL=OFF, the entire tree builds with
`ninja -k 0` and no link errors; rtl_wfm_pipeline_test runs with 0
failures and skips the benchmark with a message. Restoring main's
rtl_wfm_pipeline_test.cpp in that tree reproduces the canary's 9
undefined RtlSdrDdc references.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@ten9876
ten9876 requested a review from a team as a code owner October 7, 2026 22:28
@ten9876 ten9876 self-assigned this Oct 7, 2026
@ten9876
ten9876 merged commit 7472a42 into main Oct 7, 2026
7 checks passed
@ten9876
ten9876 deleted the fix/main-rtl-wfm-gates branch October 7, 2026 22:39
ten9876 added a commit that referenced this pull request Oct 7, 2026
…ssibility events stand alone. Principle VIII.

Landing pass on #6264.

Parser (maintainer: keep the token rule, tighten it)
- The closing-quote test is a named predicate: a token closes the open
  value unless it opens another quoted field, and a token whose only quote
  is its last character always closes (endsWith && count == 1, which
  states what the first-quote-position test meant).
- The function comment now describes that rule, including the one shape it
  cannot tell apart: on a malformed line a lone `label="` reads as the
  close, exactly as a valid name ending in '=' does. A new test pins that
  case, and that the keys after it survive.
- The looped `=`-name assertions carry the name in their label, so a
  failure says which name broke.

Accessibility (maintainer: fold the #6262 review finding into #6264)
- setAccessibleName() and QLabel::setText() emit NameChanged themselves.
  The panel's extra coalesced F-key event and its manual status events are
  gone; F-key and row names are set only when they change.
- The status label's accessible name carries the last announced state, so
  each state change is one NameChanged and the 10 Hz elapsed-time text and
  transfer progress add none.
- dvk_panel_admission_test counts NameChanged through
  QAccessible::installUpdateHandler: a load of unchanged slots emits none
  on the F-keys, a rename emits one, a state change is one status event
  with no tick events after it, and disconnect emits one status event plus
  one for the renamed slot. Against the previous panel, three of those
  checks fail.

dvk_model_status_test 56/56, dvk_panel_admission_test 11/11,
dvk_panel_theme_test 33/33. Full ctest passes except control_receive_test,
whose fix (#6263) landed on main after this branch's base. Architecture
gates read the same on base and head.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ten9876 added a commit that referenced this pull request Oct 7, 2026
…ibility events. Principle VIII. (#6264)

## Summary

Fixes the quoted-name regression introduced by #6262, which its
[review](#6262 (review))
found, and folds in that review's accessibility finding (maintainer
call).

**Parser.** Given `id=1 name="CQ a=" duration=1000`, the parser read
`a="` as the start of another quoted field, and the DVK model displayed
`CQ`.
- A token now closes the open quoted value unless it opens another
quoted field.
- A token whose only quote is its last character always closes. So `CQ
a=`, `CQ =` and `CQ a= b=` stay whole, and the following `duration`
survives.
- One shape is genuinely ambiguous. On a malformed line, a lone
`label="` reads as the close, because it looks exactly like a valid name
ending in `=`. A test pins that case and checks that the keys after it
survive.
- The #6247 guard still holds: an unterminated value does not swallow a
later `bar="x"`.

**Accessibility.** `setAccessibleName()` and `QLabel::setText()` emit
`NameChanged` themselves, and the panel was adding events of its own on
top. The review measured 2 events for a single rename and 12–24 for a
slot load or disconnect.
- The panel no longer adds any events of its own.
- F-key and row names are set only when they change.
- The status line's accessible name holds the last announced state. Each
state change is now one event, and the 10 Hz elapsed-time text and
transfer progress add none.

## Constitution principle honored

**Principle VIII.** Each claim is backed by a test that fails without
the change. FlexLib's DVK status parsing keeps everything between the
quotes, equals signs included (Principle I).

## Validation

- **Parser:** against the merged `bc1d7b80f`, the new assertions fail 6
of 55, one per name ending in `=`. With this fix,
`dvk_model_status_test` passes 56/56, with each looped assertion naming
its value.
- **Accessibility events:** `dvk_panel_admission_test` (11/11) counts
`NameChanged` events through `QAccessible::installUpdateHandler`:
  - reloading unchanged slots: no F-key events
  - a rename: exactly one
- a state change: one status event, and nothing from the following ticks
  - a disconnect: one status event plus one for the renamed slot

  Against the previous panel, three of these fail.
- `dvk_panel_theme_test` passes 33/33.
- **Full `ctest`:** passes except `control_receive_test`. Its fix
(#6263) landed on `main` after this branch's base.
- **Static gates:** engine boundary, capability records, command plane,
touchpoint manifest, test registration and the CI gate read identically
on the merge base and the head. `check_a11y` reports nothing on
`DvkPanel`.
- **Not verified:** socket-free and offscreen only. No live radio, no
transmitting, and no real screen reader.

## Checklist

- [x] Signed commits
- [x] Socket-free regression coverage, and each guard checked by
inverting it
- [x] No new settings keys, dependencies or ratchet changes
- [x] No CHANGELOG change

Authored with OpenAI Codex. Landed with Claude Code.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.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.

[full-suite] test suite failing on main (fp a1c5df639be3)

1 participant