Files
roafacturare/docs/qa_factura_unelte.md
2026-09-17 22:44:24 +03:00

13 KiB

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_<n>.txt/cont_<n>.txt).
  • -StepTimeoutSec (implicit 130), -ReadyTimeoutSec (implicit 180, pt. ready_0 = afisarea formularului).
  • -ShotsDir (implicit <folder test>\screenshots), -SyncDir (implicit <folder test>\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 <test.fxp> (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_<n>.txt (scris de test din ui_harness.prg), face screenshot, scrie cont_<n>.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 "<script.prg>" <param>, 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 <test>_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 <fisier> 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_<produs>.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_<sesiune>_<nivel>.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/<cwd-encodat>\ (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.