Plugin policies
# config/meowmc-plugin-policies.yml
default: auto # auto | pinned | regionized | agnostic
packet-listener-dispatch: global-region # for pinned plugins: hop listener invocation to the
# global region, one hop per packet, pinned only
enforcement: inherit # inherit | off | log | throw
plugins:
Essentials:
tier: pinned
reason: "scoreboard + global economy state"
GrimAC:
tier: regionized
reason: "verified, see compat matrix 2026-10"
MyUnmarkedMinigame:
tier: regionized
enforce-thread-checks: true
verification-mode: throw
meowmc-plugin-policies.yml is the administrator-side view of plugin thread
compatibility. It carries no _version: it is keyed by plugin name, has no
nested versioned schema, and an empty or unmodified plugins: block changes
nothing on the server.
Nothing reads this file yet
The policy classes exist and the file loads, but no code resolves a plugin through it — the file documents the intended policy only. Treat it as documentation of the tier model, not as a setting that takes effect.
The top-level defaults
| Key | Default | Values | Notes |
| --- | --- | --- | --- |
| default | auto | auto \| pinned \| regionized \| agnostic | What a plugin with no entry is treated as. auto resolves through the threading-profile collector if available, else the plugin's own declaration, else pinned. |
| packet-listener-dispatch | global-region | — | For pinned plugins only: hop packet-listener invocation to the global region, one hop per packet. |
| enforcement | inherit | inherit \| off \| log \| throw | The enforcement default overridable per plugin. inherit takes the value from exec.threading.enforcement. |
Per-plugin entries
Keyed by plugin name, with three fields:
| Field | Required | Notes |
| --- | --- | --- |
| tier | yes | pinned \| regionized \| agnostic (or the tier set the default allows). |
| reason | no, but strongly recommended | Why. A tier assignment with no reason cannot be audited: the next operator to read the file cannot tell a verified compatibility claim from a guess. |
| enforce-thread-checks | no | Opt the plugin into hard thread checks. |
| verification-mode | no | throw makes a thread violation a hard failure for this plugin. |
Why this file exists, and what it replaces
The shape is deliberately not a blanket rule: enforcement is aimed at the
plugins that need it most, not applied to every plugin on the server. A
keyed-by-name entry replaces the earlier pinned-plugins: [] /
regionized-plugins: [] list keys — a list cannot carry a reason, and a reason
is what makes a tier assignment auditable.
How it relates to exec.threading
The policy file is the per-plugin view;
exec.threading.default is the unmarked
plugin view; exec.threading.enforcement floors with the execution tier
rather than the file. Enforcement is the strongest of the configured,
tier-implied and per-plugin values.