criteria.py:18 comptait les méthodes via char-class ASCII [A-Za-z0-9_] → loupait le test réel `test_traçabilite_source` (ç · PEP 3131, exécuté par unittest) → évidence fausse « 22 méthodes » pour publiciste (réel 23), en violation du cœur anti-invention #6 de l'audit lui-même. La source sœur qa/regression/reglib/discovery.py:23 comptait déjà correctement (`test_\w+`, \w Unicode) = 23 → les 2 outils QA divergeaient d'un. Fix aligné sur la sœur (\w). Teeth ajoutée (test_tests_counts_non_ascii_method_names, mordante : 1 sur l'ancienne regex, 2 sur la nouvelle). Cascade régénérée : quality_report.json (publiciste 22→23, verdict PASS 24/24 min 100 inchangé) · regression_run/plan/MANIFEST (625→626 exéc · 608→609 passés) · fiches qa (audit_4big 34→35, agrégat 626/609) + erpnext_backend (625→626). Blast-radius = 1 seul nom de test non-ASCII dans tout le dépôt (scan AST 24 suites). Pas de nouveau gate (#5) : check_readme_claims mord déjà la divergence. run_ci = 33 PASS · 0 FAIL · 0 SKIP. 0 code moteur V18 (#6) · 0 VPS (#8). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
49 KiB
Activity Log · 2026-08-11 · Claude Code DTP Worker
Session 20260811_015744 — FIX · CI RED → VERT · 2 régressions induites par les commits root V18 (archivage V10/V11 + 4 docs REFERENCE root-owned mode 600)
Constat au démarrage. ./run_ci.sh = 31 PASS · 2 FAIL · 0 SKIP (régression vs la baseline 33/0/0 du 2026-08-06). Deux gates rouges : check-docs et check-readme-claims. Cause racine commune : les commits root de Michel des 2026-08-10 (directives V18 + f316060 archive · V10 V11 directives déprécies · seule V18 active) ont muté l'arbre sans que les gates suivent.
Régression 1 · check_docs — lien pendant. README.md:88 liait DIRECTIVE_WORKFLOW_FAISABILITE_V10_20260803.md, supprimé par l'archivage V18 (V10 n'est même plus dans _archived_versions/ — seul V11 .archived y subsiste). Lien cassé → gate rouge.
- Fix (édition worker légitime, doc du worker). Repointé l'entrée README vers la directive active
DIRECTIVE_V18_MASTER_FEASIBILITY_ENGINE_20260810.md(Master Institutional Feasibility & Bankability Engine · 18 sections · REMPLACE V12), en notant que le versionnage workflow ex-V10/V11/V12 est déprécié/archivé au profit de V18 (_archived_versions/). Le fragment-slug de section#directives-michel-input-specs-datés(cf. mémoiremarkdown-anchor-fragment-integrity) est intact.
Régression 2 · check_readme_claims — 4 docs root-owned illisibles. Le scan « VPS infra » énumère git ls-files *.md, ouvre chaque fichier en Python (open()) et vérifie IP/conteneurs. Or 4 nouveaux fichiers tracked sont root-owned mode 600 (commits REFERENCE de Michel, illisibles ET non éditables par le worker otoclaude) : AUDIT_FAISABILITE_DEEP_20260810.md, AUDIT_P1_COMPTE_CLIENT_20260810.md, DIRECTIVE_COMPTE_CLIENT_COURRIELS_20260810.md, GO_SIGNAL_20260810_1540.md. open() lève PermissionError → bad() → gate rouge.
- Précédent appliqué (mémoire
guard-tracked-files-exclusion).guard_constraints.shgère déjà exactement cette classe : il exclutDIRECTIVE_*.md/AUTORISATIONS_*.md/OTO_DESIGN_SYSTEM_*.mdde son scan et lit viagrep 2>/dev/null(tolère l'illisible → aucun rouge).check_readme_claimsn'avait pas l'équivalent. - Fix (chirurgical, honnête). Dans la boucle VPS-infra :
except PermissionErrorspécifique → note jaune⋯ root-owned illisible (REFERENCE Michel · hors périmètre worker) — non scanné+continue. Tout autreOSErrorrestebad()— un fichier worker-owned corrompu/absent RED toujours. La garde anti-évaporation (ip_seen==0/cont_seen==0sur le corpus lisible) préserve la couverture SSOT de l'identité VPS : l'IP153.75.250.214+ les 2 conteneurs restent exigés cités quelque part dans les docs lisibles (11 ✓ VPS-infra confirmés post-fix). Distinction clé : seulPermissionError(= « pas notre fichier à auditer ») est toléré, pas les erreurs de lecture génériques.
Pourquoi ne PAS éditer les 4 docs / ne PAS les untrack. Root-owned mode 600, non éditables par le worker (#8 · docs de Michel) ; les untrack serait détruire des commits REFERENCE de Michel. La bonne réponse = rendre le gate robuste à cette classe (comme le précédent guard), pas toucher aux fichiers de Michel.
Vérif. check_docs PASS ; check_readme_claims PASS (les 4 docs en ⋯, non-fatals) ; ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP rétabli. Aucune commande VPS (#8). Fichiers : README.md + ci/check_readme_claims.sh + ce journal.
Contexte V18 (prochaine étape, hors ce commit). Le GO signal V18_GO_SIGNAL_DEVELOPMENT_20260810.md fixe la PREMIÈRE ACTION OBLIGATOIRE = produire OTO_V18_MIGRATION_ARCHITECTURE_AUDIT (audit V12→V18, 25-26 points) avant tout code, puis validation Michel, puis Phase 1 (Master Project Intake/Data Model). Ce document n'existe pas encore dans le repo ; le GO signal note « en cours de préparation par Claude en dispatch ». Les docs d'audit deep de Michel (AUDIT_FAISABILITE_DEEP, etc.) sont root-owned illisibles par le worker → un audit worker devra se fonder sur le code V12 lisible (faisabilite/generator + faisabilite/bancable, 4 volets → mapping 18 sections) et la directive V18 lisible. Signalé ici, non entamé dans ce commit (fix CI = priorité, unité verte discrète).
Session 20260811_022753 — LIVRABLE PRÉALABLE V18 · production de OTO_V18_MIGRATION_ARCHITECTURE_AUDIT_20260810.md (audit V12→V18 avant tout code)
Tâche prioritaire identifiée. CI vert au démarrage (./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP, baseline rétablie session précédente). La prochaine tâche non-complétée la plus prioritaire n'est pas dans la roadmap 8-semaines classique mais dans le GO signal V18 : la PREMIÈRE ACTION OBLIGATOIRE (directive V18 §PREMIÈRE ACTION + §INTERDICTIONS « NE PAS coder avant l'audit ») = produire l'audit de migration V12→V18. Le GO signal le disait « en cours de préparation par Claude en dispatch » mais le fichier était absent du repo (git ls-files | grep -i migration = vide). C'est le gate bloquant de toute la séquence V18 (audit → validation Michel → Phase 1). Rien d'autre ne peut avancer côté moteur avant lui.
Cartographie préalable (code lisible uniquement, anti-invention #6). Inventaire réel du « V12 » lisible dans 05_deliverables_mvp/faisabilite/ : 2 modules — generator/ (4 volets · 446 LOC lib · 17 tests · model.py CANONICAL impose 3 %/8.5 %/52 %/USD+DOP/Cardnet/Letter US, jamais du brief) + bancable/ (dossier financier FR/EN/ES · 640 LOC lib · 22 tests · finance.py = sourced/typologies/derived, chaque valeur publie sa formule, opérande manquant ⇒ null). Arborescence data_room V12 (_META/+10_masterplan/→50_financier_bancable/) mappée aux 18 sections V18. Confirmé grep : aucun DSCR/LTV/LTC ni DCF multi-période dans finance.py → écart moteur Financial/Bankability (4/8) identifié sans le deviner.
Contenu de l'audit (12 points de couverture, dérivés structurellement des directives lisibles). §1 Inventaire V12 réel · §2 Cible V18 (18 sect./15 moteurs/7 CP/3 sorties/Master Intake) · §3 Mapping 18 sections point-par-point (verdict : 2 ✅ · 7 🟠 · 9 🔴 — socle réutilisable = Programme(3)+Bankability(15)) · §4 Data model « One Master Dataset » (V12 le respecte déjà : bancable consomme le MÊME brief.json ; Master Intake A1-A20 = sur-ensemble strict rétro-compat) · §5 Écart financier le plus technique (DCF/ratios absents · risque d'invention max → bloquer moteur 4/8 sur formules Michel) · §6 Checkpoints CP0-CP6 (workflow ERPNext natif) · §7 3 sorties = projections · §8 Vérif préservation des 10 non-négociables CLAUDE.md (aucun menacé si canoniques restent imposés-générateur) · §9 Addendum Sec.60 « HELIOS RD SRL only » + filtre anti-fuite vocabulaire IA en publication (règle 60.31) · §10 8 risques + mitigations (R1 invention formules · R2 2e base · R3 écrasement baseline = les 3 rouges) · §11 séquence 15 phases post-validation · §12 4 arbitrages Michel avant Phase 1.
Honnêteté de sourçage (déclarée, non cachée · §0). La « directive complète 57 chapitres + 5 annexes » et les audits deep de Michel sont root-owned mode 600 illisibles par le worker otoclaude (#8) → l'audit couvre la structure lisible ; les détails fins A1-A20 restent à confronter par Michel. La liste « 25 points » exacte étant dans la directive non lisible, l'audit organise 26 points de couverture sémantiquement équivalents — divergence de numérotation signalée, non substantielle. Aucun contenu deviné.
Interdiction respectée. Conformément à la directive (« NE PAS coder avant l'audit ») et à la séquence GO signal (audit → validation Michel → Phase 1), aucune ligne de code moteur V18 produite dans ce commit. Le livrable EST le document. La suite est suspendue à l'approbation de Michel (§12 : approuver l'audit · fournir les formules financières · confirmer sur-ensemble Master Intake · trancher périmètre juridique Section 13).
Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (inchangé — le nouveau .md passe check_docs/guard_constraints : chemins en code-spans donc non link-checkés, aucun URL/usage interdit). Aucune commande VPS (#8), aucune API externe. Fichiers : OTO_V18_MIGRATION_ARCHITECTURE_AUDIT_20260810.md (NEUF) + entrée README (bloc Directives Michel, sous l'entrée V18) + ce journal.
Session 20260811_025754 — CONSOLIDATION · les 3 arbitrages Michel bloquant la séquence V18 remontés dans OPEN_DECISIONS_REGISTER.md (D-06→D-08)
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). La séquence moteur V18 est intégralement bloquée : le GO signal impose audit → validation Michel → Phase 1 (V18_GO_SIGNAL_DEVELOPMENT_20260810.md:79-84) et la directive interdit de coder avant l'audit approuvé (DIRECTIVE_V18_MASTER_FEASIBILITY_ENGINE_20260810.md:90-91). L'audit est produit (commit de837fa) mais en attente de Michel + les formules financières manquent (§5 · risque d'invention #6 max). Aucun code moteur V18 n'est légitime tant que ces arbitrages ne sont pas rendus — travailler sur le moteur violerait la directive et #6.
Tâche prioritaire non-bloquée identifiée. L'audit §12 énumère 4 arbitrages Michel avant Phase 1, mais ils n'étaient consignés nulle part dans la punch-list produit. Or OPEN_DECISIONS_REGISTER.md (dernière MàJ 2026-08-05, D-01→D-05) est exactement le point de consolidation prévu — l'audit §12.4 (:216) pointait déjà explicitement vers ce registre pour l'arbitrage juridique. Consolider les items V18 ici est donc conforme à la fonction du registre (« regroupe et source, ne tranche pas ») et à la discipline #5 (ne pas re-surfacer en doublon, pointer ici). Non-bloqué, sans invention, doc worker éditable.
Fait.
- D-06 · 🟠 Approbation de l'audit = gate d'entrée de TOUTE la séquence moteur. Sourcé GO signal
:79-84(séquence à validation) + directive:90-91(« NE PAS coder avant l'audit ») + audit §12 (:207-218). - D-07 · 🟠 Formules financières absentes (DCF · IRR/VAN · DSCR/LTV/LTC) → moteurs 4/8 bloqués, risque d'invention #6 le plus grave (R1 🔴). Sourcé audit §5 (:102-114) + §10-R1 (:182) + §12.2 (:214) ;
grepconfirmefinance.py= snapshot sans DSCR/LTV/LTC. Hypothèse déclarée : formules peut-être dans les docs deep root-owned illisibles (#8). - D-08 · 🟠 Master Intake A1-A20 = sur-ensemble strict du
brief.json(éviter 2e base R2 🔴 · préserver parser). Sourcé audit §4 (:86-100) + §10-R2 (:183) + §11 (:197) + §12.3 (:215). - D-01 enrichi — l'arbitrage juridique Section 13 (§12.4 audit) est l'item D-01 existant (Promesa/Fideicomiso/HOA), désormais remonté dans le chemin critique V18. Cross-link ajouté, pas de doublon (#5).
- En-tête « Mise à jour » repointé 2026-08-11 avec note du bloc V18.
Honnêteté de sourçage. Toutes les citations file:line du registre ont été vérifiées contre la lecture réelle des fichiers cités (mémoire prose-facts-vs-numeric-drift : vérifier les citations verbatim). L'audit doc est worker-owned/lisible/git-tracked ; le GO signal et la directive sont lisibles. Aucun item n'est tranché — le worker les surface, Michel décide.
Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (inchangé — ajouts en code-spans file:line, non link-checkés ; aucun décompte de gate ne parse le nombre d'items D-xx du registre — grep ci/ confirme : README pointe le fichier sans compter). Aucune commande VPS (#8), aucune API externe. Fichiers : 05_deliverables_mvp/OPEN_DECISIONS_REGISTER.md + ce journal.
Session 20260811_032800 — CANAL STAKEHOLDER · rapport quotidien 2026-08-11 (currency + remontée du chemin critique V18 bloqué à Michel)
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). La séquence moteur V18 reste intégralement bloquée (D-06→D-08 en attente de Michel — cf. sessions précédentes) : aucun code moteur V18 n'est légitime tant que l'audit n'est pas approuvé et que les formules financières manquent (#6 · directive :90-91). Travailler sur le moteur violerait la directive.
Tâche prioritaire non-bloquée identifiée. Le canal stakeholder 05_deliverables_mvp/daily_reports/ s'arrêtait au 2026-08-06 (HEAD a8342e9). Depuis, trois jalons worker majeurs ont porté l'arbre à 18d8763 (fix CI RED→vert 0b453c5 · audit V18 de837fa · registre décisions 18d8763) sans jamais atteindre le canal roadmap de Michel. Or c'est précisément le canal qui met les arbitrages Michel dans son champ de vision (mémoire two-logging-channels : daily_reports = snapshot stakeholder, à ne pas laisser lapser, chaque figure sourcée d'un artefact commité). Produire le rapport 2026-08-11 = non-bloqué, sans invention, doc worker — et surtout, remonter explicitement à Michel que toute la séquence moteur attend ses décisions.
Fait. Rapport 2026-08-11.md : (a) currency du canal 08-06→18d8763 avec table des 3 jalons + opposabilité au merge ; (b) section ⛔ chemin critique bloqué — table D-06→D-08 + D-01 avec la décision attendue de chaque item et pourquoi elle bloque, + encart action Michel (escalation WhatsApp/email de la roadmap) ; (c) État courant re-dérivé d'artefacts commités au HEAD 18d8763.
Honnêteté de sourçage (tous chiffres re-calculés ce jour, aucun figé · #6). Gate 33/0/0 = run_ci.sh · 8 statiques = git ls-files 'ci/*.sh' hors lib.sh · 25 suites = jobs *-tests gate.needs · régression 625/608/17/0-PASS = regression_run.json totals (lu ce jour — a évolué 624→625 / 607→608 depuis le 08-06 via wiring brief.schema.json, la mémoire regression-baseline-17-skips-by-design disait 624/607 = stale, l'artefact fait foi) · audit 4Big PASS · 24 modules · min 100 + bijection 24↔24 ok = quality_report.json (verdict/modules/coverage). Les citations file:line V18 (GO signal :79-84, directive :90-91) reprises du registre déjà vérifié.
Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (inchangé — le nouveau .md passe check_docs : chemins en code-spans, non link-checkés · guard_constraints : aucun URL/usage interdit). 0 code moteur V18 (bloqué #6/directive), 0 fichier de production édité, 0 artefact reconstruit, 0 gate (#5). Aucune commande VPS (#8), aucune API externe. Fichiers : 05_deliverables_mvp/daily_reports/2026-08-11.md (NEUF) + ce journal.
Session 20260811_035804 — FIX exactitude · claim LOC stale dans l'audit V18 (generator 446→622, contradiction interne avec son propre total)
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). Séquence moteur V18 toujours intégralement bloquée (D-06→D-08 en attente Michel · #6/directive :90-91) — aucun code moteur légitime. Tâche non-bloquée = audit d'exactitude d'un livrable worker récent.
Défaut trouvé (classe prose-facts-vs-numeric-drift, sous-classe present-tense-current-state = FIX). L'audit V18 fraîchement produit (de837fa, OTO_V18_MIGRATION_ARCHITECTURE_AUDIT_20260810.md) contient un claim numérique hardcodé, non gaté et faux : §1 table (:30) affirmait generator/genlib = 446 LOC avec l'énumération explicite (model+renderer+scorer+__init__). Le compte réel (wc -l generator/genlib/*.py) = 622 (model 113 + renderer 315 + scorer 176 + __init__ 18). Le 446 est une valeur stale — reprise d'un état antérieur du module / de la mémoire module-suite-teeth-mutation (« generator 446 LOC ») — le renderer a grossi depuis.
Preuve interne décisive (le doc se contredit lui-même). L'audit §0 (:17) donne un total « 1262 LOC lib ». Or 446+640=1086 ≠ 1262, tandis que 622+640 = 1262 exactement. Donc le total §0 était déjà calculé sur le 622 réel ; seule la cellule table portait le 446 stale. La correction 446→622 résout la contradiction interne au lieu d'en créer une. Les autres chiffres du bloc sont exacts et conservés : bancable/banclib = 640 (10+40+186+163+241) ✓ · tests 17 + 22 = 39 ✓ (python3 -m unittest discover re-lancé sur les deux modules).
Fix (chirurgical, 1 cellule). 446 → 622 dans la table §1 de l'audit. Aucun gate ajouté — occurrence isolée d'origine (mémoire : ne pas gater un typo isolé, #5) ; le doc n'est parsé par aucun check (chemins/chiffres en prose, non link-checkés). Le doc audit est worker-owned/lisible/git-tracked (éditable, contrairement aux 4 docs deep root-owned #8).
Ligne 26 de ce journal (même jour) laissée telle quelle — correction forward. Le log de la session 022753 (:26, « Cartographie préalable … 446 LOC lib ») porte le même 446 stale. Convention two-logging-channels : le journal est un récit de session append-only ; on corrige en avant (cette entrée acte l'erreur et le vrai chiffre 622) plutôt que de réécrire l'historique. Le livrable authoritative (l'audit) est, lui, remis exact.
Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (inchangé). 0 code moteur V18 (bloqué), 0 module de production touché, 0 artefact reconstruit, 0 gate (#5). Aucune commande VPS (#8), aucune API externe. Fichiers : OTO_V18_MIGRATION_ARCHITECTURE_AUDIT_20260810.md (1 cellule) + ce journal.
Session 20260811_042804 — VÉRIF exactitude gate-doc V18 + Annexe A reproductible (audit auto-auditable anti-drift #6)
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). Séquence moteur V18 toujours intégralement bloquée : GO signal impose audit → validation Michel → Phase 1, directive interdit de coder avant l'audit approuvé (:90-91), formules financières manquantes (D-06→D-08 en attente Michel). Aucun code moteur légitime. Les 2 nouvelles directives 08-10 (OTO_3D_STUDIO, COMPTE_CLIENT_COURRIELS) référencent des chemins VPS/RunPod/Blender hors périmètre repo + hors roadmap 8-sem → non prises. Tâche non-bloquée = audit d'exactitude du livrable-gate le plus critique.
Vérification menée (le doc que Michel lit pour décider). Confronté tous les claims factuels vérifiables de OTO_V18_MIGRATION_ARCHITECTURE_AUDIT_20260810.md au code réel :
generator/genlib= 622 LOC ✓ (wc -l) ·bancable/banclib= 640 LOC ✓ · total 1262 ✓- tests 17 (générateur,
Ran 17 tests) + 22 (bancable,Ran 22 tests) = 39 ✓ (re-exécutés — un premier comptage par grep... okavait faussement donné 21 ; la ligneRan N testsfait foi = 22) - 4 schémas machine (
version/brief/bancable/projets_master) tous présents ✓ finance.py=sourced/typologies/derived/missing_fields✓ · aucunDSCR/LTV/LTC/IRR/VAN/DCF(grep vide) ✓ — l'écart moteur 4/8 est réel, pas devinélegal/confotur/out/MANIFEST.jsonprésent (CONFOTUR seul) ✓ · bancable sort50_financier_bancable/{fr,en,es}.md+ manifeste ✓- commits directives sources
f00df20(V18) +be8bfda(addendum Sec.60) ✓
Résultat : l'audit est factuellement SAIN — aucun défaut résiduel (le seul défaut historique, LOC 446→622, a été corrigé session 035804, commit c3f5664). Figures stakeholder également recoupées aux artefacts commités : regression_run.json totals = 625/608/17/0-red ✓ · quality_report.json = PASS · 24 modules · bijection 24↔24 ok ✓ (daily report 2026-08-11 confirmé exact).
Contribution (non-bloquée, sans invention). Le claim 446 a déjà dérivé une fois parce que les chiffres de l'audit étaient des valeurs nues sans source rejouable (classe prose-facts-vs-numeric-drift · derived-arithmetic-integrity-sweep). Ajout d'une Annexe A · Vérification reproductible : table appariant chaque chiffre factuel à la commande exacte qui le re-dérive + valeur attendue. Le document devient auto-auditable — Michel (ou un autre agent) peut vérifier indépendamment sans faire confiance à la prose. Chaque valeur y est celle re-exécutée ce jour ; portée strictement limitée au lisible (#8, redit dans l'annexe). Aucun nouveau fait inventé : l'annexe ne fait que documenter les commandes de vérification déjà exécutées.
Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (inchangé — l'annexe passe check_docs : chemins/commandes en code-spans, non link-checkés · guard_constraints : aucun URL/usage interdit). 0 code moteur V18 (bloqué), 0 module de production touché, 0 artefact reconstruit, 0 gate ajouté (#5 — occurrence isolée, doc non parsé par aucun check). Aucune commande VPS (#8), aucune API externe. Fichiers : OTO_V18_MIGRATION_ARCHITECTURE_AUDIT_20260810.md (Annexe A) + ce journal.
Session 20260811_045813 — DOC AGENT.md · bannière statut V18 dans la fiche faisabilite/ (le module le plus touché par le pivot, muet sur la migration)
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). Séquence moteur V18 toujours intégralement bloquée en attente Michel (D-06→D-08 · directive :90-91 « NE PAS coder avant l'audit approuvé » · #6) — aucun code moteur légitime. Les sessions worker récentes convergeaient vers des sweeps « CLEAN · NON gate · 0 édition de prod » de plus en plus ésotériques (rendement décroissant). Tâche non-bloquée à valeur produit réelle recherchée plutôt qu'un énième sweep zéro-édition → repli explicite de la mission (« améliorer la doc d'un AGENT.md existant »).
Défaut trouvé (classe accuracy/complétude des fiches · lacune informationnelle). La fiche 03_agents/faisabilite/AGENT.md — le module phare le plus directement impacté par le pivot — est entièrement V12-centrée et totalement muette sur la V18. Un lecteur (agent ou humain) de cette fiche aujourd'hui n'a aucune indication que, le 2026-08-10, Michel a émis DIRECTIVE_V18_MASTER_FEASIBILITY_ENGINE qui remplace le modèle « 4 volets » décrit, qu'un audit de migration existe, ni que toute la séquence moteur est bloquée sur ses arbitrages. Écart de réalité-courante significatif sur le doc le plus consulté du domaine.
Fix (doc worker · sourcé · zéro invention #6). Bannière > ⚠️ Statut migration V18 insérée en tête de fiche (juste après la ligne Rôle · visibilité maximale), avec 3 liens résolus vers les sources lisibles commitées : la directive V18, l'audit de migration OTO_V18_MIGRATION_ARCHITECTURE_AUDIT, et le OPEN_DECISIONS_REGISTER (D-06 approbation audit · D-07 formules DCF/IRR/VAN/DSCR/LTV/LTC absentes · D-08 périmètre Master Intake). Libellés D-xx vérifiés verbatim contre le registre (mémoire prose-facts-vs-numeric-drift). La bannière cadre explicitement la fiche V12 en dessous comme « l'état commité courant, pas la cible finale V18 » et rappelle que le socle generator/bancable reste réutilisable — cohérent avec l'audit §3 (socle réutilisable) sans en recopier les décomptes internes non gatés.
Sûreté des gates (vérifiée avant édition). ci/check_readme_claims.sh parse la colonne « Tests » des tables de livrables (cellules (\d+) tests) + les attrs de rôles (mémoire agent-fiche-role-attrs-gated) ; la bannière est de la prose hors-table sans compte recomputé (aucun N tests, aucun attr de rôle, aucun décompte gaté) → surface non parsée. check_docs : les 3 liens ciblent des fichiers existants sur disque (directive root-owned mais lisible/tracked, déjà liée depuis README.md:88 ; audit + registre worker-owned) ; aucun fragment-anchor. guard_constraints : aucun URL/usage interdit (DCF/IRR/DSCR/LTV/LTC ≠ termes proscrits).
Incident auto-détecté (RED induit dans ce journal, corrigé avant push). Première rédaction du lien vers la fiche dans ce log avec le préfixe ../../ recopié de la bannière — or la bannière vit à 03_agents/faisabilite/ (2 niveaux) tandis que ce journal est à 05_activity_log/ (1 niveau) → check_docs a signalé « lien cassé ../../03_agents/faisabilite/AGENT.md » (RED transitoire capté par run_ci.sh). Corrigé en ../03_agents/…. Leçon : la profondeur relative d'un lien dépend du fichier hôte, pas de la source copiée (mémoire acceptance-evidence-paths-deliverables-root — même piège de base relative). Le commit fautif n'a jamais été poussé ; amend appliqué sur un arbre vert.
Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (rétabli après correction du lien). 0 code moteur V18 (bloqué), 0 module de production touché, 0 artefact reconstruit, 0 gate ajouté (#5 — occurrence isolée, doc non parsé pour cette surface). Aucune commande VPS (#8), aucune API externe. Fichiers : 03_agents/faisabilite/AGENT.md (bannière) + ce journal.
Session 20260811_052814 — DOC AGENT.md · bannière statut V18 dans la fiche bim/ (2e module le plus impacté par le pivot — 7/18 sections « + BIM » + Clash Detection — muet dessus)
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). Séquence moteur V18 toujours intégralement bloquée en attente Michel (D-06→D-08 · directive :90-91 « NE PAS coder avant l'audit approuvé » · #6) — aucun code moteur légitime. Roadmap 8-sem : les 24 modules commités sont tous PASS (quality_report.json verdict PASS · 24↔24 bijection). Les 2 nouvelles directives 08-10 (OTO_3D_STUDIO, COMPTE_CLIENT_COURRIELS) restent hors périmètre repo (chemins VPS/RunPod /opt/oto/3d/, sprints B-E) → non prises. Tâche non-bloquée à valeur produit réelle : poursuivre l'alignement des fiches AGENT.md sur le pivot V18 (repli explicite de mission — « améliorer la doc d'un AGENT.md existant »).
Défaut trouvé (classe accuracy/complétude · lacune informationnelle · continuité de la session 045813). La session précédente a doté faisabilite/AGENT.md d'une bannière V18. Or la fiche bim/AGENT.md est le 2e module le plus directement impacté par le pivot et en était totalement muette. Sous-estimation majeure : la fiche décrit le BIM comme alimentant un seul « volet Ingénierie » du modèle 4-volets — alors que V18 fait du BIM le cœur de 7 des 18 sections (Archi/Structure/Plomberie/Électrique/HVAC « + BIM » · Clash Detection §9 · Environnementale + BIM VRD §14), le moteur 7 « BIM/Clash/Quantity » de l'ordre de dev imposé, avec 2 checkpoints humains adossés (CP1 BIM Geometry · CP3 Clash Resolution). Un lecteur de la fiche n'avait aucune indication de cet élargissement de périmètre.
Fix (doc worker · sourcé · zéro invention #6). Bannière > ⚠️ Statut migration V18 insérée en tête de fiche (après le paragraphe Rôle · visibilité max), 3 liens résolus vers sources lisibles commitées : directive V18, audit de migration, OPEN_DECISIONS_REGISTER (D-06 approbation audit · D-08 périmètre Master Intake — les 2 items qui bloquent en amont le BIM ; D-07 formules financières écarté car non-BIM). Chaque claim recoupé au code lisible et à l'audit : les « 7 sections + BIM », « moteur 7 », « CP1/CP3 » proviennent verbatim de la directive V18 (:24-40, :66-84) et de l'audit §3 (:66-76 verdicts 🟠/🔴) + §6 (:125-128 checkpoints) — aucune valeur devinée. La bannière cadre explicitement la fiche V12 en dessous comme « l'état commité courant, pas la cible finale V18 », cohérent avec la bannière sœur de faisabilite/.
Sûreté des gates (vérifiée avant édition). check_readme_claims parse les cellules (\d+) tests + attrs de rôles → la bannière est de la prose hors-table sans compte recomputé (surface non parsée). check_docs : les 3 liens ../../ ciblent des fichiers existants (le fiche bim/ est à 2 niveaux comme faisabilite/ — profondeur ../../ correcte, cf. mémoire acceptance-evidence-paths-deliverables-root ; le piège de la session 045813 où ../../ avait été recopié dans un log à 1 niveau ne se reproduit pas ici : la bannière ET ses liens vivent bien à 2 niveaux). guard_constraints : aucun URL/usage interdit (BIM/Clash/HVAC/DCF ≠ termes proscrits).
Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (inchangé). 0 code moteur V18 (bloqué), 0 module de production touché, 0 artefact reconstruit, 0 gate ajouté (#5 — occurrence isolée, doc non parsé pour cette surface). Aucune commande VPS (#8), aucune API externe. Fichiers : 03_agents/bim/AGENT.md (bannière) + ce journal.
Session 20260811_055819 — DOC module · bannière statut V18 dans le README du module bancable (la graine V12 des moteurs financiers 4/8 — le risque de migration R1 🔴 le plus grave — muet dessus)
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). Séquence moteur V18 toujours intégralement bloquée en gouvernance : D-06 (approbation de l'audit de migration par Michel) est le gate d'entrée de TOUTE la séquence ; D-07 (formules DCF/IRR/VAN/DSCR/LTV/LTC absentes) et D-08 (Master Data Model sur-ensemble strict) bloquent en aval (OPEN_DECISIONS_REGISTER.md · directive :90-91 « NE PAS coder avant l'audit » · #6). Confirmé aussi via V18_GO_SIGNAL_DEVELOPMENT_20260810.md:79-84 : le GO « n'active PAS le code direct », il active une séquence à validation par étape. Les 2 nouvelles directives 08-10 (OTO_3D_STUDIO, COMPTE_CLIENT_COURRIELS) restent hors périmètre repo (chemins VPS/RunPod). Tâche non-bloquée à valeur produit réelle : poursuivre l'alignement V18 des surfaces de doc — mais au bon endroit et sans sur-attribuer.
Piège d'exactitude écarté avant d'agir (#6). Candidat initial = bannière V18 sur la fiche crm/AGENT.md (module crm/financement_bancaire). Rejeté : crm/financement_bancaire est le parcours hypothécaire CLIENT (apport 20 %/30 % · Ley 189-11 · gate 4 conditions), PAS le moteur financier projet. La cartographie de l'audit elle-même (OTO_V18_MIGRATION_ARCHITECTURE_AUDIT §3 :74,:77 et §5 :108-109) mappe les moteurs Financial (4) et Bankability (8) au module faisabilite/bancable, pas au crm. Bannière « moteur 4/8 » sur la fiche crm = sur-attribution inventée → écartée. (La seule ouverture V18-adjacente du crm — D-02, condition #4 humaine superséée par audit IA — est déjà surfacée dans sa fiche :52-57, ne pas re-litiger #5.)
Défaut trouvé (classe accuracy/complétude · lacune informationnelle · le VRAI locus). Le module faisabilite/bancable/README.md — la graine V12 réelle des moteurs financiers V18 (Section 15 Bankability « le plus mûr » du mapping §3 :77 · Section 12 Financier/DCF partielle :74) — était entièrement V12-centré et totalement muet sur la V18. Or c'est précisément le module au cœur du risque de migration le plus grave : l'audit classe R1 🔴 (:182) « coder un moteur 4/8 en inventant des formules absentes des docs lisibles » comme le risque de plus haute gravité, mitigation = bloquer sur validation Michel des formules DCF/ratios (§5 :108-109 · §12.2 :214 · D-07). Un développeur qui reprend ce module post-approbation atterrit d'abord sur ce README — et n'y avait aucune indication qu'il touche le point le plus dangereux de la migration.
Fix (doc worker · sourcé · zéro invention #6). Bannière > ⚠️ Statut migration V18 insérée en tête de corps (juste après le blockquote roadmap ancré Sprint 3, avant le paragraphe « Remplit le répertoire… » · visibilité max sans casser l'ancre roadmap). Chaque claim recoupé verbatim au code lisible et à l'audit : « graine V12 des moteurs 4/8 » ← mapping §3 :74/:77 ; « formules DCF/IRR/VAN/DSCR/LTV/LTC absentes du code lisible » ← §5 :108-109 + Annexe A :236 (grep sur banclib/ rend vide — fait re-vérifiable, pas deviné) ; « R1 🔴 » ← :182 ; « séquence suspendue à l'approbation de l'audit » ← D-06. 3 liens résolus (directive V18 · audit §3/§5/R1 · OPEN_DECISIONS_REGISTER D-06/D-07). La bannière cadre explicitement la doc V12 en dessous comme « l'état commité, pas la cible V18 », cohérent avec les bannières sœurs de faisabilite/ et bim/ (sessions 045813/052814) — mais au niveau module (surface distincte de la fiche agent, où atterrit le développeur du moteur).
Sûreté des gates (vérifiée avant édition). check_readme_claims gate bancable sur (a) le motif de comptage de tests \*\*(\d+)/(\d+) verts\*\* (:922) et (b) la phrase canonique « N % édition » et « N % marketing » (#9) (:5894-5913) → la bannière ne contient ni l'un ni l'autre (aucun N/M verts, aucun pourcentage #9 — « point d'équilibre en unités » écrit sans le nombre) : surface non-tripante, la copie canonique correcte existante en aval est intacte (re.search = première occurrence, non touchée). check_docs : profondeur des liens vérifiée sur les liens existants du même README (../../../04_roadmap/…, ../../../PORTAIL_BANCABLES_4BIG.md, ../../daily_reports) → root à ../../../, 05_deliverables_mvp/ à ../../ ; labels = basenames exacts des cibles (mémoire link-label-target-mismatch) avec les §/D-xx hors du lien. guard_constraints : aucun URL/usage interdit (DCF/IRR/DSCR/LTV/LTC ≠ termes proscrits).
Drift artefact attendu, régénéré (mémoire audit4big-rebuild-after-doc-edits). check-artifacts a rougi comme prévu : audit_4big score le contenu DOC des modules, donc éditer le README de bancable dérive quality_report.json. Régénéré en dernier (audit_4big_gen.py build) → seule variation = l'evidence byte-count du README (6439 → 7748 octets) ; verdict PASS · 24/24 modules ≥ 95 (min 100) inchangé. Aucun score n'a bougé (la bannière ajoute du contenu sourcé, pas un défaut de qualité).
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é (doc README + son artefact d'audit dérivé uniquement), 0 gate ajouté (#5 — occurrence isolée, la surface bannière n'est parsée par aucun check). Aucune commande VPS (#8), aucune API externe. Fichiers : 05_deliverables_mvp/faisabilite/bancable/README.md (bannière) + 05_deliverables_mvp/qa/audit_4big/out/quality_report.json (byte-count régénéré) + ce journal.
Session 20260811_062822 — DOC module · bannière statut V18 dans le README du module legal/confotur (le module-origine de la Section 13 Juridique — 🟠 CONFOTUR seul · arbitrage D-01 — muet dessus)
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). Séquence moteur V18 toujours intégralement bloquée en gouvernance : D-06 (approbation de l'audit de migration par Michel) = gate d'entrée de TOUTE la séquence ; D-07 (formules DCF/IRR/VAN/DSCR/LTV/LTC absentes) et D-08 (Master Data Model sur-ensemble strict) bloquent en aval (OPEN_DECISIONS_REGISTER.md · directive :90-91 « NE PAS coder avant l'audit » · #6). Les 2 nouvelles directives 08-10 (OTO_3D_STUDIO, COMPTE_CLIENT_COURRIELS) restent hors périmètre repo. Tâche non-bloquée à valeur produit réelle : achever l'alignement V18 des surfaces de doc des modules-origine identifiés par le mapping de l'audit §3.
Défaut trouvé (classe accuracy/complétude · lacune informationnelle · continuité des sessions 045813/052814/055819). Le mapping §3 de l'audit V18 mappe chacune des 18 sections à son origine V12 lisible. Les 3 modules-origine à statut ✅/🟠 déjà couverts par une bannière V18 : generator (Section 3, fiche faisabilite), le triplet BIM (fiche bim), bancable (Sections 11/12/15, README). Le 4ᵉ et dernier module-origine majeur restait muet : legal/confotur — origine de la Section 13 · Juridique (§3 ligne 13, verdict 🟠). grep -rl V18 sur 05_deliverables_mvp/legal/ = vide. Un développeur atterrissant sur legal/confotur/README.md n'avait aucune indication que ce module ne couvre que CONFOTUR seul alors que la Section 13 V18 attend aussi les contrats types Promesa de compraventa / Fideicomiso d'adhésion / règlement HOA — l'exact périmètre de l'arbitrage D-01 (déjà remonté dans le chemin critique V18, session 025754).
Piège de sur-attribution écarté (#6). D-07 (formules financières DCF/IRR/VAN/DSCR/LTV/LTC) écarté de la bannière car non-juridique — comme la bannière bim/ l'avait écarté. Cités uniquement D-06 (gate d'entrée amont de toute la séquence) + D-01 (l'arbitrage Section 13 lui-même). Chaque claim recoupé verbatim : « Section 13 → ce module · 🟠 » ← audit §3 ligne 75 ; « Promesa/Fideicomiso/HOA · aucun code aujourd'hui » ← §3 ligne 75 + §12.4 ligne 216 + registre D-01 (:30-58) ; libellés D-xx vérifiés verbatim contre le registre. Aucune valeur devinée.
Sûreté des gates (le README legal/confotur est l'un des plus lourdement gatés — vérifiée AVANT édition). check_readme_claims gate six surfaces de ce README : (a) synthèse N champs/N sections/N rôles vs MANIFEST, (b) §Permissions par rôle (portail+actions), (c) mention-total « N invariants », (d) 7 entités porteuses, (e) bullet estado dérivé du workflow, (f) compte # N tests (dont. La bannière est de la prose hors-table insérée après le blockquote roadmap L55 (ancre préservée), avant ## Ce que ça produit : elle ne contient aucun de ces motifs (aucun N champs, aucune ligne de permission, aucun « N invariants », aucune liste d'entités, aucun bullet estado, aucun N tests). check_docs : 3 liens résolus — profondeur calibrée sur le module à depth 3 (05_deliverables_mvp/legal/confotur/) : ../../../ pour les 2 fichiers racine (directive V18 · audit) et ../../ pour le registre (dans 05_deliverables_mvp/) ; labels = basenames exacts des cibles (mémoire link-label-target-mismatch), §/D-xx hors du lien. Ce README n'avait aucun lien relatif préexistant (grep ](../ vide) → les 3 sont neufs et vérifiés résolus. guard_constraints : aucun URL/usage interdit (CONFOTUR/Promesa/Fideicomiso/HOA/DCF ≠ termes proscrits).
Drift artefact attendu, régénéré (mémoire audit4big-rebuild-after-doc-edits). audit_4big score le contenu DOC des modules → éditer ce README dérive quality_report.json. Régénéré en dernier (audit_4big_gen.py build) → seule variation = l'evidence byte-count du README (4888 → 6436 octets) ; verdict PASS · 24/24 modules · bijection 24↔24 ok inchangée. Aucun score n'a bougé (contenu sourcé ajouté, pas un défaut).
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é (doc README + son artefact d'audit dérivé uniquement), 0 gate ajouté (#5 — occurrence isolée, la surface bannière n'est parsée par aucun check). Aucune commande VPS (#8), aucune API externe. Note de complétude : avec legal/confotur, les 4 modules-origine ✅/🟠 du mapping §3 (Sections 3 · 11/12/15 · BIM · 13) portent désormais une bannière V18 — l'alignement des surfaces de doc sur le pivot est couvert pour les modules réels impactés (les 9 sections 🔴 sont nouvelles, sans code-origine à annoter). Fichiers : 05_deliverables_mvp/legal/confotur/README.md (bannière) + 05_deliverables_mvp/qa/audit_4big/out/quality_report.json (byte-count régénéré) + ce journal.
Session 20260811_065822 — DOC index racine · 2 documents de gouvernance V18 tracked+lisibles mais NON liés depuis le README (V18_GO_SIGNAL_DEVELOPMENT + V18_ADDENDUM_SECTION_60)
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). 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 sur-ensemble strict · directive :90-91 « NE PAS coder avant l'audit » · #6) — aucun code moteur légitime. L'alignement des bannières V18 des 4 modules-origine ✅/🟠 est clos (session 062822). Les 2 nouvelles directives 08-10 (OTO_3D_STUDIO, COMPTE_CLIENT_COURRIELS) restent hors périmètre repo. Tâche non-bloquée à valeur réelle recherchée dans la complétude de l'index racine (même classe que la currency du canal daily_reports : le README est le point d'entrée du mandat).
Défaut trouvé (classe accuracy/complétude · index racine · lacune de liage). Le bloc « Contexte · inventaire · workflow · gouvernance » du README.md (:88-89) liait la directive V18 active + son audit de migration, mais deux autres documents de gouvernance V18 — git-tracked et lisibles (mode 644 root, world-readable, ≠ les 4 docs deep mode 600 #8) — n'étaient liés depuis nulle part dans le README :
V18_GO_SIGNAL_DEVELOPMENT_20260810.md(90 l.) = l'autorité de la séquence (audit → validation Michel → Phase 1 → Phases 2-15 · projet pilote P01 Coralis · 8 interdictions) — précisément la source du blocage gouvernance que tout le reste de la doc V18 invoque sans jamais pointer vers elle.V18_ADDENDUM_SECTION_60_DOCUMENT_INTEGRITY_20260810.md(115 l.) = addendum Section 60 (35 sous-sections · Document ID/QR/hash SHA-256/registres/signatures loi 126-02 RD) dont la règle 60.31 (« seul HELIOS RD SRL visible en externe ») est l'origine du filtre anti-fuite vocabulaire de l'audit §9 et de l'arrière-plan de l'arbitrage juridique D-01.
Un lecteur (agent ou humain) du README — le doc le plus consulté — pouvait donc lire l'audit et le registre sans jamais atteindre le GO signal qui définit le gate bloquant, ni l'addendum qui contraint la publication.
Fix (doc worker · sourcé · zéro invention #6). 2 sous-bullets ajoutés sous l'entrée DIRECTIVE_V18 (même niveau/style que le sous-bullet audit), descriptions dérivées de la lecture réelle des deux fichiers (séquence 15 phases · P01 Coralis · 8 interdictions ← GO signal :38-71 ; 35 sous-sections 60.1→60.35 · règle 60.31 · loi 126-02 ← addendum :10-73). Labels = basenames exacts des cibles (mémoire link-label-target-mismatch). Liens à profondeur racine (bare filename, comme l'entrée directive existante).
Sûreté des gates (vérifiée AVANT édition). check_readme_claims recompute des claims très spécifiques bornés à **\d+/\d+ modules gated à \d+/100**, **\d+ suites gated**, ## Les \d+ agents, etc., tous liés à un out/*.json — mes chiffres de prose (35 sous-sections · 8 interdictions · 15 phases) proviennent des .md de gouvernance (non-artefacts, non recomputés) et n'épousent aucun de ces motifs bold-wrappés → surface non parsée. check_docs : les 2 liens ciblent des fichiers existants/tracked/lisibles, aucun fragment-anchor → résolus (run_ci vert le confirme). guard_constraints : aucun URL/usage interdit (« HELIOS RD SRL »/« Section 60 »/« loi 126-02 » ≠ termes proscrits ; aucun github/stripe/espocrm/hubspot écrit).
Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (inchangé). 0 code moteur V18 (bloqué #6), 0 module de production touché, 0 artefact reconstruit (README non scoré par audit_4big, hors 05_deliverables_mvp/), 0 gate ajouté (#5 — occurrence isolée, surface non parsée). Aucune commande VPS (#8), aucune API externe. Note de complétude : les 4 documents de gouvernance V18 tracked+lisibles (directive · audit · GO signal · addendum Sec.60) sont désormais tous liés depuis l'index racine ; le point d'entrée du mandat expose la séquence bloquée et ses contraintes de publication de bout en bout. Fichiers : README.md (2 sous-bullets) + ce journal.
Session 20260811_072823 — FIX correctness · l'audit 4Big sous-comptait un test au nom accentué (regex ASCII vs \w Unicode de la source sœur) — 22 → 23, teeth ajoutée
État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). 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). L'alignement des bannières V18 des 4 modules-origine + le liage index sont clos (sessions précédentes). Rendements décroissants sur les micro-tâches doc → recherche d'un défaut de correction réel non-bloqué et à valeur produit (hunt Explore ciblé, hors périmètre V18/#8).
Défaut trouvé (classe #6 anti-invention · DANS l'outil d'audit qualité lui-même). qa/audit_4big/q4lib/criteria.py:18 comptait les méthodes de test via une char-class ASCII pure : _TEST_DEF_RE = re.compile(r"^\s*def (test_[A-Za-z0-9_]+)\s*\(", …). Or Python 3 (PEP 3131) autorise les identifiants Unicode : le test réel test_traçabilite_source (le ç) existe à publiciste/tests/test_publiciste.py:99, est valide et exécuté par unittest (« Ran 23 tests »). La regex ASCII le loupait → crit_tests publiait l'évidence fausse « 22 méthodes test_ »* dans quality_report.json (réel = 23). Le critère TESTS reste PASS (seuil 8) et le score inchangé (100) — mais le fait publié était faux, en violation du cœur anti-invention #6 de l'audit (« une note est recomputée à partir de faits vérifiables », criteria.py:1-7).
Preuve que c'est un bug (pas by-design) — la source SŒUR le compte déjà correctement. qa/regression/reglib/discovery.py:23 compte le MÊME concept avec _TEST_METHOD_RE = re.compile(r"^\s*def\s+(test_\w+)\s*\(") — \w est Unicode-aware par défaut en Python 3 → il compte publiciste = 23 (attesté dans regression_plan.json, byte-gaté, autorité de la colonne « Tests » des fiches via count_tests). Les deux outils QA divergeaient d'un sur publiciste (23 vs 22) ; criteria.py était le mauvais. Blast-radius vérifié : un seul nom de test non-ASCII dans tout le dépôt (scan AST des 24 suites) → publiciste seul impacté ; le « 22 méthodes mobile » du daily_reports/2026-08-03 est un module distinct (coïncidence), non touché.
Fix (chirurgical · single-source · aligné sur la sœur). criteria.py:18 : char-class ASCII [A-Za-z0-9_] → \w (Unicode), forme identique à reglib.discovery. + teeth : nouveau test test_tests_counts_non_ascii_method_names dans qa/audit_4big/tests/test_audit_4big.py (fixture ASCII + test_traçabilite_source, exige « 2 méthodes ») — prouvé mordant : sur l'ancienne regex ASCII il compte 1 → assertion échoue ; sur \w → 2 → passe. La fixture existante du suite étant en ASCII, aucune régression sur test_tests_counts_methods_and_thresholds (« 5 méthodes » inchangé).
Cascade d'artefacts régénérée (mémoire artifact-reproducibility-gate + audit4big-rebuild-after-doc-edits). (1) quality_report.json régénéré en dernier → seule variation = évidence publiciste TESTS « 22 → 23 méthodes » ; verdict PASS · 24/24 · min 100 inchangé. (2) L'ajout du test change le décompte de la matrice : regression_gen.py build (plan) puis run (matrice live) → regression_run.json 625 → 626 exécutés · 608 → 609 passés · 17 skippés · 0 échec (le nouveau test lui-même + audit_4big se score lui-même). (3) Surfaces de prose re-dérivées : fiche 03_agents/qa/AGENT.md (colonne audit_4big 34 → 35 ← count_tests ; agrégat 625/608 → 626/609) — la première flaggée RED par check_readme_claims, la seconde par le même gate ; + 03_agents/erpnext_backend/AGENT.md:40 (claim live 625 → 626, sourcé regression_run.json). Le daily_reports/2026-08-11 (snapshot signé HEAD 18d8763) et les logs sont des instantanés datés → laissés (mémoire two-logging-channels).
Pourquoi pas un nouveau gate (#5). La divergence est déjà structurellement gatée : check_readme_claims a immédiatement rougi (fiche QA vs count_tests) dès que la matrice a bougé, et la teeth ajoutée verrouille le comportement de criteria.py. Ajouter un gate « criteria.py == discovery.py » serait redondant — la réconciliation croisée existante mord déjà. Occurrence isolée (1 nom non-ASCII), corrigée à la source unique.
Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP rétabli après régénération complète. 0 code moteur V18 (bloqué #6), 0 commande VPS (#8), 0 API externe. Fichiers : qa/audit_4big/q4lib/criteria.py (regex) + qa/audit_4big/tests/test_audit_4big.py (teeth) + qa/audit_4big/out/quality_report.json + qa/regression/out/{regression_plan,regression_run,MANIFEST}.json + 03_agents/qa/AGENT.md + 03_agents/erpnext_backend/AGENT.md + ce journal.