feat(stats): show the best move word per game variant #81
Reference in New Issue
Block a user
Delete Branch "feature/stats-best-move-word"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Replaces the single "best move" number on the statistics screen with a full-width per-variant breakdown: the highest-scoring play in each variant the player has played, drawn as game tiles (a wildcard shows its letter but no value), with words and scores right-aligned to shared edges. Empty variants are omitted.
What changed
account_best_movetable (PKaccount_id+variant) keeping the main word as JSON tiles{letter,value,blank}. Captured at game finish inbuildStats(blank flags taken from every placed blank — equivalent to reading the final board, since a placed tile never moves), upserted in the finish transaction, replaced only by a strictly higher-scoring play. Guest/honest-AI games still record nothing.GetStats+statsDTOexposebest_moves.StatsViewgainsbest_moves:[BestMoveView{variant,score,word:[BestMoveTile]}](trailing, backward-compatible); gatewayencodeStats+ UI codec updated; codegen regenerated.WordTilescomponent (board tile look, fixed px size);Stats.sveltedrops the single best-move card and adds the full-width per-variant card.Notes
max_word_pointsstill covers them numerically).Tests
mainWordTilesunit +buildStatsend-to-end (inttest) + gateway and UI codec round-trips (incl. a blank tile) + e2e. Full local suite green: build/vet/gofmt, backend+gateway+pkg unit, integration, UI check/test/build/bundle-gate/e2e (144).Replace the single "best move" number on the statistics screen with a full-width per-variant breakdown: the highest-scoring play in each variant the player has played, drawn as game tiles (a wildcard shows its letter but no value), with the words and scores right-aligned to shared edges. - backend: new account_best_move table (PK account_id+variant) keeping the main word as JSON tiles {letter,value,blank}; captured at game finish in buildStats (blank flags taken from every placed blank — equivalent to the final board), upserted in the finish transaction and replaced only by a strictly higher-scoring play. Guest/honest-AI games still record nothing. GetStats + statsDTO expose best_moves. - wire: StatsView gains best_moves:[BestMoveView{variant,score,word:[BestMoveTile]}] (trailing, backward-compatible); gateway encodeStats + UI codec updated. - ui: new WordTiles component (board's tile look, fixed px size); Stats.svelte drops the maxWord card and adds the full-width best-move card (catalogue order, empty variants omitted). - docs: ARCHITECTURE §9 + schema, FUNCTIONAL (+ru), UI_DESIGN. Tests: mainWordTiles unit + buildStats end-to-end (inttest) + gateway and UI codec round-trips (incl. a blank tile) + e2e.