LumoAiDetector v0.1.0 - Stability, security, and sanity
Changelog
What changed Threading is no longer aspirational. The old code had
ScheduledFuture fields with no visibility guarantees, shared
DecimalFormat instances, a
BufferedWriter that got replaced mid-write, and
computeIfAbsent called from concurrent paths without a
ConcurrentMap. Every one of those caused data corruption or silent drops under load. All of them are fixed.
Model training no longer blocks your entire server. It now runs on a dedicated
trainExecutor thread pool. You can train a fifty-tree model on fifty thousand rows without timing out the main thread.
Recording stops when the server stops. Not after. There is a proper shutdown hook now. Your last session will not be truncated.
Dates are UTC everywhere. Not JVM default, not Moscow time, not whatever the hosting provider configured. UTC.
New features [*]
/lad models info <name> - see accuracy, precision, recall, and F1-score for any model
[*]
/lad dataset info - row counts by class, file size, skipped rows
[*]
/lad check history <player> - replay recent check results for a player
[*]
/lad record stop all - stop every active recording session at once
[*] Command aliases -
active works like
modelactivate,
deactivate like
modeldeactive,
delete like
modeldeleted. Old names still work.
[*]
max-dataset-rows in config.yml - cap the dataset size before it eats your disk
[*] Build scripts -
build.ps1 for Windows,
build.sh for Linux
Bug fixes [*] Fixed
Location.subtract() mutating the entity's actual position in the world. The detector was not just reading location data, it was moving the player.
[*] Fixed
SimpleDateFormat breaking under concurrent access from multiple threads.
[*] Fixed
ScheduledFuture field visibility across threads. The cancel method was sometimes running on a null handle.
[*] Fixed
DecimalFormat instance shared across threads without synchronization.
[*] Fixed
BufferedWriter being replaced mid-recording, losing buffered data.
[*] Fixed
catch(Throwable) masking
OutOfMemoryError and other serious JVM problems.
[*] Fixed reader and serializer streams not closing when constructors threw.
[*] Fixed
PluginSettings field not visible across threads on reload.
[*] Fixed GCD calculation producing negative values for large tick differences.
[*] Fixed dataset row limit not being enforced during recording.
[*] Fixed label change warning message being untranslated.
[*] Fixed
RuntimeStateService returning stale cached state after state transitions.
[*] Fixed
/lad models info with no argument causing a
StackOverflowError from infinite recursion.
[*] Fixed recordings not stopping cleanly when the server shuts down.
Security [*] SHA-256 hash verification for all downloaded model files
[*] Path traversal prevention - model names containing
.. or
/ are rejected
[*] Model name length limited to 64 characters to prevent filesystem abuse
What you do to upgrade [*] Replace the jar
[*] Start the server
[*] That is it
The config file and dataset are backward-compatible. If you use the old command names in scripts or chat binds, they still work - the aliases are transparent.
License Apache License 2.0. Do not remove my name or reupload as your own. If you fork it, use a different name and mention the original. Full terms in the LICENSE file.