diff --git a/scripts/ralph/prd.json b/scripts/ralph/prd.json index b476e52..84fdf4a 100644 --- a/scripts/ralph/prd.json +++ b/scripts/ralph/prd.json @@ -268,12 +268,12 @@ ], "requiresBrowserCheck": false, "requiresDesignReview": false, - "passes": false, + "passes": true, "failed": false, "blocked": false, "retries": 0, "failureReason": "", - "notes": "" + "notes": "Fișiere: src/adapters/discord_voice.py (comanda /voice doctor extinsă). Adăugat check hf_token în keyring (src.credential_store.get_secret, doar prezență, fără leakage) și check pocket-tts GET {tts.pockettts_url}/health (timeout 3s, httpx.AsyncClient, wrapped try/except -> FAIL pe orice excepție). Checks-urile existente (libopus, voice load error) neatinse. Verificat manual: get_secret(\"hf_token\") is not None -> True; GET http://127.0.0.1:7789/health -> 200 (pocket-tts.service live din US-001). Structural: register(tree, bot) izolat -> comanda doctor prezentă în /voice group. Gate /review (backend, manual): PASS — fără shell injection, fără secret leakage (doar bool presence), error handling scoped (try/except pe fiecare check nou, degrade la FAIL nu crash). pytest tests/: aceleași 22 eșecuri preexistente, 1043 passed (neschimbat)." }, { "id": "US-011", @@ -330,4 +330,4 @@ "notes": "" } ] -} \ No newline at end of file +} diff --git a/scripts/ralph/progress.txt b/scripts/ralph/progress.txt index 10357c0..e3bcf3d 100644 --- a/scripts/ralph/progress.txt +++ b/scripts/ralph/progress.txt @@ -203,3 +203,73 @@ Project: echo-core - US-010 (backend, /voice doctor + pocket-tts health) — eligibil, dependsOn US-001+US-002 (ambele passes:true) - US-011 (backend, teste TTS) — eligibil, dependsOn US-006 (passes:true) --- + +## Iterație: 2026-07-11 (US-009) +### Story implementat: US-009 - Autocomplete voci din catalog pentru /audio și /voice setvoice (tags: ui, backend) +### Status: Complete + +### Gates rulate: +- Typecheck: SKIP (mypy neinstalat în .venv) +- Lint: SKIP (ruff neinstalat în .venv) +- Tests: PASS — pytest tests/ aceleași 22 eșecuri preexistente, 1043 passed (neschimbat) +- Gate `ui`: la fel ca US-007/US-008, comenzi slash Discord fără server web pe techStack.port — + agent-browser nu se aplică. Verificat structural prin `create_bot()` + `discord_voice.register()` + izolat (fără bot live): parametrul `voce` din `/audio` și `voice` din `/voice setvoice` au + `autocomplete` legat corect la `_voice_autocomplete` (verificat cu `repr(p.autocomplete)`, nu doar + `is not None` — primul test cu `is not None` dădea fals-pozitiv pe toți parametrii). Confirmat că + `tts.list_voice_names()` întoarce live cele 17 intrări din `tts_voices.json`, filtrate corect pe + `engine='supertonic'`/`'pockettts'`. +- /review (backend, manual): PASS — `_load_voice_catalog()` citește prin `src.jsonlock.read_locked` + (fără acces direct la fișier), fără subprocess/shell nou, fără secret leakage, import lazy + `tools/tts.py` identic cu pattern-ul deja folosit în `_tts_synthesize_preview` (US-008). + +### Learnings: +- A patra oară (după US-003/US-004, US-006, US-008) când codul unui story era deja scris + (necommitat) dintr-o iterație anterioară care a atins max_turns — pattern consistent, verifică + mereu `git status`/`git diff` la începutul iterației înainte să presupui reimplementare de la zero. +- `discord.app_commands.CommandParameter.autocomplete` e `None` by default și devine `True`-ish + (bool) doar când verificat cu `bool(x)`/`is not None` pe un attribute care de fapt e mereu setat + la construcție internă — verificarea corectă e `repr(p.autocomplete)` care arată fie `None`, fie + numele funcției/`True` literal; testul inițial cu `is not None` a dat fals-pozitiv pe toți cei 3 + parametri ai `/audio`, corectat verificând direct valoarea brută înainte de a trage concluzia. +- Catalogul `tts_voices.json` are deja chei case-sensitive exact ca vechile liste hardcodate + (`M1`-`M5`, `F1`-`F5` uppercase) — nu a fost nevoie de normalizare suplimentară de case în + `list_voice_names()`, doar filtrare pe `engine` din intrare. + +### Next: +- US-010 (backend, /voice doctor + pocket-tts health) — eligibil, dependsOn US-001+US-002 (ambele passes:true) +- US-011 (backend, teste TTS) — eligibil, dependsOn US-006 (passes:true) +- US-012 (docs, TOOLS.md) — NU eligibil, dependsOn US-007+US-008+US-009 (toate acum passes:true) — + devine eligibil următoarea iterație +--- +## Rate limit la iter 14 — sleep 1800 + +## Iterație: 2026-07-11 (US-010) +### Story implementat: US-010 - Extinde /voice doctor cu health-check pocket-tts (tags: backend) +### Status: Complete + +### Gates rulate: +- Typecheck: SKIP (mypy neinstalat în .venv) +- Lint: SKIP (ruff neinstalat în .venv) +- Tests: PASS — pytest tests/ aceleași 22 eșecuri preexistente, 1043 passed (neschimbat) +- /review (backend, manual): PASS — hf_token check raportează doar prezență (bool), niciodată + valoarea; URL-ul pocket-tts vine din config, nu din input utilizator; ambele checks noi sunt + în try/except separat, degradează la FAIL în loc să crape comanda; checks-urile existente + (libopus, voice load error) neatinse. + +### Learnings: +- Prima iterație din acest lanț fără cod deja scris dintr-o sesiune anterioară — a fost nevoie + de implementare reală de la zero (spre deosebire de US-003/004/006/008/009 unde codul exista + deja necommitat). git status/diff la început a confirmat clar starea curată. +- Nu exista deja un health-check de rețea pentru Supertonic în /voice doctor (doar libopus + + voice_load_error) — AC-ul "verificarea Supertonic existentă rămâne funcțională" s-a interpretat + ca "nu rupe checks-urile existente", nu ca "adaugă un ping nou pentru Supertonic" (nu era cerut + explicit în AC, doar pentru pocket-tts). +- Verificat manual end-to-end contra serviciilor live (pocket-tts.service rulează din US-001, + hf_token e în keyring din US-002) — get_secret("hf_token") is not None -> True, GET + 127.0.0.1:7789/health -> 200. Confirmă că integrarea reală funcționează, nu doar wiring-ul. + +### Next: +- US-011 (backend, teste TTS) — eligibil, dependsOn US-006 (passes:true) +- US-012 (docs, TOOLS.md) — eligibil, dependsOn US-007+US-008+US-009 (toate passes:true) +---