[DTP-Worker] fix correctness · audit 4Big sous-comptait un test au nom accentué (regex ASCII vs \w Unicode de la source sœur reglib.discovery)
criteria.py:18 comptait les méthodes via char-class ASCII [A-Za-z0-9_] → loupait le test réel `test_traçabilite_source` (ç · PEP 3131, exécuté par unittest) → évidence fausse « 22 méthodes » pour publiciste (réel 23), en violation du cœur anti-invention #6 de l'audit lui-même. La source sœur qa/regression/reglib/discovery.py:23 comptait déjà correctement (`test_\w+`, \w Unicode) = 23 → les 2 outils QA divergeaient d'un. Fix aligné sur la sœur (\w). Teeth ajoutée (test_tests_counts_non_ascii_method_names, mordante : 1 sur l'ancienne regex, 2 sur la nouvelle). Cascade régénérée : quality_report.json (publiciste 22→23, verdict PASS 24/24 min 100 inchangé) · regression_run/plan/MANIFEST (625→626 exéc · 608→609 passés) · fiches qa (audit_4big 34→35, agrégat 626/609) + erpnext_backend (625→626). Blast-radius = 1 seul nom de test non-ASCII dans tout le dépôt (scan AST 24 suites). Pas de nouveau gate (#5) : check_readme_claims mord déjà la divergence. run_ci = 33 PASS · 0 FAIL · 0 SKIP. 0 code moteur V18 (#6) · 0 VPS (#8). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -181,3 +181,21 @@ Un lecteur (agent ou humain) du README — le doc le plus consulté — pouvait
|
||||
**Sûreté des gates (vérifiée AVANT édition).** `check_readme_claims` recompute des claims **très spécifiques** bornés à `**\d+/\d+ modules gated à \d+/100**`, `**\d+ suites gated**`, `## Les \d+ agents`, etc., tous liés à un `out/*.json` — mes chiffres de prose (35 sous-sections · 8 interdictions · 15 phases) proviennent des **.md de gouvernance** (non-artefacts, non recomputés) et n'épousent **aucun** de ces motifs bold-wrappés → surface non parsée. `check_docs` : les 2 liens ciblent des fichiers **existants/tracked/lisibles**, aucun fragment-anchor → résolus (`run_ci` vert le confirme). `guard_constraints` : aucun URL/usage interdit (« HELIOS RD SRL »/« Section 60 »/« loi 126-02 » ≠ termes proscrits ; aucun `github`/`stripe`/`espocrm`/`hubspot` écrit).
|
||||
|
||||
**Vérif.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** (inchangé). **0 code moteur V18** (bloqué #6), **0 module de production touché**, **0 artefact reconstruit** (README non scoré par `audit_4big`, hors `05_deliverables_mvp/`), **0 gate ajouté** (#5 — occurrence isolée, surface non parsée). Aucune commande VPS (#8), aucune API externe. **Note de complétude :** les **4 documents de gouvernance V18** tracked+lisibles (directive · audit · GO signal · addendum Sec.60) sont désormais tous liés depuis l'index racine ; le point d'entrée du mandat expose la séquence bloquée et ses contraintes de publication de bout en bout. Fichiers : `README.md` (2 sous-bullets) + ce journal.
|
||||
|
||||
---
|
||||
|
||||
## Session `20260811_072823` — FIX correctness · l'audit 4Big sous-comptait un test au nom accentué (regex ASCII vs `\w` Unicode de la source sœur) — 22 → 23, teeth ajoutée
|
||||
|
||||
**É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 · directive `:90-91` « NE PAS coder avant l'audit » · #6). L'alignement des bannières V18 des 4 modules-origine + le liage index sont clos (sessions précédentes). Rendements décroissants sur les micro-tâches doc → recherche d'un **défaut de correction réel** non-bloqué et à valeur produit (hunt Explore ciblé, hors périmètre V18/#8).
|
||||
|
||||
**Défaut trouvé (classe #6 anti-invention · DANS l'outil d'audit qualité lui-même).** `qa/audit_4big/q4lib/criteria.py:18` comptait les méthodes de test via une char-class **ASCII pure** : `_TEST_DEF_RE = re.compile(r"^\s*def (test_[A-Za-z0-9_]+)\s*\(", …)`. Or Python 3 (PEP 3131) autorise les identifiants **Unicode** : le test réel **`test_traçabilite_source`** (le `ç`) existe à `publiciste/tests/test_publiciste.py:99`, est **valide et exécuté** par unittest (« Ran 23 tests »). La regex ASCII le **loupait** → `crit_tests` publiait l'évidence fausse **« 22 méthodes test_* »** dans `quality_report.json` (réel = **23**). Le critère TESTS reste PASS (seuil 8) et le score inchangé (100) — mais **le fait publié était faux**, en violation du cœur anti-invention #6 de l'audit (« une note est recomputée à partir de faits vérifiables », `criteria.py:1-7`).
|
||||
|
||||
**Preuve que c'est un bug (pas by-design) — la source SŒUR le compte déjà correctement.** `qa/regression/reglib/discovery.py:23` compte le MÊME concept avec `_TEST_METHOD_RE = re.compile(r"^\s*def\s+(test_\w+)\s*\(")` — **`\w` est Unicode-aware par défaut en Python 3** → il compte publiciste = **23** (attesté dans `regression_plan.json`, byte-gaté, autorité de la colonne « Tests » des fiches via `count_tests`). Les deux outils QA **divergeaient d'un** sur publiciste (23 vs 22) ; `criteria.py` était le mauvais. Blast-radius vérifié : **un seul** nom de test non-ASCII dans tout le dépôt (scan AST des 24 suites) → publiciste seul impacté ; le « 22 méthodes mobile » du `daily_reports/2026-08-03` est un module distinct (coïncidence), non touché.
|
||||
|
||||
**Fix (chirurgical · single-source · aligné sur la sœur).** `criteria.py:18` : char-class ASCII `[A-Za-z0-9_]` → `\w` (Unicode), forme identique à `reglib.discovery`. **+ teeth** : nouveau test `test_tests_counts_non_ascii_method_names` dans `qa/audit_4big/tests/test_audit_4big.py` (fixture ASCII + `test_traçabilite_source`, exige « 2 méthodes ») — **prouvé mordant** : sur l'ancienne regex ASCII il compte 1 → assertion échoue ; sur `\w` → 2 → passe. La fixture existante du suite étant en ASCII, aucune régression sur `test_tests_counts_methods_and_thresholds` (« 5 méthodes » inchangé).
|
||||
|
||||
**Cascade d'artefacts régénérée (mémoire `artifact-reproducibility-gate` + `audit4big-rebuild-after-doc-edits`).** (1) `quality_report.json` régénéré **en dernier** → seule variation = évidence publiciste TESTS « 22 → 23 méthodes » ; verdict **PASS · 24/24 · min 100** inchangé. (2) L'ajout du test change le décompte de la matrice : `regression_gen.py build` (plan) **puis** `run` (matrice live) → `regression_run.json` **625 → 626 exécutés · 608 → 609 passés · 17 skippés · 0 échec** (le nouveau test lui-même + audit_4big se score lui-même). (3) Surfaces de prose re-dérivées : fiche `03_agents/qa/AGENT.md` (colonne audit_4big **34 → 35** ← `count_tests` ; agrégat **625/608 → 626/609**) — la première flaggée RED par `check_readme_claims`, la seconde par le même gate ; + `03_agents/erpnext_backend/AGENT.md:40` (claim live **625 → 626**, sourcé `regression_run.json`). Le `daily_reports/2026-08-11` (snapshot signé HEAD `18d8763`) et les logs sont des instantanés datés → laissés (mémoire `two-logging-channels`).
|
||||
|
||||
**Pourquoi pas un nouveau gate (#5).** La divergence est déjà **structurellement gatée** : `check_readme_claims` a **immédiatement rougi** (fiche QA vs `count_tests`) dès que la matrice a bougé, et la teeth ajoutée verrouille le comportement de `criteria.py`. Ajouter un gate « criteria.py == discovery.py » serait redondant — la réconciliation croisée existante mord déjà. Occurrence isolée (1 nom non-ASCII), corrigée à la source unique.
|
||||
|
||||
**Vérif.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** rétabli après régénération complète. **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/audit_4big/out/quality_report.json` + `qa/regression/out/{regression_plan,regression_run,MANIFEST}.json` + `03_agents/qa/AGENT.md` + `03_agents/erpnext_backend/AGENT.md` + ce journal.
|
||||
|
||||
Reference in New Issue
Block a user