[codex] Show Kiwi public receiver limits marker#3707
Conversation
There was a problem hiding this comment.
Pull request overview
Adds support for displaying the KiwiSDR public directory’s “Limits” marker in AetherSDR’s public receiver picker UI, using only directory-published metadata (no inference of durations).
Changes:
- Extend
KiwiPublicReceiverwith helpers to detect and label the “Limits” marker based on thesdr_hwfield. - Add a new “Limits” column to
KiwiPublicReceiverPickerand show an explanatory tooltip. - Update the public directory parser test fixture and assertions to cover the marker behavior.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
tests/kiwi_public_directory_test.cpp |
Updates sample HTML and adds assertions for parsing and badge behavior of the “Limits” marker. |
src/gui/KiwiPublicReceiverPicker.cpp |
Adds a “Limits” column to the picker table and populates it from receiver metadata with tooltips. |
src/core/KiwiPublicDirectory.h |
Declares new KiwiPublicReceiver helpers for connection-limit marker detection/badge text. |
src/core/KiwiPublicDirectory.cpp |
Implements marker detection (sdrHw contains “Limits”) and a badge string helper. |
There was a problem hiding this comment.
Reviewed the diff — this is a clean, well-scoped change. The new Limits column is derived entirely from server-published sdr_hw metadata (honoring Principle IV), correctly stays blank rather than inventing a duration, and the column-enum refactor (ReceiverColumn…ColumnCount) is a nice incidental cleanup that removes the magic indices. Test coverage for both the present and absent marker cases is included, and all six CI checks are green.
A few small notes — none blocking:
-
Marker matching is a substring, not a token.
advertisesConnectionLimit()usessdrHw.contains("Limits", Qt::CaseInsensitive). Sincesdr_hwis a free-form hardware/firmware string, a case-insensitive substring match could in principle false-positive on unrelated text that happens to contain "limits" (e.g. a future firmware/antenna descriptor). If the directory always appendsLimitsas a discrete space-delimited token, consider matching it as a whole word (e.g. split on whitespace and compare, or a\bLimits\bregex) to be robust against that. Minor, given the marker is well-defined today. -
Tooltip on every cell. Setting a tooltip on the blank (no-limit) cells too is reasonable for discoverability, but worth confirming it reads well in practice when most rows are empty.
Nice work, @rfoust — the conservative framing (advertise the marker, don't claim a duration the directory doesn't publish) is exactly right. Thanks for the focused tests.
🤖 aethersdr-agent · cost: $2.5976 · model: claude-opus-4-8
advertisesConnectionLimit() used sdrHw.contains("Limits"), which on the
free-form sdr_hw field could false-positive on an unrelated descriptor that
happens to contain those letters (e.g. "Unlimited", "NoLimitsBeta"). Match
"Limits" as a whole whitespace-delimited token instead. Adds test coverage
for the substring-no-match and case-insensitive-token-match cases.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Pushed a small hardening commit on top (a09e01e) — hope that's alright, @rfoust; revert if you'd rather take it differently.
The code is otherwise clean and the conservative framing (show the marker, never invent a duration) is right. One thing I couldn't verify from my end: that the live directory actually emits |
|
Confirmed from the live public directory response I fetched while preparing this: the marker appears in So |
ten9876
left a comment
There was a problem hiding this comment.
Approving — the one open item is now resolved.
@rfoust confirmed from the live public-directory response that Limits appears in sdr_hw as a discrete whitespace-delimited token (e.g. ⏳ Limits, ⏳🚫 Limits), which is exactly the form the token-match in a09e01e handles — and it avoids the substring false-positive (Unlimited/NoLimitsBeta). So the wire-format assumption is now verified, not assumed.
Net: clean code, the Column enum cleanup removes magic indices, conservative framing (mirror the marker, never invent a duration the directory doesn't publish), token-match hardened with test coverage for both the no-match and case-insensitive-match cases, and CI green on all six. Good to land.
Summary
Adds a
Limitscolumn to the public KiwiSDR receiver picker so AetherSDR mirrors the limit marker shown in the KiwiSDR public directory. The column displaysLimitswhen the directory advertises that marker and stays blank otherwise; it does not infer or claim an exact duration because the public directory and/statusdo not publish that value.Constitution principle honored
Principle IV — this uses only server-published public directory/status metadata and does not rely on KiwiSDR server source, served JavaScript, or implementation-derived code.
Test plan
cmake --build build --target AetherSDR)ctest --test-dir build -R kiwi_public_directory_test --output-on-failure)Checklist
docs/COMMIT-SIGNING.md)AppSettingscalls — use nested-JSON-under-one-key(Principle V)
reverse-engineered from a proprietary binary (Principle IV)
MeterSmoother(AGENTS.md convention)