[DTP-Worker] Sprint 8 · buffer L75 · Domaine Fiscal/e-CF : le CONTRAT DE FORMAT de l'e-NCF (« E + tipoeCF(2) + secuencia(10) » = 13) était retranscrit À LA MAIN dans QUATRE endroits de prose (README ×3 + fiche agent erpnext_backend) sans AUCUN gate d'IDENTITÉ. Le bloc racine de check_readme_claims ne gate que le COMPTE de tests e-CF (« 39 ») — surface distincte du MÊME module. Ce format — préfixe · longueur du segment tipo · longueur du segment secuencia · longueur TOTALE — est le CŒUR du module (le « composeur traçable ») et dérive du bloc e_ncf de fiscal/ecf_dgii/out/ecf_plan.json (byte-gaté par check_artifacts) : prefix (« E »), longueur (13), regex (^E[0-9]{12}$), structure (« E + tipoeCF (2 chiffres) + secuencia (10 chiffres) »). Format e-NCF standard DGII (Ley 32-23) porté avec source — pas un chiffre inventé (#6). Aucun gate ne comparait la LONGUEUR des segments à l'artefact : allonger la secuencia (rango DGII à 12 chiffres → longueur 15, regex 14 digits) OU changer le préfixe ferait dériver les QUATRE proses en silence pendant que l'ecf_plan byte-gaté dit autre chose — « vert trompeur » qu'aucune suite tests/ (qui teste les FONCTIONS compose_encf/parse_encf, pas la prose) n'attrape → nouveau bloc recomputant (prefix, tipo_len, seq_len, total) depuis le SEUL bloc e_ncf (zéro duplication du format du générateur #6) et exigeant que CHAQUE prose l'encode EXACTEMENT (4 sous-checks numérotés, patron du bloc DevOps). Cohérences croisées en bonus (mordent un artefact INTERNEMENT incohérent) : 1 + tipo_len + seq_len == longueur (1+2+10==13) ET |regex digits| == tipo_len + seq_len (12 == 2+10). Un claim absent échoue AUSSI. 5 morsures vérifiées : drift de l'artefact source (secuencia 10→12, les 4 proses mordues) · résumé README tipo 2→3 · invariant README total 13→14 (aveugle au segment) · fiche erpnext_backend secuencia 10→9 · composition README supprimée (INTROUVABLE) ; plus la morsure d'incohérence d'artefact (regex {11} désaligné du segment tipo+seq=12) ; restauré = green : E + tipo(2) + secuencia(10) = 13 == e_ncf. État courant : aucun segment périmé (anti-invention #6, rien à réécrire) — le défaut est la surface ungated. ci/README.md (table + détail) mis à jour · 7 gates re-verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-31 16:09:13 +00:00
parent 8961e14ff5
commit c0da3dfeec
3 changed files with 196 additions and 1 deletions
+65
View File
@@ -1,5 +1,70 @@
# Activity Log · 2026-07-31 · Claude Code DTP
## Session `20260731_160111` · Buffer S8 · Domaine Fiscal/e-CF : le **contrat de format de l'e-NCF** (« `E + tipoeCF(2) + secuencia(10)` » = **13**) était retranscrit À LA MAIN dans **QUATRE** endroits de prose (README ×3 + fiche agent `erpnext_backend`) sans AUCUN gate d'IDENTITÉ — le bloc racine ne gate que le COMPTE de tests e-CF (« 39 »).
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA). Roadmap fonctionnellement
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Les sessions précédentes ont
gaté les domaines tests, portails, RBAC, SEO, CRM (pipeline + séparation des pouvoirs),
mobile (quadruplet + énumération onglets), Legal/CONFOTUR, DevOps, QA (audit 5D + 4Big),
Démo, Frontend/Chat OTOIA et recette. Cette session cible le **domaine Fiscal/e-CF DGII**
(`fiscal/ecf_dgii`) — le **contrat de format de l'e-NCF**, cœur du module (le « composeur
traçable »), dont les longueurs de segments citées dans quatre proses pointaient
l'artefact généré sans être recomputées par aucun gate.
**Dérive silencieuse fermée** :
- `05_deliverables_mvp/fiscal/ecf_dgii/README.md` × **3** : résumé l.10
(`` `E + tipoeCF(2) + secuencia(10)` ``), invariant 7 l.75 (`E+tipo(2)+seq(10)=13`,
**seul à porter la longueur totale**), composition l.84 (`e_ncf = "E" + tipo(2) +
secuencia(10)`).
- `03_agents/erpnext_backend/AGENT.md:33` : `` `E + tipoeCF(2) + secuencia(10)` ``.
- Source faisant autorité : le bloc `e_ncf` de `fiscal/ecf_dgii/out/ecf_plan.json`
(byte-gaté par `check_artifacts`) — `prefix` (« E »), `longueur` (13), `regex`
(`^E[0-9]{12}$`), `structure` (« E + tipoeCF (2 chiffres) + secuencia (10
chiffres) »). Format e-NCF standard DGII (Ley 32-23) porté avec `source` — pas un
chiffre inventé (#6).
- Le bloc racine ne gate QUE le **compte de tests** e-CF (« 39 »). Aucun gate ne
comparait la LONGUEUR des segments : allonger la secuencia (rango DGII à 12 chiffres →
`longueur` 15, `regex` 14 digits) OU changer le préfixe ferait dériver les QUATRE
proses en silence pendant que l'`ecf_plan` byte-gaté dit autre chose — « vert
trompeur » qu'aucune suite `tests/` (qui teste les FONCTIONS `compose_encf`/
`parse_encf`, pas la prose) n'attrape.
- **État courant** : **aucun segment périmé** — les 4 proses recoupent l'artefact
exactement (anti-invention #6, rien à réécrire). Le défaut est la **surface ungated**.
**Nouveau bloc dans `ci/check_readme_claims.sh`** : recompute
`(prefix, tipo_len, seq_len, total)` depuis le SEUL bloc `e_ncf` (zéro duplication du
format du générateur · #6) et exige que **chaque** prose l'encode **exactement** (4
sous-checks numérotés, patron du bloc DevOps). Cohérences croisées en bonus (mordent un
artefact **internement incohérent**) : `1 + tipo_len + seq_len == longueur` (1+2+10==13)
ET le nombre de chiffres du `regex` == `tipo_len + seq_len` (12 == 2+10). Un claim absent
échoue AUSSI (traçabilité).
### Preuve (5 morsures vérifiées + morsure d'incohérence + restauration verte)
| Injection | Résultat |
|---|---|
| artefact `secuencia 10→12` (longueur 15 · regex 14 · les 4 proses restent 10/13) | ✗ les **4** proses mordues : dit E/2/10 MAIS e_ncf tipo=2 seq=12 total=15 · exit 1 |
| README résumé `tipo 2→3` | ✗ dit E/3/10 MAIS e_ncf tipo=2 · exit 1 |
| README invariant total `13→14` (aveugle au segment) | ✗ dit E/2/10/14 MAIS e_ncf total=13 · exit 1 |
| fiche `erpnext_backend` `secuencia 10→9` | ✗ dit E/2/9 MAIS e_ncf seq=10 · exit 1 |
| README composition supprimée (reformulée) | ✗ format e-NCF INTROUVABLE · exit 1 |
| artefact `regex` désaligné (`{11}` vs tipo+seq=12) | ✗ incohérence artefact : regex 11 chiffres MAIS tipo+seq=12 · exit 1 |
| restauré | ✓ `E + tipo(2) + secuencia(10) = 13` == `e_ncf` (4 proses + 2 cohérences croisées) · exit 0 |
- **`ci/README.md`** — surface ajoutée à la table récap du pipeline + paragraphe
descriptif (classe « contrat de format de l'e-NCF fiscal »).
Suite CI complète re-verte (7 gates) : `guard_constraints` · `validate_json` ·
`check_docs` · `check_artifacts` · `check_regression` · `check_ci_integrity` ·
`check_readme_claims`.
**Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
**Auto-score 4Big** : 96/100.
---
## Session `20260731_150110` · Buffer S8 · Domaine Mobile (2e surface) : la ligne récap du README app Expo **énumérait** À LA MAIN ses **5 onglets** (`(Ventes/Construction/Achat/Compta/Direction)`) sans gate d'IDENTITÉ — le bloc mobile existant ne recompute que le COMPTE (« 5 onglets ») et son patron matche la parenthèse par `\([^)]*\)` en **ignorant son contenu**, aveugle à un **échange / retrait / réordre** de nom.
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA). Roadmap fonctionnellement