From f3c4c292834632725c3956e2a17262483e5ed6df Mon Sep 17 00:00:00 2001 From: Sirac Ozmen Date: Tue, 3 Nov 2026 22:12:37 +0300 Subject: [PATCH 1/2] docs(conventions): dispatch console lines globally and give wildcards children Twenty plugins wired the [console] sink straight to dispatchCommand, which Folia refuses off the global region. Four admin.* wildcards had no children, and content-built nodes (a skill, a pass premium) were undeclared and so held by every op. --- docs/internals/uxm-conventions.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/internals/uxm-conventions.md b/docs/internals/uxm-conventions.md index 5535f52..f27c73f 100644 --- a/docs/internals/uxm-conventions.md +++ b/docs/internals/uxm-conventions.md @@ -52,6 +52,7 @@ The plugin runs on Paper and on Folia, so there is no main thread to rely on. - Entity state is touched on that entity's scheduler, block and world state on the region scheduler of that location, global state (world time, broadcasts) on the global scheduler. - Database, file and network I/O run on the async scheduler, never on a region or entity thread. - An async task never calls the Bukkit API. It hops back with `scheduler.entity(...)` or `scheduler.region(...)` before it touches the world or a player. +- A command dispatched as the console, including the `[console]` action line, runs on `scheduler.global(...)`. Folia refuses it from a region or entity thread, so a sink wired straight to `dispatchCommand` throws and the line does nothing. - Shared mutable state is an immutable snapshot behind a `volatile` field, swapped whole, or a concurrent collection. No `synchronized` around Bukkit calls. - A cache that another server can change is refreshed through `DataSynchronizers` (see [Storage](#storage)). @@ -145,6 +146,8 @@ A word in `config.conf` is a defect, and a slot number in `messages/` is a defec - Exemptions: `.bypass.`, default `false`: `uxmchat.bypass.cooldown`. - Numeric limits: `.limit..`, the highest granted `n` wins, the configured default applies without one: `uxmhomes.limit.homes.5`. - Every node is declared in `paper-plugin.yml` with a description and a default, and every node the code checks is declared. `.admin` and `.*` parents group them. +- A wildcard node such as `.admin.*` lists every node of its family under `children`. Without them it grants nothing on a server whose permission plugin does not expand wildcards itself. +- A node built from content (a skill, a pass, a section) is declared by the plugin when it reads the file, with the default that content should have. Bukkit gives an undeclared node to every operator and to nobody else. - Permission checks go through one `Permissions` class of constants; no node string appears elsewhere. ## Placeholders From 376f0bd1731207c6a65ae8c3f791dc47414e29c9 Mon Sep 17 00:00:00 2001 From: Sirac Ozmen Date: Tue, 3 Nov 2026 22:29:13 +0300 Subject: [PATCH 2/2] ci: run the checks again under the corrected title