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:
@@ -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": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user