# Inventar unelte QA/testare UI si infrastructura de progres — ROAFACTURARE Inventar read-only, 17.09.2026. Fara propuneri, doar stare (citate `fisier:linie`). ## 1. `vfp_ui_harness.ps1` — orchestrator UI Locatie: `D:\ROA\ROAFACTURARE\COMUN\utile\Teste\vfp_ui_harness.ps1`. Complement in VFP: `D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg` (proceduri de handshake incluse in testul .prg via `SET PROCEDURE TO ui_harness ADDITIVE`). Parametri (`vfp_ui_harness.ps1:20-28`): - `-TestPrg` (obligatoriu) — calea `.prg` a testului. - `-Steps` (obligatoriu) — array de etichete, una per pas asteptat (`ready_.txt`/`cont_.txt`). - `-StepTimeoutSec` (implicit 130), `-ReadyTimeoutSec` (implicit 180, pt. `ready_0` = afisarea formularului). - `-ShotsDir` (implicit `\screenshots`), `-SyncDir` (implicit `\uisync`). - `-Vfp` (implicit `C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe`). Ce face exact: - Precompileaza izolat (`_precompile.ps1`, proces copil) inainte de lansare (`vfp_ui_harness.ps1:145-154`). - Lanseaza `.FXP`-ul cu `vfp9.exe -A ` (nu `.prg`), cu pana la 8 incercari daca testul nu scrie START in 30s (`vfp_ui_harness.ps1:160-190`). - Fereastra principala e mutata **off-screen** (`x=-4000`, `HWND_BOTTOM`, `SWP_NOACTIVATE`) imediat ce apare `MainWindowHandle`, si re-impinsa la fiecare pas — **fara furt de focus**, cerinta Marius 17/07/2026 (`vfp_ui_harness.ps1:13-19,73-77`). - Screenshot per pas via `PrintWindow` pe handle (flag `PW_RENDERFULLCONTENT=2`, fallback flag 0 daca iese gol) — nu `CopyFromScreen` (`vfp_ui_harness.ps1:106-131`). - Bucla pasi: asteapta `ready_.txt` (scris de test din `ui_harness.prg`), face screenshot, scrie `cont_.txt` ca sa continue testul (`vfp_ui_harness.ps1:200-221`). - La final asteapta `done.txt`, omoara doar instantele `vfp9.exe` proprii (linie de comanda contine folderul testului) (`vfp_ui_harness.ps1:133-140,223-231`). `ui_harness.prg` — API apelat din testul VFP: - `HarnessLog(mesaj)` (`ui_harness.prg:19-28`), `HarnessReady(n, nota)` (`ui_harness.prg:30-35`), `HarnessWaitContinue(n, autoSec=30)` (`ui_harness.prg:37-51`), `HarnessStep(n, nota, autoSec)` = Ready+WaitContinue (`ui_harness.prg:53-57`), `HarnessDone(status)` (`ui_harness.prg:59-64`). - `HarnessWaitContinue` are auto-continue dupa `autoSec` (implicit 30s) daca orchestratorul nu raspunde — testul merge si fara `vfp_ui_harness.ps1`, doar fara capturi (`ui_harness.prg:8-9,43-49`). - `HarnessInit`: `SET SAFETY OFF` + `SET TALK OFF` defensiv (`ui_harness.prg:11-17`). Limitari cunoscute: - **Nu trimite input real** (fara `SendInput`/`keybd_event`/click injectat) — harness-ul doar citeste semafoare si face screenshot; actiunile UI (click, taste) sunt executate **din interiorul testului VFP** (apeluri directe de metode/evenimente), nu de PowerShell din afara. - Watchdog-ul de dialoguri (`watchdog_vfp.ps1`) e un instrument separat, folosit doar pt. dialoguri native neasteptate; dismiss-ul se face STRICT prin mesaje Windows tintite pe handle (`BM_CLICK`, `WM_COMMAND IDCANCEL`, `WM_KEYDOWN/UP` ESCAPE, `WM_CLOSE`) — interzis explicit input real de tastatura/mouse, masina fiind partajata cu utilizatorul (`watchdog_vfp.ps1:16-26`). - Dialogurile VFP owner-drawn (ex. "View Parameter") pot sa nu raspunda la niciun mesaj — dismiss-ul esueaza cinstit, ramane deschis pana la timeout (`watchdog_vfp.ps1:23-26`). - Coloanele de grid nu se materializeaza sub `-A -T`/headless (`ColumnCount=0`, `RecordSource` sunt artefacte) — cunoscut, documentat separat (memorie `grid-coloane-nu-se-materializeaza-headless`); simptomul apare si in suitele UI (ex. `test_page3_articole` 14/2 in `docs\progres.md:67`, cele 2 FAIL = artefactul de baseline). - `watchdog_vfp.ps1` clasifica orice fereastra noua diferita de `MainWindowHandle` ca dialog blocant (nu dupa numele clasei — VFP refoloseste acelasi prefix de clasa si pt. shell, si pt. dialoguri proprii) (`watchdog_vfp.ps1:6-9`). ## 2. Harness headless (skill `roa-vfp-headless-test`) Skill: `D:\ROA\ROAFACTURARE\COMUN\skills\roa-vfp-headless-test\SKILL.md`. Lansare probe (`SKILL.md:102-103`): `vfp9.exe -A -T "" `, din PowerShell, cu timeout si `$p.Kill()` daca nu iese (`$p.WaitForExit(120000)`). `-A` si `-T` obligatorii amandoua (`SKILL.md:45-46`). Precompilare izolata obligatorie inainte (`_precompile.ps1`, proces copil), altfel `vfp9 -A` poate deschide editorul in loc sa ruleze (`SKILL.md:28-29,99-100`). Loguri: fiecare test scrie propriul `_log.txt` langa `.prg` (convenit prin `gcUILog`/logica proprie a testului); sinteza vine din `raport_teste.ps1` (`D:\ROA\ROAFACTURARE\COMUN\utile\Teste\raport_teste.ps1`), care citeste **doar** fisierele `*_log.txt` dintr-un folder (implicit `achizitie_import`, parametrizabil cu `-Dir`), numara linii `^PASS` si `^(FAIL|BUG)` si scoate PASS/FAIL per fisier + varsta (minute de la ultima scriere) (`raport_teste.ps1:9-33`). `-Baseline ` marcheaza NOU vs. preexistent (`raport_teste.ps1:7-8,16-19`). Regula: orchestratorul citeste doar acest raport, nu logurile brute (`raport_teste.ps1:2-3`, trimite la `COMUN\docs\orchestrare-subagenti.md`). Mock-uri disponibile in `D:\ROA\ROAFACTURARE\COMUN\utile\Teste\`: - `mock_amessagebox.prg` — inlocuieste `FUNCTION amessagebox` din `oproceduri_comune.prg`; returneaza 6 (Da/OK) implicit, configurabil per apel prin `PUBLIC gnMockRaspuns` (raspuns generic), `gnMockRaspunsTotal` (raspuns separat pt. mesajul "Actualizati totalul facturii"), `gcMockUltimMesaj`/`gnMockUltimTip` (captura textul/tipul ultimului dialog, pt. asertii) (`mock_amessagebox.prg:1-44`). **Trebuie incarcat PRIMUL** in `SET PROCEDURE` (VFP foloseste, la nume duplicat, fisierul cautat primul, nu cel deschis cel mai recent) — vezi `test_init_env_auto_roafacturare.prg:119-121` unde e adaugat inaintea listei aplicatiei. LIMITA 1: nu acopera apeluri intra-fisier (ex. `verifica_partener_show_info` -> `amessagebox` in acelasi `oproceduri_comune.prg`) — necesita mock dedicat per caz (`mock_amessagebox.prg:13-15`). LIMITA 2: **nu acopera dialogurile de eroare ale lui `goExecutor`** — o interogare gresita agata headless fara nicio linie in log (`mock_amessagebox.prg:16-17`). Nu exista un mock generic pentru `goExecutor` la radacina `Teste\`; exista doar mock-uri punctuale per test in subfoldere (ex. `achizitie_import\mock_cauta_alfa_tva11.prg`, `achizitie_import\mock_oscrie_in_fisiere.prg`). - `watchdog_vfp.ps1` — pt. dialoguri native neprinse de ON ERROR/mock-uri (`SKILL.md:97-98`). Init de mediu specific ROAFACTURARE: `test_init_env_auto_roafacturare.prg` — vezi punctul 3. ## 3. Conectare Oracle in probe (schema MARIUSM_AUTO) Script: `D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg`. Apel: `DO test_init_env_auto_roafacturare WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola'` (`test_init_env_auto_roafacturare.prg:11`). Valori implicite daca parametrii sunt goi (`test_init_env_auto_roafacturare.prg:16-18`): - `tcHost` = `CENTRAL` - `tcSchema` = `MARIUSM_AUTO` - `tcPassword` = `ROMFASTSOFT` Conexiunea propriu-zisa: `goConn = createobject("oConn")` + `goConn.Connect(tcHost, tcSchema, tcPassword)` (`test_init_env_auto_roafacturare.prg:209-214`), verificata prin `gnHandle > 0`. Executorul de SQL e `goExecutor = createobject("oExecutor")` (`test_init_env_auto_roafacturare.prg:209`), folosit apoi pt. `oExecuta(...)`. An/luna de lucru fixe (independente de `Date()`): `gnAn=2026`, `gnLuna=8` daca nu sunt pasate ca parametri 4/5 (`test_init_env_auto_roafacturare.prg:36-37`). Firma: `gnIdFirma=110` implicit (parametru 6 optional) (`test_init_env_auto_roafacturare.prg:39,221-224`). Cale aplicatie fixa: `gcAppPath = 'D:\ROA\ROAFACTURARE\'` (`test_init_env_auto_roafacturare.prg:57`) — seteaza `SET PATH`/`SET CLASSLIB`/`SET PROCEDURE` identic cu `roafacturare.prg`, plus mock-ul `amessagebox` incarcat primul (`test_init_env_auto_roafacturare.prg:82-176`). Nota din antet: variantele `test_init_env_auto_.prg` (ROACONT/ROAGEST/ACNPRO/ROADEF) au cale + SET-uri specifice produsului, dar **partea de conexiune Oracle e identica** in toate (`test_init_env_auto_roafacturare.prg:6-9`). Alegerea harness-ului gresit incarca alt working copy silentios (`SKILL.md:21-23`). ## 4. Fisiere de progres/status existente In `D:\ROA\ROAFACTURARE\docs\`: - `progres.md` — **fisierul curent de stare**, actualizat de fiecare sesiune inainte sa se incheie; planurile (`plan_0*.md`) spun *ce*, `progres.md` spune *unde s-a ajuns* (`progres.md:1-7`). Format: titlu cu punctele acoperite, "Ultima actualizare: DD.MM.YYYY", apoi blocuri `> **RUNDA DD.MM.YYYY — titlu.**` cu subsectiuni in proza (ce s-a schimbat, decizii numerotate, teste rulate cu PASS/FAIL, capcane platite, ramas deschis) — nu tabel, istoricul sesiunilor nu se pastreaza, doar starea la zi (`progres.md:1-9`). - `handoff_*.md` — 6 fisiere curent (`handoff_update_romfast.md`, `handoff_cont_discount_667_709.md`, `handoff_id_set_skilluri.md`, `handoff_idempotenta_id_set.md`, plus altele). Format observat in `handoff_idempotenta_id_set.md:1-13`: titlu cu subiect+data, sectiuni numerotate H2 — "Livrabile terminate" (tabel Ce/Unde/Stare), "Ce face X", "APROBAT dar NEEXECUTAT", "NEFINALIZAT/necomis", "Comenzi de reluat" (bloc powershell), incheiat de regula cu inventar fisier:linie si stare write-back per fisier atins. - `diff_*.md` / `diff_*.patch` — diff-uri de revizuit inainte de commit (ex. `diff_cont_discount_667_709.md`). - `plan_index.md` + `plan_1*.md` — planuri pe story-uri (ex. `plan_10_integrare_contracte.md`). - `docs\cercetare\*.md` — ~60 de fisiere de cercetare/investigatie punctuala (un subiect per fisier). - `erori_deschise.md`, `livrare_13.md`, `raport_doc.md`, `raport_src.md`. In `D:\ROA\ROAFACTURARE\COMUN\docs\` (relevante pt. orchestrare/testare, nu fisiere de progres in sine ci proceduri): - `orchestrare-subagenti.md` — procedura Regula zero (predare context), citata de `raport_teste.ps1:2-3`. - `reguli_lucru.md` — index de reguli de lucru/testare, ruteaza pe zona la skill-ul potrivit. - `depanare_testare_vfp.md`, `testare-ui-vfp.md` — capcanele detaliate din `SKILL.md` (sec. 6-7 / integral). Nu exista fisiere de progres/status in `D:\ROA\COMUNROA\` — directorul `COMUNROA` (shared suite-wide, distinct de `COMUN\` din interiorul ROAFACTURARE) nu are un `docs\progres.md` propriu vizibil din acest working copy. ## 5. Hook-uri configurate ### `C:\Users\mmari\.claude\settings.json` (nivel user, global) - `UserPromptSubmit` -> `context_watch.ps1 -Stdout` (mesaj injectat, exit 0). - `SessionStart` -> `docs_revizie_check.ps1 -Stdout`. - `PostToolUse` -> `context_watch.ps1 -OSinguraData` (async, timeout 20s). - `PreCompact` -> mesaj fix de sistem (Regula zero — predare la compactare). - `PostCompact` -> mesaj fix + `additionalContext` (Regula zero — predare obligatorie dupa compactare). - `SubagentStop` -> mesaj fix (`additionalContext`) care aminteste orchestratorului sa verifice daca subagentul si-a scris starea pe disc inainte sa-i dea sarcina urmatoare. **Da, exista deja un hook `context_watch`**, script: `D:\ROA\ROAGEST\COMUN\utile\context_watch.ps1` (in COMUNROA/ROAGEST, partajat intre proiecte, invocat din `settings.json` cu cale absoluta acolo). Ce face (`context_watch.ps1:1-9,55-84`): - Citeste ultimul `"usage":{...}` din coada transcriptului JSONL al sesiunii curente (ultimii 400KB din fisier, nu tot fisierul), insumeaza `input_tokens + cache_creation_input_tokens + cache_read_input_tokens`. - Praguri: `-Prag 250000` (implicit, nivel "avertisment") si `-PragMax 275000` (implicit, nivel "max" — peste limita, predare OBLIGATORIE acum). - La `avertisment`: mesaj care cere incheierea blocului curent, actualizarea handoff-ului pe disc, delegarea catre subagenti a oricarei citiri/testari ramase. - La `max`: mesaj cu procedura completa Regula zero (opreste lucrul, scrie handoff pe disc, confirma in doua randuri, preda unei sesiuni noi). - `-Stdout`: scrie mesajul pe stdout si iese cu 0 (folosit pe `UserPromptSubmit`, injecteaza context fara sa esueze hook-ul). Fara `-Stdout`: scrie pe stderr si iese cu exit 2 (semnaleaza agentului). - `-OSinguraData` (folosit pe `PostToolUse`): emite alerta o singura data per sesiune+prag, marcaj fisier in `%TEMP%\claude_ctxwatch__.flag` — altfel mesajul s-ar repeta la fiecare tool call (`context_watch.ps1:9-10,74-80`). - Fara `-TranscriptPath` explicit, il citeste din stdin (JSON-ul hook-ului) sau, ca fallback, cauta cel mai recent `.jsonl` din `~/.claude/projects/\` (`context_watch.ps1:18-34`). ### `D:\ROA\ROAFACTURARE\.claude\` (nivel proiect) Singurul fisier: `settings.local.json`, continut integral `{"outputStyle": "Concise"}`. **Niciun hook definit la nivel de proiect** — toate hook-urile active vin din `settings.json` global de user.