MeowMC

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.