DXSpider / A deep dive for experienced users
Inside Qualitee: why DXS delivered this report
DXS collects a group of reports, then delivers one representative report to each eligible user. Its Q marker describes the group’s stored corroboration level. This differs from SKIMVALID, which tests the CT1BOH classification of each incoming report.
This investigation used NG7M-1, DXSpider 1.57 build 686, commit 3e9b3621, on October 9, 2026. The installed RBN and filter source matched that released commit. It does not describe the forthcoming 1.58 implementation.
Two simultaneous user accounts had the same configuration:
clear/spots all
clear/rbn all
set/skimmer cw
reject/spots 1 all
accept/rbn 1 by_dxcc kThe normal-spots rule excludes human spots from this observation. The explicit RBN rule replaces that rule for skimmer spots. Both accounts receive curated CW output; neither is a raw-feed bypass. A separate read-only connection to RBN port 7000 supplied the raw comparison feed.
During the complete 30-minute common observation, both accounts received the same 234 CW spot decisions. The independent RBN connection recorded 12,047 reports across its full port-7000 feed. These are scope-specific counts, not a comparison of decoding accuracy or total node capacity. One account’s state abbreviations affected presentation only and could shorten a long displayed zone list.
Ordinary skimmer/filter commands do not provide a full raw-feed bypass. The separate, callsign-specific SEEME facility is outside this study.
Filter slots and skimmer enablement
There are ten slots, 0–9. Each can hold one reject rule and one accept rule. Evaluation proceeds in slot order, with reject before accept within each slot; the first matching rule decides the result. Omitting the number uses slot 1. Re-entering a rule of the same kind in that slot replaces it.
With only accept rules, unmatched reports are excluded; with only reject rules, unmatched reports pass. Mixed rules also depend on their order and final unmatched test. Put related conditions in a single expression when possible. Use show/filter to verify the stored rules.
clear/spots all clears normal spot rules. It does not clear separate RBN rules; use clear/rbn all as well. Without an explicit RBN filter, normal spot rules are reused for skimmer output. An explicit accept/rbn or reject/rbn filter replaces that fallback.
set/skimmer cw is a separate category gate. It permits curated CW output but excludes the FT, beacon, PSK and RTTY categories. set/skimmer with no categories enables all categories. Filter rules still have to pass.
The actual NG7M-1 settings
These values were queried from the running node, including the active connection intervals. They matched the inspected release defaults. A sysop can change such values, so another node may behave differently.
| Setting | Observed value | Effect |
|---|---|---|
| $RBN::minqual | 2 | Minimum current collection size considered for output. |
| $RBN::maxqual | 9 | Enough collected reports can end the normal wait early. |
| $RBN::dwelltime | 10 seconds | Normal time allowed to collect reports. |
| $RBN::limbotime | 300 seconds | A collection below the minimum can wait for more evidence before being discarded. |
| SK0MMR / SK1MMR respottime | 180 seconds each | Suppress another collection for a recently published call / nearby-frequency key. |
| $RBN::cachetime | 3,600 seconds | Lifetime used to purge published call / frequency memory; checked periodically. |
| $RBN::startup_delay | 300 seconds | Initial feed warm-up after a cold node start; not a delay imposed on every new user. |
No active startup override or SKIMVALID-related comment was found in the inspected local configuration and startup locations. A setting that makes the report threshold closer to AR-Cluster does not make the two algorithms equivalent. The separate beacontime variable was 300 seconds, but it is not used in the inspected delivery path; it is not substituted for the two observed connection intervals here.
The decision path
- Check and group the input. Validate the callsign format, prefix and frequency. Sysop bad-call / bad-receiver lists and an incoming RBN filter can exclude a report before collection. Reduce the receiver to its base callsign. Use the DX call with a 100 Hz frequency key, probing nearby same-call keys up to five steps above and below. This collects a callsign’s reports; it does not use CT1BOH’s competing-call similarity test.
- Apply publication memory. If that call / nearby-frequency group was published less than 180 seconds ago, the new report is suppressed for this collection. This is a node-wide gate, even if no report from the earlier group passed a particular user’s filter.
- Collect corroboration. Otherwise, accumulate reports for normally 10 seconds, or process early when the collection reaches the configured maximum threshold. A collection below minimum quality waits in limbo, up to 300 seconds. Normal collection counts and duplicate-receiver cleanup are separate steps; the late initial limbo path explicitly recounts receiver identities.
- Choose a frequency. Retain at most one report per normalized receiver for voting. Weight reported frequencies using each receiver’s stored agreement score on that band. Choose the frequency with the highest eligible vote total, then apply it to the retained reports. This is not a signal-strength vote, an average, or necessarily an unweighted majority. Equal vote totals can depend on hash iteration order.
- Build the Q marker. Raise the stored quality when this collection has more evidence; clip the displayed value to 9. A respot does not reset an earlier higher Q. Add
*when retained frequencies differ and+for a respot. - Select a report for the user. Check the user’s skimmer category, then apply the RBN filter to retained reports. Without a filter, the weakest report is selected. With a filter in this build, the last passing retained report is selected; the filtered path does not compare their strengths. Retained order is usually arrival order, but a limbo rebuild can change it.
- Deliver and remember. Send the selected report with the agreed frequency and Q marker. Collapse the candidate to its last-publication time and stored Q, starting the next respot suppression period. The hour-long cache is therefore not an hour-long list of raw reports waiting to be delivered.
What Q does—and does not—tell you
Q:2 indicates corroboration under the node’s collection rules. Q:9 is capped, and on a respot can be an earlier stored value. It is not a probability of correctness, not necessarily the exact number of distinct receivers in every processing branch, and not a count limited to receivers satisfying your filter.
* concerns frequency disagreement; it does not label the callsign as busted. + indicates respotting from remembered call / frequency state. The current collection can contain fewer reports than the displayed Q.
The filter field q can narrow curated output, for example accept/rbn 1 by_dxcc k and q 3+. It cannot recover raw reports that the node has already suppressed. It is also not equivalent to SKIMVALID: the evidence count, frequency grouping, history and respot behavior differ.
Actual cached collections and user delivery
The tables below show the entire pending collection as saved by NG7M-1, followed by the report actually received by both users. The collection start and final node-log dwell agree, and the final logged report count matches the saved group. For these selected groups with distinct receivers, no additional report was appended between the saved snapshot and publication.
The saved cache is periodic, not an instrumented per-spot trace. Receiver scores shown are the values in that saved snapshot; an intervening collection could change a score before the final vote. The node’s final frequency, aggregate winning vote total and candidate count are separately recorded in its decision log.
Green: selected report / actual deliveryBlue: other retained evidence
Hover for an annotation, or click / tap to expand it. All times are UTC. “Reported UTC” is the input report’s minute field, not a precise node-receive timestamp.
1. WA1DX: collection, selection and delivery
Collection started 18:53:50; cache saved 18:53:54; user received 18:54:00. Stored Q before publication: 0.
| Reported UTC | Receiver base call | Input kHz | dB | Saved frequency score | Role / detail |
|---|---|---|---|---|---|
| 1853Z | K9IMM | 21020.0 | 6 | 5 | Supporting reportPasses by_dxcc k, but a later retained report also passes. |
| 1853Z | AC0C | 21020.0 | 30 | 5 | SelectedPasses by_dxcc k; selected by the filtered retained-report scan. |
Actually delivered to both accounts:
DX de AC0C-#: 21020.0 WA1DX CW 30dB Q:2 Z:4 OH 1853Z KSThe node recorded 2 reports, 10s collection time, winning vote total 10, and 0 frequency deviations. Its log names the collection’s first report; that is separate from the report selected for the user.
The filtered representative is not the weakest matching signal. Another passing receiver reported 6 dB; this user received 30 dB. This agrees with the released filtered path selecting its last passing retained report.
2. DL8NBM: retained Q on a respot
Collection started 19:01:46; cache saved 19:01:54; user received 19:01:56. Stored Q before publication: 3.
| Reported UTC | Receiver base call | Input kHz | dB | Saved frequency score | Role / detail |
|---|---|---|---|---|---|
| 1901Z | K3FEF | 14066.9 | 9 | 5 | Supporting reportPasses by_dxcc k, but a later retained report also passes. |
| 1901Z | W1NT | 14066.9 | 4 | 5 | SelectedPasses by_dxcc k; selected by the filtered retained-report scan. |
Actually delivered to both accounts:
DX de W1NT-#: 14066.9 DL8NBM CW 4dB Q:3+ Z:5 1901Z NHThe node recorded 2 reports, 10s collection time, winning vote total 10, and 0 frequency deviations. Its log names the collection’s first report; that is separate from the report selected for the user.
The displayed Q is retained history: this collection has 2 reports, while the earlier stored Q is 3. The plus marker identifies the respot. The higher displayed Q is not evidence of that many new reports in this collection.
3. OM2ADM: retained Q on a respot
Collection started 19:14:36; cache saved 19:14:54; user received 19:14:55. Stored Q before publication: 9.
| Reported UTC | Receiver base call | Input kHz | dB | Saved frequency score | Role / detail |
|---|---|---|---|---|---|
| 1914Z | OK1HRA | 14028.9 | 15 | 1 | Supporting reportProvides global corroboration / frequency evidence, but does not pass this user’s receiver-country condition. |
| 1914Z | W2NAF | 14029.0 | 8 | 5 | SelectedPasses by_dxcc k; selected by the filtered retained-report scan. |
Actually delivered to both accounts:
DX de W2NAF-#: 14029.0 OM2ADM CW 8dB Q:9*+ Z:5,15 1914Z PAThe node recorded 2 reports, 19s collection time, winning vote total 5, and 1 frequency deviations. Its log names the collection’s first report; that is separate from the report selected for the user.
The displayed Q is retained history: this collection has 2 reports, while the earlier stored Q is 9. The plus marker identifies the respot. The higher displayed Q is not evidence of that many new reports in this collection.
Frequency selected through the weighted vote. The original frequencies remain visible in the cache table. The delivered frequency is the node’s recorded choice; the star marks the disagreement.
4. IZ8FAV: collection, selection and delivery
Collection started 19:16:46; cache saved 19:16:54; user received 19:16:56. Stored Q before publication: 0.
| Reported UTC | Receiver base call | Input kHz | dB | Saved frequency score | Role / detail |
|---|---|---|---|---|---|
| 1916Z | K3FEF | 14014.0 | 21 | 3 | SelectedPasses by_dxcc k; selected by the filtered retained-report scan. |
| 1916Z | M9PSY | 14014.0 | 18 | 5 | Supporting reportProvides global corroboration / frequency evidence, but does not pass this user’s receiver-country condition. |
| 1916Z | MM0ZBH | 14014.0 | 42 | 5 | Supporting reportProvides global corroboration / frequency evidence, but does not pass this user’s receiver-country condition. |
| 1916Z | MM9PSY | 14014.0 | 30 | 5 | Supporting reportProvides global corroboration / frequency evidence, but does not pass this user’s receiver-country condition. |
Actually delivered to both accounts:
DX de K3FEF-#: 14014.0 IZ8FAV CW 21dB Q:4 Z:5,14 1916Z PAThe node recorded 4 reports, 10s collection time, winning vote total 18, and 0 frequency deviations. Its log names the collection’s first report; that is separate from the report selected for the user.
Evidence, scope and credits
Investigation and documentation collaboration: Dave, N3RD, and Max George, NG7M. DXSpider’s RBN processor and Qualitee: Dirk Koopman, G1TLH. The release source was obtained from the EA3CV repository identified by the DXSpider documentation wiki, pinned to the running node’s commit.
Primary references: released RBN processor, filter evaluator, skimmer category command, and filter slots manual. Existing HELP RBN describes the intent; where wording differs from build 686’s source and observed output, this page states the version-specific behavior.
Only CW user delivery was studied here. The independent raw RBN subscription is useful supporting evidence, but it is not assumed to be byte-for-byte identical to the node’s input. Saved node-cache groups and existing node decision logs provide the stronger evidence. No DXS code, quality setting, debug flag or service restart was needed.