3.1 KiB
Known edge cases and regression patterns
This file is a regression-awareness list. Reproduce/inspect current code before deciding a historical bug still exists.
Incomplete ChatMember
Known failure pattern:
Cannot invoke "java.lang.Double.intValue()" because
ChatMember.getQrb() is null
Lesson:
- QRB can be absent;
- UI/calculation code must not blindly unbox/convert;
- unavailable is not zero.
Apply the same reasoning to QTF and other server/fallback-derived fields.
Callsign suffix collisions
A historical issue caused messages/identity problems between:
DN9APW
DN9APW-2
The corrective model is not "strip all suffixes".
Instead:
- keep full-call chat identities distinct;
- include category;
- use base call only for explicitly base-call-wide features such as worked state/monitoring.
Unsupported chat categories
The ON4KST ecosystem can expose categories outside the two central ones.
A parser/switch/filter must not throw because the category is irrelevant to KST4Contest.
Safe ignore/fallback beats fake band assignment.
AirScout higher-band queries
A historical observation showed aircraft visible in AirScout while API results for a 432 MHz case were empty.
Potential causes included frequency-string formatting.
Lesson:
- verify the exact upstream contract;
- compare request produced by KST4Contest with a known-working request;
- do not "fix" by guessing a string format or falling back to an unrelated band.
Second airplane-scatter result / missing aircraft
A known UI failure involved missing/partial airplane-scatter data and a TextInputControl range error (start must be <= end).
Lesson:
- empty/partial AP results must be validated before text-range highlighting/selection;
- second-result paths need the same null/range checks as primary results.
Historic/unknown user message
A user/message record can refer to a callsign not present in the current member list.
Do not require current login membership to render or classify historic messages.
UM3-style handling
Historical message handling included cases that should be ignored safely if the user is not in the chat/member state.
Lesson:
- external message types must tolerate missing member references.
CR/LF and disconnect suspicion
Do not treat line endings as harmless text formatting in socket code.
When diagnosing a disconnect:
- inspect transmitted bytes;
- inspect server response/EOF;
- compare Windows versions only after proving the application sends different bytes;
- avoid duplicated LF/CRLF terminators.
Filter reset
A reset button that clears control values but leaves predicates active is not a valid reset.
Verify final predicate composition, not only UI state.
Map render flicker
Leaflet/WebView render fragmentation under Java 21 was mitigated by:
window.L_DISABLE_3D = true
before Leaflet load.
Do not remove as "obsolete CSS cleanup" without a visual regression check.
Network start/reconnect loop
Initial connection failure must not spin indefinitely or block controlled recovery.
Connection state must be based on actual I/O lifecycle rather than only Socket.isConnected()-style historical state.