Commit Graph

27 Commits

Author SHA1 Message Date
Claude Code DTP Worker 1aaef23fe4 [DTP-Worker 20260812_173219] chasse au défaut · axe FRAIS correctness de la logique métier financière/fiscale (les 4 fonctions de calcul cœur : commissions.compute_line · bancable.derived · ncf.compose_encf · ecf.build_bundle + formateurs monétaires) balayé par lecture directe ligne-à-ligne → logique SAINE (gardes is-not-None, ceil sourcé #9, zfill rejette >10 chiffres, or court-circuite), transitivement gatée par test_commissions/test_bancable/test_ecf_dgii, PAS un gate/fix · axe distinct des ~70 sweeps STRUCTURELS mémoire (byte-repro/schéma/encodage) · 0 code moteur V18 (bloqué #6) · 0 module touché · CI 33 PASS
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 17:38:33 +00:00
Claude Code DTP Worker 0ef7c1a079 [DTP-Worker 20260812_163212] chasse au défaut · axe FRAIS i18n (parité de clés + résolution des libellés) balayé sur bancable → CLEAN 37/37/37, transitivement gaté par la suite (render 3 langues), PAS un gate/fix
Axe absent de la mémoire : classe latent-KeyError i18n (un libellé référencé au rendu manquant dans une des 3 langues du dossier bancable). Balayé sur banclib/i18n.py + report.py :
- Parité : fr/en/es = jeu de clés IDENTIQUE 37/37/37 (miss+extra vides bidirectionnel) ; LANGS/LANG_FLAG/LANG_NOM concordent.
- Résolution : chaque L('…') statique + la clé dynamique lbl_{cle} (report.py:219) existe en fr ⟹ résout dans les 3 langues.
- Fumée : render_report x3 langues (chemin placeholder max) + render_all = 0 KeyError.

Verdict CLEAN + transitivement gaté : test_bancable.py rend déjà les 3 langues (render_report/render_all, briefs synthétique+normal l.~88-105) → une clé manquante casserait un test aujourd'hui. Donc PAS de gate dédié (#5 · doublon d'une protection transitive) ni de fix (aucun défaut). Distinct de seo-per-lang-cardinality-by-design (SEO, inégal par design).

