Commit Graph

36 Commits

Author SHA1 Message Date
Claude Agent
56d9340f96 fix(play.html): motor înainte de boot — elimină race „motor lipsă" în Brave
Cauză: boot-ul (inflate hash → __runGame()) rula într-un <script> ÎNAINTEA
celui care definea window.__runGame. În Brave, await-ul din inflate se rezolva
pe microtask înainte ca scriptul motor să fie parsat → __runGame undefined →
"Eroare internă: motor lipsă."

Fix în generator (campaignShell bootMode='hash'): definește window.__runGame
în primul <script>, apoi boot-ul (compressJs + TPL + inflate → MASTER →
__runGame()) în al doilea. Ordinea garantează că motorul există când boot-ul
rulează — fără injecție dinamică, fără dependență de timing. play.html regenerat
din playerHTML(). Test @share actualizat: verifică engine-before-boot, fără text/plain.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 17:55:00 +00:00
Claude Agent
4d1774429a play.html: elimină injecția dinamică — motor în <script> normal + wrapper
Brave pica la orice injecție textContent/blob a scriptului (encoding bug).
Fix definitiv: scriptul motorului devine <script> normal cu wrapper
window.__runGame=function(){...}; loader-ul apelează __runGame() după
ce setează window.MASTER. Zero injecție dinamică, zero encoding issues.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 17:32:30 +00:00
Claude Agent
adc786ceec play.html: ASCII-ify codul motorului înainte de injecție (fix Brave)
Brave pica pe caractere non-ASCII (ă, ț, —, →) din comentariile
JS la parsare. Fix: replace /[^\x00-\x7F]/ → \uXXXX înainte de
appendChild — cod ASCII pur, imun la orice encoding mismatch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 17:22:28 +00:00
Claude Agent
714b68d017 play.html: Blob URL injection pentru compatibilitate Brave
Brave bloca appendChild cu textContent (anti-fingerprinting / Shields).
Fix: script injectat via Blob URL (tratat ca extern), cu fallback la
textContent pentru browsere fără createObjectURL.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 17:11:59 +00:00
Claude Agent
510581345a play.html: try/catch în loader + .nojekyll
- inflateFromBase64url: prinde JSON corupt cu mesaj clar
- appendChild: prinde SyntaxError de browser cu mesaj util
- null-check pe #run element (race condition paranoia)
- .nojekyll: previne Jekyll să proceseze fișierele

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 17:02:48 +00:00
Claude Agent
07664406ac docs: play.html este fisier generat — nota regenerare dupa modificari motoare
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 16:38:10 +00:00
Claude Agent
25c6631e68 play.html: player universal generat (toate 5 motoare, boot din hash)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 16:37:25 +00:00
Claude Agent
00263829cc defaultState: baseUrl romfast.github.io; index.html: link player universal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 16:36:08 +00:00
Claude Agent
8998cdc10e README: link GitHub Pages + sectiune distribuie QR/link
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 16:34:19 +00:00
Claude Agent
dba7fff7a2 Iterația 3: Joc-în-URL + QR (compresie, player hash, encoder QR, UI share)
Stage 1: `deflateToBase64url`/`inflateFromBase64url` (CompressionStream deflate-raw,
offline, file://); `SNIP.compressJs` cu helpers inflate (doubled backslashes).

Stage 2: `campaignShell({tplJson,masterExpr,titleExpr,nStyles,bootMode})` refactor;
gameCampaign = wrapper subțire; bootMode='inline' (nop) | 'hash' (player).

Stage 3: `playerHTML()` — toate 5 motoare inline; boot async cu `(async function(){})()`
(fix: lipsea `function`, eroare Unexpected token '{' în Chromium); MASTER din
location.hash deflate-raw; orchestrator în <script type="text/plain" id="run">.

Stage 4: Encoder QR vanilla JS — GF(256), Reed-Solomon ECC L, byte mode, versiuni 1-22,
8 măști + penalty, BCH format/version. `makeQrSvg(text, opts)` → SVG.

Stage 5: UI builder — fieldset distribuie, #btnShare/#btnCopyLink/#btnDownloadPlayer/
#btnPrintQr, #qrBox, #qrCard (print A4). baseUrl în state, deleted din cleanState().

Tests: 41/41 (6 noi @share). Fix test player: necesită __ow.enterDoor(0) după btn-start
(overworld first, then enter room). Demo files: restaurate din git (configs hardcodate în @regresie).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 12:58:41 +00:00
Claude Agent
8fc8f8040f Adventure Mode v0 (E0-E6): ramificare per-raspuns in campanie
Flag opt-in `adventure` (default off) — zero regresie non-adventure.
E0: `adventure:false` in defaultState + checkbox builder + `ADVENTURE` in orchestrator.
E1: `_lastGiven` in libJS; `checkAnswer` captureaza raspunsul; `campaignDone`
    calculeaza cheia branch ('*'/text-tf/index-choice) si o adauga in payload nextRoom.
E2: `resolveBranch(idx,key)` + rutare nextRoom: 'end'→owExitUnlocked+showOverworld;
    numar→owUnlocked[dest]+showOverworld(dest). Non-adventure: comportament existent.
E3: `owCheckEnter` blocheaza usi incuiate (ADVENTURE&&!owUnlocked); exit via
    owExitUnlocked. `owRefreshDoors`: stil `.locked` (dim+lock). `__ow.state`:
    expune owUnlocked/owExitUnlocked.
E4: `saveProgress` adauga doneList+owUnlocked+owExitUnlocked+target; `tryResume`
    reconstruieste din doneList non-contiguu (nu bucla liniara 0..idx).
E5: `buildDiploma`: ADVENTURE&&!roomDone[i] → 'neexplorata' (nu stele inselatoare).
E6: Builder UI — `normalizePuzzle` garanteaza p.branch={}; `cleanState` clampa
    tintele+strip branch cand !adventure; `puzzleCard` afiseaza dropdown-uri
    ramificare per-puzzle (free=1, tf=2, choice=1/optiune); `data-fb` handler;
    `adventure` change → renderPuzzles().

Smoke 35/35 (4 teste noi: branch-jump, resume non-contiguu, regression, tf branch).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 21:08:21 +00:00
Claude Agent
023df382f0 Diploma A4 print-first (§Design pct.9): certificat la final campanie
Buton "Vezi diploma" pe finale (+ "Joaca din nou"). Overlay #diploma:
certificat A4 portret alb, chenar dublu accent, titlu serif (singurul),
numele copilului = cel mai mare element.

- buildDiploma(): rand de stele per camera (roomStars[], persistat in resume;
  camere sarite = 🔒 "sarita"), cuvant magic in dale (lacate pt sarite),
  footer = data + "creat de {creator}" + marcaj auriu "timpul a expirat"
- camp builder nou: creator ("Creat de")
- @media print izoleaza #diploma (rest visibility:hidden, margin 20mm,
  print-color-adjust:exact)
