skills: 9 skill-uri de agent ROA (COMUN\skills) + legare si rutare

- leaga_skills.ps1: expune skill-urile in ~/.claude/skills prin symlink (citit si de Claude Code, si de opencode), fara copiere
- rutare zona->skill in reguli_lucru pct. 7, README, AGENTS.md; skill-ul devine proprietarul procedurii, docurile raman referinta conditionata
- rec_skills.md: decizia, inventarul si cum se adauga un skill nou
This commit is contained in:
2026-09-16 11:54:37 +03:00
parent 59c0c7be31
commit d64124386c
13 changed files with 1043 additions and 37 deletions

View File

@@ -14,30 +14,30 @@ atingi zona X, citeste fisierul Y"). Restul se deschid doar la declansator.
| `reguli_lucru.md` | intotdeauna, la inceput de sesiune |
| `orchestrare-subagenti.md` | cand delegi, cand verifici ce intoarce un subagent, la predarea contextului |
| `monitorizare-context.md` | instalarea hook-urilor de prag de context si de revizie a docs |
| `fluxul_svn_git.md` | orice commit / `svn update` / `roa_sync`; ce e interzis pe `main` in COMUN |
| `fluxul_svn_git.md` | orice commit / `svn update` / `roa_sync` -> skill `roa-git-svn-commit` |
| `scripturi-uzuale.md` | exista deja un script pentru sarcina asta? (roa_sync, curatenie, livrare, diagnostice) |
| **VFP** | |
| `cautare_vcx_vct.md` | cauti cod in `.vcx`/`.scx`/`.frx`/`.mnx` |
| `flux-editare-vfp-text.md` | editezi `.vc2`/`.sc2` + write-back; **invariantele si `*p:`/`*m:`** |
| `conventie_encoding_cp1252.md` | fisierul editat are diacritice (cp1250, nu cp1252) |
| `cautare_vcx_vct.md` | cauti cod in `.vcx`/`.scx`/`.frx`/`.mnx` -> skill `roa-vfp-text-edit` |
| `flux-editare-vfp-text.md` | editezi `.vc2`/`.sc2` + write-back; invariantele si `*p:`/`*m:` -> skill `roa-vfp-text-edit` |
| `conventie_encoding_cp1252.md` | fisierul editat are diacritice (cp1250, nu cp1252) -> skill `roa-vfp-text-edit` |
| `inventar-comun.md` | inainte de cod nou: exista deja o functie/clasa comuna? |
| `conventie_ux_formulare.md` | adaugi/rearanjezi controale pe formular |
| `capcana_grid_controlsource.md` | grid needitabil pe formular cu 2+ grid-uri |
| `capcana_grid_preferinte_utilizator.md` | adaugi o coloana intr-un grid deja livrat |
| `conventie_go_recno.md` | `GO` pe un `Recno()` capturat |
| `conventie_null_vfp.md` | garzi pe valori NULL din Oracle |
| `conventie_go_recno.md` | `GO` pe un `Recno()` capturat -> skill `roa-vfp-go-recno` |
| `conventie_null_vfp.md` | garzi pe valori NULL din Oracle -> skill `roa-vfp-null-guards` |
| `conventie_goexecutor_alter_table.md` | `ALTER TABLE` pe cursorul de la `oExecute()` |
| **Testare** | |
| `depanare_testare_vfp.md` | rulare headless, depanare bug runtime, capcane VFP |
| `testare-ui-vfp.md` | test cu formular real + screenshots (harness UI) |
| `depanare_testare_vfp.md` | rulare headless, depanare bug runtime, capcane VFP -> skill `roa-vfp-headless-test` |
| `testare-ui-vfp.md` | test cu formular real + screenshots (harness UI) -> skill `roa-vfp-headless-test` |
| **Oracle** | |
| `conventie_mediu_oracle.md` | te conectezi la dev/test, alegi schema, rulezi un script de pachet |
| `conexiuni-tunel-ssh-odbc.md` | ajungi la un Oracle de PRODUCTIE prin tunel SSH (Bitvise) + alias TNS + DSN ODBC |
| `scripturi-migrare-db.md` | modifici schema (tabele/view-uri/pachete); compatibilitate 10.2 |
| `publicare-scripturi-db.md` | publici scripturile catre clienti |
| `oracle_export.md` | reexporti sursa unui pachet PL/SQL |
| `depanare-pack-update.md` | actualizarea ROA nu se finalizeaza la un client |
| `depanare-spatiu-oracle.md` | spatiu plin la un client |
| `conexiuni-tunel-ssh-odbc.md` | ajungi la un Oracle de PRODUCTIE prin tunel SSH (Bitvise) + alias TNS + DSN ODBC -> skill `roa-oracle-production-access` |
| `scripturi-migrare-db.md` | modifici schema (tabele/view-uri/pachete); compatibilitate 10.2 -> skill `roa-oracle-migration` |
| `publicare-scripturi-db.md` | publici scripturile catre clienti -> skill `roa-oracle-migration` |
| `oracle_export.md` | reexporti sursa unui pachet PL/SQL -> skill `roa-oracle-migration` |
| `depanare-pack-update.md` | actualizarea ROA nu se finalizeaza la un client -> skill `roa-oracle-diagnostic` |
| `depanare-spatiu-oracle.md` | spatiu plin la un client -> skill `roa-oracle-diagnostic` |
| **Domeniu** | |
| `flux-modificare-stergere-nota-jurnal.md` | modificare/stergere nota; ce face `PACK_CONTAFIN` |
| `tipuri_documente_facturare.md` | `VANZARI.TIP` si seturile de contare `ID_SET` |

