[DTP-Worker 20260811_095844] Auto exec · session 20260811_095844
CI / Contraintes NON-NÉGOCIABLES (CLAUDE.md) (push) Has been cancelled
CI / Validation JSON (schémas Faisabilité) (push) Has been cancelled
CI / Qualité documentaire (liens + 4Big) (push) Has been cancelled
CI / Reproductibilité des artefacts out/ (build == commité) (push) Has been cancelled
CI / Fraîcheur matrice de régression (run == commité) (push) Has been cancelled
CI / Intégrité du câblage CI (gate agrège tout · gates statiques verrouillés) (push) Has been cancelled
CI / Intégrité des chiffres du README (valeur == artefact cité · (push) Has been cancelled
CI / Intégrité mobile-build.yml (gating portable · activation différée · (push) Has been cancelled
CI / Publiciste · parser + schéma + generator (unittest) (push) Has been cancelled
CI / RBAC · 50 rôles + schéma (unittest) (push) Has been cancelled
CI / Faisabilité · générateur 4 volets + round-trip (unittest) (push) Has been cancelled
CI / RBAC · fixtures ERPNext (Role + Custom DocPerm) (push) Has been cancelled
CI / RBAC · plan User Permission (row-level) (push) Has been cancelled
CI / RBAC · Role Profile (bundles par portail) (push) Has been cancelled
CI / RBAC · run-book d'application unifié (agrégat 3 volets) (push) Has been cancelled
CI / Faisabilité · dossier bancable trilingue FR/EN/ES (push) Has been cancelled
CI / CRM · workflow vente ERPNext (lead → CONFOTUR) (push) Has been cancelled
CI / CRM · DocType porteur OTO Dossier Vente (push) Has been cancelled
CI / CRM · barème commissions vendeurs (push) Has been cancelled
CI / CRM · Financement Bancaire (gate hypothécaire RD) (push) Has been cancelled
CI / Fiscal · e-CF DGII (Compupar) (push) Has been cancelled
CI / Frontend · Workspaces 5 portails rôle (push) Has been cancelled
CI / Legal · DocType CONFOTUR Application (push) Has been cancelled
CI / QA · Audit 5D conformité (push) Has been cancelled
CI / SEO · mots-clés trilingues + schema.org + hreflang (push) Has been cancelled
CI / Chat OTOIA · montage par portail (Custom Block) (push) Has been cancelled
CI / QA · Audit 4Big (95+/100 sur 100% deliverables) (push) Has been cancelled
CI / Démo · Scénarios (run-sheet P07 banquier / P05 client) (push) Has been cancelled
CI / QA · Matrice de régression exhaustive (Sprint 8) (push) Has been cancelled
CI / DevOps · Run-book de déploiement VPS unifié (Sprint 8) (push) Has been cancelled
CI / QA · Matrice d'acceptation / traçabilité MVP (Sprint 8) (push) Has been cancelled
CI / Mobile · config app Expo/EAS (navigation par rôle) (push) Has been cancelled
CI / PIE · manifest de dépendances (Annexe 12 · V10.1) (push) Has been cancelled
CI / E2E baseline Playwright (manuel) (push) Has been cancelled
CI / Gate qualité (agrégat) (push) Has been cancelled

This commit is contained in:
Claude Code DTP Worker
2026-08-11 10:11:32 +00:00
parent 548a05ec61
commit 39def91880
9 changed files with 49 additions and 12 deletions
+22
View File
@@ -284,3 +284,25 @@ Or `def test_x(` (deux espaces) et `def\ttest_x(` (tabulation) sont du **Python
**Pourquoi c'est légitime et non du churn (#5).** Ce n'est pas un re-write d'un snapshot daté figé (ceux-là restent, `two-logging-channels`) : c'est la **mise au point courant du jour même** du canal stakeholder, dont le `9e02c38` précédent avait fait exactement autant (18d8763→ac595d0). Chaque chiffre injecté est **re-dérivé** de `regression_run.json` (`totals` = 628/611), aucun figé. **0 fichier de production · 0 artefact reconstruit · 0 gate ajouté · 0 code moteur V18 · 0 commande VPS · 0 API externe.**
**Vérif.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** (inchangé · le daily report tracked passe `check_docs` + `guard_constraints`). Fichiers : `05_deliverables_mvp/daily_reports/2026-08-11.md` + ce journal.
---
## Session `20260811_095844` — COUVERTURE produit · teeth `publiciste` sur les prix à ESPACE INSÉCABLE (U+00A0) · classe d'entrée réelle FR/ES 100 % non testée jusqu'ici
**État au démarrage.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** (baseline verte · `regression_run.json totals` = 628/611/17). Séquence moteur V18 toujours **intégralement bloquée** en gouvernance (D-06 approbation de l'audit = gate d'entrée · D-07 formules DCF/IRR/VAN/DSCR/LTV/LTC absentes · D-08 Master Data Model · directive `:90-91` « NE PAS coder avant l'audit » · #6) — **aucun code moteur légitime**. Les 2 directives 08-10 (`OTO_3D_STUDIO`, `COMPTE_CLIENT_COURRIELS`) restent hors périmètre repo. Les micro-tâches doc + l'arc `audit_4big` sont clos → recherche d'une tâche à **valeur produit réelle**.
**Chasse au bug d'abord (2 passes indépendantes) → aucun défaut, refus de fabriquer (#6).** Explore very-thorough sur les `*_gen.py`/`*lib/` **hors** `audit_4big`/`regression` (déjà balayés) : classes visées = char-class ASCII-vs-Unicode, off-by-one, comparateurs de seuil, sets à doublons, arithmétique dérivée, collisions de clés. **Rien de solide.** Les 2 candidats remontés étaient des **non-défauts** : (a) `publiciste/lib/parser.py:77` `.replace(" ", " ")` — l'Explore l'a lu « no-op » ; **hexdump** montre `c2 a0` = le 1er argument est un **NBSP** → c'est une **normalisation NBSP→espace réelle**, pas un no-op (l'Explore s'est fait piéger par des glyphes identiques à l'œil — exactement le risque byte-invisible) ; (b) `seo_gen.py` global-keyword digit-check = latent masqué par invariant. **Aucun n'est un bug** → non touchés.
**Vrai locus trouvé = un TROU DE COUVERTURE, pas un bug.** `parse_number`/`parse_price` de `publiciste` sont **conçus** pour l'**espace insécable U+00A0** comme séparateur de milliers — la graphie que Word/InDesign FR/ES insèrent dans les prix réels des `data_room` (« DOP 8 850 000 » avec NBSP). La capture repose sur la char-class **Unicode-whitespace** de `parser.py:74` (`[0-9\s.,` + un **NBSP littéral** `c2 a0` redondant avec `\s`). Or **aucun des 23 tests** n'exerçait le NBSP : `test_prix_formats:39` (« DOP 8 850 000 ») utilise des **espaces ASCII 0x20** (`hexdump` confirmé), pas des NBSP. La classe d'entrée réelle la plus caractéristique du parser était **100 % non testée** — et c'est précisément ce trou qui a permis à l'Explore de mésinterpréter la ligne 77 comme du code mort.
**Preuve end-to-end + bite ACCURATE (aucune affirmation non vérifiée · #6).** (1) `parse_price("DOP 8 850 000")` = **8850000.0** ✓, `parse_number("1 250")` = **1250.0** ✓ (exécuté). (2) Condition de bite **déterminée empiriquement, pas devinée** : la char-class porte `\s` **et** un NBSP littéral → retirer **l'un** est inoffensif (redondance belt-and-suspenders) ; le bite ne survient que si l'on **réduit la classe à de l'ASCII pur** `[0-9.,]` (retrait de TOUTE prise en charge whitespace-Unicode) → le test échoue alors `8.0 != 8850000.0` (prouvé : cassé RED, restauré VERT). Le commentaire du test a été **corrigé** d'une 1re rédaction fausse (« retirer `\s` mord ») vers la condition réelle — honnêteté de claim (#6). Même racine que l'arc `audit_4big` : « détecter la forme, pas une graphie ».
**Hygiène byte-invisible (leçon appliquée au test lui-même).** 1re rédaction du test contenait des **NBSP littéraux** (`nbsp = " "`) — je réintroduisais l'octet invisible que je dénonce. Réécrit en **escape explicite ` `** (`nb = " "`) → **0 octet invisible** dans le fichier de test (vérifié `grep -c`), intention 100 % lisible. La char-class de **production** (ligne 74), elle, est **laissée telle quelle** : son NBSP littéral est **redondant mais correct** (`\s` le couvre) ; l'éditer serait du churn cosmétique sur un non-défaut (#5, `verify-non-defects`) avec risque de dérive d'artefact pour zéro changement de comportement.
**Fix = 1 test teeth `test_prix_espace_insecable_milliers`** (classe `TestNumberParsing`) : `parse_price`/`parse_number`/`parse_int` sur NBSP (DOP/USD milliers + décimale). Distinct de l'arc récent : ce n'est **pas** un test de l'outil d'audit mais de la **couverture d'un module produit** sur une **entrée réelle** — valeur produit directe.
**Cascade d'artefacts régénérée (mémoires `artifact-reproducibility-gate` + `audit4big-rebuild-after-doc-edits`).** (1) `audit_4big_gen.py build``quality_report.json` : évidence publiciste TESTS **« 23 → 24 méthodes »** ; **verdict PASS · 24/24 · min 100 inchangé** (aucun score bougé — le seul delta est le compte). (2) `regression_gen.py build` puis `run``regression_run.json` **628 → 629 exécutés · 611 → 612 passés · 17 skippés · 0 échec** (publiciste suite ran 23→24 / passed 21→22 — les 2 « non-incréments » = ses tests oracle jsonschema neutralisés par `python -S`, cf. `regression-baseline-17-skips-by-design`). (3) Surfaces de prose gatées re-dérivées (flaggées RED par `check_readme_claims`, corrigées) : fiche `03_agents/publiciste/AGENT.md:95` (cellule Tests **23 → 24**`count_tests`) + agrégat `03_agents/qa/AGENT.md:35` (**628/611 → 629/612**) + `03_agents/erpnext_backend/AGENT.md:40` (claim live **628 → 629**). Le `daily_reports/2026-08-11` (snapshot signé) et les logs = instantanés datés → laissés (`two-logging-channels`).
**Pourquoi pas un nouveau gate (#5).** La divergence de compte est déjà **structurellement gatée** (`check_readme_claims` a immédiatement rougi la fiche publiciste + l'agrégat QA dès le rebuild) et la teeth verrouille le comportement NBSP. Trou de couverture isolé, comblé à la source → pas de gate additionnel.
**Vérif.** `./run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** rétabli après régénération. **0 code moteur V18** (bloqué #6), **0 module de production touché** (seul un test ajouté · la char-class de prod laissée intacte), **0 gate ajouté** (#5), **0 commande VPS** (#8), **0 API externe**. Fichiers : `05_deliverables_mvp/publiciste/tests/test_publiciste.py` (teeth) + `qa/audit_4big/out/quality_report.json` + `qa/regression/out/{regression_plan,regression_run,MANIFEST}.json` + `03_agents/{publiciste,qa,erpnext_backend}/AGENT.md` + ce journal.