8.6 KiB
KST4Contest agent instructions
These project instructions extend Marc's global Codex working agreements.
Project identity
KST4Contest is a Java/JavaFX desktop client for ON4KST chat with contest-oriented workflows and integrations including logging software, AirScout, rotor control, DXCluster and local persistence.
Primary repository areas:
src/main/java/kst4contest/src/test/where present;github_docs/website/docs/packaging/.github/pom.xml
Inspect the current tree before assuming an exact class/path still exists.
Mandatory interaction rule
For every planned code or documentation implementation:
- inspect first;
- explain the task understanding in German;
- identify and ask all relevant implementation questions;
- wait for answers when needed;
- present the final concept in German;
- state what must remain unchanged;
- request explicit concept approval;
- wait;
- implement only after approval.
If an answer is uncertain, do not interpolate it. Check current code/tests/docs/project context first and ask Marc when the uncertainty can affect behaviour.
Language
- Communicate with Marc in German.
- Write source-code comments and Javadoc exclusively in English.
- Keep log/protocol/API literals in their canonical form.
- Commit messages are concise English when a commit is explicitly requested.
- User-facing DE/EN documentation follows
$praktimarc-writing-style.
Java and JavaFX architecture
- Preserve or improve separation between network/parsing/service/controller/UI responsibilities.
- Do not solve architecture problems by letting worker/model code directly manipulate JavaFX UI collections.
- Active chat-member domain state is conceptually thread-safe state; JavaFX
ObservableListdata is a UI projection, not the canonical worker-thread store. MessageBusManagementThreadmust not directly read or mutate the JavaFXObservableListused by the UI.- Route UI-visible mutations through the controller and the JavaFX Application Thread (
Platform.runLateror the project's equivalent helper). - Prefer explicit DTOs over records when introducing transport/parser DTOs in this codebase unless the approved concept says otherwise.
- Handle incomplete external/historical data defensively.
qrb, QTF and related external values can be absent.nullmeans unavailable, not zero.- Unexpected input must not terminate message-processing or UI threads.
Callsign and category identity
- Preserve full callsign variants as distinct chat-member identities where the server exposes them separately.
- Category is part of chat identity. Do not merge messages across categories.
- Base-call normalization may be used only for explicitly base-call-wide features such as worked status or monitoring rules.
- Worked status is shared across suffix variants of the same base call.
- Monitoring a callsign variant such as
DN9APW-2orDN9APW-70is intended to monitor the base callDN9APW, so users do not need to enter every SSID. - Do not generalize suffix semantics beyond behaviour explicitly established by the current code/specification.
Bands and availability
- ON4KST categories 2 and 3 are central to the normal VHF/UHF workflow, but other category values can occur and must fail safely.
- Do not let unsupported categories produce exceptions.
- Known-active-band logic and
B+interpretation must remain consistent across the application. - Band information parsed from names/text must respect explicit
NOT-QRVinformation; NOT-QRV overrides positive availability hints. - Do not silently fall back to a fixed band/frequency when a required decision is ambiguous unless an approved fallback exists.
- Manual band settings and actual current QRG must remain consistent with features that depend on frequency.
External protocols and integrations
Before changing ON4KST, AirScout, UCXLog/DXLog, Win-Test, PSTRotator or DXCluster handling:
- inspect the current implementation;
- preserve exact framing and compatibility;
- inspect current tests;
- check authoritative upstream documentation when the protocol detail is uncertain;
- ask Marc if more than one behaviour is plausible.
Specific invariants and historical context are in $kst4contest-change references.
Never change CR/LF, XML framing, callsign normalization, frequency formatting or port/transport assumptions casually.
UI behaviour
- Preserve contest workflow speed and discoverability.
- Do not change zoom, selection, focus, sorting, tab choice or prefilled text as an incidental side effect.
- Map reset behaviour should clear the selected target without changing the zoom unless a new task explicitly changes this.
- New station selection should preserve the established
/cq callsignprefill behaviour. - If no send category is selected, preserve the established Main-category fallback unless explicitly changed.
- Null/unknown data must render as unavailable/empty according to current UI conventions, not as fake zero values.
WebView / map compatibility
- The Leaflet WebView workaround that disables problematic CSS 3D transforms before Leaflet loads is a known Java 21 stability measure. Do not remove or reorder it without reproducing and understanding the original rendering/flicker problem.
Autoanswer / beacon safety
- Prevent automated-message loops.
- Respect the established minimum interval/cooldown logic.
- Do not consume a cooldown for a reply that is rejected before a complete valid TX item is queued.
- Preserve priority of frequency/QRG requests where established.
- Cooldown identity must not accidentally collapse unrelated callsign/category identities.
- Treat the current implementation/tests as the source of truth for exact message markers and timer details.
Build and verification
Use the Maven wrapper.
Windows:
.\mvnw.cmd ...
Read the current pom.xml before relying on version numbers.
At the package creation snapshot the project uses Java 21 / JavaFX 21.x and JUnit 5/Mockito, with PMD and SpotBugs integrated.
Important: Maven/Surefire configuration has historically allowed test failures to be ignored, and static-analysis findings may not fail the build. Therefore:
- inspect the Maven test summary;
- inspect Surefire results when needed;
- do not infer "all tests passed" from exit code 0;
- report PMD/SpotBugs findings that are visible in the relevant build.
Run focused tests first, then normally the relevant broader test/build command for the scope.
Documentation and durable project context
Use $software-project-context, $kst4contest-documentation, and $praktimarc-writing-style as relevant.
Do not perform a full manual or website audit after every implementation.
After a completed change:
- perform a short documentation-impact classification;
- if user-visible behaviour is plausibly affected, search only the relevant German and English manual sections under
github_docs/; - keep both language versions semantically aligned when an update is required;
- check README and website feature text only when the changed feature/configuration is represented there or is likely to need representation;
- identify screenshots that are likely stale instead of fabricating replacements;
- update
docs/PROJECT_CONTEXT.mdfor significant architectural, protocol, state/persistence, operational, integration, deployment, workaround, or long-lived behavioural decisions; - keep
Related Projects / Integration Pointscurrent when KST4Contest, its website, hamradioonline infrastructure or planned propagation services affect one another.
A full documentation audit is reserved for explicit audit requests, major release preparation, broad UI/workflow changes, or evidence that documentation is broadly stale.
Website
The repository contains an Eleventy-based website under website/ with its own tests/build logic.
Do not assume website deployment/update-feed details; inspect current scripts/workflows before changing them.
Change scope and Git
- No unrelated refactoring.
- No production dependency without prior approval.
- No automatic version bump.
- No commit/push/merge/tag/release/deploy without separate explicit authorization.
- Preserve deliberate test data and easter eggs unless explicitly changed.
- Never overwrite unrelated working-tree changes.
Completion
After implementation, report in German:
- understanding fulfilled;
- changed files;
- important design decisions;
- tests/builds and exact results;
- documentation-impact classification;
- manual/website/README/context updates made or why none were necessary;
- related-project impact when relevant;
- remaining uncertainty;
- suggested next action, without performing it automatically.