Squash al branch-ului de lucru plan13-s2. Clase: ofacturare (nucleul formularului unificat), ofacturare_comun, ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de cautare), omodificari. Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie si cota standard de TVA cand articolul nu are cota pe politica. Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte proiecte sunt rezolvate pastrand ambele parti. Loguri de rulare a testelor scoase din versionare; testele raman. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
12 KiB
12 KiB
Reguli de lucru agent (comune proiectelor ROA VFP)
- Modificari de cod: diff ca FISIER
docs\diff_runda<N>_<subiect>.patch(git diff --no-index <baseline.bak> <editat>), nu in terminal. COMMIT-ul e singurul pas care asteapta aprobarea patch-ului. Write-back-ul in binar (txt2vcx) si testele se fac IMEDIAT dupa editarea.vc2/.sc2, fara sa astepti raspunsul — inclusiv peCOMUN— ca sa ajungi la review cu rezultatele testelor, nu cu o propunere netestata; daca nu merge, revii cugit checkoutpe binare (.vcx+.vct) sau cu write-back din*.pre_runda*.bak. Patch-urile (in .gitignore,docs/diff_runda*.patch) nu se comit niciodata, raman local. Curatenia de dinainte de commit NU se face pe cap de agent, ci cupowershell -File COMUN\utile\curatenie.ps1(-DryRunlisteaza fara sa stearga): patch-uri, handoff-uri/planuri de runda, notele de rezolvare (docs/fix_*.md,docs/fix_*.diff),*.pre_runda*.bak,.bak-urile din cache-ul text si artefactele de test (screenshots*,uisync*,.fxp,.err, loguri). Sterge doar fisiere neurmarite de git — cele tracked sunt sarite. - Comentarii in cod SI in scripturile de migrare
.sql: minime, strict functionale, descriu comportamentul CURENT (ca si cum ar fi scris asa de la inceput). Doar daca e cazul — un comentariu se scrie acolo unde explica o ramura sau un filtru care nu se citeste singur, ca sa se inteleaga codul; unde codul e limpede, nu se comenteaza. O linie de regula, 2-3 doar pentru metode cu contract nebanal (parametri, cursor asteptat/lasat deschis, pozitionare la iesire), 4-5 in antetul unui script de migrare (ce e obiectul si ce contract are). INTERZIS in comentariu: nume de agent ("claude"), referinte la planuri, stories, propuneri, decizii, etape sau erori (docs/plan_*.md,docs/propuneri_*.md, "#6", "S4", "M2", "T3", "dec.6", "runda27", "E7", "D-H2"), trimiteri la rapoartele dindocs/("vezi raportul, sectiunea ..."), justificarea alegerii facute (de ce numele acesta, de ce s-a respins varianta cealalta), istoricul modificarii ("inlocuieste...", "nu mai depinde de...", "mutat din..."), date si autori pe cod nou. Comentarii vechi in stil jurnal nu se rescriu din oficiu — doar cand blocul e oricum atins sau la cerere explicita. Istoricul modificarilor sta DOAR in antetul fisierului (niciodata inline, la fel in.prg,.sqlsi PL/SQL Oracle): o singura intrare CUMULATIVA per functionalitate (*!* DD.MM.YYYY/*!* autor/*!* ce face, 1-2 fraze) — la revenire se rescrie intrarea, nu se adauga alta; autorul e cine semneaza livrarea (ex.marius.mutu), niciodata agent. Doar comportamentul final — fara revizii/runde/patch-uri/corectii. La rezolvari de erori: fara comentarii. Explicatiile merg in docs/ sau in mesajul de commit, nu in cod. Changelog (changelog_<aplicatie>.txt): strictul necesar, pe limba utilizatorului, non-tehnic — 1-3 fraze/intrare, fara detalii de implementare, fara enumerarea locurilor atinse. Cat timp lucrarea n-a ajuns la utilizatori, erorile introduse si corectate in interior NU se mentioneaza — intrarea descrie functionalitatea finala,:nou:/:modificare:;:eroare:doar pentru erori care au fost in productie. - Modificari minime si SCOPED: doar ce s-a cerut, doar pe cazul cu problema, fara refactorizari
din oficiu. Cauta intai ce exista (
inventar-comun.md) si refoloseste; daca lipseste ceva, propune COMPLETAREA unei functii/tabele/view comune, nu o varianta paralela. 80/20: solutia cea mai simpla care rezolva cazul real. Completeazainventar-comun.mdla orice descoperire/creare de element comun nedocumentat. Cod nou: clase in.prg, nu metode in.vcx/.scx. Logica se incapsuleaza intr-o clasa (Define Class ... As Custom) dintr-un.prg; formularul sau clasa vizuala doar instantiaza obiectul (Createobject) si il apeleaza, metoda din binar ramanand un apel de o linie. Sablon:COMUN\programe\anaf_efactura.prg(AnafeFacturaServer,ANAFeFactura), apelat dinclase\anaf_efactura.vcx. Motivul e de intretinere: un.prgse editeaza direct si diff-ul lui se citeste in git, pe cand codul pus ca metoda in binar trece prin FoxBin2Prg si write-back si se urmareste greu. Scara ponytail (plugin activ implicit pefull, injectat si in subagenti;ultranu se foloseste pe cod legacy partajat): opreste-te la prima treapta care tine - 1) trebuie sa existe? 2) exista deja (inventar-comun.md,COMUN\programe,COMUN\clase) -> refolosesti; 3) o functie VFP nativa o face; 4) se rezolva pe Oracle (view, constrangere, pachet) in loc de cod client; 5) o linie; 6) abia apoi minimul care merge. Scurteaza SOLUTIA, nu cititul - intai urmaresti fluxul real atins. Nu se simplifica niciodata: garzile pe NULL, validarile, tratarea erorilor, drepturile de acces, ce s-a cerut explicit. Abateri obligatorii fata de plugin: (a) fara comentariiponytail:in cod (regula 2) - scurtatura deliberata si limita ei se noteaza indocs\progres.md, deci/ponytail-debtnu are ce culege aici; (b) proba unei logici noi e un script headless (regulile 4 si 8), nutest_*.py; (c) handoff-urile, rapoartele dindocs\si patch-urile sunt output cerut explicit - regula "cod intai, maxim trei randuri" nu li se aplica; (d)/ponytail-reviewpe diff-ul rundei inainte de commit e util, dardelete:/yagni:sunt IPOTEZE, nu constatari: inCOMUNapelantii sunt in toate produsele, deci cauti in totD:\ROAinainte sa stergi, iar o garda fara caz in datele de test nu e garda moarta (regula 6);/ponytail-auditpe tot arborele nu se ruleaza aici. - Testare headless (fara IDE):
vfp9.exe -A -T "<script.prg>" <param>din PowerShell. Mediu, sabloane, capcane, depanare:depanare_testare_vfp.md. Rularile intermediare acopera doar familiile de teste atinse de modificarea curenta; suita completa, inclusiv testele de garda pe zonele vecine, se ruleaza doar la rularea finala — garzile exista fiindca schimbarile cad de regula in cod partajat (COMUN), vizibil in toate produsele, dar costul lor nu se plateste la fiecare rulare intermediara. Ideal, doar testele atinse direct (de regula 3-10), nu toata familia. Un test normal dureaza 1-5s — ce umfla o rulare nu e testarea, ci asteptarea unui test atarnat. La rulari intermediare: timeout 90s/test (ce trece de atat e atarnat, nu lent) si pauza 0,5s intre teste, nu implicitul de 12 minute / 3s, rezervat rularii finale unde chiar conteaza sa distingi "atarnat" de "lent". Tinta: o rulare intermediara sta in secunde-minute, nu ore — daca depaseste, lista e prea larga sau timeout-ul prea mare. - Editare .vcx/.scx pe text (cache, cp1250 byte-safe, fidelity-check):
flux-editare-vfp-text.md. Cautare in binare:cautare_vcx_vct.md. Versiunile.??2sunt instantanee, pot fi mai vechi decat binarul — verifica mtime inainte de concluzii; continutul real e in.PJX. - Delegare: implementarile, testele, verificarile si cercetarile se dau unor subagenti Sonnet in
background (lane-uri paralele); sesiunea principala doar orchestreaza si verifica, ca sa nu i
se umple contextul. Misiuni lungi: subagenti proaspeti per sarcina (max ~200-250k
tokens/subagent), nu unul singur cu context acumulat; handoff compact pe disc. Verificarea a
ce se intoarce si modelul de lucru (backlog de story-uri mici):
orchestrare-subagenti.md. - Conventii obligatorii, de citit cand atingi zona respectiva:
- editezi
.vc2/.sc2sau.prgcu diacritice (ex.programe\ocautare.prg, undes-urile cu virgula dinmasina/si contul/transasunt octetul0xBA) -> fisierele sunt cp1250 desi antetul FoxBin2Prg declaraCPID="1252"; Edit/Write corup TOT fisierul (nu doar linia atinsa), ireversibil, la fiecare scriere - scrie continut nou strict ASCII. Cens obligatoriu inainte SI dupa fiecare editare (la stricare CRESTE, nu scade):od -An -tx1 <fisier> | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c. Tabelul complet de octeti, sensul censului la stricare si procedura de recuperare din git/svn ->conventie_encoding_cp1252.md; - adaugi o PROPRIETATE sau o METODA noua intr-o clasa
.vc2/.sc2->flux-editare-vfp-text.md, sectiunea "Membri noi de clasa": fara intrarea*p:/*m:in*<DefinedPropArrayMethod>membrul trece fidelity-check-ul, dar VFP nu-l vede si prima salvare din IDE il sterge tacut; - adaugi/rearanjezi controale pe formulare sau coloane in grid ->
conventie_ux_formulare.md; - grid needitabil pe formular cu 2+ grid-uri ->
capcana_grid_controlsource.md; - adaugi o coloana intr-un grid deja livrat (ordinea din clasa e neutralizata de
preferintele salvate per utilizator) ->
capcana_grid_preferinte_utilizator.md; GOpe unRecno()capturat/primit ca parametru ->conventie_go_recno.md;ALTER TABLEpe cursorul intors degoExecutor.oExecute()->conventie_goexecutor_alter_table.md;- testare UI ->
testare-ui-vfp.md; - te conectezi la Oracle pe dev/test, alegi schema sau rulezi un script de pachet ->
conventie_mediu_oracle.md; - garzi pe valori NULL din Oracle ->
conventie_null_vfp.md; - procedura PL/SQL cu
SELECT ... INTOchemata din VFP (linii pierdute tacut) ->capcana_sqlexec_no_data_found.md; - export date din Oracle ->
oracle_export.md; - actualizarea ROA nu se finalizeaza (job update, PACK_UPDATE) ->
depanare-pack-update.md; - modifici schema Oracle (tabele/view-uri/pachete) ->
scripturi-migrare-db.md.
- editezi
- Eroare raportata de utilizator: nu analiza statica indelungata — scrie intai un test care o reproduce pe fluxul real; el da cauza si confirma remedierea. Analiza statica doar cat sa stii ce sa pui in test.
- Context sesiune principala: la peste 250k salveaza contextul intr-un handoff pe disc, il
predai unei sesiuni noi si te opresti. Limita maxima absoluta: 275k. Nu estima - masoara:
hook-ul din
monitorizare-context.mdanunta pragul la fiecare mesaj. - Fisier de progres MASTER per proiect (
docs\progres.md): la zi pe tot parcursul, nu doar la predare — stare curenta, facut/testat, ipoteze excluse (cu dovada), ce urmeaza, fisiere atinse, comenzi de rulat. O sesiune noua porneste de acolo, fara sa reia investigatia. E ajutor de predare, nu documentatie: dupa commit, cu toate sarcinile terminate, se sterge. - La final de lucrare/cercetare: propune actualizarea documentatiei —
COMUN\docs\daca e comun tuturor aplicatiilor,docs\al proiectului daca e specific (plusinventar-comun.md, regula 3). Doar relevant si reutilizabil (80/20): flux ascuns, capcana, procedura/tabela cheie — nu tot ce ai atins, nu verbose. Cateva randuri; propui, nu scrii din oficiu. O notita = regula + strictul de context ca sa fie aplicabila: fara cazul particular in care ai gasit-o, fara simptomele lantului de erori, fara ce se deduce din cod (cititorul stie deja). - Revizuire periodica a documentatiei (
COMUN\docs\,docs\al proiectului, inclusiv acest fisier): compacteaza pastrand semantica — taie ce se deduce din cod, exemplele repetate, istoricul, tot ce nu mai schimba o decizie. Scopul: docs + reguli sa ocupe cat mai putin context la incarcare. Propui rezultatul, nu rescrii din oficiu; nu pierzi nicio regula/capcana, doar cuvintele in plus. Fisierele de reguli/conventii se completeaza doar cu ce e super-util, simplu si concis. Cadenta o da hook-ul dinmonitorizare-context.md(marker la 30 de zile). - Documente de propuneri/directie: unul singur, final, in
COMUN\docs\cercetare\rec_*.md. Materialul de lucru (brief-uri, handoff-uri, variante intermediare, patch-uri) NU se pastreaza; dovezile masurate si scripturile raman indocs\al proiectului, iar documentul trimite la ele. Structura per propunere, in aceasta ordine: unde (modulul/ecranul +fisier:linie), cum e azi, ce se schimba, ce se castiga (cifra, marcatamasuratsaunemasurat), ce risc. Gruparea e pe sectiuni de program, nu pe teme abstracte.masurat= backtest cronologic pe date reale comparat cu ce a confirmat operatorul, nu estimare; orice cifra nemarcata se citeste ca inventata. Se adauga o sectiune de respinse, cu motivul intr-un rand, ca sa nu fie repropuse, si capcanele de masurare platite. INTERZIS: naratiune de proces (cine ce a raportat, cum s-au coordonat benzile), tabele de tip "efort mic/mediu" fara explicatie, liste de etichete tehnice, aceeasi idee in doua fisiere.