3 releases, newest first.
plugins/.Sn-License/license.yml.Fix round from the first live smoke test on Gens-Dev. Chasing a LuckPerms failure uncovered a much larger defect than the one reported.
H2 was shaded and relocated. An MVStore file stores the fully-qualified org.h2.* DataType class names inside the file and resolves them with Class.forName, so a relocated driver dies with ClassNotFoundException: org.h2.mvstore.tx.VersionedValueType$Factory on the first page read. Reproduced against the shipped 0.12.0 jar: it cannot read a single foreign H2 store, of either format. The names come from data, so no shade configuration can fix it. Nothing caught it because our own tests only ever opened stores our own relocated driver had created.
Both H2 2.1.214 and 2.3.232 now ship unrelocated as drivers/ resources, each loaded in a private URLClassLoader parented to the platform loader, routed by the store's own MVStore header. Two versions are required: the format changed between H2 2.1 (format:2, what LuckPerms writes) and 2.2+ (format:3), and neither reads the other's files. Verified through the built obfuscated jar against a real 16 MB LuckPerms store: 49578 rows.
snbans_logins PRIMARY KEY(uuid, ip), both accounts seen from one IP) no longer fails the whole store. The table runs in a savepoint and, on a duplicate-key violation only, retries row by row. A colliding row is left entirely under the old identity, never as a hybrid with the old uuid and the new name.address / db-name / user-name vocabulary, address: host:port split, storage-method as a backend selector.enabled / use / active: false), so a disabled MySQL block is no longer connected to and timed out on.scan.excluded-plugins will not pick up its new defaults on an existing install: key auto-merge only adds missing keys and must never overwrite a chosen value, and 0.12.0 wrote excluded-plugins: []. Delete that line from plugins/SnUserTransfer/config.yml or set it to [".paper-remapped", ".Sn-License"].
SHA-256 706ec92f73927a55d2145bed63d9d5d5a03da2db4555e895abf10a6682504b35
Development release. Not v1.0.0, and not recommended for a production migration yet.
Output of a full safety audit of the transfer and undo paths: 59 findings fixed across four rounds, with independent blind verification of every fix.
friend_uuid can no longer remove other players' rows.transfers.log.snusertransfer.* instead of sntransfer.*. The command and its aliases (/sntransfer, /snt) are unchanged. Re-grant any rank that previously had sntransfer.*.--uuid on preview and apply. On an online-mode server, a target account the server has never seen is now refused rather than migrated to a UUID derived from its name, which would have belonged to no account. Pass the real UUID, or let the account log in once. Offline-mode servers are unaffected.preview before apply, and read the omission lines: they list every store the tool decided not to touch and why.