192 lines
13 KiB
Markdown
192 lines
13 KiB
Markdown
# 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.
|