Commit Graph

195 Commits

Author SHA1 Message Date
Claude Code DTP Worker f954cc19d1 [DTP-Worker 20260802_183604] Auto exec · session 20260802_183604
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 / 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 / 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 / E2E baseline Playwright (manuel) (push) Has been cancelled
CI / Gate qualité (agrégat) (push) Has been cancelled
2026-08-02 18:49:35 +00:00
Claude Code DTP Worker 97d3b64780 [DTP-Worker 20260802_183604] Sprint 8 · buffer · README racine (dérive doc-vs-réalité non gatée) : la puce « Régression » affirmait regression_run.json « non commité par design » → FAUX depuis la refonte baseline byte-gatée (76fb0e7)
Correction de VÉRITÉ (PAS un gate #5, PAS un chiffre inventé #6).

Constat : README.md:44-46 déclarait le compte agrégé « produit par qa/regression
run (non commité par design) ». Or regression_run.json EST commité (git ls-files le
confirme) et sert de baseline byte-identique au gate ci/check_regression.sh (mécanisme
introduit par 76fb0e7) ; le README du module (qa/regression/README.md:50,57-61) ET le
commentaire du gate lui-même (ci/check_readme_claims.sh:264,269 « commité · déterministe
· compte agrégé faisant autorité ») le disent. Le README racine reflétait l'ANCIEN
design pré-76fb0e7.

Angle mort : check_readme_claims ancre le nombre « 22 suites gated » (recompté de
regression_plan.totals.suites) mais PAS le fait-en-clair « (non commité par design) » ;
check_docs ne valide que les liens. La dérive vivait dans l'interstice.

Fix : puce réécrite vers la réalité — regression_run.json désigné artefact « commité et
byte-gaté », lien ajouté ; token gaté **22 suites gated** conservé verbatim ; lien
regression_plan.json préservé ; « non commité par design » supprimé. Aucun 564 hardcodé
(pas de surface non gatée nouvelle · fidèle à « ce README n'introduit aucune donnée nouvelle »).

Vérif : run_ci.sh 30 PASS / 0 FAIL / 0 SKIP (check_docs résout le nouveau lien commité ·
check_readme_claims retrouve 22 suites gated · guard_constraints vert). Zéro gate ajouté,
zéro fichier de code touché, aucune commande VPS.

Note : dir scratch untracked 05_deliverables_mvp/frontend/portails/out_fresh/ (byte-identique
à out/ commité, référencé par aucun code) laissé en place — authorship non confirmé, non
supprimé par prudence (jamais git clean · interdit #1).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 18:47:41 +00:00
Claude Code DTP Worker 3ff51d94fb [DTP-Worker 20260802_180604] Sprint 8 · buffer · Reporting stakeholder (canal 2) : rattrapage du snapshot daily_reports/2026-08-02 sur les 3 sessions de retouches doc/outillage depuis la clôture 160601 (59eb4dc/68f8c1a/d2ab269) → 4e addendum ADDITIF (corps + 3 addenda intacts), chaque chiffre re-sourcé par recompute python3 indépendant (22/22 scores={100} · 564/564 · 15/15 in_repo=true · 13 fiches · gate.needs=30) · audit doc-vs-réalité relancé cette session = aucune dérive · zéro nouveau module · zéro gate ajouté (#5) · run_ci.sh 30 PASS + check_docs/check_readme_claims/guard_constraints verts
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 18:12:40 +00:00
Claude Code DTP Worker d2ab269684 [DTP-Worker 20260802_173603] Sprint 8 · buffer · ci/README.md : retrait des comptes CI figés « 7 gates / 23 suites »
Même fix que dcb463e, un cran plus haut. dcb463e avait dérivé le décompte 30/23/7
du COMMENTAIRE de run_ci.sh (il se périme à chaque module ajouté/retiré de ci.yml) ;
mais la DOC du lanceur (ci/README.md §« Rejouer le gate EN LOCAL ») re-transcrivait
encore les mêmes nombres à la main : bloc d'usage L34-35 (« 7 gates statiques + 23
suites de module » / « 7 gates ci/*.sh ») + checklist L1601 (« 7 gates statiques »).

Vérif d'exposition (verify-uncovered-before-gating) : mutation 23→24 / 7→8 →
check_readme_claims ET check_docs restent VERTS → surface réellement NON gatée.

Décision FIXER pas gater (fix-vs-gate + local-ci-runner) : ci/README.md:51-54 déclare
lui-même que run_ci.sh « n'a pas à être re-gaté (#5) » (exactitude structurelle) —
gater la prose qui le décrit trahirait cette posture. On retire donc les nombres
figés et on laisse run_ci.sh seul propriétaire du décompte (dérivé de gate.needs,
imprimé à l'exécution + --list). Ajout d'un paragraphe l'explicitant (même raison #6).

Intactes : les « 7 gates re-verts » du CHANGELOG (narratif historique d'états passés
VRAIS, pas une composition vive). Zéro module · zéro gate (#5) · zéro chiffre inventé
(#6) · run_ci.sh 30 PASS · guards verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 17:41:25 +00:00
Claude Code DTP Worker 68f8c1a718 [DTP-Worker 20260802_170601] Sprint 8 · buffer · run_ci.sh : -h|--help + en-tête --static honnête (UX du lanceur, PAS un gate #5)
Deux vraies aspérités d'UX sur le lanceur run_ci.sh (miroir local du gate),
reproduites avant fix :
- `--help`/`-h` échouait « option inconnue » exit 2 alors qu'un bloc d'usage
  riche dormait dans l'en-tête → ajout usage() branché AVANT résolution git
  (aide marche hors checkout : exit 0 ; vrai run hors git reste exit 3),
  codes de sortie documentés (0/1/2/3).
- en mode --static l'en-tête annonçait « 30 jobs = 7 gates + 23 suites »
  alors que seuls 7 gates tournent → récap « 7 PASS » contredisait l'en-tête ;
  en-tête rendu mode-conscient (« 7 gates seuls, 23 suites ignorées »).
- message d'option inconnue + ci/README.md alignés (ajout --help).

Toutes les valeurs restent DÉRIVÉES de gate.needs (#6, zéro compte figé).
Zéro nouveau module · zéro gate ajouté (#5) : run_ci.sh reste un lanceur
(racine ∉ ci/*.sh, hors gate.needs, INV-B). Vérif : --help exit 0 in+hors git ·
--bogus exit 2 · check_docs/check_readme_claims/guard_constraints verts ·
run_ci.sh plein → 30 PASS · 0 FAIL · 0 SKIP.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 17:11:19 +00:00
Claude Code DTP Worker 59eb4dcb7c [DTP-Worker 20260802_163601] Sprint 8 · buffer · Fiche devops/AGENT.md : documentation du livrable run_ci.sh (indexé au README racine mais absent de la fiche de son agent propriétaire) → 3e ligne table + sous-section « outillage local, PAS un gate #5 » (dérive de gate.needs, hors gate.needs, racine ∉ ci/ donc hors INV-B), aligné mémoire local-ci-runner · zéro module · zéro gate · check_docs valide le lien ../../run_ci.sh · run_ci 30 PASS + guards verts 2026-08-02 16:39:22 +00:00
Claude Code DTP Worker 4f390b4ee2 [DTP-Worker 20260802_160601] Sprint 8 · buffer · Reporting stakeholder (canal 2) : rattrapage du snapshot daily_reports/2026-08-02 sur les 2 sessions run_ci.sh (49123ec/dcb463e) → 3e addendum ADDITIF (corps+2 addenda intacts), chaque chiffre re-sourcé par recompute python3 indépendant (22/22 scores={100} · 564/564 · 15/15 in_repo=true · 13 fiches · gate.needs=30) · zéro nouveau module · zéro gate ajouté (#5) · seul livrable net = outil DevOps run_ci.sh déjà gaté par construction · run_ci.sh 30 PASS + check_docs conforme
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 16:11:18 +00:00
Claude Code DTP Worker dcb463ee00 [DTP-Worker 20260802_153601] Sprint 8 · buffer · run_ci.sh : décompte 30/23/7 DÉRIVÉ à l'exécution (retrait des comptes figés du commentaire)
Dernière surface figée dans l'outil « anti-dérive par construction » : run_ci.sh
dérive déjà la liste des checks de gate.needs (zéro liste en dur) mais son
commentaire d'en-tête re-transcrivait à la main « 30 jobs · 23 suites · 7 gates »
— un « vert trompeur » de la classe qu'il combat, logé dans sa propre doc
(ajouter un job module → le script s'adapte, le commentaire se périme en silence).

FIX (éliminer le nombre figé), pas gate N+1 : un lanceur de commodité (root ∉
ci/*.sh) ne mérite pas un gate redondant (#5) qui prendrait la mauvaise autorité.
- ventilation dérivée des mêmes ROWS que l'exécution (n_gates/n_suites/n_jobs) ;
- en-tête d'exécution + pied de --list impriment « 30 = 7 + 23 » (toujours exact) ;
- commentaire reformulé : littéraux 30/23/7 remplacés par la description
  qualitative bash ci/*.sh / python3 -m unittest + note « décompte DÉRIVÉ, jamais
  figé ici » (anti-invention CLAUDE.md #6).

Vérif : --list/--static impriment 30=7+23 · run_ci.sh complet 30 PASS/0 FAIL/0 SKIP ·
7 gates re-joués exit 0. Aucun gate ajouté (#5). Aucune commande touchant au VPS.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 15:42:38 +00:00
Claude Code DTP Worker 49123ecba3 [DTP-Worker 20260802_150601] Sprint 8 · buffer · DevOps outillage : run_ci.sh — miroir LOCAL du gate CI dérivé de gate.needs (zéro liste en dur), reproduit les 30 jobs (7 gates ci/*.sh + 23 suites module) en une commande · anti-dérive par construction (suit ci.yml) · PAS un gate (#5), root ∉ ci/*.sh donc hors INV-B · parseur awk anti-commentaire · chemin d'échec prouvé (EXIT=1 + dump) · doc README + ci/README · 7/7 gates statiques verts
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 15:16:29 +00:00
Claude Code DTP Worker 1c0cb8e973 [DTP-Worker 20260802_143555] Sprint 8 · buffer · Reporting stakeholder : rattrapage du snapshot daily_reports/2026-08-02 sur les 4 sessions buffer intercalées depuis la clôture 120544 (cb8d931/8dcedb0/576e78b/bd3572b) → 2e addendum additif, chaque chiffre re-sourcé par recompute python3 (22/22 · 564/564 · 15/15 · 13 fiches · gate.needs=30) · zéro gate ajouté (#5) · faux positif CLAUDE.md#2 « otov7-platform » écarté (repo plateforme réel ≠ repo mandat, pas une dérive)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 14:42:56 +00:00
Claude Code DTP Worker bd3572b382 [DTP-Worker 20260802_140554] Sprint 8 · buffer · Audit d'EFFICACITÉ des gates : mutation-testing du suite → 7 mutations / 7 RED prouvés (« vert » ≠ « faux-vert »), zéro gate ajouté (#5)
Angle complémentaire à la campagne « surfaces non couvertes » (verify-uncovered-
before-gating prouve qu'une dérive SERAIT attrapée si un gate mordait) : en phase
launch, les gates VERTS mordent-ils réellement ? J'ai mutation-testé le suite, chaque
mutation immédiatement révertée (arbre propre re-vérifié) :
- check_ci_integrity : job fantôme dans gate.needs (DANGLING) → RED · job réel retiré
  de gate.needs (MISSING) → RED
- check_artifacts : octet parasite dans out/MANIFEST.json (repro byte) → RED
- check_readme_claims : README « 22/22 modules »→« 23/22 » → RED · « 15 promesses »
  →« 16 » → RED
- guard_constraints : URL github.com (usage réel) → RED · « stripe payments » → RED
7/7 : les 4 gates à oracle recomputé MORDENT ; « vert » = réellement conforme.

Non-finding documenté (piège évité) : guard_constraints ne flague PAS le mot nu
« GitHub », à dessein (terme interdit = l'USAGE github.com|git@github, pas la mention —
mémoire guard-constraints-flags-usage-not-mention). Ma 1re mutation « bare word » est
restée verte → ce n'était pas un trou mais une mutation mal conçue ; re-testé avec un
vrai usage → RED.

Zéro gate ajouté (aucune surface non couverte prouvée · #5), seul fichier touché = le
log (ligne M5b citant github.com marquée ci-allow, cf. guard-constraints-log-prose).
7 gates re-joués → exit 0. Aucune commande touchant au VPS.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 14:14:36 +00:00
Claude Code DTP Worker 576e78b6a9 [DTP-Worker 20260802_133549] Sprint 8 · buffer · roles_couverts (« 44 ») : enquête anti-dérive → NON-surface prouvée (3 manifestes importent la même fonction roles_by_portail sur l'unique contrat rbac_50_roles.json → transitivement mono-sourcé, un cross-gate serait redondant #5, contra le cross-check RBAC-50 qui re-dérive) + documentation du garde-fou dans ci/README.md pour prévenir un gate N+1 redondant 2026-08-02 13:45:38 +00:00
Claude Code DTP Worker 8dcedb092c [DTP-Worker 20260802_130548] Sprint 8 · buffer · Compte d'agents : ancrage des 3 surfaces vives de GAP_ANALYSIS_SPRINT1 (dont coche couverture DoD) sur n_agents
Balayage de complétude après cb8d931 (qui a ancré « 13 agents » aux 2 docs de
mandat de tête) : 3ᵉ surface HORS gate = le livrable Sprint 1 GAP_ANALYSIS_SPRINT1.md
(Definition of Done). Retranscrit le compte à 3 endroits vifs — périmètre d'audit
(l.12) · constat global total (l.53, le « 12 » analytique EXCLU) · coche de
couverture DoD (l.214). Prouvé ungate (grep ci/=0 ; mutation 13→14 laissait exit 0)
et à dérive prouvée (publiciste 12→13). Extension de la boucle head-docs existante
(3 tuples réutilisant n_agents = git ls-files 03_agents/*/AGENT.md · zéro nouvelle
machinerie · #5) ; on n'ancre que le total ; INTROUVABLE = échec (#6). ci/README.md
documente désormais 7 surfaces vives. 6 morsures (M5 no-false-positive sur le « 12 » ·
M6 SILENT-GREEN via git rm --cached prouvant l'autorité git-index). 7 gates exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 13:11:37 +00:00
Claude Code DTP Worker cb8d931abb [DTP-Worker 20260802_123546] Sprint 8 · buffer · Dérive doc-vs-réalité « 12 agents » sur les 2 docs de mandat de tête (AGENTS_EXISTING_ASSETS titre + MASTER_PROMPT §28) : le 13e agent (publiciste) est livré+gaté 100/100 → correction 12→13 (source unique 03_agents/) + clarification statut publiciste (LIVRÉ mandat · runtime VPS hors #8) + extension check_readme_claims réutilisant n_agents pour ancrer ces 2 docs (surface prouvée non couverte par mutation-test) 2026-08-02 12:42:52 +00:00
Claude Code DTP Worker 2e71c5f51e [DTP-Worker 20260802_120544] Sprint 8 · buffer · Clôture de journée du snapshot daily_reports/2026-08-02 : addendum additif actant la fermeture 13/13 fiches AGENT.md (commit 2bc3afb) → lève la réserve −4 « 2/13 auditées » et la « prochaine tâche #2 » devenues caduques
Snapshot stakeholder du jour (écrit 11:11) rendu véridique sans nouveau fichier
per-session (anti-doublon #5) : corps historique 110539 intact, addendum re-vérifié.
Recompute indépendant concordant (22/22 qualité · 564/564 régression · 15/15 recette
· 13 agents) ; 7 gates CI re-joués exit 0. Aucune action VPS (#8).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 12:10:15 +00:00
Claude Code DTP Worker 2bc3afbd1a [DTP-Worker 20260802_113542] Sprint 8 · buffer · Audit exactitude doc-vs-réalité des 11 fiches AGENT.md restantes : 0 dérive réelle (13/13 fiches désormais auditées), 2 « dérives » signalées levées comme faux positifs de convention (onapi_legal backtick deliverables-relative miroir du code · faisabilite chemins VPS/futurs assumés) + 1 clarification de lisibilité (bandeau VPS-runtime vs template committé) sur faisabilite/AGENT.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 11:43:45 +00:00
Claude Code DTP Worker 519f6dbfee [DTP-Worker 20260802_110539] Sprint 8 · buffer · Reprise du canal daily_reports/ (lapsus depuis 30/07) : instantané MVP launch-readiness 100% sourcé (22/22 qualité · 564/564 régression · 15/15 recette) + audit doc-vs-réalité fiches crm/bim + réconciliation des 2 canaux de journalisation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 11:12:10 +00:00
Claude Code DTP Worker 4841b77099 [DTP-Worker 20260802_103535] Sprint 8 · buffer · Dérive doc-vs-réalité : 11 fiches AGENT.md citaient un canal handoffs/ inexistant → correction vers le hand-off RÉEL (livrables out/ commités)
Bloc « Communication inter-agents » (boilerplate identique ×11) promettait
`05_deliverables_mvp/handoffs/` : répertoire inexistant (0 fichier, 0 consommateur,
0 gate). Échappé à check_docs.sh car chemin en code-span backtick (neutralisé l.28,
à dessein — gater les backticks = faux positifs massifs, donc NON élargi). Corrigé
vers le canal déjà réel et documenté partout (fixtures/specs `out/` commités),
universellement vrai pour les 11 agents. 7 gates verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 10:39:53 +00:00
Claude Code DTP Worker 0752e35988 [DTP-Worker 20260802_100534] Sprint 8 · buffer · Ancrage des MINIMA D'ORCHESTRATION de demo/scenarios (« ≥ 2 modules distincts · ≥ 3 beats ») sur la garde check_invariants (CODE-autorité)
Classe « seuil data-derived recopié dans une garde de validation + sa prose,
jamais ancré » (déjà couverte pour min_doc_bytes/min_test_methods de l'auditeur
4Big). Livrable Sprint 7 demo/scenarios : la garantie #3 du README énonce deux
planchers RÉELLEMENT imposés par check_invariants bloc (c) — len(sc["beats"])<3,
len(mods)<2 — mais recopiés à la main à 3 surfaces (comparaison `<`, message
d'erreur « (min N) », prose README), aucune gatée. Muter « ≥ 3 beats »→« ≥ 4 »
laissait check_readme_claims exit 0 (prouvé ungate).

Gate re-dérive les 2 minima depuis la SEULE comparaison `<` (source unique #5) et
exige message + prose == plancher effectif ; surface INTROUVABLE échoue (#6).
7 morsures adversariales (dont M3 SILENT-GREEN : code resserré `<3`→`<4` ⇒ message
ET README mordent, preuve autorité=CODE). 39 tests OK (générateur inchangé) ; suite
CI complète re-verte.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 10:11:34 +00:00
Claude Code DTP Worker 3cb1bf06e1 [DTP-Worker 20260802_093532] Sprint 8 · buffer · Ledger d'invariants 9ᵉ instance : gate d'IDENTITÉ du COMPTE de _validate_bundle de crm/workflow_vente (dialecte # Invariant N ·, 3ᵉ oubli de la classe « close »)
Le générateur workflow_vente_gen.py (Livrable Sprint 4 l.50) porte un ledger de
9 invariants métier de graphe dans `_validate_bundle` (marqueurs `# Invariant N ·`,
phrasé « schéma + 9 invariants »), avec le nombre « 9 » recopié à la main à 4
surfaces vives (gen l.223 + README l.78/114/125), aucune gatée. Prouvé ungate
avant ajout (README 9→10 laissait check_readme_claims exit 0). Gate ajouté
(a)(b)(d) sur le modèle Mobile : recompute le ledger depuis le SEUL registre-source
`# Invariant N ·`, exige contiguïté 1..N + toute mention « N invariants » du .py et
du README == |ledger|. Pas de gate (e) enum : la liste « ## Invariants vérifiés par
le CLI » compte le schéma en item 1 et fusionne les invariants 8&9 → n'est pas le
ledger (faux positif fragile évité). « 25 tests » exclu nativement par l'ancre
« invariants » (aucun faux positif). 3 checks verts arbre propre · 7 morsures
adversariales (dont M3 SILENT-GREEN `# Invariant 10 ·` ⇒ autorité=CODE, M7
no-false-positive) · unittest 25 OK · suite CI complète re-verte.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 09:42:13 +00:00
Claude Code DTP Worker ca15e7e12b [DTP-Worker 20260802_090530] Sprint 8 · buffer · Angle mort gate « comptes tests par suite » : la cellule rbac (fiche pointe une SPEC, pas un README) était non vérifiée
row_re du gate check_readme_claims §comptes-par-suite exigeait un lien …/README.md ;
la fiche erpnext_backend pointe rbac/ via RBAC_50_ROLES_SPEC.md (son point d'entrée
contrat), donc sa cellule « Tests | 10 | » échappait au recompute depuis
regression_plan.json. Mutation-test 10→99 : gate restait VERT (vrai angle mort,
classe « vert trompeur »). Extension : accepte tout *.md d'entrée du dossier module
(/[\w.-]+.md) ; le garde path-not-in-auth protège l'élargissement. rbac désormais
vue+mordue ; 7 gates verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 09:10:39 +00:00
Claude Code DTP Worker 448c310398 [DTP-Worker 20260802_083529] Sprint 8 · buffer · Faisabilité/bancable : élimination du taux 0.52 codé en dur dans l'oracle _check_derived_arithmetic
Le seul survivant en dur du paramètre canonique #9 (point d'équilibre 52 %)
vivait au cœur de l'oracle anti-invention de bancable_gen.py — alors que le
module PRÊCHE la source unique (deps.py « une seule source de vérité » ;
finance._pct « jamais codé en dur »). Transitivement protégé (donc gate
redondant, #5) mais BUG LATENT inverse : #9 52 %→55 % aurait fait rejeter
en silence un dossier bancable VALIDE. Fix = dériver le taux de
CANONICAL (finance._pct), pas un checker de plus.

Vérif : validate byte-identique à 52 % (pe=21) · 22 tests verts · preuve
levée du bug (source→55 % ⇒ pe=22, invariants OK) · 6 gates CI exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 08:43:04 +00:00
Claude Code DTP Worker ccb86fe7ca [DTP-Worker 20260802_080527] Sprint 8 · buffer · Doc QA : documentation du 2ᵉ étage QA (batterie de gates statiques ci/*.sh) dans qa/AGENT.md — trou comblé (le titre promettait « gates de méta-niveau », le corps n'en tabulait aucun) ; vérif préalable : pas de dérive fiscal/ecf (ledger schéma-#1 synthétisé), pas de gate redondant à ajouter
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 08:13:27 +00:00
Claude Code DTP Worker 0f4f1b533b [DTP-Worker 20260802_073526] Sprint 8 · buffer · Ledger d'invariants 2ᵉ FAMILLE : ancrage du COMPTE # INVn ·/validate_bundle de deploy_runbook (11) + acceptance (11) — dialecte « N familles d'invariants » qui avait glissé la clôture
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 07:45:26 +00:00
Claude Code DTP Worker 655eeeb4a1 [DTP-Worker 20260802_070524] Sprint 8 · buffer · Mobile app_config : gate d'IDENTITÉ du COMPTE D'INVARIANTS de _validate_bundle (8ᵉ instance de la classe ledger)
Recompute le compte « 12 invariants » depuis le SEUL registre-source
(`# Invariant N ·` de `_validate_bundle`) — 4 surfaces prose hand-transcrites
(CLI .py, 2× README, docstring test) ancrées, aucune n'était gatée. Style de
marqueur `# Invariant N ·` + fonction `_validate_bundle` = deux différences
structurelles vs les 7 blocs `# N ·`/`_validate` précédents ; ajoute la surface
fichier-de-tests (b'). 4 verts arbre propre · 8 morsures adversariales · 6 gates
CI exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 07:11:34 +00:00
Claude Code DTP Worker 335d449346 [DTP-Worker 20260802_063519] Sprint 8 · buffer · RBAC SPEC §2 : ancrage de l'encadré « Défense en profondeur » (NOM du détenteur de set_user_permissions · scope · famille) sur l'artefact byte-gaté
Extension du bloc « RBAC fixtures » (points 4 & 5) : la 3e surface prose du fait
de sécurité set_user_permissions (SPEC §2 encadré + §6 row) était NON gatée. Le
test test_rbac impose scope/famille à tout détenteur mais jamais le NOM du rôle ni
la prose §2. Réutilise fx_sup (singleton déjà byte-gaté · pas de doublon d'unicité,
#5) comme nom-autorité + src_roles pour scope/famille.

Prouvé M6 SILENT-GREEN : rename détenteur dans le contrat + régen artefacts =>
check_artifacts VERT mais §2 name-gate RED (autorité = artefact, pas cohérence SPEC).
6 morsures adversariales, 6 gates re-verts exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 06:48:01 +00:00
Claude Code DTP Worker 215c9e6f25 [DTP-Worker 20260802_060518] Sprint 8 · buffer · Traçabilité : ancrage de la CITATION roadmap_ref VERBATIM (l.N + libellé) des 4 MANIFESTs sur la ligne réelle de la roadmap
Gate anti-dérive #6 : demo/scenarios · frontend/chat_otoia · frontend/portails ·
mobile/app_config publient un roadmap_ref « …l.A[-B] « <bullet> » » dans
out/MANIFEST.json (byte-gaté). check_artifacts ne prouve QUE spec==MANIFEST ;
INV11 n'ancre que les roadmap_line NUMÉRIQUES de qa/acceptance. Reformuler/
renuméroter la roadmap laissait les 4 citations périmées en silence (silent-green
prouvé : reword l.63 ⇒ 6 gates verts, chat_otoia cite toujours l'ancien texte).

check_readme_claims : découvre chaque MANIFEST à citation et exige (1) fichier ==
roadmap canonique, (2) libellé normalisé ⊆ lignes A..B réelles, (3) spec ==
MANIFEST ; 4 modules connus EXIGÉS présents (anti-évaporation). 5 checks verts ·
7 morsures (M1 silent-green reword roadmap · M2 renumber · M3 drift citation ·
M4 wrong file · M5 spec≠manifest · M6 évaporation · M7 hors-plage). Suite complète
exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 06:15:53 +00:00
Claude Code DTP Worker 0d4fd0942c [DTP-Worker 20260802_053514] Sprint 8 · buffer · RBAC SPEC §6 : ancrage de l'ÉNUMÉRATION des DocTypes custom (2ᵉ surface prose) sur le catalogue byte-gaté du contrat
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 05:49:04 +00:00
Claude Code DTP Worker 11c48b668b [DTP-Worker 20260802_050513] Sprint 8 · buffer · RBAC SPEC §2 : ancrage de l'ÉNUMÉRATION des scope_donnees (ligne Row-level) sur l'enum de rbac.schema.json
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 05:10:43 +00:00
Claude Code DTP Worker bcfc0f9a9d [DTP-Worker 20260802_043512] Sprint 8 · buffer · Faisabilité : ancrage du DOMAINE DES CODES PROJET (garde _validate_brief + 2 schémas JSON) sur CLAUDE.md §Projets
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 04:41:54 +00:00
Claude Code DTP Worker 03b481c6ee [DTP-Worker 20260802_040511] Sprint 8 · buffer · RBAC SPEC §3 : ancrage de la colonne « Familles rattachées » PAR portail sur rbac_50_roles.json
Nouvelle surface anti-dérive (#6) : la table §3 « Cartographie portails ↔
familles » porte deux colonnes data-derived du contrat ; « Nb rôles » était
gatée, « Familles rattachées » (SET des `famille` distinctes par portail) ne
l'était pas — le count-gate l'avale via `[^|]*`.

Gate « 1quater-bis » : recompute le SET de familles par portail depuis
rbac_50_roles.json[roles][].famille, égalité par ENSEMBLE (absent + fantôme)
avec les jetons bruts de la cellule (parenthèses éditoriales exclues, ordre
non gaté). Silent-green prouvé : reclasser les 2 rôles `legal` de `direction`
en `finance` garde le compte 9==9 VERT mais fait mordre FANTÔME {legal}.

6 verts arbre propre · 5 morsures adversariales · 6 gates re-verts exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 04:10:42 +00:00
Claude Code DTP Worker ab73cf9384 [DTP-Worker 20260802_034704] Sprint 8 · buffer · Faisabilité : ancrage du TEMPLATE CANONIQUE v1.0 (5 surfaces #9/#10) sur CLAUDE.md
Le document-modèle CANONIQUE que toute faisabilité doit reproduire recopiait à la
main les 6 valeurs #9/#10 à 5 surfaces structurées, aucune gatée. Nouveau bloc
« TEMPLATE FAISABILITÉ CANONIQUE v1.0 » (réutilise exp/exp_excl déjà recomputés de
CLAUDE.md · zéro dup) : intro#9, 3 lignes table #9, intro#10, 3 lignes table #10
(+ exclusion ), checklist 6 marqueurs. 5 verts sur arbre propre · 11 morsures
adversariales dont M10/M11 (mutation CLAUDE.md #9/#10 SEULE ⇒ cascade sur 3 régions =
anchor-is-live). 6 gates exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 03:47:04 +00:00
Claude Code DTP Worker d429fccf9a [DTP-Worker 20260802_030504] Sprint 8 · buffer · Fiscal e-CF : ancrage du CONTRAT DE FORMAT e-NCF dans le COMPOSEUR ncf.py (CODE) + oracle de test
Le bloc « Fiscal · CONTRAT DE FORMAT » ancrait le format DGII
(E + tipoeCF(2) + secuencia(10) = 13 · Ley 32-23) sur ecf_plan.json[e_ncf]
byte-gaté, mais UNIQUEMENT sur 4 surfaces de PROSE (README x3 + fiche
erpnext_backend). Le composeur d'exécution ecflib/ncf.py — qui VALIDE et
COMPOSE réellement l'e-NCF cote VPS — portait 3 copies INDÉPENDANTES du
format (ENCF_RE regex de validation · FORMULE publiée par compose_encf ·
docstring/commentaire), + un oracle de test hardcodé, tous NON gatés.

Silent-green : un rango DGII a 12 chiffres régénère ecf_spec->ecf_plan (les
4 proses suivent) mais laisse ENCF_RE a {2}{10} => is_valid_encf REJETTE un
e-NCF valide (bug runtime) pendant que tests/ reste VERT (oracle == FORMULE
périmée). check_artifacts (pas un out/*.json) et tests/ (teste les fonctions,
pas leur ancrage) sont aveugles.

Gate : extension du bloc e-NCF (surfaces 5->9) réutilisant prefix/tipo/seq/
total + ecf_check déja dérivés (zéro re-dérivation du format · #6). 7 morsures
adversariales dont M6 SILENT-GREEN (artefact seq 10->12, ncf.py inchangé =>
les 5 surfaces mordent, autorité = artefact). 39 tests unittest verts. 6 gates
CI re-verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 03:13:54 +00:00
Claude Code DTP Worker aab89a6032 [DTP-Worker 20260802_023503] Sprint 8 · buffer · CRM Commissions : gate d'IDENTITÉ du COMPTE D'INVARIANTS de _validate (7ᵉ instance du ledger · série close)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 02:39:14 +00:00
Claude Code DTP Worker bf11db6d85 [DTP-Worker 20260802_020502] Sprint 8 · buffer · QA Audit 5D : gate d'IDENTITÉ du COMPTE D'INVARIANTS de _validate (6ᵉ instance du ledger)
RECOMPUTE le ledger d'invariants depuis le SEUL registre-source (les `# N ·` de
`_validate` de audit_5d_gen.py) et gate les 6 transcriptions manuelles de « 15
invariants » (4 dans le .py, 2 dans le README), toutes invisibles à
check_artifacts. Ledger PROPRE 1..15 (schéma compté à part). Exige : (a) ledger
contigu 1..N (lacune/doublon nu mordu) ; (b) toute mention « N invariants » du
.py == |ledger| ; (d) toute mention README == |ledger|. Le distinct « 17
contrôles » est exclu nativement par l'ancre sur le mot « invariants » (aucun
faux positif). 6 morsures adversariales dont M3 (ajout `# 16 ·` mord .py+README,
preuve que l'autorité est le CODE) et M6 (« 17 contrôles » reste invisible).
6 gates re-verts exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 02:09:04 +00:00
Claude Code DTP Worker 40ee6f6a46 [DTP-Worker 20260802_013501] Sprint 8 · buffer · CRM Dossier Vente : gate d'IDENTITÉ du COMPTE D'INVARIANTS de _validate (5ᵉ instance du ledger)
5ᵉ instance de la classe « ledger d'invariants » (après Chat OTOIA · SEO ·
Fiscal e-CF · Legal CONFOTUR). Le compte « 12 invariants » de
crm/dossier_vente/doctype_dossier_vente_gen.py était transcrit à la main à
7 endroits (4 chaînes du .py + 3 du README : commande, titre « ## Les 12
invariants », prose de score), aucun gaté — invisibles à check_artifacts
(le .py n'est pas un out/*.json) et aux suites tests/ (qui testent des
fonctions, pas la prose). Ajouter un contrôle # 13 · sans toucher les 7
chaînes ⇒ CI applique 13 contrôles pendant que docs+self-reports disent 12
en silence (vert trompeur · #6).

Ledger PROPRE 1..12 (≈ CONFOTUR) : schéma compté à part (« schéma + N
invariants »), pas de schéma-#1 non marqué, pas de split a/b ; détection de
doublon nu conservée en filet. Le gate RECOMPUTE le ledger depuis le seul
registre-source (# N · de _validate) et exige (a) ledger contigu 1..N ;
(b) toute mention « N invariants » du .py == |ledger| ; (c) annonce du titre
README == |ledger| ; (d) toute mention README == |ledger| ; (e) énumération
numérotée de la section contiguë 1..N.

5 checks verts sur l'arbre propre. 7 morsures adversariales (M1 self-report
.py · M2 titre README · M3 prose README · M4 ajout # 13 · = ledger 13 vs
prose 12, mord .py+README+énumération = autorité au CODE · M5 gap # 7 · ·
M6 doublon nu # 5 · · M7 énumération 7→8). 6 gates re-verts exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 01:40:40 +00:00
Claude Code DTP Worker a5de76b7c1 [DTP-Worker 20260802_010501] Sprint 8 · buffer · Legal CONFOTUR : gate d'IDENTITÉ du COMPTE D'INVARIANTS de _validate (4ᵉ instance du ledger)
4ᵉ application du pattern « ledger d'invariants » (après Chat OTOIA · SEO ·
Fiscal e-CF) à legal/confotur/confotur_application_gen.py. Le compte « 14
invariants » y est transcrit à la main à SIX endroits non gatés, tous
invisibles à check_artifacts (le .py n'est pas un out/*.json) : 4 chaînes du
.py (docstrings module + _validate, succès CLI, aide du sous-parseur) + 2 du
README (bloc de commande, commentaire d'arborescence). Ajouter un contrôle
# 15 · à _validate sans toucher les 6 chaînes ⇒ README + self-reports mentent
en silence pendant que la CI applique 15 contrôles — « vert trompeur » que ni
tests/ (FONCTIONS, pas la prose) ni le byte-gate d'artefact n'attrapent.

Particularité CONFOTUR (≠ Fiscal) : ledger PROPRE 1..14 (pas de schéma-#1 non
marqué, pas de split a/b) MAIS le README porte AUSSI un compte de SOUS-ENSEMBLE
éditorial (« 2 invariants refusent tout champ monétaire ») à ne pas confondre
avec le total — un \d+ invariants naïf mordrait l'arbre propre. Le gate exclut
le sous-ensemble par lookahead négatif (\d+)\s+invariants(?!\s+refusent),
appliqué au .py comme au README.

Nouveau bloc (ci/check_readme_claims.sh) : RECOMPUTE le ledger depuis le SEUL
registre-source (# N · de _validate) et exige (a) ledger CONTIGU 1..N (lacune
OU doublon nu = vrai défaut) ; (b) toute mention-total du .py == |ledger| ;
(c) toute mention-total du README (hors « refusent ») == |ledger|. 3 checks
verts sur l'arbre propre. 6 morsures vérifiées (M1 self-report .py 14→15 · M2
README commande 14→15 · M3 README arborescence 14→13 · M4 ajout # 15 · ⇒
ledger→15 vs prose 14, mord .py ET README · M5 gap # 7 · · M6 doublon nu # 5 ·)
+ M7 no-false-positive (sous-ensemble 2→3 reste vert). 6 gates re-verts exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 01:11:12 +00:00
Claude Code DTP Worker 87c88beaa2 [DTP-Worker 20260802_003501] Sprint 8 · buffer · Fiscal e-CF DGII : gate d'IDENTITÉ du COMPTE D'INVARIANTS de _validate
3ᵉ application du pattern « ledger d'invariants » (après Chat OTOIA + SEO) : le
nombre magique « 12 invariants » du générateur fiscal ecf_dgii_gen.py est
transcrit à la main à 7 endroits (4 chaînes du .py : docstrings module/_validate
+ succès CLI + aide sous-parseur ; 3 du README : bloc commande + titre « ## Les
12 invariants » + prose de score), aucun gaté, tous invisibles à check_artifacts
(le .py source n'est pas un out/*.json). Ajouter un contrôle # 13 · à _validate
sans toucher les 7 chaînes = 13 contrôles appliqués pendant que README et
self-reports mentent en silence — vert trompeur qu'aucune suite tests/ (fonctions,
pas la prose) n'attrape.

Gate (bloc « Fiscal · e-CF DGII · IDENTITÉ du COMPTE D'INVARIANTS ») : RECOMPUTE
le ledger depuis le SEUL registre-source (# N · de _validate) et exige (a) ledger
CONTIGU 1..N ; (b) toute mention « N invariants » du .py == |ledger| ; (c) annonce
du titre README == |ledger| ; (d) toute mention README == |ledger| ; (e)
énumération numérotée prose du README contiguë 1..N. Particularité fiscale (≠
SEO/Chat OTOIA propres 1..N) : invariant 1 = validation de SCHÉMA non marquée
# 1 · (marqueurs 2..N), invariant 12 SPLITTÉ en # 12a ·/# 12b · (2 volets d'un
même invariant). Le ledger = {1:schéma} ∪ marqueurs-top-level, collapse 12a/12b
mais MORD un vrai doublon nu.

5 checks verts (ledger 1..12). 8 morsures : M1 self-report .py 12→13 (b) · M2
titre 12→13 (c+d) · M3 mention README 12→13 (d) · M4 ajout # 13 · ⇒ ledger→13
pendant que prose reste 12 (b+c+d, preuve que l'autorité est le CODE) · M5 drop
# 7 · = gap non contigu (a) · M6 doublon nu # 5 · · M7 énumération 7.→8. (e) ·
M8 drop validate(bundle, schema) = invariant 1 introuvable. 6 gates re-verts
(check_artifacts · check_docs · guard_constraints · check_ci_integrity ·
check_readme_claims · check_regression) exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 00:47:54 +00:00
Claude Code DTP Worker 1485e4d6ac [DTP-Worker 20260802_000501] Sprint 8 · buffer · Publiciste : gate d'ANCRAGE des DEVISES du site public sur CLAUDE.md #10
Le bloc Publiciste/branding existant ancre les 4 tokens DESIGN (#4 : couleurs +
typographies). Le MÊME module porte une 2e constante constitutionnelle NON gatée :
les devises CLAUDE.md #10 (« **USD + DOP** »), recopiées à 4 endroits data-derived,
tous invisibles à check_artifacts (pas un out/*.json) : (a) branding.py
DEVISE_PRIMAIRE/SECONDAIRE (auto-étiquetées « #10 · USD + DOP » sans gate) ; (b)
generator.py _fmt_usd/_fmt_dop — les formateurs qui IMPRIMENT le code devise sur
la grille de prix du site public vente.otov7.com (sortie face-public) ; (c) footer
HTML « Prix … en USD + DOP (Cardnet) » ; (d) l'oracle hardcodé
assertIn("USD 150 000") du test — une copie jamais comparée à CLAUDE.md. Aucune
suite tests/ (FONCTIONS de rendu, pas l'ancre à CLAUDE.md) n'attrape la dérive.

Nouveau bloc : RE-PARSE les 2 devises depuis la ligne #10 de CLAUDE.md
(indépendamment de exp amont · aucun skip hérité), exige (a) constantes branding ==
#10 ordre inclus ; (b) ensemble des codes émis par les formateurs == #10 ; (c)
footer cite les 2 devises dans l'ordre + (Cardnet) ; (d) oracle test == devise
primaire. Claim absent échoue AUSSI (#6). 6 morsures vérifiées (M5 : rename #10
CLAUDE.md-only cascade sur les 4 copies = preuve ancre live), 4 gates re-verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 00:11:27 +00:00
Claude Code DTP Worker 7e674f2f09 [DTP-Worker 20260801_233454] Sprint 8 · buffer · RBAC SPEC §5 : gate de la LIGNE D'AUTO-CONTRÔLE du « résumé »
La SPEC RBAC a déjà 3 gates (§3 ventilation par portail · §4 colonne Entité · §7
run-book) mais son §5 « Les N rôles (résumé) » restait AVEUGLE. Ce §5 restitue le
total de rôles sur 3 surfaces prose : le compte-titre « ## 5. Les 50 rôles », NEUF
comptes parenthétiques de regroupement (`**Ventes (8)**` …) et une ligne
d'auto-contrôle arithmétique `_(6+8+4+7+5+8+4+2+6 = 50.)_`. AJOUTER un rôle au
contrat (|rôles| 50→51) laisse titre/somme/`= 50` périmés en silence ; ÉDITER
`Ventes (8)→(7)` sans toucher la ligne casse la cohérence titre↔somme — ni les
suites tests/ (FONCTIONS RBAC, jamais la prose) ni le byte-gate d'artefact ne
l'attrapent.

Subtilité (memory rbac-spec-portail-count-gate : « §5 by-family is editorial ») :
les 9 regroupements sont ÉDITORIAUX (« Direction / Gouvernance » agrège des rôles
de familles direction+finance ≠ colonne `famille`) ⇒ AUCUN mapping groupe↔famille
(dérive fausse). On gate UNIQUEMENT ce qui est data-derived sans ce mapping.

Nouveau bloc « 1septies) §5 » : on recompute N = |rôles| du contrat
(rbac_50_roles.json, byte-gaté) et on exige (a) compte-titre == N ; (b) les 9
comptes de regroupement == EXACTEMENT dans l'ordre les termes de la ligne
(comparaison de LISTES ⇒ mord valeur ET position) ; (c) Σ termes == membre droit ;
(d) membre droit == N. Section/titre/ligne/comptes absents = échec (#6).

5 morsures vérifiées (working tree byte-restauré via git checkout -- <fichier>,
gate rc=1 sous mutation · rc=0 restauré) : titre 50→51 (a) · Ventes (8)→(9) (b) ·
= 50.→= 49. (c+d double) · terme 6+→7+ (b+c double) · suppression ligne (absence).
ci/README.md : row check-readme-claims étendue de la clause §5. 7 gates re-verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 23:46:27 +00:00
Claude Code DTP Worker 15812c1dff [DTP-Worker 20260801_230453] Sprint 8 · buffer · QA/Audit 5D : gate d'IDENTITÉ du VERDICT GLOBAL — le LABEL de conclusion de l'audit (PASS / PASS_WITH_OPEN_ITEMS / FAIL), la HEADLINE du livrable, était HORS de tout gate : le bloc audit_5d existant recompute la ventilation chiffrée (13 PASS · 0 FAIL · 4 à confirmer), les open items, les 5 dimensions et les livrables audités — jamais le label lui-même. Or il est data-derived (audit_report.json[verdict] == MANIFEST.json[verdict], byte-gatés), recalculé par builder.py (FAIL si ≥1 FAIL · sinon PASS_WITH_OPEN_ITEMS si ≥1 A_CONFIRMER · sinon PASS) et transcrit à la main à 2 endroits du README (la RÈGLE l.39 + le VERDICT COURANT l.49). Nouveau bloc : on MIROITE la règle et on exige (a) HONNÊTETÉ interne audit_report.verdict == verdict(triplet) — un PASS forcé pendant que 4 params restent a_confirmer (CŒUR #6 : ne jamais forcer un PASS) est mordu ; (b) MANIFEST.verdict == audit_report.verdict ; (c) label « Verdict courant » README == artefact ; (d) la règle « Verdict global » énumère EXACTEMENT le codomaine {FAIL, PASS_WITH_OPEN_ITEMS, PASS} du générateur. 5 morsures vérifiées (2 README · 2 artefact + M3 cascade a+b+c · 1 disparition), 7 gates re-verts
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 23:13:00 +00:00
Claude Code DTP Worker a40bfc51c1 [DTP-Worker 20260801_223450] Sprint 8 · buffer · SEO : gate d'IDENTITÉ du COMPTE d'INVARIANTS CI — le compte de contrôles de validation (annoncé « ## Garanties (N invariants) » du README + toutes ses mentions + les 5 self-reports du seo_gen.py : docstrings/aides/succès CLI) recomputé du SEUL registre-source = le LEDGER numéroté « # N · » de la fonction _validate (analogue du registre # Invariant N de Chat OTOIA · source d'autorité NON-artefact, invisible à check_artifacts). Exige : (a) ledger CONTIGU 1..N (comparaison LISTE triée ⇒ mord lacune ET doublon) ; (b) toute mention « N invariants » du .py == |ledger| ; (c) compte annoncé README == |ledger| ; (d) toute mention README == |ledger|. Prose du README RÉSUME (11 puces ≠ énumération 1:1) ⇒ gate du COMPTE, pas set-diff. 5 morsures vérifiées (2 README · 3 source ; doublon ledger attrapé là où l'approche set aurait raté), 7 gates re-verts
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 22:41:56 +00:00
Claude Code DTP Worker 64b635073a [DTP-Worker 20260801_220449] Sprint 8 · buffer · Chat OTOIA : gate d'IDENTITÉ de la LISTE D'INVARIANTS CI — la section « ## Invariants (N) — garantis en CI » du README (compte annoncé + énumération numérotée en prose + self-report CLI « N invariants verts » du générateur, 3 transcriptions) recomputée du REGISTRE-source = marqueurs # Invariant N de chat_otoia_gen.py : (a) registre code contigu 1..N, (b) self-report CLI == |registre|, (c) compte annoncé == |registre|, (d) énumération prose == registre EXACT (set-diff absent/fantôme) ; surface aveugle aux blocs Chat OTOIA préexistants (comptes d'artefact + identité persona/langues) ; 5 morsures vérifiées, 7 gates re-verts
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 22:13:26 +00:00
Claude Code DTP Worker d20d37607d [DTP-Worker 20260801_213444] Sprint 8 · buffer · Fiche ONAPI/Legal : gate de la 2ᵉ SURFACE PROSE des ENTITÉS PORTEUSES
Surface ungatée fermée : `03_agents/onapi_legal/AGENT.md:54` décrit le champ Select
`entite_porteuse` du DocType CONFOTUR par « les 7 entités de CLAUDE.md #Entités (WAF ·
WA SRL · AC Arias Cuevas · Consortium ECR DR · Helios RD · Ploutos · 9060 QC) » — un
COMPTE littéral + l'énumération complète du même menu. Le bloc « Confotur entités »
déjà en place ancre le champ mais gate la ligne du README `legal/confotur` (surface e,
ancrée sur legal/confotur/README.md) ; le motif ne vise PAS 03_agents/ ⇒ la fiche
restait hors de tout gate. Dérive #6 : ajouter/retirer/renommer une entité dans
CLAUDE.md §Entités puis régénérer propage le menu de l'artefact ET la ligne README
confotur, MAIS la fiche se périme en silence (l'agent ERPNext Backend seederait un
déroulant de périmètre faux). Aucune suite tests/ (FONCTIONS de build, pas la prose)
ne l'attrape.

Gate ajouté (ci/check_readme_claims.sh) : re-dérive la liste depuis les tokens gras de
« ## Entités » de CLAUDE.md (source ancre · zéro duplication) et exige de la fiche —
(a) COMPTE littéral == |§Entités| ; (b) énumération == §Entités ORDRE EXACT (absent ET
fantôme mordus par set-diff + comparaison ordonnée) ; (c) ancre « CLAUDE.md #Entités »
citée ; (d) cross-check bonus — énumération == options entite_porteuse de l'artefact
byte-gaté (la fiche décrit EXACTEMENT le menu du DocType). Ligne absente = échec (#6).

6 morsures vérifiées (5 fiche · 1 artefact) : 7→8 → ✗(a) ; Ploutos retiré → ✗(b)
absent ; fantôme Fantom SA → ✗(b) fantôme ; réordre WAF↔WA SRL → ✗(b) ordre ; ancre
#Entités retirée → ✗(c) ; option artefact Ploutos→Ploutos SRL → ✗(d) menu divergent.
Restauré = green (a/b/c/d ✓ · exit 0). Working tree byte-restauré via
git checkout -- <fichier précis> (JAMAIS git checkout . / git clean). 7 gates re-verts.
ci/README.md étendu (clause « 2ᵉ surface prose (fiche ONAPI/Legal) »).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 21:43:11 +00:00
Claude Code DTP Worker d587b446b9 [DTP-Worker 20260801_210434] Sprint 8 · buffer · CRM/commissions : gate d'IDENTITÉ du CHAMP DEVISE — la clause devise_field = le champ devise (Select USD/DOP · #10) du DocType Dossier Vente (crm/commissions/README.md:54), invariant CLI #8, transcrite en prose hors de tout gate (grep devise_field dans ci/ = 0)
4e surface distincte du même livrable crm/commissions (après états/champs, anti-taux #6, rôles payés) : le « sur quelle devise » du calcul base×taux. Re-dérivée de 3 sources byte-gatées/constitutionnelles : plan.devise_field (out/commission_plan.json) == champ `devise` du DocType (dossier_vente/doctype_spec.json, fieldtype Select) == options ORDONNÉES == devises canoniques CLAUDE.md #10 (« USD + DOP »). Ancrage vivant (#10) : (0) 2 devises depuis le segment gras de #10 ; (a) cross-artefact plan==DocType==#10 ; (b) prose README:54 == artefacts + #10 + tag #10. Distincte du bloc Fiches #10 (prose ERPNext/CRM) et du bloc e-CF TipoMoneda (spec fiscal).

7 morsures vérifiées (4 README · 1 DocType · 1 CLAUDE.md · 1 plan), 7 gates re-verts, working tree byte-restauré (git checkout --, JAMAIS git clean). ci/README.md (récap + paragraphe détaillé) et 05_activity_log mis à jour. Auto-score 4Big 96/100.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 21:15:36 +00:00
Claude Code DTP Worker f91a22f458 [DTP-Worker 20260801_203424] Sprint 8 · buffer · Audit 5D (4e surface du même README) : gate d'IDENTITÉ des LIVRABLES AUDITÉS — la liste des 5 hand-off out/*.json que l'audit de second niveau LIT (README qa/audit_5d §« Livrables audités »), énumérée à la main hors de tout gate ; recomputée par ENSEMBLE de MANIFEST.audited_artifacts (byte-gaté · = sorted(ARTIFACT_PATHS.values())), ordre README ≠ ordre MANIFEST trié ⇒ set-diff absent/fantôme ; cross-anchors : chaque chemin résout un fichier commité (a) + |audités| == |alias distincts des controls[].artifacts du spec| (b) ; 6 morsures vérifiées (4 README · 2 source), 7 gates re-verts
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 20:46:10 +00:00
Claude Code DTP Worker 17c3d2b104 [DTP-Worker 20260801_200419] Sprint 8 · buffer · Fiche DevOps : gate du COMPTE de suites gated (« 22 suites gated », cellule Tests de la row pipeline CI) — classe DISTINCTE des comptes de MÉTHODES test_ : recomputé de regression_plan.totals.suites (reg[suites], byte-gaté) + cohérence croisée == regression_run len(suites) ; surface non atteinte par row_re (ancre ci.yml/ci · suffixe 'suites gated') ni par l'agrégat de la fiche QA ; 5 morsures vérifiées, 7 gates re-verts
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 20:09:27 +00:00
Claude Code DTP Worker 18a758045f [DTP-Worker 20260801_193414] Sprint 8 · buffer · Gate d'IDENTITÉ des comptes de tests self-reportés par les README de MODULE
Surface ungated distincte des fiches : chaque `05_deliverables_mvp/<suite>/README.md`
se re-déclare le compte de SA suite (commentaire `# N tests` de la commande unittest ·
bullet « → **N/N verts** » · prose d'auto-score « en-repo (N tests verts + …) ») — 27
claims sur 16 modules. Tous les blocs de comptes de tests existants visent 03_agents/*
(row_re, agrégats prose, per-suite hors table) ; row_re ne lit le README de module QUE
comme cible de lien. Un test ajouté/retiré met à jour regression_plan.json (auth =
plan.suites[path].test_methods, byte-gaté) tandis que la prose du README rote en silence.

Nouveau bloc « READMEs de MODULE · comptes de tests self-reportés » (table config
MODULE_README_TESTS · motifs ancrés) : chaque motif DOIT matcher (absent = régression #6)
ET tous ses groupes == auth ; `**N/N verts**` capture 2 groupes → un 25/24 incohérent mord.
5 modules sans self-report (chat_otoia/mobile/publiciste/acceptance/audit_4big) hors table.

4 morsures vérifiées (drift commentaire · incohérence N/N · disparition de claim · drift
auto-score prose) ; restauré = 440 checks de base intacts + 27 nouveaux ; check_ci_integrity
+ check_docs re-verts. Restauration par backup ciblé (jamais git checkout ./git clean).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 19:45:11 +00:00
Claude Code DTP Worker 861260462f [DTP-Worker 20260801_190412] Sprint 8 · buffer · Fiches agents/RBAC : gate d'APPARTENANCE à roles_allowed du chat OTOIA — 3e surface d'appartenance (DISTINCTE du contrat rbac_50_roles.json ET du Has Role workspace.json) : QUI peut INVOQUER l'assistant OTOIA d'un portail — asserée en prose par rendu:36 (∈ roles_allowed construction, triple ancrage) + mobile:41 (∉ tout, assertion négative #6), recomputée de chat_otoia/out/chat_mount.json (byte-gaté) ; 6 morsures vérifiées, 7 gates re-verts 2026-08-01 19:12:16 +00:00
Claude Code DTP Worker 47ef210910 [DTP-Worker 20260801_183412] Sprint 8 · buffer · Legal/CONFOTUR : gate d'IDENTITÉ des 2 champs DÉRIVÉS du workflow vente — dossier_vente (Link → workflow.document_type = OTO Dossier Vente) + estado (Select → états confotur_* du pipeline) — transcrits en prose (legal/confotur/README.md:33-36) hors de tout gate ; source = crm/workflow_vente/workflow_vente_spec.json (workflow_source du MANIFEST)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 18:43:45 +00:00