ServerDoctor v0.9.2
Two new analysis scanners — plugin compatibility assessment and historical performance
regression detection — both running automatically on Paper/Folia, Velocity and BungeeCord.
✨ Added
Compatibility scanner
- New
CompatibilityScanner(core) that assesses each plugin against the running server and
aggregates the signals into a transparent 0–100 risk score. - Runtime signals (no network): declared
api-versionvs. the server's Minecraft version
(Paper/Folia), whether Folia support can be confirmed, and enabled state. - Optional external metadata feed (
compatibility.metadata, off by default) adds release
age, a Folia yes/no flag and known incompatibilities — honest by design: this data comes from
a feed you/the community maintain, never fabricated. - Score → severity:
<15OK ·15–39LOW ·40–69MEDIUM ·70–89HIGH ·≥90CRITICAL. - Runs on all platforms; on proxies the Minecraft-version/Folia signals are skipped.
PluginInfogained anapiVersionfield (populated by the Paper adapter from plugin.yml).
Historical regression detection
- New
RegressionScanner(core) that compares the older half of stored performance snapshots
against the newer half to detect gradual regressions in TPS, MSPT and RAM — catching
slow decline over days/weeks, not just spikes. - Uses only data already persisted, via an injected
PerformanceHistory
(limit -> storage.performance().recent(limit)). - Runs on all platforms; on proxies TPS/MSPT (NaN) are skipped while RAM is still compared.
- Thresholds: TPS drop ≥8 %, MSPT rise ≥25 %, RAM rise ≥30 % (with HIGH/CRITICAL tiers);
needs ≥8 stored samples. Example finding:
Performance regression vs baseline: TPS 19.8 -> 18.4 (-7%); MSPT 14.0ms -> 23.0ms (+64%).
Both scanners surface in /serverdoctor report, the GUI, the REST /report endpoint and
webhooks (which fire on state change, so a persisting issue isn't spammed).
🔧 Changed
ServerDoctorCore.bootstrapnow accepts a singleScannerSourcesobject bundling the optional
advisory, compatibility and performance-history sources. The previous overloads
(bootstrap(platform),…, AdvisorySource,…, AdvisorySource, CompatibilityMetadataSource)
are kept and delegate to it — no caller is forced to change.PluginInfogained a 7th componentapiVersion; the prior 6-argument constructor is retained
(delegates with an empty api-version), so existing adapters, tests and the REST serializer
compile unchanged.
📦 Setup (new optional config)
compatibility:
metadata:
enabled: false
feed-url: "" # HTTPS feed (see compatibility.sample.txt)
refresh-minutes: 1440Regression detection needs no config — it works once PerformanceHistory is wired into
bootstrap (one line per platform; storage must be opened before bootstrap). Both scanners are
registered automatically; unwired optional sources simply stay quiet.
Full Changelog: v0.9.0...v0.9.2