MailboxGUI 6.1.0: Resource and Edition Upgrade Safety

Before upgrading
Stop the server and back up the complete plugins/MailboxGUI folder,
the installed plugin JAR, and any external database used by the plugin.
Keep a consistent backup of both configuration and mail data. Do not
run Free and Premium JARs together. Replace the edition JAR while the
server is stopped, retaining the same data folder and storage settings.

Legacy network to Premium
For a 5.0.0-5.1.1 network upgrade, stop every backend sharing the
MailboxGUI database before migrating. Older backends do not participate
in the new migration locks and must not write while data is upgraded.
Back up the shared MySQL database and each backend's complete plugin
folder. Retain storage.mysql settings and network/config.yml, including
Redis credentials and each backend's unique server ID. Start one upgraded
Premium backend first, inspect its migration result and backups, then
upgrade and start the remaining backends. Do not enable multiversion
support until the same-version network is verified. Do not point an
empty replacement config at a different database or storage type.

Public Access terminology
Public Access Mailboxes and Public Access NPCs replace the former
Post Office labels. Legacy registration fields, SQL table names and
historical backup filenames remain readable; do not rename them manually.
The configuration upgrader preserves old settings while converting
post-office sections and %postofficename% to their current names. Stock
language text is refreshed, while owner-customized messages are retained.

Free to Premium
Retain config.yml, language/*.yml, gui.yml, sounds.yml and
scheduled-mail/scheduled-mail.yml. Do not delete them to obtain new
defaults. Keep owner translations, locale choices, enabled schedules,
database connection details and other configured settings. New defaults
are not a reason to reset an owner's configuration. Review startup
notices and backups after upgrading, then check a custom translation,
the selected locale, an existing mailbox and a disabled schedule before
enabling any new jobs. Premium-only configuration is edition-owned.

Message-rule locale refresh
The resource file-version remains 16 and config-version remains 13.
No schema bump is needed for these text changes. LanguageFileUpgrader
refreshes captured stock message-rule keys from the edition's bundled defaults
even when file-version is already 16. Missing keys use those defaults.
Existing message-rule values are refreshed only if
they exactly match a captured stock message-rule value or a matching
5.1.1 stock value (including copied English stock text). Custom values,
including empty strings, are retained. The existing backup and atomic
write path saves the merged result without resetting the language file.
Unchanged files are not rewritten. The language/legacy/message-rules
resources are comparison references, not owner-facing language files.
The general language upgrader also adds missing keys for the installed
edition and performs historical migrations. A final exact-stock
guard restores any non-stock owner message changed by a historical
heuristic. Owner-defined extra message keys are retained. Invalid YAML
is logged and retained rather than overwritten with bundled defaults;
fix the original file and reload. Control-character sanitation remains
available only when the sanitized file can be parsed successfully.

Message rules
Paper letters and optional package, COD package and money messages
share the common API MailMessageRules limits: 256 visible characters,
28 visible characters per wrapped line, 17 body lines and at most 16
manual line breaks. The message heading is separate from those 17 body
lines. Legacy color/format codes are preserved and are not counted as
visible characters. /n inserts a manual line break; //n displays literal
/n. Actual LF line breaks are accepted and share the manual-break
budget. Wrapping can reach the body-line limit before the character
limit; all limits apply together. Book Letter pages use separate book
limits. Preserve YAML keys, placeholders, IDs and the /n and //n syntax.
Command-syntax locale settings select registered aliases separately from
message text; English commands remain accepted. Do not invent command
translations by editing help messages or change executable identifiers.
Localized prose may be edited.

GUI and inbox foundation
gui.yml is generated and loaded only with gui-customization.enabled.
When disabled, an existing gui.yml is retained and ignored. Appearance
overrides do not change mail actions, layouts, permissions, or mandatory
inbox session/claim protection. Shared controls have one setting per
purpose; package/money display variants are independent. Paper/book
letters inherently contain messages and expose base/expiration appearances
only. Physical new-mail appearance overrides change the item material
and supported metadata, never its saved mailbox location, spawn anchor,
refresh timing, visibility rules or unchecked-mail lifecycle.
Keep the separate paper-letter and book-letter sending settings: each
player command requires its type's player enable flag and command flag.
Admin tools/commands have their own type-specific gates; disabling new
player sending does not prevent managing already-delivered letters.

Scheduled examples
The bundled scheduled-mail map is empty. Four disabled, commented
examples show paper, package, COD and money messages with /n; one also
shows //n. Examples are not installed over an owner's existing tasks.
Use actual LF with a YAML |- block scalar when needed; the strip marker
avoids an unintended trailing line break. Validate dates, timezone,
recipients and prices before enabling a task. Old example dates are
illustrative; catch-up-missed may immediately deliver overdue tasks.

Rollback and verification
Restore the complete matching backup when rolling back; replacing only
the JAR is not a mail-data rollback. Do not change storage or downgrade
editions as part of a locale refresh. Check locale audits and focused
resource tests before release; translation audits verify structure and
syntax, not native-speaker review or live server migration behavior.
