feat: US-010 - marchează complet în prd.json

Actualizează prd.json (passes:true, notes) și progress.txt cu rezultatele
gate-urilor pentru US-010.
This commit is contained in:
2026-07-11 11:16:39 +00:00
parent c1414616ad
commit 9ddad02879
2 changed files with 73 additions and 3 deletions

View File

@@ -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": ""
}
]
}
}

View File

@@ -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)
---