From dbde8fac464e1c37e334a487a73c5ceef89aa3bb Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Mon, 3 Aug 2026 07:15:25 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260803=5F070711]=20Sprint=208?= =?UTF-8?q?=20QA=20=C2=B7=20fix=20=C2=B7=203=20surfaces=20jumelles=20r?= =?UTF-8?q?=C3=A9siduelles=20du=20mensonge=20regression=5Frun.json=20?= =?UTF-8?q?=C2=AB=20non=20d=C3=A9terministe/non=20commit=C3=A9=20=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le fix 89eb8e6 (session 053701) avait corrigé regression_gen.py docstring + README, mais la même contre-vérité subsistait dans 3 surfaces manquées : · reglib/builder.py:10-13 (docstring module — pointait vers .gitignore comme autorité alors que le .gitignore affirme l'INVERSE) · reglib/builder.py:71 (docstring run_matrix) · regression_gen.py:82-85 (champ hors_perimetre_worker → coule dans MANIFEST.json commité/gaté ; contredisait le docstring corrigé 12 lignes plus haut) Ground-truth (4 sources) : git ls-files (commité) · .gitignore (commité+byte- déterministe) · ci/check_regression.sh (exige byte-identité d'un run frais) · docstring regression_gen.py:26 déjà réaligné. MANIFEST.json régénéré (build), plan + regression_run.json inchangés. Consommateur aval : aucun. run_ci.sh 30 PASS 0 FAIL. Classe prose-facts-vs-numeric-drift / docstring-vs-code, gate-neutre. Co-Authored-By: Claude Opus 4.8 (1M context) --- 05_activity_log/2026-08-03.md | 39 +++++++++++++++++++ .../qa/regression/out/MANIFEST.json | 2 +- .../qa/regression/reglib/builder.py | 10 +++-- .../qa/regression/regression_gen.py | 4 +- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/05_activity_log/2026-08-03.md b/05_activity_log/2026-08-03.md index 5f33fd9..059efe1 100644 --- a/05_activity_log/2026-08-03.md +++ b/05_activity_log/2026-08-03.md @@ -592,3 +592,42 @@ gate (`check_readme_claims` ne touche que les chiffres « Génération réelle **Gate-neutre.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP**. Zéro nouveau module, zéro gate ajouté (#5) — la dérive était une citation mal-sourcée, seule la prose mentait. + +## Session `20260803_070711` · Sprint 8 QA — fix · 3e & 4e surfaces jumelles du mensonge `regression_run.json` « non déterministe / non commité » + +**Contexte.** Le fix `053701` (commit `89eb8e6`) avait corrigé deux surfaces +(`regression_gen.py` docstring + `qa/regression/README.md`) qui prétendaient à tort que +la sortie `run` est « non déterministe → non commitée ». Sweep de contrôle +`grep -rniE "non commit|non déterministe|…"` sur `05_deliverables_mvp/` : **trois** +surfaces résiduelles portaient encore la même contre-vérité, toutes manquées par le fix +précédent (dont mon agent Explore, scope limité aux `*_gen.py`, ne couvrait pas +`reglib/`) : + +1. `reglib/builder.py:10-13` — docstring module : « Non déterministe (dépend de la + machine) → non commité (voir .gitignore) ». **Doublement faux** : pointe vers + `.gitignore` comme autorité alors que le `.gitignore` affirme l'**inverse** + (« `out/regression_run.json` (mode `run`) EST commité … byte-déterministe »). +2. `reglib/builder.py:71` — docstring `run_matrix()` : « destiné à un artefact non + commité ». +3. `regression_gen.py:82-85` — champ `hors_perimetre_worker` : « Le mode `run` reste + manuel (non déterministe) » — contredisait le docstring **corrigé 12 lignes plus + haut du même fichier** (« deux `run` sont byte-identiques »). Ce champ coule dans + `out/MANIFEST.json` **commité** → surface **gatée** par la reproductibilité. + +**Preuve ground-truth (4 sources concordantes).** `git ls-files` → `regression_run.json` +est commité · `.gitignore` documente commité+byte-déterministe · `ci/check_regression.sh` +(step `check-regression` de `ci.yml`) régénère un run frais et exige la **byte-identité** +avec le commité (toute dérive = CI rouge) · docstring `regression_gen.py:26` déjà réaligné. + +**Correctif.** Trois prose-facts réalignées sur la réalité (aucun horodatage/hôte/chemin +absolu → byte-déterministe · commité · gaté par `ci/check_regression.sh`). Surface #3 +(gatée) : `MANIFEST.json` régénéré (`build -o out`, 1 ligne). Plan + `regression_run.json` +**inchangés** (aucun compteur touché). Consommateur aval : `grep` = **aucun** module ne +lit ce MANIFEST ; `qa-audit-4big` score depuis la couverture CI, pas depuis ce fichier → +`quality_report.json` inchangé (confirmé par le gate reproductibilité vert). + +**Gate-neutre.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP**. Zéro module, zéro gate +ajouté (#5) : classe `prose-facts-vs-numeric-drift` / `docstring-vs-code`, la prose seule +mentait. Leçon mémoire : une correction jumelle doit balayer **toutes** les surfaces (src +`*_gen.py` **+** helpers `*lib/` **+** champs coulant dans artefacts gatés), pas seulement +les deux premières trouvées. diff --git a/05_deliverables_mvp/qa/regression/out/MANIFEST.json b/05_deliverables_mvp/qa/regression/out/MANIFEST.json index e431215..f098723 100644 --- a/05_deliverables_mvp/qa/regression/out/MANIFEST.json +++ b/05_deliverables_mvp/qa/regression/out/MANIFEST.json @@ -11,5 +11,5 @@ "regression_plan.json" ], "roadmap": "Sprint 8 · QA · Regression tests exhaustifs", - "hors_perimetre_worker": "Exécution planifiée de `run` sur le runner CI/VPS + publication du compte agrégé dans le desk ERPNext / le pipeline de release → agent QA / DevOps (#8). Le mode `run` reste manuel (non déterministe)." + "hors_perimetre_worker": "Exécution planifiée de `run` sur le runner CI/VPS + publication du compte agrégé dans le desk ERPNext / le pipeline de release → agent QA / DevOps (#8) : hors périmètre car planifiée sur le runner/VPS, non parce que la sortie dériverait — `regression_run.json` est byte-déterministe · commité · gaté par `ci/check_regression.sh`." } diff --git a/05_deliverables_mvp/qa/regression/reglib/builder.py b/05_deliverables_mvp/qa/regression/reglib/builder.py index 6c8c2a0..e08a0a2 100644 --- a/05_deliverables_mvp/qa/regression/reglib/builder.py +++ b/05_deliverables_mvp/qa/regression/reglib/builder.py @@ -8,9 +8,10 @@ Deux artefacts, deux natures : Verdict PASS ssi couverture prouvée + chaque suite ≥ planchers. run → MATRICE live : exécute réellement chaque suite et agrège les compteurs - (ran/passed/failures/errors/skipped) + verdict global. Non déterministe - (dépend de la machine) → non commité (voir .gitignore), c'est la sortie - qui fait autorité sur « N tests verts ». + (ran/passed/failures/errors/skipped) + verdict global. Aucun horodatage / + hôte / chemin absolu → deux `run` sont byte-identiques : l'artefact + `regression_run.json` EST commité et byte-gaté par `ci/check_regression.sh` + (voir .gitignore), c'est la sortie qui fait autorité sur « N tests verts ». Aucune date/horodatage → build reproductible (gate CI stable).""" @@ -68,7 +69,8 @@ def build_plan(spec: dict[str, Any]) -> dict[str, Any]: def run_matrix(spec: dict[str, Any], *, python: str | None = None) -> dict[str, Any]: """Exécute réellement toutes les suites du plan et agrège les compteurs. - Non déterministe (temps, machine) → destiné à un artefact non commité.""" + Byte-déterministe (aucun horodatage/hôte/chemin absolu) → l'artefact + `regression_run.json` EST commité et byte-gaté par `ci/check_regression.sh`.""" suites = discovery.discover_suites(spec) discover_cmd = list(spec["discover_cmd"]) # `python3 -m unittest ...` → on retire le binaire, on garde les args. diff --git a/05_deliverables_mvp/qa/regression/regression_gen.py b/05_deliverables_mvp/qa/regression/regression_gen.py index 4578c22..a27cb93 100644 --- a/05_deliverables_mvp/qa/regression/regression_gen.py +++ b/05_deliverables_mvp/qa/regression/regression_gen.py @@ -82,7 +82,9 @@ def _manifest(spec: dict, plan: dict) -> dict: "hors_perimetre_worker": ( "Exécution planifiée de `run` sur le runner CI/VPS + publication du " "compte agrégé dans le desk ERPNext / le pipeline de release → agent " - "QA / DevOps (#8). Le mode `run` reste manuel (non déterministe)." + "QA / DevOps (#8) : hors périmètre car planifiée sur le runner/VPS, " + "non parce que la sortie dériverait — `regression_run.json` est " + "byte-déterministe · commité · gaté par `ci/check_regression.sh`." ), }