# Rapport de session · 2026-07-30 · session 22

## Tâche

**Sprint 8 · QA — Générateur de la Matrice de régression exhaustive**
(roadmap Sprint 8 · QA « **Regression tests exhaustifs** »).

Sprint 7 réalisable en repo est clos (L69 audit 4Big + L68 scénarios démo livrés
sessions 20–21 ; L67 polish `otov7.com` dépend du site live · hors périmètre
worker · #8). On enchaîne donc sur le premier volet Sprint 8 réalisable en repo.

## Décision d'architecture

Harnais de **MÉTA-NIVEAU** + **gate**, pas un simple runner. Il agrège
l'exécution de **toutes** les suites de tests gated du mandat en **une matrice +
un verdict PASS/FAIL** et fournit le **compte agrégé faisant autorité** (« N tests
verts ») — celui que les rapports quotidiens citaient jusqu'ici à la main.

**Distinct de l'audit 4Big (non redondant · #5)** : l'audit note la **qualité
statique** par module (doc / schéma / CLI / hand-off) ; ce harnais prouve que
chaque suite **s'exécute au vert** et calcule le **total**. Deux axes
complémentaires.

**Deux artefacts, deux natures :**
- `build` → **plan** déterministe (`out/regression_plan.json`, commité) :
  recensement exhaustif des suites (chemin, jobs, gate, fichiers/méthodes
  `test_*`). **Aucun compteur de résultat** → diffable, re-générable.
- `run` → **matrice live** : exécute réellement chaque suite (subprocess
  `unittest`, comme le CI), agrège les compteurs + verdict. **Non déterministe**
  (temps machine) → **non commitée** (`.gitignore`).

## Zéro invention · zéro duplication (#5 · #6)

- **Périmètre dérivé du CI** : les suites proviennent de `.gitea/workflows/ci.yml`
  via `q4lib/registry.parse_ci` (**réutilisé** de l'audit 4Big — une seule source
  de vérité). Tout job de test ajouté au CI entre automatiquement dans la matrice.
- **Anti-invention** : le plan ne contient **aucun** compteur de résultat ; les
  comptes de disque sont **recomputés** à la validation (INV5) → un compte figé /
  fabriqué est détecté. Le nombre de tests verts n'existe **qu'à l'exécution**.
- **Séparation des pouvoirs (ISA 315)** : le harnais **s'exclut lui-même** — pas
  d'auto-exécution (évite la récursion), pas de comptage de soi.

## Fichiers créés — `05_deliverables_mvp/qa/regression/`

- `regression_spec.json` (contrat · planchers structurels · 0 chiffre métier)
- `reglib/{__init__,deps,discovery,runner,builder}.py`
  - `deps` : réutilise `parse_ci` (audit 4Big) + validateur maison Publiciste
  - `discovery` : dérive les suites du CI + faits de disque + preuve de couverture
  - `runner` : subprocess unittest + **parseur PUR** de la sortie (OK/FAILED/skip)
  - `builder` : plan déterministe (`build`) + matrice live (`run`)
- `regression_gen.py` (CLI `build` / `validate` / `run` · **8 invariants**)
- `regression.schema.json` (contrat de sortie draft-07)
- `out/{regression_plan,MANIFEST}.json` (hand-off) · `tests/test_regression.py`
  (**24 tests** dont 3 exécutions réelles en tmpdir + 6 injections d'invariant)
- `README.md` · `.gitignore` (exclut la sortie non déterministe de `run`)

## Fichiers modifiés

- `.gitea/workflows/ci.yml` : job `qa-regression-tests` + ajout au `gate`.
- `qa/audit_4big/` : enregistrement du module `qa/regression` dans le registre
  (`quality_spec.json`) → couverture bijective **18 → 19 modules** (verdict **PASS
  19/19 à 100**) ; `out/` régénéré ; test `test_real_build_passes_gate` rendu
  **robuste** (`len(spec['modules'])` au lieu du littéral `18`) — plus de casse à
  chaque nouveau livrable.

## Vérifications

- **24/24** tests du module ; **34/34** audit_4big (compte dérivé du spec).
- **`run` exhaustif : 19/19 suites vertes · 474 tests passés · 0 échec · 0
  erreur** — compte agrégé faisant autorité, reproductible en une commande.
- Gate CI local vert : `guard_constraints.sh` · `validate_json.sh` ·
  `check_docs.sh` · `ci.yml` YAML valide.
- Builds déterministes (plan identique en double build).

## Hors périmètre worker (VPS · #8)

Planifier `run` sur le runner CI/VPS + publier le compte agrégé dans le desk
ERPNext / le pipeline de release → agent **QA / DevOps**. Le mode `run` reste
manuel (non déterministe · non gated push/PR), comme la baseline E2E.

## Auto-score 4Big

**96/100**.
