[DTP-Worker] Sprint 8 · buffer L75 · Intégrité matrice régression : fix gate check_regression cassé en CI (run baseline commité) + invariant disque→CI (INV4 orphan_tests_dirs)

Défaut #1 (bug CI réel) : ci/check_regression.sh exigeait regression_run.json
commité comme baseline, mais le fichier était .gitignore → absent en checkout
propre → le job Gitea check-regression échouait sur CHAQUE run CI (ne passait
qu'en local via un fichier non suivi). L'artefact run est byte-déterministe
(aucun horodatage/hôte/durée · path relatif) → committer est licite. Fix :
run désormais commité (baseline), .gitignore + README réécrits.

Défaut #2 (invariant manquant) : coverage_report prouvait CI→disque mais pas
l'inverse. Nouveau disk_test_modules() + orphan_tests_dirs dans INV4 : un module
gagnant un tests/ sans job CI fait chuter la couverture (fini la sous-comptée
silencieuse de la matrice). Schéma + 2 tests de morsure.

Consommateur régénéré : qa/audit_4big/quality_report.json (README 3710→4236 o,
24→26 méthodes). Matrice 534/21/PASS inchangée (harnais self-exclu, INV3).
5 gates verts · 26+34 tests OK · YAML valide.
This commit is contained in:
Claude Code DTP Worker
2026-07-31 00:41:16 +00:00
parent 0eaf5bde39
commit 76fb0e768d
10 changed files with 399 additions and 56 deletions
@@ -154,6 +154,28 @@ class TestDiscovery(unittest.TestCase):
self.assertTrue(cov["self_module_gated"]) # le harnais est gated
self.assertEqual(cov["missing_tests_dir"], [])
self.assertEqual(cov["not_in_gate"], [])
self.assertEqual(cov["orphan_tests_dirs"], []) # aucun tests/ hors CI
def test_disk_test_modules_subset_of_ci(self):
# Sens inverse de la couverture : tout `tests/` sur disque est gated.
disk = set(discovery.disk_test_modules())
ci = set(discovery.parse_ci()["job_to_path"].values())
self.assertIn(_spec()["self_module"], disk) # le harnais a des tests
self.assertEqual(disk - ci, set(), f"orphelins disque→CI : {disk - ci}")
def test_orphan_tests_dir_detected(self):
# Preuve de morsure : un module portant un `tests/` non câblé au CI doit
# faire chuter la couverture (dérive silencieuse disque→CI interdite).
spec = _spec()
suites = discovery.discover_suites(spec)
real = discovery.disk_test_modules
try:
discovery.disk_test_modules = lambda: real() + ["orphan/module"]
cov = discovery.coverage_report(spec, suites)
finally:
discovery.disk_test_modules = real
self.assertIn("orphan/module", cov["orphan_tests_dirs"])
self.assertFalse(cov["ok"], cov)
# --------------------------------------------------------------------------