Performance
Targets
Section titled “Targets”- 2,000 active player states
- 500 scans/second sustained, 2,000/second bursts
- Chat scan latency: median ≤ 1 ms, p99 ≤ 5 ms
Hot-path design
Section titled “Hot-path design”The scan path does no database, file, YAML, list-parsing, network, GUI, or regex-compilation work. It uses:
- immutable atomic engine snapshots (lock-free reads);
- a sparse Aho-Corasick automaton for literals;
- precompiled RE2/J rules with bounded inputs and match counts;
- early rate-limit rejection and bounded histories, caches, and queues;
- a fixed logarithmic latency histogram (no extra metrics dependency).
No Bukkit objects are retained beyond the listeners. Surface adapters only build context objects and apply the returned decision; warnings, alerts, events, kicks, sounds, commands, and persistence are scheduled off the scan.
Surface input bounds
Section titled “Surface input bounds”| Surface | Limit |
|---|---|
| Chat | 512 code points |
| Commands | 2,048 |
| Sign lines | platform max, 4-line cap |
| Book pages | 1,024 each, 100-page cap |
| Anvil | platform rename max |
| Custom API | 4,096 |
Budgets and gates
Section titled “Budgets and gates”- Default automaton ≤ 5 MiB; player-state memory ≤ 64 MiB for 2,000 actors.
- No unbounded heap growth; no queue drops at sustained target load; no main-thread database stalls.
- Development jar ≤ 16 MiB; final release jar ≤ 14 MiB after ProGuard.
Use /daisyfilter status for live p50/p95/p99 timings, throughput, active actor
states, and queue counters.