Skip to content

[codex] Show Kiwi public receiver limits marker#3707

Merged
ten9876 merged 2 commits into
aethersdr:mainfrom
rfoust:codex/kiwi-time-limit-column
Jun 22, 2026
Merged

[codex] Show Kiwi public receiver limits marker#3707
ten9876 merged 2 commits into
aethersdr:mainfrom
rfoust:codex/kiwi-time-limit-column

Conversation

@rfoust

@rfoust rfoust commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds a Limits column to the public KiwiSDR receiver picker so AetherSDR mirrors the limit marker shown in the KiwiSDR public directory. The column displays Limits when the directory advertises that marker and stays blank otherwise; it does not infer or claim an exact duration because the public directory and /status do 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

  • Local build passes (cmake --build build --target AetherSDR)
  • Behavior verified on a real radio if applicable
  • Focused test passes (ctest --test-dir build -R kiwi_public_directory_test --output-on-failure)
  • Existing tests pass (CI)
  • Reproduction steps documented if user-reported bug

Checklist

  • Commits are signed (docs/COMMIT-SIGNING.md)
  • No new flat-key AppSettings calls — use nested-JSON-under-one-key
    (Principle V)
  • 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

@rfoust rfoust marked this pull request as ready for review June 21, 2026 04:25
@rfoust rfoust requested review from a team as code owners June 21, 2026 04:25
Copilot AI review requested due to automatic review settings June 21, 2026 04:25

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 KiwiPublicReceiver with helpers to detect and label the “Limits” marker based on the sdr_hw field.
  • Add a new “Limits” column to KiwiPublicReceiverPicker and 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.

@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 — 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 (ReceiverColumnColumnCount) 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:

  1. Marker matching is a substring, not a token. advertisesConnectionLimit() uses sdrHw.contains("Limits", Qt::CaseInsensitive). Since sdr_hw is 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 appends Limits as a discrete space-delimited token, consider matching it as a whole word (e.g. split on whitespace and compare, or a \bLimits\b regex) to be robust against that. Minor, given the marker is well-defined today.

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

ten9876 commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

Pushed a small hardening commit on top (a09e01e) — hope that's alright, @rfoust; revert if you'd rather take it differently.

  • Token match instead of substring. advertisesConnectionLimit() now matches Limits as a whole whitespace-delimited token rather than sdrHw.contains("Limits"), so a free-form sdr_hw descriptor that merely contains those letters (e.g. Unlimited, NoLimitsBeta) can't false-positive. Added test coverage for the substring-no-match and case-insensitive-token-match cases. Focused test green locally.

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 Limits as a token in the sdr_hw field — the public directory is behind the interactive x-kiwi-auth gate, so an automated fetch only returns the gate page, and the test fixture is hand-authored. Worst case is benign (the column just stays blank), so it's not a blocker — but if you can confirm you observed Limits in a real sdr_hw value (a captured snippet in the fixture would be gold), that turns the assumption into a verified fact. Otherwise this looks good to land once CI is green.

@rfoust rfoust self-assigned this Jun 21, 2026
@rfoust

rfoust commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator Author

Confirmed from the live public directory response I fetched while preparing this: the marker appears in sdr_hw as a discrete token, e.g. values shaped like:

sdr_hw=KiwiSDR ... ⏳ Limits ...
sdr_hw=KiwiSDR ... ⏳🚫 Limits ...

So a09e01e5 looks right to me: token matching avoids false positives while still matching the live directory form we observed. Agree with keeping the conservative behavior here: mirror the Limits marker, but do not claim a duration since neither the public directory nor /status publishes one.

@ten9876 ten9876 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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.

@ten9876 ten9876 merged commit bec97e9 into aethersdr:main Jun 22, 2026
6 checks passed
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.

3 participants