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.prga 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(implicitC:\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 cuvfp9.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 apareMainWindowHandle, 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
PrintWindowpe handle (flagPW_RENDERFULLCONTENT=2, fallback flag 0 daca iese gol) — nuCopyFromScreen(vfp_ui_harness.ps1:106-131). - Bucla pasi: asteapta
ready_<n>.txt(scris de test dinui_harness.prg), face screenshot, scriecont_<n>.txtca sa continue testul (vfp_ui_harness.ps1:200-221). - La final asteapta
done.txt, omoara doar instantelevfp9.exeproprii (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).HarnessWaitContinueare auto-continue dupaautoSec(implicit 30s) daca orchestratorul nu raspunde — testul merge si faravfp_ui_harness.ps1, doar fara capturi (ui_harness.prg:8-9,43-49).HarnessInit:SET SAFETY OFF+SET TALK OFFdefensiv (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/UPESCAPE,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,RecordSourcesunt artefacte) — cunoscut, documentat separat (memoriegrid-coloane-nu-se-materializeaza-headless); simptomul apare si in suitele UI (ex.test_page3_articole14/2 indocs\progres.md:67, cele 2 FAIL = artefactul de baseline). watchdog_vfp.ps1clasifica orice fereastra noua diferita deMainWindowHandleca 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— inlocuiesteFUNCTION amessageboxdinoproceduri_comune.prg; returneaza 6 (Da/OK) implicit, configurabil per apel prinPUBLIC 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 inSET PROCEDURE(VFP foloseste, la nume duplicat, fisierul cautat primul, nu cel deschis cel mai recent) — vezitest_init_env_auto_roafacturare.prg:119-121unde e adaugat inaintea listei aplicatiei. LIMITA 1: nu acopera apeluri intra-fisier (ex.verifica_partener_show_info->amessageboxin acelasioproceduri_comune.prg) — necesita mock dedicat per caz (mock_amessagebox.prg:13-15). LIMITA 2: nu acopera dialogurile de eroare ale luigoExecutor— o interogare gresita agata headless fara nicio linie in log (mock_amessagebox.prg:16-17). Nu exista un mock generic pentrugoExecutorla radacinaTeste\; 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=CENTRALtcSchema=MARIUSM_AUTOtcPassword=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.mdspune 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 inhandoff_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 deraport_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 dinSKILL.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), insumeazainput_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 peUserPromptSubmit, injecteaza context fara sa esueze hook-ul). Fara-Stdout: scrie pe stderr si iese cu exit 2 (semnaleaza agentului).-OSinguraData(folosit pePostToolUse): 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
-TranscriptPathexplicit, il citeste din stdin (JSON-ul hook-ului) sau, ca fallback, cauta cel mai recent.jsonldin~/.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.