Bugs
Newest first. Real bugs only — something caused a wrong behavior or exception and needed a code or config fix. A couple of operational mistakes with no code change are kept here too, marked as such, when the lesson matters.
2026-08-17 — Documentation site clean-URL routing
Clean URLs (/documentation/architecture) weren't resolving — the handler only special-cased the exact landing route for .html appending, not generically based on whether the requested path's last segment lacked an extension. Fixed: append .html whenever the last URL segment has no extension of its own (so /documentation/style.css still resolves as-is). Confirmed via curl across every route before/after.
2026-08-17 — Binary incompatibility across a package refactor (operational lesson)
After reorganizing rk.client's flat root package into subpackages, RKFramworkTest.jar (compiled against the old RKClient.jar) threw NoSuchMethodError on getBackendClient() — even though its own source never named the changed return type. Java bakes exact types into compiled call sites. Lesson: any dependent plugin needs a fresh recompile after a package move, source changes or not.
2026-08-17 — Stale-jar deployment sequencing (operational lesson)
Manually deployed an already-updated dependent plugin (RKFramworkTest.jar, referencing new rk.client.events classes) while the matching RKClient.jar update was still sitting unapplied in Updates/. Rising World's plugin loader failed its whole-batch class-resolution pass (NoClassDefFoundError, "Loaded 0 plugins!"), disabling every plugin including RKUpdater itself before its own update-apply logic got a chance to fix it. Fixed by replacing the stale active jar directly. Root cause of the decision to retire manual jar-copying entirely in favor of RKDev's real updater-lifecycle participation.
2026-08-16 — Manifest Class-Path line wrapping
A continuation line's leading space is a strip-only marker per the jar manifest spec, not a separator — the actual separating space needs to be at the end of the previous line. Got this backwards on the first pass, silently mashing sqlite-jdbc.jar, RKPackets.jar, and RKUpdatePackets.jar into one unresolvable path. Caused two real startup failures (NoClassDefFoundError for gson, then No suitable driver found for sqlite) before being root-caused and fixed.
2026-08-17 — Weather event "admin command" investigation — resolved, not a bug
WeatherChangeEvent appeared not to fire at all during active testing. Root cause: it only fires for Rising World's own natural weather cycle, never for admin/console-forced /weather commands — confirmed with ~7hrs of unattended overnight uptime (24 clean natural firings, zero from ~6 forced-command attempts). Contradicts the general javadoc wording but is real, repeatable engine behavior on this server. Not a code issue — natural cycling is the only trigger that matters for actual gameplay.
2026-08-15 — BackendClient reconnect storm
A rejected handshake (unknown server uid, wrong password) never engaged the retry backoff — rejection isn't an IOException, so the client reconnected instantly, capable of flooding the backend with hundreds of rejected handshakes/sec. Fixed: read the handshake response before marking the connection live; backoff now applies to any failed attempt, not just a dropped connection. Companion fix: backend-side ConnectionThrottle as defense-in-depth.