View File

@@ -0,0 +1,59 @@
# rec_skills - skill-uri de agent pentru suita ROA
Data: 2026-09-16. Status: aplicat (9 skill-uri create, rutare + backstop puse in docs).
## Decizie
- Skill-ul este **proprietarul procedurii**; docurile din `COMUN\docs` raman **referinta
conditionata**, deschisa doar cand o ramura cere detaliu. Motiv: sa nu se incarce contextul de
doua ori si sa nu existe doi proprietari pentru aceeasi regula. (Suprapunerea masurata inainte
de unificare: 18-42% din liniile corpului unui skill erau identice cu linii din docuri.)
- Fiecare SKILL.md: frontmatter doar `name` + `description` (comun ambelor host-uri), corp
auto-suficient cu secventele `Cand se foloseste / Pasi (sau Regula) / Capcane / Criterii de
acceptare si dovada / Scripturi / Referinta (doar la nevoie)`, cel mult 1 pointer conditio nat la
un doc.
- Skill-urile traiesc in `COMUN\skills\<nume>\SKILL.md`, versionate in `comun.git`.
- Sunt expuse host-urilor prin symlink in `%USERPROFILE%\.claude\skills\` - director citit si de
Claude Code, si de opencode - fara copiere: `COMUN\utile\leaga_skills.ps1` (idempotent, `-DryRun`).
- Declansarea automata vine din `description` (ambele host-uri); "de fiecare data" vine din
**backstop-ul always-on**: `reguli_lucru.md` pct. 7 (citit la fiecare sesiune) + `AGENTS.md`
(pentru opencode, care nu citeste `CLAUDE.md`) + ancora in `CLAUDE.md`.
## Inventar
| Skill | Deschide cand (zonele) |
|---|---|
| `roa-vfp-text-edit` | editare `.vcx/.scx` pe text (`.vc2/.sc2`), cautare in binare, encoding cp1250, write-back |
| `roa-vfp-headless-test` | rulare/depanare teste VFP headless, harness UI + screenshots |
| `roa-git-svn-commit` | commit / `svn update` / `roa_sync` in COMUN |
| `roa-oracle-migration` | scriere + publicare scripturi de migrare, re-export pachet PL/SQL |
| `roa-oracle-diagnostic` | update ROA blocat la client, tablespace/disc plin |
| `roa-oracle-production-access` | acces Oracle de productie (tunel SSH + TNS + DSN ODBC) |
| `roa-vfp-null-guards` | garzi pe valori NULL din Oracle in VFP |
| `roa-vfp-go-recno` | `GO` pe un `Recno()` capturat sau primit ca parametru |
| `roa-oracle-sqlexec-no-data` | procedura PL/SQL cu `SELECT ... INTO` apelata din VFP (randuri pierdute tacut) |
## Cum se adauga un skill nou
1. Creezi `COMUN\skills\<nume>\SKILL.md` (contractul de mai sus; `name` = numele folderului,
lowercase-cu-cratima).
2. Rulezi `COMUN\utile\leaga_skills.ps1` (creeaza symlink-ul in `%USERPROFILE%\.claude\skills\`).
3. Adaugi o linie de rutare in `reguli_lucru.md` pct. 7 si in `AGENTS.md` (`README.md` pentru
index). Nu duplici regula din docs: skill-ul o detine.
4. Verifici cu cele doua asertiuni: (a) nicio linie din `CLAUDE.md`/`AGENTS.md`/`reguli_lucru.md`/
`README.md` nu ruteaza o zona acoperita catre un doc; (b) fiecare skill are cel mult 1 pointer
conditio nat la un doc.
## Verificari la data aplicarii
- 9/9 skill-uri: ASCII pur, fara BOM, `name` = folder, descriere <= 1024, exact 1 bullet sub
`## Referinta (doar la nevoie)`.
- 0 rute reziduale zona -> doc in `CLAUDE.md`, `AGENTS.md`, `reguli_lucru.md`, `README.md`.
- `leaga_skills.ps1`: 4 create apoi idempotent (0 create, 9 ok); director real cu acelasi nume
niciodata sters (nici cu `-Force`).
## Neaplicat / de facut manual
- Commit: git pe branch (`claude/...`), fara push; `svn commit` + `roa_sync` + merge raman la
Marius (fluxul SVN+git din `fluxul_svn_git.md`).
- Pe celelalte calculatoare: `git pull` in `COMUN\` + `leaga_skills.ps1` (o data).

View File

@@ -96,7 +96,7 @@
garda fara caz in datele de test nu e garda moarta (regula 6); `/ponytail-audit` pe tot
arborele nu se ruleaza aici.
4. Testare headless (fara IDE): `vfp9.exe -A -T "<script.prg>" <param>` din PowerShell.
Mediu, sabloane, capcane, depanare: `depanare_testare_vfp.md`.
Mediu, sabloane, capcane, depanare: skill roa-vfp-headless-test (headless si UI; criteriile lui blocheaza "gata").
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
@@ -107,41 +107,32 @@
**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.
5. Editare .vcx/.scx pe text (cache, cp1250 byte-safe, fidelity-check): `flux-editare-vfp-text.md`.
Cautare in binare: `cautare_vcx_vct.md`. Versiunile `.??2` sunt instantanee, pot fi mai vechi
decat binarul — verifica mtime inainte de concluzii; continutul real e in `.PJX`.
5. Editare `.vcx`/`.scx` pe text, cautare in binare: skill roa-vfp-text-edit (cache, cp1250
byte-safe, fidelity-check si membrii noi sunt in procedura lui). Versiunile `.??2` sunt
instantanee, pot fi mai vechi decat binarul - verifica mtime inainte de concluzii; continutul
real e in `.PJX`.
6. 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`.
7. Conventii obligatorii, de citit cand atingi zona respectiva:
- editezi `.vc2`/`.sc2` sau `.prg` cu diacritice (ex. `programe\ocautare.prg`, unde `s`-urile cu
virgula din `masina`/`si contul`/`transa` sunt octetul `0xBA`) -> fisierele sunt **cp1250**
desi antetul FoxBin2Prg declara `CPID="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;
- editezi `.vc2`/`.sc2` sau `.prg` cu diacritice -> skill roa-vfp-text-edit (el detine procedura; criteriile lui blocheaza "gata");
- adaugi o PROPRIETATE sau o METODA noua intr-o clasa `.vc2`/`.sc2` -> skill roa-vfp-text-edit (membrul nou si `*p:`/`*m:` sunt in procedura lui; criteriile lui blocheaza "gata");
- 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`;
- `GO` pe un `Recno()` capturat/primit ca parametru -> `conventie_go_recno.md`;
- `GO` pe un `Recno()` capturat/primit ca parametru -> skill roa-vfp-go-recno (el detine procedura; criteriile lui blocheaza "gata");
- `ALTER TABLE` pe cursorul intors de `goExecutor.oExecute()` -> `conventie_goexecutor_alter_table.md`;
- testare UI -> `testare-ui-vfp.md`;
- testare UI -> skill roa-vfp-headless-test (acopera si testul headless; criteriile lui blocheaza "gata");
- 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 ... INTO` chemata 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`.
- garzi pe valori NULL din Oracle -> skill roa-vfp-null-guards (el detine procedura; criteriile lui blocheaza "gata");
- procedura PL/SQL cu `SELECT ... INTO` chemata din VFP (linii pierdute tacut) -> skill roa-oracle-sqlexec-no-data (el detine procedura; criteriile lui blocheaza "gata");
- export date din Oracle -> skill roa-oracle-migration (reexportul sursei de pachet e in procedura lui; criteriile lui blocheaza "gata");
- actualizarea ROA nu se finalizeaza (job update, PACK_UPDATE) -> skill roa-oracle-diagnostic (acopera si spatiul plin; criteriile lui blocheaza "gata");
- modifici schema Oracle (tabele/view-uri/pachete) -> skill roa-oracle-migration (scriere + publicare scripturi; criteriile lui blocheaza "gata").
8. 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.