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.
33 lines
2.0 KiB
Markdown
33 lines
2.0 KiB
Markdown
# §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:**
|
||
- `a29571d` feat(api): reclaim squatted usernames for Mojang-priority players (§B3, 正版优先) — `POST /internal/player/reclaim` bars 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 check
|
||
- `fdb6efb` feat(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 migrate` command has its own doc ([felis-migrate-command](2026-07-05-felis-migrate-command.md)).
|