The migration wedge
Change the bot.
Keep the history.
Guardy reads the public MEE6 leaderboard directly, stages the complete result, and stops for review before one leaderboard row changes. A pasted MEE6 JSON response is the 8 MB fallback. Accepted XP is preserved and familiar levels are recomputed independently.
Three controlled steps
01 / CONNECT
Make the MEE6 leaderboard public
Enable public leaderboard visibility in MEE6, then start the direct API import for the server you administer. If that API path is unavailable, use a captured MEE6 leaderboard JSON response as the file fallback.
02 / PREVIEW
Review counts and parity
The wizard validates rows, duplicates, identifiers, XP bounds, and expected levels, then shows exactly what will change.
03 / IMPORT
Commit once, with a rollback boundary
A transactional apply preserves current history on failure and records the member privacy notice after a successful migration.
Real local walkthrough · synthetic data
See the review boundary before you use it.
These screens come from the local Guardy Dev dashboard using a documented synthetic 12-member MEE6 fixture. They contain no real member identifiers.

1. Choose the source and merge rule. Use the direct public-MEE6 reader by default, or switch to the file fallback; then choose Replace or Keep the higher XP. 
2. Select the fallback file. The example uses the synthetic marketing_demo.jsonMEE6 response. Guardy reads it into staging and does not retain the raw upload.
3. Inspect parity before mutation. All 12 synthetic members are visible, and the exported level agrees with the independently calculated Guardy level row by row. 
4. Confirm one transaction. The final dialog names the member count, says file-source reward roles are excluded, suppresses level-up messages, and deletes staged rows only after a successful apply.