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