From e38dd933c69d2a105b0bac90f05aed8563faba63 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Wed, 5 Aug 2026 04:48:56 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260805=5F044153]=20Attestation?= =?UTF-8?q?=20des=20DENTS=20des=20suites=20de=20MODULE=20=E2=80=94=20BATCH?= =?UTF-8?q?=203=20:=20mutation-test=20generator-logic=20sur=206=20nouvelle?= =?UTF-8?q?s=20suites=20(18/25=20prouv=C3=A9es)=20=E2=86=92=206=20BITES=20?= =?UTF-8?q?=C2=B7=200=20TOOTHLESS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Continuation de l'axe des DENTS des suites de MODULE ([[module-suite-teeth-mutation]]) : batches 034144+041149 avaient prouvé 12/25 ; ce batch 3 en couvre 6 de plus → 18/25 · 7 restantes non-couvertes ≠ édentées (pas de plafond silencieux). 6 BITES (chaque suite mord sur une dérive de LOGIQUE de son générateur, jamais un écho d'artefact) : - rbac/fixtures_gen builder:43 if_owner ==→!= (test_if_owner_reflete_scope_own) - rbac/userperm_gen builder:43 by_mechanism += 1→+=2 (sum==50) - rbac/apply_plan aggregator:174 chaîne bijective 2e ==→!= (assertTrue couverture_bijective) - mobile/app_config builder:105 roles=sorted(...)+reverse=True (==sorted(roles_map[portail])) - qa/audit_5d builder:60 count(_FAIL)→count(_PASS) (totals fail:0→13) - frontend/chat_otoia builder:114 sum(nb_roles)→sum(1) (test_44_roles_couverts 44→~5) Axe distinct des DENTS des 8 gates STATIQUES (031134, 8/8) : une suite qui rechargerait out/*.json contre elle-même serait édentée = faux vert Sprint 8 · les suites reconstruisent en mémoire depuis le contrat. LEÇON réappliquée (désambiguïser TOOTHLESS-test vs mutation INERTE) : le 1er pick mobile (:192 roles_couverts sum→len) était édenté pour la suite de MODULE (agrégat jamais ré-asserté en mémoire) ; basculé sur :105 (tri, réellement contraint). Idem fixtures :68 → :43. Harnais /tmp read-only, remplacement d'octets littéral (assert 1 occurrence), run de la seule suite, restore byte-exact cp+cmp, trap EXIT, jamais git clean, arbre pristine · 0 gate ajouté (#5) · 0 chiffre inventé (#6) · 0 édition prod · CI 33 PASS Co-Authored-By: Claude Opus 4.8 (1M context) --- 05_activity_log/2026-08-05.md | 49 +++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/05_activity_log/2026-08-05.md b/05_activity_log/2026-08-05.md index 53a1fda..ce855b1 100644 --- a/05_activity_log/2026-08-05.md +++ b/05_activity_log/2026-08-05.md @@ -1,5 +1,54 @@ # Activity Log · 2026-08-05 · Claude Code DTP Worker +## Session 044153 · Attestation des DENTS des **suites de MODULE** — BATCH 3 : mutation-test *generator-logic* sur 6 nouvelles suites (→ **18/25** prouvées) · **6 BITES · 0 TOOTHLESS** · arbre byte-pristine · 0 édition de production + +**Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **33 PASS · 0 FAIL · 0 SKIP**, arbre +propre, roadmap `ROADMAP_8_WEEKS_OR_LESS.md` intégralement livrée/gatée. Continuation directe de +l'axe des DENTS des suites de MODULE ([[module-suite-teeth-mutation]]) : les batches 034144 (6) et +041149 (6) ont prouvé **12/25** suites, laissant **13 non-couvertes (≠ édentées, juste non-prouvées)**. +Ce batch 3 en couvre 6 de plus → **18/25**. Axe distinct des 8 gates STATIQUES (8/8, 031134) : une +suite qui rechargerait `out/*.json` contre elle-même serait édentée = faux vert Sprint 8. + +**Méthode.** Reconnaissance (Explore, read-only) pour cartographier, par module, **une ligne de LOGIQUE +de générateur** (calcul/règle, jamais un octet d'artefact) qu'une assertion unittest reconstruit **en +mémoire** depuis le contrat. Unicité de chaque cible re-vérifiée par `grep -Fc == 1` **avant** mutation. +Harnais `/tmp` read-only (`/tmp/suite_teeth_20260805_3.sh`) : backup `cp -p` → remplacement d'octets +littéral (`str.replace`, assert 1 occurrence) → run de **la seule suite du module** → assert `exit≠0` → +restauration `cp` + `cmp` byte-exact ; `trap EXIT` restaure tout ; jamais `git clean`/`checkout` +([[ci-gate-verification-method]]). + +**6 BITES (mutations de LOGIQUE réelles) :** +- `rbac/fixtures_gen` — `fixturelib/builder.py:43` `if_owner = scope == SCOPE_IF_OWNER` `== → !=` → + inverse tous les `if_owner`, `test_if_owner_reflete_scope_own` (attend `1 if scope=="own" else 0`) **mord**. +- `rbac/userperm_gen` — `permlib/builder.py:43` `by_mechanism[mechanism] += 1` `→ += 2` → total 50→100, + `test_manifeste_fidele` (`assertEqual(sum(by_mechanism.values()), 50)`) **mord**. +- `rbac/apply_plan` — `applylib/aggregator.py:174` chaîne `roles == cible == up_entries == rp_covered`, + 2ᵉ `== → !=` → `couverture_bijective` bascule False, `test_consistency_bijective` (`assertTrue`) **mord**. +- `mobile/app_config` — `mobilelib/builder.py:105` `roles = sorted(roles_map.get(key, []))` `+reverse=True` → + ordre inversé, `test_roles_allowed_egal_surface_rbac` (`==sorted(roles_map[portail])`) **mord**. +- `qa/audit_5d` — `qalib/builder.py:60` `"fail": all_statuts.count(_FAIL)` `_FAIL → _PASS` → totals + fail 0→13, `test_verdict_pass_with_open_items` (`totals == {...,"fail":0,...}`) **mord**. +- `frontend/chat_otoia` — `chatlib/builder.py:114` `"roles_couverts": sum(m["nb_roles"] …)` → + `sum(1 …)` → 44→~5, `test_44_roles_couverts` (`total(44) == roles_couverts`) **mord**. + +**LEÇON de méthode réappliquée — désambiguïser TOOTHLESS-test vs mutation INERTE.** L'Explore avait +d'abord proposé `mobile mobilelib/builder.py:192 "roles_couverts": sum → len` : **édenté pour la suite +de MODULE** car `roles_couverts` (agrégat manifest) n'est **jamais** ré-asserté en mémoire par la suite +mobile (seuls `n_roles`/`roles_allowed` par-onglet le sont). Observation honnête, **pas un défaut** — on +a muté à la place une ligne **réellement contrainte** (`:105` le tri). Idem `fixtures :68 doctypes_uniques` +(non référencé par la suite) → basculé sur `:43 if_owner`. → Règle confirmée : **vérifier que la ligne +mutée est bien celle que le test reconstruit avant de croire un verdict.** + +**Portée honnête.** 18/25 échantillonnées pour la diversité (inversion booléenne, incrément de compteur, +chaîne d'égalité, tri-déterminisme, count de statut, agrégat de rôles). **7 restantes non-couvertes ≠ +édentées** (rbac agrégé, portails, audit-4big, demo-scenario, regression, deploy-runbook, acceptance) — +pas de plafond silencieux. + +**Vérifications.** Après restauration : `git status --porcelain` **vide**, arbre **byte-exact pristine** +(6/6 fichiers `cmp` OK). `./run_ci.sh` → **33 PASS · 0 FAIL · 0 SKIP** (inchangé). Harnais `/tmp` supprimé. +**0 gate ajouté (#5 — prouve les tests existants, n'en ajoute aucun) · 0 chiffre inventé (#6) · 0 édition +de production · 0 commande VPS (#8) · aucun `git clean`.** + ## Session 041149 · Attestation des DENTS des **suites de MODULE** — BATCH 2 : mutation-test *generator-logic* sur 6 nouvelles suites (→ **12/25** prouvées) · **6 BITES · 0 TOOTHLESS** · arbre byte-pristine · 0 édition de production **Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **33 PASS · 0 FAIL · 0 SKIP**, arbre