diff --git a/05_activity_log/2026-08-05.md b/05_activity_log/2026-08-05.md index 85bb37a..53a1fda 100644 --- a/05_activity_log/2026-08-05.md +++ b/05_activity_log/2026-08-05.md @@ -1,5 +1,55 @@ # Activity Log · 2026-08-05 · Claude Code DTP Worker +## 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 +propre. Continuation honnête et directe de l'axe des DENTS des suites de MODULE ([[module-suite-teeth-mutation]]) : +la session 034144 avait prouvé **6/25** suites, laissant **19 non-couvertes (≠ édentées, juste non-prouvées)**. +Ce batch 2 en couvre 6 de plus → **12/25**. Axe distinct des DENTS des 8 gates STATIQUES (8/8, 031134) : une +suite qui rechargerait `out/*.json` contre elle-même serait édentée = faux vert Sprint 8 comme un gate édenté. + +**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 vérifiée par `grep -Fc` **avant** mutation. Harnais `/tmp` read-only +(`/tmp/suite_teeth_20260805_2.sh`) : backup `cp` → mutation de la logique → exécution de **la seule suite du +module** → assertion `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) :** +- `faisabilite/generator` — `scorer._score_completude` `20 * filled → 20 / filled` (sed adressé L57 car la + formule récurre L81) → le score `4big` tombe < 95, `test_complete_brief_scores_publiable` **mord** (exit 1). +- `faisabilite/bancable` — `finance.derived` point d'équilibre `math.ceil(pe_brut) → math.floor` → 21→20, + `test_derived_arithmetic_traceable` **mord**. +- `crm/workflow_vente` — `builder` `trans_rows.sort(...)` `+reverse=True` → casse le déterminisme trié, + `test_transitions_sorted_stable` **mord**. +- `crm/dossier_vente` — `is_submittable` seuil `>= "1"` (voir ci-dessous) **mord**. +- `crm/financement_bancaire` — `gate.apport_requis_usd` `/ 100.0 → * 100.0` → apport ×10 000, + `test_apport_requis_*` **mord**. +- `publiciste` — `_fmt_usd` suppression du `.replace(",", " ")` (séparateur de milliers = espace) → + "USD 150,000" ≠ "USD 150 000" attendu (test L201) **mord**. + +**LEÇON de méthode — un verdict « TOOTHLESS » doit être désambiguïsé : (a) test réellement édenté vs +(b) mutation comportementalement INERTE pour la donnée du contrat.** Deux mutations de ce batch ont d'abord +lu TOOTHLESS mais étaient (b), **PAS des défauts** : +- `dossier_vente` `>= "1" → > "1"` est **inerte** car le max des `doc_status` réels = **"2"** (les deux + branches donnent 1). Une mutation qui **fait basculer** le résultat (`>= "3"` → `"2">="3"` False → 0) + **mord** bien : la suite contraint la règle `is_submittable`. +- `publiciste` `min(prices) → max` est **inerte** car le retour de `_prix_depuis` n'alimente QUE la gate + `is not None` (L116) ; sa valeur min-vs-max n'est **jamais** affichée (chaque ligne de typologie rend son + propre prix, L57). Observation honnête, **pas un défaut à corriger** (#5/#6) : la sémantique du minimum + n'a aucun effet observable en aval → on mute plutôt une logique **observée** (`_fmt_usd`). + → Règle : **confirmer que la mutation change la SORTIE pour la fixture avant de croire un TOOTHLESS.** + +**Portée honnête.** 12/25 échantillonnées pour la diversité (arithmétique, seuil booléen, tri-déterminisme, +zfill/format, dédup, séparateur) ; **13 restantes non-couvertes ≠ édentées** (rbac-agrégat/fixtures/userperm/ +applyplan, portails, audit-5d, chat-otoia, audit-4big, demo-scenario, regression, deploy-runbook, acceptance, +mobile-app-config) — pas de plafond silencieux. + +**Vérifications.** Après restauration : `git status` **propre**, arbre **byte-exact pristine** (6/6 fichiers +`cmp` OK). `./run_ci.sh` → **33 PASS · 0 FAIL · 0 SKIP** (inchangé — aucun fichier gaté modifié en net). +**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 034144 · Attestation des DENTS des **suites de test de MODULE** — mutation-test *generator-logic* (6 suites échantillonnées, chacune doit sortir NONZERO sur une dérive de LOGIQUE de son générateur, pas d'écho d'artefact) → **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