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,
|
"requiresBrowserCheck": false,
|
||||||
"requiresDesignReview": false,
|
"requiresDesignReview": false,
|
||||||
"passes": false,
|
"passes": true,
|
||||||
"failed": false,
|
"failed": false,
|
||||||
"blocked": false,
|
"blocked": false,
|
||||||
"retries": 0,
|
"retries": 0,
|
||||||
"failureReason": "",
|
"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",
|
"id": "US-011",
|
||||||
@@ -330,4 +330,4 @@
|
|||||||
"notes": ""
|
"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-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-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