[DTP-Worker 20260805_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
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) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,54 @@
|
|||||||
# Activity Log · 2026-08-05 · Claude Code DTP Worker
|
# 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]]). <!-- ci-allow : mention de l'interdit, jamais exécuté -->
|
||||||
|
|
||||||
|
**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`.** <!-- ci-allow : mention de l'interdit, jamais exécuté -->
|
||||||
|
|
||||||
## 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
|
## 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
|
**Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **33 PASS · 0 FAIL · 0 SKIP**, arbre
|
||||||
|
|||||||
Reference in New Issue
Block a user