# Progres — atm-curs-dl (2026-09-12) Pipeline personal de transcriere + sumarizare pentru cursul de trading ATM (Bogdan Jinga, systeme.io), cont cu acces parțial. Repo: `romfast/atm-curs-dl` pe Gitea. Pagină publicată (Tailscale, doar în tailnet): **https://claude-agent.tailf7372d.ts.net/atm/index.html** ## Status: curriculum de bază 100% acoperit (53/53 lecții accesibile) | Modul | Lecții | Status | |---|---|---| | Modulul 1 | 10 | ✅ | | Catalizatori economici | 8 | ✅ | | Modulul 2 | 16 | ✅ | | Modulul 3 | 6 (5 video + 1 text) | ✅ | | Modulul 4 | 4 | ✅ | | Analiză Fundamentală | 9 | ✅ | Toate transcrise (`transcripts/`) și sumarizate (`summaries/`), diagrame verificate vizual (Playwright + server local), pe Gitea până la ultimul commit. ## În curs: Q&A (28 sesiuni) — pornit 2026-09-12 15:18 Userul a cerut extinderea la Q&A, apoi cele 5-6 lecții 1:1, apoi Analiza Zilnică (147). Decizii luate cu el: - **Format Q&A**: un fișier per sesiune, dar structurat pe *subiecte* cu titluri descriptive (nu pe dată), plus `summaries/09_QA/INDEX_TEMATIC.md` care adună toate întrebările din toate sesiunile pe temă. - **Întrebările administrative se aruncă** (o linie la final cu câte). - **Diagrame doar unde adaugă ceva** (mecanism de preț, exemplu numeric, setup) — nu pentru răspunsuri de proces/psihologie. - **Sample aprobat**: `summaries/09_QA/01_2026-08-25.md` (commit `fc3c3f5`). E referința canonică pentru restul sesiunilor Q&A. ### Transcriere în curs — DOUĂ mașini - **local (claude-agent)**: `tmux qa_local`, 16 fișiere, log `transcribe_qa_local.log`. Măsurat: `medium` int8, 4 cores = 0.56x durata audio. - **moltbot** (LXC, 6 cores, fără GPU): `tmux qa_molt`, 12 fișiere în `/root/atm/audio`, script `/root/atm/tr_worker.py`, log `/root/atm/tr.log`. Rulează `medium` int8 cu `cpu_threads=5` (lasă 1 core pentru code-server și ttyd, care rulează acolo). Venv: `/home/moltbot/echo-core/.venv`. Acces: Tailscale SSH ca `root@moltbot` (userul a autorizat o dată). - Split făcut LPT greedy **pe durată**, nu pe număr (sesiunile variază 5 min - 3h24m). Backup audio pentru moltbot rămâne local în `audio/09_Q_and_A_molt/`. - **Viteze reale măsurate** (nu estima, folosește-le): local `medium` int8 pe 4 cores = **0.49x** durata audio. moltbot `medium` int8 pe 5 cores = **1.01x** — de două ori mai lent, are cores mult mai slabe. Split-ul inițial (bazat pe o estimare de 0.75x pentru moltbot) a fost dezechilibrat cu ~7h și a fost rebalansat la 16:10 mutând `26_11062025` și `09_09122025` înapoi local. - Local rulează în două pase: `tmux qa_local` (lotul inițial) și `tmux qa_local2`, care așteaptă terminarea primei și reia `transcribe.py` ca să prindă fișierele mutate. `transcribe.py` sare peste ce are deja transcriere, deci pasele sunt sigure de repetat. - **Workerul de pe moltbot își face `sorted(glob)` o singură dată la start** — dacă muți/ștergi fișiere din `/root/atm/audio` cât rulează, repornește-l (`tmux kill-session -t qa_molt` + relansare), nu te baza că observă schimbarea. E resumable, pierzi doar fișierul în lucru. - **După ce termină**: adu transcrierile de pe moltbot în `transcripts/09_Q_and_A/` (`scp root@moltbot:/root/atm/transcripts/*.txt`), apoi sumarizează în formatul din sample. ### A/B pe modele, deja făcut — nu-l repeta `whisper-small-ro-cv11-int8` (fine-tunat RO, există pe moltbot) e **inutilizabil** pe conținutul ăsta: "MP4 short" → "empe patrat şort", "PDF" → "pe-defect", "poziția" → "poliția". Fine-tunat pe Common Voice (vorbire citită), se rupe pe live Zoom cu jargon englezesc. `medium` generic câștigă clar și nu e nici mai lent (moltbot small-ro: 2.26x realtime; local medium: 1.78x). ### Duplicate în curs — verifică ÎNTOTDEAUNA înainte de sumarizare Cursul publică aceeași înregistrare sub două date. Găsit: **Q&A 18.08.2026 este identic cu 11.08.2026** (lecțiile 2 și 3). Sumarizat o singură dată, sub 11.08.2026, cu notă în fișier și în `INDEX_TEMATIC.md`. Două unelte, ambele în rădăcina repo-ului: - `audio_fingerprint.py` — rulează pe mp3-uri **înainte** de transcriere. Amprentă = RMS pe ferestre de o secundă, corelat peste decalaje de ±15s. `md5` NU prinde duplicatele: cele două urcări sunt encodate separat, deci bytes diferiți și durate care diferă cu ~0.08s. Validat pe perechea cunoscută: **1.000** pentru duplicat, **0.038** pentru sesiuni diferite. Prag: >0.90 = duplicat, 0.70-0.90 = verifică manual. `\.venv/bin/python audio_fingerprint.py "audio/09_Q_and_A/*.mp3"` - `check_duplicates.py` — pe transcrieri, pentru ce e deja transcris (`transcribe.py` șterge audio-ul după succes). Are `--selftest`. Rulate pe toate cele 28 de sesiuni Q&A: **un singur duplicat**, cel de mai sus. Atenție la durate apropiate care NU sunt duplicate — 13_28102025 și 16_07102025 diferă cu 0.288s dar sunt sesiuni complet diferite; verificat prin transcrierea unor felii de 200s din mijloc. **Rulează amândouă pe Analiza Zilnică (147 lecții) înainte de transcriere** — acolo un duplicat costă ore, nu minute. ### Ce urmează după Q&A 1. Cele 5-6 lecții 1:1 (module 11, 17, 18, 20, 21, 22 — câte 1 lecție). Formatul se decide **după** transcriere — nu știm dacă e mentorat personal (irelevant) sau conținut tehnic. 2. Analiza Zilnică (147). Userul vrea un **sample separat** pe un fișier înainte, ca să aprobe un template — nu porni în masă fără asta. ### Modificări de infrastructură făcute pentru asta - `extract_audio.py`: `--only ` acum **ocolește** `CORE_MODULES` (înainte filtra întâi pe ele); `--lectures N` limitează la primele N. - `render_html.py`: adăugat extensia `toc`, ca headingurile să primească `id` — fără ea link-urile din `INDEX_TEMATIC.md` n-au unde ateriza. ## Lecții FĂRĂ video — `extract_text_lessons.py` `extract_audio.py` caută doar un MP4, deci sare peste lecțiile scrise. Găsită una singură în curriculum-ul accesibil: **Modul 3 / #9 — Alte tipuri de catalizatori** (expirări de opțiuni, witching, 0DTE). Avea 4.847 de caractere de conținut real, nu era un quiz gol. Era numărată greșit ca "acoperită" în versiunea anterioară a acestui fișier. Conținutul vine din câmpul `html` al `/api/membership/lecture/`, împreună cu tot CSS-ul paginii — scriptul curăță `