Adv 2.0 L5f: misc fields (Title, TreasuresLocked, CraftsSucceeded) migration

Three player_meta columns (title TEXT, treasures_locked INT,
crafts_succeeded INT). MiscState struct + load/upsert/backfill/
projection helpers. Dual-write rides saveAdvCharacter alongside the L5e
death-state hook — Title is dormant, the other two already mutate at
sites that save.

Tests: TestPlayerMetaMiscStateBackfill_Idempotent,
TestLoadMiscState_FallsBackToAdvCharacter,
TestUpsertPlayerMetaMiscState_RoundTrip.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
prosolis
2026-05-09 11:35:41 -07:00
parent 45586eb697
commit df886ab86f
6 changed files with 206 additions and 1 deletions

View File

@@ -724,6 +724,11 @@ func saveAdvCharacter(char *AdventureCharacter) error {
if dsErr := upsertPlayerMetaDeathState(char.UserID, deathStateFromAdvChar(char)); dsErr != nil {
slog.Error("player_meta: death state dual-write failed", "user", char.UserID, "err", dsErr)
}
// Adv 2.0 Phase L5f — dual-write misc state (Title, TreasuresLocked,
// CraftsSucceeded). Same strategy as L5e — rides every save.
if msErr := upsertPlayerMetaMiscState(char.UserID, miscStateFromAdvChar(char)); msErr != nil {
slog.Error("player_meta: misc state dual-write failed", "user", char.UserID, "err", msErr)
}
return nil
}