[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:
Claude Code DTP Worker
2026-08-11 07:40:08 +00:00
parent 344b8154e1
commit ac595d0749
9 changed files with 51 additions and 13 deletions
@@ -60,7 +60,7 @@
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "22 méthodes test_* dans 1 fichier(s) (seuil 8)"
"evidence": "23 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
@@ -15,7 +15,7 @@ import json
import os
import re
_TEST_DEF_RE = re.compile(r"^\s*def (test_[A-Za-z0-9_]+)\s*\(", re.MULTILINE)
_TEST_DEF_RE = re.compile(r"^\s*def (test_\w+)\s*\(", re.MULTILINE)
_ADD_PARSER_RE = re.compile(r"add_parser\(|add_subparsers\(")
@@ -106,6 +106,26 @@ class CriteriaTest(unittest.TestCase):
mod = _make_module(d, tests=9)
self.assertTrue(criteria.crit_tests(mod, 8)["passed"])
def test_tests_counts_non_ascii_method_names(self):
# Régression : un nom de méthode accentué (PEP 3131, ex. réel
# `test_traçabilite_source` dans publiciste) est un test valide et
# exécuté par unittest — le comptage doit l'inclure, comme la source
# sœur reglib.discovery (`test_\w+`, \w Unicode). L'ancien char-class
# ASCII `[A-Za-z0-9_]` le loupait → sous-comptage (22 au lieu de 23)
# et fait faux dans l'évidence, en violation du cœur anti-invention #6.
with tempfile.TemporaryDirectory() as d:
mod = os.path.join(d, "mod")
tdir = os.path.join(mod, "tests")
os.makedirs(tdir)
with open(os.path.join(tdir, "test_mod.py"), "w",
encoding="utf-8") as fh:
fh.write("import unittest\nclass T(unittest.TestCase):\n"
" def test_ascii(self):\n pass\n"
" def test_traçabilite_source(self):\n"
" pass\n")
res = criteria.crit_tests(mod, 1)
self.assertIn("2 méthodes", res["evidence"])
def test_cli_fails_without_entrypoint(self):
with tempfile.TemporaryDirectory() as d:
mod = _make_module(d, cli=False)
@@ -5,7 +5,7 @@
"version": "1.0",
"verdict": "PASS",
"suites": 24,
"test_methods": 625,
"test_methods": 626,
"coverage_ok": true,
"artifacts": [
"regression_plan.json"
@@ -211,7 +211,7 @@
"in_gate": true,
"has_tests_dir": true,
"test_files": 1,
"test_methods": 34
"test_methods": 35
},
{
"id": "qa.audit_5d",
@@ -295,7 +295,7 @@
"totals": {
"suites": 24,
"test_files": 24,
"test_methods": 625,
"test_methods": 626,
"min_methods": 10,
"under_threshold": 0
},
@@ -198,9 +198,9 @@
{
"id": "qa.audit_4big",
"path": "qa/audit_4big",
"expected_methods": 34,
"ran": 34,
"passed": 34,
"expected_methods": 35,
"ran": 35,
"passed": 35,
"failures": 0,
"errors": 0,
"skipped": 0,
@@ -296,8 +296,8 @@
"suites": 24,
"green": 24,
"red": 0,
"ran": 625,
"passed": 608,
"ran": 626,
"passed": 609,
"failures": 0,
"errors": 0,
"skipped": 17