diff --git a/03_agents/qa/AGENT.md b/03_agents/qa/AGENT.md index a85e00d..93c4d25 100644 --- a/03_agents/qa/AGENT.md +++ b/03_agents/qa/AGENT.md @@ -36,6 +36,28 @@ périmètre — un auditeur ne s'audite jamais. Ce compte est **découvert automatiquement depuis le CI** (`q4lib.registry.parse_ci`, réutilisé sans duplication) — jamais compté à la main. +## Deuxième étage QA : la batterie de gates statiques (`ci/*.sh`) +Au-dessus des 4 modules d'audit ci-dessus, le mandat exécute une couche de **gates +statiques** — les *gates de méta-niveau* du titre. Leur périmètre n'est **jamais** +figé à la main : `check_ci_integrity` **découvre** l'ensemble via `git ls-files +'ci/*.sh'` et **refuse** qu'un `ci/*.sh` ne soit pas câblé à un job du gate CI (ou +inversement) — la liste ci-dessous est donc *l'état courant*, pas une constante. + +| Gate | Rôle (une commande, déterministe, zéro chiffre fabriqué) | +|---|---| +| `check_ci_integrity.sh` | Intégrité du câblage CI : chaque `ci/*.sh` est câblé à un job **dans** `gate.needs` (aucun gate décâblé ni orphelin) — c'est le gardien des gardiens (il **s'exclut** lui-même · SoD). | +| `check_readme_claims.sh` | Intégrité des **chiffres** des README / fiches agent (CLAUDE.md #6) : chaque compte cité est **recalculé** depuis l'artefact `out/` ou la source (jamais une donnée inventée). | +| `check_artifacts.sh` | **Reproductibilité** : chaque `out/*.json` se régénère **byte-identique** (aucune dérive entre source et hand-off commité). | +| `check_regression.sh` | **Fraîcheur** de la matrice de régression : le run rejoué == le run commité (aucune régression silencieuse · #5). | +| `check_docs.sh` | Qualité documentaire : les liens Markdown relatifs internes pointent vers une cible **existante** (gate 4Big). | +| `guard_constraints.sh` | Enforce les **contraintes NON-NÉGOCIABLES** de CLAUDE.md : plateformes git proscrites (hors Gitea), CRM interdits, paiement non conforme, écriture serveur bannie — via une prohibition marquée ou l'échappatoire `ci-allow`. | +| `validate_json.sh` | Tous les `.json` suivis sont **bien formés** (parse strict) — première ligne de défense avant toute lecture d'artefact. | + +Ces gates ne **produisent** pas de livrable métier : ils **prouvent** que les +livrables des autres agents tiennent. Un nouveau gate suit la même règle — il est +**automatiquement** intégré au périmètre dès qu'il est câblé (découverte CI), sans +liste à maintenir. + ## Non-négociables (voir CLAUDE.md racine pour la liste complète) - Gitea only (jamais GitHub) - ERPNext natif en priorité diff --git a/05_activity_log/2026-08-02.md b/05_activity_log/2026-08-02.md index 714f00c..a6742e9 100644 --- a/05_activity_log/2026-08-02.md +++ b/05_activity_log/2026-08-02.md @@ -839,3 +839,48 @@ preuve que l'autorité est le CODE, pas la prose) · M6 suppression `# Invariant de vrai doublon · M8 renommage `_validate_bundle` ⇒ registre introuvable. Gates re-verts : `check_artifacts` · `check_docs` · `guard_constraints` · `check_ci_integrity` · `check_readme_claims` · `check_regression` tous exit 0. + +--- + +## Sprint 8 · buffer · Doc QA : documentation du 2ᵉ étage QA (batterie de gates statiques `ci/*.sh`) dans `03_agents/qa/AGENT.md` + +**Démarche — vérifier AVANT de gater (mémoire `verify-uncovered-before-gating`).** +La série récente empile des gates anti-dérive ; avant d'en ajouter un 9ᵉ, j'ai +d'abord cherché une **vraie dérive présente** plutôt qu'un gate spéculatif : + +1. Scan ledger-vs-prose sur les 12 générateurs à ledger d'invariants. **Faux + signal** relevé : `fiscal/ecf_dgii` semblait afficher `ledger_markers=10` vs + `prose=12`. Investigation : le ledger n'est **pas** nu 1..12 — l'invariant #1 + (validation de schéma, `validate(bundle, schema)`) n'est **pas** marqué `# 1 ·` + par design, et #12 est scindé en `12a`/`12b`. Le gate fiscal (`check_readme_claims.sh` + l.1908) **synthétise** déjà `ledger = marqueurs{2..12} ∪ {1}` et vérifie + self-report / titre README / mentions / énumération = 12. **Aucune dérive** ; + mon compteur grossier ne voyait ni le schéma-#1 ni `12a/12b`. +2. Sondé les comptes de `03_agents/{crm,qa}/AGENT.md` (« Total CRM 81 (25+31+25) », + « 17 contrôles / 5 dimensions », « 8 livrables + 7 métriques ») → **tous gatés** + (l.681, 871, 2176, 2624, 3671…). Coverage **très dense**, conforme à la mémoire. + +**Conclusion** : pas de gate à ajouter (ç'aurait été redondant · CLAUDE.md #5). + +**Trou documentaire réel comblé.** Le titre + le scope de `qa/AGENT.md` promettent +des « **gates de méta-niveau** », mais le corps ne tabulait que les **4 modules +Python** d'audit (`audit_5d` · `audit_4big` · `regression` · `acceptance`) — il +**omettait entièrement** la batterie de **gates statiques `ci/*.sh`**, qui sont +pourtant l'application méta-niveau littérale (moitié de l'enforcement QA). Un +lecteur croyait donc QA = 4 modules. + +**Ajout** — section « Deuxième étage QA : la batterie de gates statiques (`ci/*.sh`) » +listant les 7 gates courants par **nom + rôle** (`check_ci_integrity`, +`check_readme_claims`, `check_artifacts`, `check_regression`, `check_docs`, +`guard_constraints`, `validate_json`). **Anti-dérive by design** : le texte ancre +l'autorité du périmètre sur `check_ci_integrity` (qui **découvre** l'ensemble via +`git ls-files 'ci/*.sh'` et refuse tout gate décâblé/orphelin) et présente la liste +comme *l'état courant*, PAS une constante figée → aucun compte agrégé driftable +introduit. + +**Sûreté** — prose sans lien Markdown neuf (check_docs), sans URL git interdite ni +terme CRM/paiement banni nu ; les lignes citant les prohibitions portent un +marqueur (`proscrites`/`interdits`/`bannie`) donc `guard_constraints` les laisse +passer. **Vérif** : 7 gates re-verts (guard_constraints · check_docs · +check_readme_claims · check_ci_integrity · check_artifacts · check_regression · +validate_json tous exit 0).