[DTP-Worker] Sprint 8 · buffer · Gate reproductibilité artefacts (ci/check_artifacts.sh) + fix dérive run_sheet demo 18→21

Nouveau gate CI bloquant : régénère chaque 05_deliverables_mvp/**/out/ depuis son
générateur `build` et exige l'égalité byte-for-byte avec le fichier commité
(découverte auto · stdlib pur · zéro pip). Attrape la dérive silencieuse d'un
artefact qui auto-résout une valeur depuis un autre module et devient périmé quand
la source grandit — dérive qu'aucune suite tests/ (fonctions, pas fichier commité)
n'attrapait.

Défaut détecté et corrigé par ce gate : demo/scenarios/out/run_sheet.json
embarquait ci_modules_count=18 (buildé Sprint 7) alors que qa/audit_4big en compte
désormais 21. Régénéré (diff 1 ligne). Consistance live re-vérifiée.

Wiring : job check-artifacts + needs du gate agrégé (.gitea/workflows/ci.yml) ·
doc (ci/README.md). Vérifs : test négatif du gate OK (dérive → EXIT 1), 4 gates
statiques EXIT 0, suites CI-parsing vertes (regression/acceptance/audit_4big/demo),
21/21 suites · 534 tests, compteurs dérivés stables.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 23:38:15 +00:00
parent 535bc83e0d
commit e16c4f676d
6 changed files with 223 additions and 3 deletions
+56
View File
@@ -1604,3 +1604,59 @@ rigueur de la spec**, explicitement **pas** un score d'implémentation (le build
**Hors périmètre worker (VPS · #8)** : néant (changements in-repo : gate CI locale + doc).
**Auto-score 4Big** : 96/100.
---
## Session 20260730_232914 · Buffer S8 · Gate reproductibilité des artefacts + fix dérive run_sheet demo (18→21)
**Tâche** : **Sprint 8 · « Regression tests exhaustifs » + DevOps CI/CD**. Baseline
sain confirmé au démarrage (4 gates statiques EXIT 0 ; 21/21 suites vertes · 534
tests via `qa/regression run`). Objectif : durcir la régression au-delà de
l'exécution des tests — prouver la **reproductibilité byte-for-byte** des artefacts
`out/` versionnés (aucun `out/*.json` n'a dérivé de sa source).
**Découverte d'un VRAI défaut (analyser avant agir · #1)** : en ré-exécutant le
`build` de chaque module vers un tmpdir et en diffant contre le commité, **1
artefact sur 18 dérivait** — `demo/scenarios/out/run_sheet.json` : `"valeur": 18`
là où le build frais produit `21`. Générateur **déterministe** (deux builds
identiques), donc pas de non-déterminisme : le fichier commité était **périmé**.
**Cause racine** : le run_sheet auto-résout ses valeurs de preuve depuis les
artefacts d'AUTRES modules — ici `qa/audit_4big` `/coverage/ci_modules_count`. Ce
compteur a grandi **18 → 21** (suites `regression`/`acceptance`/`deploy_runbook`
ajoutées depuis) mais le run_sheet — buildé au Sprint 7 (commit `cac6538`, 10:39)
— n'a jamais été régénéré. **Dérive silencieuse** qu'aucune suite `tests/` (qui
teste des FONCTIONS, pas le fichier commité) n'attrapait.
**2 solutions (workflow #4)** : A régénérer + gate systémique préventif ·
B régénérer seul. **Choix A** — B laisserait la dérive revenir au prochain ajout
de module. Correctif ponctuel : `demo_scenario_gen.py build -o out` (diff = 1
ligne, `18→21`) ; suite demo 32 tests OK ; consistance live re-vérifiée
(run_sheet `21` == audit_4big source `21`).
**Fichiers (4)** :
1. `ci/check_artifacts.sh` (**neuf**) — gate de reproductibilité. Découvre chaque
`05_deliverables_mvp/**/out/` (zéro liste à la main · #6), ré-exécute le
générateur `build -o <tmp>`, exige l'égalité byte-for-byte avec le commité.
Artefacts d'exécution non produits par `build` (p.ex.
`qa/regression/out/regression_run.json`) non comparés. stdlib pur (bash+python3),
zéro pip (runner Gitea · #2).
2. `.gitea/workflows/ci.yml` — job bloquant `check-artifacts` + ajout au `needs`
du `gate` agrégé.
3. `05_deliverables_mvp/demo/scenarios/out/run_sheet.json` — régénéré (`18→21`).
4. `ci/README.md` — table pipeline + section détail + bloc exécution locale.
**Anti-invention (#6)** : la valeur `21` n'est **pas saisie** — elle re-découle de
`qa/audit_4big/out/quality_report.json` (recalculé lui-même depuis le CI). Le gate
n'affirme QUE ce que le `build` déterministe produit.
**Vérifs** : **test négatif** du gate (dérive `21→18` réinjectée → EXIT 1 + message
« DÉRIVE ») puis test positif (EXIT 0, 18/18 modules reproductibles). 4 gates
statiques EXIT 0 · YAML `safe_load` OK · suites CI-parsing vertes
(regression 24 · acceptance 31 · audit_4big 34 · demo 32). `check-artifacts`
n'entre PAS comme « module » dans `parse_ci` (pas de working-directory) → compteurs
dérivés stables (21/534 inchangés).
**Hors périmètre worker (VPS · #8)** : néant (gate CI local + doc + artefact in-repo).
**Auto-score 4Big** : 96/100.