Documentație / Calitate și guvernanță
Gate și Centrul de guvernanță
Un singur gate impune contractul la fiecare commit, push și pipeline, iar Centrul de guvernanță reunește întregul ciclu de viață.
Contractul de calitate spune ce cere echipa. Gate-ul îl impune. Este o singură comandă a motorului, folosită la fel de hook-urile Git, de CI, de comanda yuli-mcp gate și de hook-urile agenților. Rezultatul nu depinde de cine o invocă.
Comanda
agent-engine gate --project <raíz> --stage pre-commit|commit-msg|pre-push|ci \
[--message-file <archivo>] [--base <revisión>] [--format text|json]
Dacă omiți --project, se folosește folderul curent. Un folder fără Git trece întotdeauna.
| Cod de ieșire | Semnificație |
|---|---|
0 |
Trece. |
1 |
Blocat: un control a eșuat. |
2 |
Eroare de utilizare. |
Ce verifică fiecare etapă
| Etapă | Ce compară | Controale |
|---|---|---|
pre-commit |
Ce se află în stage | Toate cele de mai jos. |
commit-msg |
Mesajul commit-ului | Doar atribuirea către IA și excepțiile. |
pre-push |
Față de @{upstream} (sau origin/HEAD) |
Toate cele de mai jos. |
ci |
Față de ramura țintă a PR-ului sau MR-ului (sau HEAD~1) |
Toate cele de mai jos. |
Controalele
| Control | Etichetă în Yuli | Rezultat |
|---|---|---|
| Secrete în liniile adăugate | Secrete | Blochează. Se raportează tipul și linia, niciodată valoarea. |
| Trișări în teste | Integritatea testelor | Blochează dacă profilul blochează trișarea; altfel, avertizează. |
| Dimensiunea modificării | Dimensiunea modificării | Blochează cu aplicare strictă; altfel, avertizează. |
| Fișiere protejate atinse | Căi protejate | Blochează cu aplicare strictă; altfel, avertizează. |
| Atribuire către o IA în mesaje | Atribuire AI | Verifică să nu existe Co-Authored-By al unei IA. |
| Excepții expirate | Excepții | Avertizează. Nu blochează niciodată. |
| Cod existent fără teste | Plasă de siguranță | Avertizează. Nu blochează niciodată. |
Anti-trișare în teste
Un agent presat să termine poate „repara” un test în loc de cod. Yuli detectează asta.
În teste:
- Aserțiuni eliminate sau teste șterse.
- Teste sărite:
@Disabled,@Ignore,.skip(,xit,#[ignore], skip-uri pytest sau unittest,t.Skip. - Aserțiuni triviale, precum
assertTrue(true)sauexpect(true).toBe(true). - Valori așteptate modificate ca testul să treacă.
catchcare prinde orice în interiorul unui test.
În build și CI:
- Acoperire minimă redusă.
- Teste sărite în build.
- Eșecuri ignorate, precum
npm test || true. - Script de testare înlocuit cu unul gol.
- Gate de calitate dezactivat sau sarcină de testare dezactivată.
Plasă de siguranță
Dacă se modifică fișiere de cod existente fără teste de caracterizare sau unitare, gate-ul avertizează: modificarea trebuie să păstreze comportamentul. Nu blochează niciodată commit-ul.
Instalarea hook-urilor Git
În Centrul de guvernanță, fila Porți, apasă Instalează hooks.
- Yuli scrie
.githooks/pre-commit,.githooks/commit-msgși.githooks/pre-push. - Configurează
git config --local core.hooksPath .githooks.
Yuli nu instalează nimic dacă core.hooksPath indică deja spre altă unealtă (de exemplu, husky) sau dacă există un hook pe care nu l-a scris el. Dacă motorul nu este disponibil, hook-ul avertizează și lasă să treacă: nu te lasă niciodată fără posibilitatea de a face commit.
Dezinstalează hooks elimină configurația și șterge doar scripturile Yuli.
În CI
Pipeline-urile generate de Creează CI includ pasul „Porțile contractului”, care rulează agent-engine gate --stage ci. Astfel, CI-ul aplică aceleași reguli ca echipa ta locală.
Centrul de guvernanță
Deschide-l din șina din dreapta (Mai multe unelte → Centrul de guvernanță) sau din paleta de comenzi: Deschide Centrul de guvernanță. Are 10 file.
| Filă | Ce conține |
|---|---|
| Contract | Criticitate, praguri, căi protejate, excepții, straturi, SLO, politica de licențe, revizor independent, clasificarea datelor, bugete FinOps și istoric. |
| Porți | Rularea gate-ului pentru o etapă, instalarea sau dezinstalarea hook-urilor și cardul CI. |
| Date sensibile | Valori redactate la ieșirea de pe calculator, câmpuri clasificate în cod și secrete în istoricul Git. |
| Analiză | Cerințe (tipare EARS, ambiguitate, atribute ISO 25010, Gherkin) și glosar. |
| Design | Decizii (ADR), Amenințări (STRIDE), API-uri (OpenAPI), C4, SLO și Legacy. |
| Măsurare | Funcții de fitness ale arhitecturii, LCOM4, cuplarea modificărilor, bus factor, registrul datoriei tehnice, twelve-factor și feature flags. |
| Teste | Teste instabile și carantină, mutație, tipuri de teste, condiții de cursă și încărcare. |
| Lanț de aprovizionare | Dependențe și licențe, SBOM, IaC, containere, DAST, proveniență (SLSA, cosign), CODEOWNERS și istoric. |
| Livrare | CI, release, rollback, implementare progresivă, runbook, post-mortem-uri, DORA, SPACE, build-uri și FinOps. |
| Agenți | Context, Revizuire, Telemetrie, Învățare, Benchmark și Injecție. |
Documente generate
| Document | Cale |
|---|---|
| ADR (decizii de arhitectură) | docs/architecture/adr/ |
| Model de amenințări STRIDE | docs/architecture/threat-model.md |
| Diagrame C4 | docs/architecture/c4.md |
| SBOM | docs/reports/sbom.cdx.json și docs/reports/sbom.spdx.json |
| Runbook | docs/operations/runbook.md |
| Post-mortem-uri | docs/operations/postmortems/ |
DORA
Fila Livrare calculează cele patru metrici DORA: frecvența implementărilor, lead time, rata de eșec a modificărilor și MTTR, cu benzile Elită, Ridicată, Medie și Scăzută. Folosește implementările înregistrate sau CI-ul. Yuli nu vede un APM de producție.
Revizuire independentă
Un model din altă familie revizuiește modificarea. Nu folosește niciodată aceeași familie ca modelul care a scris-o. Dacă nu este configurat niciunul, o indică drept indisponibilă. Este obligatorie în profilurile Reglementată și Critică pentru siguranță.
Context pentru toți agenții
În Agenți → Context, secțiunea „Context pentru toți agenții” scrie aceleași reguli pentru fiecare unealtă:
| Destinație | Fișier |
|---|---|
| Claude Code (CLAUDE.md) | .claude/CLAUDE.md |
| AGENTS.md (Codex și alții) | AGENTS.md |
| Kiro (.kiro/steering) | .kiro/steering/yuli.md |
| Antigravity | .agent/rules/yuli.md |
| Cursor (.cursor/rules) | .cursor/rules/yuli.mdc |
| GitHub Copilot | .github/copilot-instructions.md |
| Gemini (GEMINI.md) | GEMINI.md |
Conținutul este plasat într-un bloc gestionat; ce scrii în afara lui este respectat. Implicit, fișierele rămân în afara Git; activează versionarea cu Versionează-le în Git. Fiecare destinație își afișează starea: La zi, Depășit, Nu există sau Editat manual.
Reguli învățate
Când aceeași constatare apare de 3 ori sau mai mult în cel puțin 2 sarcini în decurs de 30 de zile, devine o regulă în .ai/rules/learned.md. O poți respinge în Agenți → Învățare; este propusă din nou doar dacă dovezile pentru ea se dublează.
Limite oneste
- DAST (OWASP ZAP), scanarea containerelor (Trivy sau Grype) și semnarea (cosign) rulează doar dacă sunt instalate și întotdeauna cu confirmare. Dacă lipsesc, Yuli indică acest lucru și nu simulează rezultatul.
- Regulile preventive și cele de IaC sunt tipare aplicate pe text. Fiecare constatare vine cu fișierul și linia ei, ca o persoană să o confirme.