Files
kst4contest/.agents/skills/kst4contest-change/references/known-edge-cases.md
T

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.