Retroactively author 15 grouped detail docs covering the backend functional (feat/fix) commits made before the change ledger was established (fad48ff), closing the ledger's detail-doc axis for the pre-convention history. Each doc groups a feature's constituent commits, lists their SHAs with subjects, and carries a backfill note stating it was reconstructed from git history on 2026-07-07 and not independently re-verified (current tree green at9911b8c). Add a Detail docs section to INDEX.md linking every detail doc (the 6 existing + 15 backfill) to the commit(s) it covers, so a doc is findable from the index without a column on the auto-generated ledger table. Catch the table up with the missing9911b8crow. Scope: backend (Go/Java/K8s) only, per the ledger's stated convention that frontend/panel commits are the collaborator's UI work; non-functional commits (docs/style/chore/refactor) keep their table row without a dedicated detail doc.
2.0 KiB
§B3 username-collision reclaim + account migration (ledger backfill)
- Type: feature — retroactive ledger entry
- Date: 2026-06-27 – 2026-07-05
- Area:
internal/api(internal-face reclaim/blacklist, account migrate),internal/store(migration 0006) - Commits:
a29571dfeat(api): reclaim squatted usernames for Mojang-priority players (§B3, 正版优先) —POST /internal/player/reclaimbars the squatter UUID + stashes its data (30-day hold) in one transaction, idempotent, returns the first reclaim's expiry;GET /internal/player/blacklist/{mc_uuid}is the login-gate checkfdb6efbfeat(account): migrate a live account's owned servers to a new account (§B3 inherit)
- Tasks: #30 (B3 game-login + username-collision reclaim)
What it did
Built the data layer of the Mojang-priority collision flow: when the configured
third-party Yggdrasil and official Mojang issue the same username under different UUIDs,
the non-genuine squatter is displaced in favour of the real Mojang owner. Both tables are
keyed by mc_uuid, so the genuine player — identical username, different UUID — is
never caught by the bar. fdb6efb adds the inherit half: migrating an existing account's
owned servers onto a new account.
Why
Two players cannot hold one username across two Yggdrasils; the spec resolves it in the
genuine Mojang owner's favour with a 30-day data hold for the displaced squatter, told the
truth about how long their data is kept (the first hold's window, never a fresh now()+30d
on retry).
Backfill note. Reconstructed 2026-07-07 from the commit history. Handlers + the in-memory repo contract were unit-tested at each commit; the Postgres SQL path is integration-only, and the velocity collision-routing / limbo prompt / authlib dual-backend are code-only (Java) and out of this data-layer slice. Not independently re-verified for this doc; current tree green at
9911b8c. Related: the operator-facing/felis migratecommand has its own doc (felis-migrate-command).