0 code moteur V18 (bloqué #6) · 0 module prod touché · 0 artefact reconstruit · 0 chiffre figé (#6) · 0 gate (#5) · 0 commande VPS (#8) · 0 API externe. run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (inchangé). NFC-clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 16:37:02 +00:00
Claude Code DTP Worker 0f7a1d8f6f [DTP-Worker 20260812_160204] surface · D-09 · séparateur de milliers monétaire divergent entre les deux surfaces de rendu stakeholder (publiciste=espace · faisabilité=virgule) — arbitrage produit surfacé, NON un bug/fix worker
Chasse au défaut d'abord (pas un énième sweep stérile) : grep TODO/FIXME/stub =
RIEN ; axe format `:g`/`:,`/`:f` de prod = les 2 `:g` restants bornés+annotés
sûrs (commissions:86 percent 0-100 · bancable/finance:143 nb-unités borné) →
axe `:g` genuinement clos, 0 bug de correctness.

Vrai locus = arbitrage de PRÉSENTATION transverse, non un défaut :
- publiciste/lib/generator.py:34-39 → espace (`.replace(",", " ")`) : USD 8 560 000
- faisabilite/generator/genlib/renderer.py:28-37 + bancable/banclib/report.py:21-32
  → virgule US (`,.0f` sans replace) : USD 8,560,000
- signaux partiels sans règle dure : OTO_DESIGN_SYSTEM_v1.md:89-90 illustre
  l'espace (« dès 145 000 USD ») ↔ fixtures data_room écrivent en virgule
  (architecture.md:11 « USD 150,000 ») ; aucune directive ne tranche.

SURFACE, don't rewrite : ajout D-09 au OPEN_DECISIONS_REGISTER (+ note d'en-tête).
Choisir un séparateur = convention design/audience (arbitrage Michel), pas une
correction worker (#6). Les 2 rendeurs sont internes-cohérents+testés ; aucune
sortie formatée n'est un artefact commité (out/ = nombres bruts ; formatage au
runtime VPS #8) → aucun gate concerné. Pas de gate (#5) : classe D-01…D-08.

Vérif : run_ci 33 PASS · 0 FAIL · 0 SKIP (inchangé, doc éditorial). 0 code V18
(bloqué #6) · 0 module prod · 0 artefact reconstruit · 0 chiffre figé · NFC-clean.
Fichiers : M OPEN_DECISIONS_REGISTER.md · M 05_activity_log/2026-08-12.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 16:09:26 +00:00
Claude Code DTP Worker 1cf0e18fba [DTP-Worker 20260812_153203] méta-maintenance · compaction de l'index de mémoire agent au-dessus de sa limite (30→17 Ko) = cause-racine du churn de session, plutôt qu'un énième sweep CLEAN ou re-currency
Diagnostic : le journal des ~10 sessions du jour est saturé de sweeps « CLEAN · NOT a gate » marginaux + re-currency du rapport. Cause = l'index de mémoire agent (MEMORY.md) dépassait sa limite (29 Ko > 24.4 Ko) et ne se chargeait que PARTIELLEMENT (signalé par le harnais) → insights « by-design / don't re-flag / NOT a gate » invisibles → re-litige → churn. Corriger l'outil, pas surveiller le symptôme (même principe que le dé-épinglage HEAD en 150201).

Action (hors dépôt · outillage agent) : lignes d'index réécrites body-entier→hook concis (détail déjà dans les fichiers-sujets). 30117→17264 octets (charge désormais en entier · marge). Bijection 88 entrées ↔ 88 fichiers-sujets PROUVÉE par script ; 1 entrée perdue à la réécriture (link-label-target-mismatch) détectée par ce contrôle et RESTAURÉE. Ligne max 1040→252 car.

Dépôt : ce journal seul. État vérifié vert : run_ci 33/0/0 · matrice 635/618/17 PASS re-dérivée artefacts commités (#6) · 24 modules 100/100. Sans fix (V18 bloqué D-06 #6) · sans gate (#5, mémoire hors dépôt) · sans currency (rapport dé-épinglé) · sans commande VPS (#8) · sans API externe.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 15:38:58 +00:00
Claude Code DTP Worker c73ed5b626 [DTP-Worker 20260812_150201] structurel · fin de la boucle de re-currency du rapport stakeholder — dé-épinglage TOTAL du HEAD dans le document
La session 143156 avait diagnostiqué la boucle de churn (chaque commit worker
périme l'en-tête « HEAD attesté <hash> » ⟹ la session suivante « réconcilie »
⟹ nouveau commit ⟹ HEAD re-périmé) et converti la §Jalons en table roulante,
mais n'avait ôté le hash figé que du SOUS-TITRE de section — en le LAISSANT dans
l'en-tête du document (`HEAD attesté: 4a13557`), la ligne Session, et la
trajectoire §État courant. Fix partiel : la cause survivait dans 4 emplacements.

Ce commit neutralise les 4 : l'en-tête n'épingle plus AUCUN hash de HEAD (un
hash périme à chaque commit = cause structurelle) → « Point d'attestation » : le
HEAD se LIT (git log -1), il ne se FIGE pas ; ce qui fait foi = la matrice
635/618/17 · PASS (dérivée d'artefacts commités, stable jusqu'au prochain fix).
Hashes des §Jalons re-qualifiés jalons historiques immuables. §Contexte passé au
passé (émission initiale ee88d36). Le rapport ne peut plus périmer au prochain
commit → boucle cassée à la racine (≥6 sessions consommées).

Document éditorial hors gate (check_docs:50 continue · check_readme_claims:8239
exclu) → PAS de gate (#5), supprime la cause au lieu de la surveiller. 0 chiffre
inventé (#6, matrice re-dérivée). 0 code moteur V18 (bloqué D-06). NFC-clean.
CI 33 PASS · 0 FAIL · 0 SKIP.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 15:07:41 +00:00
Claude Code DTP Worker 1732cc3de1 [DTP-Worker 20260812_143156] currency · rapport stakeholder du jour porté au HEAD courant 4a13557 (le canal s'arrêtait à fb2d3e1 tout en attestant « HEAD courant » ; e15129b + 4a13557 grep-count 0 avant édition) + §« Jalons de vérification » convertie en TABLE ROULANTE — brise structurellement la boucle de churn (plus de HEAD re-figé dans l'intro ⟹ ne périme plus à chaque commit worker) · 2 lignes ajoutées (e15129b currency · 4a13557 sweep FRAIS arrondi lecture-seule, journal only) · compte 4→6 jalons · en-tête HEAD attesté fb2d3e1→4a13557 · trajectoire §État courant réalignée · matrice STABLE 635/618/17 (re-dérivée artefact commité #6) · document éditorial, sans fix code · sans gate (#5) · sans artefact reconstruit · NFC-clean · CI 33 PASS
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 14:36:35 +00:00
Claude Code DTP Worker 4a13557529 [DTP-Worker 20260812_140156] vérif · nouvel axe FRAIS « mode d'arrondi (banquier / round-half-to-even) » balayé repo-wide (8 sites round() de prod) → CLEAN teeth-prouvé, 0 défaut : scorer.py:57 verdict-immune (complete ⟹ filled==total ⟹ pts==20 exact, bande .5 pourtant atteignable filled∈{2,6,10,14}/16) · scorer.py:81 immune par inclusion champs_manquants · gate.py montants arrondis-au-cent métier + percents déjà gardés (85cd625/1992ee6) · parser.py domaine entier · audit_4big docstring+immune ea8458d · sweep replayable · sans fix · sans gate · sans note in-situ (aucun mis-flag → #5) · CI 33 PASS
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 14:09:12 +00:00
Claude Code DTP Worker e15129bc6a [DTP-Worker 20260812_133154] currency · remontée des 4 commits de vérification post-4ᵉ-vague dans le rapport stakeholder du jour — le canal s'arrêtait à 1992ee6 tout en s'affirmant « au HEAD courant » (grep-count 0 des 4 hashes avant édition)
chasse au défaut d'abord sur 2 axes FRAIS (hors mémoire) → DRY : docstring-vs-code sous-axe COMPORTEMENTAL (fallback/param/formule/branche non implémentés) CLEAN sur tous *_gen.py + *lib/ ; test-name ⟺ assertion (fake-coverage sémantique) CLEAN sur 24 suites / ~6364 lignes. Vrai locus = currency stakeholder (classe 4eb615b).

3 blocs cohérents dans daily_reports/2026-08-12.md : nouvelle §« Jalons de vérification depuis la 4ᵉ vague (1992ee6→fb2d3e1) » (4 commits non-opposables · byte-identiques) + en-tête HEAD attesté « HEAD courant »→fb2d3e1 (distingue 5ᵉ fix 634→635 des 4 vérifs matrice-stable) + §État courant : 4ᵉ vague nommée 1992ee6 (au lieu de « HEAD courant » devenu faux).

zéro invention #6 : matrice 635/618/17 · PASS re-dérivée de regression_run.json.totals ; D-01→D-08 inchangés. document éditorial → pas de gate #5. CI 33 PASS · 0 FAIL · 0 SKIP · NFC-clean · 0 code moteur V18 (bloqué #6) · 0 artefact reconstruit · 0 commande VPS #8.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 13:41:52 +00:00
Claude Code DTP Worker fb2d3e16bf [DTP-Worker 20260812_130149] vérif · chasse au défaut axe FRAIS date/time + parsing money/percent → 3 candidats RÉFUTÉS domaine-borné (signature_date="0" corrompu · banclib._pct constante canonique · rate() séparateur-milliers inatteignable car taux borné 0-100) + note anti-récurrence in-situ sur rate() (un Explore l'avait mal-classé en CONFIRMED DEFECT → re-flaggable) · commentaire pur · rebuild byte-identique · sans fix · sans gate · CI 33 PASS
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 13:08:15 +00:00
Claude Code DTP Worker 4eb615b174 [DTP-Worker 20260812_123144] currency · réalignement de 2 citations de ligne dérivées dans OPEN_DECISIONS_REGISTER.md — D-02 gate.py:142-145→:164-167 (gardes percent/overall des fixes 85cd625/1992ee6 ont décalé _cond_validation_wag) + D-01 confotur README:8-17→:32-33 (bannière V18 préfixée) · sweep complet du registre = autres citations résolvent (snapshots V18/directives datés stables) · sans fix code · sans gate · CI 33 PASS
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 12:36:29 +00:00
Claude Code DTP Worker ea8458d63b [DTP-Worker 20260812_120139] vérif · classe « affichage arrondi ⟺ gate booléen » FERMÉE repo-wide : preuve d'immunité structurelle de audit_4big (score-au-seuil 95 = quantité UNIQUE affichage+verdict, ≠ financement à 2 quantités divergentes) + note anti-récurrence in-situ → commentaire pur · rebuild byte-identique · sans fix · sans gate
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 12:07:20 +00:00
Claude Code DTP Worker 3849375b66 [DTP-Worker 20260812_113134] vérif · classe « percent==100 ⟺ ok » PROUVÉE FERMÉE sur les 4 conditions du gate financement (cross-module: seul module à champ percent) + durcissement anti-récurrence des 2 conditions à domaine borné (documents≤13/autorisations=4 ≪ seuil 2000) → commentaires purs · rebuild byte-identique · sans fix · sans gate
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 11:36:25 +00:00
Claude Code DTP Worker 1992ee63be [DTP-Worker 20260812_110124] fix correctness · financement_bancaire overall_percent — la barre GLOBALE pouvait afficher 100.0 tout en BLOQUANT (l'invariant per-condition de 093114 ne s'était pas propagé à l'agrégat) → matrice 634→635 · test à dents · exemple byte-identique · sans gate
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 11:09:49 +00:00
Claude Code DTP Worker 626c39d958 [DTP-Worker 20260812_103119] vérif · nouvel axe bien-formation structurelle du HTML généré (parseur tag-stack + entrées adverses FR/ES) → CLEAN teeth-prouvé · replayable sans gate
Chasse défaut d'abord sur un angle jamais balayé : le HTML émis par
publiciste/generator.py est-il structurellement bien-formé (balises
équilibrées, attributs non cassés) sous entrée réaliste FR/ES ?

- Parse site commité (6084 o, P01/P02) + projet adverse (free-text
  «»/'/"/&/<b>/<Cie> dans nom/localisation/positionnement/typologies/inclus)
  + chemin hero CSS url() → 0 erreur ; _esc(quote=True) neutralise tout.
- Détecteur teeth-prouvé : mord sur unclosed/misnest/stray, silencieux
  sur bien-formé (4/4).
- frappe.py mount_html non-échappé mais entrées enums/constantes
  (persona=Amélie, portail enum, spec contrôlé) → non-défaut, non re-flaggé.

0 défaut → 0 fix, 0 gate (#5, robustesse dans _esc/quote ∈ suite gatée),
0 artefact touché, 0 chiffre inventé (#6). run_ci inchangé 33/0/0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 10:38:38 +00:00
Claude Code DTP Worker 4aece53921 [DTP-Worker 20260812_100114] canal stakeholder · re-réconciliation daily report 2026-08-12 au HEAD courant (e7cc3c4→85cd625) · remontée du 4ᵉ fix correctness (gate financement) → matrice 633→634 · défaut-d'abord 8 surfaces + parité i18n bancable CLEAN
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 10:09:18 +00:00
Claude Code DTP Worker 85cd625dac [DTP-Worker 20260812_093114] fix correctness · financement_bancaire gate — un dossier incomplet pouvait afficher percent 100.0 (barre pleine ✓) tout en BLOQUANT
Défaut latent, byte-repro-aveugle : _cond_apport arrondit percent à 1 décimale
(round) tandis que ok est un test exact. Un versement dans la bande [99.95%,100%[
(ex. 19 999/20 000 USD = 99.995%) remonte à percent:100.0 alors que ok=False,
remaining=1 USD → barre frontend « 100% ✓ » qui refuse la soumission + raison
auto-contradictoire « reste 1 USD · 100.0% ». Seul _cond_apport atteignable
(montant continu) ; documents/autorisations = ratios entiers sur listes 13/4,
bande inatteignable.

Fix chirurgical : garde `if not ok and pct>=100.0: pct=99.9` → invariant
d'affichage percent==100.0 ⟺ ok. Échantillon commité à 67.8% (hors bande) →
gate_status_example.json/out rebuild BYTE-IDENTIQUE.

Test à dents test_apport_quasi_complet_ninclut_pas_100pct (mordu sans le fix).
Cascade +1 test : régression 633→634/616→617, plan+MANIFEST+quality_report
régénérés, fiches QA/Backend/CRM re-dérivées. run_ci 33/0/0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 09:43:10 +00:00
Claude Code DTP Worker cb8069b83c [DTP-Worker 20260812_090114] défaut d'abord · chasse DRY sur 8 modules non-audités · durcissement anti-récurrence des 3 sites :g-domaine-borné (commentaires purs · 0 impact artefact)
Explore very-thorough sur crm/dossier_vente · crm/financement_bancaire ·
faisabilite/bancable · frontend/chat_otoia · pie/manifest · qa/audit_4big ·
mobile/app_config · fiscal/ecf_dgii → 0 défaut réel. Les 4 candidats remontés
sont tous NON-défauts (verify-non-defects #6) : 3× `:g` sur domaine BORNÉ
(nombre d'unités / pourcentages 0-100 → exponentiel + arrondi-6-chiffres hors
domaine, et `:g` nettoie le bruit flottant) + 1× HTML chat_otoia à entrée
canonique contrôlée. Preuve robuste : report.py `_money` réserve sciemment
`,.0f`/`,.2f` aux montants non bornés → les `:g` restants sont un choix
d'ingénierie correct, pas un oubli.

Fait nouveau : le taux commissions `:g` (déjà statué non-défaut en 080104) a
RÉCIDIVÉ de flag ce cycle, et bancable ×2 fraîchement flaggés → la classe
gaspille un cycle d'audit à chaque passage. `grep ':g}'` prod = exactement 3
sites. Passe unique : note de justification in-situ à chacun (domaine borné,
2 pièges hors domaine, montants → `,.0f`, « ne pas corriger »). Convertit le
faux-positif récurrent en « déjà revu, sûr ».

0 fix de code (défauts inexistants ; corriger `:g`→`:f` réintroduirait du bruit
flottant = régression) · 0 gate (#5) · 0 artefact reconstruit (bancable sans
out/ ; _rate_label runtime non sérialisé) · matrice inchangée 633/616/17 ·
run_ci 33/0/0 · NFC-clean · 0 code moteur V18 (bloqué D-06) · 0 commande VPS.

M crm/commissions/commlib/finance.py
M faisabilite/bancable/banclib/finance.py
M faisabilite/bancable/banclib/report.py
M 05_activity_log/2026-08-12.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 09:11:53 +00:00
Claude Code DTP Worker 123761e938 [DTP-Worker 20260812_083114] canal stakeholder · réconciliation daily report 2026-08-12 au HEAD courant (37c68ac→e7cc3c4) · 2ᵉ vague de 3 fixes correctness que les sessions 073055/080104 avaient délibérément batchés → matrice 629→633
- aeb30b8 (070054) fix rendu publiciste URL hero percent-encodée → 630/613
- 5af86e3 (073055) hardening segment code même url() → 631/614
- e7cc3c4 (080104) fix commissions formule base×taux montants réels → 633/616
Chiffres re-dérivés des artefacts commités (jamais figés #6) : matrice 633/616/17 PASS · audit 4Big PASS 24×100/100 · bijection 24↔24. Note historique 1ʳᵉ vague (stable 629/612/17) laissée intacte car exacte pour cette vague.
Défaut d'abord : Explore very-thorough sur modules jamais ré-audités ce cycle (audit_5d · demo_scenario · acceptance · faisabilite/generator genlib · frontend/portails wslib) → NO DEFECTS FOUND (formatage num · divisions · off-by-one · JSON FR/ES · défauts fabriqués tous CLEAN).
run_ci 33/0/0 · rapport NFC-clean · 0 code moteur V18 (bloqué D-06) · 0 artefact autoritaire touché · 0 gate ajouté (#5) · 0 commande VPS (#8) · 0 API externe.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 08:38:41 +00:00
Claude Code DTP Worker e7cc3c4a3c [DTP-Worker 20260812_080104] fix correctness · commissions vendeurs — la formule traçable base×taux cassait sur montants réels
Bug latent réel (crm/commissions/commlib/finance.py:75) : le libellé de base de
la formule traçable « commission = base × taux » utilisait f"{base:g}", qui casse
deux fois sur des montants immobiliers réels en RD (une unité USD 300k ≈ 18M DOP) :
(1) notation exponentielle dès 1e6 (18000000 → 1.8e+07, illisible/non auditable) ;
(2) arrondi silencieux à 6 chiffres significatifs (123456.78 → 123457) = une base
FABRIQUÉE ≠ de la réelle, l'invention interdite par #6 dans le module même qui
proclame l'anti-invention.

Fix : helper _amount_label (f"{x:f}" jamais exponentiel + strip zéros) → décimal
fidèle, identique à l'ancien pour tous les montants simples (200000 reste 200000) ;
seuls les cas buggés changent. 2 tests à dents (millions non-exponentiel + décimales
préservées) — teeth prouvé : les DEUX échouent sans le fix.

Byte-repro : 0 impact d'artefact du module (compute_line est runtime, jamais appelé
par le générateur). Cascade compteur-de-suite seule : matrice 631/614 → 633/616,
regression×3 + quality_report régénérés, fiches qa/erpnext/crm + README réalignés
(commissions 25→27, Total CRM 81→83). run_ci 33/0/0. 0 code moteur V18 (bloqué D-06).
0 gate ajouté (#5). 0 commande VPS (#8).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 08:11:32 +00:00
Claude Code DTP Worker 5af86e3518 [DTP-Worker 20260812_073055] hardening correctness · rendu HTML publiciste — percent-encode le SEUL segment d'URL restant (code) dans le url('…') CSS
Durcissement d'uniformité (pas bug déclenchable aujourd'hui) qui COMPLÈTE le fix
correctness de la session 070054 (aeb30b8). Ce fix-là a percent-encodé
hero['fichier'] dans src=f"/static/projets/{code}/{quote(fichier)}", mais dans la
MÊME url('…') CSS il restait un 2ᵉ segment dynamique — `code` — interpolé brut puis
html-échappé via _esc(src). C'est exactement l'anti-pattern identifié par 070054
(html.escape = mauvais encodeur pour un segment d'URL), appliqué de façon incomplète.

Fix : src = f"/static/projets/{quote(code)}/{quote(hero['fichier'])}" — quote() est
le SEUL encodeur correct pour un segment d'URL ; le CONTEXTE, pas la donnée courante,
dicte l'encodeur. Zéro dérive : codes réels = P01..P09 (§Projets), quote("p01")=="p01"
→ byte-repro inchangé. Cas frère exact de 060044/criteria.py (« durcir le SEUL membre
non-durci d'une famille ») : ici le SEUL segment d'URL non-encodé de la même url().

Test à dents (test_hero_media_code_segment_percent_encoded) : code théorique "P'X" →
prouvé FAIL sans quote(code), PASS avec. Suite publiciste 25→26, matrice 630/613→631/614.

Défaut d'abord : classe encodage-contextuel balayée sur tous les modules HTML/CSS/URL ;
2 candidats Explore réfutés non-défauts (chat mount_html = persona forcée Amélie par
invariant 7 + portail_key enum ; code segment = théorique mais durci par uniformité).
Cascade régénérée dans l'ordre (quality_report en DERNIER) · 3 fiches compteurs réalignées.
run_ci 33/0/0 · NFC-clean · zéro code moteur V18 (bloqué D-06 #6) · zéro gate (#5) · zéro invention (#6).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 07:41:05 +00:00
Claude Code DTP Worker aeb30b8311 [DTP-Worker 20260812_070054] fix correctness · rendu HTML publiciste — URL de rendu percent-encodée dans le url('…') CSS
Bug latent réel (rendu-correctness, entrée FR/ES plausible) : _hero_media
(generator.py:92) injectait le nom de fichier via html.escape dans un
background-image:url('…'). Un rendu réel « Vue d'ensemble.png » devenait
Vue d&#x27;ensemble.png → le navigateur HTML-décode l'attribut style AVANT le
CSS → l'apostrophe referme la chaîne url('…') → hero non affiché, silencieux.
html.escape est le mauvais encodeur pour un contexte CSS.

Fix : urllib.parse.quote sur le segment de fichier ('→%27, espace→%20,
accents→%XX) — valide dans URL + attribut HTML + url() CSS ; _esc conservé pour
l'attribut HTML. Zéro dérive : quote laisse les noms ASCII simples inchangés
(hero_aerien.jpg identique) → fixture + byte-repro intacts.

Test de régression à dents (test_hero_media_url_percent_encode) : prouvé FAIL
sans quote, PASS avec. Cascade régénérée (artifact-reproducibility-gate) :
suite publiciste 24→25, matrice 629/612→630/613/17 · quality_report régénéré
en DERNIER · 3 fiches AGENT.md (compteurs dérivés) réalignées.

Défaut d'abord : 12 fichiers cœur / 7 modules ré-audités CLEAN (epsilon 1e-9
gate apport = tolérance flottante correcte). run_ci 33/0/0 · NFC-clean ·
zéro code moteur V18 (bloqué D-06 #6) · zéro gate ajouté (#5) · zéro invention (#6).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 07:15:47 +00:00
Claude Code DTP Worker 3a40aee42d [DTP-Worker 20260812_063050] canal stakeholder · complétion daily report 2026-08-12 au HEAD du jour (ee88d36→37c68ac) · 3 jalons worker du même jour manquaient au snapshot (a17d86a déterminisme ordre-suites · 1513e69 vérif i18n SEO non-défaut · 37c68ac hardening criteria.py) — tous vérif/hardening à artefacts byte-identiques → matrice STABLE 629/612/17 · chiffres re-dérivés des artefacts commités (jamais figés #6) · défaut d'abord : fiscal ncf.py + builder.py audités CLEAN (compose e-NCF sans invention, config a_confirmer null par design) · rapport NFC-clean · run_ci 33/0/0 · zéro code moteur V18 (bloqué D-06) · zéro gate ajouté (#5) 2026-08-12 06:35:56 +00:00
Claude Code DTP Worker 37c68aca28 [DTP-Worker 20260812_060044] hardening correctness · criteria.py — 3ᵉ détecteur regex durci (le SEUL non durci de la famille « détecter la forme, pas une graphie »)
_ADD_PARSER_RE exigeait la parenthèse collée (add_parser\(|add_subparsers\() → `add_subparsers ()` / `add_parser ("build")` (espace avant `(`, Python valide, PEP 8 déconseille sans imposer) silencieusement loupés → sous-scorage −20 pts du critère CLI d'un module sain (symptôme fd99362). Durci en add_parser\s*\(|add_subparsers\s*\(, harmonisé aux 2 frères déjà durcis (_TEST_DEF_RE `def\s+`, _MAIN_GUARD_RE `\s*==\s*`) et à la doctrine écrite du fichier (l.18-30 « détecter la forme, pas une graphie »). 4e fix de cette classe dans ce fichier après ac595d0/fd99362/35de616.

Fix latent (aucun module n'utilise l'espace → quality_report.json byte-identique, check_artifacts vert) mais teeth-prouvé (ancien regex False sur les 2 formes espacées, nouveau True + True sur les formes normales). Cores computationnels commissions/bancable audités CLEAN par ailleurs. run_ci 33 PASS 0 FAIL 0 SKIP · 0 gate (#5) · 0 chiffre inventé (#6) · 0 VPS (#8).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 06:05:35 +00:00
Claude Code DTP Worker 1513e69a79 [DTP-Worker 20260812_053034] vérif i18n · asymétrie cardinalité SEO fr=87·en=87·es=84 PROUVÉE NON-DÉFAUT · note by-design au dedup (anti re-flag, sans gate)
Angle frais jamais balayé (cohérence tri-lingue FR/EN/ES du module seo/). Un
Explore a remonté « es manque 3 mots-clés projet P01 » ; refusé au mot (#6,
verify-non-defects) et prouvé au byte-level un NON-DÉFAUT : l'artefact étant
byte-repro-gaté, l'écart reflète la LOGIQUE du générateur.

Preuve (repro du générateur sans dedup) : génération symétrique par langue →
raw 115/langue identique. L'écart vient du seul dedup (lang,term). country[es]
= « Republica Dominicana » == la localisation générique de 5 projets
(P01/02/03/06/09) → le mot-clé global {type} Republica Dominicana absorbe le
mot-clé projet identique de P01 (dedup correct, terme présent 1× en scope
global). En fr/en country != localisation → pas de collision, P01 garde ses 7
termes. D'où +3 collisions en es → 87 vs 84. Rien n'est perdu ; invariants
(≥ min_keywords_per_lang + unicité (term,lang)) tiennent ; es=84 déjà documenté
et gaté README.md:15 (check_readme_claims). Sortie CORRECTE.

Livrable = note explicative au point de dedup keywords.py:106 (asymétrie subtile
non-évidente qu'un futur balayage refera l'enquête). Aucune logique/fixture/claim
-gaté touché (gates byte visent out/*.json, pas la source). Style aligné ASCII +
em-dash existant, NFC-clean.

run_ci = 33 PASS/0/0 (inchangé). 0 code moteur V18 (#6), 0 logique modifiée,
0 artefact/fixture touché (#6), 0 gate ajouté (#5), 0 VPS (#8), 0 API externe.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 05:40:22 +00:00
Claude Code DTP Worker a17d86a767 [DTP-Worker 20260812_050034] vérif · nouvel axe déterminisme « ordre d'exécution des 24 suites » (CLEAN, replayable, sans gate)
Chasse au défaut d'abord (2 axes) → tree propre : le seul candidat Explore
(mobile/AGENT.md:81 « upgrade 54 abandonné » vs mobile_spec.json expo_sdk_major:54)
RÉFUTÉ — la ligne distingue runtime ACTUEL (Expo 51) de cible rebuild (Expo 54 S5),
le 54 du spec = « rebuild cible Expo 54 (S5) » (mobile-runtime-actual-vs-rebuild-target).
Drift numérique README déjà gaté (check_readme_claims vert).

Vrai locus = 4e axe de déterminisme jamais balayé : l'ORDRE d'exécution des suites
(frères hash-seed / locale-tz / forward-compat n'en varient aucun). Monkeypatch
discover_suites→reversed + re-run run_matrix, diff vs regression_run.json commité :
totaux byte-identiques (629/612/17) + 24/24 suites tuples identiques. Fermé PAR
CONSTRUCTION (runner.run_suite = subprocess+cwd isolé, agrégation = somme indép.
de l'ordre) → confirmation teeth, pas découverte.

Replayable, occurrence-zéro, isolation subprocess = contrat existant → PAS un gate (#5).
0 chiffre inventé (#6, lus de l'artefact). 0 code moteur V18 (bloqué #6). 0 module
produit touché. 0 artefact modifié. 0 commande VPS (#8). Fichiers : ce journal.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 05:06:31 +00:00
Claude Code DTP Worker 2cad5b2b06 [DTP-Worker 20260812_043034] canal stakeholder · émission daily report 2026-08-12 au HEAD courant (35de616→ee88d36) · le rapport 08-11 (épinglé 35de616) citait la régression 628/611 mais 3 commits ont suivi et 39def91 (test verrou NBSP publiciste, postérieur à sa currency) l'a portée à 629/612 → chiffre stale · matrice re-dérivée 628/611→629/612/17 PASS depuis regression_run.json (totals) · audit 4Big re-sourcé PASS 24×100/100 + bijection 24↔24 · 2 jalons ajoutés (031b5e7 PNG Michel · ee88d36 cleanup out_fresh) notés sans-impact-tests · zéro chiffre figé (#6) · zéro code moteur V18 (bloqué #6) · zéro gate ajouté (#5)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 04:35:09 +00:00
Claude Code DTP Worker ee88d3698b [DTP-Worker 20260812_040034] cleanup #5 · suppression orphelin out_fresh/ (doublon d'artefacts échappant à tous les gates)
frontend/portails/out_fresh/ (workspace.json + MANIFEST.json) était tracké mais
commité par accident une seule fois (f954cc1, 2026-08-02, scratch « fresh rebuild ») :
byte-identique à out/, produit par RIEN (le générateur n'écrit que dans out/ via
_DEFAULT_OUT), référencé NULLE PART (git grep out_fresh = 0). Il échappait à
check_artifacts (find -type d -name out = match EXACT sur `out`, jamais `out_fresh`)
donc au balayage reverse-bijection → bombe de staleness silencieuse (rien ne le
régénère : dès que la source bouge, out/ se met à jour et out_fresh/ diverge en copie
stale non-possédée). Suppression (out/ intacte, régénère byte-identique). Occurrence
isolée → pas de gate (#5). Candidat is_filled() écarté au byte-level (non-défaut, #6).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 04:07:49 +00:00