Documentation / Qualité et gouvernance
Gate et Centre de gouvernance
Un seul gate applique le contrat à chaque commit, push et pipeline, et le Centre de gouvernance réunit l’ensemble du cycle de vie.
Le contrat de qualité indique ce que l’équipe exige. Le gate le fait respecter. C’est une commande unique du moteur, utilisée de la même façon par les hooks Git, la CI, la commande yuli-mcp gate et les hooks des agents. Le résultat ne dépend pas de qui l’invoque.
La commande
agent-engine gate --project <raíz> --stage pre-commit|commit-msg|pre-push|ci \
[--message-file <archivo>] [--base <revisión>] [--format text|json]
Si vous omettez --project, le dossier courant est utilisé. Un dossier sans Git passe toujours.
| Code de sortie | Signification |
|---|---|
0 |
Réussite. |
1 |
Bloqué : un contrôle a échoué. |
2 |
Erreur d’utilisation. |
Ce que vérifie chaque étape
| Étape | Ce qu’elle compare | Contrôles |
|---|---|---|
pre-commit |
Ce qui est en stage | Tous ceux ci-dessous. |
commit-msg |
Le message du commit | Uniquement l’attribution à une IA et les dérogations. |
pre-push |
Par rapport à @{upstream} (ou origin/HEAD) |
Tous ceux ci-dessous. |
ci |
Par rapport à la branche cible de la PR ou de la MR (ou HEAD~1) |
Tous ceux ci-dessous. |
Les contrôles
| Contrôle | Libellé dans Yuli | Résultat |
|---|---|---|
| Secrets dans les lignes ajoutées | Secrets | Bloque. Le type et la ligne sont signalés, jamais la valeur. |
| Triche dans les tests | Intégrité des tests | Bloque si le profil bloque la triche ; sinon, avertit. |
| Taille du changement | Taille du changement | Bloque en application stricte ; sinon, avertit. |
| Fichiers protégés modifiés | Chemins protégés | Bloque en application stricte ; sinon, avertit. |
| Attribution à une IA dans les messages | Attribution à une IA | Vérifie l’absence de Co-Authored-By d’une IA. |
| Dérogations expirées | Dérogations | Avertit. Ne bloque jamais. |
| Code existant sans tests | Filet de sécurité | Avertit. Ne bloque jamais. |
Anti-triche dans les tests
Un agent pressé d’en finir peut « corriger » un test au lieu du code. Yuli le détecte.
Dans les tests :
- Assertions supprimées ou tests effacés.
- Tests ignorés :
@Disabled,@Ignore,.skip(,xit,#[ignore], skips de pytest ou unittest,t.Skip. - Assertions triviales, comme
assertTrue(true)ouexpect(true).toBe(true). - Valeurs attendues modifiées pour que le test passe.
catchqui intercepte tout à l’intérieur d’un test.
Dans le build et la CI :
- Couverture minimale abaissée.
- Tests ignorés dans le build.
- Échecs ignorés, comme
npm test || true. - Script de tests remplacé par un script vide.
- Gate de qualité désactivé ou tâche de tests désactivée.
Filet de sécurité
Si des fichiers de code existants changent sans tests de caractérisation ou unitaires, le gate avertit : le changement doit préserver le comportement. Il ne bloque jamais le commit.
Installer les hooks Git
Dans le Centre de gouvernance, onglet Portes, cliquez sur Installer les hooks.
- Yuli écrit
.githooks/pre-commit,.githooks/commit-msget.githooks/pre-push. - Il configure
git config --local core.hooksPath .githooks.
Yuli n’installe rien si core.hooksPath pointe déjà vers un autre outil (par exemple husky) ou s’il existe un hook qu’il n’a pas écrit. Si le moteur n’est pas disponible, le hook avertit et laisse passer : vous n’êtes jamais empêché de faire un commit.
Désinstaller les hooks retire la configuration et ne supprime que les scripts de Yuli.
Dans la CI
Les pipelines générés par Créer la CI incluent l’étape « Portes du contrat », qui exécute agent-engine gate --stage ci. La CI applique ainsi les mêmes règles que votre équipe en local.
Le Centre de gouvernance
Ouvrez-le depuis le rail de droite (Plus d'outils → Centre de gouvernance) ou avec la palette de commandes : Ouvrir le centre de gouvernance. Il comporte 10 onglets.
| Onglet | Contenu |
|---|---|
| Contrat | Criticité, seuils, chemins protégés, dérogations, couches, SLO, politique de licences, relecteur indépendant, classification des données, budgets FinOps et historique. |
| Portes | Exécuter le gate pour une étape, installer ou désinstaller les hooks, et la carte CI. |
| Données sensibles | Valeurs masquées en sortie de la machine, champs classifiés dans le code et secrets dans l’historique Git. |
| Analyse | Exigences (modèles EARS, ambiguïté, attributs ISO 25010, Gherkin) et glossaire. |
| Conception | Décisions (ADR), Menaces (STRIDE), API (OpenAPI), C4, SLO et Legacy. |
| Mesure | Fonctions d’aptitude d’architecture, LCOM4, couplage des changements, bus factor, registre de dette, twelve-factor et feature flags. |
| Tests | Tests instables et quarantaine, mutation, types de tests, conditions de concurrence et charge. |
| Chaîne d'approvisionnement | Dépendances et licences, SBOM, IaC, conteneurs, DAST, provenance (SLSA, cosign), CODEOWNERS et historique. |
| Livraison | CI, release, rollback, déploiement progressif, runbook, post-mortems, DORA, SPACE, builds et FinOps. |
| Agents | Contexte, Revue, Télémétrie, Apprentissage, Benchmark et Injection. |
Documents générés
| Document | Chemin |
|---|---|
| ADR (décisions d’architecture) | docs/architecture/adr/ |
| Modèle de menaces STRIDE | docs/architecture/threat-model.md |
| Diagrammes C4 | docs/architecture/c4.md |
| SBOM | docs/reports/sbom.cdx.json et docs/reports/sbom.spdx.json |
| Runbook | docs/operations/runbook.md |
| Post-mortems | docs/operations/postmortems/ |
DORA
L’onglet Livraison calcule les quatre métriques DORA : fréquence de déploiement, lead time, taux d’échec des changements et MTTR, avec les niveaux Élite, Élevé, Moyen et Faible. Il s’appuie sur les déploiements enregistrés ou sur la CI. Yuli n’a pas accès à un APM de production.
Revue indépendante
Un modèle d’une autre famille relit le changement. Il n’utilise jamais la même famille que le modèle qui l’a écrit. Si aucun n’est configuré, il est signalé comme indisponible. Elle est obligatoire dans les profils Réglementée et Sécurité critique.
Contexte pour tous les agents
Dans Agents → Contexte, la section « Contexte pour tous les agents » écrit les mêmes règles pour chaque outil :
| Destination | Fichier |
|---|---|
| Claude Code (CLAUDE.md) | .claude/CLAUDE.md |
| AGENTS.md (Codex et autres) | 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 |
Le contenu est placé dans un bloc géré ; ce que vous écrivez en dehors est respecté. Par défaut, les fichiers restent hors de Git ; activez-le avec Les versionner dans Git. Chaque destination affiche son état : À jour, Obsolète, N’existe pas ou Modifié à la main.
Règles apprises
Lorsqu’un même constat apparaît 3 fois ou plus dans au moins 2 tâches en 30 jours, il devient une règle dans .ai/rules/learned.md. Vous pouvez la refuser dans Agents → Apprentissage ; elle n’est proposée à nouveau que si ses preuves doublent.
Limites, en toute transparence
- Le DAST (OWASP ZAP), l’analyse des conteneurs (Trivy ou Grype) et la signature (cosign) ne s’exécutent que s’ils sont installés, et toujours avec confirmation. S’ils manquent, Yuli l’indique et ne simule pas le résultat.
- Les règles préventives et celles d’IaC sont des motifs appliqués au texte. Chaque constat indique son fichier et sa ligne pour qu’une personne le confirme.