# Flux editare .vcx/.scx pe text (comun proiectelor VFP) Textul .vc2/.sc2 e sursa de editare; write-back in binar cu `txt2vcx.ps1`, fara VFP IDE. Detalii complete: `D:\ROA\UTIL\foxbin2prg\CLAUDE.md`. Parametrii per proiect: sectiunea de mai jos. **Proiecte migrate (ROACONT, COMUN, …): flux in-arbore.** Textul .??2 sta langa binare, il improspateaza `git_sync.ps1 -ProjectRoot ` (nu cache extern) — la inceput de sesiune si inainte de orice `git commit`. Write-back doar pentru vcx/scx; `frx/mnx/lbx/pjx/dbc/dbf` doar in IDE. `txt2vcx.ps1` cu `-CacheRoot` = `-ProjectRoot` (implicit). Pasul 0 de mai jos devine rularea `git_sync.ps1`; restul pasilor raman la fel. Fluxul cu cache extern (`vcx2txt.ps1` + `-CacheRoot` separat) ramane doar pentru proiectele nemigrate. **Capcana: `git_sync.ps1` cu `-ProjectRoot` pe COMUN direct.** Lista implicita `-RoundtripExempt` are cai de forma `COMUN\clase\.vcx` (raportate la radacina unei aplicatii, unde COMUN e subfolder) si se lipeste de `-ProjectRoot`. Cand radacina E chiar COMUN, caile nu mai potrivesc si clasele scutite (FFC/third-party cu `#INCLUDE`, ex. `oinventar.vcx`) raporteaza fals `roundtrip text1 != text2`. Ruleaza atunci cu lista rebazata: `git_sync.ps1 -ProjectRoot 'D:\ROA\ROAGEST\COMUN' -RoundtripExempt @('clase\accessibility.vcx', 'clase\oinventar.vcx','clase\_gdiplus.vcx','clase\_reportlistener.vcx', 'utile\foxcharts\foxcharts.vcx','utile\web\_webview.vcx')` - si apeleaza scriptul cu `&`, nu cu `powershell -File` (acolo lista nu se leaga ca array). ## Parametri per proiect (nemigrate, cache extern) - **ROAGEST**: `-Project 'D:\ROA\ROAGEST\roagest.pjx' -ProjectRoot 'D:\ROA\ROAGEST' -CacheRoot 'D:\ROA\_vfp_textcache\roagest'`; patch-uri de review in `docs/diff_runda_.patch`. ## Pasii unei runde 0. Refresh cache (obligatoriu dupa orice sesiune IDE — staleness pe mtime): `vcx2txt.ps1 -Project -ProjectRoot -CacheRoot -Types vcx,scx` 1. Baseline: `Copy-Item .vc2 .vc2.pre_runda.bak` (in cache; la runde succesive necomise, diff-ul fata de HEAD ar amesteca rundele). 2. Editare byte-safe: PowerShell `[IO.File]::ReadAllText/WriteAllText(..., GetEncoding(1252))`; NU tool-ul Edit/Write (UTF-8 strica diacriticele). Continut nou ASCII, TAB-uri ca in jur, fara reflow (format position-sensitive, proprietati alfabetizate). Valabil si pentru `.prg`. 3. Patch review: `git diff --no-index > docs/diff_runda_.patch` (exit 1 = normal). Utilizatorul revizuieste FISIERUL de patch si aproba; write-back-ul (pasul 5) se face DOAR dupa aprobare. Commit doar dupa confirmare pe patch + test in IDE. Comentariile in cod: conventia din `reguli_lucru.md` (punctul 2). Obligatoriu inainte de a preda patch-ul la review: skill-ul de code-review rulat pe bucatile de cod din diff (nu doar citire manuala) - prinde defecte gen IIF cu numar gresit de argumente, deduplicari care nu se declanseaza niciodata, interogari mai largi decat e nevoie. Review-ul verifica si compactitatea/reutilizarea: cod care refoloseste functiile si clasele comune existente in loc sa le reinventeze (ex. cursor2lista()/cursor2listac() pentru liste dintr-un cursor in loc de Scan manual; butoane din cmd_butoane.vcx in loc de butoane ad-hoc). Inventarul comunelor: COMUN\docs\inventar-comun.md - se consulta si la pasul de plan/arhitectura, inainte de a scrie cod nou. 4. Preconditie write-back: binarul tinta sa nu fie blocat. `txt2vcx.ps1` verifica singur (`Test-ExclusiveAccess` pe `.vcx`+`.vct`) si refuza cu mesaj clar daca e lock. NU conteaza existenta altor instante `vfp9` — utilizatorul poate lucra in paralel in alt proiect VFP — si NU se omoara procese: cand lock-ul exista, se cere utilizatorului sa inchida sesiunea. 5. Write-back: `txt2vcx.ps1 -TextFile -ProjectRoot -CacheRoot ` (+ `-AllowComun` cu aprobare explicita pentru tinte COMUN — afecteaza toate aplicatiile ROA). Succes = fidelity-check trecut: binar cu mtime nou; `vcx2txt.ps1` ulterior il vede la zi. 6. Teste finale pe cerinta initiala (cerinta Marius, valabila in toate proiectele VFP): dupa ultima runda, teste e2e (harness UI, pe fluxul real al utilizatorului) care verifica ca rezultatul construit *arata si se comporta* conform cerintei initiale — scenariul concret dat de Marius, cu valorile lui asteptate — nu doar teste per-fix. Assert-uri pe continutul rezultatului (sume, campuri, randuri), nu pe efecte de suprafata ("a aparut un rand" nu e suficient). 7. Backup-urile `.pre_runda*.bak` si patch-urile se sterg la curatenia de dupa commit. ## Capcane - `.mnx`/`.frx` raman read-only (GENMENU in IDE / round-trip fragil). - Linii complet goale in metode pica fidelity doar pe whitespace; fix: preia `verify\*.vc2` din staging peste cache si reia write-back-ul. - Metoda noua de clasa cere `*m: nume` in `*`; fara ea, prima salvare din IDE o arunca tacut, iar refresh-ul urmator absoarbe pierderea in cache (si in .bak-uri). Override-urile de metode de baza (Init, Show, hook-uri) nu au nevoie de `*m:`. - Salvarea din VFP IDE peste un binar scris de txt2vcx poate PIERDE si definitii `*m:` deja existente, desi corpurile PROCEDURE raman (patit pe ROAGEST: `import_adauga_factura.recalc_tva`, `import_nota.do_adauga/do_copie/do_reface`, 07.2026); simptom: crash la Createobject cu "Data type mismatch" raportat la linia apelanta. Dupa orice sesiune IDE pe clasa: refresh cache + compara lista `*m:` cu starea de dinainte. - Nu folosi *Project > Build* ca sa recompilezi un binar vizat: rebuild-ul recompileaza toate `.vcx`/`.vct` din proiect si le rescrie antetul (timestamp compilare) si posibil p-code-ul intern si la librarii neatinse efectiv, aparand fals ca "modificate" in diff — de aici fluxul text->bin punctual pe binarul vizat. - Subagentii delegati primesc regulile 2-5 in prompt si raporteaza unicitatea sirurilor inlocuite + rezultatul fidelity-check-ului. - Fisierele `.vc2`/`.sc2` sunt CRLF, dar here-string-urile PowerShell (`"...`r`n..."` sau `@"..."@`) produc LF simplu pe orice linie noua inserata daca nu incluzi explicit `` `r`n `` la fiecare capat de linie - rezultatul e un fisier cu sfarsituri de linie amestecate (CRLF pe continutul vechi, LF pe cel nou). Verificare finala obligatorie dupa orice scriere: numara octetii `0x0A` neprecedati de `0x0D` (LF izolati) - trebuie sa fie 0.