feat: add sticky error-aware key mastery

Persist ranked-only mastery and use it consistently across progression, milestones, counts, and localized UI. Preserve mastery during history rebuilds, replay errors accurately, and generate replay-derived test profiles. Document the follow-up plan to remove the drill history cap.
This commit is contained in:
2026-08-12 01:09:52 -04:00
parent 0f8493eb02
commit 5daa644d3b
47 changed files with 2683 additions and 722 deletions
+17 -6
View File
@@ -319,13 +319,13 @@ milestones:
open_skill_tree: 'Stiskni [t] pro otevreni stromu dovednosti'
branch_complete_msg: 'Dokoncil jsi vetev %{branch}!'
all_levels_mastered: 'Vsech %{count} urovni zvladnuto.'
all_keys_confident: 'Kazda klavesa v teto vetvi je na plne jistote.'
all_keys_confident: 'Kazda klavesa v teto vetvi byla zvladnuta.'
all_unlocked_msg: 'Odemkl jsi kazdou klavesu na klavesnici!'
all_unlocked_desc: 'Kazdy znak, symbol a modifikator je nyni dostupny ve tvych cvicenich.'
keep_practicing_mastery: 'Pokracuj v cviceni pro budovani zbehlosti — az kazda klavesa dosahne plne'
confidence_complete: 'jistoty, dosahnes uplneho zvladnuti klavesnice!'
keep_practicing_mastery: 'Pokracuj v cviceni — az bude kazda klavesa zvladnuta,'
confidence_complete: 'dosahnes uplneho zvladnuti klavesnice!'
all_mastered_msg: 'Gratulujeme — dosahl jsi uplneho zvladnuti klavesnice!'
all_mastered_desc: 'Kazda klavesa na klavesnici je na maximalni jistote.'
all_mastered_desc: 'Kazda klavesa na klavesnici byla zvladnuta.'
mastery_takes_practice: 'Zbehlost neni cil — vyzaduje prubezne cviceni.'
keep_drilling: 'Pokracuj v cviceni pro udrzeni sve urovne.'
hint_skill_tree_continue: 'Otevrit strom [Jina klavesa] Pokracovat'
@@ -335,16 +335,24 @@ milestones:
unlock_msg_2: 'Dalsi klavesa ve tvem arsenalu!'
unlock_msg_3: 'Tvoje klavesnice roste! Tak drzet.'
unlock_msg_4: 'O krok bliz k uplnemu zvladnuti klavesnice!'
mastery_msg_1: 'Tato klavesa je nyni na plne jistote!'
unlock_msg_plural_1: 'Skvela prace! Pokracuj v rozvoji svych dovednosti.'
unlock_msg_plural_2: 'Dalsi klavesy ve tvem arsenalu!'
unlock_msg_plural_3: 'Tvoje klavesnice roste! Tak drzet.'
unlock_msg_plural_4: 'O nekolik kroku bliz k uplnemu zvladnuti klavesnice!'
mastery_msg_1: 'Tato klavesa je nyni zvladnuta.'
mastery_msg_2: 'Tuto klavesu mas v malicku!'
mastery_msg_3: 'Svalova pamet uzamcena!'
mastery_msg_4: 'Dalsi klavesa pokorena!'
mastery_msg_plural_1: 'Tyto klavesy jsou nyni zvladnuty.'
mastery_msg_plural_2: 'Tyto klavesy mas v malicku!'
mastery_msg_plural_3: 'Svalova pamet uzamcena!'
mastery_msg_plural_4: 'Dalsi klavesy pokoreny!'
# Adaptive drill intro overlay
adaptive_intro:
title: ' Vitejte v keydr! '
how_it_works: 'Jak funguje adaptivni cviceni:'
description: 'Zacinas s malou sadou nejbeznejsich odemcenych pismen. Cviceni generuje pouze slova, ktera pouzivaji tato pismena. Jak je pises s jistotou, nove klavesy jsou postupne odemykany, az zvladnes celou klavesnici.'
description: 'Zacinas s malou sadou nejbeznejsich odemcenych pismen. Cviceni generuje pouze slova, ktera pouzivaji tato pismena. Jak je zvladnes, nove klavesy jsou postupne odemykany, az zvladnes celou klavesnici.'
target_wpm_label: 'Cilovy WPM:'
target_wpm_desc: 'Ovlivnuje rychlost odemykani klaves — vyssi cile vyzaduji rychlejsi psani. 35 WPM je dobry vychozi bod, pokud si nejsi jisty. Toto muzes kdykoli zmenit v nastaveni.'
hint_adjust: 'Upravit WPM'
@@ -389,6 +397,9 @@ keyboard:
no: 'Ne'
in_focus_label: 'V zamereni?: '
mastery_label: 'Zbehlost: '
mastery_mastered: 'Zvladnuto'
mastery_in_progress: 'Probiha'
speed_confidence_label: 'Jistota rychlosti: '
mastery_locked: 'Zamcena'
ranked_avg_time: 'Hodnoceny prum cas: '
ranked_best_time: 'Hodnoceny nejl cas: '