- exemplu-campanie.html regenerat

Smoke 31/31 (test nou "diploma": nume/titlu/stele/cuvant/creator/inapoi) +
screenshot scratch/diploma.png (A4, camera sarita, footer expirat).
Cluster T10/PR2 complet (D7 + Timer + Muzica + Diploma). Ramas Etapa 2: Adventure Mode v0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 20:20:59 +00:00
Claude Agent
d8cb515545 Muzica ambient T10: arpegiu calm care accelereaza sub 1 min
Opt-in din builder (checkbox music, default off). Orchestrator-only: parintele
detine AudioContext (reutilizeaza beep._ctx); camerele nu stiu de muzica.

- arpegiu pentatonica minora (oscilatoare sine scurte), tempo ~1.8x pe ultimul
  minut (legat de _deadline-ul Timer Calm); fara timer -> loop calm fara accelerare
- buton 🎵/🔇 in bara chrome (#btn-music)
- duck pe voce: voiceSay onstart/onend regleaza gain (vocea are prioritate)
- fallback fara AudioContext -> no-op, buton ascuns (zero penalizare)
- porneste la start + resume; stop la showFinale + toggle
- hook test window.__music; exemplu-campanie.html regenerat (ramane opt-in off)

Smoke 30/30 (test nou "muzica ambient": opt-in, start, tempo sub 1 min, duck, toggle).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 20:12:32 +00:00
Claude Agent
b359bbe50a Timer Calm (T10 / §Design pct.10): ceas campanie opt-in
Ceas M:SS in bara chrome a campaniei. Opt-in din builder (camp "Timp limita
(minute)", default 0 = fara; cleanState coerce 0..120).

- porneste exact la "Incepe aventura" (intro necronometrat)
- deadline ABSOLUT in sessionStorage -> resume nu reseteaza ceasul
- sub 1 min -> auriu (.low); expirare -> ingheata 0:00 + marcaj discret
  (.expired), jocul curge nestingherit (zero penalizare, stelele raman)
- fara rosu pulsant (public copii) -> reduced-motion safe by default
- exemplu-campanie.html regenerat (ramane fara timer - opt-in, ca vocea)

Fundatie pentru muzica T10 (accelerare sub 1 min) + footer diploma.
Test nou (smoke 29/29): format M:SS, prag auriu, freeze la expirare,
jocul continua dupa expirare, resume pastreaza ceasul.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 20:06:36 +00:00
Claude Agent
16cd521430 Known improvements: dedup HUD letters-bar + validare stil import
Pasa de igiena (T8/T5/D8). Majoritatea erau deja livrate (persist guard D12,
esc/letter D13, validare 0 puzzle). Reale ramase:

- updateHud arcade/point NU erau identice (arcade: vieti/dusmani/bombe/raza;
  point: obiecte). Partea duplicata reala (scor + bara litere castigate) extrasa
  in SNIP.hudJs -> hudLetters(isSolved); isSolved(j) difera per motor
  (doorsSolved vs solvedFlags). Injectat in ambele; demo-uri regenerate.
- Stil top-level invalid la import: TOP_STYLES guard -> fallback classic + alert;
  idem la load din storage corupt. Test nou (smoke 28/28).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 19:36:41 +00:00
Claude Agent
bfe9be28d7 D7: migreaza gameClassic pe libJS (5/5 motoare uniforme)
Classic era ultimul motor bespoke: CFG/norm/beep/confetti/star-logic/
finalWord/payload campanie inline. Acum injecteaza libJS(cfg) si foloseste
checkAnswer/starsFor/finalWord/choiceOpts/campaignDone/roomReady ca celelalte
4 motoare. UI-ul bespoke (card sStart/sGame/sFinal) ramane intentionat -
fortarea modalului/overlay-ului SNIP ar fi regresie vizuala pe demo-ul implicit
(aceeasi decizie ca terminalul cu finale CRT).

- payload parent.nextRoom traieste o singura data in libJS.campaignDone()
- net -70 linii duplicate
- exemplu-clasic.html regenerat; celelalte demo-uri byte-identice
- smoke 27/27 (regresie clasic standalone + campanie E2E cu clasic ca odaie)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 19:30:40 +00:00
Claude Agent
ba949f43b0 bomberman: sunete (sfx), raza initiala 1, powerup-uri raza/bombe
Feedback user: nu se aud sunete, raza prea mare, lipsesc powerup-urile.

- sfx(type) WebAudio local in arcade: bomb/explosion/enemy/powerup/death;
  beep(ok) din libJS ramane pentru raspuns corect/gresit.
- raza fixa EXPLOSION_RANGE=3 -> bombRange variabil de la BASE_RANGE=1
  (Bomberman clasic); maxBombs de la BASE_BOMBS=1.
- powerup-uri: la spargerea cutiei, sansa 0.32 sa cada flacara (raza+1)
  sau bomba (bombe+1); ridicate mergand pe ele; HUD arata bombe/raza.
- fix: powerup-ul cadea pe celula cutiei si checkExplosionHits il stergea
  instant -> colectez brokenBoxes, drop dupa checkExplosionHits.

Hooks __game: powerups/bombRange/maxBombs/dropPowerupAt. Smoke 27/27.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 19:15:41 +00:00
Claude Agent
cb7eaffdf7 README: adauga pornire server (http.server) + sectiune Testare
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 19:02:14 +00:00
Claude Agent
a30441eb03 PR2: audit a11y - reduced-motion, tap>=44px, aria pe progres+dpad
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>
2026-06-13 12:04:55 +00:00
Claude Agent
ab11089097 PR2: unifica contractul _campaign la final in libJS.campaignDone()
Payload-ul parent.nextRoom({idx,stars,letter}) era scris identic in 3 locuri
(terminal finale(), SNIP.finalJs showFinal(), classic next()). Acum traieste o
singura data in libJS.campaignDone(), langa roomReady/beep/onerror.

Decizie: NU am pus terminalul pe showFinal() din SNIP (cum sugera formularea
initiala) — showFinal randeaza modal #fOverlay, dar terminalul are finale CRT
stilizat (ASCII 'EVADARE REUSITA' + RESTART), on-theme intentionat. Fortarea
modalului ar fi regresie vizuala pe terminalul standalone. Am unificat doar
ramura _campaign (payload identic), prezentarea standalone neatinsa.

- terminal finale(): say([...], 'ok', campaignDone)
- SNIP.finalJs showFinal(): if(_campaign){ campaignDone(); return; }
- arcade/chat/point primesc campaignDone via showFinal automat.
- classic ramane bespoke (nu foloseste libJS) — pliere = D7 (documentat in TODOS).

Suita 25/25 (terminal standalone + camere terminal in campanie E2E). Demo-uri
libJS regenerate; exemplu-clasic.html neatins.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 11:53:37 +00:00
Claude Agent
da93d8498c PR2: naratiune vocala (SpeechSynthesis, D10) - opt-in din builder
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>
2026-06-13 11:46:33 +00:00
Claude Agent
651025bd28 S1 fix real: deblocare audio pe primul gest (acopera resume), nu doar btn-start
Fix-ul initial deblocà AudioContext-ul doar in handlerul btn-start. Lacuna:
calea de resume (reload mid-campanie) intra direct pe harta fara btn-start ->
ctx nedeblocat -> camere mute. Plus resume() singur nu ajunge pe iOS Safari.

- unlockAudio() + listener global one-time (pointerdown+keydown capture):
  acopera fresh SI resume; buffer silentios iOS-safe.
- beep() se auto-vindeca daca ctx redevine suspended.
- Test smoke #9 rescris: headless creeaza ctx direct 'running' (ignora autoplay)
  -> vechiul "ctx running" trecea trivial. Acum: gest tastatura fara btn-start
  -> running (cale resume) + beep self-heal din ctx suspendat.
- Demo campanie regenerat. Suita 24/24.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 11:29:21 +00:00
Claude Agent
27fc0ca901 index: descrieri actualizate (overworld + bomberman)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 11:08:17 +00:00
Claude Agent
463e3cc9bd regenereaza exemplu-campanie.html cu overworld + restyle
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 11:07:12 +00:00
Claude Agent
05f4b4fe5a docs: HANDOFF reflectă Iterația 2 completă (S1-S4, 24/24)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 11:01:55 +00:00
Claude Agent
cead5c5156 S4: extinde suita cu gameplay bomberman + overworld + audio (24/24)
3 teste noi commitate (mutate din scratch in suita):
- audio S1: beep._ctx 'running' dupa Incepe aventura (era NO_CTX)
- overworld: mers cu tastatura (ArrowRight) + iesire blocata pana la final
- arcade bomberman: bomba sparge cutie, BFS AI se apropie, respawn pastreaza progres

Arbore AGENTS.md/CLAUDE.md/tests actualizat 21→24 (14 @regresie + 10 @campanie).
Iteratia 2 COMPLETA (S1+S2+S3+S4). Board: TODOS.md S4 [x].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 11:01:13 +00:00
Claude Agent
4454df9c3b S3 pas 3: restyle complet 5 stiluri (din STYLES.md)
Classic: fundal radial spotlight, card cu glow accent, tile-uri 44px bouncy,
progres bar 10px cu neon glow. Terminal: FIX WCAG critic .line.dim (#1f9c4a→
#2ecc71, 3.1:1→6.1:1) + bordura CRT + flicker cu motion guard + #cmd 44px.
Arcade: canvas border neon violet, dpad butoane fizice 56x52px, titlu neon,
fundal radial. Chat: header frosted-glass (backdrop-filter), bule NPC distincte
(#1e2d45) cu shadow, tile reward bouncy. Point: fundal distinct fata de arcade,
fix contrast .note (#a89fd4), usa cu glow pulsant. prefers-reduced-motion peste tot.

Toate 5 demo-urile regenerate. Smoke 21/21 + capturi vizuale pe fiecare stil.
S3 COMPLET (Bomberman + Overworld + restyle). Board: TODOS.md S3 [x].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 10:57:12 +00:00
Claude Agent
309103fb59 S3 pas 2: hartă overworld înlocuiește coridorul în campanie
Strat de navigare top-down (#overworld) peste #room-frame: jucător care merge pe
hartă (săgeți/WASD/dpad) la uși numerotate → intră → camera se montează → revine pe
hartă; steag de ieșire deblocat după toate camerele. intro→showOverworld(0),
nextRoom/skip/resume→showOverworld. Contractul orchestratorului NESCHIMBAT
(mountRoom/nextRoom/roomReady/roomError/timeout 4s/finale/dots/beep). Cod coridor
(showCorridor + markup + CSS) șters. Hooks window.__ow pentru teste.

Cele 8 teste campanie E2E rescrise pentru noul model (enterRoom/waitOverworld/__ow).
Smoke 21/21 (zero regresie) + captură vizuală. Board: TODOS.md S3 pas 2 [x].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 10:45:03 +00:00
Claude Agent
d67f6ddc15 S3 pas 1: Bomberman complet în gameArcade
Înlocuiește labirintul simplu cu Bomberman (port din scratch/bomberman-proto.html):
bombe + explozii în lanț, cutii distructibile, AI dușmani BFS urmărire, 3 vieți +
respawn cu progres puzzle păstrat, plasare aleatoare (PRNG seedat), buton bombă +
overlay game-over. Păstrează contractul motorului: openPuzzle/onDoorSolved/showFinal/
modalOpen/roomReady — uși=N puzzle-uri (modal real), cufăr=scăpare. Demo regenerat.

Verificat: smoke 21/21 (zero regresie) + gameplay 6/6 in arcade-ul integrat
(bombă sparge cutie, AI urmărește, respawn păstrează progres, ușă→modal real,
cufăr→final) + captură vizuală. Board: TODOS.md S3 pas 1 [x].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 10:25:48 +00:00
Claude Agent
5f78eef289 S2a+S2b verificate (8/8 + 7/7) — board la zi, S3 deblocat
S2a Bomberman: AI BFS urmărire confirmat (eșec inițial de test = dușman închis în
cutii, comportament corect; test corectat să curețe cutiile). S2b overworld:
orchestrator pe contractul gameCampaign, 7/7. Prototipurile trăiesc în scratch/
(gitignored); board-ul TODOS.md e recordul durabil.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 09:49:50 +00:00
Claude Agent
a9f30650d5 S2c: STYLES.md — direcție restyle pentru cele 5 stiluri
Document de direcție vizuală per stil (classic/terminal/arcade/chat/point):
stare actuală, aspirație, tokens system-safe (fără webfonturi/CDN), micro-motion
cu reduced-motion guard, checklist a11y. Top 3 impact/efort: fix WCAG terminal
.line.dim (3.1:1→6.1:1), classic card glow, chat backdrop-filter. Consumat de S3.
Board: TODOS.md ▶ BOARD ACTIV S2c [x].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 09:44:11 +00:00
Claude Agent
52f97af533 S1: fix sunet campanie — deblochează AudioContext la gestul părintelui
Camerele cheamă parent.beep() din iframe; gestul din iframe NU deblochează
AudioContext-ul orchestratorului (părinte), care rămânea suspended → tăcere.
Fix: creează+resume beep._ctx în handler-ul btn-start (gest direct pe părinte),
escape-builder.html:1928. Verificat: ctx 'running' după start (era NO_CTX).
Suita smoke 21/21 fără regresie. Board: TODOS.md ▶ BOARD ACTIV S1 [x].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 09:33:31 +00:00
Claude Agent
b935a21b41 docs: TODOS.md devine board de progres durabil pentru Iterația 2
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>
2026-06-13 09:29:21 +00:00
Claude Agent
a42c960b46 QA #9 — suita completa 21/21 campanie E2E
tests/smoke.mjs: 8 teste @campanie implementate complet (test.skip inlaturat):
- E2E 5 camere cu stiluri rotite → final stele+litere
- Resume safeStore+djb2 (D3+D11)
- Camera moartă — timeout 4s → skip-banner+cod
- Eroare post-ready (D5 semantica ORICAND)
- Dublu-click idempotent (T4+D4)
- $/$& replace-functie (D1)
- 8+ camere beep (D2)
- 320x568 chrome-40px fara overflow (T6+TD4)

CLAUDE.md: ## Testing actualizat — comenzi npx directe, fara npm scripts;
21/21 status curent documentat.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 08:49:45 +00:00
Claude Agent
a4b0ff4154 Campanie multi-stil — PR1 (T1-T8 + TD1-TD6)
Adauga al 6-lea stil de joc: campanie multi-stil care leaga puzzle-urile
in camere de stiluri diferite (clasic/terminal/arcade/chat/point in rotatie),
conectate prin coridoare cu usa, litera si stele.

Contract de montare (verificat la gate T1):
- gameCampaign: un <iframe srcdoc> per camera; camerele cheama parent.*
  pe un nivel (merge si pe file://); template per stil cu sentinel __CFG__
  injectat prin replace-functie (D1) + json.replace(/</g,'<') (D6)
- roomReady/roomError + timeout 4s -> skip cu 0 stele + cod eroare;
  idx detinut de parinte, accepta nextRoom doar de la contentWindow activ (D5)
- parent.beep in mod campanie (un singur AudioContext, D2)
- resume prin safeStore try/catch (D3) + cheie djb2 peste CFG embedat (D11)

Builder:
- selector de stil per puzzle ("Auto (stil)") + optiunea Campanie multi-stil
- normalizePuzzle() la load + import (sursa unica pt forma puzzle, D8)
- blocare export+preview la 0 puzzle-uri; persist() guarded (D12)
- letter normalizat [A-Za-z0-9] + esc la SVG point (D13)

Design (DESIGN.md): tokens --c-*, intro poster, coridor "usa ca erou",
chrome unica sursa de progres, 5 usi CSS/SVG (normal/stuck/crescendo),
mod camera per motor, buget vertical mobil, baseline a11y.

Tooling: tests/smoke.mjs (Playwright, zero-dependente prin npx), TODOS.md,
sectiune ## Testing in CLAUDE.md. Demo-uri regenerate + exemplu-campanie.html.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 08:34:57 +00:00
Claude Agent
a464f642c0 Escape Room Builder - generator de jocuri escape room in 5 stiluri
Builder single-file HTML cu editor + preview live jucabil si export
de jocuri standalone. Stiluri: clasic (quiz), terminal retro, arcade
pixel, story chat, point-and-click. Fara backend, fara build.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 10:01:58 +00:00