[DTP-Worker] hardening correctness · l'alignement du compteur de tests audit_4big↔discovery (fix ASCII ac595d0) était INCOMPLET · criteria.py gardait def (un espace figé) là où la source sœur reglib.discovery a def\s+ → def test_x(/def\ttest_x( (Python valide) loupés → sous-comptage silencieux + désaccord avec l'autorité byte-gatée de la colonne « Tests » des fiches (violation #6, même racine « détecter la forme, pas une graphie » que ac595d0/fd99362)
Fix chirurgical `def ` → `def\s+` (forme strictement identique à discovery._TEST_METHOD_RE) + teeth test_tests_counts_non_single_space_def_separator (prouvé mordant : ancien regex compte 1/3, nouveau 3/3). Occurrence latente (0 def multi-espace dans le dépôt aujourd'hui) → quality_report.json byte-identique (audit_4big s'auto-exclut de son scoring). Cascade matrice régression 627→628 / 610→611 ; fiches qa+erpnext_backend re-dérivées. Axe recursion (os.walk vs os.listdir) non-occurrent, laissé. Classe compteur-coïncidence désormais close sur ses 2 axes. Pas de nouveau gate (#5 · check_readme_claims mord déjà). 0 code moteur V18 (bloqué #6), 0 commande VPS (#8). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -239,3 +239,27 @@ Un lecteur (agent ou humain) du README — le doc le plus consulté — pouvait
|
||||
**Pourquoi pas un nouveau gate (#5).** La divergence de compte est déjà **structurellement gatée** (`check_readme_claims` a immédiatement rougi la fiche QA + le compte `audit_4big`) et la teeth verrouille le comportement de `crit_cli`. Occurrence latente (0 garde simple-quotée aujourd'hui) mais correction de contrat de l'outil, pas un cas d'entrée produit → pas de gate additionnel.
|
||||
|
||||
**Vérif.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** rétabli après régénération. **0 code moteur V18** (bloqué #6), **0 commande VPS** (#8), **0 API externe**. Fichiers : `qa/audit_4big/q4lib/criteria.py` (regex) + `qa/audit_4big/tests/test_audit_4big.py` (teeth) + `qa/regression/out/{regression_plan,regression_run,MANIFEST}.json` + `03_agents/qa/AGENT.md` + `03_agents/erpnext_backend/AGENT.md` + ce journal. `quality_report.json` **non touché** (auto-exclusion prouvée).
|
||||
|
||||
---
|
||||
|
||||
## Session `20260811_085834` — HARDENING correctness · l'alignement du compteur de tests `audit_4big`↔`discovery` (fix ASCII `ac595d0`) était INCOMPLET : `def ` (un espace figé) ≠ `def\s+` de la sœur — teeth ajoutée, classe désormais close
|
||||
|
||||
**État au démarrage.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** (baseline verte). Séquence moteur V18 toujours **intégralement bloquée** en gouvernance (D-06 approbation de l'audit = gate d'entrée · D-07 formules DCF/IRR/VAN/DSCR/LTV/LTC absentes · D-08 Master Data Model sur-ensemble strict · directive `:90-91` « NE PAS coder avant l'audit » · #6) — **aucun code moteur légitime**. Les bannières V18 des 4 modules-origine, le liage index et les 2 fixes `audit_4big` (regex ASCII `ac595d0` · garde `__main__` `fd99362`) sont clos. Les 2 directives 08-10 (`OTO_3D_STUDIO`, `COMPTE_CLIENT_COURRIELS`) restent hors périmètre repo.
|
||||
|
||||
**Défaut trouvé (classe #6 · MÊME racine que les 2 fixes précédents : « détecter la forme, pas une graphie » · + il COMPLÈTE un fix laissé à moitié).** Le fix ASCII `ac595d0` (session `072823`) avait pour but explicite d'**aligner** le compteur de méthodes de test d'`audit_4big` (`q4lib/criteria.py:_TEST_DEF_RE`) sur celui de la source sœur `reglib/discovery.py:_TEST_METHOD_RE` — autorité **byte-gatée** de la colonne « Tests » des fiches (réutilisée par `check_readme_claims` via `discovery.count_tests`). Il a aligné le **char-class** (`[A-Za-z0-9_]` → `\w`, pour les noms accentués), mais a laissé **une seconde divergence intacte** sur le **séparateur `def`** :
|
||||
- `discovery.py:23` = `r"^\s*def\s+(test_\w+)\s*\("` — `\s+` (espacement libre)
|
||||
- `criteria.py:18` = `r"^\s*def (test_\w+)\s*\("` — **un seul espace littéral figé**
|
||||
|
||||
Or `def test_x(` (deux espaces) et `def\ttest_x(` (tabulation) sont du **Python valide** (PEP 8 recommande un espace, le langage n'en impose pas). Le littéral `def ` les **loupe** → `crit_tests` sous-compterait, en **désaccord d'un ou plusieurs** avec la sœur — exactement le type de dérive d'évidence #6 que le fix ASCII prétendait clore. Les **deux compteurs du MÊME concept** doivent coïncider sur **toute graphie valide**, pas seulement les identifiants Unicode.
|
||||
|
||||
**Occurrence (comme la garde `__main__` de `fd99362`) : latente, 0 aujourd'hui.** `grep -rnE '^\s*def( +|\t)test_'` sur tous les `test_*.py` = **vide** (tous en un-espace PEP 8) → aucun mis-comptage courant, `quality_report.json` **byte-identique**. Mais c'est la **correction du contrat de détection de l'outil d'enforcement #6** (compter correctement n'importe quel Python valide + coïncider avec la sœur), pas une sur-défense d'un cas d'entrée produit improbable — même base d'acceptation que `fd99362`. Divergence sœur de recensement de fichiers vérifiée aussi : `criteria` recurse (`os.walk`) là où `discovery` liste à plat (`os.listdir`) — **aucun `tests/*/test_*.py` imbriqué dans le dépôt** (`find` vide) → non-occurrent, axe distinct (découverte de fichiers, pas détection de méthode), **laissé** (discovery = autorité du gate ; ne pas muter son comportement pour un cas nul).
|
||||
|
||||
**Fix (chirurgical · forme, pas graphie · single-source-de-forme · teeth).** `criteria.py:18` : `def ` → `def\s+`, forme **strictement identique** à `discovery._TEST_METHOD_RE` (commentaire mis à jour : les deux compteurs doivent coïncider). **+ teeth** : `test_tests_counts_non_single_space_def_separator` (fixture 3 méthodes : un-espace · deux-espaces · tab) — **prouvé mordant** : ancien regex `def ` compte **1** des 3 (loupe deux-espaces + tab) ; nouveau `def\s+` compte **3**. La fixture ASCII existante (`test_tests_counts_methods_and_thresholds` « 5 méthodes ») reste en un-espace → aucune régression.
|
||||
|
||||
**Sortie inchangée (robustesse pure · #6 auto-vérifié).** Aucun module du dépôt n'ayant de `def` multi-espace/tab, `crit_tests` rend une évidence **identique pour les 24 modules** → `quality_report.json` **byte-identique** (rebuild `audit_4big_gen.py build` → `git diff --stat` **vide** ; `audit_4big` **s'auto-exclut** de son propre scoring — les modules qa scorés sont `qa-audit-5d`/`qa-acceptance`/`qa-regression`, pas lui). Le fix ne change **aucun score**.
|
||||
|
||||
**Cascade d'artefacts (uniquement la matrice de régression · mémoire `artifact-reproducibility-gate`).** L'ajout du test augmente le décompte de la suite `audit_4big` : `regression_gen.py build` (plan) **puis** `run` (matrice) → `regression_run.json` **627 → 628 exécutés · 610 → 611 passés · 17 skippés · 0 échec**. Surfaces de prose gatées re-dérivées (flaggées RED par `check_readme_claims`, corrigées) : fiche `03_agents/qa/AGENT.md` (colonne `audit_4big` **36 → 37** ← `count_tests` ; agrégat **627/610 → 628/611**) + `03_agents/erpnext_backend/AGENT.md:40` (claim live **627 → 628**). Le `daily_reports/2026-08-11` (snapshot signé) et les logs sont des instantanés datés → laissés (`two-logging-channels`).
|
||||
|
||||
**Classe désormais close (les 2 axes de la coïncidence des compteurs).** Après `072823` (char-class) + cette session (séparateur), `criteria._TEST_DEF_RE` et `discovery._TEST_METHOD_RE` sont **forme-identiques** ; l'axe fichiers (recursion) est non-occurrent et documenté laissé. **Pas de nouveau gate (#5)** : la divergence de compte est déjà **structurellement gatée** (`check_readme_claims` a immédiatement rougi la fiche QA dès que la matrice a bougé) et la teeth verrouille le comportement. Occurrence latente → correction de contrat de l'outil, pas de gate additionnel.
|
||||
|
||||
**Vérif.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** rétabli après régénération. **0 code moteur V18** (bloqué #6), **0 commande VPS** (#8), **0 API externe**. Fichiers : `qa/audit_4big/q4lib/criteria.py` (regex) + `qa/audit_4big/tests/test_audit_4big.py` (teeth) + `qa/regression/out/{regression_plan,regression_run,MANIFEST}.json` + `03_agents/qa/AGENT.md` + `03_agents/erpnext_backend/AGENT.md` + ce journal. `quality_report.json` **non touché** (auto-exclusion prouvée, `git diff --stat` vide).
|
||||
|
||||
Reference in New Issue
Block a user