Oportunități Soft de Îmbunătățire

Lucruri care ar face produsul mai bun fără refactoring major. Ordonate după impact × efort. Nici una nu e blocantă pre-2026-05-20. Sursa: blindspot analysis + sesiunea 2026-05-16


🟢 Impact mare, efort mic (<2h)

S1. Bell sound feedback la +1 manual filler

Ce: Beep audio la click buton +1 în UI Numărător. De ce: Numărătorul tradițional TM folosea clopoțel fizic. Fără feedback sonor, riști să apeși de două ori sau să ratezi. Implementare: Web Audio API, 5 linii JS.

const ctx = new AudioContext();
function beep(freq=880, ms=60) {
  const o = ctx.createOscillator(), g = ctx.createGain();
  o.frequency.value = freq; o.connect(g); g.connect(ctx.destination);
  g.gain.setValueAtTime(0.15, ctx.currentTime);
  g.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + ms/1000);
  o.start(); o.stop(ctx.currentTime + ms/1000);
}

Locație: packages/ai-service/app/static/app.js lângă +1 manual handler.

S2. Speech type detection automată (Speech / TT / Eval)

Ce: La n <name>, CLI întreabă sau detectează dacă speakerul face Prepared Speech / Table Topics / Evaluare. Afectează: Cronometror praguri corecte + Grammar analysis calibrat pe durată. De ce: Cronometrul avertizează la 2:30 pentru ORICE speaker — greșit pentru un speech de 7 min. Implementare: Prompt opțional în CLI + fallback auto (sub 3 min = TT), sau YAML pre-ședință. Efort: 1.5-2h. Risc: zero.

S3. Word of the Day — derivate morfologice

Ce: Dacă WoD e „perspicace”, detectează și „perspicacitate”, „perspicaces” etc. De ce: Oficial TM — derivatele contează! Cineva care folosește „perspicacitate” a folosit corect WoD. Implementare: La cuv <wod> în CLI, Claude generează 3-5 derivate → stocate în session state → transmise în promptul de grammar. Efort: 1h.

S4. YAML tic pre-config per speaker

Ce: Înainte de ședință, declari: cornel: ["în fine", "să zic așa"]. Tool-ul adaugă regex-uri custom pentru Cornel în filler_detector. De ce: TM Sibiu are vorbitori regulari cu tic-uri cunoscute. Prima ședință cu un set nou pierzi primul meeting de calibrare. Implementare: templates/known_tics.yaml + filler_detector.detect_text_fillers(extra_patterns=...). Efort: 1.5h.


🟡 Impact mare, efort mediu (2-5h)

S5. Filler categories în raport (4 buckets oficial TM)

Ce: Grupează filler-ele în raportul Numărătorului după categoriile oficiale: - 🔊 Sunete vocale (ăă, hmm, ah) - 💬 Cuvinte umplutură (deci, adică, gen) - 🔁 Expresii repetitive (să zic așa, eu eu) - 📢 Sunete non-verbale (plescăieli) De ce: Raportul oficial TM Sibiu ar trebui să urmeze format standard. Implementare: Adaugă bucket câmp în FillerEvent + grouping în _render_fisa_numarator. Efort: 1.5-2h.

S6. Pre-flight verification script

Ce: scripts/preflight.sh — verifică înainte de fiecare ședință: - AudioCapture binary prezent + permisiuni - ai-service health OK - venv-uri intacte - Disk space ≥1GB - Whisper model warm - Zoom process detectabil De ce: Elimini verificările manuale pre-ședință. Anti-panic concret. Implementare: Bash script + integrare în start.sh. Efort: 1.5h.

S7. Pathways tracking per speaker

Ce: La n <name>, tool-ul știe: „Cornel e pe Presentation Mastery L2, Proiect 3 — Effective Body Language (5-7 min)”. Evaluatorul vede ce criterii să urmărească. De ce: Context valoros pentru evaluare + motivație pentru vorbitor. Implementare: YAML pre-ședință + render în fișa Gramatician/Evaluator. Efort: 2h.

S8. Discoverability sesiuni trecute (FTS5)

Ce: SQLite FTS5 index pe toate sesiunile din sessions/ → poți căuta: „când a mai spus «în fine» Cornel” sau „toate speech-urile cu WoD «perspicace»”. De ce: Pavel a menționat „Silviu căutabil” — paradigma sesiunilor căutabile. Implementare: Index SQLite la iesi + CLI command cauta <query>. Efort: 3-4h.


🔵 Impact mediu, efort mic (nice-to-have)

S9. Indicator vizual când pipeline e mort

Ce: Când MicPipeline abandonează (50× WS fail), UI să afișeze 💀 „Pipeline mort — audio restart în CLI” în loc de 🔴 silențios. De ce: Situația din 2026-05-16 ora 20:47 — nu era clar de ce nu se vede semnal. Implementare: Event pipeline_dead emis din run_with_auto_restart la abandon definitiv → banner UI. Efort: 45 min.

S10. Anti-blocking pattern formalizat (decorator)

Ce: Un decorator Python @anti_blocking(skip_on=..., timeout_sec=...) pe care orice handler de role-module îl aplică. De ce: Faza 2 va adăuga 5+ module — fiecare trebuie să fie fail-silent. Standardizare previne reinventarea roții. Implementare: packages/ai-service/app/utils/anti_blocking.py. Efort: 1h.

S11. Volume auto-save/restore mai robust

Ce: audio_device_manager.py deja face save/restore. Dar dacă Zoom schimbă device-ul în mijlocul sesiunii, se pierde contextul. De ce: Incident practic — Zoom poate reseta device-ul output dacă intri în breakout room. Implementare: Watchdog periodic (la fiecare 30s) care verifică dacă device-ul curent e cel așteptat. Efort: 30 min.


⚪ Long-term (Faza 3+)