Audit faptic (masurat) pe 5 motoare + campanie. Deja OK din restyle S3:
tap targets (arcade 56x52, classic 44/48, chat 44), contrast (terminal .dim
9.4:1, classic hint 6:1), focus/keyboard (butoane reale, navigare cu sageti).
Reparat:
- reduced-motion (lacune): .confetti display:none in classic + SNIP.baseCss +
campanie; flipin final in SNIP.finalCss (#fOverlay .fword span) + campanie
(#fin-word span); dt-blink in campanie. (pop/flip/shake/bin/tile-pop/tp/
door-glow/crt-flicker erau deja acoperite.) flipin/pop au 'backwards' fill ->
animation:none le revine la starea vizibila, nu raman ascunse.
- tap: overworld dpad 42x42 -> 44x44 (singura tinta sub prag).
- aria: #dots role=group+label; fiecare dot role=img cu aria-label ce reflecta
starea (neinceputa/in curs/rezolvata) via setDot; dpad arcade+overworld cu
aria-label (Sus/Jos/Stanga/Dreapta/Pune bomba); spacere .sp aria-hidden.
Test nou smoke #9c (emulateMedia reducedMotion -> confetti display:none;
tap>=44px pe dpad; aria dinamic pe dots). 26/26. Demo-uri regenerate (terminal
neatins - nu foloseste SNIP base/final).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Feature nou (vocea nu exista deloc). Opt-in via checkbox 'voice' in builder
(off implicit), buton toggle in bara chrome a campaniei (parintele detine).
Voicing orchestrator-only, uniform pe toate 5 motoarele (fara dublu-citit):
povestea la 'Incepe aventura', intrebarea camerei la roomReady, mesajul final.
Edge cases (toate tratate):
- getVoices() gol sincron -> re-citire la onvoiceschanged.
- fara voce ro-* -> vocea default a sistemului (doar u.lang='ro-RO').
- speechSynthesis.cancel() in hideAll() -> fara replici fantoma la schimbarea scenei.
- fara 'speechSynthesis' in window -> buton ascuns, totul no-op.
- window.voiceSay expus pe parinte pt. viitor (replici motoare cu guard typeof).
Bug prins de test: #btn-voice{display:inline-flex} batea UA [hidden] ->
adaugat #btn-voice[hidden]{display:none}.
Test nou smoke #9b (voce opt-in: buton, citeste poveste/intrebare, cancel,
toggle) + asertare buton-ascuns cand voice=false. Suita 25/25. Demo regenerat.
AGENTS.md/TODOS actualizate.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Secțiunea ▶ BOARD ACTIV (S1-S4) sus, convenție [ ]→[~]→[x]→[!] citită la
start de sesiune. AGENTS.md root indexează TODOS.md ca board durabil (harness
task list se resetează, ăsta nu). Notat: ipoteza S1 din HANDOFF (beep nedefinit)
pare greșită — beep e definit la escape-builder.html:1725.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>