Plugin identity: GrimsShop Java package: com.evergrims.grimsshop Declared main: com.evergrims.grimsshop.GrimsShopPlugin
Every reported occurrence goes through the plugin logger in this exact shared format:
[EGW-WATCH][plugin=GrimsShop][rank=3][severity=ERROR][code=purchase][version=0.4.2] Error: A purchase of diamond_block by Grim failed and was rolled back; nothing was charged or delivered
code is a machine-readable operation identifier, sanitised to letters, digits, underscore, dot and hyphen. version is the installed plugin version. Header fields never contain a line break or a ], so a record can never be split or forged from a message body. Throwable causes and suppressed rollback failures stay attached to the log record; a failure without an exception does not invent a stack trace.
The literal Error: marker is on every rank, because Server Watch only queues a log block that carries error evidence. It does not mean every report is rank 3.
Four ranks
| Rank | Name | Meaning | Examples |
|---|---|---|---|
| 1 | NOTICE | An expected state change or rejection | None in 0.4.0 (the 0.1 catalogue move that used it is gone) |
| 2 | WARNING | A recoverable problem; the shop keeps working | An optional plugin that is installed and throwing, a Bedrock form that could not be built, an unreadable rotating-shops.yml during an ID check, 0.3.0 files 0.4.0 no longer reads, a broken message template, a currency with no economy provider, a levelled spawner its own plugin will not vouch for |
| 3 | ERROR | An operation failed or was refused | A trade rolled back, a rotation check, a restock, an editor or admin-command write, a default set or import that could not be put in place (and was undone), a Geyser head write, unreadable stock or rotation state |
| 4 | CRITICAL | Startup, shutdown, or a failed rollback | The plugin cannot start, the first-start defaults could not be written, config.yml or the shop files are invalid, a swap of sections/ and shops/ could not be undone, a refund or stock restore failed, shop.db would not close, a menu would not close at shutdown |
Ranks 1–2 use Java WARNING (Paper WARN) so the Paper watcher captures them; ranks 3–4 use SEVERE (Paper ERROR). Read the rank field rather than Paper's level: rank 1 is deliberately far less serious than rank 4.
Repeats
A repeated rank 1–3 fault is logged once and then counted. The next report after a five-minute quiet window carries (and N further occurrences since the previous line), so a player clicking a broken listing a hundred times produces a handful of lines rather than a hundred. Reports are throttled per code, and per listing where that matters, so two different broken listings never silence each other.
Rank 4 is never throttled. A failed refund or a failed stock restore can leave money or items in the wrong place, and every occurrence is its own incident that someone has to put right by hand.
/shop reload, /shop admin defaults, /shop admin import and in-game edits clear the error counters. Automatic reloads after content or gameplay plugins load preserve the counters, so a restart does not post the same errors twice. Changes to missing custom IDs and catalog warnings are reported separately.
Codes
| Rank | Code | What happened |
|---|---|---|
| 2 | audit-log | The trade went through but the audit row could not be written |
| 2 | bedrock-icons | The bundled Bedrock picture table could not be read |
| 2 | catalog-warning | The shop files loaded with warnings; /shop validate lists them all. This includes a custom: id its plugin does not know, and one line per custom-item plugin that is not installed |
| 2 | client-checker | GrimsClientChecker is installed and could not be read; chest menus are used |
| 2 | config-read | config.yml could not be read; the previous settings are kept |
| 2 | currency-unavailable | A currency has no working economy provider, so its listings show no buttons |
| 2 | currency-vault-fallback | A VaultUnlocked currency was named but only classic Vault is registered |
| 2 | floodgate-api | Floodgate is installed and could not say whether a player is on Bedrock |
| 2 | legacy-layout | presets/, shop-sections.yml or shops.yml from 0.3.0 is still in plugins/GrimsShop; 0.4.0 does not read them and moves or deletes nothing. Once per start |
| 2 | levelled-spawner-unavailable | A listing sells a GrimsSuperSpawners spawner that plugin will not vouch for, so its buy buttons are hidden |
| 2 | plugin-item-unavailable | An EGW plugin that makes shop items (fishin:, discoveries:, chests:, backpacks:, jukeboxes:, wifi:, crops:, spawners:) is not running, so the buy buttons of every listing that sells one are hidden until it is. Once per plugin, naming one of its listings |
| 2 | rotating-shops-read | rotating-shops.yml could not be read during an ID clash check |
| 2 | shutdown-rotation-task | The rotation check task would not cancel at shutdown |
| 2 | silkspawners-api | SilkSpawners is installed and could not be read; spawners trade as the shop holds them |
| 2 | skull-read | The Geyser skull file could not be read, so heads may be written again |
| 2 | staging-delete | A .staging-defaults or .staging-import folder in plugins/GrimsShop could not be deleted after the first start, /shop admin defaults or an import; it only holds staged copies and is cleared before its next use |
| 2 | superspawners-api | GrimsSuperSpawners is installed and could not be read; its spawners are read from their own tags |
| 2 | touch-form-simple / touch-form-modal / touch-form-prompt | A Bedrock form could not be built; that player gets the chest menu |
| 2 | vault-currency-list | VaultUnlocked's provider could not list its currencies |
| 2 | message-template | A messages.yml template is not valid MiniMessage and is shown as plain text |
| 3 | admin-command | A /shop admin command could not be written to disk; nothing changed |
| 3 | catalog-left-out | A section (sections/<id>.yml), its stock file (shops/<id>.yml) or one item had an error (an ID clash, a bad file name, a broken entry, an unreadable file, an unknown parent or currency) and was left out; everything else is open and /shop validate lists them. Nothing inside a section switched off with enabled: false is reported, not even a stock file that is not valid YAML, except a sub-section's own file that can't be read safely (not valid YAML, a key written twice, a bad or clashing name), since then its parent is unknown |
| 3 | custom-items-reload | An automatic reload after content or gameplay plugins loaded found errors in the shop files. The last good version keeps running. |
| 3 | defaults-swap-failed / import-swap-failed | /shop admin defaults or /shop admin import failed part-way while putting the new sections/ and shops/ in place; every step was undone and nothing changed. Rank 4 when undoing failed too: the old folders are then in the backups/ folder the report names |
| 3 | editor-save | An in-game edit could not be written; the files were rolled back |
| 3 | menu-click / menu-close | A shop menu button or close handler threw |
| 3 | purchase / sale | A trade failed and was rolled back; nothing changed hands |
| 3 | plugin-item-sale | A purchase of an item an EGW plugin makes was refused before anything was charged: the plugin failed while making it (its exception is attached), no longer knows the id, or had stopped. Once per listing |
| 3 | quick-sell / quick-sell-payout | Quick-sell failed; items were handed back or restored |
| 3 | restock | A restock failed part-way through |
| 3 | rotating-shop-read / rotation-countdown / rotation-load / rotation-tick | Rotating shop state could not be read, loaded or advanced |
| 3 | rotation-command | An admin's advance/reset left the lineup unchanged |
| 3 | shop-forget | A deleted shop's rotation state and stock could not be removed |
| 3 | sections-folder | The sections/ folder could not be listed, so every section is left out until it is readable |
| 3 | shops-folder | The shops/ folder could not be listed, so every section's items are left out until it is readable |
| 3 | skull-write / skull-write-now | Shop heads could not be written to Geyser |
| 3 | stock-read | A listing's remaining stock could not be read, so it counts as sold out |
| 3 | superspawner-generate | Spawner listing generation was aborted; no listings were saved |
| 4 | catalog-invalid / config-invalid | The shop stays closed until the files are fixed and /shop reload is run |
| 4 | defaults-write-failed | The first start (no sections/ and no shops/) could not write the every-block set; the shop opens with no sections. Fix the cause and restart, or use /shop admin defaults |
| 4 | database-close | shop.db would not close; stock and rotation state may not be flushed |
| 4 | menu-shutdown-close / shutdown-menus | A menu would not close at shutdown; what it held may not have been returned |
| 4 | messages-bundled | The built-in messages.yml could not be read from the jar |
| 4 | quick-sell-rollback | A failed payout could not be taken back; the player keeps money and items |
| 4 | refund | A player could not be refunded after a failed purchase |
| 4 | shutdown-skulls / skull-write-shutdown | The pending Geyser head batch was lost at shutdown |
| 4 | startup | GrimsShop could not start and disabled itself |
| 4 | stock-rollback | Stock could not be restored after a failed purchase; the count is now too low |
Coverage and boundaries
Commands, menu clicks and close handlers, scheduled rotation checks, every trade path, quick-sell, the in-game editor, the config and catalogue loaders, the Geyser head writer and the optional-plugin hooks (the EGW plugins that make shop items among them) have ranked failure boundaries. Shutdown attempts every step even after one fails, and reports each failure separately.
These are normal states, not hidden failures, and are deliberately not reported:
- An optional plugin that is simply not installed — SilkSpawners, GrimsSuperSpawners, GrimsClientChecker,
Missing optional integrations such as Floodgate, Geyser, Vault or Packforge are not themselves errors. An installed integration throwing an error is reported. A shop entry naming an unavailable custom-item provider produces a catalog warning.
- A custom item whose provider is installed but still loading stays pending until the provider is ready.
it registers its items service, an EGW plugin that enables after GrimsShop while the server starts). It is hidden, /shop validate counts it, and the shop reloads by itself once the plugin is ready; only an id that still does not resolve after that is a warning. An EGW plugin still not enabled at the first tick is one catalog-warning.
- Every
crops:item while GrimsCrops is enabled with no item table for other plugins (0.15.4 or older, or its service
not registered): one catalog-warning for all of them, not an error.
- A player typing an amount that is not a number, lacking permission, not holding enough of an item, or not
being able to afford something. These are answered to the player.
- A mob or level GrimsSuperSpawners refuses during generation. That is a refusal, counted in the summary the
admin who ran the command reads; a provider that breaks or returns the wrong item is rank 3 instead.
- Asking an item's data container for a key as the wrong type, which is how each type is tried in turn.
- Importer findings.
/shop admin importhas its own report of everything skipped or changed, shown to the
admin running it, because an import is a one-off review rather than a running fault.
Hard process termination, a failure before the plugin can initialise, server log filters and other plugins' failures fall outside these boundaries. Untagged Paper reports must keep a fallback policy in Nixie rather than being discarded.
Register the new main class
The package changed in 0.2.4, so the identity has to be re-registered or Server Watch stops attributing this plugin's errors. As Nixie's configured owner, in the home Discord:
/project edit name:GrimsShop main:com.evergrims.grimsshop.GrimsShopPlugin
Use /project add with the same fields if it is not registered yet. Edit keeps the old main class by default, so servers still on 0.2.3 stay recognised. Then run /nixie watch sync in Minecraft or nixie watch sync on the console, and check /project status.
The local fallback identity, for a server that is not using the central registry, is in ASKNIXIE-IDENTITY.yml. Merge it into the existing server-watch.plugin-identities block rather than replacing the other entries.
Enable every alert rank
Nixie alerts ranks 3–4 by default. To include the quieter ones:
/serverwatch rank rank:1 enabled:True /serverwatch rank rank:2 enabled:True /serverwatch ranks
These are owner-only global switches. Server Watch also has to be enabled, the server linked and its watch forum configured, and the new main class accepted. This release changes nothing in your registry or alert settings by itself.
What has been checked
DiagnosticsTest asserts every rank against the exact ENVELOPE pattern from Nixie's own watch_severity.py, including that rank and severity agree (Nixie discards a record where they do not), that the cause stays attached, that a forged header in a message, code or version cannot escape its field, that repeats are counted rather than flooded, and that rank 4 always repeats. The hook and spawner-generation tests assert their real records carry the right rank and code.
This proves the format, the rank routing and the throttle locally. It does not prove delivery on a deployed server: Nixie's own queue bounds, expiry, deduplication, rank switches and network availability still govern whether a report reaches Discord, and the full plugin log remains the evidence source.