diff --git a/05_activity_log/2026-08-02.md b/05_activity_log/2026-08-02.md index e00e9df..e52bbfd 100644 --- a/05_activity_log/2026-08-02.md +++ b/05_activity_log/2026-08-02.md @@ -1810,3 +1810,49 @@ complet mais avait **2 vraies aspérités d'UX**, reproduites avant correction : (30 jobs) · `check_docs` · `check_readme_claims` · `guard_constraints` verts · `run_ci.sh` (plein) → **30 PASS · 0 FAIL · 0 SKIP**. Arbre propre avant édition. Aucune commande touchant au VPS. + +## Session `20260802_190604` · Sprint 8 · buffer · QA — vérification launch-readiness : mutation-test que les 7 gates statiques MORDENT encore (7/7 RED, revert propre) + +**Contexte.** Repo 100 % construit (`run_ci.sh` → 30 PASS · 0 FAIL) ; sprints 1→7 +livrés côté dépôt, phase buffer Sprint 8. Un audit doc-vs-réalité frais (top-level +docs + 13 fiches `03_agents/*/AGENT.md` + `daily_reports` + roadmap) n'a trouvé +**aucune dérive non gatée** — la surface driftable évidente est épuisée. Décision +(#5 — ne pas empiler un gate N+1 redondant) : plutôt qu'inventer du travail, exécuter +le livrable QA propre de Sprint 8 (« **Regression tests exhaustifs** ») sous l'angle +le plus fort : **prouver que les gates existants attrapent réellement une régression** +(un gate vert qui ne mord pas est pire qu'absent — cf. mémoire `verify-uncovered-before-gating` ++ `guard-constraints-flags-usage-not-mention`). + +**Méthode.** Pour chacun des 7 gates statiques `ci/*.sh`, injecter une mutation +ciblée de la classe de dérive qu'il est censé traquer, exécuter le gate, exiger un +**exit non-zéro** (RED), puis **revert par chemin ciblé** (jamais `git clean` — #interdits) +et re-vérifier l'arbre à 0 fichier modifié. + +| # | Gate | Mutation injectée | Résultat | +|---|------|-------------------|----------| +| 1 | `guard_constraints` | URL interdite `https://github.com/…` ajoutée à `README.md` | **RED** ✓ (`Interdit détecté — GitHub`) | +| 2 | `check_ci_integrity` | retrait de `constraints-guard` de `gate.needs` (ci.yml) | **RED** ✓ (`ABSENT de gate.needs` + INV-B) | +| 3 | `check_docs` | lien Markdown interne cassé `./this/does/not/exist.md` | **RED** ✓ (`lien cassé`) | +| 4 | `check_readme_claims` | compte fiches `13`→`14` dans `README.md` | **RED** ✓ (`README dit 14 MAIS artefact dit 13`) | +| 5 | `check_artifacts` | octet parasite ajouté à `crm/commissions/out/MANIFEST.json` | **RED** ✓ (`DÉRIVE … diffère du build frais`) | +| 6 | `validate_json` | JSON syntaxiquement invalide dans un artefact commité | **RED** ✓ (exit 1) | +| 7 | `check_regression` | `totals.passed` `564`→`565` dans `out/regression_run.json` | **RED** ✓ (`DÉRIVE : le run frais diffère du commité`) | + +**Deux « faux verts » — analysés, PAS des trous de couverture :** +- Mutation d'un `MANIFEST.json` de régression testée d'abord contre `check_regression` + → **vert** : normal, `check_regression` ne possède QUE `regression_run.json` + (artefact de `run`, compteurs exécutés) ; le `MANIFEST.json` (artefact de `build`) + est possédé par `check_artifacts` — mutation re-testée contre lui → **RED** ✓. + **La frontière de propriété entre les deux gates est nette et correcte.** +- Première tentative de mutation de `regression_run.json` inefficace (bump d'un `int` + de premier niveau — or les compteurs sont **imbriqués** sous `totals`, aucun `int` + racine) → rewrite byte-identique → vert légitime. Corrigée en mutant `totals.passed` + (ligne 7 ci-dessus) → **RED** ✓. + +**Conclusion.** **7/7 gates statiques MORDENT** sur leur classe de dérive respective, +frontières de propriété inter-gates confirmées, **aucun trou de couverture**. Le +verrou anti-régression de la plateforme est prouvé opérationnel pour le launch +(pas seulement « vert par chance »). **Zéro nouveau module · zéro gate ajouté (#5) · +zéro fichier de production modifié** — travail de vérification pur, chaque mutation +revert par chemin ciblé. Arbre final : `git status --short` → 0 ligne · `run_ci.sh` +→ **30 PASS · 0 FAIL · 0 SKIP**. Aucune commande touchant au VPS.