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-version vs. 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: <15 OK · 15–39 LOW · 40–69 MEDIUM · 70–89 HIGH · ≥90 CRITICAL.
[]Runs on all platforms; on proxies the Minecraft-version/Folia signals are skipped.
[]PluginInfo gained an apiVersion field (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:
Code (Text):
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.bootstrap now accepts a single ScannerSources object 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.
[]PluginInfo gained a 7th component apiVersion; 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)
Code (YAML):
compatibility:
metadata:
enabled
: false
feed-url
:
""
# HTTPS feed (see compatibility.sample.txt)
refresh-minutes
: 1440
Regression 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:
https://github.com/Shvquu/server-doctor/compare/v0.9.0...v0.9.2